@devjuliovilla/jv-ui 1.6.1 → 1.7.0

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.
@@ -19734,7 +19734,14 @@ class JvSidebarComponent {
19734
19734
  collapsed = input(false, ...(ngDevMode ? [{ debugName: "collapsed" }] : /* istanbul ignore next */ []));
19735
19735
  mobileOpen = input(false, ...(ngDevMode ? [{ debugName: "mobileOpen" }] : /* istanbul ignore next */ []));
19736
19736
  ariaLabel = input('Sidebar navigation', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
19737
+ currentTheme = input('light', ...(ngDevMode ? [{ debugName: "currentTheme" }] : /* istanbul ignore next */ []));
19738
+ themeOptions = input([], ...(ngDevMode ? [{ debugName: "themeOptions" }] : /* istanbul ignore next */ []));
19739
+ topbarActions = input([], ...(ngDevMode ? [{ debugName: "topbarActions" }] : /* istanbul ignore next */ []));
19740
+ showThemeSelector = input(true, ...(ngDevMode ? [{ debugName: "showThemeSelector" }] : /* istanbul ignore next */ []));
19737
19741
  collapseToggle = output();
19742
+ mobileClose = output();
19743
+ themeChange = output();
19744
+ actionClick = output();
19738
19745
  activeChildParentIds = computed(() => {
19739
19746
  const url = this.router.url;
19740
19747
  const ids = new Set();
@@ -19777,248 +19784,322 @@ class JvSidebarComponent {
19777
19784
  target?.scrollIntoView({ block: 'start', behavior: 'smooth' });
19778
19785
  }
19779
19786
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: JvSidebarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
19780
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: JvSidebarComponent, isStandalone: true, selector: "jv-sidebar", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, brandIcon: { classPropertyName: "brandIcon", publicName: "brandIcon", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, mobileOpen: { classPropertyName: "mobileOpen", publicName: "mobileOpen", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapseToggle: "collapseToggle" }, ngImport: i0, template: `
19781
- <aside class="jv-sidebar" [class.is-collapsed]="collapsed()" [class.is-mobile-open]="mobileOpen()">
19782
- <div class="jv-sidebar-brand">
19783
- <div class="brand-mark">
19784
- <jv-icon [name]="brandIcon()" [size]="18" />
19785
- </div>
19786
-
19787
- @if (!collapsed()) {
19788
- <div class="brand-copy">
19789
- <strong>{{ title() }}</strong>
19790
- @if (subtitle()) {
19791
- <span>{{ subtitle() }}</span>
19792
- }
19793
- </div>
19794
- }
19795
- </div>
19796
-
19797
- <nav class="jv-sidebar-nav" [attr.aria-label]="ariaLabel()">
19798
- <ul class="jv-sidebar-list">
19799
- @for (item of normalizedItems(); track item.id) {
19800
- <li class="jv-sidebar-item">
19801
- @if (item.children.length > 0) {
19802
- <button
19803
- type="button"
19804
- class="jv-sidebar-link"
19805
- [class.is-active]="item.active"
19806
- [attr.aria-label]="item.label"
19807
- [attr.aria-expanded]="isExpanded(item.id) ? 'true' : 'false'"
19808
- [attr.aria-controls]="'jv-sidebar-section-' + item.id"
19809
- [attr.title]="item.label"
19810
- (click)="toggleSection(item.id)"
19811
- >
19812
- <span class="jv-sidebar-link-main">
19813
- @if (item.icon) {
19814
- <jv-icon [name]="item.icon" [size]="18" />
19815
- }
19816
-
19817
- @if (!collapsed()) {
19818
- <span>{{ item.label }}</span>
19819
- }
19820
- </span>
19821
-
19822
- @if (!collapsed()) {
19823
- <jv-icon [name]="isExpanded(item.id) ? 'chevron-up' : 'chevron-down'" [size]="16" />
19824
- }
19825
- </button>
19826
- } @else {
19827
- @if (isHashLink(item.href)) {
19828
- <button
19829
- type="button"
19830
- class="jv-sidebar-link"
19831
- [class.is-active]="item.active"
19832
- [attr.aria-label]="item.label"
19833
- [attr.aria-current]="item.active ? 'page' : null"
19834
- [attr.title]="item.label"
19835
- (click)="navigateTo(item.href)"
19836
- >
19837
- <span class="jv-sidebar-link-main">
19838
- @if (item.icon) {
19839
- <jv-icon [name]="item.icon" [size]="18" />
19840
- }
19841
-
19842
- @if (!collapsed()) {
19843
- <span>{{ item.label }}</span>
19844
- }
19845
- </span>
19846
- </button>
19847
- } @else {
19848
- <a
19849
- class="jv-sidebar-link"
19850
- [class.is-active]="item.active"
19851
- [attr.aria-label]="item.label"
19852
- [attr.aria-current]="item.active ? 'page' : null"
19853
- [routerLink]="item.href"
19854
- [attr.title]="item.label"
19855
- >
19856
- <span class="jv-sidebar-link-main">
19857
- @if (item.icon) {
19858
- <jv-icon [name]="item.icon" [size]="18" />
19859
- }
19860
-
19861
- @if (!collapsed()) {
19862
- <span>{{ item.label }}</span>
19863
- }
19864
- </span>
19865
- </a>
19866
- }
19867
- }
19868
-
19869
- @if (!collapsed() && item.children.length > 0 && isExpanded(item.id)) {
19870
- <div class="jv-sidebar-children" [id]="'jv-sidebar-section-' + item.id">
19871
- @for (child of item.children; track child.id) {
19872
- @if (isHashLink(child.href)) {
19873
- <button type="button" class="jv-sidebar-child-link" [class.is-active]="child.active" [attr.aria-label]="child.label" [attr.aria-current]="child.active ? 'page' : null" [attr.title]="child.label" (click)="navigateTo(child.href)">
19874
- {{ child.label }}
19875
- </button>
19876
- } @else {
19877
- <a class="jv-sidebar-child-link" [class.is-active]="child.active" [attr.aria-label]="child.label" [attr.aria-current]="child.active ? 'page' : null" [routerLink]="child.href" [attr.title]="child.label">
19878
- {{ child.label }}
19879
- </a>
19880
- }
19881
- }
19882
- </div>
19883
- }
19884
- </li>
19885
- }
19886
- </ul>
19887
- </nav>
19888
-
19889
- <div class="jv-sidebar-footer">
19890
- <button type="button" class="jv-sidebar-toggle" (click)="collapseToggle.emit()">
19891
- <jv-icon [name]="collapsed() ? 'menu' : 'panel-left-close'" [size]="18" />
19892
- @if (!collapsed()) {
19893
- <span>Collapse</span>
19894
- }
19895
- </button>
19896
- </div>
19897
- </aside>
19898
- `, isInline: true, styles: [".jv-sidebar{display:grid;grid-template-rows:auto 1fr auto;gap:var(--jv-spacing-lg);width:280px;min-width:280px;height:100vh;padding:var(--jv-spacing-lg);overflow-y:auto;border-right:1px solid var(--jv-color-border);background:var(--jv-color-surface);scrollbar-width:none;-ms-overflow-style:none}.jv-sidebar::-webkit-scrollbar{width:0;height:0;display:none}.jv-sidebar.is-collapsed{width:96px;min-width:96px;padding-inline:var(--jv-spacing-md)}.jv-sidebar-brand,.jv-sidebar-link,.jv-sidebar-toggle{display:flex;align-items:center;gap:var(--jv-spacing-sm)}.brand-mark{display:inline-grid;place-items:center;width:2.5rem;height:2.5rem;border-radius:var(--jv-radius-md);background:color-mix(in srgb,var(--jv-color-primary) 16%,var(--jv-color-surface));color:var(--jv-color-primary)}.brand-copy{display:grid;gap:.1rem}.brand-copy span{color:var(--jv-color-foreground-muted);font-size:.875rem}.jv-sidebar-item{display:grid;gap:var(--jv-spacing-xs);list-style:none}.jv-sidebar-list{display:grid;gap:var(--jv-spacing-xs);margin:0;padding:0}.jv-sidebar-nav{display:grid;gap:var(--jv-spacing-xs);align-content:start}.jv-sidebar-link,.jv-sidebar-child-link,.jv-sidebar-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;min-height:var(--jv-density-control-height);padding:0 var(--jv-spacing-md);border:1px solid transparent;border-radius:var(--jv-radius-md);background:transparent;color:var(--jv-color-foreground-muted);text-decoration:none;cursor:pointer}.jv-sidebar-link-main{display:inline-flex;align-items:center;gap:var(--jv-spacing-sm)}.jv-sidebar-link:hover,.jv-sidebar-child-link:hover,.jv-sidebar-toggle:hover{background:var(--jv-color-surface-muted);color:var(--jv-color-foreground)}.jv-sidebar-link.is-active,.jv-sidebar-child-link.is-active{border-color:color-mix(in srgb,var(--jv-color-primary) 25%,var(--jv-color-border));background:color-mix(in srgb,var(--jv-color-primary) 12%,var(--jv-color-surface));color:var(--jv-color-foreground)}.jv-sidebar-children{display:grid;gap:var(--jv-spacing-xs);margin-left:var(--jv-spacing-xl);padding-left:var(--jv-spacing-sm);border-left:1px solid var(--jv-color-border)}.jv-sidebar-child-link{display:flex;align-items:center;min-height:2.25rem;font-size:.9rem}.jv-sidebar-toggle{width:100%;background:var(--jv-color-surface-muted);cursor:pointer}@media(max-width:900px){.jv-sidebar{width:100%;min-width:0;height:auto;max-height:100vh;border-right:0;border-bottom:1px solid var(--jv-color-border)}.jv-sidebar:not(.is-mobile-open){display:none}.jv-sidebar.is-collapsed{width:100%;min-width:0}}\n"], dependencies: [{ kind: "component", type: JvIconComponent, selector: "jv-icon", inputs: ["name", "size", "strokeWidth", "decorative", "ariaLabel"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
19787
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: JvSidebarComponent, isStandalone: true, selector: "jv-sidebar", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, brandIcon: { classPropertyName: "brandIcon", publicName: "brandIcon", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, mobileOpen: { classPropertyName: "mobileOpen", publicName: "mobileOpen", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, currentTheme: { classPropertyName: "currentTheme", publicName: "currentTheme", isSignal: true, isRequired: false, transformFunction: null }, themeOptions: { classPropertyName: "themeOptions", publicName: "themeOptions", isSignal: true, isRequired: false, transformFunction: null }, topbarActions: { classPropertyName: "topbarActions", publicName: "topbarActions", isSignal: true, isRequired: false, transformFunction: null }, showThemeSelector: { classPropertyName: "showThemeSelector", publicName: "showThemeSelector", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapseToggle: "collapseToggle", mobileClose: "mobileClose", themeChange: "themeChange", actionClick: "actionClick" }, ngImport: i0, template: `
19788
+ @if (mobileOpen()) {
19789
+ <div class="jv-sidebar-backdrop" (click)="mobileClose.emit()"></div>
19790
+ }
19791
+
19792
+ <aside
19793
+ class="jv-sidebar"
19794
+ [class.is-collapsed]="collapsed()"
19795
+ [class.is-mobile-open]="mobileOpen()"
19796
+ >
19797
+ <div class="jv-sidebar-brand">
19798
+ <div class="brand-mark">
19799
+ <jv-icon [name]="brandIcon()" [size]="18" />
19800
+ </div>
19801
+
19802
+ @if (!collapsed()) {
19803
+ <div class="brand-copy">
19804
+ <strong>{{ title() }}</strong>
19805
+ @if (subtitle()) {
19806
+ <span>{{ subtitle() }}</span>
19807
+ }
19808
+ </div>
19809
+ }
19810
+ </div>
19811
+
19812
+ <nav class="jv-sidebar-nav" [attr.aria-label]="ariaLabel()">
19813
+ <ul class="jv-sidebar-list">
19814
+ @for (item of normalizedItems(); track item.id) {
19815
+ <li class="jv-sidebar-item">
19816
+ @if (item.children.length > 0) {
19817
+ <button
19818
+ type="button"
19819
+ class="jv-sidebar-link"
19820
+ [class.is-active]="item.active"
19821
+ [attr.aria-label]="item.label"
19822
+ [attr.aria-expanded]="isExpanded(item.id) ? 'true' : 'false'"
19823
+ [attr.aria-controls]="'jv-sidebar-section-' + item.id"
19824
+ [attr.title]="item.label"
19825
+ (click)="toggleSection(item.id)"
19826
+ >
19827
+ <span class="jv-sidebar-link-main">
19828
+ @if (item.icon) {
19829
+ <jv-icon [name]="item.icon" [size]="18" />
19830
+ }
19831
+
19832
+ @if (!collapsed()) {
19833
+ <span>{{ item.label }}</span>
19834
+ }
19835
+ </span>
19836
+
19837
+ @if (!collapsed()) {
19838
+ <jv-icon [name]="isExpanded(item.id) ? 'chevron-up' : 'chevron-down'" [size]="16" />
19839
+ }
19840
+ </button>
19841
+ } @else {
19842
+ @if (isHashLink(item.href)) {
19843
+ <button
19844
+ type="button"
19845
+ class="jv-sidebar-link"
19846
+ [class.is-active]="item.active"
19847
+ [attr.aria-label]="item.label"
19848
+ [attr.aria-current]="item.active ? 'page' : null"
19849
+ [attr.title]="item.label"
19850
+ (click)="navigateTo(item.href); mobileClose.emit()"
19851
+ >
19852
+ <span class="jv-sidebar-link-main">
19853
+ @if (item.icon) {
19854
+ <jv-icon [name]="item.icon" [size]="18" />
19855
+ }
19856
+
19857
+ @if (!collapsed()) {
19858
+ <span>{{ item.label }}</span>
19859
+ }
19860
+ </span>
19861
+ </button>
19862
+ } @else {
19863
+ <a
19864
+ class="jv-sidebar-link"
19865
+ [class.is-active]="item.active"
19866
+ [attr.aria-label]="item.label"
19867
+ [attr.aria-current]="item.active ? 'page' : null"
19868
+ [routerLink]="item.href"
19869
+ [attr.title]="item.label"
19870
+ (click)="mobileClose.emit()"
19871
+ >
19872
+ <span class="jv-sidebar-link-main">
19873
+ @if (item.icon) {
19874
+ <jv-icon [name]="item.icon" [size]="18" />
19875
+ }
19876
+
19877
+ @if (!collapsed()) {
19878
+ <span>{{ item.label }}</span>
19879
+ }
19880
+ </span>
19881
+ </a>
19882
+ }
19883
+ }
19884
+
19885
+ @if (!collapsed() && item.children.length > 0 && isExpanded(item.id)) {
19886
+ <div class="jv-sidebar-children" [id]="'jv-sidebar-section-' + item.id">
19887
+ @for (child of item.children; track child.id) {
19888
+ @if (isHashLink(child.href)) {
19889
+ <button type="button" class="jv-sidebar-child-link" [class.is-active]="child.active" [attr.aria-label]="child.label" [attr.aria-current]="child.active ? 'page' : null" [attr.title]="child.label" (click)="navigateTo(child.href)">
19890
+ {{ child.label }}
19891
+ </button>
19892
+ } @else {
19893
+ <a class="jv-sidebar-child-link" [class.is-active]="child.active" [attr.aria-label]="child.label" [attr.aria-current]="child.active ? 'page' : null" [routerLink]="child.href" [attr.title]="child.label" (click)="mobileClose.emit()">
19894
+ {{ child.label }}
19895
+ </a>
19896
+ }
19897
+ }
19898
+ </div>
19899
+ }
19900
+ </li>
19901
+ }
19902
+ </ul>
19903
+ </nav>
19904
+
19905
+ <div class="jv-sidebar-footer">
19906
+ <button type="button" class="jv-sidebar-toggle" (click)="collapseToggle.emit()">
19907
+ <jv-icon [name]="collapsed() ? 'menu' : 'panel-left-close'" [size]="18" />
19908
+ @if (!collapsed()) {
19909
+ <span>Collapse</span>
19910
+ }
19911
+ </button>
19912
+
19913
+ <div class="jv-sidebar-mobile-extras">
19914
+ @if (showThemeSelector()) {
19915
+ <div class="theme-group" aria-label="Theme selector">
19916
+ @for (option of themeOptions(); track option.value) {
19917
+ <button
19918
+ type="button"
19919
+ class="theme-pill"
19920
+ [class.is-active]="currentTheme() === option.value"
19921
+ (click)="themeChange.emit(option.value)"
19922
+ >
19923
+ @if (option.icon) {
19924
+ <jv-icon [name]="option.icon" [size]="16" />
19925
+ }
19926
+ <span>{{ option.label }}</span>
19927
+ </button>
19928
+ }
19929
+ </div>
19930
+ }
19931
+
19932
+ <div class="mobile-actions">
19933
+ @for (action of topbarActions(); track action.id) {
19934
+ <button type="button" class="icon-button" [attr.aria-label]="action.label" (click)="actionClick.emit(action.id); mobileClose.emit()">
19935
+ <jv-icon [name]="action.icon" [size]="18" />
19936
+ </button>
19937
+ }
19938
+ </div>
19939
+ </div>
19940
+ </div>
19941
+ </aside>
19942
+ `, isInline: true, styles: [".jv-sidebar-backdrop{display:none}.jv-sidebar{display:grid;grid-template-rows:auto 1fr auto;gap:var(--jv-spacing-lg);width:280px;min-width:280px;height:100vh;padding:var(--jv-spacing-lg);overflow-y:auto;border-right:1px solid var(--jv-color-border);background:var(--jv-color-surface);scrollbar-width:none;-ms-overflow-style:none}.jv-sidebar::-webkit-scrollbar{width:0;height:0;display:none}.jv-sidebar.is-collapsed{width:96px;min-width:96px;padding-inline:var(--jv-spacing-md)}.jv-sidebar-footer{display:grid;gap:var(--jv-spacing-md)}.jv-sidebar-mobile-extras{display:none}.jv-sidebar-brand,.jv-sidebar-link,.jv-sidebar-toggle{display:flex;align-items:center;gap:var(--jv-spacing-sm)}.brand-mark{display:inline-grid;place-items:center;width:2.5rem;height:2.5rem;border-radius:var(--jv-radius-md);background:color-mix(in srgb,var(--jv-color-primary) 16%,var(--jv-color-surface));color:var(--jv-color-primary)}.brand-copy{display:grid;gap:.1rem}.brand-copy span{color:var(--jv-color-foreground-muted);font-size:.875rem}.jv-sidebar-item{display:grid;gap:var(--jv-spacing-xs);list-style:none}.jv-sidebar-list{display:grid;gap:var(--jv-spacing-xs);margin:0;padding:0}.jv-sidebar-nav{display:grid;gap:var(--jv-spacing-xs);align-content:start}.jv-sidebar-link,.jv-sidebar-child-link,.jv-sidebar-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;min-height:var(--jv-density-control-height);padding:0 var(--jv-spacing-md);border:1px solid transparent;border-radius:var(--jv-radius-md);background:transparent;color:var(--jv-color-foreground-muted);text-decoration:none;cursor:pointer}.jv-sidebar-link-main{display:inline-flex;align-items:center;gap:var(--jv-spacing-sm)}.jv-sidebar-link:hover,.jv-sidebar-child-link:hover,.jv-sidebar-toggle:hover{background:var(--jv-color-surface-muted);color:var(--jv-color-foreground)}.jv-sidebar-link.is-active,.jv-sidebar-child-link.is-active{border-color:color-mix(in srgb,var(--jv-color-primary) 25%,var(--jv-color-border));background:color-mix(in srgb,var(--jv-color-primary) 12%,var(--jv-color-surface));color:var(--jv-color-foreground)}.jv-sidebar-children{display:grid;gap:var(--jv-spacing-xs);margin-left:var(--jv-spacing-xl);padding-left:var(--jv-spacing-sm);border-left:1px solid var(--jv-color-border)}.jv-sidebar-child-link{display:flex;align-items:center;min-height:2.25rem;font-size:.9rem}.jv-sidebar-toggle{width:100%;background:var(--jv-color-surface-muted);cursor:pointer}@media(max-width:900px){.jv-sidebar-backdrop{display:block;position:fixed;inset:0;z-index:99;background:#0006}.jv-sidebar{position:fixed;top:0;left:0;z-index:100;width:280px;min-width:280px;height:100vh;border-right:1px solid var(--jv-color-border);border-bottom:none;box-shadow:var(--jv-shadow-lg);transform:translate(-100%);visibility:hidden;transition:transform .24s cubic-bezier(.4,0,.2,1),visibility .24s}.jv-sidebar.is-mobile-open{transform:translate(0);visibility:visible}.jv-sidebar.is-collapsed{width:280px;min-width:280px}.jv-sidebar-mobile-extras{display:flex;flex-direction:column;gap:var(--jv-spacing-md);padding-top:var(--jv-spacing-md);border-top:1px solid var(--jv-color-border)}.jv-sidebar-mobile-extras .theme-group{display:flex;flex-wrap:wrap;gap:var(--jv-spacing-xs)}.jv-sidebar-mobile-extras .theme-pill{display:inline-flex;align-items:center;gap:var(--jv-spacing-xs);min-height:var(--jv-density-control-height);padding:0 var(--jv-spacing-md);border:1px solid var(--jv-color-border);border-radius:999px;background:var(--jv-color-surface-muted);color:var(--jv-color-foreground);cursor:pointer;font:inherit}.jv-sidebar-mobile-extras .theme-pill.is-active{border-color:var(--jv-color-primary);background:color-mix(in srgb,var(--jv-color-primary) 14%,var(--jv-color-surface))}.jv-sidebar-mobile-extras .mobile-actions{display:flex;gap:var(--jv-spacing-sm)}.jv-sidebar-mobile-extras .icon-button{display:inline-grid;place-items:center;width:var(--jv-density-control-height);height:var(--jv-density-control-height);border:1px solid var(--jv-color-border);border-radius:999px;background:var(--jv-color-surface-muted);color:var(--jv-color-foreground);cursor:pointer}}\n"], dependencies: [{ kind: "component", type: JvIconComponent, selector: "jv-icon", inputs: ["name", "size", "strokeWidth", "decorative", "ariaLabel"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
19899
19943
  }
19900
19944
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: JvSidebarComponent, decorators: [{
19901
19945
  type: Component,
19902
- args: [{ selector: 'jv-sidebar', standalone: true, imports: [JvIconComponent, RouterLink], template: `
19903
- <aside class="jv-sidebar" [class.is-collapsed]="collapsed()" [class.is-mobile-open]="mobileOpen()">
19904
- <div class="jv-sidebar-brand">
19905
- <div class="brand-mark">
19906
- <jv-icon [name]="brandIcon()" [size]="18" />
19907
- </div>
19908
-
19909
- @if (!collapsed()) {
19910
- <div class="brand-copy">
19911
- <strong>{{ title() }}</strong>
19912
- @if (subtitle()) {
19913
- <span>{{ subtitle() }}</span>
19914
- }
19915
- </div>
19916
- }
19917
- </div>
19918
-
19919
- <nav class="jv-sidebar-nav" [attr.aria-label]="ariaLabel()">
19920
- <ul class="jv-sidebar-list">
19921
- @for (item of normalizedItems(); track item.id) {
19922
- <li class="jv-sidebar-item">
19923
- @if (item.children.length > 0) {
19924
- <button
19925
- type="button"
19926
- class="jv-sidebar-link"
19927
- [class.is-active]="item.active"
19928
- [attr.aria-label]="item.label"
19929
- [attr.aria-expanded]="isExpanded(item.id) ? 'true' : 'false'"
19930
- [attr.aria-controls]="'jv-sidebar-section-' + item.id"
19931
- [attr.title]="item.label"
19932
- (click)="toggleSection(item.id)"
19933
- >
19934
- <span class="jv-sidebar-link-main">
19935
- @if (item.icon) {
19936
- <jv-icon [name]="item.icon" [size]="18" />
19937
- }
19938
-
19939
- @if (!collapsed()) {
19940
- <span>{{ item.label }}</span>
19941
- }
19942
- </span>
19943
-
19944
- @if (!collapsed()) {
19945
- <jv-icon [name]="isExpanded(item.id) ? 'chevron-up' : 'chevron-down'" [size]="16" />
19946
- }
19947
- </button>
19948
- } @else {
19949
- @if (isHashLink(item.href)) {
19950
- <button
19951
- type="button"
19952
- class="jv-sidebar-link"
19953
- [class.is-active]="item.active"
19954
- [attr.aria-label]="item.label"
19955
- [attr.aria-current]="item.active ? 'page' : null"
19956
- [attr.title]="item.label"
19957
- (click)="navigateTo(item.href)"
19958
- >
19959
- <span class="jv-sidebar-link-main">
19960
- @if (item.icon) {
19961
- <jv-icon [name]="item.icon" [size]="18" />
19962
- }
19963
-
19964
- @if (!collapsed()) {
19965
- <span>{{ item.label }}</span>
19966
- }
19967
- </span>
19968
- </button>
19969
- } @else {
19970
- <a
19971
- class="jv-sidebar-link"
19972
- [class.is-active]="item.active"
19973
- [attr.aria-label]="item.label"
19974
- [attr.aria-current]="item.active ? 'page' : null"
19975
- [routerLink]="item.href"
19976
- [attr.title]="item.label"
19977
- >
19978
- <span class="jv-sidebar-link-main">
19979
- @if (item.icon) {
19980
- <jv-icon [name]="item.icon" [size]="18" />
19981
- }
19982
-
19983
- @if (!collapsed()) {
19984
- <span>{{ item.label }}</span>
19985
- }
19986
- </span>
19987
- </a>
19988
- }
19989
- }
19990
-
19991
- @if (!collapsed() && item.children.length > 0 && isExpanded(item.id)) {
19992
- <div class="jv-sidebar-children" [id]="'jv-sidebar-section-' + item.id">
19993
- @for (child of item.children; track child.id) {
19994
- @if (isHashLink(child.href)) {
19995
- <button type="button" class="jv-sidebar-child-link" [class.is-active]="child.active" [attr.aria-label]="child.label" [attr.aria-current]="child.active ? 'page' : null" [attr.title]="child.label" (click)="navigateTo(child.href)">
19996
- {{ child.label }}
19997
- </button>
19998
- } @else {
19999
- <a class="jv-sidebar-child-link" [class.is-active]="child.active" [attr.aria-label]="child.label" [attr.aria-current]="child.active ? 'page' : null" [routerLink]="child.href" [attr.title]="child.label">
20000
- {{ child.label }}
20001
- </a>
20002
- }
20003
- }
20004
- </div>
20005
- }
20006
- </li>
20007
- }
20008
- </ul>
20009
- </nav>
20010
-
20011
- <div class="jv-sidebar-footer">
20012
- <button type="button" class="jv-sidebar-toggle" (click)="collapseToggle.emit()">
20013
- <jv-icon [name]="collapsed() ? 'menu' : 'panel-left-close'" [size]="18" />
20014
- @if (!collapsed()) {
20015
- <span>Collapse</span>
20016
- }
20017
- </button>
20018
- </div>
20019
- </aside>
20020
- `, styles: [".jv-sidebar{display:grid;grid-template-rows:auto 1fr auto;gap:var(--jv-spacing-lg);width:280px;min-width:280px;height:100vh;padding:var(--jv-spacing-lg);overflow-y:auto;border-right:1px solid var(--jv-color-border);background:var(--jv-color-surface);scrollbar-width:none;-ms-overflow-style:none}.jv-sidebar::-webkit-scrollbar{width:0;height:0;display:none}.jv-sidebar.is-collapsed{width:96px;min-width:96px;padding-inline:var(--jv-spacing-md)}.jv-sidebar-brand,.jv-sidebar-link,.jv-sidebar-toggle{display:flex;align-items:center;gap:var(--jv-spacing-sm)}.brand-mark{display:inline-grid;place-items:center;width:2.5rem;height:2.5rem;border-radius:var(--jv-radius-md);background:color-mix(in srgb,var(--jv-color-primary) 16%,var(--jv-color-surface));color:var(--jv-color-primary)}.brand-copy{display:grid;gap:.1rem}.brand-copy span{color:var(--jv-color-foreground-muted);font-size:.875rem}.jv-sidebar-item{display:grid;gap:var(--jv-spacing-xs);list-style:none}.jv-sidebar-list{display:grid;gap:var(--jv-spacing-xs);margin:0;padding:0}.jv-sidebar-nav{display:grid;gap:var(--jv-spacing-xs);align-content:start}.jv-sidebar-link,.jv-sidebar-child-link,.jv-sidebar-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;min-height:var(--jv-density-control-height);padding:0 var(--jv-spacing-md);border:1px solid transparent;border-radius:var(--jv-radius-md);background:transparent;color:var(--jv-color-foreground-muted);text-decoration:none;cursor:pointer}.jv-sidebar-link-main{display:inline-flex;align-items:center;gap:var(--jv-spacing-sm)}.jv-sidebar-link:hover,.jv-sidebar-child-link:hover,.jv-sidebar-toggle:hover{background:var(--jv-color-surface-muted);color:var(--jv-color-foreground)}.jv-sidebar-link.is-active,.jv-sidebar-child-link.is-active{border-color:color-mix(in srgb,var(--jv-color-primary) 25%,var(--jv-color-border));background:color-mix(in srgb,var(--jv-color-primary) 12%,var(--jv-color-surface));color:var(--jv-color-foreground)}.jv-sidebar-children{display:grid;gap:var(--jv-spacing-xs);margin-left:var(--jv-spacing-xl);padding-left:var(--jv-spacing-sm);border-left:1px solid var(--jv-color-border)}.jv-sidebar-child-link{display:flex;align-items:center;min-height:2.25rem;font-size:.9rem}.jv-sidebar-toggle{width:100%;background:var(--jv-color-surface-muted);cursor:pointer}@media(max-width:900px){.jv-sidebar{width:100%;min-width:0;height:auto;max-height:100vh;border-right:0;border-bottom:1px solid var(--jv-color-border)}.jv-sidebar:not(.is-mobile-open){display:none}.jv-sidebar.is-collapsed{width:100%;min-width:0}}\n"] }]
20021
- }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], brandIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "brandIcon", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], mobileOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "mobileOpen", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], collapseToggle: [{ type: i0.Output, args: ["collapseToggle"] }] } });
19946
+ args: [{ selector: 'jv-sidebar', standalone: true, imports: [JvIconComponent, RouterLink], template: `
19947
+ @if (mobileOpen()) {
19948
+ <div class="jv-sidebar-backdrop" (click)="mobileClose.emit()"></div>
19949
+ }
19950
+
19951
+ <aside
19952
+ class="jv-sidebar"
19953
+ [class.is-collapsed]="collapsed()"
19954
+ [class.is-mobile-open]="mobileOpen()"
19955
+ >
19956
+ <div class="jv-sidebar-brand">
19957
+ <div class="brand-mark">
19958
+ <jv-icon [name]="brandIcon()" [size]="18" />
19959
+ </div>
19960
+
19961
+ @if (!collapsed()) {
19962
+ <div class="brand-copy">
19963
+ <strong>{{ title() }}</strong>
19964
+ @if (subtitle()) {
19965
+ <span>{{ subtitle() }}</span>
19966
+ }
19967
+ </div>
19968
+ }
19969
+ </div>
19970
+
19971
+ <nav class="jv-sidebar-nav" [attr.aria-label]="ariaLabel()">
19972
+ <ul class="jv-sidebar-list">
19973
+ @for (item of normalizedItems(); track item.id) {
19974
+ <li class="jv-sidebar-item">
19975
+ @if (item.children.length > 0) {
19976
+ <button
19977
+ type="button"
19978
+ class="jv-sidebar-link"
19979
+ [class.is-active]="item.active"
19980
+ [attr.aria-label]="item.label"
19981
+ [attr.aria-expanded]="isExpanded(item.id) ? 'true' : 'false'"
19982
+ [attr.aria-controls]="'jv-sidebar-section-' + item.id"
19983
+ [attr.title]="item.label"
19984
+ (click)="toggleSection(item.id)"
19985
+ >
19986
+ <span class="jv-sidebar-link-main">
19987
+ @if (item.icon) {
19988
+ <jv-icon [name]="item.icon" [size]="18" />
19989
+ }
19990
+
19991
+ @if (!collapsed()) {
19992
+ <span>{{ item.label }}</span>
19993
+ }
19994
+ </span>
19995
+
19996
+ @if (!collapsed()) {
19997
+ <jv-icon [name]="isExpanded(item.id) ? 'chevron-up' : 'chevron-down'" [size]="16" />
19998
+ }
19999
+ </button>
20000
+ } @else {
20001
+ @if (isHashLink(item.href)) {
20002
+ <button
20003
+ type="button"
20004
+ class="jv-sidebar-link"
20005
+ [class.is-active]="item.active"
20006
+ [attr.aria-label]="item.label"
20007
+ [attr.aria-current]="item.active ? 'page' : null"
20008
+ [attr.title]="item.label"
20009
+ (click)="navigateTo(item.href); mobileClose.emit()"
20010
+ >
20011
+ <span class="jv-sidebar-link-main">
20012
+ @if (item.icon) {
20013
+ <jv-icon [name]="item.icon" [size]="18" />
20014
+ }
20015
+
20016
+ @if (!collapsed()) {
20017
+ <span>{{ item.label }}</span>
20018
+ }
20019
+ </span>
20020
+ </button>
20021
+ } @else {
20022
+ <a
20023
+ class="jv-sidebar-link"
20024
+ [class.is-active]="item.active"
20025
+ [attr.aria-label]="item.label"
20026
+ [attr.aria-current]="item.active ? 'page' : null"
20027
+ [routerLink]="item.href"
20028
+ [attr.title]="item.label"
20029
+ (click)="mobileClose.emit()"
20030
+ >
20031
+ <span class="jv-sidebar-link-main">
20032
+ @if (item.icon) {
20033
+ <jv-icon [name]="item.icon" [size]="18" />
20034
+ }
20035
+
20036
+ @if (!collapsed()) {
20037
+ <span>{{ item.label }}</span>
20038
+ }
20039
+ </span>
20040
+ </a>
20041
+ }
20042
+ }
20043
+
20044
+ @if (!collapsed() && item.children.length > 0 && isExpanded(item.id)) {
20045
+ <div class="jv-sidebar-children" [id]="'jv-sidebar-section-' + item.id">
20046
+ @for (child of item.children; track child.id) {
20047
+ @if (isHashLink(child.href)) {
20048
+ <button type="button" class="jv-sidebar-child-link" [class.is-active]="child.active" [attr.aria-label]="child.label" [attr.aria-current]="child.active ? 'page' : null" [attr.title]="child.label" (click)="navigateTo(child.href)">
20049
+ {{ child.label }}
20050
+ </button>
20051
+ } @else {
20052
+ <a class="jv-sidebar-child-link" [class.is-active]="child.active" [attr.aria-label]="child.label" [attr.aria-current]="child.active ? 'page' : null" [routerLink]="child.href" [attr.title]="child.label" (click)="mobileClose.emit()">
20053
+ {{ child.label }}
20054
+ </a>
20055
+ }
20056
+ }
20057
+ </div>
20058
+ }
20059
+ </li>
20060
+ }
20061
+ </ul>
20062
+ </nav>
20063
+
20064
+ <div class="jv-sidebar-footer">
20065
+ <button type="button" class="jv-sidebar-toggle" (click)="collapseToggle.emit()">
20066
+ <jv-icon [name]="collapsed() ? 'menu' : 'panel-left-close'" [size]="18" />
20067
+ @if (!collapsed()) {
20068
+ <span>Collapse</span>
20069
+ }
20070
+ </button>
20071
+
20072
+ <div class="jv-sidebar-mobile-extras">
20073
+ @if (showThemeSelector()) {
20074
+ <div class="theme-group" aria-label="Theme selector">
20075
+ @for (option of themeOptions(); track option.value) {
20076
+ <button
20077
+ type="button"
20078
+ class="theme-pill"
20079
+ [class.is-active]="currentTheme() === option.value"
20080
+ (click)="themeChange.emit(option.value)"
20081
+ >
20082
+ @if (option.icon) {
20083
+ <jv-icon [name]="option.icon" [size]="16" />
20084
+ }
20085
+ <span>{{ option.label }}</span>
20086
+ </button>
20087
+ }
20088
+ </div>
20089
+ }
20090
+
20091
+ <div class="mobile-actions">
20092
+ @for (action of topbarActions(); track action.id) {
20093
+ <button type="button" class="icon-button" [attr.aria-label]="action.label" (click)="actionClick.emit(action.id); mobileClose.emit()">
20094
+ <jv-icon [name]="action.icon" [size]="18" />
20095
+ </button>
20096
+ }
20097
+ </div>
20098
+ </div>
20099
+ </div>
20100
+ </aside>
20101
+ `, styles: [".jv-sidebar-backdrop{display:none}.jv-sidebar{display:grid;grid-template-rows:auto 1fr auto;gap:var(--jv-spacing-lg);width:280px;min-width:280px;height:100vh;padding:var(--jv-spacing-lg);overflow-y:auto;border-right:1px solid var(--jv-color-border);background:var(--jv-color-surface);scrollbar-width:none;-ms-overflow-style:none}.jv-sidebar::-webkit-scrollbar{width:0;height:0;display:none}.jv-sidebar.is-collapsed{width:96px;min-width:96px;padding-inline:var(--jv-spacing-md)}.jv-sidebar-footer{display:grid;gap:var(--jv-spacing-md)}.jv-sidebar-mobile-extras{display:none}.jv-sidebar-brand,.jv-sidebar-link,.jv-sidebar-toggle{display:flex;align-items:center;gap:var(--jv-spacing-sm)}.brand-mark{display:inline-grid;place-items:center;width:2.5rem;height:2.5rem;border-radius:var(--jv-radius-md);background:color-mix(in srgb,var(--jv-color-primary) 16%,var(--jv-color-surface));color:var(--jv-color-primary)}.brand-copy{display:grid;gap:.1rem}.brand-copy span{color:var(--jv-color-foreground-muted);font-size:.875rem}.jv-sidebar-item{display:grid;gap:var(--jv-spacing-xs);list-style:none}.jv-sidebar-list{display:grid;gap:var(--jv-spacing-xs);margin:0;padding:0}.jv-sidebar-nav{display:grid;gap:var(--jv-spacing-xs);align-content:start}.jv-sidebar-link,.jv-sidebar-child-link,.jv-sidebar-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;min-height:var(--jv-density-control-height);padding:0 var(--jv-spacing-md);border:1px solid transparent;border-radius:var(--jv-radius-md);background:transparent;color:var(--jv-color-foreground-muted);text-decoration:none;cursor:pointer}.jv-sidebar-link-main{display:inline-flex;align-items:center;gap:var(--jv-spacing-sm)}.jv-sidebar-link:hover,.jv-sidebar-child-link:hover,.jv-sidebar-toggle:hover{background:var(--jv-color-surface-muted);color:var(--jv-color-foreground)}.jv-sidebar-link.is-active,.jv-sidebar-child-link.is-active{border-color:color-mix(in srgb,var(--jv-color-primary) 25%,var(--jv-color-border));background:color-mix(in srgb,var(--jv-color-primary) 12%,var(--jv-color-surface));color:var(--jv-color-foreground)}.jv-sidebar-children{display:grid;gap:var(--jv-spacing-xs);margin-left:var(--jv-spacing-xl);padding-left:var(--jv-spacing-sm);border-left:1px solid var(--jv-color-border)}.jv-sidebar-child-link{display:flex;align-items:center;min-height:2.25rem;font-size:.9rem}.jv-sidebar-toggle{width:100%;background:var(--jv-color-surface-muted);cursor:pointer}@media(max-width:900px){.jv-sidebar-backdrop{display:block;position:fixed;inset:0;z-index:99;background:#0006}.jv-sidebar{position:fixed;top:0;left:0;z-index:100;width:280px;min-width:280px;height:100vh;border-right:1px solid var(--jv-color-border);border-bottom:none;box-shadow:var(--jv-shadow-lg);transform:translate(-100%);visibility:hidden;transition:transform .24s cubic-bezier(.4,0,.2,1),visibility .24s}.jv-sidebar.is-mobile-open{transform:translate(0);visibility:visible}.jv-sidebar.is-collapsed{width:280px;min-width:280px}.jv-sidebar-mobile-extras{display:flex;flex-direction:column;gap:var(--jv-spacing-md);padding-top:var(--jv-spacing-md);border-top:1px solid var(--jv-color-border)}.jv-sidebar-mobile-extras .theme-group{display:flex;flex-wrap:wrap;gap:var(--jv-spacing-xs)}.jv-sidebar-mobile-extras .theme-pill{display:inline-flex;align-items:center;gap:var(--jv-spacing-xs);min-height:var(--jv-density-control-height);padding:0 var(--jv-spacing-md);border:1px solid var(--jv-color-border);border-radius:999px;background:var(--jv-color-surface-muted);color:var(--jv-color-foreground);cursor:pointer;font:inherit}.jv-sidebar-mobile-extras .theme-pill.is-active{border-color:var(--jv-color-primary);background:color-mix(in srgb,var(--jv-color-primary) 14%,var(--jv-color-surface))}.jv-sidebar-mobile-extras .mobile-actions{display:flex;gap:var(--jv-spacing-sm)}.jv-sidebar-mobile-extras .icon-button{display:inline-grid;place-items:center;width:var(--jv-density-control-height);height:var(--jv-density-control-height);border:1px solid var(--jv-color-border);border-radius:999px;background:var(--jv-color-surface-muted);color:var(--jv-color-foreground);cursor:pointer}}\n"] }]
20102
+ }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], brandIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "brandIcon", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], mobileOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "mobileOpen", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], currentTheme: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentTheme", required: false }] }], themeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "themeOptions", required: false }] }], topbarActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "topbarActions", required: false }] }], showThemeSelector: [{ type: i0.Input, args: [{ isSignal: true, alias: "showThemeSelector", required: false }] }], collapseToggle: [{ type: i0.Output, args: ["collapseToggle"] }], mobileClose: [{ type: i0.Output, args: ["mobileClose"] }], themeChange: [{ type: i0.Output, args: ["themeChange"] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }] } });
20022
20103
 
20023
20104
  class JvTopbarComponent {
20024
20105
  title = input('', ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
@@ -20077,7 +20158,7 @@ class JvTopbarComponent {
20077
20158
  }
20078
20159
  </div>
20079
20160
  </header>
20080
- `, isInline: true, styles: [".jv-topbar{display:flex;align-items:center;justify-content:space-between;gap:var(--jv-spacing-md);padding:var(--jv-spacing-md) var(--jv-spacing-lg);border-bottom:1px solid var(--jv-color-border);background:var(--jv-color-surface)}.jv-topbar-start,.jv-topbar-end,.theme-group{display:flex;align-items:center;gap:var(--jv-spacing-sm)}.jv-topbar-end{flex-wrap:wrap;justify-content:flex-end}.title-block{display:grid;gap:.1rem}.title-block span{color:var(--jv-color-foreground-muted);font-size:.875rem}.icon-button,.theme-pill{border:1px solid var(--jv-color-border);background:var(--jv-color-surface-muted);color:var(--jv-color-foreground)}.icon-button{display:inline-grid;place-items:center;width:var(--jv-density-control-height);height:var(--jv-density-control-height);border-radius:999px}.theme-pill{display:inline-flex;align-items:center;gap:var(--jv-spacing-xs);min-height:var(--jv-density-control-height);padding:0 var(--jv-spacing-md);border-radius:999px}.theme-pill.is-active{border-color:var(--jv-color-primary);background:color-mix(in srgb,var(--jv-color-primary) 14%,var(--jv-color-surface))}@media(max-width:900px){.jv-topbar{align-items:flex-start;flex-direction:column}.jv-topbar-end{width:100%;justify-content:flex-start}.theme-group{flex-wrap:wrap}}\n"], dependencies: [{ kind: "component", type: JvIconComponent, selector: "jv-icon", inputs: ["name", "size", "strokeWidth", "decorative", "ariaLabel"] }] });
20161
+ `, isInline: true, styles: [".jv-topbar{display:flex;align-items:center;justify-content:space-between;gap:var(--jv-spacing-md);padding:var(--jv-spacing-md) var(--jv-spacing-lg);border-bottom:1px solid var(--jv-color-border);background:var(--jv-color-surface)}.jv-topbar-start,.jv-topbar-end,.theme-group{display:flex;align-items:center;gap:var(--jv-spacing-sm)}.jv-topbar-end{flex-wrap:wrap;justify-content:flex-end}.title-block{display:grid;gap:.1rem}.title-block span{color:var(--jv-color-foreground-muted);font-size:.875rem}.icon-button,.theme-pill{border:1px solid var(--jv-color-border);background:var(--jv-color-surface-muted);color:var(--jv-color-foreground)}.icon-button{display:inline-grid;place-items:center;width:var(--jv-density-control-height);height:var(--jv-density-control-height);border-radius:999px}.theme-pill{display:inline-flex;align-items:center;gap:var(--jv-spacing-xs);min-height:var(--jv-density-control-height);padding:0 var(--jv-spacing-md);border-radius:999px}.theme-pill.is-active{border-color:var(--jv-color-primary);background:color-mix(in srgb,var(--jv-color-primary) 14%,var(--jv-color-surface))}@media(max-width:900px){.jv-topbar{align-items:center;flex-direction:row;justify-content:flex-start}.jv-topbar-end{display:none}}\n"], dependencies: [{ kind: "component", type: JvIconComponent, selector: "jv-icon", inputs: ["name", "size", "strokeWidth", "decorative", "ariaLabel"] }] });
20081
20162
  }
20082
20163
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: JvTopbarComponent, decorators: [{
20083
20164
  type: Component,
@@ -20126,7 +20207,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
20126
20207
  }
20127
20208
  </div>
20128
20209
  </header>
20129
- `, styles: [".jv-topbar{display:flex;align-items:center;justify-content:space-between;gap:var(--jv-spacing-md);padding:var(--jv-spacing-md) var(--jv-spacing-lg);border-bottom:1px solid var(--jv-color-border);background:var(--jv-color-surface)}.jv-topbar-start,.jv-topbar-end,.theme-group{display:flex;align-items:center;gap:var(--jv-spacing-sm)}.jv-topbar-end{flex-wrap:wrap;justify-content:flex-end}.title-block{display:grid;gap:.1rem}.title-block span{color:var(--jv-color-foreground-muted);font-size:.875rem}.icon-button,.theme-pill{border:1px solid var(--jv-color-border);background:var(--jv-color-surface-muted);color:var(--jv-color-foreground)}.icon-button{display:inline-grid;place-items:center;width:var(--jv-density-control-height);height:var(--jv-density-control-height);border-radius:999px}.theme-pill{display:inline-flex;align-items:center;gap:var(--jv-spacing-xs);min-height:var(--jv-density-control-height);padding:0 var(--jv-spacing-md);border-radius:999px}.theme-pill.is-active{border-color:var(--jv-color-primary);background:color-mix(in srgb,var(--jv-color-primary) 14%,var(--jv-color-surface))}@media(max-width:900px){.jv-topbar{align-items:flex-start;flex-direction:column}.jv-topbar-end{width:100%;justify-content:flex-start}.theme-group{flex-wrap:wrap}}\n"] }]
20210
+ `, styles: [".jv-topbar{display:flex;align-items:center;justify-content:space-between;gap:var(--jv-spacing-md);padding:var(--jv-spacing-md) var(--jv-spacing-lg);border-bottom:1px solid var(--jv-color-border);background:var(--jv-color-surface)}.jv-topbar-start,.jv-topbar-end,.theme-group{display:flex;align-items:center;gap:var(--jv-spacing-sm)}.jv-topbar-end{flex-wrap:wrap;justify-content:flex-end}.title-block{display:grid;gap:.1rem}.title-block span{color:var(--jv-color-foreground-muted);font-size:.875rem}.icon-button,.theme-pill{border:1px solid var(--jv-color-border);background:var(--jv-color-surface-muted);color:var(--jv-color-foreground)}.icon-button{display:inline-grid;place-items:center;width:var(--jv-density-control-height);height:var(--jv-density-control-height);border-radius:999px}.theme-pill{display:inline-flex;align-items:center;gap:var(--jv-spacing-xs);min-height:var(--jv-density-control-height);padding:0 var(--jv-spacing-md);border-radius:999px}.theme-pill.is-active{border-color:var(--jv-color-primary);background:color-mix(in srgb,var(--jv-color-primary) 14%,var(--jv-color-surface))}@media(max-width:900px){.jv-topbar{align-items:center;flex-direction:row;justify-content:flex-start}.jv-topbar-end{display:none}}\n"] }]
20130
20211
  }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subtitle", required: false }] }], currentTheme: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentTheme", required: false }] }], themeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "themeOptions", required: false }] }], actions: [{ type: i0.Input, args: [{ isSignal: true, alias: "actions", required: false }] }], showThemeSelector: [{ type: i0.Input, args: [{ isSignal: true, alias: "showThemeSelector", required: false }] }], menuClick: [{ type: i0.Output, args: ["menuClick"] }], themeChange: [{ type: i0.Output, args: ["themeChange"] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }] } });
