codexly-ui 0.10.108 → 0.10.109

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.
@@ -611,6 +611,7 @@ class ClxThemeService {
611
611
  return {
612
612
  headerColor: t?.headerColor ?? this._config().primaryColor,
613
613
  headerTextColor: t?.headerTextColor ?? t?.headerColor ?? this._config().primaryColor,
614
+ borderColor: t?.borderColor ?? this._config().primaryColor,
614
615
  shadow: t?.shadow ?? 'none',
615
616
  bordered: t?.bordered ?? true,
616
617
  };
@@ -633,6 +634,12 @@ class ClxThemeService {
633
634
  ? this._config().primaryButtonTextColor
634
635
  : this._config().secondaryButtonTextColor;
635
636
  }
637
+ /** Resolved border color for ClxCardComponent (outlined/elevated variants) — falls back to
638
+ * primaryColor when unset. Per-instance `[color]` input on clx-card still takes precedence. */
639
+ cardBorderColor = computed(() => this._config().cardBorderColor ?? this._config().primaryColor, ...(ngDevMode ? [{ debugName: "cardBorderColor" }] : /* istanbul ignore next */ []));
640
+ /** Resolved divider/border color for ClxListComponent — falls back to primaryColor when unset.
641
+ * Per-instance `[color]` input on clx-list still takes precedence. */
642
+ listBorderColor = computed(() => this._config().listBorderColor ?? this._config().primaryColor, ...(ngDevMode ? [{ debugName: "listBorderColor" }] : /* istanbul ignore next */ []));
636
643
  constructor() {
637
644
  effect(() => {
638
645
  if (!this._isBrowser)
@@ -777,6 +784,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
777
784
  }]
778
785
  }], propDecorators: { platform: [{ type: i0.Input, args: [{ isSignal: true, alias: "platform", required: true }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
779
786
 
787
+ // ── Context ───────────────────────────────────────────────────────────────────
788
+ /** Provided by clx-table-actions so nested clx-button instances default to the theme's
789
+ * secondaryColor instead of primaryColor when they don't pass their own [color] — any button
790
+ * that DOES pass [color] explicitly still overrides this, same as CLX_CARD_DISABLED_CONTEXT. */
791
+ const CLX_TABLE_ACTIONS_CONTEXT = new InjectionToken('CLX_TABLE_ACTIONS_CONTEXT');
780
792
  const BUTTON_BASE_CLASS = 'relative overflow-hidden inline-flex items-center justify-center font-medium select-none transition-[color,background-color,border-color,box-shadow] duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2';
781
793
  const BUTTON_SIZE_MAP = {
782
794
  xxs: 'text-xs px-1.5 py-0.5 gap-0.5',
@@ -947,7 +959,8 @@ class ClxButtonComponent {
947
959
  textColor = input(undefined, ...(ngDevMode ? [{ debugName: "textColor" }] : /* istanbul ignore next */ []));
948
960
  size = input(undefined, ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
949
961
  shape = input(undefined, ...(ngDevMode ? [{ debugName: "shape" }] : /* istanbul ignore next */ []));
950
- _color = computed(() => this.color() ?? this._themeSvc.config().primaryColor, ...(ngDevMode ? [{ debugName: "_color" }] : /* istanbul ignore next */ []));
962
+ _tableActionsColor = inject(CLX_TABLE_ACTIONS_CONTEXT, { optional: true });
963
+ _color = computed(() => this.color() ?? this._tableActionsColor?.() ?? this._themeSvc.config().primaryColor, ...(ngDevMode ? [{ debugName: "_color" }] : /* istanbul ignore next */ []));
951
964
  _size = computed(() => this.size() ?? this._themeSvc.config().defaultSize, ...(ngDevMode ? [{ debugName: "_size" }] : /* istanbul ignore next */ []));
952
965
  _shape = computed(() => this.shape() ?? this._themeSvc.config().defaultShape, ...(ngDevMode ? [{ debugName: "_shape" }] : /* istanbul ignore next */ []));
953
966
  loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
@@ -1508,7 +1521,7 @@ class ClxCardComponent {
1508
1521
  headerTitle = input(undefined, ...(ngDevMode ? [{ debugName: "headerTitle" }] : /* istanbul ignore next */ []));
1509
1522
  /** Optional secondary line under headerTitle. */
1510
1523
  headerSubtitle = input(undefined, ...(ngDevMode ? [{ debugName: "headerSubtitle" }] : /* istanbul ignore next */ []));
1511
- _color = computed(() => this.color() ?? this._themeSvc.config().primaryColor, ...(ngDevMode ? [{ debugName: "_color" }] : /* istanbul ignore next */ []));
1524
+ _color = computed(() => this.color() ?? this._themeSvc.cardBorderColor(), ...(ngDevMode ? [{ debugName: "_color" }] : /* istanbul ignore next */ []));
1512
1525
  _titleClass = computed(() => `text-sm font-[${this._themeSvc.cardTitleStyle().weight}] text-clx-text-label leading-tight truncate`, ...(ngDevMode ? [{ debugName: "_titleClass" }] : /* istanbul ignore next */ []));
1513
1526
  _headerSlot = contentChild(ClxCardHeaderDirective, ...(ngDevMode ? [{ debugName: "_headerSlot" }] : /* istanbul ignore next */ []));
1514
1527
  _headerActionsSlot = contentChild(ClxCardHeaderActionsDirective, ...(ngDevMode ? [{ debugName: "_headerActionsSlot" }] : /* istanbul ignore next */ []));
@@ -1825,7 +1838,7 @@ const LIST_SIZE_MAP = {
1825
1838
  class ClxListComponent {
1826
1839
  _themeSvc = inject(ClxThemeService);
1827
1840
  color = input(undefined, ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
1828
- resolvedColor = computed(() => this.color() ?? this._themeSvc.config().primaryColor, ...(ngDevMode ? [{ debugName: "resolvedColor" }] : /* istanbul ignore next */ []));
1841
+ resolvedColor = computed(() => this.color() ?? this._themeSvc.listBorderColor(), ...(ngDevMode ? [{ debugName: "resolvedColor" }] : /* istanbul ignore next */ []));
1829
1842
  variant = input('flat', ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
1830
1843
  size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
1831
1844
  numbered = input(false, ...(ngDevMode ? [{ debugName: "numbered" }] : /* istanbul ignore next */ []));
@@ -10888,10 +10901,10 @@ class ClxProfileComponent {
10888
10901
  const t = resolveColor(this._color());
10889
10902
  return `focus-visible:${t.ringBase}`;
10890
10903
  }, ...(ngDevMode ? [{ debugName: "_ringClass" }] : /* istanbul ignore next */ []));
10891
- _headerBgClass = computed(() => {
10904
+ _avatarRingClass = computed(() => {
10892
10905
  const t = resolveColor(this._color());
10893
- return `${t.bgSubtle}`;
10894
- }, ...(ngDevMode ? [{ debugName: "_headerBgClass" }] : /* istanbul ignore next */ []));
10906
+ return `border-2 ${t.borderLight}`;
10907
+ }, ...(ngDevMode ? [{ debugName: "_avatarRingClass" }] : /* istanbul ignore next */ []));
10895
10908
  // ── Methods ──────────────────────────────────────────────────────────────────
10896
10909
  _toggle() { this._isOpen.update(v => !v); }
10897
10910
  _close() { this._isOpen.set(false); }
@@ -10935,60 +10948,55 @@ class ClxProfileComponent {
10935
10948
  (overlayOutsideClick)="_close()"
10936
10949
  (overlayKeydown)="_onKeydown($event)">
10937
10950
 
10938
- <div class="w-64 bg-clx-surface rounded-2xl shadow-xl border border-clx-border overflow-hidden mt-2">
10951
+ <div class="w-72 bg-clx-surface rounded-2xl shadow-xl border border-clx-border-soft overflow-hidden mt-2">
10939
10952
 
10940
- <!-- Header: avatar + name + role -->
10941
- <div class="px-4 py-4 flex items-center gap-3" [class]="_headerBgClass()">
10942
- <clx-avatar
10943
- [initials]="_initials()"
10944
- [src]="avatarSrc()"
10945
- [color]="_color()"
10946
- size="md" />
10953
+ <!-- Header: avatar ring + name + role badge, subtle surface (not a solid color block) -->
10954
+ <div class="px-4 pt-5 pb-4 flex items-center gap-3 bg-clx-surface-2">
10955
+ <div class="rounded-full p-0.5" [class]="_avatarRingClass()">
10956
+ <clx-avatar
10957
+ [initials]="_initials()"
10958
+ [src]="avatarSrc()"
10959
+ [color]="_color()"
10960
+ size="md" />
10961
+ </div>
10947
10962
  <div class="flex-1 min-w-0">
10948
10963
  <p class="text-sm font-semibold text-clx-text-label truncate">{{ fullName() }}</p>
10949
10964
  <p class="text-xs text-clx-text-muted truncate">{{ username() }}</p>
10950
10965
  @if (role()) {
10951
- <span clx-badge [color]="_color()" variant="light" size="sm" class="mt-1">{{ role() }}</span>
10966
+ <span clx-badge [color]="_color()" variant="light" size="xs" class="mt-1.5">{{ role() }}</span>
10952
10967
  }
10953
10968
  </div>
10954
10969
  </div>
10955
10970
 
10956
- <!-- Divider -->
10957
- <div class="border-t border-clx-border-soft"></div>
10958
-
10959
10971
  <!-- Menu items -->
10960
10972
  @if (menuItems().length) {
10961
- <div class="p-1.5">
10973
+ <div class="py-1.5">
10962
10974
  @for (item of menuItems(); track item.action) {
10963
- <button clx-button type="button" variant="ghost" [color]="_color()" [block]="true" [icon]="item.icon"
10964
- class="justify-start rounded-xl!"
10965
- (click)="_onAction(item.action)">
10966
- {{ item.label }}
10967
- </button>
10975
+ <clx-menu-item [label]="item.label" [icon]="item.icon"
10976
+ (itemClick)="_onAction(item.action)" />
10968
10977
  }
10969
10978
  </div>
10970
- <div class="border-t border-clx-border-soft mx-3"></div>
10971
10979
  }
10972
10980
 
10973
- <!-- Sign out -->
10974
- <div class="p-1.5">
10975
- <button clx-button type="button" variant="ghost" color="red" [block]="true" icon="logout"
10976
- class="justify-start rounded-xl!"
10977
- (click)="_onSignOut()">
10978
- {{ signOutLabel() }}
10979
- </button>
10981
+ <!-- Divider -->
10982
+ <div class="border-t border-clx-border-soft"></div>
10983
+
10984
+ <!-- Sign out — always red regardless of theme (destructive action convention) -->
10985
+ <div class="py-1.5">
10986
+ <clx-menu-item [label]="signOutLabel()" icon="logout" [style]="{ color: 'red' }"
10987
+ (itemClick)="_onSignOut()" />
10980
10988
  </div>
10981
10989
 
10982
10990
  </div>
10983
10991
  </ng-template>
10984
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ClxAvatarComponent, selector: "clx-avatar", inputs: ["src", "initials", "iconName", "color", "size", "shape", "alt"] }, { kind: "component", type: ClxButtonComponent, selector: "button[clx-button], a[clx-button]", inputs: ["variant", "color", "textColor", "size", "shape", "loading", "disabled", "block", "icon", "iconPosition", "iconOnly", "badge", "badgeColor"] }, { kind: "component", type: ClxBadgeComponent, selector: "span[clx-badge]", inputs: ["variant", "color", "size", "shape", "positioned"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
10992
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: ClxAvatarComponent, selector: "clx-avatar", inputs: ["src", "initials", "iconName", "color", "size", "shape", "alt"] }, { kind: "component", type: ClxBadgeComponent, selector: "span[clx-badge]", inputs: ["variant", "color", "size", "shape", "positioned"] }, { kind: "component", type: ClxMenuItemComponent, selector: "clx-menu-item", inputs: ["label", "icon", "active", "style", "nested", "collapsed", "routerLink", "routerLinkActiveOptions"], outputs: ["itemClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
10985
10993
  }
10986
10994
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: ClxProfileComponent, decorators: [{
10987
10995
  type: Component,
10988
10996
  args: [{
10989
10997
  selector: 'clx-profile',
10990
10998
  standalone: true,
10991
- imports: [OverlayModule, ClxAvatarComponent, ClxButtonComponent, ClxBadgeComponent],
10999
+ imports: [OverlayModule, ClxAvatarComponent, ClxBadgeComponent, ClxMenuItemComponent],
10992
11000
  template: `
10993
11001
  <!-- ── Trigger ─────────────────────────────────────────────────────────── -->
10994
11002
  <button
@@ -11016,48 +11024,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
11016
11024
  (overlayOutsideClick)="_close()"
11017
11025
  (overlayKeydown)="_onKeydown($event)">
11018
11026
 
11019
- <div class="w-64 bg-clx-surface rounded-2xl shadow-xl border border-clx-border overflow-hidden mt-2">
11027
+ <div class="w-72 bg-clx-surface rounded-2xl shadow-xl border border-clx-border-soft overflow-hidden mt-2">
11020
11028
 
11021
- <!-- Header: avatar + name + role -->
11022
- <div class="px-4 py-4 flex items-center gap-3" [class]="_headerBgClass()">
11023
- <clx-avatar
11024
- [initials]="_initials()"
11025
- [src]="avatarSrc()"
11026
- [color]="_color()"
11027
- size="md" />
11029
+ <!-- Header: avatar ring + name + role badge, subtle surface (not a solid color block) -->
11030
+ <div class="px-4 pt-5 pb-4 flex items-center gap-3 bg-clx-surface-2">
11031
+ <div class="rounded-full p-0.5" [class]="_avatarRingClass()">
11032
+ <clx-avatar
11033
+ [initials]="_initials()"
11034
+ [src]="avatarSrc()"
11035
+ [color]="_color()"
11036
+ size="md" />
11037
+ </div>
11028
11038
  <div class="flex-1 min-w-0">
11029
11039
  <p class="text-sm font-semibold text-clx-text-label truncate">{{ fullName() }}</p>
11030
11040
  <p class="text-xs text-clx-text-muted truncate">{{ username() }}</p>
11031
11041
  @if (role()) {
11032
- <span clx-badge [color]="_color()" variant="light" size="sm" class="mt-1">{{ role() }}</span>
11042
+ <span clx-badge [color]="_color()" variant="light" size="xs" class="mt-1.5">{{ role() }}</span>
11033
11043
  }
11034
11044
  </div>
11035
11045
  </div>
11036
11046
 
11037
- <!-- Divider -->
11038
- <div class="border-t border-clx-border-soft"></div>
11039
-
11040
11047
  <!-- Menu items -->
11041
11048
  @if (menuItems().length) {
11042
- <div class="p-1.5">
11049
+ <div class="py-1.5">
11043
11050
  @for (item of menuItems(); track item.action) {
11044
- <button clx-button type="button" variant="ghost" [color]="_color()" [block]="true" [icon]="item.icon"
11045
- class="justify-start rounded-xl!"
11046
- (click)="_onAction(item.action)">
11047
- {{ item.label }}
11048
- </button>
11051
+ <clx-menu-item [label]="item.label" [icon]="item.icon"
11052
+ (itemClick)="_onAction(item.action)" />
11049
11053
  }
11050
11054
  </div>
11051
- <div class="border-t border-clx-border-soft mx-3"></div>
11052
11055
  }
11053
11056
 
11054
- <!-- Sign out -->
11055
- <div class="p-1.5">
11056
- <button clx-button type="button" variant="ghost" color="red" [block]="true" icon="logout"
11057
- class="justify-start rounded-xl!"
11058
- (click)="_onSignOut()">
11059
- {{ signOutLabel() }}
11060
- </button>
11057
+ <!-- Divider -->
11058
+ <div class="border-t border-clx-border-soft"></div>
11059
+
11060
+ <!-- Sign out — always red regardless of theme (destructive action convention) -->
11061
+ <div class="py-1.5">
11062
+ <clx-menu-item [label]="signOutLabel()" icon="logout" [style]="{ color: 'red' }"
11063
+ (itemClick)="_onSignOut()" />
11061
11064
  </div>
11062
11065
 
11063
11066
  </div>
@@ -13710,6 +13713,7 @@ class ClxTableComponent {
13710
13713
  * theme configured in Editar tema → Tablas) when unset. */
13711
13714
  headerColor = input(undefined, ...(ngDevMode ? [{ debugName: "headerColor" }] : /* istanbul ignore next */ []));
13712
13715
  headerTextColor = input(undefined, ...(ngDevMode ? [{ debugName: "headerTextColor" }] : /* istanbul ignore next */ []));
13716
+ borderColor = input(undefined, ...(ngDevMode ? [{ debugName: "borderColor" }] : /* istanbul ignore next */ []));
13713
13717
  shadow = input(undefined, ...(ngDevMode ? [{ debugName: "shadow" }] : /* istanbul ignore next */ []));
13714
13718
  bordered = input(undefined, ...(ngDevMode ? [{ debugName: "bordered" }] : /* istanbul ignore next */ []));
13715
13719
  _tableStyle = computed(() => {
@@ -13717,6 +13721,7 @@ class ClxTableComponent {
13717
13721
  return {
13718
13722
  headerColor: this.headerColor() ?? theme.headerColor,
13719
13723
  headerTextColor: this.headerTextColor() ?? theme.headerTextColor,
13724
+ borderColor: this.borderColor() ?? theme.borderColor,
13720
13725
  shadow: this.shadow() ?? theme.shadow,
13721
13726
  bordered: this.bordered() ?? theme.bordered,
13722
13727
  };
@@ -13746,7 +13751,7 @@ class ClxTableComponent {
13746
13751
  };
13747
13752
  _tableWrapperClass = computed(() => {
13748
13753
  const s = this._tableStyle();
13749
- const { color } = parseColorInput(s.headerColor);
13754
+ const { color } = parseColorInput(s.borderColor);
13750
13755
  const border = s.bordered ? `border border-${color}-200` : '';
13751
13756
  const shadow = ClxTableComponent._SHADOW_CLASS[s.shadow];
13752
13757
  return `overflow-x-auto overflow-y-hidden rounded-lg ${border} ${shadow}`.trim();
@@ -13873,7 +13878,7 @@ class ClxTableComponent {
13873
13878
  this.selectionChange.emit({ selected: this.selectedItems(), allSelected: false });
13874
13879
  }
13875
13880
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: ClxTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13876
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: ClxTableComponent, isStandalone: true, selector: "clx-table", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, singleSelect: { classPropertyName: "singleSelect", publicName: "singleSelect", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, pagination: { classPropertyName: "pagination", publicName: "pagination", isSignal: true, isRequired: false, transformFunction: null }, serverSide: { classPropertyName: "serverSide", publicName: "serverSide", isSignal: true, isRequired: false, transformFunction: null }, totalItems: { classPropertyName: "totalItems", publicName: "totalItems", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, emptyIcon: { classPropertyName: "emptyIcon", publicName: "emptyIcon", isSignal: true, isRequired: false, transformFunction: null }, emptyTitle: { classPropertyName: "emptyTitle", publicName: "emptyTitle", isSignal: true, isRequired: false, transformFunction: null }, emptyDescription: { classPropertyName: "emptyDescription", publicName: "emptyDescription", isSignal: true, isRequired: false, transformFunction: null }, headerColor: { classPropertyName: "headerColor", publicName: "headerColor", isSignal: true, isRequired: false, transformFunction: null }, headerTextColor: { classPropertyName: "headerTextColor", publicName: "headerTextColor", isSignal: true, isRequired: false, transformFunction: null }, shadow: { classPropertyName: "shadow", publicName: "shadow", isSignal: true, isRequired: false, transformFunction: null }, bordered: { classPropertyName: "bordered", publicName: "bordered", isSignal: true, isRequired: false, transformFunction: null }, sortKey: { classPropertyName: "sortKey", publicName: "sortKey", isSignal: true, isRequired: false, transformFunction: null }, sortDir: { classPropertyName: "sortDir", publicName: "sortDir", isSignal: true, isRequired: false, transformFunction: null }, pageIndex: { classPropertyName: "pageIndex", publicName: "pageIndex", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, _currentPage: { classPropertyName: "_currentPage", publicName: "_currentPage", isSignal: true, isRequired: false, transformFunction: null }, searchQuery: { classPropertyName: "searchQuery", publicName: "searchQuery", isSignal: true, isRequired: false, transformFunction: null }, selectedItems: { classPropertyName: "selectedItems", publicName: "selectedItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sortKey: "sortKeyChange", sortDir: "sortDirChange", pageIndex: "pageIndexChange", pageSize: "pageSizeChange", _currentPage: "_currentPageChange", searchQuery: "searchQueryChange", selectedItems: "selectedItemsChange", sortChange: "sortChange", pageChange: "pageChange", selectionChange: "selectionChange" }, host: { classAttribute: "block" }, queries: [{ propertyName: "_columnDefs", predicate: ClxColumnDefDirective, isSignal: true }], ngImport: i0, template: `
13881
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: ClxTableComponent, isStandalone: true, selector: "clx-table", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, selectable: { classPropertyName: "selectable", publicName: "selectable", isSignal: true, isRequired: false, transformFunction: null }, singleSelect: { classPropertyName: "singleSelect", publicName: "singleSelect", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, pagination: { classPropertyName: "pagination", publicName: "pagination", isSignal: true, isRequired: false, transformFunction: null }, serverSide: { classPropertyName: "serverSide", publicName: "serverSide", isSignal: true, isRequired: false, transformFunction: null }, totalItems: { classPropertyName: "totalItems", publicName: "totalItems", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, emptyIcon: { classPropertyName: "emptyIcon", publicName: "emptyIcon", isSignal: true, isRequired: false, transformFunction: null }, emptyTitle: { classPropertyName: "emptyTitle", publicName: "emptyTitle", isSignal: true, isRequired: false, transformFunction: null }, emptyDescription: { classPropertyName: "emptyDescription", publicName: "emptyDescription", isSignal: true, isRequired: false, transformFunction: null }, headerColor: { classPropertyName: "headerColor", publicName: "headerColor", isSignal: true, isRequired: false, transformFunction: null }, headerTextColor: { classPropertyName: "headerTextColor", publicName: "headerTextColor", isSignal: true, isRequired: false, transformFunction: null }, borderColor: { classPropertyName: "borderColor", publicName: "borderColor", isSignal: true, isRequired: false, transformFunction: null }, shadow: { classPropertyName: "shadow", publicName: "shadow", isSignal: true, isRequired: false, transformFunction: null }, bordered: { classPropertyName: "bordered", publicName: "bordered", isSignal: true, isRequired: false, transformFunction: null }, sortKey: { classPropertyName: "sortKey", publicName: "sortKey", isSignal: true, isRequired: false, transformFunction: null }, sortDir: { classPropertyName: "sortDir", publicName: "sortDir", isSignal: true, isRequired: false, transformFunction: null }, pageIndex: { classPropertyName: "pageIndex", publicName: "pageIndex", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, _currentPage: { classPropertyName: "_currentPage", publicName: "_currentPage", isSignal: true, isRequired: false, transformFunction: null }, searchQuery: { classPropertyName: "searchQuery", publicName: "searchQuery", isSignal: true, isRequired: false, transformFunction: null }, selectedItems: { classPropertyName: "selectedItems", publicName: "selectedItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sortKey: "sortKeyChange", sortDir: "sortDirChange", pageIndex: "pageIndexChange", pageSize: "pageSizeChange", _currentPage: "_currentPageChange", searchQuery: "searchQueryChange", selectedItems: "selectedItemsChange", sortChange: "sortChange", pageChange: "pageChange", selectionChange: "selectionChange" }, host: { classAttribute: "block" }, queries: [{ propertyName: "_columnDefs", predicate: ClxColumnDefDirective, isSignal: true }], ngImport: i0, template: `
13877
13882
  <!-- ── Toolbar: búsqueda ──────────────────────────────────────────────── -->
13878
13883
  @if (searchable() && !serverSide() && !loading() && _filteredData().length > 0) {
13879
13884
  <div class="mb-3 max-w-80 min-w-40">
@@ -14155,7 +14160,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
14155
14160
  changeDetection: ChangeDetectionStrategy.OnPush,
14156
14161
  host: { class: 'block' },
14157
14162
  }]
14158
- }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], singleSelect: [{ type: i0.Input, args: [{ isSignal: true, alias: "singleSelect", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], pagination: [{ type: i0.Input, args: [{ isSignal: true, alias: "pagination", required: false }] }], serverSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "serverSide", required: false }] }], totalItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalItems", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], emptyIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyIcon", required: false }] }], emptyTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyTitle", required: false }] }], emptyDescription: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyDescription", required: false }] }], headerColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerColor", required: false }] }], headerTextColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTextColor", required: false }] }], shadow: [{ type: i0.Input, args: [{ isSignal: true, alias: "shadow", required: false }] }], bordered: [{ type: i0.Input, args: [{ isSignal: true, alias: "bordered", required: false }] }], sortKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortKey", required: false }] }, { type: i0.Output, args: ["sortKeyChange"] }], sortDir: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortDir", required: false }] }, { type: i0.Output, args: ["sortDirChange"] }], pageIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageIndex", required: false }] }, { type: i0.Output, args: ["pageIndexChange"] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }, { type: i0.Output, args: ["pageSizeChange"] }], _currentPage: [{ type: i0.Input, args: [{ isSignal: true, alias: "_currentPage", required: false }] }, { type: i0.Output, args: ["_currentPageChange"] }], searchQuery: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchQuery", required: false }] }, { type: i0.Output, args: ["searchQueryChange"] }], selectedItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedItems", required: false }] }, { type: i0.Output, args: ["selectedItemsChange"] }], sortChange: [{ type: i0.Output, args: ["sortChange"] }], pageChange: [{ type: i0.Output, args: ["pageChange"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], _columnDefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => ClxColumnDefDirective), { isSignal: true }] }] } });
14163
+ }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], selectable: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectable", required: false }] }], singleSelect: [{ type: i0.Input, args: [{ isSignal: true, alias: "singleSelect", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], pagination: [{ type: i0.Input, args: [{ isSignal: true, alias: "pagination", required: false }] }], serverSide: [{ type: i0.Input, args: [{ isSignal: true, alias: "serverSide", required: false }] }], totalItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalItems", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], emptyIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyIcon", required: false }] }], emptyTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyTitle", required: false }] }], emptyDescription: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyDescription", required: false }] }], headerColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerColor", required: false }] }], headerTextColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTextColor", required: false }] }], borderColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "borderColor", required: false }] }], shadow: [{ type: i0.Input, args: [{ isSignal: true, alias: "shadow", required: false }] }], bordered: [{ type: i0.Input, args: [{ isSignal: true, alias: "bordered", required: false }] }], sortKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortKey", required: false }] }, { type: i0.Output, args: ["sortKeyChange"] }], sortDir: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortDir", required: false }] }, { type: i0.Output, args: ["sortDirChange"] }], pageIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageIndex", required: false }] }, { type: i0.Output, args: ["pageIndexChange"] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }, { type: i0.Output, args: ["pageSizeChange"] }], _currentPage: [{ type: i0.Input, args: [{ isSignal: true, alias: "_currentPage", required: false }] }, { type: i0.Output, args: ["_currentPageChange"] }], searchQuery: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchQuery", required: false }] }, { type: i0.Output, args: ["searchQueryChange"] }], selectedItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedItems", required: false }] }, { type: i0.Output, args: ["selectedItemsChange"] }], sortChange: [{ type: i0.Output, args: ["sortChange"] }], pageChange: [{ type: i0.Output, args: ["pageChange"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], _columnDefs: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => ClxColumnDefDirective), { isSignal: true }] }] } });
14164
+
14165
+ /** Wraps the action buttons in a clx-table column (edit/delete/view/...) so every nested
14166
+ * clx-button defaults to the theme's secondaryColor instead of primaryColor, without each one
14167
+ * having to pass [color] by hand. Any button that DOES pass its own [color] (e.g. a one-off
14168
+ * danger action) still overrides this default — same override precedence as every other
14169
+ * per-instance color input in the library. */
14170
+ class ClxTableActionsComponent {
14171
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: ClxTableActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
14172
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.15", type: ClxTableActionsComponent, isStandalone: true, selector: "clx-table-actions", host: { classAttribute: "flex items-center gap-2" }, providers: [
14173
+ { provide: CLX_TABLE_ACTIONS_CONTEXT, useFactory: () => {
14174
+ const themeSvc = inject(ClxThemeService);
14175
+ return computed(() => themeSvc.config().secondaryColor);
14176
+ } },
14177
+ ], ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
14178
+ }
14179
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: ClxTableActionsComponent, decorators: [{
14180
+ type: Component,
14181
+ args: [{
14182
+ selector: 'clx-table-actions',
14183
+ standalone: true,
14184
+ template: `<ng-content />`,
14185
+ encapsulation: ViewEncapsulation.None,
14186
+ changeDetection: ChangeDetectionStrategy.OnPush,
14187
+ host: { class: 'flex items-center gap-2' },
14188
+ providers: [
14189
+ { provide: CLX_TABLE_ACTIONS_CONTEXT, useFactory: () => {
14190
+ const themeSvc = inject(ClxThemeService);
14191
+ return computed(() => themeSvc.config().secondaryColor);
14192
+ } },
14193
+ ],
14194
+ }]
14195
+ }] });
14159
14196
 
