codexly-ui 0.0.32 → 0.0.33

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.
@@ -1731,7 +1731,7 @@ class ClxCarouselComponent {
1731
1731
  _slides = contentChildren(ClxCarouselDirective, ...(ngDevMode ? [{ debugName: "_slides" }] : []));
1732
1732
  _autoPlayTimer = null;
1733
1733
  _touchStartX = 0;
1734
- _zone = inject(NgZone, { optional: true }) ?? { run: (fn) => fn(), runOutsideAngular: (fn) => fn() };
1734
+ _zone;
1735
1735
  _aspectClass = computed(() => CAROUSEL_ASPECT_RATIO_MAP[this.aspectRatio()] ?? '', ...(ngDevMode ? [{ debugName: "_aspectClass" }] : []));
1736
1736
  _viewportClass = computed(() => {
1737
1737
  const base = this._aspectClass();
@@ -1748,6 +1748,8 @@ class ClxCarouselComponent {
1748
1748
  }));
1749
1749
  }, ...(ngDevMode ? [{ debugName: "_dotItems" }] : []));
1750
1750
  constructor() {
1751
+ const zone = inject(NgZone, { optional: true });
1752
+ this._zone = zone ?? { run: (fn) => fn(), runOutsideAngular: (fn) => fn() };
1751
1753
  effect(() => {
1752
1754
  const active = this.autoPlay();
1753
1755
  const ms = this.interval();
@@ -4936,7 +4938,11 @@ class ClxAlertComponent {
4936
4938
  _resolve = inject(CLX_ALERT_RESOLVE);
4937
4939
  _animate = inject(ClxAnimateService);
4938
4940
  _el = inject((ElementRef));
4939
- _zone = inject(NgZone, { optional: true }) ?? { run: (fn) => fn(), runOutsideAngular: (fn) => fn() };
4941
+ _zone;
4942
+ constructor() {
4943
+ const zone = inject(NgZone, { optional: true });
4944
+ this._zone = zone ?? { run: (fn) => fn(), runOutsideAngular: (fn) => fn() };
4945
+ }
4940
4946
  // ─── Resolved options ─────────────────────────────────────────────────────
4941
4947
  get _type() { return this._opts.type ?? 'info'; }
4942
4948
  _icon = signal(ALERT_ICON_MAP[this._type], ...(ngDevMode ? [{ debugName: "_icon" }] : []));
@@ -5157,7 +5163,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
5157
5163
  }
5158
5164
  </div>
5159
5165
  `, styles: ["clx-alert{display:flex;align-items:center;justify-content:center;width:100%}.clx-alert-card{will-change:transform,opacity}\n"] }]
5160
- }] });
5166
+ }], ctorParameters: () => [] });
5161
5167
 
5162
5168
  const MODAL_SIZE_MAP = {
5163
5169
  sm: 'w-full max-w-[400px]',
@@ -5984,7 +5990,11 @@ class ClxToastComponent {
5984
5990
  dismiss = output();
5985
5991
  _animate = inject(ClxAnimateService);
5986
5992
  _el = inject((ElementRef));
5987
- _zone = inject(NgZone, { optional: true }) ?? { run: (fn) => fn(), runOutsideAngular: (fn) => fn() };
5993
+ _zone;
5994
+ constructor() {
5995
+ const zone = inject(NgZone, { optional: true });
5996
+ this._zone = zone ?? { run: (fn) => fn(), runOutsideAngular: (fn) => fn() };
5997
+ }
5988
5998
  // ─── Timer state ──────────────────────────────────────────────────────────
5989
5999
  _progressPct = signal(100, ...(ngDevMode ? [{ debugName: "_progressPct" }] : []));
5990
6000
  _timerHandle = null;
@@ -6204,7 +6214,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
6204
6214
  }
6205
6215
  </div>
6206
6216
  `, styles: ["clx-toast{display:block;width:100%}.clx-toast-card{will-change:transform,opacity}\n"] }]
6207
- }], propDecorators: { entry: [{ type: i0.Input, args: [{ isSignal: true, alias: "entry", required: true }] }], dismiss: [{ type: i0.Output, args: ["dismiss"] }] } });
6217
+ }], ctorParameters: () => [], propDecorators: { entry: [{ type: i0.Input, args: [{ isSignal: true, alias: "entry", required: true }] }], dismiss: [{ type: i0.Output, args: ["dismiss"] }] } });
6208
6218
 
