codexly-ui 0.6.11 → 0.6.12

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.
@@ -6,6 +6,12 @@
6
6
  /* ── Font body variable (overridden dynamically by ClxThemeService) ───────── */
7
7
  :root {
8
8
  --clx-font-body: 'DM Sans', ui-sans-serif, system-ui, sans-serif;
9
+
10
+ /* ── Font weight (overridden dynamically by ClxThemeService) ──
11
+ label: field labels, secondary text, idle nav, badges
12
+ emphasis: titles, selected/active state, standout values (prices, counters) */
13
+ --clx-font-weight-label: 500;
14
+ --clx-font-weight-emphasis: 600;
9
15
  }
10
16
 
11
17
  /* ── Light theme (default) ────────────────────────────────────────────────── */
@@ -378,6 +378,11 @@ const CLX_FONT_CATALOG = [
378
378
  googleUrl: 'https://fonts.googleapis.com/css2?family=Bungee&display=swap',
379
379
  },
380
380
  ];
381
+ const CLX_FONT_WEIGHT_MAP = {
382
+ light: { label: 400, emphasis: 500 },
383
+ normal: { label: 500, emphasis: 600 },
384
+ bold: { label: 600, emphasis: 700 },
385
+ };
381
386
  // ── Tailwind rounded classes per borderRadius token ───────────────────────────
382
387
  const CLX_RADIUS_MAP = {
383
388
  none: 'rounded-none',
@@ -417,6 +422,7 @@ const CLX_THEME_DEFAULTS = {
417
422
  defaultSize: 'md',
418
423
  defaultShape: 'rounded',
419
424
  fontFamily: 'DM Sans',
425
+ fontWeight: 'normal',
420
426
  };
421
427
  // ── Injection token ───────────────────────────────────────────────────────────
422
428
  const CLX_THEME_CONFIG = new InjectionToken('CLX_THEME_CONFIG', { factory: () => CLX_THEME_DEFAULTS });
@@ -545,12 +551,19 @@ class ClxThemeService {
545
551
  return false;
546
552
  return this._sysDark();
547
553
  }, ...(ngDevMode ? [{ debugName: "isDark" }] : /* istanbul ignore next */ []));
