@devjuliovilla/jv-ui 1.6.0 → 1.6.2

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.
@@ -19735,6 +19735,7 @@ class JvSidebarComponent {
19735
19735
  mobileOpen = input(false, ...(ngDevMode ? [{ debugName: "mobileOpen" }] : /* istanbul ignore next */ []));
19736
19736
  ariaLabel = input('Sidebar navigation', ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
19737
19737
  collapseToggle = output();
19738
+ mobileClose = output();
19738
19739
  activeChildParentIds = computed(() => {
19739
19740
  const url = this.router.url;
19740
19741
  const ids = new Set();
@@ -19777,248 +19778,266 @@ class JvSidebarComponent {
19777
19778
  target?.scrollIntoView({ block: 'start', behavior: 'smooth' });
19778
19779
  }
19779
19780
  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"] }] });
19781
+ 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", mobileClose: "mobileClose" }, ngImport: i0, template: `
19782
+ @if (mobileOpen()) {
19783
+ <div class="jv-sidebar-backdrop" (click)="mobileClose.emit()"></div>
19784
+ }
19785
+
19786
+ <aside
19787
+ class="jv-sidebar"
19788
+ [class.is-collapsed]="collapsed()"
19789
+ [class.is-mobile-open]="mobileOpen()"
19790
+ >
19791
+ <div class="jv-sidebar-brand">
19792
+ <div class="brand-mark">
19793
+ <jv-icon [name]="brandIcon()" [size]="18" />
19794
+ </div>
19795
+
19796
+ @if (!collapsed()) {
19797
+ <div class="brand-copy">
19798
+ <strong>{{ title() }}</strong>
19799
+ @if (subtitle()) {
19800
+ <span>{{ subtitle() }}</span>
19801
+ }
19802
+ </div>
19803
+ }
19804
+ </div>
19805
+
19806
+ <nav class="jv-sidebar-nav" [attr.aria-label]="ariaLabel()">
19807
+ <ul class="jv-sidebar-list">
19808
+ @for (item of normalizedItems(); track item.id) {
19809
+ <li class="jv-sidebar-item">
19810
+ @if (item.children.length > 0) {
19811
+ <button
19812
+ type="button"
19813
+ class="jv-sidebar-link"
19814
+ [class.is-active]="item.active"
19815
+ [attr.aria-label]="item.label"
19816
+ [attr.aria-expanded]="isExpanded(item.id) ? 'true' : 'false'"
19817
+ [attr.aria-controls]="'jv-sidebar-section-' + item.id"
19818
+ [attr.title]="item.label"
19819
+ (click)="toggleSection(item.id)"
19820
+ >
19821
+ <span class="jv-sidebar-link-main">
19822
+ @if (item.icon) {
19823
+ <jv-icon [name]="item.icon" [size]="18" />
19824
+ }
19825
+
19826
+ @if (!collapsed()) {
19827
+ <span>{{ item.label }}</span>
19828
+ }
19829
+ </span>
19830
+
19831
+ @if (!collapsed()) {
19832
+ <jv-icon [name]="isExpanded(item.id) ? 'chevron-up' : 'chevron-down'" [size]="16" />
19833
+ }
19834
+ </button>
19835
+ } @else {
19836
+ @if (isHashLink(item.href)) {
19837
+ <button
19838
+ type="button"
19839
+ class="jv-sidebar-link"
19840
+ [class.is-active]="item.active"
19841
+ [attr.aria-label]="item.label"
19842
+ [attr.aria-current]="item.active ? 'page' : null"
19843
+ [attr.title]="item.label"
19844
+ (click)="navigateTo(item.href); mobileClose.emit()"
19845
+ >
19846
+ <span class="jv-sidebar-link-main">
19847
+ @if (item.icon) {
19848
+ <jv-icon [name]="item.icon" [size]="18" />
19849
+ }
19850
+
19851
+ @if (!collapsed()) {
19852
+ <span>{{ item.label }}</span>
19853
+ }
19854
+ </span>
19855
+ </button>
19856
+ } @else {
19857
+ <a
19858
+ class="jv-sidebar-link"
19859
+ [class.is-active]="item.active"
19860
+ [attr.aria-label]="item.label"
19861
+ [attr.aria-current]="item.active ? 'page' : null"
19862
+ [routerLink]="item.href"
19863
+ [attr.title]="item.label"
19864
+ (click)="mobileClose.emit()"
19865
+ >
19866
+ <span class="jv-sidebar-link-main">
19867
+ @if (item.icon) {
19868
+ <jv-icon [name]="item.icon" [size]="18" />
19869
+ }
19870
+
19871
+ @if (!collapsed()) {
19872
+ <span>{{ item.label }}</span>
19873
+ }
19874
+ </span>
19875
+ </a>
19876
+ }
19877
+ }
19878
+
19879
+ @if (!collapsed() && item.children.length > 0 && isExpanded(item.id)) {
19880
+ <div class="jv-sidebar-children" [id]="'jv-sidebar-section-' + item.id">
19881
+ @for (child of item.children; track child.id) {
19882
+ @if (isHashLink(child.href)) {
19883
+ <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)">
19884
+ {{ child.label }}
19885
+ </button>
19886
+ } @else {
19887
+ <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()">
19888
+ {{ child.label }}
19889
+ </a>
19890
+ }
19891
+ }
19892
+ </div>
19893
+ }
19894
+ </li>
19895
+ }
19896
+ </ul>
19897
+ </nav>
19898
+
19899
+ <div class="jv-sidebar-footer">
19900
+ <button type="button" class="jv-sidebar-toggle" (click)="collapseToggle.emit()">
19901
+ <jv-icon [name]="collapsed() ? 'menu' : 'panel-left-close'" [size]="18" />
19902
+ @if (!collapsed()) {
19903
+ <span>Collapse</span>
19904
+ }
19905
+ </button>
19906
+ </div>
19907
+ </aside>
19908
+ `, 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-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}}\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
19909
  }
19900
19910
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: JvSidebarComponent, decorators: [{
19901
19911
  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"] }] } });
19912
+ args: [{ selector: 'jv-sidebar', standalone: true, imports: [JvIconComponent, RouterLink], template: `
19913
+ @if (mobileOpen()) {
19914
+ <div class="jv-sidebar-backdrop" (click)="mobileClose.emit()"></div>
19915
+ }
19916
+
19917
+ <aside
19918
+ class="jv-sidebar"
19919
+ [class.is-collapsed]="collapsed()"
19920
+ [class.is-mobile-open]="mobileOpen()"
19921
+ >
19922
+ <div class="jv-sidebar-brand">
19923
+ <div class="brand-mark">
19924
+ <jv-icon [name]="brandIcon()" [size]="18" />
19925
+ </div>
19926
+
19927
+ @if (!collapsed()) {
19928
+ <div class="brand-copy">
19929
+ <strong>{{ title() }}</strong>
19930
+ @if (subtitle()) {
19931
+ <span>{{ subtitle() }}</span>
19932
+ }
19933
+ </div>
19934
+ }
19935
+ </div>
19936
+
19937
+ <nav class="jv-sidebar-nav" [attr.aria-label]="ariaLabel()">
19938
+ <ul class="jv-sidebar-list">
19939
+ @for (item of normalizedItems(); track item.id) {
19940
+ <li class="jv-sidebar-item">
19941
+ @if (item.children.length > 0) {
19942
+ <button
19943
+ type="button"
19944
+ class="jv-sidebar-link"
19945
+ [class.is-active]="item.active"
19946
+ [attr.aria-label]="item.label"
19947
+ [attr.aria-expanded]="isExpanded(item.id) ? 'true' : 'false'"
19948
+ [attr.aria-controls]="'jv-sidebar-section-' + item.id"
19949
+ [attr.title]="item.label"
19950
+ (click)="toggleSection(item.id)"
19951
+ >
19952
+ <span class="jv-sidebar-link-main">
19953
+ @if (item.icon) {
19954
+ <jv-icon [name]="item.icon" [size]="18" />
19955
+ }
19956
+
19957
+ @if (!collapsed()) {
19958
+ <span>{{ item.label }}</span>
19959
+ }
19960
+ </span>
19961
+
19962
+ @if (!collapsed()) {
19963
+ <jv-icon [name]="isExpanded(item.id) ? 'chevron-up' : 'chevron-down'" [size]="16" />
19964
+ }
19965
+ </button>
19966
+ } @else {
19967
+ @if (isHashLink(item.href)) {
19968
+ <button
19969
+ type="button"
19970
+ class="jv-sidebar-link"
19971
+ [class.is-active]="item.active"
19972
+ [attr.aria-label]="item.label"
19973
+ [attr.aria-current]="item.active ? 'page' : null"
19974
+ [attr.title]="item.label"
19975
+ (click)="navigateTo(item.href); mobileClose.emit()"
19976
+ >
19977
+ <span class="jv-sidebar-link-main">
19978
+ @if (item.icon) {
19979
+ <jv-icon [name]="item.icon" [size]="18" />
19980
+ }
19981
+
19982
+ @if (!collapsed()) {
19983
+ <span>{{ item.label }}</span>
19984
+ }
19985
+ </span>
19986
+ </button>
19987
+ } @else {
19988
+ <a
19989
+ class="jv-sidebar-link"
19990
+ [class.is-active]="item.active"
19991
+ [attr.aria-label]="item.label"
19992
+ [attr.aria-current]="item.active ? 'page' : null"
19993
+ [routerLink]="item.href"
19994
+ [attr.title]="item.label"
19995
+ (click)="mobileClose.emit()"
19996
+ >
19997
+ <span class="jv-sidebar-link-main">
19998
+ @if (item.icon) {
19999
+ <jv-icon [name]="item.icon" [size]="18" />
20000
+ }
20001
+
20002
+ @if (!collapsed()) {
20003
+ <span>{{ item.label }}</span>
20004
+ }
20005
+ </span>
20006
+ </a>
20007
+ }
20008
+ }
20009
+
20010
+ @if (!collapsed() && item.children.length > 0 && isExpanded(item.id)) {
20011
+ <div class="jv-sidebar-children" [id]="'jv-sidebar-section-' + item.id">
20012
+ @for (child of item.children; track child.id) {
20013
+ @if (isHashLink(child.href)) {
20014
+ <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)">
20015
+ {{ child.label }}
20016
+ </button>
20017
+ } @else {
20018
+ <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()">
20019
+ {{ child.label }}
20020
+ </a>
20021
+ }
20022
+ }
20023
+ </div>
20024
+ }
20025
+ </li>
20026
+ }
20027
+ </ul>
20028
+ </nav>
20029
+
20030
+ <div class="jv-sidebar-footer">
20031
+ <button type="button" class="jv-sidebar-toggle" (click)="collapseToggle.emit()">
20032
+ <jv-icon [name]="collapsed() ? 'menu' : 'panel-left-close'" [size]="18" />
20033
+ @if (!collapsed()) {
20034
+ <span>Collapse</span>
20035
+ }
20036
+ </button>
20037
+ </div>
20038
+ </aside>
20039
+ `, 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-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}}\n"] }]
20040
+ }], 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"] }], mobileClose: [{ type: i0.Output, args: ["mobileClose"] }] } });
20022
20041
 
20023
20042
  class JvTopbarComponent {
20024
20043
  title = input('', ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
@@ -20143,11 +20162,12 @@ class JvDashboardShellComponent {
20143
20162
  topbarActions = input([], ...(ngDevMode ? [{ debugName: "topbarActions" }] : /* istanbul ignore next */ []));
20144
20163
  showThemeSelector = input(true, ...(ngDevMode ? [{ debugName: "showThemeSelector" }] : /* istanbul ignore next */ []));
20145
20164
  menuClick = output();
20165
+ mobileClose = output();
20146
20166
  sidebarCollapseToggle = output();
20147
20167
  themeChange = output();
20148
20168
  topbarActionClick = output();
20149
20169
  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: `
20170
+ 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: `
20151
20171
  <div class="jv-dashboard-shell" [class.is-sidebar-collapsed]="sidebarCollapsed()">
20152
20172
  <jv-sidebar
20153
20173
  [title]="title()"
@@ -20157,6 +20177,7 @@ class JvDashboardShellComponent {
20157
20177
  [collapsed]="sidebarCollapsed()"
20158
20178
  [mobileOpen]="mobileSidebarOpen()"
20159
20179
  (collapseToggle)="sidebarCollapseToggle.emit()"
20180
+ (mobileClose)="mobileClose.emit()"
20160
20181
  />
20161
20182
 
20162
20183
  <div class="jv-dashboard-main">
@@ -20179,7 +20200,7 @@ class JvDashboardShellComponent {
20179
20200
  </main>
20180
20201
  </div>
20181
20202
  </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"] }] });
20203
+ `, 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", "mobileClose"] }, { kind: "component", type: JvTopbarComponent, selector: "jv-topbar", inputs: ["title", "subtitle", "currentTheme", "themeOptions", "actions", "showThemeSelector"], outputs: ["menuClick", "themeChange", "actionClick"] }] });
20183
20204
  }
20184
20205
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: JvDashboardShellComponent, decorators: [{
20185
20206
  type: Component,
@@ -20193,6 +20214,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
20193
20214
  [collapsed]="sidebarCollapsed()"
20194
20215
  [mobileOpen]="mobileSidebarOpen()"
20195
20216
  (collapseToggle)="sidebarCollapseToggle.emit()"
20217
+ (mobileClose)="mobileClose.emit()"
20196
20218
  />
20197
20219
 
20198
20220
  <div class="jv-dashboard-main">
@@ -20216,7 +20238,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
20216
20238
  </div>
20217
20239
  </div>
20218
20240
  `, 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"] }] } });
20241
+ }], 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
20242
 
20221
20243
  class JvPageComponent {
20222
20244
  eyebrow = input('', ...(ngDevMode ? [{ debugName: "eyebrow" }] : /* istanbul ignore next */ []));
@@ -20292,29 +20314,29 @@ class JvListComponent {
20292
20314
  return v ? `jv-list--${v}` : '';
20293
20315
  }, ...(ngDevMode ? [{ debugName: "variantClass" }] : /* istanbul ignore next */ []));
20294
20316
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: JvListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
20295
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.17", type: JvListComponent, isStandalone: true, selector: "jv-list", inputs: { role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
20296
- <ul
20297
- class="jv-list"
20298
- [class]="variantClass()"
20299
- [attr.role]="role() === 'navigation' ? 'list' : null"
20300
- [attr.aria-label]="ariaLabel()"
20301
- >
20302
- <ng-content />
20303
- </ul>
20304
- `, isInline: true, styles: [".jv-list{display:block;list-style:none;margin:0;padding:0}.jv-list--bordered{border:1px solid var(--jv-color-border);border-radius:var(--jv-radius-md)}.jv-list--bordered>:not(:last-child){border-bottom:1px solid var(--jv-color-border)}\n"] });
20317
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.17", type: JvListComponent, isStandalone: true, selector: "jv-list", inputs: { role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
20318
+ <ul
20319
+ class="jv-list"
20320
+ [class]="variantClass()"
20321
+ [attr.role]="role() === 'navigation' ? 'list' : null"
20322
+ [attr.aria-label]="ariaLabel()"
20323
+ >
20324
+ <ng-content />
20325
+ </ul>
20326
+ `, isInline: true, styles: [".jv-list{display:block;list-style:none;margin:0;padding:0}.jv-list>:not(:last-child){border-bottom:1px solid var(--jv-color-border)}.jv-list--bordered{border:1px solid var(--jv-color-border);border-radius:var(--jv-radius-md)}\n"] });
20305
20327
  }
20306
20328
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: JvListComponent, decorators: [{
20307
20329
  type: Component,
20308
- args: [{ selector: 'jv-list', standalone: true, template: `
20309
- <ul
20310
- class="jv-list"
20311
- [class]="variantClass()"
20312
- [attr.role]="role() === 'navigation' ? 'list' : null"
20313
- [attr.aria-label]="ariaLabel()"
20314
- >
20315
- <ng-content />
20316
- </ul>
20317
- `, styles: [".jv-list{display:block;list-style:none;margin:0;padding:0}.jv-list--bordered{border:1px solid var(--jv-color-border);border-radius:var(--jv-radius-md)}.jv-list--bordered>:not(:last-child){border-bottom:1px solid var(--jv-color-border)}\n"] }]
20330
+ args: [{ selector: 'jv-list', standalone: true, template: `
20331
+ <ul
20332
+ class="jv-list"
20333
+ [class]="variantClass()"
20334
+ [attr.role]="role() === 'navigation' ? 'list' : null"
20335
+ [attr.aria-label]="ariaLabel()"
20336
+ >
20337
+ <ng-content />
20338
+ </ul>
20339
+ `, styles: [".jv-list{display:block;list-style:none;margin:0;padding:0}.jv-list>:not(:last-child){border-bottom:1px solid var(--jv-color-border)}.jv-list--bordered{border:1px solid var(--jv-color-border);border-radius:var(--jv-radius-md)}\n"] }]
20318
20340
  }], propDecorators: { role: [{ type: i0.Input, args: [{ isSignal: true, alias: "role", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
20319
20341
 
20320
20342
  class JvListItemComponent {
@@ -20330,58 +20352,58 @@ class JvListItemComponent {
20330
20352
  }
20331
20353
  }
20332
20354
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: JvListItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
20333
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: JvListItemComponent, isStandalone: true, selector: "jv-list-item", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, leadingIcon: { classPropertyName: "leadingIcon", publicName: "leadingIcon", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activated: "activated" }, ngImport: i0, template: `
20334
- <li
20335
- class="jv-list-item"
20336
- [class.jv-list-item--disabled]="disabled()"
20337
- [class.jv-list-item--active]="active()"
20338
- tabindex="0"
20339
- role="listitem"
20340
- (click)="onActivate()"
20341
- (keydown.enter)="onActivate()"
20342
- (keydown.space)="onActivate(); $event.preventDefault()"
20343
- >
20344
- @if (leadingIcon()) {
20345
- <jv-icon [name]="leadingIcon()!" class="jv-list-item-leading" [size]="18" />
20346
- }
20347
- <div class="jv-list-item-text">
20348
- <span class="jv-list-item-title">{{ title() }}</span>
20349
- @if (description()) {
20350
- <span class="jv-list-item-description">{{ description() }}</span>
20351
- }
20352
- </div>
20353
- <div class="jv-list-item-meta">
20354
- <ng-content select="[meta]" />
20355
- </div>
20356
- </li>
20355
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: JvListItemComponent, isStandalone: true, selector: "jv-list-item", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, leadingIcon: { classPropertyName: "leadingIcon", publicName: "leadingIcon", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { activated: "activated" }, ngImport: i0, template: `
20356
+ <li
20357
+ class="jv-list-item"
20358
+ [class.jv-list-item--disabled]="disabled()"
20359
+ [class.jv-list-item--active]="active()"
20360
+ tabindex="0"
20361
+ role="listitem"
20362
+ (click)="onActivate()"
20363
+ (keydown.enter)="onActivate()"
20364
+ (keydown.space)="onActivate(); $event.preventDefault()"
20365
+ >
20366
+ @if (leadingIcon()) {
20367
+ <jv-icon [name]="leadingIcon()!" class="jv-list-item-leading" [size]="18" />
20368
+ }
20369
+ <div class="jv-list-item-text">
20370
+ <span class="jv-list-item-title">{{ title() }}</span>
20371
+ @if (description()) {
20372
+ <span class="jv-list-item-description">{{ description() }}</span>
20373
+ }
20374
+ </div>
20375
+ <div class="jv-list-item-meta">
20376
+ <ng-content select="[meta]" />
20377
+ </div>
20378
+ </li>
20357
20379
  `, isInline: true, styles: [":host{display:block}.jv-list-item{display:flex;align-items:center;gap:var(--jv-spacing-md);padding:var(--jv-spacing-md);background:var(--jv-color-surface);cursor:default;outline:none;transition:background-color .16s ease}.jv-list-item:hover{background:var(--jv-color-surface-muted)}.jv-list-item:focus-visible{outline:2px solid var(--jv-color-primary);outline-offset:-2px}.jv-list-item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.jv-list-item--active{background:color-mix(in srgb,var(--jv-color-primary) 10%,var(--jv-color-surface));border-left:3px solid var(--jv-color-primary);padding-left:calc(var(--jv-spacing-md) - 3px)}.jv-list-item-text{flex:1;display:flex;flex-direction:column;gap:.125rem;min-width:0}.jv-list-item-title{font-weight:600;font-size:var(--jv-density-font-size);color:var(--jv-color-foreground);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.jv-list-item-description{font-size:.85rem;color:var(--jv-color-foreground-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.jv-list-item-meta{display:flex;align-items:center;gap:var(--jv-spacing-sm);flex-shrink:0}.jv-list-item-leading{flex-shrink:0;color:var(--jv-color-foreground-muted)}\n"], dependencies: [{ kind: "component", type: JvIconComponent, selector: "jv-icon", inputs: ["name", "size", "strokeWidth", "decorative", "ariaLabel"] }] });