6209
6219
  class ClxToastContainerComponent {
6210
6220
  entries = model([], ...(ngDevMode ? [{ debugName: "entries" }] : []));
@@ -9066,7 +9076,7 @@ class ClxEditorComponent {
9066
9076
  _sourceEl;
9067
9077
  // ── Services ─────────────────────────────────────────────────────────────
9068
9078
  _cdr = inject(ChangeDetectorRef);
9069
- _zone = inject(NgZone, { optional: true }) ?? { run: (fn) => fn(), runOutsideAngular: (fn) => fn() };
9079
+ _zone;
9070
9080
  _destroyRef = inject(DestroyRef);
9071
9081
  _modal = inject(ClxModalService);
9072
9082
  // ── Select options ────────────────────────────────────────────────────────
@@ -9090,6 +9100,10 @@ class ClxEditorComponent {
9090
9100
  _copiedTimer = null;
9091
9101
  _onChange = () => { };
9092
9102
  _onTouched = () => { };
9103
+ constructor() {
9104
+ const zone = inject(NgZone, { optional: true });
9105
+ this._zone = zone ?? { run: (fn) => fn(), runOutsideAngular: (fn) => fn() };
9106
+ }
9093
9107
  // ── Lifecycle ─────────────────────────────────────────────────────────────
9094
9108
  ngAfterViewInit() {
9095
9109
  document.execCommand('defaultParagraphSeparator', false, 'p');
@@ -9727,7 +9741,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
9727
9741
  <p [class]="_sizeCfg().hint + ' text-gray-400'">{{ hint() }}</p>
9728
9742
  }
9729
9743
  `, host: { class: 'flex flex-col gap-1.5' }, styles: [".clx-editor-body:empty:before{content:attr(data-placeholder);color:#9ca3af;pointer-events:none}.clx-editor-body:focus{outline:none}.clx-editor-body p{margin:0 0 .4em}.clx-editor-body p:last-child{margin-bottom:0}.clx-editor-body h1{font-size:1.5em;font-weight:700;margin:.5em 0}.clx-editor-body h2{font-size:1.25em;font-weight:600;margin:.5em 0}.clx-editor-body h3{font-size:1.1em;font-weight:600;margin:.5em 0}.clx-editor-body ul,.clx-editor-body ol{padding-left:1.5em;margin:.35em 0}.clx-editor-body li{margin:.1em 0}.clx-editor-body blockquote{border-left:3px solid #e2e8f0;padding-left:.75em;color:#64748b;margin:.4em 0}.clx-editor-body code{background:#f1f5f9;border-radius:3px;padding:.1em .3em;font-size:.875em;font-family:ui-monospace,monospace}.clx-editor-body a{color:#6366f1;text-decoration:underline}.clx-editor-body hr{border:none;border-top:1px solid #e2e8f0;margin:.6em 0}.clx-editor-color-btn{position:relative;overflow:hidden}.clx-editor-color-btn input[type=color]{position:absolute;inset:0;opacity:0;width:100%;height:100%;cursor:pointer;border:none;padding:0}.clx-editor-toolbar-select clx-select .flex.flex-col{gap:0!important}.clx-editor-source{width:100%;resize:none;border:none;outline:none;background:#0f172a;color:#e2e8f0;font-family:ui-monospace,Cascadia Code,Fira Code,monospace;font-size:.8125rem;line-height:1.6;padding:1rem;tab-size:2}\n"] }]
9730
- }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], statusMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "statusMessage", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], _bodyEl: [{
9744
+ }], ctorParameters: () => [], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], statusMessage: [{ type: i0.Input, args: [{ isSignal: true, alias: "statusMessage", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], _bodyEl: [{
9731
9745
  type: ViewChild,
9732
9746
  args: ['bodyEl', { static: false }]
9733
9747
  }], _sourceEl: [{
@@ -10882,7 +10896,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
10882
10896
  }] } });
10883
10897
 
10884
10898
  class ClxAppLayoutComponent {
10885
- _zone = inject(NgZone, { optional: true }) ?? { run: (fn) => fn(), runOutsideAngular: (fn) => fn() };
10899
+ _zone;
10886
10900
  _document = inject(DOCUMENT);
10887
10901
  activeColor = input('indigo', ...(ngDevMode ? [{ debugName: "activeColor" }] : []));
10888
10902
  _sidebarOpen = signal(false, ...(ngDevMode ? [{ debugName: "_sidebarOpen" }] : []));
@@ -10891,6 +10905,10 @@ class ClxAppLayoutComponent {
10891
10905
  _isMobile = signal(true, ...(ngDevMode ? [{ debugName: "_isMobile" }] : []));
10892
10906
  collapsedChange = output();
10893
10907
  expandedChange = output();
10908
+ constructor() {
10909
+ const zone = inject(NgZone, { optional: true });
10910
+ this._zone = zone ?? { run: (fn) => fn(), runOutsideAngular: (fn) => fn() };
10911
+ }
10894
10912
  _showBackdrop = computed(() => this._sidebarOpen() && this._isMobile(), ...(ngDevMode ? [{ debugName: "_showBackdrop" }] : []));
10895
10913
  _isExpanded = computed(() => !this.collapsed() || this._hovered(), ...(ngDevMode ? [{ debugName: "_isExpanded" }] : []));
10896
10914
  _sidebarCls = computed(() => {
@@ -11087,7 +11105,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
11087
11105
  changeDetection: ChangeDetectionStrategy.OnPush,
11088
11106
  host: { class: 'flex h-screen overflow-hidden' },
11089
11107
  }]
11090
- }], propDecorators: { activeColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeColor", required: false }] }], collapsedChange: [{ type: i0.Output, args: ["collapsedChange"] }], expandedChange: [{ type: i0.Output, args: ["expandedChange"] }] } });
11108
+ }], ctorParameters: () => [], propDecorators: { activeColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeColor", required: false }] }], collapsedChange: [{ type: i0.Output, args: ["collapsedChange"] }], expandedChange: [{ type: i0.Output, args: ["expandedChange"] }] } });
11091
11109
 
11092
11110
  class ClxBrandComponent {
11093
11111
  logo = input.required(...(ngDevMode ? [{ debugName: "logo" }] : []));
@@ -11471,6 +11489,251 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
11471
11489
  }]
11472
11490
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }] } });
11473
11491
 
11492
+ class ClxProfileComponent {
11493
+ // ── Inputs ──────────────────────────────────────────────────────────────────
11494
+ firstName = input('', ...(ngDevMode ? [{ debugName: "firstName" }] : []));
11495
+ lastName = input('', ...(ngDevMode ? [{ debugName: "lastName" }] : []));
11496
+ username = input('', ...(ngDevMode ? [{ debugName: "username" }] : []));
11497
+ role = input('', ...(ngDevMode ? [{ debugName: "role" }] : []));
11498
+ avatarSrc = input(null, ...(ngDevMode ? [{ debugName: "avatarSrc" }] : []));
11499
+ color = input('indigo', ...(ngDevMode ? [{ debugName: "color" }] : []));
11500
+ menuItems = input([], ...(ngDevMode ? [{ debugName: "menuItems" }] : []));
11501
+ signOutLabel = input('Cerrar sesión', ...(ngDevMode ? [{ debugName: "signOutLabel" }] : []));
11502
+ // ── Outputs ─────────────────────────────────────────────────────────────────
11503
+ menuAction = output();
11504
+ signOut = output();
11505
+ // ── CDK Overlay ─────────────────────────────────────────────────────────────
11506
+ _sso = inject(ScrollStrategyOptions);
11507
+ _scrollStrategy = this._sso.reposition();
11508
+ _positions = [
11509
+ { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetY: 8 },
11510
+ { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetY: -8 },
11511
+ ];
11512
+ // ── State ────────────────────────────────────────────────────────────────────
11513
+ _isOpen = signal(false, ...(ngDevMode ? [{ debugName: "_isOpen" }] : []));
11514
+ // ── Computed ─────────────────────────────────────────────────────────────────
11515
+ fullName = computed(() => `${this.firstName()} ${this.lastName()}`.trim() || this.username(), ...(ngDevMode ? [{ debugName: "fullName" }] : []));
11516
+ _initials = computed(() => {
11517
+ const f = this.firstName().charAt(0).toUpperCase();
11518
+ const l = this.lastName().charAt(0).toUpperCase();
11519
+ return f && l ? `${f}${l}` : (f || this.username().charAt(0).toUpperCase());
11520
+ }, ...(ngDevMode ? [{ debugName: "_initials" }] : []));
11521
+ _ringClass = computed(() => {
11522
+ const t = resolveColor(this.color());
11523
+ return `focus-visible:${t.ringBase}`;
11524
+ }, ...(ngDevMode ? [{ debugName: "_ringClass" }] : []));
11525
+ _headerBgClass = computed(() => {
11526
+ const t = resolveColor(this.color());
11527
+ return `${t.bgSubtle}`;
11528
+ }, ...(ngDevMode ? [{ debugName: "_headerBgClass" }] : []));
11529
+ _badgeClass = computed(() => {
11530
+ const t = resolveColor(this.color());
11531
+ return `${t.bgSubtle} ${t.textSubtle}`;
11532
+ }, ...(ngDevMode ? [{ debugName: "_badgeClass" }] : []));
11533
+ _itemHoverClass = computed(() => {
11534
+ const t = resolveColor(this.color());
11535
+ return t.hoverBgSubtle;
11536
+ }, ...(ngDevMode ? [{ debugName: "_itemHoverClass" }] : []));
11537
+ _signOutClass = computed(() => 'text-red-600 hover:text-red-700 hover:bg-red-50', ...(ngDevMode ? [{ debugName: "_signOutClass" }] : []));
11538
+ // ── Methods ──────────────────────────────────────────────────────────────────
11539
+ _toggle() { this._isOpen.update(v => !v); }
11540
+ _close() { this._isOpen.set(false); }
11541
+ _onKeydown(event) {
11542
+ if (event.key === 'Escape')
11543
+ this._close();
11544
+ }
11545
+ _onAction(action) {
11546
+ this.menuAction.emit(action);
11547
+ this._close();
11548
+ }
11549
+ _onSignOut() {
11550
+ this.signOut.emit();
11551
+ this._close();
11552
+ }
11553
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: ClxProfileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11554
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.23", type: ClxProfileComponent, isStandalone: true, selector: "clx-profile", inputs: { firstName: { classPropertyName: "firstName", publicName: "firstName", isSignal: true, isRequired: false, transformFunction: null }, lastName: { classPropertyName: "lastName", publicName: "lastName", isSignal: true, isRequired: false, transformFunction: null }, username: { classPropertyName: "username", publicName: "username", isSignal: true, isRequired: false, transformFunction: null }, role: { classPropertyName: "role", publicName: "role", isSignal: true, isRequired: false, transformFunction: null }, avatarSrc: { classPropertyName: "avatarSrc", publicName: "avatarSrc", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, menuItems: { classPropertyName: "menuItems", publicName: "menuItems", isSignal: true, isRequired: false, transformFunction: null }, signOutLabel: { classPropertyName: "signOutLabel", publicName: "signOutLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { menuAction: "menuAction", signOut: "signOut" }, host: { classAttribute: "relative inline-flex items-center" }, ngImport: i0, template: `
11555
+ <!-- ── Trigger ─────────────────────────────────────────────────────────── -->
11556
+ <button
11557
+ #origin="cdkOverlayOrigin"
11558
+ cdkOverlayOrigin
11559
+ type="button"
11560
+ class="flex items-center gap-2 rounded-full focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 cursor-pointer"
11561
+ [class]="_ringClass()"
11562
+ (click)="_toggle()">
11563
+ <clx-avatar
11564
+ [initials]="_initials()"
11565
+ [src]="avatarSrc()"
11566
+ [color]="color()"
11567
+ size="sm" />
11568
+ </button>
11569
+
11570
+ <!-- ── Overlay panel ─────────────────────────────────────────────────── -->
11571
+ <ng-template
11572
+ cdkConnectedOverlay
11573
+ [cdkConnectedOverlayOrigin]="origin"
11574
+ [cdkConnectedOverlayOpen]="_isOpen()"
11575
+ [cdkConnectedOverlayPositions]="_positions"
11576
+ [cdkConnectedOverlayScrollStrategy]="_scrollStrategy"
11577
+ [cdkConnectedOverlayPush]="true"
11578
+ (overlayOutsideClick)="_close()"
11579
+ (overlayKeydown)="_onKeydown($event)">
11580
+
11581
+ <div class="w-64 bg-white rounded-2xl shadow-xl border border-slate-200 overflow-hidden mt-2">
11582
+
11583
+ <!-- Header: avatar + name + role -->
11584
+ <div class="px-4 py-4 flex items-center gap-3" [class]="_headerBgClass()">
11585
+ <clx-avatar
11586
+ [initials]="_initials()"
11587
+ [src]="avatarSrc()"
11588
+ [color]="color()"
11589
+ size="md" />
11590
+ <div class="flex-1 min-w-0">
11591
+ <p class="text-sm font-semibold text-slate-800 truncate">{{ fullName() }}</p>
11592
+ <p class="text-xs text-slate-500 truncate">{{ username() }}</p>
11593
+ @if (role()) {
11594
+ <span class="inline-flex items-center mt-1 px-2 py-0.5 rounded-full text-xs font-medium"
11595
+ [class]="_badgeClass()">
11596
+ {{ role() }}
11597
+ </span>
11598
+ }
11599
+ </div>
11600
+ </div>
11601
+
11602
+ <!-- Divider -->
11603
+ <div class="border-t border-slate-100"></div>
11604
+
11605
+ <!-- Menu items -->
11606
+ @if (menuItems().length) {
11607
+ <div class="p-1.5">
11608
+ @for (item of menuItems(); track item.action) {
11609
+ <button
11610
+ type="button"
11611
+ class="w-full flex items-center gap-3 px-3 py-2.5 rounded-xl text-sm text-slate-700 hover:text-slate-900 transition-colors text-left group"
11612
+ [class]="_itemHoverClass()"
11613
+ (click)="_onAction(item.action)">
11614
+ <span clx-icon [name]="item.icon" size="sm"
11615
+ class="text-slate-400 group-hover:text-slate-600 transition-colors"></span>
11616
+ {{ item.label }}
11617
+ </button>
11618
+ }
11619
+ </div>
11620
+ <!-- Divider before signout -->
11621
+ <div class="border-t border-slate-100 mx-3"></div>
11622
+ }
11623
+
11624
+ <!-- Sign out -->
11625
+ <div class="p-1.5">
11626
+ <button
11627
+ type="button"
11628
+ class="w-full flex items-center gap-3 px-3 py-2.5 rounded-xl text-sm font-medium transition-colors text-left"
11629
+ [class]="_signOutClass()"
11630
+ (click)="_onSignOut()">
11631
+ <span clx-icon name="logout" size="sm"></span>
11632
+ {{ signOutLabel() }}
11633
+ </button>
11634
+ </div>
11635
+
11636
+ </div>
11637
+ </ng-template>
11638
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1$1.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$1.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: ClxIconComponent, selector: "span[clx-icon]", inputs: ["name", "size", "color", "fill"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
11639
+ }
11640
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImport: i0, type: ClxProfileComponent, decorators: [{
11641
+ type: Component,
11642
+ args: [{
11643
+ selector: 'clx-profile',
11644
+ standalone: true,
11645
+ imports: [OverlayModule, ClxAvatarComponent, ClxIconComponent, ClxButtonComponent],
11646
+ template: `
11647
+ <!-- ── Trigger ─────────────────────────────────────────────────────────── -->
11648
+ <button
11649
+ #origin="cdkOverlayOrigin"
11650
+ cdkOverlayOrigin
11651
+ type="button"
11652
+ class="flex items-center gap-2 rounded-full focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 cursor-pointer"
11653
+ [class]="_ringClass()"
11654
+ (click)="_toggle()">
11655
+ <clx-avatar
11656
+ [initials]="_initials()"
11657
+ [src]="avatarSrc()"
11658
+ [color]="color()"
11659
+ size="sm" />
11660
+ </button>
11661
+
11662
+ <!-- ── Overlay panel ─────────────────────────────────────────────────── -->
11663
+ <ng-template
11664
+ cdkConnectedOverlay
11665
+ [cdkConnectedOverlayOrigin]="origin"
11666
+ [cdkConnectedOverlayOpen]="_isOpen()"
11667
+ [cdkConnectedOverlayPositions]="_positions"
11668
+ [cdkConnectedOverlayScrollStrategy]="_scrollStrategy"
11669
+ [cdkConnectedOverlayPush]="true"
11670
+ (overlayOutsideClick)="_close()"
11671
+ (overlayKeydown)="_onKeydown($event)">
11672
+
11673
+ <div class="w-64 bg-white rounded-2xl shadow-xl border border-slate-200 overflow-hidden mt-2">
11674
+
11675
+ <!-- Header: avatar + name + role -->
11676
+ <div class="px-4 py-4 flex items-center gap-3" [class]="_headerBgClass()">
11677
+ <clx-avatar
11678
+ [initials]="_initials()"
11679
+ [src]="avatarSrc()"
11680
+ [color]="color()"
11681
+ size="md" />
11682
+ <div class="flex-1 min-w-0">
11683
+ <p class="text-sm font-semibold text-slate-800 truncate">{{ fullName() }}</p>
11684
+ <p class="text-xs text-slate-500 truncate">{{ username() }}</p>
11685
+ @if (role()) {
11686
+ <span class="inline-flex items-center mt-1 px-2 py-0.5 rounded-full text-xs font-medium"
11687
+ [class]="_badgeClass()">
11688
+ {{ role() }}
11689
+ </span>
11690
+ }
11691
+ </div>
11692
+ </div>
11693
+
11694
+ <!-- Divider -->
11695
+ <div class="border-t border-slate-100"></div>
11696
+
11697
+ <!-- Menu items -->
11698
+ @if (menuItems().length) {
11699
+ <div class="p-1.5">
11700
+ @for (item of menuItems(); track item.action) {
11701
+ <button
11702
+ type="button"
11703
+ class="w-full flex items-center gap-3 px-3 py-2.5 rounded-xl text-sm text-slate-700 hover:text-slate-900 transition-colors text-left group"
11704
+ [class]="_itemHoverClass()"
11705
+ (click)="_onAction(item.action)">
11706
+ <span clx-icon [name]="item.icon" size="sm"
11707
+ class="text-slate-400 group-hover:text-slate-600 transition-colors"></span>
11708
+ {{ item.label }}
11709
+ </button>
11710
+ }
11711
+ </div>
11712
+ <!-- Divider before signout -->
11713
+ <div class="border-t border-slate-100 mx-3"></div>
11714
+ }
11715
+
11716
+ <!-- Sign out -->
11717
+ <div class="p-1.5">
11718
+ <button
11719
+ type="button"
11720
+ class="w-full flex items-center gap-3 px-3 py-2.5 rounded-xl text-sm font-medium transition-colors text-left"
11721
+ [class]="_signOutClass()"
11722
+ (click)="_onSignOut()">
11723
+ <span clx-icon name="logout" size="sm"></span>
11724
+ {{ signOutLabel() }}
11725
+ </button>
11726
+ </div>
11727
+
11728
+ </div>
11729
+ </ng-template>
11730
+ `,
11731
+ encapsulation: ViewEncapsulation.None,
11732
+ changeDetection: ChangeDetectionStrategy.OnPush,
11733
+ host: { class: 'relative inline-flex items-center' },
11734
+ }]
11735
+ }], propDecorators: { firstName: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstName", required: false }] }], lastName: [{ type: i0.Input, args: [{ isSignal: true, alias: "lastName", required: false }] }], username: [{ type: i0.Input, args: [{ isSignal: true, alias: "username", required: false }] }], role: [{ type: i0.Input, args: [{ isSignal: true, alias: "role", required: false }] }], avatarSrc: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatarSrc", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], menuItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuItems", required: false }] }], signOutLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "signOutLabel", required: false }] }], menuAction: [{ type: i0.Output, args: ["menuAction"] }], signOut: [{ type: i0.Output, args: ["signOut"] }] } });
11736
+
11474
11737
  // ── Base classes ─────────────────────────────────────────────────────────────
11475
11738
  const TABLE_BASE_CLASS = 'w-full text-left border-collapse text-sm';
11476
11739
  const TABLE_HEADER_CELL_CLASS = 'px-4 py-3 font-semibold whitespace-nowrap';
@@ -14089,5 +14352,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.23", ngImpo
14089
14352
  * Generated bundle index. Do not edit.
14090
14353
  */
14091
14354
 
14092
- export { CLX_ALERT_OPTIONS, CLX_ALERT_RESOLVE, CLX_COLOR_HEX, CLX_COLOR_MAP, CLX_MODAL_ANIM_CONFIG, CLX_MODAL_DATA, CLX_MODAL_REF, CLX_RADIO_GROUP, CLX_TOAST_DEFAULTS, ClxAlertComponent, ClxAlertService, ClxAnimateDirective, ClxAnimateGroupDirective, ClxAnimateService, ClxAppLayoutComponent, ClxAvatarComponent, ClxBadgeComponent, ClxBrandComponent, ClxButtonComponent, ClxButtonGroupComponent, ClxCardBodyDirective, ClxCardComponent, ClxCardFooterDirective, ClxCardHeaderDirective, ClxCarouselComponent, ClxCarouselDirective, ClxCartComponent, ClxCartSummaryDrawer, ClxCellDirective, ClxChartComponent, ClxCheckboxComponent, ClxColorPickerComponent, ClxColumnDefDirective, ClxDateRangePickerComponent, ClxDatepickerComponent, ClxDrawerComponent, ClxDrawerService, ClxEditorComponent, ClxEditorLinkModalComponent, ClxFilterPanelComponent, ClxHeaderCellDirective, ClxIconComponent, ClxInputComponent, ClxListComponent, ClxListItemComponent, ClxMenuComponent, ClxMenuItemComponent, ClxModalComponent, ClxModalService, ClxNavGroupComponent, ClxNumberComponent, ClxPageEmptyComponent, ClxPageNotFoundComponent, ClxPageServerErrorComponent, ClxPageUnauthorizedComponent, ClxPaginationComponent, ClxProductComponent, ClxProductDetailComponent, ClxProgressBarComponent, ClxRadioComponent, ClxRadioGroupComponent, ClxRatingComponent, ClxSelectComponent, ClxSkeletonComponent, ClxSliderComponent, ClxSpinnerComponent, ClxStatCardComponent, ClxStepComponent, ClxStepperComponent, ClxSwitchComponent, ClxTabDirective, ClxTableComponent, ClxTabsComponent, ClxTagComponent, ClxTextareaComponent, ClxTimelineComponent, ClxTimelineItemComponent, ClxToastComponent, ClxToastContainerComponent, ClxToastService, ClxTooltipComponent, ClxTooltipDirective, ClxTreeComponent, ClxUploadComponent, ClxWishlistComponent, ClxWizardComponent, parseColorInput, resolveColor };
14355
+ export { CLX_ALERT_OPTIONS, CLX_ALERT_RESOLVE, CLX_COLOR_HEX, CLX_COLOR_MAP, CLX_MODAL_ANIM_CONFIG, CLX_MODAL_DATA, CLX_MODAL_REF, CLX_RADIO_GROUP, CLX_TOAST_DEFAULTS, ClxAlertComponent, ClxAlertService, ClxAnimateDirective, ClxAnimateGroupDirective, ClxAnimateService, ClxAppLayoutComponent, ClxAvatarComponent, ClxBadgeComponent, ClxBrandComponent, ClxButtonComponent, ClxButtonGroupComponent, ClxCardBodyDirective, ClxCardComponent, ClxCardFooterDirective, ClxCardHeaderDirective, ClxCarouselComponent, ClxCarouselDirective, ClxCartComponent, ClxCartSummaryDrawer, ClxCellDirective, ClxChartComponent, ClxCheckboxComponent, ClxColorPickerComponent, ClxColumnDefDirective, ClxDateRangePickerComponent, ClxDatepickerComponent, ClxDrawerComponent, ClxDrawerService, ClxEditorComponent, ClxEditorLinkModalComponent, 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, ClxTimelineComponent, ClxTimelineItemComponent, ClxToastComponent, ClxToastContainerComponent, ClxToastService, ClxTooltipComponent, ClxTooltipDirective, ClxTreeComponent, ClxUploadComponent, ClxWishlistComponent, ClxWizardComponent, parseColorInput, resolveColor };
14093
14356
  //# sourceMappingURL=codexly-ui.mjs.map