548
- /** Color to apply to clx-nav-group labels — falls back to neutralColor */
549
- sidebarGroupColor = computed(() => this._config().sidebarGroupColor ?? this._config().neutralColor, ...(ngDevMode ? [{ debugName: "sidebarGroupColor" }] : /* istanbul ignore next */ []));
550
- /** Color to apply to top-level clx-menu — falls back to primaryColor */
551
- sidebarMenuColor = computed(() => this._config().sidebarMenuColor ?? this._config().primaryColor, ...(ngDevMode ? [{ debugName: "sidebarMenuColor" }] : /* istanbul ignore next */ []));
552
- /** Color to apply to clx-menu-item — falls back to primaryColor */
553
- sidebarItemColor = computed(() => this._config().sidebarItemColor ?? this._config().primaryColor, ...(ngDevMode ? [{ debugName: "sidebarItemColor" }] : /* istanbul ignore next */ []));
554
+ /** Resolved style for clx-nav-group labels — falls back to neutralColor/xs/label */
555
+ sidebarGroupStyle = computed(() => this._resolveNavZoneStyle(this._config().sidebarGroup, this._config().neutralColor, 'xs', 'label'), ...(ngDevMode ? [{ debugName: "sidebarGroupStyle" }] : /* istanbul ignore next */ []));
556
+ /** Resolved style for top-level clx-menu — falls back to primaryColor/sm/emphasis */
557
+ sidebarMenuStyle = computed(() => this._resolveNavZoneStyle(this._config().sidebarMenu, this._config().primaryColor, 'sm', 'emphasis'), ...(ngDevMode ? [{ debugName: "sidebarMenuStyle" }] : /* istanbul ignore next */ []));
558
+ /** Resolved style for clx-menu-item — falls back to primaryColor/sm/label */
559
+ sidebarItemStyle = computed(() => this._resolveNavZoneStyle(this._config().sidebarItem, this._config().primaryColor, 'sm', 'label'), ...(ngDevMode ? [{ debugName: "sidebarItemStyle" }] : /* istanbul ignore next */ []));
560
+ _resolveNavZoneStyle(override, defaultColor, defaultSize, defaultWeight) {
561
+ return {
562
+ color: override?.color ?? defaultColor,
563
+ size: override?.size ?? defaultSize,
564
+ weight: override?.weight ?? defaultWeight,
565
+ };
566
+ }
554
567
  constructor() {
555
568
  effect(() => {
556
569
  if (!this._isBrowser)
@@ -570,6 +583,11 @@ class ClxThemeService {
570
583
  return;
571
584
  this._applyFont(this._config().fontFamily ?? 'Roboto');
572
585
  });
586
+ effect(() => {
587
+ if (!this._isBrowser)
588
+ return;
589
+ this._applyFontWeight(this._config().fontWeight ?? 'normal');
590
+ });
573
591
  if (this._isBrowser) {
574
592
  const mq = window.matchMedia('(prefers-color-scheme: dark)');
575
593
  mq.addEventListener('change', e => this._sysDark.set(e.matches));
@@ -622,6 +640,13 @@ class ClxThemeService {
622
640
  link.href = option.googleUrl;
623
641
  document.documentElement.style.setProperty('--clx-font-body', `'${family}', ui-sans-serif, system-ui, sans-serif`);
624
642
  }
643
+ _applyFontWeight(intensity) {
644
+ const pair = CLX_FONT_WEIGHT_MAP[intensity];
645
+ if (!pair)
646
+ return;
647
+ document.documentElement.style.setProperty('--clx-font-weight-label', String(pair.label));
648
+ document.documentElement.style.setProperty('--clx-font-weight-emphasis', String(pair.emphasis));
649
+ }
625
650
  _loadMode() {
626
651
  if (!this._isBrowser)
627
652
  return 'system';
@@ -9537,10 +9562,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
9537
9562
  }], propDecorators: { logo: [{ type: i0.Input, args: [{ isSignal: true, alias: "logo", required: true }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], description: [{ type: i0.Input, args: [{ isSignal: true, alias: "description", required: false }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }] } });
9538
9563
 
9539
9564
  // ── Item geometry ──────────────────────────────────────────────────────────────
9540
- const NAV_ITEM_BASE = 'flex items-center gap-3 w-full text-sm font-medium cursor-pointer select-none';
9565
+ const NAV_ITEM_BASE = 'flex items-center gap-3 w-full cursor-pointer select-none';
9541
9566
  const NAV_ITEM_L1 = 'px-6 py-3';
9542
9567
  const NAV_ITEM_L2 = 'pl-4 pr-3 py-2';
9543
9568
  const NAV_ITEM_IDLE = 'text-clx-text-subtle';
9569
+ // ── Nav zone size → Tailwind text-size class ─────────────────────────────────
9570
+ const NAV_ZONE_SIZE_CLASS = {
9571
+ xs: 'text-xs',
9572
+ sm: 'text-sm',
9573
+ md: 'text-base',
9574
+ };
9575
+ // ── Nav weight token → CSS var-backed arbitrary Tailwind class ───────────────
9576
+ const NAV_ZONE_WEIGHT_CLASS = {
9577
+ label: 'font-[var(--clx-font-weight-label)]',
9578
+ emphasis: 'font-[var(--clx-font-weight-emphasis)]',
9579
+ };
9580
+ /** Resolves a nav zone's configured size + idle weight (its base, theme-configured weight). */
9581
+ function resolveNavZoneIdle(style) {
9582
+ return `${NAV_ZONE_SIZE_CLASS[style.size]} ${NAV_ZONE_WEIGHT_CLASS[style.weight]}`;
9583
+ }
9584
+ /** Resolves a nav zone's configured size + the active/selected state's emphasis weight —
9585
+ * the selected item always reads one step heavier than its configured idle weight. */
9586
+ function resolveNavZoneActive(style) {
9587
+ return `${NAV_ZONE_SIZE_CLASS[style.size]} ${NAV_ZONE_WEIGHT_CLASS.emphasis}`;
9588
+ }
9544
9589
  // ── Children container ─────────────────────────────────────────────────────────
9545
9590
  const NAV_CHILDREN_WRAPPER = 'grid transition-[grid-template-rows] duration-300 ease-in-out';
9546
9591
  const NAV_CHILDREN_INNER = 'overflow-hidden';
@@ -9550,8 +9595,14 @@ class ClxMenuComponent {
9550
9595
  _themeSvc = inject(ClxThemeService);
9551
9596
  label = input.required(...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
9552
9597
  icon = input('', ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
9553
- color = input(undefined, ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
9554
- _color = computed(() => this.color() ?? this._themeSvc.sidebarMenuColor(), ...(ngDevMode ? [{ debugName: "_color" }] : /* istanbul ignore next */ []));
9598
+ /** Per-instance override any field left unset falls back to the theme's sidebarMenu style */
9599
+ style = input(undefined, ...(ngDevMode ? [{ debugName: "style" }] : /* istanbul ignore next */ []));
9600
+ _resolved = computed(() => {
9601
+ const base = this._themeSvc.sidebarMenuStyle();
9602
+ const o = this.style();
9603
+ return { color: o?.color ?? base.color, size: o?.size ?? base.size, weight: o?.weight ?? base.weight };
9604
+ }, ...(ngDevMode ? [{ debugName: "_resolved" }] : /* istanbul ignore next */ []));
9605
+ _color = computed(() => this._resolved().color, ...(ngDevMode ? [{ debugName: "_color" }] : /* istanbul ignore next */ []));
9555
9606
  collapsed = input(false, ...(ngDevMode ? [{ debugName: "collapsed" }] : /* istanbul ignore next */ []));
9556
9607
  active = input(false, ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
9557
9608
  routerLink = input('', ...(ngDevMode ? [{ debugName: "routerLink" }] : /* istanbul ignore next */ []));
@@ -9578,14 +9629,14 @@ class ClxMenuComponent {
9578
9629
  _iconCls = computed(() => resolveColor(this._color()).textSubtle, ...(ngDevMode ? [{ debugName: "_iconCls" }] : /* istanbul ignore next */ []));
9579
9630
  _buttonCls(isActive) {
9580
9631
  const geom = this.collapsed() ? 'w-full py-3 px-0 justify-center' : NAV_ITEM_L1;
9581
- const base = `${NAV_ITEM_BASE} ${geom}`;
9582
9632
  const t = resolveColor(this._color());
9583
9633
  if (isActive) {
9634
+ const base = `${NAV_ITEM_BASE} ${resolveNavZoneActive(this._resolved())} ${geom}`;
9584
9635
  if (this.collapsed())
9585
- return `${base} ${t.textSubtle} font-semibold`;
9586
- return `${base} ${t.textSubtle} font-semibold border-l-2 ${t.borderLight} !pl-[22px]`;
9636
+ return `${base} ${t.textSubtle}`;
9637
+ return `${base} ${t.textSubtle} border-l-2 ${t.borderLight} !pl-[22px]`;
9587
9638
  }
9588
- return `${base} ${t.hoverBgMuted}`;
9639
+ return `${NAV_ITEM_BASE} ${resolveNavZoneIdle(this._resolved())} ${geom} ${t.hoverBgMuted}`;
9589
9640
  }
9590
9641
  NAV_CHILDREN_WRAPPER = NAV_CHILDREN_WRAPPER;
9591
9642
  NAV_CHILDREN_INNER = NAV_CHILDREN_INNER;
@@ -9594,7 +9645,7 @@ class ClxMenuComponent {
9594
9645
  this._isExpanded.update(v => !v);
9595
9646
  }
9596
9647
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: ClxMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9597
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: ClxMenuComponent, isStandalone: true, selector: "clx-menu", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, routerLink: { classPropertyName: "routerLink", publicName: "routerLink", isSignal: true, isRequired: false, transformFunction: null }, routerLinkActiveOptions: { classPropertyName: "routerLinkActiveOptions", publicName: "routerLinkActiveOptions", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "block" }, viewQueries: [{ propertyName: "_rla", first: true, predicate: RouterLinkActive, descendants: true }], ngImport: i0, template: `
9648
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: ClxMenuComponent, isStandalone: true, selector: "clx-menu", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, routerLink: { classPropertyName: "routerLink", publicName: "routerLink", isSignal: true, isRequired: false, transformFunction: null }, routerLinkActiveOptions: { classPropertyName: "routerLinkActiveOptions", publicName: "routerLinkActiveOptions", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "block" }, viewQueries: [{ propertyName: "_rla", first: true, predicate: RouterLinkActive, descendants: true }], ngImport: i0, template: `
9598
9649
  @if (routerLink()) {
9599
9650
  <a
9600
9651
  [routerLink]="routerLink()"
@@ -9717,7 +9768,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
9717
9768
  changeDetection: ChangeDetectionStrategy.OnPush,
9718
9769
  host: { class: 'block' },
9719
9770
  }]
9720
- }], ctorParameters: () => [], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], routerLink: [{ type: i0.Input, args: [{ isSignal: true, alias: "routerLink", required: false }] }], routerLinkActiveOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "routerLinkActiveOptions", required: false }] }], _rla: [{
9771
+ }], ctorParameters: () => [], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], routerLink: [{ type: i0.Input, args: [{ isSignal: true, alias: "routerLink", required: false }] }], routerLinkActiveOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "routerLinkActiveOptions", required: false }] }], _rla: [{
9721
9772
  type: ViewChild,
9722
9773
  args: [RouterLinkActive]
9723
9774
  }] } });
