<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nello Pedone</title>
    <description>The latest articles on DEV Community by Nello Pedone (@nello_pedone_eac007957aff).</description>
    <link>https://dev.to/nello_pedone_eac007957aff</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4097082%2Fd3784e2b-4c36-46f5-b17a-cf1c8ce030de.jpg</url>
      <title>DEV Community: Nello Pedone</title>
      <link>https://dev.to/nello_pedone_eac007957aff</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nello_pedone_eac007957aff"/>
    <language>en</language>
    <item>
      <title>Stop Rewriting the Same Angular Boilerplate — I Did It Once for You</title>
      <dc:creator>Nello Pedone</dc:creator>
      <pubDate>Thu, 27 Aug 2026 09:25:33 +0000</pubDate>
      <link>https://dev.to/nello_pedone_eac007957aff/stop-rewriting-the-same-angular-boilerplate-i-did-it-once-for-you-3ek8</link>
      <guid>https://dev.to/nello_pedone_eac007957aff/stop-rewriting-the-same-angular-boilerplate-i-did-it-once-for-you-3ek8</guid>
      <description>&lt;h1&gt;
  
  
  I Built an Angular 21 Admin Template from Scratch — Here's What I Learned
&lt;/h1&gt;

&lt;p&gt;After weeks of work, I just released &lt;strong&gt;Nexora&lt;/strong&gt;, a professional Angular 21 Material Design admin dashboard template. In this article I want to share the key decisions I made, the problems I ran into, and what I learned along the way.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://nexora-admin-template-gamma.vercel.app/dashboard/analytics" rel="noopener noreferrer"&gt;https://nexora-admin-template-gamma.vercel.app/dashboard/analytics&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;Get it:&lt;/strong&gt; &lt;a href="https://pedonello.gumroad.com/l/nexora-angular-admin?_gl=1*1y1bdr6*_ga*MTY1ODM5NDk3NC4xNzg3ODE5ODEy*_ga_6LJN6D94N6*czE3ODc4MTk4MTEkbzEkZzEkdDE3ODc4MjE1NjMkajYwJGwwJGgw" rel="noopener noreferrer"&gt;https://pedonello.gumroad.com/l/nexora-angular-admin?_gl=1*1y1bdr6*_ga*MTY1ODM5NDk3NC4xNzg3ODE5ODEy*_ga_6LJN6D94N6*czE3ODc4MTk4MTEkbzEkZzEkdDE3ODc4MjE1NjMkajYwJGwwJGgw&lt;/a&gt; (5+)&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Built It
&lt;/h2&gt;

&lt;p&gt;I kept starting new Angular projects and spending the first 2 weeks doing the same things every time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting up routing with lazy loading&lt;/li&gt;
&lt;li&gt;Building a sidebar and header&lt;/li&gt;
&lt;li&gt;Wiring up auth guards and HTTP interceptors&lt;/li&gt;
&lt;li&gt;Configuring Angular Material theming&lt;/li&gt;
&lt;li&gt;Adding charts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I decided to build a proper starter template once, do it right, and share it with the community.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Angular 21 — Standalone components + Signals
Angular Material — UI components
ApexCharts — Interactive charts
TypeScript 5.9 — Strict mode
SCSS — CSS variable theming system
RxJS 7.8 — Reactivity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Decision #1 — Standalone Components Only
&lt;/h2&gt;

&lt;p&gt;Angular 21 makes standalone components the default, and for good reason. No more NgModules, no more &lt;code&gt;declarations&lt;/code&gt; arrays, no more confusion about where to import what.&lt;/p&gt;

&lt;p&gt;Every component in Nexora is standalone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nxr-analytics&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;CommonModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;MatCardModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NgApexchartsModule&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./analytics.component.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AnalyticsComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean, explicit, easy to understand.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Decision #2 — Signals for State
&lt;/h2&gt;

&lt;p&gt;Instead of BehaviorSubjects everywhere, I used Angular Signals for local state management. The ThemeService is a good example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;providedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ThemeService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark-theme&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reading the value anywhere: &lt;code&gt;this.theme.mode()&lt;/code&gt; — no &lt;code&gt;.subscribe()&lt;/code&gt;, no memory leaks, no unsubscribe headaches.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Decision #3 — CSS Variables for Theming
&lt;/h2&gt;

&lt;p&gt;Instead of Angular Material's complex theming system, I built a simple CSS variable layer on top:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/styles/themes/_nexora-theme.scss&lt;/span&gt;
&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;--nxr-primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;       &lt;span class="mh"&gt;#185FA5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="na"&gt;--nxr-primary-dark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="mh"&gt;#042C53&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="na"&gt;--nxr-primary-light&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#E6F1FB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="na"&gt;--nxr-accent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;        &lt;span class="mh"&gt;#378ADD&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="na"&gt;--nxr-sidebar-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="mh"&gt;#0D1B2A&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="na"&gt;--nxr-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;            &lt;span class="mh"&gt;#F4F6FA&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.dark-theme&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;--nxr-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;      &lt;span class="mh"&gt;#0F172A&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="na"&gt;--nxr-surface&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#1E293B&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Want to change the entire color scheme? Edit 4 lines. Done.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Decision #4 — Lazy Loading Everything
&lt;/h2&gt;