14160
14197
  class ClxPageNotFoundComponent {
14161
14198
  title = input('Página no encontrada', ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
@@ -17020,5 +17057,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
17020
17057
  * Generated bundle index. Do not edit.
17021
17058
  */
17022
17059
 
17023
- 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, ClxCardHeaderActionsDirective, ClxCardHeaderDirective, ClxCarouselComponent, ClxCarouselDirective, ClxCartComponent, ClxCartSummaryDrawer, ClxCellDirective, ClxCheckboxComponent, ClxCollapseComponent, ClxColorPickerComponent, ClxColumnDefDirective, ClxDateRangePickerComponent, ClxDatepickerComponent, ClxDrawerComponent, ClxDrawerService, ClxEditorComponent, ClxEditorLinkModalComponent, ClxFabComponent, ClxFilterPanelComponent, ClxHeaderCellDirective, ClxIconComponent, ClxInputComponent, ClxListComponent, ClxListItemComponent, ClxMenuComponent, ClxMenuItemComponent, ClxMenuItemTrailingDirective, ClxModalComponent, ClxModalService, ClxNativeOverlayService, ClxNavGroupComponent, ClxNumberComponent, ClxOtpComponent, ClxPageEmptyComponent, ClxPageHeaderComponent, ClxPageHeaderTitleDirective, ClxPageNotFoundComponent, ClxPageServerErrorComponent, ClxPageUnauthorizedComponent, ClxPaginationComponent, ClxProductComponent, ClxProductDetailComponent, ClxProductQuickViewComponent, ClxProfileComponent, ClxProgressBarComponent, ClxRadioComponent, ClxRadioGroupComponent, ClxRatingComponent, ClxSearchComponent, ClxSelectComponent, ClxSkeletonComponent, ClxSliderComponent, ClxSocialIconComponent, 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 };
17060
+ 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, ClxCardHeaderActionsDirective, ClxCardHeaderDirective, ClxCarouselComponent, ClxCarouselDirective, ClxCartComponent, ClxCartSummaryDrawer, ClxCellDirective, ClxCheckboxComponent, ClxCollapseComponent, ClxColorPickerComponent, ClxColumnDefDirective, ClxDateRangePickerComponent, ClxDatepickerComponent, ClxDrawerComponent, ClxDrawerService, ClxEditorComponent, ClxEditorLinkModalComponent, ClxFabComponent, ClxFilterPanelComponent, ClxHeaderCellDirective, ClxIconComponent, ClxInputComponent, ClxListComponent, ClxListItemComponent, ClxMenuComponent, ClxMenuItemComponent, ClxMenuItemTrailingDirective, ClxModalComponent, ClxModalService, ClxNativeOverlayService, ClxNavGroupComponent, ClxNumberComponent, ClxOtpComponent, ClxPageEmptyComponent, ClxPageHeaderComponent, ClxPageHeaderTitleDirective, ClxPageNotFoundComponent, ClxPageServerErrorComponent, ClxPageUnauthorizedComponent, ClxPaginationComponent, ClxProductComponent, ClxProductDetailComponent, ClxProductQuickViewComponent, ClxProfileComponent, ClxProgressBarComponent, ClxRadioComponent, ClxRadioGroupComponent, ClxRatingComponent, ClxSearchComponent, ClxSelectComponent, ClxSkeletonComponent, ClxSliderComponent, ClxSocialIconComponent, ClxSpinnerComponent, ClxStatCardComponent, ClxStepComponent, ClxStepperComponent, ClxSwitchComponent, ClxTabDirective, ClxTableActionsComponent, 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 };
17024
17061
  //# sourceMappingURL=codexly-ui.mjs.map