@@ -9727,32 +9778,38 @@ class ClxMenuItemComponent {
9727
9778
  label = input.required(...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
9728
9779
  icon = input('', ...(ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []));
9729
9780
  active = input(false, ...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
9730
- color = input(undefined, ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
9781
+ /** Per-instance override any field left unset falls back to the theme's sidebarItem style */
9782
+ style = input(undefined, ...(ngDevMode ? [{ debugName: "style" }] : /* istanbul ignore next */ []));
9731
9783
  nested = input(false, ...(ngDevMode ? [{ debugName: "nested" }] : /* istanbul ignore next */ []));
9732
9784
  collapsed = input(false, ...(ngDevMode ? [{ debugName: "collapsed" }] : /* istanbul ignore next */ []));
9733
9785
  routerLink = input('', ...(ngDevMode ? [{ debugName: "routerLink" }] : /* istanbul ignore next */ []));
9734
9786
  routerLinkActiveOptions = input({ exact: false }, ...(ngDevMode ? [{ debugName: "routerLinkActiveOptions" }] : /* istanbul ignore next */ []));
9735
9787
  itemClick = output();
9736
- _resolvedColor = computed(() => this.color() ?? this._themeSvc.sidebarItemColor(), ...(ngDevMode ? [{ debugName: "_resolvedColor" }] : /* istanbul ignore next */ []));
9788
+ _resolved = computed(() => {
9789
+ const base = this._themeSvc.sidebarItemStyle();
9790
+ const o = this.style();
9791
+ return { color: o?.color ?? base.color, size: o?.size ?? base.size, weight: o?.weight ?? base.weight };
9792
+ }, ...(ngDevMode ? [{ debugName: "_resolved" }] : /* istanbul ignore next */ []));
9737
9793
  _geom = computed(() => {
9738
9794
  if (this.collapsed())
9739
9795
  return 'w-full py-3 px-0 justify-center';
9740
9796
  return this.nested() ? NAV_ITEM_L2 : NAV_ITEM_L1;
9741
9797
  }, ...(ngDevMode ? [{ debugName: "_geom" }] : /* istanbul ignore next */ []));
9742
- _iconCls = computed(() => resolveColor(this._resolvedColor()).textSubtle, ...(ngDevMode ? [{ debugName: "_iconCls" }] : /* istanbul ignore next */ []));
9798
+ _iconCls = computed(() => resolveColor(this._resolved().color).textSubtle, ...(ngDevMode ? [{ debugName: "_iconCls" }] : /* istanbul ignore next */ []));
9743
9799
  _idleCls = computed(() => {
9744
- const hover = resolveColor(this._resolvedColor()).hoverBgMuted;
9745
- return `${NAV_ITEM_BASE} ${this._geom()} ${hover}`;
9800
+ const hover = resolveColor(this._resolved().color).hoverBgMuted;
9801
+ return `${NAV_ITEM_BASE} ${resolveNavZoneIdle(this._resolved())} ${this._geom()} ${hover}`;
9746
9802
  }, ...(ngDevMode ? [{ debugName: "_idleCls" }] : /* istanbul ignore next */ []));
9747
9803
  _activeCls = computed(() => {
9748
- const t = resolveColor(this._resolvedColor());
9804
+ const t = resolveColor(this._resolved().color);
9805
+ const typography = resolveNavZoneActive(this._resolved());
9749
9806
  if (this.collapsed()) {
9750
- return `${NAV_ITEM_BASE} ${this._geom()} ${t.textSubtle} font-semibold`;
9807
+ return `${NAV_ITEM_BASE} ${typography} ${this._geom()} ${t.textSubtle}`;
9751
9808
  }
9752
- return `${NAV_ITEM_BASE} ${this._geom()} ${t.textSubtle} font-semibold border-l-2 ${t.borderLight} !pl-[22px] ${t.hoverBgMuted}`;
9809
+ return `${NAV_ITEM_BASE} ${typography} ${this._geom()} ${t.textSubtle} border-l-2 ${t.borderLight} !pl-[22px] ${t.hoverBgMuted}`;
9753
9810
  }, ...(ngDevMode ? [{ debugName: "_activeCls" }] : /* istanbul ignore next */ []));
9754
9811
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: ClxMenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9755
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: ClxMenuItemComponent, isStandalone: true, selector: "clx-menu-item", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, nested: { classPropertyName: "nested", publicName: "nested", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, routerLink: { classPropertyName: "routerLink", publicName: "routerLink", isSignal: true, isRequired: false, transformFunction: null }, routerLinkActiveOptions: { classPropertyName: "routerLinkActiveOptions", publicName: "routerLinkActiveOptions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { classAttribute: "block" }, ngImport: i0, template: `
9812
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: ClxMenuItemComponent, isStandalone: true, selector: "clx-menu-item", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null }, nested: { classPropertyName: "nested", publicName: "nested", isSignal: true, isRequired: false, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, routerLink: { classPropertyName: "routerLink", publicName: "routerLink", isSignal: true, isRequired: false, transformFunction: null }, routerLinkActiveOptions: { classPropertyName: "routerLinkActiveOptions", publicName: "routerLinkActiveOptions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { classAttribute: "block" }, ngImport: i0, template: `
9756
9813
  @if (routerLink()) {
9757
9814
  <a
9758
9815
  [routerLink]="routerLink()"
@@ -9825,20 +9882,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
9825
9882
  changeDetection: ChangeDetectionStrategy.OnPush,
9826
9883
  host: { class: 'block' },
9827
9884
  }]
9828
- }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], nested: [{ type: i0.Input, args: [{ isSignal: true, alias: "nested", required: false }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], routerLink: [{ type: i0.Input, args: [{ isSignal: true, alias: "routerLink", required: false }] }], routerLinkActiveOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "routerLinkActiveOptions", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }] } });
9885
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }], nested: [{ type: i0.Input, args: [{ isSignal: true, alias: "nested", required: false }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], routerLink: [{ type: i0.Input, args: [{ isSignal: true, alias: "routerLink", required: false }] }], routerLinkActiveOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "routerLinkActiveOptions", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }] } });
9829
9886
 