20358
20380
  }
20359
20381
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: JvListItemComponent, decorators: [{
20360
20382
  type: Component,
20361
- args: [{ selector: 'jv-list-item', standalone: true, imports: [JvIconComponent], template: `
20362
- <li
20363
- class="jv-list-item"
20364
- [class.jv-list-item--disabled]="disabled()"
20365
- [class.jv-list-item--active]="active()"
20366
- tabindex="0"
20367
- role="listitem"
20368
- (click)="onActivate()"
20369
- (keydown.enter)="onActivate()"
20370
- (keydown.space)="onActivate(); $event.preventDefault()"
20371
- >
20372
- @if (leadingIcon()) {
20373
- <jv-icon [name]="leadingIcon()!" class="jv-list-item-leading" [size]="18" />
20374
- }
20375
- <div class="jv-list-item-text">
20376
- <span class="jv-list-item-title">{{ title() }}</span>
20377
- @if (description()) {
20378
- <span class="jv-list-item-description">{{ description() }}</span>
20379
- }
20380
- </div>
20381
- <div class="jv-list-item-meta">
20382
- <ng-content select="[meta]" />
20383
- </div>
20384
- </li>
20383
+ args: [{ selector: 'jv-list-item', standalone: true, imports: [JvIconComponent], template: `
20384
+ <li
20385
+ class="jv-list-item"
20386
+ [class.jv-list-item--disabled]="disabled()"
20387
+ [class.jv-list-item--active]="active()"
20388
+ tabindex="0"
20389
+ role="listitem"
20390
+ (click)="onActivate()"
20391
+ (keydown.enter)="onActivate()"
20392
+ (keydown.space)="onActivate(); $event.preventDefault()"
20393
+ >
20394
+ @if (leadingIcon()) {
20395
+ <jv-icon [name]="leadingIcon()!" class="jv-list-item-leading" [size]="18" />
20396
+ }
20397
+ <div class="jv-list-item-text">
20398
+ <span class="jv-list-item-title">{{ title() }}</span>
20399
+ @if (description()) {
20400
+ <span class="jv-list-item-description">{{ description() }}</span>
20401
+ }
20402
+ </div>
20403
+ <div class="jv-list-item-meta">
20404
+ <ng-content select="[meta]" />
20405
+ </div>
20406
+ </li>
20385
20407
  `, styles: [":host{display:block}.jv-list-item{display:flex;align-items:center;gap:var(--jv-spacing-md);padding:var(--jv-spacing-md);background:var(--jv-color-surface);cursor:default;outline:none;transition:background-color .16s ease}.jv-list-item:hover{background:var(--jv-color-surface-muted)}.jv-list-item:focus-visible{outline:2px solid var(--jv-color-primary);outline-offset:-2px}.jv-list-item--disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.jv-list-item--active{background:color-mix(in srgb,var(--jv-color-primary) 10%,var(--jv-color-surface));border-left:3px solid var(--jv-color-primary);padding-left:calc(var(--jv-spacing-md) - 3px)}.jv-list-item-text{flex:1;display:flex;flex-direction:column;gap:.125rem;min-width:0}.jv-list-item-title{font-weight:600;font-size:var(--jv-density-font-size);color:var(--jv-color-foreground);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.jv-list-item-description{font-size:.85rem;color:var(--jv-color-foreground-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.jv-list-item-meta{display:flex;align-items:center;gap:var(--jv-spacing-sm);flex-shrink:0}.jv-list-item-leading{flex-shrink:0;color:var(--jv-color-foreground-muted)}\n"] }]
20386
20408
  }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], leadingIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "leadingIcon", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], activated: [{ type: i0.Output, args: ["activated"] }] } });
20387
20409