20131
20212
 
20132
20213
  class JvDashboardShellComponent {
@@ -20143,80 +20224,95 @@ class JvDashboardShellComponent {
20143
20224
  topbarActions = input([], ...(ngDevMode ? [{ debugName: "topbarActions" }] : /* istanbul ignore next */ []));
20144
20225
  showThemeSelector = input(true, ...(ngDevMode ? [{ debugName: "showThemeSelector" }] : /* istanbul ignore next */ []));
20145
20226
  menuClick = output();
20227
+ mobileClose = output();
20146
20228
  sidebarCollapseToggle = output();
20147
20229
  themeChange = output();
20148
20230
  topbarActionClick = output();
20149
20231
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: JvDashboardShellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
20150
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.17", type: JvDashboardShellComponent, isStandalone: true, selector: "jv-dashboard-shell", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, sidebarSubtitle: { classPropertyName: "sidebarSubtitle", publicName: "sidebarSubtitle", isSignal: true, isRequired: false, transformFunction: null }, brandIcon: { classPropertyName: "brandIcon", publicName: "brandIcon", isSignal: true, isRequired: false, transformFunction: null }, navItems: { classPropertyName: "navItems", publicName: "navItems", isSignal: true, isRequired: false, transformFunction: null }, sidebarCollapsed: { classPropertyName: "sidebarCollapsed", publicName: "sidebarCollapsed", isSignal: true, isRequired: false, transformFunction: null }, mobileSidebarOpen: { classPropertyName: "mobileSidebarOpen", publicName: "mobileSidebarOpen", isSignal: true, isRequired: false, transformFunction: null }, topbarTitle: { classPropertyName: "topbarTitle", publicName: "topbarTitle", isSignal: true, isRequired: false, transformFunction: null }, topbarSubtitle: { classPropertyName: "topbarSubtitle", publicName: "topbarSubtitle", isSignal: true, isRequired: false, transformFunction: null }, currentTheme: { classPropertyName: "currentTheme", publicName: "currentTheme", isSignal: true, isRequired: false, transformFunction: null }, themeOptions: { classPropertyName: "themeOptions", publicName: "themeOptions", isSignal: true, isRequired: false, transformFunction: null }, topbarActions: { classPropertyName: "topbarActions", publicName: "topbarActions", isSignal: true, isRequired: false, transformFunction: null }, showThemeSelector: { classPropertyName: "showThemeSelector", publicName: "showThemeSelector", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { menuClick: "menuClick", sidebarCollapseToggle: "sidebarCollapseToggle", themeChange: "themeChange", topbarActionClick: "topbarActionClick" }, ngImport: i0, template: `
20151
- <div class="jv-dashboard-shell" [class.is-sidebar-collapsed]="sidebarCollapsed()">
20152
- <jv-sidebar
20153
- [title]="title()"
20154
- [subtitle]="sidebarSubtitle()"
20155
- [brandIcon]="brandIcon()"
20156
- [items]="navItems()"
20157
- [collapsed]="sidebarCollapsed()"
20158
- [mobileOpen]="mobileSidebarOpen()"
20159
- (collapseToggle)="sidebarCollapseToggle.emit()"
20160
- />
20161
-
20162
- <div class="jv-dashboard-main">
20163
- <jv-topbar
20164
- [title]="topbarTitle()"
20165
- [subtitle]="topbarSubtitle()"
20166
- [currentTheme]="currentTheme()"
20167
- [themeOptions]="themeOptions()"
20168
- [actions]="topbarActions()"
20169
- [showThemeSelector]="showThemeSelector()"
20170
- (menuClick)="menuClick.emit()"
20171
- (themeChange)="themeChange.emit($event)"
20172
- (actionClick)="topbarActionClick.emit($event)"
20173
- >
20174
- <ng-content select="[topbar-actions]" topbar-actions></ng-content>
20175
- </jv-topbar>
20176
-
20177
- <main class="jv-dashboard-content">
20178
- <ng-content></ng-content>
20179
- </main>
20180
- </div>
20181
- </div>
20182
- `, isInline: true, styles: [":host{display:block;height:100dvh;overflow:hidden}.jv-dashboard-shell{display:grid;height:100%;grid-template-columns:auto 1fr;background:var(--jv-color-background);overflow:hidden}.jv-dashboard-main{display:grid;grid-template-rows:auto 1fr;min-width:0;min-height:0;overflow:hidden}.jv-dashboard-content{overflow:auto;min-width:0;min-height:0;padding:var(--jv-spacing-xl);scrollbar-width:none;-ms-overflow-style:none}.jv-dashboard-content::-webkit-scrollbar{width:0;height:0;display:none}@media(max-width:900px){.jv-dashboard-shell{grid-template-columns:1fr}.jv-dashboard-content{padding:var(--jv-spacing-lg)}}\n"], dependencies: [{ kind: "component", type: JvSidebarComponent, selector: "jv-sidebar", inputs: ["title", "subtitle", "brandIcon", "items", "collapsed", "mobileOpen", "ariaLabel"], outputs: ["collapseToggle"] }, { kind: "component", type: JvTopbarComponent, selector: "jv-topbar", inputs: ["title", "subtitle", "currentTheme", "themeOptions", "actions", "showThemeSelector"], outputs: ["menuClick", "themeChange", "actionClick"] }] });
20232
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.17", type: JvDashboardShellComponent, isStandalone: true, selector: "jv-dashboard-shell", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, sidebarSubtitle: { classPropertyName: "sidebarSubtitle", publicName: "sidebarSubtitle", isSignal: true, isRequired: false, transformFunction: null }, brandIcon: { classPropertyName: "brandIcon", publicName: "brandIcon", isSignal: true, isRequired: false, transformFunction: null }, navItems: { classPropertyName: "navItems", publicName: "navItems", isSignal: true, isRequired: false, transformFunction: null }, sidebarCollapsed: { classPropertyName: "sidebarCollapsed", publicName: "sidebarCollapsed", isSignal: true, isRequired: false, transformFunction: null }, mobileSidebarOpen: { classPropertyName: "mobileSidebarOpen", publicName: "mobileSidebarOpen", isSignal: true, isRequired: false, transformFunction: null }, topbarTitle: { classPropertyName: "topbarTitle", publicName: "topbarTitle", isSignal: true, isRequired: false, transformFunction: null }, topbarSubtitle: { classPropertyName: "topbarSubtitle", publicName: "topbarSubtitle", isSignal: true, isRequired: false, transformFunction: null }, currentTheme: { classPropertyName: "currentTheme", publicName: "currentTheme", isSignal: true, isRequired: false, transformFunction: null }, themeOptions: { classPropertyName: "themeOptions", publicName: "themeOptions", isSignal: true, isRequired: false, transformFunction: null }, topbarActions: { classPropertyName: "topbarActions", publicName: "topbarActions", isSignal: true, isRequired: false, transformFunction: null }, showThemeSelector: { classPropertyName: "showThemeSelector", publicName: "showThemeSelector", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { menuClick: "menuClick", mobileClose: "mobileClose", sidebarCollapseToggle: "sidebarCollapseToggle", themeChange: "themeChange", topbarActionClick: "topbarActionClick" }, ngImport: i0, template: `
20233
+ <div class="jv-dashboard-shell" [class.is-sidebar-collapsed]="sidebarCollapsed()">
20234
+ <jv-sidebar
20235
+ [title]="title()"
20236
+ [subtitle]="sidebarSubtitle()"
20237
+ [brandIcon]="brandIcon()"
20238
+ [items]="navItems()"
20239
+ [collapsed]="sidebarCollapsed()"
20240
+ [mobileOpen]="mobileSidebarOpen()"
20241
+ [currentTheme]="currentTheme()"
20242
+ [themeOptions]="themeOptions()"
20243
+ [topbarActions]="topbarActions()"
20244
+ [showThemeSelector]="showThemeSelector()"
20245
+ (collapseToggle)="sidebarCollapseToggle.emit()"
20246
+ (mobileClose)="mobileClose.emit()"
20247
+ (themeChange)="themeChange.emit($event)"
20248
+ (actionClick)="topbarActionClick.emit($event)"
20249
+ />
20250
+
20251
+ <div class="jv-dashboard-main">
20252
+ <jv-topbar
20253
+ [title]="topbarTitle()"
20254
+ [subtitle]="topbarSubtitle()"
20255
+ [currentTheme]="currentTheme()"
20256
+ [themeOptions]="themeOptions()"
20257
+ [actions]="topbarActions()"
20258
+ [showThemeSelector]="showThemeSelector()"
20259
+ (menuClick)="menuClick.emit()"
20260
+ (themeChange)="themeChange.emit($event)"
20261
+ (actionClick)="topbarActionClick.emit($event)"
20262
+ >
20263
+ <ng-content select="[topbar-actions]" topbar-actions></ng-content>
20264
+ </jv-topbar>
20265
+
20266
+ <main class="jv-dashboard-content">
20267
+ <ng-content></ng-content>
20268
+ </main>
20269
+ </div>
20270
+ </div>
20271
+ `, isInline: true, styles: [":host{display:block;height:100dvh;overflow:hidden}.jv-dashboard-shell{display:grid;height:100%;grid-template-columns:auto 1fr;background:var(--jv-color-background);overflow:hidden}.jv-dashboard-main{display:grid;grid-template-rows:auto 1fr;min-width:0;min-height:0;overflow:hidden}.jv-dashboard-content{overflow:auto;min-width:0;min-height:0;padding:var(--jv-spacing-xl);scrollbar-width:none;-ms-overflow-style:none}.jv-dashboard-content::-webkit-scrollbar{width:0;height:0;display:none}@media(max-width:900px){.jv-dashboard-shell{grid-template-columns:1fr}.jv-dashboard-content{padding:var(--jv-spacing-lg)}}\n"], dependencies: [{ kind: "component", type: JvSidebarComponent, selector: "jv-sidebar", inputs: ["title", "subtitle", "brandIcon", "items", "collapsed", "mobileOpen", "ariaLabel", "currentTheme", "themeOptions", "topbarActions", "showThemeSelector"], outputs: ["collapseToggle", "mobileClose", "themeChange", "actionClick"] }, { kind: "component", type: JvTopbarComponent, selector: "jv-topbar", inputs: ["title", "subtitle", "currentTheme", "themeOptions", "actions", "showThemeSelector"], outputs: ["menuClick", "themeChange", "actionClick"] }] });
20183
20272
  }
20184
20273
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: JvDashboardShellComponent, decorators: [{
20185
20274
  type: Component,
20186
- args: [{ selector: 'jv-dashboard-shell', standalone: true, imports: [JvSidebarComponent, JvTopbarComponent], template: `
20187
- <div class="jv-dashboard-shell" [class.is-sidebar-collapsed]="sidebarCollapsed()">
20188
- <jv-sidebar
20189
- [title]="title()"
20190
- [subtitle]="sidebarSubtitle()"
20191
- [brandIcon]="brandIcon()"
20192
- [items]="navItems()"
20193
- [collapsed]="sidebarCollapsed()"
20194
- [mobileOpen]="mobileSidebarOpen()"
20195
- (collapseToggle)="sidebarCollapseToggle.emit()"
20196
- />
20197
-
20198
- <div class="jv-dashboard-main">
20199
- <jv-topbar
20200
- [title]="topbarTitle()"
20201
- [subtitle]="topbarSubtitle()"
20202
- [currentTheme]="currentTheme()"
20203
- [themeOptions]="themeOptions()"
20204
- [actions]="topbarActions()"
20205
- [showThemeSelector]="showThemeSelector()"
20206
- (menuClick)="menuClick.emit()"
20207
- (themeChange)="themeChange.emit($event)"
20208
- (actionClick)="topbarActionClick.emit($event)"
20209
- >
20210
- <ng-content select="[topbar-actions]" topbar-actions></ng-content>
20211
- </jv-topbar>
20212
-
20213
- <main class="jv-dashboard-content">
20214
- <ng-content></ng-content>
20215
- </main>
20216
- </div>
20217
- </div>
20275
+ args: [{ selector: 'jv-dashboard-shell', standalone: true, imports: [JvSidebarComponent, JvTopbarComponent], template: `
20276
+ <div class="jv-dashboard-shell" [class.is-sidebar-collapsed]="sidebarCollapsed()">
20277
+ <jv-sidebar
20278
+ [title]="title()"
20279
+ [subtitle]="sidebarSubtitle()"
20280
+ [brandIcon]="brandIcon()"
20281
+ [items]="navItems()"
20282
+ [collapsed]="sidebarCollapsed()"
20283
+ [mobileOpen]="mobileSidebarOpen()"
20284
+ [currentTheme]="currentTheme()"
20285
+ [themeOptions]="themeOptions()"
20286
+ [topbarActions]="topbarActions()"
20287
+ [showThemeSelector]="showThemeSelector()"
20288
+ (collapseToggle)="sidebarCollapseToggle.emit()"
20289
+ (mobileClose)="mobileClose.emit()"
20290
+ (themeChange)="themeChange.emit($event)"
20291
+ (actionClick)="topbarActionClick.emit($event)"
20292
+ />
20293
+
20294
+ <div class="jv-dashboard-main">
20295
+ <jv-topbar
20296
+ [title]="topbarTitle()"
20297
+ [subtitle]="topbarSubtitle()"
20298
+ [currentTheme]="currentTheme()"
20299
+ [themeOptions]="themeOptions()"
20300
+ [actions]="topbarActions()"
20301
+ [showThemeSelector]="showThemeSelector()"
20302
+ (menuClick)="menuClick.emit()"
20303
+ (themeChange)="themeChange.emit($event)"
20304
+ (actionClick)="topbarActionClick.emit($event)"
20305
+ >
20306
+ <ng-content select="[topbar-actions]" topbar-actions></ng-content>
20307
+ </jv-topbar>
20308
+
20309
+ <main class="jv-dashboard-content">
20310
+ <ng-content></ng-content>
20311
+ </main>
20312
+ </div>
20313
+ </div>
20218
20314
  `, styles: [":host{display:block;height:100dvh;overflow:hidden}.jv-dashboard-shell{display:grid;height:100%;grid-template-columns:auto 1fr;background:var(--jv-color-background);overflow:hidden}.jv-dashboard-main{display:grid;grid-template-rows:auto 1fr;min-width:0;min-height:0;overflow:hidden}.jv-dashboard-content{overflow:auto;min-width:0;min-height:0;padding:var(--jv-spacing-xl);scrollbar-width:none;-ms-overflow-style:none}.jv-dashboard-content::-webkit-scrollbar{width:0;height:0;display:none}@media(max-width:900px){.jv-dashboard-shell{grid-template-columns:1fr}.jv-dashboard-content{padding:var(--jv-spacing-lg)}}\n"] }]
20219
- }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], sidebarSubtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "sidebarSubtitle", required: false }] }], brandIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "brandIcon", required: false }] }], navItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "navItems", required: false }] }], sidebarCollapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "sidebarCollapsed", required: false }] }], mobileSidebarOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "mobileSidebarOpen", required: false }] }], topbarTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "topbarTitle", required: false }] }], topbarSubtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "topbarSubtitle", required: false }] }], currentTheme: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentTheme", required: false }] }], themeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "themeOptions", required: false }] }], topbarActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "topbarActions", required: false }] }], showThemeSelector: [{ type: i0.Input, args: [{ isSignal: true, alias: "showThemeSelector", required: false }] }], menuClick: [{ type: i0.Output, args: ["menuClick"] }], sidebarCollapseToggle: [{ type: i0.Output, args: ["sidebarCollapseToggle"] }], themeChange: [{ type: i0.Output, args: ["themeChange"] }], topbarActionClick: [{ type: i0.Output, args: ["topbarActionClick"] }] } });
20315
+ }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], sidebarSubtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "sidebarSubtitle", required: false }] }], brandIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "brandIcon", required: false }] }], navItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "navItems", required: false }] }], sidebarCollapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "sidebarCollapsed", required: false }] }], mobileSidebarOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "mobileSidebarOpen", required: false }] }], topbarTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "topbarTitle", required: false }] }], topbarSubtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "topbarSubtitle", required: false }] }], currentTheme: [{ type: i0.Input, args: [{ isSignal: true, alias: "currentTheme", required: false }] }], themeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "themeOptions", required: false }] }], topbarActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "topbarActions", required: false }] }], showThemeSelector: [{ type: i0.Input, args: [{ isSignal: true, alias: "showThemeSelector", required: false }] }], menuClick: [{ type: i0.Output, args: ["menuClick"] }], mobileClose: [{ type: i0.Output, args: ["mobileClose"] }], sidebarCollapseToggle: [{ type: i0.Output, args: ["sidebarCollapseToggle"] }], themeChange: [{ type: i0.Output, args: ["themeChange"] }], topbarActionClick: [{ type: i0.Output, args: ["topbarActionClick"] }] } });
20220
20316
 
20221
20317
  class JvPageComponent {
20222
20318
  eyebrow = input('', ...(ngDevMode ? [{ debugName: "eyebrow" }] : /* istanbul ignore next */ []));