9830
9887
  class ClxNavGroupComponent {
9888
+ _themeSvc = inject(ClxThemeService);
9831
9889
  label = input.required(...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
9832
9890
  collapsed = input(false, ...(ngDevMode ? [{ debugName: "collapsed" }] : /* istanbul ignore next */ []));
9833
- color = input(undefined, ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
9834
- labelClass = computed(() => {
9835
- const c = this.color();
9836
- return c ? resolveColor(c).textSubtle : 'text-clx-text-subtle';
9837
- }, ...(ngDevMode ? [{ debugName: "labelClass" }] : /* istanbul ignore next */ []));
9891
+ /** Per-instance override any field left unset falls back to the theme's sidebarGroup style */
9892
+ style = input(undefined, ...(ngDevMode ? [{ debugName: "style" }] : /* istanbul ignore next */ []));
9893
+ _resolved = computed(() => {
9894
+ const base = this._themeSvc.sidebarGroupStyle();
9895
+ const o = this.style();
9896
+ return { color: o?.color ?? base.color, size: o?.size ?? base.size, weight: o?.weight ?? base.weight };
9897
+ }, ...(ngDevMode ? [{ debugName: "_resolved" }] : /* istanbul ignore next */ []));
9898
+ labelClass = computed(() => `${resolveColor(this._resolved().color).textSubtle} ${resolveNavZoneIdle(this._resolved())}`, ...(ngDevMode ? [{ debugName: "labelClass" }] : /* istanbul ignore next */ []));
9838
9899
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: ClxNavGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9839
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: ClxNavGroupComponent, isStandalone: true, selector: "clx-nav-group", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "block" }, ngImport: i0, template: `
9900
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: ClxNavGroupComponent, isStandalone: true, selector: "clx-nav-group", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "block" }, ngImport: i0, template: `
9840
9901
  @if (!collapsed()) {
9841
- <span class="block px-6 pt-5 pb-1 text-[10px] font-bold uppercase tracking-widest select-none" [class]="labelClass()">{{ label() }}</span>
9902
+ <span class="block px-6 pt-5 pb-1 uppercase tracking-widest select-none" [class]="labelClass()">{{ label() }}</span>
9842
9903
  } @else {
9843
9904
  <span class="flex items-center justify-center w-full py-3">
9844
9905
  <span class="w-1.5 h-1.5 rounded-full bg-clx-border"></span>
@@ -9853,7 +9914,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
9853
9914
  standalone: true,
9854
9915
  template: `
9855
9916
  @if (!collapsed()) {
9856
- <span class="block px-6 pt-5 pb-1 text-[10px] font-bold uppercase tracking-widest select-none" [class]="labelClass()">{{ label() }}</span>
9917
+ <span class="block px-6 pt-5 pb-1 uppercase tracking-widest select-none" [class]="labelClass()">{{ label() }}</span>
9857
9918
  } @else {
9858
9919
  <span class="flex items-center justify-center w-full py-3">
9859
9920
  <span class="w-1.5 h-1.5 rounded-full bg-clx-border"></span>
@@ -9864,7 +9925,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
9864
9925
  changeDetection: ChangeDetectionStrategy.OnPush,
9865
9926
  host: { class: 'block' },
9866
9927
  }]
9867
- }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }] } });
9928
+ }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }], style: [{ type: i0.Input, args: [{ isSignal: true, alias: "style", required: false }] }] } });
9868
9929
 
9869
9930
  class ClxProfileComponent {
9870
9931
  // ── Inputs ──────────────────────────────────────────────────────────────────
@@ -15596,5 +15657,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
15596
15657
  * Generated bundle index. Do not edit.
15597
15658
  */
15598
15659
 
15599
- export { CLX_ADDON_BORDER, CLX_ADDON_TEXT, CLX_ALERT_OPTIONS, CLX_ALERT_RESOLVE, CLX_BG_ADDON, CLX_BG_DISABLED, CLX_BG_ICON_WRAP, CLX_BG_SECTION, CLX_BG_SURFACE, CLX_BORDER_DEFAULT, CLX_BORDER_DISABLED, CLX_BORDER_MEDIUM, CLX_COLOR_HEX, CLX_COLOR_HEX_100, CLX_COLOR_MAP, CLX_FONT_CATALOG, CLX_MODAL_ANIM_CONFIG, CLX_MODAL_DATA, CLX_MODAL_REF, CLX_OPTION_DISABLED, CLX_PLACEHOLDER, CLX_RADIO_GROUP, CLX_RADIUS_MAP, CLX_TEXT_BODY, CLX_TEXT_DISABLED, CLX_TEXT_HEADING, CLX_TEXT_HINT, CLX_TEXT_IDLE, CLX_TEXT_INPUT, CLX_TEXT_LABEL, CLX_TEXT_OPTION, CLX_TEXT_SUBTITLE, CLX_TEXT_TITLE, CLX_THEME_CONFIG, CLX_THEME_DEFAULTS, CLX_TOAST_DEFAULTS, ClxAlertComponent, ClxAlertService, ClxAnimateDirective, ClxAnimateGroupDirective, ClxAnimateService, ClxAppLayoutComponent, ClxAvatarComponent, ClxBadgeComponent, ClxBrandComponent, ClxButtonComponent, ClxButtonGroupComponent, ClxCardBodyDirective, ClxCardComponent, ClxCardFooterDirective, ClxCardHeaderDirective, ClxCarouselComponent, ClxCarouselDirective, ClxCartComponent, ClxCartSummaryDrawer, ClxCellDirective, ClxCheckboxComponent, ClxColorPickerComponent, ClxColumnDefDirective, ClxDateRangePickerComponent, ClxDatepickerComponent, ClxDrawerComponent, ClxDrawerService, ClxEditorComponent, ClxEditorLinkModalComponent, ClxFabComponent, ClxFilterPanelComponent, ClxHeaderCellDirective, ClxIconComponent, ClxInputComponent, ClxListComponent, ClxListItemComponent, ClxMenuComponent, ClxMenuItemComponent, ClxModalComponent, ClxModalService, ClxNavGroupComponent, ClxNumberComponent, ClxPageEmptyComponent, ClxPageNotFoundComponent, ClxPageServerErrorComponent, ClxPageUnauthorizedComponent, ClxPaginationComponent, ClxProductComponent, ClxProductDetailComponent, ClxProfileComponent, ClxProgressBarComponent, ClxRadioComponent, ClxRadioGroupComponent, ClxRatingComponent, ClxSelectComponent, ClxSkeletonComponent, ClxSliderComponent, ClxSpinnerComponent, ClxStatCardComponent, ClxStepComponent, ClxStepperComponent, ClxSwitchComponent, ClxTabDirective, ClxTableComponent, ClxTabsComponent, ClxTagComponent, ClxTextareaComponent, ClxThemeService, ClxTimelineComponent, ClxTimelineItemComponent, ClxTimepickerComponent, ClxToastComponent, ClxToastContainerComponent, ClxToastService, ClxTooltipComponent, ClxTooltipDirective, ClxTreeComponent, ClxUploadComponent, ClxWishlistComponent, ClxWizardComponent, TIMEPICKER_SIZE_MAP, parseColorInput, provideCodexlyTheme, resolveColor, resolveContainerRadius, resolveRadius };
15660
+ export { CLX_ADDON_BORDER, CLX_ADDON_TEXT, CLX_ALERT_OPTIONS, CLX_ALERT_RESOLVE, CLX_BG_ADDON, CLX_BG_DISABLED, CLX_BG_ICON_WRAP, CLX_BG_SECTION, CLX_BG_SURFACE, CLX_BORDER_DEFAULT, CLX_BORDER_DISABLED, CLX_BORDER_MEDIUM, CLX_COLOR_HEX, CLX_COLOR_HEX_100, CLX_COLOR_MAP, CLX_FONT_CATALOG, CLX_FONT_WEIGHT_MAP, CLX_MODAL_ANIM_CONFIG, CLX_MODAL_DATA, CLX_MODAL_REF, CLX_OPTION_DISABLED, CLX_PLACEHOLDER, CLX_RADIO_GROUP, CLX_RADIUS_MAP, CLX_TEXT_BODY, CLX_TEXT_DISABLED, CLX_TEXT_HEADING, CLX_TEXT_HINT, CLX_TEXT_IDLE, CLX_TEXT_INPUT, CLX_TEXT_LABEL, CLX_TEXT_OPTION, CLX_TEXT_SUBTITLE, CLX_TEXT_TITLE, CLX_THEME_CONFIG, CLX_THEME_DEFAULTS, CLX_TOAST_DEFAULTS, ClxAlertComponent, ClxAlertService, ClxAnimateDirective, ClxAnimateGroupDirective, ClxAnimateService, ClxAppLayoutComponent, ClxAvatarComponent, ClxBadgeComponent, ClxBrandComponent, ClxButtonComponent, ClxButtonGroupComponent, ClxCardBodyDirective, ClxCardComponent, ClxCardFooterDirective, ClxCardHeaderDirective, ClxCarouselComponent, ClxCarouselDirective, ClxCartComponent, ClxCartSummaryDrawer, ClxCellDirective, ClxCheckboxComponent, ClxColorPickerComponent, ClxColumnDefDirective, ClxDateRangePickerComponent, ClxDatepickerComponent, ClxDrawerComponent, ClxDrawerService, ClxEditorComponent, ClxEditorLinkModalComponent, ClxFabComponent, ClxFilterPanelComponent, ClxHeaderCellDirective, ClxIconComponent, ClxInputComponent, ClxListComponent, ClxListItemComponent, ClxMenuComponent, ClxMenuItemComponent, ClxModalComponent, ClxModalService, ClxNavGroupComponent, ClxNumberComponent, ClxPageEmptyComponent, ClxPageNotFoundComponent, ClxPageServerErrorComponent, ClxPageUnauthorizedComponent, ClxPaginationComponent, ClxProductComponent, ClxProductDetailComponent, ClxProfileComponent, ClxProgressBarComponent, ClxRadioComponent, ClxRadioGroupComponent, ClxRatingComponent, ClxSelectComponent, ClxSkeletonComponent, ClxSliderComponent, ClxSpinnerComponent, ClxStatCardComponent, ClxStepComponent, ClxStepperComponent, ClxSwitchComponent, ClxTabDirective, ClxTableComponent, ClxTabsComponent, ClxTagComponent, ClxTextareaComponent, ClxThemeService, ClxTimelineComponent, ClxTimelineItemComponent, ClxTimepickerComponent, ClxToastComponent, ClxToastContainerComponent, ClxToastService, ClxTooltipComponent, ClxTooltipDirective, ClxTreeComponent, ClxUploadComponent, ClxWishlistComponent, ClxWizardComponent, TIMEPICKER_SIZE_MAP, parseColorInput, provideCodexlyTheme, resolveColor, resolveContainerRadius, resolveRadius };
15600
15661
  //# sourceMappingURL=codexly-ui.mjs.map