@kiranshub/dashboard-ui 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, input, output, computed, signal, HostListener } from '@angular/core';
2
+ import { Component, input, output, computed, signal, HostListener, ViewChild } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import * as i1$1 from '@angular/platform-browser';
@@ -101,15 +101,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
101
101
  args: [{ selector: 'particle-card', standalone: true, imports: [CommonModule], template: "<div class=\"card\">\n <ng-content></ng-content>\n</div>\n", styles: ["@tailwind base;@tailwind components;@tailwind utilities;.card{background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:var(--spacing-lg);box-shadow:0 1px 3px #0000000d}\n"] }]
102
102
  }] });
103
103
 
104
+ function getEffectiveCols(cols, defaultCols = 1) {
105
+ if (cols === undefined) {
106
+ return { mobile: defaultCols, tablet: defaultCols, desktop: defaultCols };
107
+ }
108
+ if (typeof cols === 'number') {
109
+ return { mobile: cols, tablet: cols, desktop: cols };
110
+ }
111
+ const mobile = cols.mobile ?? defaultCols;
112
+ const tablet = cols.tablet ?? cols.desktop ?? mobile;
113
+ const desktop = cols.desktop ?? cols.tablet ?? mobile;
114
+ return { mobile, tablet, desktop };
115
+ }
104
116
  class GridComponent {
105
117
  gap = input('md', ...(ngDevMode ? [{ debugName: "gap" }] : []));
106
- cols = input(4, ...(ngDevMode ? [{ debugName: "cols" }] : []));
118
+ cols = input(1, ...(ngDevMode ? [{ debugName: "cols" }] : []));
119
+ responsiveCols = () => getEffectiveCols(this.cols());
107
120
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: GridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
108
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: GridComponent, isStandalone: true, selector: "particle-grid", inputs: { gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, cols: { classPropertyName: "cols", publicName: "cols", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n class=\"grid\"\n [ngClass]=\"'gap-' + gap()\"\n [style.grid-template-columns]=\"'repeat(' + cols() + ', 1fr)'\"\n>\n <ng-content></ng-content>\n</div>\n", styles: ["@tailwind base;@tailwind components;@tailwind utilities;.grid{display:grid}.gap-xs{gap:var(--grid-gap-xs)}.gap-sm{gap:var(--grid-gap-sm)}.gap-md{gap:var(--grid-gap-md)}.gap-lg{gap:var(--grid-gap-lg)}.gap-xl{gap:var(--grid-gap-xl)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
121
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.0", type: GridComponent, isStandalone: true, selector: "particle-grid", inputs: { gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, cols: { classPropertyName: "cols", publicName: "cols", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n class=\"grid\"\n [ngClass]=\"'gap-' + gap()\"\n [style.--grid-cols-mobile]=\"responsiveCols().mobile\"\n [style.--grid-cols-tablet]=\"responsiveCols().tablet\"\n [style.--grid-cols-desktop]=\"responsiveCols().desktop\"\n>\n <ng-content></ng-content>\n</div>\n", styles: ["@tailwind base;@tailwind components;@tailwind utilities;.grid{display:grid;grid-template-columns:repeat(var(--grid-cols-mobile, 1),1fr)}@media(min-width:768px){.grid{grid-template-columns:repeat(var(--grid-cols-tablet, var(--grid-cols-mobile, 1)),1fr)}}@media(min-width:1024px){.grid{grid-template-columns:repeat(var(--grid-cols-desktop, var(--grid-cols-tablet, var(--grid-cols-mobile, 1))),1fr)}}.gap-xs{gap:var(--grid-gap-xs)}.gap-sm{gap:var(--grid-gap-sm)}.gap-md{gap:var(--grid-gap-md)}.gap-lg{gap:var(--grid-gap-lg)}.gap-xl{gap:var(--grid-gap-xl)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
109
122
  }
110
123
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: GridComponent, decorators: [{
111
124
  type: Component,
112
- args: [{ selector: 'particle-grid', standalone: true, imports: [CommonModule], template: "<div\n class=\"grid\"\n [ngClass]=\"'gap-' + gap()\"\n [style.grid-template-columns]=\"'repeat(' + cols() + ', 1fr)'\"\n>\n <ng-content></ng-content>\n</div>\n", styles: ["@tailwind base;@tailwind components;@tailwind utilities;.grid{display:grid}.gap-xs{gap:var(--grid-gap-xs)}.gap-sm{gap:var(--grid-gap-sm)}.gap-md{gap:var(--grid-gap-md)}.gap-lg{gap:var(--grid-gap-lg)}.gap-xl{gap:var(--grid-gap-xl)}\n"] }]
125
+ args: [{ selector: 'particle-grid', standalone: true, imports: [CommonModule], template: "<div\n class=\"grid\"\n [ngClass]=\"'gap-' + gap()\"\n [style.--grid-cols-mobile]=\"responsiveCols().mobile\"\n [style.--grid-cols-tablet]=\"responsiveCols().tablet\"\n [style.--grid-cols-desktop]=\"responsiveCols().desktop\"\n>\n <ng-content></ng-content>\n</div>\n", styles: ["@tailwind base;@tailwind components;@tailwind utilities;.grid{display:grid;grid-template-columns:repeat(var(--grid-cols-mobile, 1),1fr)}@media(min-width:768px){.grid{grid-template-columns:repeat(var(--grid-cols-tablet, var(--grid-cols-mobile, 1)),1fr)}}@media(min-width:1024px){.grid{grid-template-columns:repeat(var(--grid-cols-desktop, var(--grid-cols-tablet, var(--grid-cols-mobile, 1))),1fr)}}.gap-xs{gap:var(--grid-gap-xs)}.gap-sm{gap:var(--grid-gap-sm)}.gap-md{gap:var(--grid-gap-md)}.gap-lg{gap:var(--grid-gap-lg)}.gap-xl{gap:var(--grid-gap-xl)}\n"] }]
113
126
  }], propDecorators: { gap: [{ type: i0.Input, args: [{ isSignal: true, alias: "gap", required: false }] }], cols: [{ type: i0.Input, args: [{ isSignal: true, alias: "cols", required: false }] }] } });
114
127
 
115
128
  class SidebarComponent {
@@ -118,11 +131,11 @@ class SidebarComponent {
118
131
  isMobile = input(false, ...(ngDevMode ? [{ debugName: "isMobile" }] : []));
119
132
  toggle = output();
120
133
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SidebarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
121
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: SidebarComponent, isStandalone: true, selector: "particle-sidebar", inputs: { appTitle: { classPropertyName: "appTitle", publicName: "appTitle", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, isMobile: { classPropertyName: "isMobile", publicName: "isMobile", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggle: "toggle" }, ngImport: i0, template: "<aside class=\"sidebar\" [class.collapsed]=\"collapsed()\">\n <div class=\"sidebar-header\">\n <button class=\"sidebar-toggle\" (click)=\"toggle.emit()\" aria-label=\"Toggle sidebar\">\n <particle-icon\n [name]=\"isMobile() ? 'xmark' : collapsed() ? 'chevron-right' : 'chevron-left'\"\n size=\"medium\"\n />\n </button>\n @if (appTitle() && !collapsed()) {\n <h1 class=\"app-title\">{{ appTitle() }}</h1>\n }\n <ng-content select=\"[sidebarHeader]\"></ng-content>\n </div>\n <div class=\"sidebar-content\">\n <ng-content></ng-content>\n </div>\n <div class=\"sidebar-footer\">\n <ng-content select=\"[sidebarFooter]\"></ng-content>\n </div>\n</aside>\n", styles: ["@tailwind base;@tailwind components;@tailwind utilities;.sidebar{width:var(--sidebar-width);background-color:var(--color-bg-sidebar);color:var(--color-sidebar-text);display:flex;flex-direction:column;position:fixed;height:100vh;transition:width var(--transition-normal)}.sidebar.collapsed{width:4rem}.sidebar-header{height:var(--header-height);padding:0 var(--spacing-lg);border-bottom:1px solid var(--color-sidebar-border);display:flex;align-items:center;gap:var(--spacing-sm);flex-shrink:0}.sidebar-header .app-title{text-wrap:nowrap}.sidebar-toggle{background:none;border:none;cursor:pointer;color:var(--color-sidebar-text);padding:var(--spacing-xs);border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center}.sidebar-toggle:hover{background-color:var(--color-sidebar-hover)}.sidebar.collapsed .sidebar-header{padding:0 var(--spacing-sm);justify-content:center}.app-title{font-size:var(--font-size-lg);font-weight:600;margin:0}.sidebar-content{flex:1;overflow-y:auto}.sidebar-footer{padding:var(--spacing-lg);border-top:1px solid var(--color-sidebar-border)}\n"], dependencies: [{ kind: "component", type: ParticleIcon, selector: "particle-icon", inputs: ["name", "size"] }] });
134
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: SidebarComponent, isStandalone: true, selector: "particle-sidebar", inputs: { appTitle: { classPropertyName: "appTitle", publicName: "appTitle", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, isMobile: { classPropertyName: "isMobile", publicName: "isMobile", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggle: "toggle" }, ngImport: i0, template: "<aside class=\"sidebar\" [class.collapsed]=\"collapsed()\">\n <div class=\"sidebar-header\">\n <button class=\"sidebar-toggle\" (click)=\"toggle.emit()\" aria-label=\"Toggle sidebar\">\n <particle-icon\n [name]=\"isMobile() ? 'xmark' : collapsed() ? 'chevron-right' : 'chevron-left'\"\n size=\"medium\"\n />\n </button>\n @if (appTitle() && !collapsed()) {\n <h1 class=\"app-title\">{{ appTitle() }}</h1>\n }\n <ng-content select=\"[sidebarHeader]\"></ng-content>\n </div>\n <div class=\"sidebar-content\">\n <ng-content></ng-content>\n </div>\n <div class=\"sidebar-footer\">\n <ng-content select=\"[sidebarFooter]\"></ng-content>\n </div>\n</aside>\n", styles: ["@tailwind base;@tailwind components;@tailwind utilities;.sidebar{width:var(--sidebar-width);background-color:var(--color-bg-sidebar);color:var(--color-sidebar-text);display:flex;flex-direction:column;position:fixed;height:100vh;transition:width var(--transition-normal)}.sidebar.collapsed{width:4rem}.sidebar-header{height:var(--header-height);padding:0 var(--spacing-lg);border-bottom:1px solid var(--color-sidebar-border);background-color:var(--color-bg-header);display:flex;align-items:center;gap:var(--spacing-sm);flex-shrink:0}.sidebar-header .app-title{text-wrap:nowrap}.sidebar-toggle{background:none;border:none;cursor:pointer;color:var(--color-sidebar-text);padding:var(--spacing-xs);border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center}.sidebar-toggle:hover{background-color:var(--color-sidebar-hover)}.sidebar.collapsed .sidebar-header{padding:0 var(--spacing-sm);justify-content:center}.app-title{font-size:var(--font-size-lg);font-weight:600;margin:0}.sidebar-content{flex:1;overflow-y:auto}.sidebar-footer{padding:var(--spacing-lg);border-top:1px solid var(--color-sidebar-border);background-color:var(--color-bg-footer)}\n"], dependencies: [{ kind: "component", type: ParticleIcon, selector: "particle-icon", inputs: ["name", "size"] }] });
122
135
  }
123
136
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SidebarComponent, decorators: [{
124
137
  type: Component,
125
- args: [{ selector: 'particle-sidebar', standalone: true, imports: [ParticleIcon], template: "<aside class=\"sidebar\" [class.collapsed]=\"collapsed()\">\n <div class=\"sidebar-header\">\n <button class=\"sidebar-toggle\" (click)=\"toggle.emit()\" aria-label=\"Toggle sidebar\">\n <particle-icon\n [name]=\"isMobile() ? 'xmark' : collapsed() ? 'chevron-right' : 'chevron-left'\"\n size=\"medium\"\n />\n </button>\n @if (appTitle() && !collapsed()) {\n <h1 class=\"app-title\">{{ appTitle() }}</h1>\n }\n <ng-content select=\"[sidebarHeader]\"></ng-content>\n </div>\n <div class=\"sidebar-content\">\n <ng-content></ng-content>\n </div>\n <div class=\"sidebar-footer\">\n <ng-content select=\"[sidebarFooter]\"></ng-content>\n </div>\n</aside>\n", styles: ["@tailwind base;@tailwind components;@tailwind utilities;.sidebar{width:var(--sidebar-width);background-color:var(--color-bg-sidebar);color:var(--color-sidebar-text);display:flex;flex-direction:column;position:fixed;height:100vh;transition:width var(--transition-normal)}.sidebar.collapsed{width:4rem}.sidebar-header{height:var(--header-height);padding:0 var(--spacing-lg);border-bottom:1px solid var(--color-sidebar-border);display:flex;align-items:center;gap:var(--spacing-sm);flex-shrink:0}.sidebar-header .app-title{text-wrap:nowrap}.sidebar-toggle{background:none;border:none;cursor:pointer;color:var(--color-sidebar-text);padding:var(--spacing-xs);border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center}.sidebar-toggle:hover{background-color:var(--color-sidebar-hover)}.sidebar.collapsed .sidebar-header{padding:0 var(--spacing-sm);justify-content:center}.app-title{font-size:var(--font-size-lg);font-weight:600;margin:0}.sidebar-content{flex:1;overflow-y:auto}.sidebar-footer{padding:var(--spacing-lg);border-top:1px solid var(--color-sidebar-border)}\n"] }]
138
+ args: [{ selector: 'particle-sidebar', standalone: true, imports: [ParticleIcon], template: "<aside class=\"sidebar\" [class.collapsed]=\"collapsed()\">\n <div class=\"sidebar-header\">\n <button class=\"sidebar-toggle\" (click)=\"toggle.emit()\" aria-label=\"Toggle sidebar\">\n <particle-icon\n [name]=\"isMobile() ? 'xmark' : collapsed() ? 'chevron-right' : 'chevron-left'\"\n size=\"medium\"\n />\n </button>\n @if (appTitle() && !collapsed()) {\n <h1 class=\"app-title\">{{ appTitle() }}</h1>\n }\n <ng-content select=\"[sidebarHeader]\"></ng-content>\n </div>\n <div class=\"sidebar-content\">\n <ng-content></ng-content>\n </div>\n <div class=\"sidebar-footer\">\n <ng-content select=\"[sidebarFooter]\"></ng-content>\n </div>\n</aside>\n", styles: ["@tailwind base;@tailwind components;@tailwind utilities;.sidebar{width:var(--sidebar-width);background-color:var(--color-bg-sidebar);color:var(--color-sidebar-text);display:flex;flex-direction:column;position:fixed;height:100vh;transition:width var(--transition-normal)}.sidebar.collapsed{width:4rem}.sidebar-header{height:var(--header-height);padding:0 var(--spacing-lg);border-bottom:1px solid var(--color-sidebar-border);background-color:var(--color-bg-header);display:flex;align-items:center;gap:var(--spacing-sm);flex-shrink:0}.sidebar-header .app-title{text-wrap:nowrap}.sidebar-toggle{background:none;border:none;cursor:pointer;color:var(--color-sidebar-text);padding:var(--spacing-xs);border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center}.sidebar-toggle:hover{background-color:var(--color-sidebar-hover)}.sidebar.collapsed .sidebar-header{padding:0 var(--spacing-sm);justify-content:center}.app-title{font-size:var(--font-size-lg);font-weight:600;margin:0}.sidebar-content{flex:1;overflow-y:auto}.sidebar-footer{padding:var(--spacing-lg);border-top:1px solid var(--color-sidebar-border);background-color:var(--color-bg-footer)}\n"] }]
126
139
  }], propDecorators: { appTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "appTitle", required: false }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], isMobile: [{ type: i0.Input, args: [{ isSignal: true, alias: "isMobile", required: false }] }], toggle: [{ type: i0.Output, args: ["toggle"] }] } });