&lt;p&gt;Every route is lazy-loaded. Not just "some" routes — every single one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dashboard/analytics&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;loadComponent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./features/dashboard/analytics/analytics.component&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AnalyticsComponent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The initial bundle is tiny. Each page only loads when the user navigates to it. Better Core Web Vitals, faster first paint, happier users.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Decision #5 — Functional Guards and Interceptors
&lt;/h2&gt;

&lt;p&gt;No more class-based guards. Angular's functional approach is much cleaner:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// auth.guard.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;authGuard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CanActivateFn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AuthService&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isLoggedIn&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/auth/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// auth.interceptor.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;authInterceptor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;HttpInterceptorFn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AuthService&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;getToken&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clone&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;setHeaders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inject what you need, return what you need. No boilerplate.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Inside Nexora
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3 Dashboards
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Analytics&lt;/strong&gt; — KPI cards, area chart, donut chart&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;eCommerce&lt;/strong&gt; — Sales stats, orders table with status badges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CRM&lt;/strong&gt; — Lead pipeline with Kanban-style columns&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6 UI Component Pages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Buttons &amp;amp; Badges&lt;/li&gt;
&lt;li&gt;Cards&lt;/li&gt;
&lt;li&gt;Tables&lt;/li&gt;
&lt;li&gt;Charts (ApexCharts)&lt;/li&gt;
&lt;li&gt;Dialogs &amp;amp; Alerts&lt;/li&gt;
&lt;li&gt;Timeline&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3 Auth Pages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Login (with show/hide password)&lt;/li&gt;
&lt;li&gt;Register&lt;/li&gt;
&lt;li&gt;Forgot Password&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Extra Pages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Settings (profile + notification toggles)&lt;/li&gt;
&lt;li&gt;Error 404 / 500&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Dark Mode Implementation
&lt;/h2&gt;

&lt;p&gt;Dark mode is a single CSS class toggle on &lt;code&gt;body&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark-theme&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isDark&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And in SCSS, every color automatically switches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scss"&gt;&lt;code&gt;&lt;span class="nc"&gt;.dark-theme&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;--nxr-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;             &lt;span class="mh"&gt;#0F172A&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="na"&gt;--nxr-surface&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;        &lt;span class="mh"&gt;#1E293B&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="na"&gt;--nxr-text-primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="mh"&gt;#F1F5F9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="na"&gt;--nxr-sidebar-bg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="mh"&gt;#0A0F1E&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No JavaScript color calculations, no flicker, no complexity.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Biggest Challenge — Peer Dependencies
&lt;/h2&gt;

&lt;p&gt;Angular 21 + ng-apexcharts had a peer dependency conflict that took me a while to debug. The fix was simple once I found it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="c"&gt;# .npmrc
&lt;/span&gt;&lt;span class="py"&gt;legacy-peer-deps&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And pinning specific versions in &lt;code&gt;package.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"ng-apexcharts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.12.0"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"typescript"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~5.9.0"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Always pin your TypeScript version when using Angular — the compiler is very strict about the version range.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deploying to Vercel
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;vercel.json&lt;/code&gt; configuration handles SPA routing automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"routes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^/[^.]*$"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"dest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/index.html"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without this, refreshing any page gives a 404. With it, Angular's router handles everything correctly.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Would Do Differently
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start with path aliases&lt;/strong&gt; from day one — I added &lt;code&gt;@core/*&lt;/code&gt;, &lt;code&gt;@shared/*&lt;/code&gt; etc. later and had to update dozens of imports&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mock API from the start&lt;/strong&gt; — having real HTTP calls from the beginning makes development much smoother&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write the documentation first&lt;/strong&gt; — much easier to document while building than after&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://nexora-admin-template-gamma.vercel.app/dashboard/analytics" rel="noopener noreferrer"&gt;https://nexora-admin-template-gamma.vercel.app/dashboard/analytics&lt;/a&gt;&lt;br&gt;
📦 &lt;strong&gt;Get Nexora on Gumroad:&lt;/strong&gt; &lt;a href="https://pedonello.gumroad.com/l/nexora-angular-admin?_gl=1*1y1bdr6*_ga*MTY1ODM5NDk3NC4xNzg3ODE5ODEy*_ga_6LJN6D94N6*czE3ODc4MTk4MTEkbzEkZzEkdDE3ODc4MjE1NjMkajYwJGwwJGgw" rel="noopener noreferrer"&gt;https://pedonello.gumroad.com/l/nexora-angular-admin?_gl=1*1y1bdr6*_ga*MTY1ODM5NDk3NC4xNzg3ODE5ODEy*_ga_6LJN6D94N6*czE3ODc4MTk4MTEkbzEkZzEkdDE3ODc4MjE1NjMkajYwJGwwJGgw&lt;/a&gt; ($5+ — includes full source + docs)&lt;/p&gt;

&lt;p&gt;Default login: &lt;code&gt;demo@nexora.dev&lt;/code&gt; / &lt;code&gt;password&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The template is production-ready. Clone it, customize the colors in one SCSS file, connect your API, and ship.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tags
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;#angular #webdev #typescript #javascript #opensource&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with Angular 21, Angular Material, ApexCharts, and a lot of coffee ☕&lt;/em&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>typescript</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