127
140
 
128
141
  class NavListComponent {
@@ -177,6 +190,7 @@ class DashboardComponent {
177
190
  mobileSidebarOpen = signal(false, ...(ngDevMode ? [{ debugName: "mobileSidebarOpen" }] : []));
178
191
  isDark = themeSignal;
179
192
  userMenuOpen = signal(false, ...(ngDevMode ? [{ debugName: "userMenuOpen" }] : []));
193
+ userMenu;
180
194
  constructor() {
181
195
  this.checkScreenSize();
182
196
  }
@@ -186,6 +200,13 @@ class DashboardComponent {
186
200
  checkScreenSize = () => {
187
201
  this.isMobile.set(window.innerWidth < this.getBreakpoint());
188
202
  };
203
+ onDocumentClick = (event) => {
204
+ if (this.userMenuOpen() &&
205
+ this.userMenu &&
206
+ !this.userMenu.nativeElement.contains(event.target)) {
207
+ this.userMenuOpen.set(false);
208
+ }
209
+ };
189
210
  toggleSidebar = () => {
190
211
  if (this.isMobile()) {
191
212
  this.mobileSidebarOpen.update((v) => !v);
@@ -205,14 +226,20 @@ class DashboardComponent {
205
226
  this.userMenuOpen.set(false);
206
227
  };
207
228
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DashboardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
208
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: DashboardComponent, isStandalone: true, selector: "particle-dashboard", inputs: { appTitle: { classPropertyName: "appTitle", publicName: "appTitle", isSignal: true, isRequired: false, transformFunction: null }, navItems: { classPropertyName: "navItems", publicName: "navItems", isSignal: true, isRequired: false, transformFunction: null }, userInitials: { classPropertyName: "userInitials", publicName: "userInitials", isSignal: true, isRequired: false, transformFunction: null }, userMenuItems: { classPropertyName: "userMenuItems", publicName: "userMenuItems", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "window:resize": "checkScreenSize()" } }, ngImport: i0, template: "<div class=\"dashboard\" [class.collapsed]=\"sidebarCollapsed()\">\n @if (!isMobile()) {\n <particle-sidebar\n [appTitle]=\"appTitle()\"\n [collapsed]=\"sidebarCollapsed()\"\n [isMobile]=\"false\"\n (toggle)=\"toggleSidebar()\"\n >\n <particle-nav-list [items]=\"navItems()\" [collapsed]=\"sidebarCollapsed()\" />\n </particle-sidebar>\n }\n\n @if (isMobile() && mobileSidebarOpen()) {\n <div class=\"mobile-sidebar-overlay\" (click)=\"closeMobileSidebar()\">\n <div class=\"mobile-sidebar\" (click)=\"$event.stopPropagation()\">\n <particle-sidebar\n [appTitle]=\"appTitle()\"\n [collapsed]=\"false\"\n [isMobile]=\"true\"\n (toggle)=\"closeMobileSidebar()\"\n >\n <particle-nav-list [items]=\"navItems()\" [collapsed]=\"false\" />\n </particle-sidebar>\n </div>\n </div>\n }\n\n <div class=\"main-content\" [class.mobile]=\"isMobile()\">\n <header class=\"header\">\n <div class=\"header-left\">\n @if (isMobile()) {\n <button class=\"menu-toggle\" (click)=\"toggleSidebar()\" aria-label=\"Toggle menu\">\n <particle-icon name=\"menu\" size=\"medium\" />\n </button>\n }\n </div>\n <div class=\"header-right\">\n <button\n class=\"theme-toggle\"\n (click)=\"toggleTheme()\"\n [attr.aria-label]=\"isDark() ? 'Switch to light mode' : 'Switch to dark mode'\"\n >\n @if (isDark()) {\n <particle-icon name=\"sun\" size=\"medium\" />\n } @else {\n <particle-icon name=\"moon\" size=\"medium\" />\n }\n </button>\n <div class=\"user-menu\" (click)=\"toggleUserMenu()\">\n <span class=\"user-initials\">{{ userInitials() }}</span>\n @if (userMenuOpen()) {\n <div class=\"user-dropdown\" (click)=\"$event.stopPropagation()\">\n <particle-nav-list [items]=\"userMenuItems()\" [collapsed]=\"false\" />\n </div>\n }\n </div>\n </div>\n </header>\n\n <main class=\"content\">\n <ng-content></ng-content>\n </main>\n </div>\n</div>\n", styles: ["@tailwind base;@tailwind components;@tailwind utilities;.dashboard{display:flex;min-height:100vh;background-color:var(--color-bg)}.mobile-sidebar-overlay{position:fixed;inset:0;background-color:#00000080;z-index:1000;display:flex;justify-content:flex-start}.mobile-sidebar{width:100%;max-width:280px;height:100%;animation:slideIn .2s ease-out}@keyframes slideIn{0%{transform:translate(-100%)}to{transform:translate(0)}}.main-content{flex:1;margin-left:var(--sidebar-width);display:flex;flex-direction:column;transition:margin-left var(--transition-normal)}.main-content.mobile{margin-left:0}.dashboard.collapsed .main-content:not(.mobile){margin-left:4rem}.header{height:var(--header-height);background-color:var(--color-bg-card);border-bottom:1px solid var(--color-border);display:flex;align-items:center;justify-content:space-between;padding:0 var(--spacing-lg);position:sticky;top:0}.menu-toggle{background:none;border:none;font-size:1.5rem;cursor:pointer;color:var(--color-text)}.theme-toggle{background:none;border:none;font-size:1.25rem;cursor:pointer;padding:var(--spacing-sm);border-radius:var(--radius-md);transition:background-color var(--transition-fast);margin-right:var(--spacing-md)}.theme-toggle:hover{background-color:var(--color-sidebar-hover)}.header-right{display:flex;align-items:center}.user-menu{display:flex;align-items:center;gap:var(--spacing-sm);cursor:pointer;position:relative}.user-dropdown{position:absolute;top:calc(100% + var(--spacing-sm));right:0;width:200px;background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:var(--radius-md);box-shadow:0 4px 12px #00000026;z-index:100;animation:fadeIn .15s ease-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.user-initials{width:2.25rem;height:2.25rem;border-radius:50%;background-color:var(--color-primary);color:var(--color-primary-foreground);display:flex;align-items:center;justify-content:center;font-size:var(--font-size-sm);font-weight:600}.content{flex:1;padding:var(--spacing-xl)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: SidebarComponent, selector: "particle-sidebar", inputs: ["appTitle", "collapsed", "isMobile"], outputs: ["toggle"] }, { kind: "component", type: NavListComponent, selector: "particle-nav-list", inputs: ["items", "collapsed"] }, { kind: "component", type: ParticleIcon, selector: "particle-icon", inputs: ["name", "size"] }] });
229
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: DashboardComponent, isStandalone: true, selector: "particle-dashboard", inputs: { appTitle: { classPropertyName: "appTitle", publicName: "appTitle", isSignal: true, isRequired: false, transformFunction: null }, navItems: { classPropertyName: "navItems", publicName: "navItems", isSignal: true, isRequired: false, transformFunction: null }, userInitials: { classPropertyName: "userInitials", publicName: "userInitials", isSignal: true, isRequired: false, transformFunction: null }, userMenuItems: { classPropertyName: "userMenuItems", publicName: "userMenuItems", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "window:resize": "checkScreenSize()", "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "userMenu", first: true, predicate: ["userMenu"], descendants: true }], ngImport: i0, template: "<div class=\"dashboard\" [class.collapsed]=\"sidebarCollapsed()\">\n @if (!isMobile()) {\n <particle-sidebar\n [appTitle]=\"appTitle()\"\n [collapsed]=\"sidebarCollapsed()\"\n [isMobile]=\"false\"\n (toggle)=\"toggleSidebar()\"\n >\n <particle-nav-list [items]=\"navItems()\" [collapsed]=\"sidebarCollapsed()\" />\n </particle-sidebar>\n }\n\n @if (isMobile() && mobileSidebarOpen()) {\n <div class=\"mobile-sidebar-overlay\" (click)=\"closeMobileSidebar()\">\n <div class=\"mobile-sidebar\" (click)=\"$event.stopPropagation()\">\n <particle-sidebar\n [appTitle]=\"appTitle()\"\n [collapsed]=\"false\"\n [isMobile]=\"true\"\n (toggle)=\"closeMobileSidebar()\"\n >\n <particle-nav-list [items]=\"navItems()\" [collapsed]=\"false\" />\n </particle-sidebar>\n </div>\n </div>\n }\n\n <div class=\"main-content\" [class.mobile]=\"isMobile()\">\n <header class=\"header\">\n <div class=\"header-left\">\n @if (isMobile()) {\n <button class=\"menu-toggle\" (click)=\"toggleSidebar()\" aria-label=\"Toggle menu\">\n <particle-icon name=\"menu\" size=\"medium\" />\n </button>\n }\n </div>\n <div class=\"header-right\">\n <button\n class=\"theme-toggle\"\n (click)=\"toggleTheme()\"\n [attr.aria-label]=\"isDark() ? 'Switch to light mode' : 'Switch to dark mode'\"\n >\n @if (isDark()) {\n <particle-icon class=\"icon-lightmode\" name=\"sun\" size=\"medium\" />\n } @else {\n <particle-icon class=\"icon-darkmode\" name=\"moon\" size=\"medium\" />\n }\n </button>\n <div #userMenu class=\"user-menu\" (click)=\"toggleUserMenu()\">\n <span class=\"user-initials\">{{ userInitials() }}</span>\n @if (userMenuOpen()) {\n <div class=\"user-dropdown\" (click)=\"$event.stopPropagation()\">\n <particle-nav-list [items]=\"userMenuItems()\" [collapsed]=\"false\" />\n </div>\n }\n </div>\n </div>\n </header>\n\n <main class=\"content\">\n <ng-content></ng-content>\n </main>\n </div>\n</div>\n", styles: ["@tailwind base;@tailwind components;@tailwind utilities;.dashboard{display:flex;min-height:100vh;background-color:var(--color-bg)}.mobile-sidebar-overlay{position:fixed;inset:0;background-color:#00000080;z-index:1000;display:flex;justify-content:flex-start}.mobile-sidebar{width:100%;max-width:280px;height:100%;animation:slideIn .2s ease-out}@keyframes slideIn{0%{transform:translate(-100%)}to{transform:translate(0)}}.main-content{flex:1;margin-left:var(--sidebar-width);display:flex;flex-direction:column;transition:margin-left var(--transition-normal)}.main-content.mobile{margin-left:0}.dashboard.collapsed .main-content:not(.mobile){margin-left:4rem}.header{height:var(--header-height);background-color:var(--color-bg-header);border-bottom:1px solid var(--color-border);display:flex;align-items:center;justify-content:space-between;padding:0 var(--spacing-lg);position:sticky;top:0}.menu-toggle{background:none;border:none;font-size:1.5rem;cursor:pointer;color:var(--color-text)}.theme-toggle{background:none;border:none;font-size:1.25rem;cursor:pointer;padding:var(--spacing-sm);border-radius:var(--radius-md);transition:background-color var(--transition-fast);margin-right:var(--spacing-md)}.theme-toggle:hover{background-color:var(--color-sidebar-hover)}.header-right{display:flex;align-items:center}.user-menu{display:flex;align-items:center;gap:var(--spacing-sm);cursor:pointer;position:relative}.user-dropdown{position:absolute;top:calc(100% + var(--spacing-sm));right:0;width:200px;background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:var(--radius-md);box-shadow:0 4px 12px #00000026;z-index:100;animation:fadeIn .15s ease-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.user-initials{width:2.25rem;height:2.25rem;border-radius:50%;background-color:var(--color-primary);color:var(--color-primary-foreground);display:flex;align-items:center;justify-content:center;font-size:var(--font-size-sm);font-weight:600}.content{flex:1;padding:var(--spacing-xl)}.icon-lightmode{color:var(--color-icon-lightmode)}.icon-darkmode{color:var(--color-icon-darkmode)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: SidebarComponent, selector: "particle-sidebar", inputs: ["appTitle", "collapsed", "isMobile"], outputs: ["toggle"] }, { kind: "component", type: NavListComponent, selector: "particle-nav-list", inputs: ["items", "collapsed"] }, { kind: "component", type: ParticleIcon, selector: "particle-icon", inputs: ["name", "size"] }] });
209
230
  }
210
231
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DashboardComponent, decorators: [{
211
232
  type: Component,
212
- args: [{ selector: 'particle-dashboard', standalone: true, imports: [CommonModule, SidebarComponent, NavListComponent, ParticleIcon], template: "<div class=\"dashboard\" [class.collapsed]=\"sidebarCollapsed()\">\n @if (!isMobile()) {\n <particle-sidebar\n [appTitle]=\"appTitle()\"\n [collapsed]=\"sidebarCollapsed()\"\n [isMobile]=\"false\"\n (toggle)=\"toggleSidebar()\"\n >\n <particle-nav-list [items]=\"navItems()\" [collapsed]=\"sidebarCollapsed()\" />\n </particle-sidebar>\n }\n\n @if (isMobile() && mobileSidebarOpen()) {\n <div class=\"mobile-sidebar-overlay\" (click)=\"closeMobileSidebar()\">\n <div class=\"mobile-sidebar\" (click)=\"$event.stopPropagation()\">\n <particle-sidebar\n [appTitle]=\"appTitle()\"\n [collapsed]=\"false\"\n [isMobile]=\"true\"\n (toggle)=\"closeMobileSidebar()\"\n >\n <particle-nav-list [items]=\"navItems()\" [collapsed]=\"false\" />\n </particle-sidebar>\n </div>\n </div>\n }\n\n <div class=\"main-content\" [class.mobile]=\"isMobile()\">\n <header class=\"header\">\n <div class=\"header-left\">\n @if (isMobile()) {\n <button class=\"menu-toggle\" (click)=\"toggleSidebar()\" aria-label=\"Toggle menu\">\n <particle-icon name=\"menu\" size=\"medium\" />\n </button>\n }\n </div>\n <div class=\"header-right\">\n <button\n class=\"theme-toggle\"\n (click)=\"toggleTheme()\"\n [attr.aria-label]=\"isDark() ? 'Switch to light mode' : 'Switch to dark mode'\"\n >\n @if (isDark()) {\n <particle-icon name=\"sun\" size=\"medium\" />\n } @else {\n <particle-icon name=\"moon\" size=\"medium\" />\n }\n </button>\n <div class=\"user-menu\" (click)=\"toggleUserMenu()\">\n <span class=\"user-initials\">{{ userInitials() }}</span>\n @if (userMenuOpen()) {\n <div class=\"user-dropdown\" (click)=\"$event.stopPropagation()\">\n <particle-nav-list [items]=\"userMenuItems()\" [collapsed]=\"false\" />\n </div>\n }\n </div>\n </div>\n </header>\n\n <main class=\"content\">\n <ng-content></ng-content>\n </main>\n </div>\n</div>\n", styles: ["@tailwind base;@tailwind components;@tailwind utilities;.dashboard{display:flex;min-height:100vh;background-color:var(--color-bg)}.mobile-sidebar-overlay{position:fixed;inset:0;background-color:#00000080;z-index:1000;display:flex;justify-content:flex-start}.mobile-sidebar{width:100%;max-width:280px;height:100%;animation:slideIn .2s ease-out}@keyframes slideIn{0%{transform:translate(-100%)}to{transform:translate(0)}}.main-content{flex:1;margin-left:var(--sidebar-width);display:flex;flex-direction:column;transition:margin-left var(--transition-normal)}.main-content.mobile{margin-left:0}.dashboard.collapsed .main-content:not(.mobile){margin-left:4rem}.header{height:var(--header-height);background-color:var(--color-bg-card);border-bottom:1px solid var(--color-border);display:flex;align-items:center;justify-content:space-between;padding:0 var(--spacing-lg);position:sticky;top:0}.menu-toggle{background:none;border:none;font-size:1.5rem;cursor:pointer;color:var(--color-text)}.theme-toggle{background:none;border:none;font-size:1.25rem;cursor:pointer;padding:var(--spacing-sm);border-radius:var(--radius-md);transition:background-color var(--transition-fast);margin-right:var(--spacing-md)}.theme-toggle:hover{background-color:var(--color-sidebar-hover)}.header-right{display:flex;align-items:center}.user-menu{display:flex;align-items:center;gap:var(--spacing-sm);cursor:pointer;position:relative}.user-dropdown{position:absolute;top:calc(100% + var(--spacing-sm));right:0;width:200px;background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:var(--radius-md);box-shadow:0 4px 12px #00000026;z-index:100;animation:fadeIn .15s ease-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.user-initials{width:2.25rem;height:2.25rem;border-radius:50%;background-color:var(--color-primary);color:var(--color-primary-foreground);display:flex;align-items:center;justify-content:center;font-size:var(--font-size-sm);font-weight:600}.content{flex:1;padding:var(--spacing-xl)}\n"] }]
213
- }], ctorParameters: () => [], propDecorators: { appTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "appTitle", required: false }] }], navItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "navItems", required: false }] }], userInitials: [{ type: i0.Input, args: [{ isSignal: true, alias: "userInitials", required: false }] }], userMenuItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "userMenuItems", required: false }] }], checkScreenSize: [{
233
+ args: [{ selector: 'particle-dashboard', standalone: true, imports: [CommonModule, SidebarComponent, NavListComponent, ParticleIcon], template: "<div class=\"dashboard\" [class.collapsed]=\"sidebarCollapsed()\">\n @if (!isMobile()) {\n <particle-sidebar\n [appTitle]=\"appTitle()\"\n [collapsed]=\"sidebarCollapsed()\"\n [isMobile]=\"false\"\n (toggle)=\"toggleSidebar()\"\n >\n <particle-nav-list [items]=\"navItems()\" [collapsed]=\"sidebarCollapsed()\" />\n </particle-sidebar>\n }\n\n @if (isMobile() && mobileSidebarOpen()) {\n <div class=\"mobile-sidebar-overlay\" (click)=\"closeMobileSidebar()\">\n <div class=\"mobile-sidebar\" (click)=\"$event.stopPropagation()\">\n <particle-sidebar\n [appTitle]=\"appTitle()\"\n [collapsed]=\"false\"\n [isMobile]=\"true\"\n (toggle)=\"closeMobileSidebar()\"\n >\n <particle-nav-list [items]=\"navItems()\" [collapsed]=\"false\" />\n </particle-sidebar>\n </div>\n </div>\n }\n\n <div class=\"main-content\" [class.mobile]=\"isMobile()\">\n <header class=\"header\">\n <div class=\"header-left\">\n @if (isMobile()) {\n <button class=\"menu-toggle\" (click)=\"toggleSidebar()\" aria-label=\"Toggle menu\">\n <particle-icon name=\"menu\" size=\"medium\" />\n </button>\n }\n </div>\n <div class=\"header-right\">\n <button\n class=\"theme-toggle\"\n (click)=\"toggleTheme()\"\n [attr.aria-label]=\"isDark() ? 'Switch to light mode' : 'Switch to dark mode'\"\n >\n @if (isDark()) {\n <particle-icon class=\"icon-lightmode\" name=\"sun\" size=\"medium\" />\n } @else {\n <particle-icon class=\"icon-darkmode\" name=\"moon\" size=\"medium\" />\n }\n </button>\n <div #userMenu class=\"user-menu\" (click)=\"toggleUserMenu()\">\n <span class=\"user-initials\">{{ userInitials() }}</span>\n @if (userMenuOpen()) {\n <div class=\"user-dropdown\" (click)=\"$event.stopPropagation()\">\n <particle-nav-list [items]=\"userMenuItems()\" [collapsed]=\"false\" />\n </div>\n }\n </div>\n </div>\n </header>\n\n <main class=\"content\">\n <ng-content></ng-content>\n </main>\n </div>\n</div>\n", styles: ["@tailwind base;@tailwind components;@tailwind utilities;.dashboard{display:flex;min-height:100vh;background-color:var(--color-bg)}.mobile-sidebar-overlay{position:fixed;inset:0;background-color:#00000080;z-index:1000;display:flex;justify-content:flex-start}.mobile-sidebar{width:100%;max-width:280px;height:100%;animation:slideIn .2s ease-out}@keyframes slideIn{0%{transform:translate(-100%)}to{transform:translate(0)}}.main-content{flex:1;margin-left:var(--sidebar-width);display:flex;flex-direction:column;transition:margin-left var(--transition-normal)}.main-content.mobile{margin-left:0}.dashboard.collapsed .main-content:not(.mobile){margin-left:4rem}.header{height:var(--header-height);background-color:var(--color-bg-header);border-bottom:1px solid var(--color-border);display:flex;align-items:center;justify-content:space-between;padding:0 var(--spacing-lg);position:sticky;top:0}.menu-toggle{background:none;border:none;font-size:1.5rem;cursor:pointer;color:var(--color-text)}.theme-toggle{background:none;border:none;font-size:1.25rem;cursor:pointer;padding:var(--spacing-sm);border-radius:var(--radius-md);transition:background-color var(--transition-fast);margin-right:var(--spacing-md)}.theme-toggle:hover{background-color:var(--color-sidebar-hover)}.header-right{display:flex;align-items:center}.user-menu{display:flex;align-items:center;gap:var(--spacing-sm);cursor:pointer;position:relative}.user-dropdown{position:absolute;top:calc(100% + var(--spacing-sm));right:0;width:200px;background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:var(--radius-md);box-shadow:0 4px 12px #00000026;z-index:100;animation:fadeIn .15s ease-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.user-initials{width:2.25rem;height:2.25rem;border-radius:50%;background-color:var(--color-primary);color:var(--color-primary-foreground);display:flex;align-items:center;justify-content:center;font-size:var(--font-size-sm);font-weight:600}.content{flex:1;padding:var(--spacing-xl)}.icon-lightmode{color:var(--color-icon-lightmode)}.icon-darkmode{color:var(--color-icon-darkmode)}\n"] }]
234
+ }], ctorParameters: () => [], propDecorators: { appTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "appTitle", required: false }] }], navItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "navItems", required: false }] }], userInitials: [{ type: i0.Input, args: [{ isSignal: true, alias: "userInitials", required: false }] }], userMenuItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "userMenuItems", required: false }] }], userMenu: [{
235
+ type: ViewChild,
236
+ args: ['userMenu']
237
+ }], checkScreenSize: [{
214
238
  type: HostListener,
215
239
  args: ['window:resize']
240
+ }], onDocumentClick: [{
241
+ type: HostListener,
242
+ args: ['document:click', ['$event']]
216
243
  }] } });
217
244
 
218
245
  /*
@@ -1 +1 @@
1
- {"version":3,"file":"kiranshub-dashboard-ui.mjs","sources":["../../../projects/component-lib/src/lib/component-lib.ts","../../../projects/component-lib/src/lib/atoms/button/button.component.ts","../../../projects/component-lib/src/lib/atoms/button/button.component.html","../../../projects/component-lib/src/lib/atoms/icons/icons.ts","../../../projects/component-lib/src/lib/atoms/icons/icon.component.ts","../../../projects/component-lib/src/lib/atoms/icons/icon.component.html","../../../projects/component-lib/src/lib/atoms/card/card.component.ts","../../../projects/component-lib/src/lib/atoms/card/card.component.html","../../../projects/component-lib/src/lib/molecules/grid/grid.component.ts","../../../projects/component-lib/src/lib/molecules/grid/grid.component.html","../../../projects/component-lib/src/lib/organisms/sidebar.component.ts","../../../projects/component-lib/src/lib/organisms/sidebar.component.html","../../../projects/component-lib/src/lib/molecules/nav-list/nav-list.component.ts","../../../projects/component-lib/src/lib/molecules/nav-list/nav-list.component.html","../../../projects/component-lib/src/lib/services/theme.service.ts","../../../projects/component-lib/src/lib/templates/dashboard.component.ts","../../../projects/component-lib/src/lib/templates/dashboard.component.html","../../../projects/component-lib/src/public-api.ts","../../../projects/component-lib/src/kiranshub-dashboard-ui.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-component-lib',\n imports: [],\n template: ` <p>component-lib works!</p> `,\n styles: ``,\n})\nexport class ComponentLib {}\n","import { Component, output, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'outline';\nexport type ButtonSize = 'small' | 'medium' | 'large';\nexport type ButtonType = 'button' | 'submit' | 'reset';\n\n@Component({\n selector: 'particle-button',\n imports: [CommonModule],\n templateUrl: './button.component.html',\n styleUrl: './button.component.scss',\n})\nexport class ParticleButton {\n readonly variant = input<ButtonVariant>('primary');\n readonly size = input<ButtonSize>('medium');\n readonly disabled = input<boolean>(false);\n readonly type = input<ButtonType>('button');\n readonly clicked = output<void>();\n\n protected onClick(): void {\n if (!this.disabled()) {\n this.clicked.emit();\n }\n }\n\n protected getClasses(): string {\n const base = 'btn';\n const sizeClasses: Record<ButtonSize, string> = {\n small: 'btn-small',\n medium: 'btn-medium',\n large: 'btn-large',\n };\n const variantClasses: Record<ButtonVariant, string> = {\n primary: 'btn-primary',\n secondary: 'btn-secondary',\n outline: 'btn-outline',\n };\n\n const sizeClass = sizeClasses[this.size()] || 'btn-medium';\n const variantClass = variantClasses[this.variant()] || 'btn-primary';\n\n return `${base} ${sizeClass} ${variantClass}`;\n }\n}\n","<button\n [ngClass]=\"getClasses()\"\n [disabled]=\"disabled()\"\n [type]=\"type()\"\n (click)=\"onClick()\"\n>\n <ng-content></ng-content>\n</button>\n","export const ICONS: Record<string, string> = {\n menu: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\"/></svg>',\n 'chevron-left':\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.75 19.5 8.25 12l7.5-7.5\"/></svg>',\n 'chevron-right':\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m8.25 4.5 7.5 7.5-7.5 7.5\"/></svg>',\n xmark:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 18 18 6M6 6l12 12\"/></svg>',\n home: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m2.25 12 8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25\"/></svg>',\n 'chart-bar':\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 0 1 3 19.875v-6.75ZM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 0 1-1.125-1.125V8.625ZM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 0 1-1.125-1.125V4.125Z\"/></svg>',\n users:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15 19.128a9.38 9.38 0 0 0 2.625.372 9.337 9.337 0 0 0 4.121-.952 4.125 4.125 0 0 0-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 0 1 8.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0 1 11.964-3.07M12 6.375a3.375 3.375 0 1 1-6.75 0 3.375 3.375 0 0 1 6.75 0Zm8.25 2.25a2.625 2.625 0 1 1-5.25 0 2.625 2.625 0 0 1 5.25 0Z\"/></svg>',\n cog: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12a7.5 7.5 0 0 0 15 0m-15 0a7.5 7.5 0 1 1 15 0m-15 0H3m16.5 0H21m-1.5 0H12m-8.457 3.077 1.41-.513m14.095-5.13 1.41-.513M5.106 17.785l1.15-.964m11.49-9.642 1.149-.964M7.501 19.795l.75-1.3m7.5-12.99.75-1.3m-6.063 16.658.26-1.477m2.605-14.772.26-1.477m0 17.726-.26-1.477M10.698 4.614l-.26-1.477M16.5 19.794l-.75-1.299M7.5 4.205 12 12m6.894 5.785-1.149-.964M6.256 7.178l-1.15-.964m15.352 8.864-1.41-.513M4.954 9.435l-1.41-.514M12.002 12l-3.75 6.495\"/></svg>',\n sun: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 3v2.25m6.364.386-1.591 1.591M21 12h-2.25m-.386 6.364-1.591-1.591M12 18.75V21m-4.773-4.227-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0Z\"/></svg>',\n moon: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M21.752 15.002A9.72 9.72 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z\"/></svg>',\n bell: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 0 0 5.454-1.31A8.967 8.967 0 0 1 18 9.75V9A6 6 0 0 0 6 9v.75a8.967 8.967 0 0 1-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 0 1-5.714 0m5.714 0a3 3 0 1 1-5.714 0\"/></svg>',\n folder:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M2.25 12.75V12A2.25 2.25 0 0 1 4.5 9.75h15A2.25 2.25 0 0 1 21.75 12v.75m-8.69-6.44-2.12-2.12a1.5 1.5 0 0 0-1.061-.44H4.5A2.25 2.25 0 0 0 2.25 6v12a2.25 2.25 0 0 0 2.25 2.25h15A2.25 2.25 0 0 0 21.75 18V9a2.25 2.25 0 0 0-2.25-2.25h-5.379a1.5 1.5 0 0 1-1.06-.44Z\"/></svg>',\n 'shopping-cart':\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M2.25 3h1.386c.51 0 .955.343 1.087.835l.383 1.437M7.5 14.25a3 3 0 0 0-3 3h15.75m-12.75-3h11.218c1.121-2.3 2.1-4.684 2.924-7.138a60.114 60.114 0 0 0-16.536-1.84M7.5 14.25 5.106 5.272M6 20.25a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0Zm12.75 0a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0Z\"/></svg>',\n mail: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 0 1-2.25 2.25h-15a2.25 2.25 0 0 1-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0 0 19.5 4.5h-15a2.25 2.25 0 0 0-2.25 2.25m19.5 0v.243a2.25 2.25 0 0 1-1.07 1.916l-7.5 4.615a2.25 2.25 0 0 1-2.36 0L3.32 8.91a2.25 2.25 0 0 1-1.07-1.916V6.75\"/></svg>',\n 'information-circle':\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z\"/></svg>',\n user: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z\"/></svg>',\n logout:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.75 9V5.25A2.25 2.25 0 0 0 13.5 3h-6a2.25 2.25 0 0 0-2.25 2.25v13.5A2.25 2.25 0 0 0 7.5 21h6a2.25 2.25 0 0 0 2.25-2.25V15M12 9l-3 3m0 0 3 3m-3-3h12.75\"/></svg>',\n};\n\nexport type IconName = keyof typeof ICONS;\n","import { Component, input, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { ICONS } from './icons';\n\nexport type IconName = keyof typeof ICONS;\nexport type IconSize = 'small' | 'medium' | 'large';\n\n@Component({\n selector: 'particle-icon',\n imports: [CommonModule],\n templateUrl: './icon.component.html',\n styleUrl: './icon.component.scss',\n})\nexport class ParticleIcon {\n readonly name = input.required<IconName>();\n readonly size = input<IconSize>('medium');\n\n constructor(private sanitizer: DomSanitizer) {}\n\n protected svgContent = computed(() => {\n const iconName = this.name();\n const svg = ICONS[iconName] || '';\n return this.sanitizer.bypassSecurityTrustHtml(svg) as SafeHtml;\n });\n\n protected getSizeClass(): string {\n return `icon-${this.size()}`;\n }\n}\n","<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n [class]=\"getSizeClass()\"\n [innerHTML]=\"svgContent()\"\n></svg>\n","import { Component } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'particle-card',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './card.component.html',\n styleUrl: './card.component.scss',\n})\nexport class CardComponent {}\n","<div class=\"card\">\n <ng-content></ng-content>\n</div>\n","import { Component, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport type GridGap = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\nexport type GridCols = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\n\n@Component({\n selector: 'particle-grid',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './grid.component.html',\n styleUrl: './grid.component.scss',\n})\nexport class GridComponent {\n readonly gap = input<GridGap>('md');\n readonly cols = input<GridCols>(4);\n}\n","<div\n class=\"grid\"\n [ngClass]=\"'gap-' + gap()\"\n [style.grid-template-columns]=\"'repeat(' + cols() + ', 1fr)'\"\n>\n <ng-content></ng-content>\n</div>\n","import { Component, input, output } from '@angular/core';\nimport type { IconName } from '../atoms/icons/icon.component';\nimport { ParticleIcon } from '../atoms/icons/icon.component';\n\nexport interface NavListItem {\n label: string;\n icon: IconName;\n route?: string;\n}\n\n@Component({\n selector: 'particle-sidebar',\n standalone: true,\n imports: [ParticleIcon],\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.scss',\n})\nexport class SidebarComponent {\n readonly appTitle = input<string>('');\n readonly collapsed = input<boolean>(false);\n readonly isMobile = input<boolean>(false);\n readonly toggle = output<void>();\n}\n","<aside class=\"sidebar\" [class.collapsed]=\"collapsed()\">\n <div class=\"sidebar-header\">\n <button class=\"sidebar-toggle\" (click)=\"toggle.emit()\" aria-label=\"Toggle sidebar\">\n <particle-icon\n [name]=\"isMobile() ? 'xmark' : collapsed() ? 'chevron-right' : 'chevron-left'\"\n size=\"medium\"\n />\n </button>\n @if (appTitle() && !collapsed()) {\n <h1 class=\"app-title\">{{ appTitle() }}</h1>\n }\n <ng-content select=\"[sidebarHeader]\"></ng-content>\n </div>\n <div class=\"sidebar-content\">\n <ng-content></ng-content>\n </div>\n <div class=\"sidebar-footer\">\n <ng-content select=\"[sidebarFooter]\"></ng-content>\n </div>\n</aside>\n","import { Component, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\n\nimport { ParticleIcon } from '../../atoms/icons/icon.component';\nimport type { NavListItem } from '../../organisms/sidebar.component';\n\n@Component({\n selector: 'particle-nav-list',\n standalone: true,\n imports: [CommonModule, RouterLink, RouterLinkActive, ParticleIcon],\n templateUrl: './nav-list.component.html',\n styleUrl: './nav-list.component.scss',\n})\nexport class NavListComponent {\n readonly items = input<readonly NavListItem[]>([]);\n readonly collapsed = input<boolean>(false);\n}\n","<div class=\"sidebar-nav-wrapper\">\n <nav class=\"sidebar-nav\" [class.collapsed]=\"collapsed()\">\n @for (item of items(); track item.label) {\n @if (item.route) {\n <a class=\"nav-item\" [routerLink]=\"item.route\" routerLinkActive=\"active\">\n <particle-icon [name]=\"item.icon\" size=\"medium\" />\n @if (!collapsed()) {\n <span class=\"nav-label\">{{ item.label }}</span>\n }\n </a>\n } @else {\n <span class=\"nav-item nav-item-disabled\">\n <particle-icon [name]=\"item.icon\" size=\"medium\" />\n @if (!collapsed()) {\n <span class=\"nav-label\">{{ item.label }}</span>\n }\n </span>\n }\n }\n </nav>\n</div>\n","import { signal } from '@angular/core';\n\nconst STORAGE_KEY = 'theme';\n\nexport const themeSignal = signal<boolean>(false);\n\nfunction getInitialTheme(): boolean {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored !== null) {\n return stored === 'dark';\n }\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n}\n\nexport function initializeTheme(): void {\n const isDark = getInitialTheme();\n themeSignal.set(isDark);\n applyTheme(isDark);\n}\n\nexport function toggleTheme(): void {\n const newValue = !themeSignal();\n setTheme(newValue);\n}\n\nexport function setTheme(isDark: boolean): void {\n themeSignal.set(isDark);\n applyTheme(isDark);\n localStorage.setItem(STORAGE_KEY, isDark ? 'dark' : 'light');\n}\n\nfunction applyTheme(isDark: boolean): void {\n document.documentElement.setAttribute('data-theme', isDark ? 'dark' : 'light');\n}\n","import { Component, input, signal, HostListener } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SidebarComponent } from '../organisms/sidebar.component';\nimport { NavListComponent } from '../molecules/nav-list/nav-list.component';\nimport { ParticleIcon } from '../atoms/icons/icon.component';\nimport type { NavListItem } from '../organisms/sidebar.component';\nimport { themeSignal, toggleTheme } from '../services/theme.service';\n\n@Component({\n selector: 'particle-dashboard',\n standalone: true,\n imports: [CommonModule, SidebarComponent, NavListComponent, ParticleIcon],\n templateUrl: './dashboard.component.html',\n styleUrl: './dashboard.component.scss',\n})\nexport class DashboardComponent {\n readonly appTitle = input<string>('Dashboard');\n readonly navItems = input<readonly NavListItem[]>([]);\n readonly userInitials = input<string>('');\n readonly userMenuItems = input<readonly NavListItem[]>([\n { label: 'Manage Account', icon: 'user', route: '/account' },\n { label: 'Settings', icon: 'cog', route: '/settings' },\n { label: 'Log Out', icon: 'logout', route: '/logout' },\n ]);\n\n protected readonly sidebarCollapsed = signal(false);\n protected readonly isMobile = signal(false);\n protected readonly mobileSidebarOpen = signal(false);\n protected readonly isDark = themeSignal;\n protected readonly userMenuOpen = signal(false);\n\n constructor() {\n this.checkScreenSize();\n }\n\n private getBreakpoint(): number {\n return parseInt(\n getComputedStyle(document.documentElement).getPropertyValue('--breakpoint-mobile') || '768',\n 10,\n );\n }\n\n @HostListener('window:resize')\n protected readonly checkScreenSize = () => {\n this.isMobile.set(window.innerWidth < this.getBreakpoint());\n };\n\n protected readonly toggleSidebar = () => {\n if (this.isMobile()) {\n this.mobileSidebarOpen.update((v) => !v);\n } else {\n this.sidebarCollapsed.update((v) => !v);\n }\n };\n\n protected readonly closeMobileSidebar = () => {\n this.mobileSidebarOpen.set(false);\n };\n\n protected readonly toggleTheme = () => toggleTheme();\n\n protected readonly toggleUserMenu = () => {\n this.userMenuOpen.update((v) => !v);\n };\n\n protected readonly closeUserMenu = () => {\n this.userMenuOpen.set(false);\n };\n}\n","<div class=\"dashboard\" [class.collapsed]=\"sidebarCollapsed()\">\n @if (!isMobile()) {\n <particle-sidebar\n [appTitle]=\"appTitle()\"\n [collapsed]=\"sidebarCollapsed()\"\n [isMobile]=\"false\"\n (toggle)=\"toggleSidebar()\"\n >\n <particle-nav-list [items]=\"navItems()\" [collapsed]=\"sidebarCollapsed()\" />\n </particle-sidebar>\n }\n\n @if (isMobile() && mobileSidebarOpen()) {\n <div class=\"mobile-sidebar-overlay\" (click)=\"closeMobileSidebar()\">\n <div class=\"mobile-sidebar\" (click)=\"$event.stopPropagation()\">\n <particle-sidebar\n [appTitle]=\"appTitle()\"\n [collapsed]=\"false\"\n [isMobile]=\"true\"\n (toggle)=\"closeMobileSidebar()\"\n >\n <particle-nav-list [items]=\"navItems()\" [collapsed]=\"false\" />\n </particle-sidebar>\n </div>\n </div>\n }\n\n <div class=\"main-content\" [class.mobile]=\"isMobile()\">\n <header class=\"header\">\n <div class=\"header-left\">\n @if (isMobile()) {\n <button class=\"menu-toggle\" (click)=\"toggleSidebar()\" aria-label=\"Toggle menu\">\n <particle-icon name=\"menu\" size=\"medium\" />\n </button>\n }\n </div>\n <div class=\"header-right\">\n <button\n class=\"theme-toggle\"\n (click)=\"toggleTheme()\"\n [attr.aria-label]=\"isDark() ? 'Switch to light mode' : 'Switch to dark mode'\"\n >\n @if (isDark()) {\n <particle-icon name=\"sun\" size=\"medium\" />\n } @else {\n <particle-icon name=\"moon\" size=\"medium\" />\n }\n </button>\n <div class=\"user-menu\" (click)=\"toggleUserMenu()\">\n <span class=\"user-initials\">{{ userInitials() }}</span>\n @if (userMenuOpen()) {\n <div class=\"user-dropdown\" (click)=\"$event.stopPropagation()\">\n <particle-nav-list [items]=\"userMenuItems()\" [collapsed]=\"false\" />\n </div>\n }\n </div>\n </div>\n </header>\n\n <main class=\"content\">\n <ng-content></ng-content>\n </main>\n </div>\n</div>\n","/*\n * Public API Surface of component-lib\n */\n\nexport { ComponentLib } from './lib/component-lib';\n\nexport { ParticleButton } from './lib/atoms/button/button.component';\nexport type { ButtonVariant, ButtonSize, ButtonType } from './lib/atoms/button/button.component';\n\nexport { ParticleIcon } from './lib/atoms/icons/icon.component';\nexport type { IconName, IconSize } from './lib/atoms/icons/icon.component';\n\nexport { CardComponent } from './lib/atoms/card/card.component';\n\nexport { GridComponent } from './lib/molecules/grid/grid.component';\nexport type { GridGap, GridCols } from './lib/molecules/grid/grid.component';\n\nexport { DashboardComponent } from './lib/templates/dashboard.component';\n\nexport { SidebarComponent } from './lib/organisms/sidebar.component';\nexport type { NavListItem } from './lib/organisms/sidebar.component';\n\nexport { NavListComponent } from './lib/molecules/nav-list/nav-list.component';\n\nexport { initializeTheme, themeSignal, toggleTheme, setTheme } from './lib/services/theme.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
1
+ {"version":3,"file":"kiranshub-dashboard-ui.mjs","sources":["../../../projects/component-lib/src/lib/component-lib.ts","../../../projects/component-lib/src/lib/atoms/button/button.component.ts","../../../projects/component-lib/src/lib/atoms/button/button.component.html","../../../projects/component-lib/src/lib/atoms/icons/icons.ts","../../../projects/component-lib/src/lib/atoms/icons/icon.component.ts","../../../projects/component-lib/src/lib/atoms/icons/icon.component.html","../../../projects/component-lib/src/lib/atoms/card/card.component.ts","../../../projects/component-lib/src/lib/atoms/card/card.component.html","../../../projects/component-lib/src/lib/molecules/grid/grid.component.ts","../../../projects/component-lib/src/lib/molecules/grid/grid.component.html","../../../projects/component-lib/src/lib/organisms/sidebar.component.ts","../../../projects/component-lib/src/lib/organisms/sidebar.component.html","../../../projects/component-lib/src/lib/molecules/nav-list/nav-list.component.ts","../../../projects/component-lib/src/lib/molecules/nav-list/nav-list.component.html","../../../projects/component-lib/src/lib/services/theme.service.ts","../../../projects/component-lib/src/lib/templates/dashboard.component.ts","../../../projects/component-lib/src/lib/templates/dashboard.component.html","../../../projects/component-lib/src/public-api.ts","../../../projects/component-lib/src/kiranshub-dashboard-ui.ts"],"sourcesContent":["import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-component-lib',\n imports: [],\n template: ` <p>component-lib works!</p> `,\n styles: ``,\n})\nexport class ComponentLib {}\n","import { Component, output, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'outline';\nexport type ButtonSize = 'small' | 'medium' | 'large';\nexport type ButtonType = 'button' | 'submit' | 'reset';\n\n@Component({\n selector: 'particle-button',\n imports: [CommonModule],\n templateUrl: './button.component.html',\n styleUrl: './button.component.scss',\n})\nexport class ParticleButton {\n readonly variant = input<ButtonVariant>('primary');\n readonly size = input<ButtonSize>('medium');\n readonly disabled = input<boolean>(false);\n readonly type = input<ButtonType>('button');\n readonly clicked = output<void>();\n\n protected onClick(): void {\n if (!this.disabled()) {\n this.clicked.emit();\n }\n }\n\n protected getClasses(): string {\n const base = 'btn';\n const sizeClasses: Record<ButtonSize, string> = {\n small: 'btn-small',\n medium: 'btn-medium',\n large: 'btn-large',\n };\n const variantClasses: Record<ButtonVariant, string> = {\n primary: 'btn-primary',\n secondary: 'btn-secondary',\n outline: 'btn-outline',\n };\n\n const sizeClass = sizeClasses[this.size()] || 'btn-medium';\n const variantClass = variantClasses[this.variant()] || 'btn-primary';\n\n return `${base} ${sizeClass} ${variantClass}`;\n }\n}\n","<button\n [ngClass]=\"getClasses()\"\n [disabled]=\"disabled()\"\n [type]=\"type()\"\n (click)=\"onClick()\"\n>\n <ng-content></ng-content>\n</button>\n","export const ICONS: Record<string, string> = {\n menu: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\"/></svg>',\n 'chevron-left':\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.75 19.5 8.25 12l7.5-7.5\"/></svg>',\n 'chevron-right':\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m8.25 4.5 7.5 7.5-7.5 7.5\"/></svg>',\n xmark:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 18 18 6M6 6l12 12\"/></svg>',\n home: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m2.25 12 8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25\"/></svg>',\n 'chart-bar':\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 0 1 3 19.875v-6.75ZM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 0 1-1.125-1.125V8.625ZM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 0 1-1.125-1.125V4.125Z\"/></svg>',\n users:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15 19.128a9.38 9.38 0 0 0 2.625.372 9.337 9.337 0 0 0 4.121-.952 4.125 4.125 0 0 0-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 0 1 8.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0 1 11.964-3.07M12 6.375a3.375 3.375 0 1 1-6.75 0 3.375 3.375 0 0 1 6.75 0Zm8.25 2.25a2.625 2.625 0 1 1-5.25 0 2.625 2.625 0 0 1 5.25 0Z\"/></svg>',\n cog: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12a7.5 7.5 0 0 0 15 0m-15 0a7.5 7.5 0 1 1 15 0m-15 0H3m16.5 0H21m-1.5 0H12m-8.457 3.077 1.41-.513m14.095-5.13 1.41-.513M5.106 17.785l1.15-.964m11.49-9.642 1.149-.964M7.501 19.795l.75-1.3m7.5-12.99.75-1.3m-6.063 16.658.26-1.477m2.605-14.772.26-1.477m0 17.726-.26-1.477M10.698 4.614l-.26-1.477M16.5 19.794l-.75-1.299M7.5 4.205 12 12m6.894 5.785-1.149-.964M6.256 7.178l-1.15-.964m15.352 8.864-1.41-.513M4.954 9.435l-1.41-.514M12.002 12l-3.75 6.495\"/></svg>',\n sun: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 3v2.25m6.364.386-1.591 1.591M21 12h-2.25m-.386 6.364-1.591-1.591M12 18.75V21m-4.773-4.227-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0Z\"/></svg>',\n moon: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M21.752 15.002A9.72 9.72 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z\"/></svg>',\n bell: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 0 0 5.454-1.31A8.967 8.967 0 0 1 18 9.75V9A6 6 0 0 0 6 9v.75a8.967 8.967 0 0 1-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 0 1-5.714 0m5.714 0a3 3 0 1 1-5.714 0\"/></svg>',\n folder:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M2.25 12.75V12A2.25 2.25 0 0 1 4.5 9.75h15A2.25 2.25 0 0 1 21.75 12v.75m-8.69-6.44-2.12-2.12a1.5 1.5 0 0 0-1.061-.44H4.5A2.25 2.25 0 0 0 2.25 6v12a2.25 2.25 0 0 0 2.25 2.25h15A2.25 2.25 0 0 0 21.75 18V9a2.25 2.25 0 0 0-2.25-2.25h-5.379a1.5 1.5 0 0 1-1.06-.44Z\"/></svg>',\n 'shopping-cart':\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M2.25 3h1.386c.51 0 .955.343 1.087.835l.383 1.437M7.5 14.25a3 3 0 0 0-3 3h15.75m-12.75-3h11.218c1.121-2.3 2.1-4.684 2.924-7.138a60.114 60.114 0 0 0-16.536-1.84M7.5 14.25 5.106 5.272M6 20.25a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0Zm12.75 0a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0Z\"/></svg>',\n mail: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 0 1-2.25 2.25h-15a2.25 2.25 0 0 1-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0 0 19.5 4.5h-15a2.25 2.25 0 0 0-2.25 2.25m19.5 0v.243a2.25 2.25 0 0 1-1.07 1.916l-7.5 4.615a2.25 2.25 0 0 1-2.36 0L3.32 8.91a2.25 2.25 0 0 1-1.07-1.916V6.75\"/></svg>',\n 'information-circle':\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z\"/></svg>',\n user: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z\"/></svg>',\n logout:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.75 9V5.25A2.25 2.25 0 0 0 13.5 3h-6a2.25 2.25 0 0 0-2.25 2.25v13.5A2.25 2.25 0 0 0 7.5 21h6a2.25 2.25 0 0 0 2.25-2.25V15M12 9l-3 3m0 0 3 3m-3-3h12.75\"/></svg>',\n};\n\nexport type IconName = keyof typeof ICONS;\n","import { Component, input, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { ICONS } from './icons';\n\nexport type IconName = keyof typeof ICONS;\nexport type IconSize = 'small' | 'medium' | 'large';\n\n@Component({\n selector: 'particle-icon',\n imports: [CommonModule],\n templateUrl: './icon.component.html',\n styleUrl: './icon.component.scss',\n})\nexport class ParticleIcon {\n readonly name = input.required<IconName>();\n readonly size = input<IconSize>('medium');\n\n constructor(private sanitizer: DomSanitizer) {}\n\n protected svgContent = computed(() => {\n const iconName = this.name();\n const svg = ICONS[iconName] || '';\n return this.sanitizer.bypassSecurityTrustHtml(svg) as SafeHtml;\n });\n\n protected getSizeClass(): string {\n return `icon-${this.size()}`;\n }\n}\n","<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n [class]=\"getSizeClass()\"\n [innerHTML]=\"svgContent()\"\n></svg>\n","import { Component } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'particle-card',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './card.component.html',\n styleUrl: './card.component.scss',\n})\nexport class CardComponent {}\n","<div class=\"card\">\n <ng-content></ng-content>\n</div>\n","import { Component, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nexport type GridGap = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\nexport type GridCols = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\n\nexport interface GridResponsiveCols {\n mobile?: GridCols;\n tablet?: GridCols;\n desktop?: GridCols;\n}\n\nexport function getEffectiveCols(\n cols: GridCols | GridResponsiveCols | undefined,\n defaultCols: GridCols = 1,\n): { mobile: number; tablet: number; desktop: number } {\n if (cols === undefined) {\n return { mobile: defaultCols, tablet: defaultCols, desktop: defaultCols };\n }\n\n if (typeof cols === 'number') {\n return { mobile: cols, tablet: cols, desktop: cols };\n }\n\n const mobile = cols.mobile ?? defaultCols;\n const tablet = cols.tablet ?? cols.desktop ?? mobile;\n const desktop = cols.desktop ?? cols.tablet ?? mobile;\n\n return { mobile, tablet, desktop };\n}\n\n@Component({\n selector: 'particle-grid',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './grid.component.html',\n styleUrl: './grid.component.scss',\n})\nexport class GridComponent {\n readonly gap = input<GridGap>('md');\n readonly cols = input<GridCols | GridResponsiveCols>(1);\n\n protected readonly responsiveCols = () => getEffectiveCols(this.cols());\n}\n","<div\n class=\"grid\"\n [ngClass]=\"'gap-' + gap()\"\n [style.--grid-cols-mobile]=\"responsiveCols().mobile\"\n [style.--grid-cols-tablet]=\"responsiveCols().tablet\"\n [style.--grid-cols-desktop]=\"responsiveCols().desktop\"\n>\n <ng-content></ng-content>\n</div>\n","import { Component, input, output } from '@angular/core';\nimport type { IconName } from '../atoms/icons/icon.component';\nimport { ParticleIcon } from '../atoms/icons/icon.component';\n\nexport interface NavListItem {\n label: string;\n icon: IconName;\n route?: string;\n}\n\n@Component({\n selector: 'particle-sidebar',\n standalone: true,\n imports: [ParticleIcon],\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.scss',\n})\nexport class SidebarComponent {\n readonly appTitle = input<string>('');\n readonly collapsed = input<boolean>(false);\n readonly isMobile = input<boolean>(false);\n readonly toggle = output<void>();\n}\n","<aside class=\"sidebar\" [class.collapsed]=\"collapsed()\">\n <div class=\"sidebar-header\">\n <button class=\"sidebar-toggle\" (click)=\"toggle.emit()\" aria-label=\"Toggle sidebar\">\n <particle-icon\n [name]=\"isMobile() ? 'xmark' : collapsed() ? 'chevron-right' : 'chevron-left'\"\n size=\"medium\"\n />\n </button>\n @if (appTitle() && !collapsed()) {\n <h1 class=\"app-title\">{{ appTitle() }}</h1>\n }\n <ng-content select=\"[sidebarHeader]\"></ng-content>\n </div>\n <div class=\"sidebar-content\">\n <ng-content></ng-content>\n </div>\n <div class=\"sidebar-footer\">\n <ng-content select=\"[sidebarFooter]\"></ng-content>\n </div>\n</aside>\n","import { Component, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\n\nimport { ParticleIcon } from '../../atoms/icons/icon.component';\nimport type { NavListItem } from '../../organisms/sidebar.component';\n\n@Component({\n selector: 'particle-nav-list',\n standalone: true,\n imports: [CommonModule, RouterLink, RouterLinkActive, ParticleIcon],\n templateUrl: './nav-list.component.html',\n styleUrl: './nav-list.component.scss',\n})\nexport class NavListComponent {\n readonly items = input<readonly NavListItem[]>([]);\n readonly collapsed = input<boolean>(false);\n}\n","<div class=\"sidebar-nav-wrapper\">\n <nav class=\"sidebar-nav\" [class.collapsed]=\"collapsed()\">\n @for (item of items(); track item.label) {\n @if (item.route) {\n <a class=\"nav-item\" [routerLink]=\"item.route\" routerLinkActive=\"active\">\n <particle-icon [name]=\"item.icon\" size=\"medium\" />\n @if (!collapsed()) {\n <span class=\"nav-label\">{{ item.label }}</span>\n }\n </a>\n } @else {\n <span class=\"nav-item nav-item-disabled\">\n <particle-icon [name]=\"item.icon\" size=\"medium\" />\n @if (!collapsed()) {\n <span class=\"nav-label\">{{ item.label }}</span>\n }\n </span>\n }\n }\n </nav>\n</div>\n","import { signal } from '@angular/core';\n\nconst STORAGE_KEY = 'theme';\n\nexport const themeSignal = signal<boolean>(false);\n\nfunction getInitialTheme(): boolean {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored !== null) {\n return stored === 'dark';\n }\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n}\n\nexport function initializeTheme(): void {\n const isDark = getInitialTheme();\n themeSignal.set(isDark);\n applyTheme(isDark);\n}\n\nexport function toggleTheme(): void {\n const newValue = !themeSignal();\n setTheme(newValue);\n}\n\nexport function setTheme(isDark: boolean): void {\n themeSignal.set(isDark);\n applyTheme(isDark);\n localStorage.setItem(STORAGE_KEY, isDark ? 'dark' : 'light');\n}\n\nfunction applyTheme(isDark: boolean): void {\n document.documentElement.setAttribute('data-theme', isDark ? 'dark' : 'light');\n}\n","import { Component, input, signal, HostListener, ViewChild, ElementRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SidebarComponent } from '../organisms/sidebar.component';\nimport { NavListComponent } from '../molecules/nav-list/nav-list.component';\nimport { ParticleIcon } from '../atoms/icons/icon.component';\nimport type { NavListItem } from '../organisms/sidebar.component';\nimport { themeSignal, toggleTheme } from '../services/theme.service';\n\n@Component({\n selector: 'particle-dashboard',\n standalone: true,\n imports: [CommonModule, SidebarComponent, NavListComponent, ParticleIcon],\n templateUrl: './dashboard.component.html',\n styleUrl: './dashboard.component.scss',\n})\nexport class DashboardComponent {\n readonly appTitle = input<string>('Dashboard');\n readonly navItems = input<readonly NavListItem[]>([]);\n readonly userInitials = input<string>('');\n readonly userMenuItems = input<readonly NavListItem[]>([\n { label: 'Manage Account', icon: 'user', route: '/account' },\n { label: 'Settings', icon: 'cog', route: '/settings' },\n { label: 'Log Out', icon: 'logout', route: '/logout' },\n ]);\n\n protected readonly sidebarCollapsed = signal(false);\n protected readonly isMobile = signal(false);\n protected readonly mobileSidebarOpen = signal(false);\n protected readonly isDark = themeSignal;\n protected readonly userMenuOpen = signal(false);\n\n @ViewChild('userMenu') private readonly userMenu?: ElementRef<HTMLDivElement>;\n\n constructor() {\n this.checkScreenSize();\n }\n\n private getBreakpoint(): number {\n return parseInt(\n getComputedStyle(document.documentElement).getPropertyValue('--breakpoint-mobile') || '768',\n 10,\n );\n }\n\n @HostListener('window:resize')\n protected readonly checkScreenSize = () => {\n this.isMobile.set(window.innerWidth < this.getBreakpoint());\n };\n\n @HostListener('document:click', ['$event'])\n protected readonly onDocumentClick = (event: MouseEvent) => {\n if (\n this.userMenuOpen() &&\n this.userMenu &&\n !this.userMenu.nativeElement.contains(event.target as Node)\n ) {\n this.userMenuOpen.set(false);\n }\n };\n\n protected readonly toggleSidebar = () => {\n if (this.isMobile()) {\n this.mobileSidebarOpen.update((v) => !v);\n } else {\n this.sidebarCollapsed.update((v) => !v);\n }\n };\n\n protected readonly closeMobileSidebar = () => {\n this.mobileSidebarOpen.set(false);\n };\n\n protected readonly toggleTheme = () => toggleTheme();\n\n protected readonly toggleUserMenu = () => {\n this.userMenuOpen.update((v) => !v);\n };\n\n protected readonly closeUserMenu = () => {\n this.userMenuOpen.set(false);\n };\n}\n","<div class=\"dashboard\" [class.collapsed]=\"sidebarCollapsed()\">\n @if (!isMobile()) {\n <particle-sidebar\n [appTitle]=\"appTitle()\"\n [collapsed]=\"sidebarCollapsed()\"\n [isMobile]=\"false\"\n (toggle)=\"toggleSidebar()\"\n >\n <particle-nav-list [items]=\"navItems()\" [collapsed]=\"sidebarCollapsed()\" />\n </particle-sidebar>\n }\n\n @if (isMobile() && mobileSidebarOpen()) {\n <div class=\"mobile-sidebar-overlay\" (click)=\"closeMobileSidebar()\">\n <div class=\"mobile-sidebar\" (click)=\"$event.stopPropagation()\">\n <particle-sidebar\n [appTitle]=\"appTitle()\"\n [collapsed]=\"false\"\n [isMobile]=\"true\"\n (toggle)=\"closeMobileSidebar()\"\n >\n <particle-nav-list [items]=\"navItems()\" [collapsed]=\"false\" />\n </particle-sidebar>\n </div>\n </div>\n }\n\n <div class=\"main-content\" [class.mobile]=\"isMobile()\">\n <header class=\"header\">\n <div class=\"header-left\">\n @if (isMobile()) {\n <button class=\"menu-toggle\" (click)=\"toggleSidebar()\" aria-label=\"Toggle menu\">\n <particle-icon name=\"menu\" size=\"medium\" />\n </button>\n }\n </div>\n <div class=\"header-right\">\n <button\n class=\"theme-toggle\"\n (click)=\"toggleTheme()\"\n [attr.aria-label]=\"isDark() ? 'Switch to light mode' : 'Switch to dark mode'\"\n >\n @if (isDark()) {\n <particle-icon class=\"icon-lightmode\" name=\"sun\" size=\"medium\" />\n } @else {\n <particle-icon class=\"icon-darkmode\" name=\"moon\" size=\"medium\" />\n }\n </button>\n <div #userMenu class=\"user-menu\" (click)=\"toggleUserMenu()\">\n <span class=\"user-initials\">{{ userInitials() }}</span>\n @if (userMenuOpen()) {\n <div class=\"user-dropdown\" (click)=\"$event.stopPropagation()\">\n <particle-nav-list [items]=\"userMenuItems()\" [collapsed]=\"false\" />\n </div>\n }\n </div>\n </div>\n </header>\n\n <main class=\"content\">\n <ng-content></ng-content>\n </main>\n </div>\n</div>\n","/*\n * Public API Surface of component-lib\n */\n\nexport { ComponentLib } from './lib/component-lib';\n\nexport { ParticleButton } from './lib/atoms/button/button.component';\nexport type { ButtonVariant, ButtonSize, ButtonType } from './lib/atoms/button/button.component';\n\nexport { ParticleIcon } from './lib/atoms/icons/icon.component';\nexport type { IconName, IconSize } from './lib/atoms/icons/icon.component';\n\nexport { CardComponent } from './lib/atoms/card/card.component';\n\nexport { GridComponent } from './lib/molecules/grid/grid.component';\nexport type { GridGap, GridCols } from './lib/molecules/grid/grid.component';\n\nexport { DashboardComponent } from './lib/templates/dashboard.component';\n\nexport { SidebarComponent } from './lib/organisms/sidebar.component';\nexport type { NavListItem } from './lib/organisms/sidebar.component';\n\nexport { NavListComponent } from './lib/molecules/nav-list/nav-list.component';\n\nexport { initializeTheme, themeSignal, toggleTheme, setTheme } from './lib/services/theme.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kiranshub/dashboard-ui",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "description": "Angular UI component library with dashboard, sidebar, buttons, icons, and more",
5
5
  "keywords": [
6
6
  "angular",
@@ -43,9 +43,19 @@ declare class CardComponent {
43
43
 
44
44
  type GridGap = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
45
45
  type GridCols = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;
46
+ interface GridResponsiveCols {
47
+ mobile?: GridCols;
48
+ tablet?: GridCols;
49
+ desktop?: GridCols;
50
+ }
46
51
  declare class GridComponent {
47
52
  readonly gap: _angular_core.InputSignal<GridGap>;
48
- readonly cols: _angular_core.InputSignal<GridCols>;
53
+ readonly cols: _angular_core.InputSignal<GridCols | GridResponsiveCols>;
54
+ protected readonly responsiveCols: () => {
55
+ mobile: number;
56
+ tablet: number;
57
+ desktop: number;
58
+ };
49
59
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<GridComponent, never>;
50
60
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<GridComponent, "particle-grid", never, { "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "cols": { "alias": "cols"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
51
61
  }
@@ -74,9 +84,11 @@ declare class DashboardComponent {
74
84
  protected readonly mobileSidebarOpen: _angular_core.WritableSignal<boolean>;
75
85
  protected readonly isDark: _angular_core.WritableSignal<boolean>;
76
86
  protected readonly userMenuOpen: _angular_core.WritableSignal<boolean>;
87
+ private readonly userMenu?;
77
88
  constructor();
78
89
  private getBreakpoint;
79
90
  protected readonly checkScreenSize: () => void;
91
+ protected readonly onDocumentClick: (event: MouseEvent) => void;
80
92
  protected readonly toggleSidebar: () => void;
81
93
  protected readonly closeMobileSidebar: () => void;
82
94
  protected readonly toggleTheme: () => void;