@xosue-utils/helpers 0.2.0 → 0.2.3

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.
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, Injector, signal, computed, effect, Input, Component, input, output } from '@angular/core';
3
- import { Router, ActivatedRoute } from '@angular/router';
2
+ import { inject, Injector, signal, computed, effect, Input, Component, input, output, booleanAttribute, model, forwardRef, contentChildren } from '@angular/core';
3
+ import { Router, ActivatedRoute, RouterLink } from '@angular/router';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import { Subscription } from 'rxjs';
6
6
  import { LucideIconComponent, TextBtnComponent } from '@xosue-utils/actions';
@@ -136,12 +136,12 @@ class SmartPaginationComponent {
136
136
  ngOnDestroy() {
137
137
  this.queryParamsSub.unsubscribe();
138
138
  }
139
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: SmartPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
140
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.11", type: SmartPaginationComponent, isStandalone: true, selector: "smart-pagination", inputs: { resetOnChanges: "resetOnChanges", paramName: "paramName", emptyLabel: "emptyLabel", singlePageLabel: "singlePageLabel", data: "data" }, ngImport: i0, template: "@if (paginationData() && paginationData().total === 0) {\r\n <p class=\"NonResults\">{{ emptyLabel }}</p>\r\n} @else if (paginationData() && paginationData().last_page > 1) {\r\n <nav class=\"pagination\" aria-label=\"Paginaci\u00F3n\">\r\n @if (currentPage() > 1) {\r\n <button type=\"button\" (click)=\"goToPage(currentPage() - 1)\" aria-label=\"Anterior\">\r\n <lucide-icon name=\"chevron-left\" [size]=\"16\"></lucide-icon>\r\n </button>\r\n }\r\n\r\n @for (p of pagesToDisplay(); track $index) {\r\n @if (isPage(p)) {\r\n <a\r\n [class.active]=\"p === currentPage()\"\r\n [href]=\"generateHref(p)\"\r\n (click)=\"goToPage(p); $event.preventDefault()\"\r\n >\r\n {{ p }}\r\n </a>\r\n } @else {\r\n <span class=\"ellipsis\">\u2026</span>\r\n }\r\n }\r\n\r\n @if (currentPage() < lastPage()) {\r\n <button type=\"button\" (click)=\"goToPage(currentPage() + 1)\" aria-label=\"Siguiente\">\r\n <lucide-icon name=\"chevron-right\" [size]=\"16\"></lucide-icon>\r\n </button>\r\n }\r\n </nav>\r\n} @else {\r\n <p class=\"UniquePage\">{{ singlePageLabel }}</p>\r\n}\r\n", styles: [":host{width:max-content;height:32px;display:flex}.pagination{width:max-content;max-width:280px;height:32px;display:flex;align-items:center;gap:4px;background-color:var(--surface-2, var(--surface));border-radius:var(--radius-lg, 12px);padding:2px;border:1px solid var(--border)}.pagination a,.pagination button{min-width:28px;height:28px;padding:2px 8px;font-size:.8125rem;font-weight:500;cursor:pointer;border:none;background-color:transparent;color:var(--text-muted);border-radius:var(--radius-md, 8px);display:flex;justify-content:center;align-items:center;text-decoration:none;transition:background-color .15s ease,color .15s ease,transform .1s ease}.pagination a:hover,.pagination button:hover{background-color:color-mix(in srgb,var(--surface) 80%,var(--border));color:var(--text-base)}.pagination a:active,.pagination button:active{transform:scale(.98)}.pagination a.active,.pagination button.active{background-color:var(--surface);color:var(--text-base);font-weight:700;box-shadow:0 1px 2px color-mix(in srgb,var(--text-base) 12%,transparent)}.pagination .ellipsis{display:flex;align-items:center;justify-content:center;width:max-content;padding:0 2px;color:var(--text-muted)}.NonResults,.UniquePage{width:max-content;max-width:280px;height:32px;display:flex;align-items:center;gap:4px;background-color:var(--surface-2, var(--surface));border-radius:var(--radius-lg, 12px);padding:4px 8px;border:1px solid var(--border);color:var(--text-muted);margin:0;font-size:.8125rem}\n"], dependencies: [{ kind: "component", type: LucideIconComponent, selector: "lucide-icon", inputs: ["name", "size", "spin", "filled"] }, { kind: "ngmodule", type: CommonModule }] });
139
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SmartPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
140
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: SmartPaginationComponent, isStandalone: true, selector: "smart-pagination", inputs: { resetOnChanges: "resetOnChanges", paramName: "paramName", emptyLabel: "emptyLabel", singlePageLabel: "singlePageLabel", data: "data" }, ngImport: i0, template: "@if (paginationData() && paginationData().total === 0) {\r\n <p class=\"NonResults\">{{ emptyLabel }}</p>\r\n} @else if (paginationData() && paginationData().last_page > 1) {\r\n <nav class=\"pagination\" aria-label=\"Paginaci\u00F3n\">\r\n @if (currentPage() > 1) {\r\n <button type=\"button\" (click)=\"goToPage(currentPage() - 1)\" aria-label=\"Anterior\">\r\n <lucide-icon name=\"chevron-left\" [size]=\"14\"></lucide-icon>\r\n </button>\r\n }\r\n\r\n @for (p of pagesToDisplay(); track $index) {\r\n @if (isPage(p)) {\r\n <a\r\n [class.active]=\"p === currentPage()\"\r\n [href]=\"generateHref(p)\"\r\n (click)=\"goToPage(p); $event.preventDefault()\"\r\n >\r\n {{ p }}\r\n </a>\r\n } @else {\r\n <span class=\"ellipsis\">\u2026</span>\r\n }\r\n }\r\n\r\n @if (currentPage() < lastPage()) {\r\n <button type=\"button\" (click)=\"goToPage(currentPage() + 1)\" aria-label=\"Siguiente\">\r\n <lucide-icon name=\"chevron-right\" [size]=\"14\"></lucide-icon>\r\n </button>\r\n }\r\n </nav>\r\n} @else {\r\n <p class=\"UniquePage\">{{ singlePageLabel }}</p>\r\n}\r\n", styles: [":host{width:max-content;height:32px;display:flex;user-select:none;-webkit-user-select:none}.pagination{width:max-content;max-width:280px;height:32px;display:flex;align-items:center;gap:4px;background-color:var(--color-surface-muted, var(--color-surface));border-radius:var(--radius-lg, 12px);padding:2px;border:1px solid var(--color-border, #e5e5e5)}.pagination a,.pagination button{min-width:28px;height:28px;padding:2px 8px;font-size:14px;font-weight:400;cursor:pointer;border:none;background-color:transparent;color:var(--color-fg-muted, #a3a3a3);border-radius:var(--radius-md, 8px);display:flex;justify-content:center;align-items:center;text-decoration:none;transition:background-color .15s ease,color .15s ease,transform .1s ease}.pagination a:hover,.pagination button:hover{background-color:color-mix(in srgb,var(--color-surface, #ffffff) 80%,var(--color-border, #e5e5e5));color:var(--color-fg, #171717)}.pagination a:active,.pagination button:active{transform:scale(.98)}.pagination a.active,.pagination button.active{background-color:var(--color-surface, #ffffff);color:var(--color-fg, #171717);font-weight:400;box-shadow:0 1px 2px color-mix(in srgb,var(--color-fg, #171717) 12%,transparent)}.pagination .ellipsis{display:flex;align-items:center;justify-content:center;width:max-content;padding:0 2px;color:var(--color-fg-muted, #a3a3a3)}.NonResults,.UniquePage{width:max-content;max-width:280px;height:32px;display:flex;align-items:center;gap:4px;background-color:var(--color-surface-muted, var(--color-surface));border-radius:var(--radius-lg, 12px);padding:4px 8px;border:1px solid var(--color-border, #e5e5e5);color:var(--color-fg-muted, #a3a3a3);margin:0;font-size:14px}\n"], dependencies: [{ kind: "component", type: LucideIconComponent, selector: "lucide-icon", inputs: ["name", "size", "spin", "filled"] }, { kind: "ngmodule", type: CommonModule }] });
141
141
  }
142
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: SmartPaginationComponent, decorators: [{
142
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SmartPaginationComponent, decorators: [{
143
143
  type: Component,
144
- args: [{ selector: 'smart-pagination', standalone: true, imports: [LucideIconComponent, CommonModule], template: "@if (paginationData() && paginationData().total === 0) {\r\n <p class=\"NonResults\">{{ emptyLabel }}</p>\r\n} @else if (paginationData() && paginationData().last_page > 1) {\r\n <nav class=\"pagination\" aria-label=\"Paginaci\u00F3n\">\r\n @if (currentPage() > 1) {\r\n <button type=\"button\" (click)=\"goToPage(currentPage() - 1)\" aria-label=\"Anterior\">\r\n <lucide-icon name=\"chevron-left\" [size]=\"16\"></lucide-icon>\r\n </button>\r\n }\r\n\r\n @for (p of pagesToDisplay(); track $index) {\r\n @if (isPage(p)) {\r\n <a\r\n [class.active]=\"p === currentPage()\"\r\n [href]=\"generateHref(p)\"\r\n (click)=\"goToPage(p); $event.preventDefault()\"\r\n >\r\n {{ p }}\r\n </a>\r\n } @else {\r\n <span class=\"ellipsis\">\u2026</span>\r\n }\r\n }\r\n\r\n @if (currentPage() < lastPage()) {\r\n <button type=\"button\" (click)=\"goToPage(currentPage() + 1)\" aria-label=\"Siguiente\">\r\n <lucide-icon name=\"chevron-right\" [size]=\"16\"></lucide-icon>\r\n </button>\r\n }\r\n </nav>\r\n} @else {\r\n <p class=\"UniquePage\">{{ singlePageLabel }}</p>\r\n}\r\n", styles: [":host{width:max-content;height:32px;display:flex}.pagination{width:max-content;max-width:280px;height:32px;display:flex;align-items:center;gap:4px;background-color:var(--surface-2, var(--surface));border-radius:var(--radius-lg, 12px);padding:2px;border:1px solid var(--border)}.pagination a,.pagination button{min-width:28px;height:28px;padding:2px 8px;font-size:.8125rem;font-weight:500;cursor:pointer;border:none;background-color:transparent;color:var(--text-muted);border-radius:var(--radius-md, 8px);display:flex;justify-content:center;align-items:center;text-decoration:none;transition:background-color .15s ease,color .15s ease,transform .1s ease}.pagination a:hover,.pagination button:hover{background-color:color-mix(in srgb,var(--surface) 80%,var(--border));color:var(--text-base)}.pagination a:active,.pagination button:active{transform:scale(.98)}.pagination a.active,.pagination button.active{background-color:var(--surface);color:var(--text-base);font-weight:700;box-shadow:0 1px 2px color-mix(in srgb,var(--text-base) 12%,transparent)}.pagination .ellipsis{display:flex;align-items:center;justify-content:center;width:max-content;padding:0 2px;color:var(--text-muted)}.NonResults,.UniquePage{width:max-content;max-width:280px;height:32px;display:flex;align-items:center;gap:4px;background-color:var(--surface-2, var(--surface));border-radius:var(--radius-lg, 12px);padding:4px 8px;border:1px solid var(--border);color:var(--text-muted);margin:0;font-size:.8125rem}\n"] }]
144
+ args: [{ selector: 'smart-pagination', standalone: true, imports: [LucideIconComponent, CommonModule], template: "@if (paginationData() && paginationData().total === 0) {\r\n <p class=\"NonResults\">{{ emptyLabel }}</p>\r\n} @else if (paginationData() && paginationData().last_page > 1) {\r\n <nav class=\"pagination\" aria-label=\"Paginaci\u00F3n\">\r\n @if (currentPage() > 1) {\r\n <button type=\"button\" (click)=\"goToPage(currentPage() - 1)\" aria-label=\"Anterior\">\r\n <lucide-icon name=\"chevron-left\" [size]=\"14\"></lucide-icon>\r\n </button>\r\n }\r\n\r\n @for (p of pagesToDisplay(); track $index) {\r\n @if (isPage(p)) {\r\n <a\r\n [class.active]=\"p === currentPage()\"\r\n [href]=\"generateHref(p)\"\r\n (click)=\"goToPage(p); $event.preventDefault()\"\r\n >\r\n {{ p }}\r\n </a>\r\n } @else {\r\n <span class=\"ellipsis\">\u2026</span>\r\n }\r\n }\r\n\r\n @if (currentPage() < lastPage()) {\r\n <button type=\"button\" (click)=\"goToPage(currentPage() + 1)\" aria-label=\"Siguiente\">\r\n <lucide-icon name=\"chevron-right\" [size]=\"14\"></lucide-icon>\r\n </button>\r\n }\r\n </nav>\r\n} @else {\r\n <p class=\"UniquePage\">{{ singlePageLabel }}</p>\r\n}\r\n", styles: [":host{width:max-content;height:32px;display:flex;user-select:none;-webkit-user-select:none}.pagination{width:max-content;max-width:280px;height:32px;display:flex;align-items:center;gap:4px;background-color:var(--color-surface-muted, var(--color-surface));border-radius:var(--radius-lg, 12px);padding:2px;border:1px solid var(--color-border, #e5e5e5)}.pagination a,.pagination button{min-width:28px;height:28px;padding:2px 8px;font-size:14px;font-weight:400;cursor:pointer;border:none;background-color:transparent;color:var(--color-fg-muted, #a3a3a3);border-radius:var(--radius-md, 8px);display:flex;justify-content:center;align-items:center;text-decoration:none;transition:background-color .15s ease,color .15s ease,transform .1s ease}.pagination a:hover,.pagination button:hover{background-color:color-mix(in srgb,var(--color-surface, #ffffff) 80%,var(--color-border, #e5e5e5));color:var(--color-fg, #171717)}.pagination a:active,.pagination button:active{transform:scale(.98)}.pagination a.active,.pagination button.active{background-color:var(--color-surface, #ffffff);color:var(--color-fg, #171717);font-weight:400;box-shadow:0 1px 2px color-mix(in srgb,var(--color-fg, #171717) 12%,transparent)}.pagination .ellipsis{display:flex;align-items:center;justify-content:center;width:max-content;padding:0 2px;color:var(--color-fg-muted, #a3a3a3)}.NonResults,.UniquePage{width:max-content;max-width:280px;height:32px;display:flex;align-items:center;gap:4px;background-color:var(--color-surface-muted, var(--color-surface));border-radius:var(--radius-lg, 12px);padding:4px 8px;border:1px solid var(--color-border, #e5e5e5);color:var(--color-fg-muted, #a3a3a3);margin:0;font-size:14px}\n"] }]
145
145
  }], propDecorators: { resetOnChanges: [{
146
146
  type: Input
147
147
  }], paramName: [{
@@ -163,12 +163,12 @@ class EmptyStateComponent {
163
163
  secondaryLabel = input(null);
164
164
  primary = output();
165
165
  secondary = output();
166
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: EmptyStateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
167
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.11", type: EmptyStateComponent, isStandalone: true, selector: "empty-state", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, primaryLabel: { classPropertyName: "primaryLabel", publicName: "primaryLabel", isSignal: true, isRequired: false, transformFunction: null }, primaryIcon: { classPropertyName: "primaryIcon", publicName: "primaryIcon", isSignal: true, isRequired: false, transformFunction: null }, secondaryLabel: { classPropertyName: "secondaryLabel", publicName: "secondaryLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { primary: "primary", secondary: "secondary" }, ngImport: i0, template: `
166
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: EmptyStateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
167
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: EmptyStateComponent, isStandalone: true, selector: "empty-state", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, primaryLabel: { classPropertyName: "primaryLabel", publicName: "primaryLabel", isSignal: true, isRequired: false, transformFunction: null }, primaryIcon: { classPropertyName: "primaryIcon", publicName: "primaryIcon", isSignal: true, isRequired: false, transformFunction: null }, secondaryLabel: { classPropertyName: "secondaryLabel", publicName: "secondaryLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { primary: "primary", secondary: "secondary" }, ngImport: i0, template: `
168
168
  <div class="EmptyState">
169
169
  @if (icon()) {
170
170
  <div class="EmptyState__Icon">
171
- <lucide-icon [name]="icon()!" [size]="36"></lucide-icon>
171
+ <lucide-icon [name]="icon()!" [size]="24"></lucide-icon>
172
172
  </div>
173
173
  }
174
174
  <h3 class="EmptyState__Title">{{ title() }}</h3>
@@ -188,7 +188,7 @@ class EmptyStateComponent {
188
188
  @if (primaryLabel()) {
189
189
  <text-btn
190
190
  [label]="primaryLabel()!"
191
- [icon]="primaryIcon()"
191
+ [icon]="primaryIcon() ?? ''"
192
192
  color="primary"
193
193
  (clicked)="primary.emit($event)"
194
194
  ></text-btn>
@@ -197,15 +197,15 @@ class EmptyStateComponent {
197
197
  }
198
198
  <ng-content></ng-content>
199
199
  </div>
200
- `, isInline: true, styles: [":host{display:block;width:100%}.EmptyState{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px;text-align:center;border-radius:var(--radius-xl, 16px);background:var(--surface-2, var(--surface));border:1px solid var(--border)}.EmptyState__Icon{display:flex;color:var(--text-muted)}.EmptyState__Icon lucide-icon{--lucide-stroke: var(--text-muted)}.EmptyState__Title{margin:0;font-size:1rem;font-weight:600;color:var(--text-base)}.EmptyState__Message{margin:0;max-width:28rem;font-size:.875rem;line-height:1.45;color:var(--text-muted)}.EmptyState__Actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:4px;margin-top:4px}\n"], dependencies: [{ kind: "component", type: LucideIconComponent, selector: "lucide-icon", inputs: ["name", "size", "spin", "filled"] }, { kind: "component", type: TextBtnComponent, selector: "text-btn", inputs: ["label", "icon", "iconPosition", "iconSpin", "layout", "variant", "color", "rounded", "size", "ripple", "disabled", "buttonType", "href", "routerLink", "fit", "width", "textColor", "bgColor", "borderColor", "title"], outputs: ["clicked"] }] });
200
+ `, isInline: true, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.EmptyState{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:28px 16px 20px;text-align:center;border-radius:var(--radius-xl, 16px);background:var(--color-surface-muted, var(--color-surface));border:1px solid var(--color-border, #e5e5e5)}.EmptyState__Icon{display:flex;color:var(--color-fg-muted, #a3a3a3)}.EmptyState__Icon lucide-icon{--lucide-stroke: var(--color-fg-muted, #a3a3a3)}.EmptyState__Title{margin:0;font-size:14px;font-weight:400;color:var(--color-fg, #171717)}.EmptyState__Message{margin:0;max-width:28rem;font-size:14px;line-height:1.45;color:var(--color-fg-muted, #a3a3a3)}.EmptyState__Actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:4px;margin-top:4px}\n"], dependencies: [{ kind: "component", type: LucideIconComponent, selector: "lucide-icon", inputs: ["name", "size", "spin", "filled"] }, { kind: "component", type: TextBtnComponent, selector: "text-btn", inputs: ["label", "icon", "iconPosition", "iconSpin", "layout", "variant", "color", "rounded", "size", "ripple", "disabled", "buttonType", "href", "routerLink", "fit", "width", "textColor", "bgColor", "borderColor", "title"], outputs: ["clicked"] }] });
201
201
  }
202
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: EmptyStateComponent, decorators: [{
202
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: EmptyStateComponent, decorators: [{
203
203
  type: Component,
204
204
  args: [{ selector: 'empty-state', standalone: true, imports: [LucideIconComponent, TextBtnComponent], template: `
205
205
  <div class="EmptyState">
206
206
  @if (icon()) {
207
207
  <div class="EmptyState__Icon">
208
- <lucide-icon [name]="icon()!" [size]="36"></lucide-icon>
208
+ <lucide-icon [name]="icon()!" [size]="24"></lucide-icon>
209
209
  </div>
210
210
  }
211
211
  <h3 class="EmptyState__Title">{{ title() }}</h3>
@@ -225,7 +225,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImpo
225
225
  @if (primaryLabel()) {
226
226
  <text-btn
227
227
  [label]="primaryLabel()!"
228
- [icon]="primaryIcon()"
228
+ [icon]="primaryIcon() ?? ''"
229
229
  color="primary"
230
230
  (clicked)="primary.emit($event)"
231
231
  ></text-btn>
@@ -234,7 +234,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImpo
234
234
  }
235
235
  <ng-content></ng-content>
236
236
  </div>
237
- `, styles: [":host{display:block;width:100%}.EmptyState{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px;text-align:center;border-radius:var(--radius-xl, 16px);background:var(--surface-2, var(--surface));border:1px solid var(--border)}.EmptyState__Icon{display:flex;color:var(--text-muted)}.EmptyState__Icon lucide-icon{--lucide-stroke: var(--text-muted)}.EmptyState__Title{margin:0;font-size:1rem;font-weight:600;color:var(--text-base)}.EmptyState__Message{margin:0;max-width:28rem;font-size:.875rem;line-height:1.45;color:var(--text-muted)}.EmptyState__Actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:4px;margin-top:4px}\n"] }]
237
+ `, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.EmptyState{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:28px 16px 20px;text-align:center;border-radius:var(--radius-xl, 16px);background:var(--color-surface-muted, var(--color-surface));border:1px solid var(--color-border, #e5e5e5)}.EmptyState__Icon{display:flex;color:var(--color-fg-muted, #a3a3a3)}.EmptyState__Icon lucide-icon{--lucide-stroke: var(--color-fg-muted, #a3a3a3)}.EmptyState__Title{margin:0;font-size:14px;font-weight:400;color:var(--color-fg, #171717)}.EmptyState__Message{margin:0;max-width:28rem;font-size:14px;line-height:1.45;color:var(--color-fg-muted, #a3a3a3)}.EmptyState__Actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:4px;margin-top:4px}\n"] }]
238
238
  }] });
239
239
 
240
240
  class LoadErrorComponent {
@@ -243,11 +243,11 @@ class LoadErrorComponent {
243
243
  icon = input('triangle-alert');
244
244
  retryLabel = input('Reintentar');
245
245
  retry = output();
246
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: LoadErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
247
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.11", type: LoadErrorComponent, isStandalone: true, selector: "load-error", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, retryLabel: { classPropertyName: "retryLabel", publicName: "retryLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { retry: "retry" }, ngImport: i0, template: `
246
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: LoadErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
247
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: LoadErrorComponent, isStandalone: true, selector: "load-error", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, retryLabel: { classPropertyName: "retryLabel", publicName: "retryLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { retry: "retry" }, ngImport: i0, template: `
248
248
  <div class="LoadError">
249
249
  <div class="LoadError__Icon">
250
- <lucide-icon [name]="icon()" [size]="36"></lucide-icon>
250
+ <lucide-icon [name]="icon()" [size]="24"></lucide-icon>
251
251
  </div>
252
252
  <h3 class="LoadError__Title">{{ title() }}</h3>
253
253
  @if (message()) {
@@ -263,14 +263,14 @@ class LoadErrorComponent {
263
263
  </div>
264
264
  <ng-content></ng-content>
265
265
  </div>
266
- `, isInline: true, styles: [":host{display:block;width:100%}.LoadError{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px;text-align:center;border-radius:var(--radius-xl, 16px);background:color-mix(in srgb,var(--error-bg, var(--surface)) 70%,var(--surface));border:1px solid var(--error-border, var(--border))}.LoadError__Icon{display:flex}.LoadError__Icon lucide-icon{--lucide-stroke: var(--error-text, var(--text-base))}.LoadError__Title{margin:0;font-size:1rem;font-weight:600;color:var(--text-base)}.LoadError__Message{margin:0;max-width:28rem;font-size:.875rem;line-height:1.45;color:var(--text-muted)}.LoadError__Actions{display:flex;margin-top:4px}\n"], dependencies: [{ kind: "component", type: LucideIconComponent, selector: "lucide-icon", inputs: ["name", "size", "spin", "filled"] }, { kind: "component", type: TextBtnComponent, selector: "text-btn", inputs: ["label", "icon", "iconPosition", "iconSpin", "layout", "variant", "color", "rounded", "size", "ripple", "disabled", "buttonType", "href", "routerLink", "fit", "width", "textColor", "bgColor", "borderColor", "title"], outputs: ["clicked"] }] });
266
+ `, isInline: true, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.LoadError{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:28px 16px 20px;text-align:center;border-radius:var(--radius-xl, 16px);background:var(--color-danger-bg, var(--color-surface, #fef2f2));border:1px solid var(--color-danger-border, var(--color-border, #fca5a5))}.LoadError__Icon{display:flex;color:var(--color-danger-fg, var(--color-fg, #dc2626))}.LoadError__Icon lucide-icon{--lucide-stroke: var(--color-danger-fg, var(--color-fg, #dc2626))}.LoadError__Title{margin:0;font-size:14px;font-weight:400;color:var(--color-fg, #171717)}.LoadError__Message{margin:0;max-width:28rem;font-size:14px;line-height:1.45;color:var(--color-fg-muted, #a3a3a3)}.LoadError__Actions{display:flex;margin-top:4px}\n"], dependencies: [{ kind: "component", type: LucideIconComponent, selector: "lucide-icon", inputs: ["name", "size", "spin", "filled"] }, { kind: "component", type: TextBtnComponent, selector: "text-btn", inputs: ["label", "icon", "iconPosition", "iconSpin", "layout", "variant", "color", "rounded", "size", "ripple", "disabled", "buttonType", "href", "routerLink", "fit", "width", "textColor", "bgColor", "borderColor", "title"], outputs: ["clicked"] }] });
267
267
  }
268
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: LoadErrorComponent, decorators: [{
268
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: LoadErrorComponent, decorators: [{
269
269
  type: Component,
270
270
  args: [{ selector: 'load-error', standalone: true, imports: [LucideIconComponent, TextBtnComponent], template: `
271
271
  <div class="LoadError">
272
272
  <div class="LoadError__Icon">
273
- <lucide-icon [name]="icon()" [size]="36"></lucide-icon>
273
+ <lucide-icon [name]="icon()" [size]="24"></lucide-icon>
274
274
  </div>
275
275
  <h3 class="LoadError__Title">{{ title() }}</h3>
276
276
  @if (message()) {
@@ -286,15 +286,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImpo
286
286
  </div>
287
287
  <ng-content></ng-content>
288
288
  </div>
289
- `, styles: [":host{display:block;width:100%}.LoadError{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px;text-align:center;border-radius:var(--radius-xl, 16px);background:color-mix(in srgb,var(--error-bg, var(--surface)) 70%,var(--surface));border:1px solid var(--error-border, var(--border))}.LoadError__Icon{display:flex}.LoadError__Icon lucide-icon{--lucide-stroke: var(--error-text, var(--text-base))}.LoadError__Title{margin:0;font-size:1rem;font-weight:600;color:var(--text-base)}.LoadError__Message{margin:0;max-width:28rem;font-size:.875rem;line-height:1.45;color:var(--text-muted)}.LoadError__Actions{display:flex;margin-top:4px}\n"] }]
289
+ `, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.LoadError{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:28px 16px 20px;text-align:center;border-radius:var(--radius-xl, 16px);background:var(--color-danger-bg, var(--color-surface, #fef2f2));border:1px solid var(--color-danger-border, var(--color-border, #fca5a5))}.LoadError__Icon{display:flex;color:var(--color-danger-fg, var(--color-fg, #dc2626))}.LoadError__Icon lucide-icon{--lucide-stroke: var(--color-danger-fg, var(--color-fg, #dc2626))}.LoadError__Title{margin:0;font-size:14px;font-weight:400;color:var(--color-fg, #171717)}.LoadError__Message{margin:0;max-width:28rem;font-size:14px;line-height:1.45;color:var(--color-fg-muted, #a3a3a3)}.LoadError__Actions{display:flex;margin-top:4px}\n"] }]
290
290
  }] });
291
291
 
292
292
  class SectionHeaderComponent {
293
293
  title = input.required();
294
294
  subtitle = input(null);
295
295
  eyebrow = input(null);
296
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: SectionHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
297
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.11", type: SectionHeaderComponent, isStandalone: true, selector: "section-header", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, eyebrow: { classPropertyName: "eyebrow", publicName: "eyebrow", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
296
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SectionHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
297
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: SectionHeaderComponent, isStandalone: true, selector: "section-header", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, eyebrow: { classPropertyName: "eyebrow", publicName: "eyebrow", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
298
298
  <header class="SectionHeader">
299
299
  <div class="SectionHeader__Text">
300
300
  @if (eyebrow()) {
@@ -309,9 +309,9 @@ class SectionHeaderComponent {
309
309
  <ng-content></ng-content>
310
310
  </div>
311
311
  </header>
312
- `, isInline: true, styles: [":host{display:block;width:100%}.SectionHeader{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;width:100%}.SectionHeader__Text{display:flex;flex-direction:column;gap:4px;min-width:0}.SectionHeader__Eyebrow{margin:0;font-size:.7rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--text-muted)}.SectionHeader__Title{margin:0;font-size:1.125rem;font-weight:600;color:var(--text-base);line-height:1.25}.SectionHeader__Subtitle{margin:0;font-size:.875rem;color:var(--text-muted);line-height:1.4}.SectionHeader__Actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:4px;flex-shrink:0}\n"] });
312
+ `, isInline: true, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.SectionHeader{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;width:100%}.SectionHeader__Text{display:flex;flex-direction:column;gap:4px;min-width:0}.SectionHeader__Eyebrow{margin:0;font-size:14px;font-weight:400;letter-spacing:.04em;text-transform:uppercase;color:var(--color-fg-muted, #a3a3a3)}.SectionHeader__Title{margin:0;font-size:14px;font-weight:400;color:var(--color-fg, #171717);line-height:1.25}.SectionHeader__Subtitle{margin:0;font-size:14px;color:var(--color-fg-muted, #a3a3a3);line-height:1.4}.SectionHeader__Actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:4px;flex-shrink:0}\n"] });
313
313
  }
314
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: SectionHeaderComponent, decorators: [{
314
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SectionHeaderComponent, decorators: [{
315
315
  type: Component,
316
316
  args: [{ selector: 'section-header', standalone: true, template: `
317
317
  <header class="SectionHeader">
@@ -328,14 +328,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImpo
328
328
  <ng-content></ng-content>
329
329
  </div>
330
330
  </header>
331
- `, styles: [":host{display:block;width:100%}.SectionHeader{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;width:100%}.SectionHeader__Text{display:flex;flex-direction:column;gap:4px;min-width:0}.SectionHeader__Eyebrow{margin:0;font-size:.7rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--text-muted)}.SectionHeader__Title{margin:0;font-size:1.125rem;font-weight:600;color:var(--text-base);line-height:1.25}.SectionHeader__Subtitle{margin:0;font-size:.875rem;color:var(--text-muted);line-height:1.4}.SectionHeader__Actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:4px;flex-shrink:0}\n"] }]
331
+ `, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.SectionHeader{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;width:100%}.SectionHeader__Text{display:flex;flex-direction:column;gap:4px;min-width:0}.SectionHeader__Eyebrow{margin:0;font-size:14px;font-weight:400;letter-spacing:.04em;text-transform:uppercase;color:var(--color-fg-muted, #a3a3a3)}.SectionHeader__Title{margin:0;font-size:14px;font-weight:400;color:var(--color-fg, #171717);line-height:1.25}.SectionHeader__Subtitle{margin:0;font-size:14px;color:var(--color-fg-muted, #a3a3a3);line-height:1.4}.SectionHeader__Actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:4px;flex-shrink:0}\n"] }]
332
332
  }] });
333
333
 
334
334
  class KeyValueListComponent {
335
335
  items = input([]);
336
336
  emptyValue = input('—');
337
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: KeyValueListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
338
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.11", type: KeyValueListComponent, isStandalone: true, selector: "key-value-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, emptyValue: { classPropertyName: "emptyValue", publicName: "emptyValue", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
337
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: KeyValueListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
338
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: KeyValueListComponent, isStandalone: true, selector: "key-value-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, emptyValue: { classPropertyName: "emptyValue", publicName: "emptyValue", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
339
339
  <dl class="KvList">
340
340
  @for (item of items(); track item.label + '-' + $index) {
341
341
  <div class="KvList__Row">
@@ -344,9 +344,9 @@ class KeyValueListComponent {
344
344
  </div>
345
345
  }
346
346
  </dl>
347
- `, isInline: true, styles: [":host{display:block;width:100%}.KvList{margin:0;display:flex;flex-direction:column;gap:0;border:1px solid var(--border);border-radius:var(--radius-lg, 12px);overflow:hidden;background:var(--surface)}.KvList__Row{display:grid;grid-template-columns:minmax(6rem,40%) 1fr;gap:8px;padding:8px 12px;border-bottom:1px solid var(--border)}.KvList__Row:last-child{border-bottom:none}.KvList__Label{margin:0;font-size:.8125rem;color:var(--text-muted);font-weight:500}.KvList__Value{margin:0;font-size:.875rem;color:var(--text-base);word-break:break-word}\n"] });
347
+ `, isInline: true, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.KvList{margin:0;display:flex;flex-direction:column;gap:0;border:1px solid var(--color-border, #e5e5e5);border-radius:var(--radius-lg, 12px);overflow:hidden;background:var(--color-surface, #ffffff)}.KvList__Row{display:grid;grid-template-columns:minmax(6rem,40%) 1fr;gap:8px;padding:8px 12px;border-bottom:1px solid var(--color-border, #e5e5e5)}.KvList__Row:last-child{border-bottom:none}.KvList__Label{margin:0;font-size:14px;color:var(--color-fg-muted, #a3a3a3);font-weight:400}.KvList__Value{margin:0;font-size:14px;color:var(--color-fg, #171717);word-break:break-word}\n"] });
348
348
  }
349
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: KeyValueListComponent, decorators: [{
349
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: KeyValueListComponent, decorators: [{
350
350
  type: Component,
351
351
  args: [{ selector: 'key-value-list', standalone: true, template: `
352
352
  <dl class="KvList">
@@ -357,7 +357,665 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImpo
357
357
  </div>
358
358
  }
359
359
  </dl>
360
- `, styles: [":host{display:block;width:100%}.KvList{margin:0;display:flex;flex-direction:column;gap:0;border:1px solid var(--border);border-radius:var(--radius-lg, 12px);overflow:hidden;background:var(--surface)}.KvList__Row{display:grid;grid-template-columns:minmax(6rem,40%) 1fr;gap:8px;padding:8px 12px;border-bottom:1px solid var(--border)}.KvList__Row:last-child{border-bottom:none}.KvList__Label{margin:0;font-size:.8125rem;color:var(--text-muted);font-weight:500}.KvList__Value{margin:0;font-size:.875rem;color:var(--text-base);word-break:break-word}\n"] }]
360
+ `, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.KvList{margin:0;display:flex;flex-direction:column;gap:0;border:1px solid var(--color-border, #e5e5e5);border-radius:var(--radius-lg, 12px);overflow:hidden;background:var(--color-surface, #ffffff)}.KvList__Row{display:grid;grid-template-columns:minmax(6rem,40%) 1fr;gap:8px;padding:8px 12px;border-bottom:1px solid var(--color-border, #e5e5e5)}.KvList__Row:last-child{border-bottom:none}.KvList__Label{margin:0;font-size:14px;color:var(--color-fg-muted, #a3a3a3);font-weight:400}.KvList__Value{margin:0;font-size:14px;color:var(--color-fg, #171717);word-break:break-word}\n"] }]
361
+ }] });
362
+
363
+ class SkeletonComponent {
364
+ variant = input('line');
365
+ lines = input(3);
366
+ width = input('100%');
367
+ height = input('14px');
368
+ pulse = input(true, { transform: booleanAttribute });
369
+ get lineIndexes() {
370
+ return Array.from({ length: Math.max(1, this.lines()) }, (_, i) => i);
371
+ }
372
+ lineWidth(index) {
373
+ if (this.lines() <= 1)
374
+ return this.width();
375
+ return index === this.lines() - 1 ? '62%' : '100%';
376
+ }
377
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SkeletonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
378
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: SkeletonComponent, isStandalone: true, selector: "skeleton", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, lines: { classPropertyName: "lines", publicName: "lines", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, pulse: { classPropertyName: "pulse", publicName: "pulse", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
379
+ <div
380
+ class="Skeleton"
381
+ [class.Skeleton--circle]="variant() === 'circle'"
382
+ [class.Skeleton--rect]="variant() === 'rect'"
383
+ [class.Skeleton--static]="!pulse()"
384
+ [attr.aria-hidden]="true"
385
+ >
386
+ @if (variant() === 'line') {
387
+ @for (line of lineIndexes; track line) {
388
+ <span class="Skeleton__Line" [style.width]="lineWidth(line)"></span>
389
+ }
390
+ } @else {
391
+ <span class="Skeleton__Block" [style.width]="width()" [style.height]="height()"></span>
392
+ }
393
+ </div>
394
+ `, isInline: true, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.Skeleton{display:flex;flex-direction:column;gap:4px;width:100%}.Skeleton--circle,.Skeleton--rect{width:auto}.Skeleton__Line,.Skeleton__Block{display:block;border-radius:8px;background:var(--color-surface-emphasis, #e5e5e5);animation:skeletonPulse 1.2s ease-in-out infinite alternate}.Skeleton__Line{height:14px}.Skeleton__Block{min-width:14px;min-height:14px}.Skeleton--circle .Skeleton__Block{border-radius:50%}.Skeleton--static .Skeleton__Line,.Skeleton--static .Skeleton__Block{animation:none}@keyframes skeletonPulse{0%{opacity:.55}to{opacity:1}}\n"] });
395
+ }
396
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SkeletonComponent, decorators: [{
397
+ type: Component,
398
+ args: [{ selector: 'skeleton', standalone: true, template: `
399
+ <div
400
+ class="Skeleton"
401
+ [class.Skeleton--circle]="variant() === 'circle'"
402
+ [class.Skeleton--rect]="variant() === 'rect'"
403
+ [class.Skeleton--static]="!pulse()"
404
+ [attr.aria-hidden]="true"
405
+ >
406
+ @if (variant() === 'line') {
407
+ @for (line of lineIndexes; track line) {
408
+ <span class="Skeleton__Line" [style.width]="lineWidth(line)"></span>
409
+ }
410
+ } @else {
411
+ <span class="Skeleton__Block" [style.width]="width()" [style.height]="height()"></span>
412
+ }
413
+ </div>
414
+ `, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.Skeleton{display:flex;flex-direction:column;gap:4px;width:100%}.Skeleton--circle,.Skeleton--rect{width:auto}.Skeleton__Line,.Skeleton__Block{display:block;border-radius:8px;background:var(--color-surface-emphasis, #e5e5e5);animation:skeletonPulse 1.2s ease-in-out infinite alternate}.Skeleton__Line{height:14px}.Skeleton__Block{min-width:14px;min-height:14px}.Skeleton--circle .Skeleton__Block{border-radius:50%}.Skeleton--static .Skeleton__Line,.Skeleton--static .Skeleton__Block{animation:none}@keyframes skeletonPulse{0%{opacity:.55}to{opacity:1}}\n"] }]
415
+ }] });
416
+
417
+ class SurfaceCardComponent {
418
+ title = input(null);
419
+ subtitle = input(null);
420
+ compact = input(false, { transform: booleanAttribute });
421
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SurfaceCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
422
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: SurfaceCardComponent, isStandalone: true, selector: "surface-card", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
423
+ <div class="SurfaceCard" [class.SurfaceCard--compact]="compact()">
424
+ @if (title() || subtitle()) {
425
+ <div class="SurfaceCard__Head">
426
+ @if (title()) {
427
+ <p class="SurfaceCard__Title">{{ title() }}</p>
428
+ }
429
+ @if (subtitle()) {
430
+ <p class="SurfaceCard__Subtitle">{{ subtitle() }}</p>
431
+ }
432
+ </div>
433
+ }
434
+ <div class="SurfaceCard__Body">
435
+ <ng-content></ng-content>
436
+ </div>
437
+ </div>
438
+ `, isInline: true, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.SurfaceCard{display:flex;flex-direction:column;gap:4px;width:100%;padding:16px;border-radius:var(--radius-xl, 16px);background:var(--color-surface-muted, #f5f5f5)}.SurfaceCard--compact{padding:8px}.SurfaceCard__Head{display:flex;flex-direction:column;gap:4px}.SurfaceCard__Title{margin:0;font-size:14px;font-weight:400;color:var(--color-fg, #171717)}.SurfaceCard__Subtitle{margin:0;font-size:14px;font-weight:400;color:var(--color-fg-muted, #a3a3a3)}.SurfaceCard__Body{display:flex;flex-direction:column;gap:4px;min-width:0}\n"] });
439
+ }
440
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: SurfaceCardComponent, decorators: [{
441
+ type: Component,
442
+ args: [{ selector: 'surface-card', standalone: true, template: `
443
+ <div class="SurfaceCard" [class.SurfaceCard--compact]="compact()">
444
+ @if (title() || subtitle()) {
445
+ <div class="SurfaceCard__Head">
446
+ @if (title()) {
447
+ <p class="SurfaceCard__Title">{{ title() }}</p>
448
+ }
449
+ @if (subtitle()) {
450
+ <p class="SurfaceCard__Subtitle">{{ subtitle() }}</p>
451
+ }
452
+ </div>
453
+ }
454
+ <div class="SurfaceCard__Body">
455
+ <ng-content></ng-content>
456
+ </div>
457
+ </div>
458
+ `, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.SurfaceCard{display:flex;flex-direction:column;gap:4px;width:100%;padding:16px;border-radius:var(--radius-xl, 16px);background:var(--color-surface-muted, #f5f5f5)}.SurfaceCard--compact{padding:8px}.SurfaceCard__Head{display:flex;flex-direction:column;gap:4px}.SurfaceCard__Title{margin:0;font-size:14px;font-weight:400;color:var(--color-fg, #171717)}.SurfaceCard__Subtitle{margin:0;font-size:14px;font-weight:400;color:var(--color-fg-muted, #a3a3a3)}.SurfaceCard__Body{display:flex;flex-direction:column;gap:4px;min-width:0}\n"] }]
459
+ }] });
460
+
461
+ class AvatarComponent {
462
+ src = input(null);
463
+ name = input(null);
464
+ icon = input('user');
465
+ size = input(32);
466
+ broken = false;
467
+ initials = computed(() => {
468
+ const parts = (this.name() ?? '').trim().split(/\s+/).filter(Boolean);
469
+ if (!parts.length)
470
+ return '';
471
+ const first = parts[0][0] ?? '';
472
+ const second = parts.length > 1 ? parts[parts.length - 1][0] ?? '' : '';
473
+ return (first + second).toUpperCase();
474
+ });
475
+ iconSize() {
476
+ return Math.max(12, Math.round(this.size() * 0.44));
477
+ }
478
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
479
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: AvatarComponent, isStandalone: true, selector: "avatar", inputs: { src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
480
+ <span
481
+ class="Avatar"
482
+ [style.width.px]="size()"
483
+ [style.height.px]="size()"
484
+ [attr.aria-label]="name() || 'Avatar'"
485
+ >
486
+ @if (src() && !broken) {
487
+ <img class="Avatar__Img" [src]="src()!" alt="" (error)="broken = true" />
488
+ } @else if (initials()) {
489
+ <span class="Avatar__Initials">{{ initials() }}</span>
490
+ } @else {
491
+ <lucide-icon [name]="icon()" [size]="iconSize()"></lucide-icon>
492
+ }
493
+ </span>
494
+ `, isInline: true, styles: [":host{display:inline-flex;flex-shrink:0;user-select:none;-webkit-user-select:none}.Avatar{display:inline-flex;align-items:center;justify-content:center;overflow:hidden;border-radius:50%;background:var(--color-surface-emphasis, #e5e5e5);color:var(--color-fg-secondary, #525252);font-size:14px;font-weight:400;line-height:1}.Avatar lucide-icon{--lucide-stroke: currentColor}.Avatar__Img{width:100%;height:100%;object-fit:cover}.Avatar__Initials{letter-spacing:.02em}\n"], dependencies: [{ kind: "component", type: LucideIconComponent, selector: "lucide-icon", inputs: ["name", "size", "spin", "filled"] }] });
495
+ }
496
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AvatarComponent, decorators: [{
497
+ type: Component,
498
+ args: [{ selector: 'avatar', standalone: true, imports: [LucideIconComponent], template: `
499
+ <span
500
+ class="Avatar"
501
+ [style.width.px]="size()"
502
+ [style.height.px]="size()"
503
+ [attr.aria-label]="name() || 'Avatar'"
504
+ >
505
+ @if (src() && !broken) {
506
+ <img class="Avatar__Img" [src]="src()!" alt="" (error)="broken = true" />
507
+ } @else if (initials()) {
508
+ <span class="Avatar__Initials">{{ initials() }}</span>
509
+ } @else {
510
+ <lucide-icon [name]="icon()" [size]="iconSize()"></lucide-icon>
511
+ }
512
+ </span>
513
+ `, styles: [":host{display:inline-flex;flex-shrink:0;user-select:none;-webkit-user-select:none}.Avatar{display:inline-flex;align-items:center;justify-content:center;overflow:hidden;border-radius:50%;background:var(--color-surface-emphasis, #e5e5e5);color:var(--color-fg-secondary, #525252);font-size:14px;font-weight:400;line-height:1}.Avatar lucide-icon{--lucide-stroke: currentColor}.Avatar__Img{width:100%;height:100%;object-fit:cover}.Avatar__Initials{letter-spacing:.02em}\n"] }]
514
+ }] });
515
+
516
+ class ListRowComponent {
517
+ title = input.required();
518
+ subtitle = input(null);
519
+ icon = input(null);
520
+ avatarSrc = input(null);
521
+ avatarName = input(null);
522
+ chevron = input(false, { transform: booleanAttribute });
523
+ disabled = input(false, { transform: booleanAttribute });
524
+ clicked = output();
525
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ListRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
526
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: ListRowComponent, isStandalone: true, selector: "list-row", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, avatarSrc: { classPropertyName: "avatarSrc", publicName: "avatarSrc", isSignal: true, isRequired: false, transformFunction: null }, avatarName: { classPropertyName: "avatarName", publicName: "avatarName", isSignal: true, isRequired: false, transformFunction: null }, chevron: { classPropertyName: "chevron", publicName: "chevron", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clicked: "clicked" }, ngImport: i0, template: `
527
+ <div class="ListRow" [class.ListRow--disabled]="disabled()">
528
+ <button
529
+ type="button"
530
+ class="ListRow__Main"
531
+ [disabled]="disabled()"
532
+ (click)="clicked.emit($event)"
533
+ >
534
+ @if (avatarSrc() || avatarName()) {
535
+ <avatar [src]="avatarSrc()" [name]="avatarName()" [size]="32"></avatar>
536
+ } @else if (icon()) {
537
+ <span class="ListRow__Icon">
538
+ <lucide-icon [name]="icon()!" [size]="14"></lucide-icon>
539
+ </span>
540
+ }
541
+ <span class="ListRow__Text">
542
+ <span class="ListRow__Title">{{ title() }}</span>
543
+ @if (subtitle()) {
544
+ <span class="ListRow__Subtitle">{{ subtitle() }}</span>
545
+ }
546
+ </span>
547
+ </button>
548
+ <span class="ListRow__Trail">
549
+ <ng-content></ng-content>
550
+ @if (chevron()) {
551
+ <lucide-icon name="chevron-right" [size]="14"></lucide-icon>
552
+ }
553
+ </span>
554
+ </div>
555
+ `, isInline: true, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.ListRow{display:flex;align-items:center;gap:4px;width:100%;border-radius:12px}.ListRow--disabled{opacity:.45}.ListRow__Main{display:flex;align-items:center;gap:8px;flex:1;min-width:0;padding:8px;border:none;border-radius:12px;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer}.ListRow__Main:hover:not(:disabled){background:var(--color-surface-muted, #f5f5f5)}.ListRow__Main:active:not(:disabled){transform:scale(.98)}.ListRow__Main:disabled{cursor:not-allowed}.ListRow__Icon{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;flex-shrink:0;border-radius:50%;background:var(--color-surface-muted, #f5f5f5);color:var(--color-fg-secondary, #525252)}.ListRow__Icon lucide-icon{--lucide-stroke: currentColor}.ListRow__Text{display:flex;flex-direction:column;gap:4px;min-width:0;flex:1}.ListRow__Title,.ListRow__Subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:400}.ListRow__Title{color:var(--color-fg, #171717)}.ListRow__Subtitle{color:var(--color-fg-muted, #a3a3a3)}.ListRow__Trail{display:inline-flex;align-items:center;gap:4px;flex-shrink:0;color:var(--color-fg-muted, #a3a3a3)}.ListRow__Trail lucide-icon{--lucide-stroke: currentColor}\n"], dependencies: [{ kind: "component", type: LucideIconComponent, selector: "lucide-icon", inputs: ["name", "size", "spin", "filled"] }, { kind: "component", type: AvatarComponent, selector: "avatar", inputs: ["src", "name", "icon", "size"] }] });
556
+ }
557
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: ListRowComponent, decorators: [{
558
+ type: Component,
559
+ args: [{ selector: 'list-row', standalone: true, imports: [LucideIconComponent, AvatarComponent], template: `
560
+ <div class="ListRow" [class.ListRow--disabled]="disabled()">
561
+ <button
562
+ type="button"
563
+ class="ListRow__Main"
564
+ [disabled]="disabled()"
565
+ (click)="clicked.emit($event)"
566
+ >
567
+ @if (avatarSrc() || avatarName()) {
568
+ <avatar [src]="avatarSrc()" [name]="avatarName()" [size]="32"></avatar>
569
+ } @else if (icon()) {
570
+ <span class="ListRow__Icon">
571
+ <lucide-icon [name]="icon()!" [size]="14"></lucide-icon>
572
+ </span>
573
+ }
574
+ <span class="ListRow__Text">
575
+ <span class="ListRow__Title">{{ title() }}</span>
576
+ @if (subtitle()) {
577
+ <span class="ListRow__Subtitle">{{ subtitle() }}</span>
578
+ }
579
+ </span>
580
+ </button>
581
+ <span class="ListRow__Trail">
582
+ <ng-content></ng-content>
583
+ @if (chevron()) {
584
+ <lucide-icon name="chevron-right" [size]="14"></lucide-icon>
585
+ }
586
+ </span>
587
+ </div>
588
+ `, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.ListRow{display:flex;align-items:center;gap:4px;width:100%;border-radius:12px}.ListRow--disabled{opacity:.45}.ListRow__Main{display:flex;align-items:center;gap:8px;flex:1;min-width:0;padding:8px;border:none;border-radius:12px;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer}.ListRow__Main:hover:not(:disabled){background:var(--color-surface-muted, #f5f5f5)}.ListRow__Main:active:not(:disabled){transform:scale(.98)}.ListRow__Main:disabled{cursor:not-allowed}.ListRow__Icon{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;flex-shrink:0;border-radius:50%;background:var(--color-surface-muted, #f5f5f5);color:var(--color-fg-secondary, #525252)}.ListRow__Icon lucide-icon{--lucide-stroke: currentColor}.ListRow__Text{display:flex;flex-direction:column;gap:4px;min-width:0;flex:1}.ListRow__Title,.ListRow__Subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:400}.ListRow__Title{color:var(--color-fg, #171717)}.ListRow__Subtitle{color:var(--color-fg-muted, #a3a3a3)}.ListRow__Trail{display:inline-flex;align-items:center;gap:4px;flex-shrink:0;color:var(--color-fg-muted, #a3a3a3)}.ListRow__Trail lucide-icon{--lucide-stroke: currentColor}\n"] }]
589
+ }] });
590
+
591
+ class DataTableComponent {
592
+ columns = input([]);
593
+ rows = input([]);
594
+ loading = input(false);
595
+ emptyTitle = input('Sin filas');
596
+ emptyMessage = input('No hay datos para mostrar.');
597
+ emptyIcon = input('table');
598
+ rowClick = output();
599
+ gridCols() {
600
+ return `repeat(${Math.max(1, this.columns().length)}, minmax(0, 1fr))`;
601
+ }
602
+ cell(row, key) {
603
+ const value = row[key];
604
+ if (value == null || value === '')
605
+ return '—';
606
+ return String(value);
607
+ }
608
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: DataTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
609
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: DataTableComponent, isStandalone: true, selector: "data-table", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, emptyTitle: { classPropertyName: "emptyTitle", publicName: "emptyTitle", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, emptyIcon: { classPropertyName: "emptyIcon", publicName: "emptyIcon", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowClick: "rowClick" }, ngImport: i0, template: `
610
+ <div class="DataTable" role="table">
611
+ <div class="DataTable__Head" role="row" [style.grid-template-columns]="gridCols()">
612
+ @for (col of columns(); track col.key) {
613
+ <span class="DataTable__Cell DataTable__Cell--head" role="columnheader" [style.width]="col.width || null">
614
+ {{ col.label }}
615
+ </span>
616
+ }
617
+ </div>
618
+
619
+ @if (loading()) {
620
+ <div class="DataTable__Body">
621
+ @for (row of [0, 1, 2]; track row) {
622
+ <skeleton [lines]="1"></skeleton>
623
+ }
624
+ </div>
625
+ } @else if (!rows().length) {
626
+ <empty-state [title]="emptyTitle()" [message]="emptyMessage()" [icon]="emptyIcon()"></empty-state>
627
+ } @else {
628
+ <div class="DataTable__Body">
629
+ @for (row of rows(); track $index) {
630
+ <button type="button" class="DataTable__Row" role="row" [style.grid-template-columns]="gridCols()" (click)="rowClick.emit(row)">
631
+ @for (col of columns(); track col.key) {
632
+ <span class="DataTable__Cell" role="cell" [style.width]="col.width || null">
633
+ {{ cell(row, col.key) }}
634
+ </span>
635
+ }
636
+ </button>
637
+ }
638
+ </div>
639
+ }
640
+ </div>
641
+ `, isInline: true, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.DataTable{display:flex;flex-direction:column;gap:4px;width:100%;overflow:auto}.DataTable__Head,.DataTable__Row{display:grid;grid-template-columns:repeat(auto-fit,minmax(80px,1fr));gap:8px;align-items:center;width:100%;min-width:0}.DataTable__Head{padding:8px;color:var(--color-fg-muted, #a3a3a3)}.DataTable__Body{display:flex;flex-direction:column;gap:4px}.DataTable__Row{padding:8px;border:none;border-radius:12px;background:var(--color-surface-muted, #f5f5f5);color:inherit;font:inherit;text-align:left;cursor:pointer}.DataTable__Row:hover{background:var(--color-surface-emphasis, #e5e5e5)}.DataTable__Row:active{transform:scale(.98)}.DataTable__Cell{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:400;color:var(--color-fg, #171717)}.DataTable__Cell--head{color:var(--color-fg-muted, #a3a3a3)}\n"], dependencies: [{ kind: "component", type: EmptyStateComponent, selector: "empty-state", inputs: ["title", "message", "icon", "primaryLabel", "primaryIcon", "secondaryLabel"], outputs: ["primary", "secondary"] }, { kind: "component", type: SkeletonComponent, selector: "skeleton", inputs: ["variant", "lines", "width", "height", "pulse"] }] });
642
+ }
643
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: DataTableComponent, decorators: [{
644
+ type: Component,
645
+ args: [{ selector: 'data-table', standalone: true, imports: [EmptyStateComponent, SkeletonComponent], template: `
646
+ <div class="DataTable" role="table">
647
+ <div class="DataTable__Head" role="row" [style.grid-template-columns]="gridCols()">
648
+ @for (col of columns(); track col.key) {
649
+ <span class="DataTable__Cell DataTable__Cell--head" role="columnheader" [style.width]="col.width || null">
650
+ {{ col.label }}
651
+ </span>
652
+ }
653
+ </div>
654
+
655
+ @if (loading()) {
656
+ <div class="DataTable__Body">
657
+ @for (row of [0, 1, 2]; track row) {
658
+ <skeleton [lines]="1"></skeleton>
659
+ }
660
+ </div>
661
+ } @else if (!rows().length) {
662
+ <empty-state [title]="emptyTitle()" [message]="emptyMessage()" [icon]="emptyIcon()"></empty-state>
663
+ } @else {
664
+ <div class="DataTable__Body">
665
+ @for (row of rows(); track $index) {
666
+ <button type="button" class="DataTable__Row" role="row" [style.grid-template-columns]="gridCols()" (click)="rowClick.emit(row)">
667
+ @for (col of columns(); track col.key) {
668
+ <span class="DataTable__Cell" role="cell" [style.width]="col.width || null">
669
+ {{ cell(row, col.key) }}
670
+ </span>
671
+ }
672
+ </button>
673
+ }
674
+ </div>
675
+ }
676
+ </div>
677
+ `, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.DataTable{display:flex;flex-direction:column;gap:4px;width:100%;overflow:auto}.DataTable__Head,.DataTable__Row{display:grid;grid-template-columns:repeat(auto-fit,minmax(80px,1fr));gap:8px;align-items:center;width:100%;min-width:0}.DataTable__Head{padding:8px;color:var(--color-fg-muted, #a3a3a3)}.DataTable__Body{display:flex;flex-direction:column;gap:4px}.DataTable__Row{padding:8px;border:none;border-radius:12px;background:var(--color-surface-muted, #f5f5f5);color:inherit;font:inherit;text-align:left;cursor:pointer}.DataTable__Row:hover{background:var(--color-surface-emphasis, #e5e5e5)}.DataTable__Row:active{transform:scale(.98)}.DataTable__Cell{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:400;color:var(--color-fg, #171717)}.DataTable__Cell--head{color:var(--color-fg-muted, #a3a3a3)}\n"] }]
678
+ }] });
679
+
680
+ class AccordionItemComponent {
681
+ title = input.required();
682
+ icon = input(null);
683
+ disabled = input(false, { transform: booleanAttribute });
684
+ open = model(false);
685
+ group = inject(forwardRef(() => AccordionComponent), { optional: true, skipSelf: true });
686
+ toggle() {
687
+ if (this.disabled())
688
+ return;
689
+ this.open.set(!this.open());
690
+ if (this.open())
691
+ this.group?.itemOpened(this);
692
+ }
693
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccordionItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
694
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: AccordionItemComponent, isStandalone: true, selector: "accordion-item", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange" }, ngImport: i0, template: `
695
+ <div class="AccordionItem" [class.AccordionItem--open]="open()">
696
+ <button type="button" class="AccordionItem__Head" [disabled]="disabled()" (click)="toggle()">
697
+ @if (icon()) {
698
+ <lucide-icon [name]="icon()!" [size]="14"></lucide-icon>
699
+ }
700
+ <span class="AccordionItem__Title">{{ title() }}</span>
701
+ <lucide-icon name="chevron-down" [size]="14" class="AccordionItem__Chevron"></lucide-icon>
702
+ </button>
703
+ @if (open()) {
704
+ <div class="AccordionItem__Body">
705
+ <ng-content></ng-content>
706
+ </div>
707
+ }
708
+ </div>
709
+ `, isInline: true, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.AccordionItem{display:flex;flex-direction:column;gap:4px;width:100%}.AccordionItem__Head{display:flex;align-items:center;gap:8px;width:100%;padding:8px;border:none;border-radius:12px;background:var(--color-surface-muted, #f5f5f5);color:var(--color-fg, #171717);font:inherit;font-size:14px;font-weight:400;text-align:left;cursor:pointer}.AccordionItem__Head lucide-icon{--lucide-stroke: currentColor}.AccordionItem__Head:hover:not(:disabled){background:var(--color-surface-emphasis, #e5e5e5)}.AccordionItem__Head:disabled{opacity:.45;cursor:not-allowed}.AccordionItem__Title{flex:1;min-width:0}.AccordionItem__Chevron{flex-shrink:0;color:var(--color-fg-muted, #a3a3a3);transition:transform .18s ease}.AccordionItem--open .AccordionItem__Chevron{transform:rotate(180deg)}.AccordionItem__Body{display:flex;flex-direction:column;gap:4px;padding:4px 8px 8px;font-size:14px;color:var(--color-fg-secondary, #525252)}\n"], dependencies: [{ kind: "component", type: LucideIconComponent, selector: "lucide-icon", inputs: ["name", "size", "spin", "filled"] }] });
710
+ }
711
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccordionItemComponent, decorators: [{
712
+ type: Component,
713
+ args: [{ selector: 'accordion-item', standalone: true, imports: [LucideIconComponent], template: `
714
+ <div class="AccordionItem" [class.AccordionItem--open]="open()">
715
+ <button type="button" class="AccordionItem__Head" [disabled]="disabled()" (click)="toggle()">
716
+ @if (icon()) {
717
+ <lucide-icon [name]="icon()!" [size]="14"></lucide-icon>
718
+ }
719
+ <span class="AccordionItem__Title">{{ title() }}</span>
720
+ <lucide-icon name="chevron-down" [size]="14" class="AccordionItem__Chevron"></lucide-icon>
721
+ </button>
722
+ @if (open()) {
723
+ <div class="AccordionItem__Body">
724
+ <ng-content></ng-content>
725
+ </div>
726
+ }
727
+ </div>
728
+ `, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.AccordionItem{display:flex;flex-direction:column;gap:4px;width:100%}.AccordionItem__Head{display:flex;align-items:center;gap:8px;width:100%;padding:8px;border:none;border-radius:12px;background:var(--color-surface-muted, #f5f5f5);color:var(--color-fg, #171717);font:inherit;font-size:14px;font-weight:400;text-align:left;cursor:pointer}.AccordionItem__Head lucide-icon{--lucide-stroke: currentColor}.AccordionItem__Head:hover:not(:disabled){background:var(--color-surface-emphasis, #e5e5e5)}.AccordionItem__Head:disabled{opacity:.45;cursor:not-allowed}.AccordionItem__Title{flex:1;min-width:0}.AccordionItem__Chevron{flex-shrink:0;color:var(--color-fg-muted, #a3a3a3);transition:transform .18s ease}.AccordionItem--open .AccordionItem__Chevron{transform:rotate(180deg)}.AccordionItem__Body{display:flex;flex-direction:column;gap:4px;padding:4px 8px 8px;font-size:14px;color:var(--color-fg-secondary, #525252)}\n"] }]
729
+ }] });
730
+
731
+ class AccordionComponent {
732
+ multiple = input(false, { transform: booleanAttribute });
733
+ items = contentChildren(AccordionItemComponent);
734
+ itemOpened(opened) {
735
+ if (this.multiple())
736
+ return;
737
+ for (const item of this.items()) {
738
+ if (item !== opened)
739
+ item.open.set(false);
740
+ }
741
+ }
742
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccordionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
743
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.2.25", type: AccordionComponent, isStandalone: true, selector: "accordion", inputs: { multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "items", predicate: AccordionItemComponent, isSignal: true }], ngImport: i0, template: `
744
+ <div class="Accordion">
745
+ <ng-content></ng-content>
746
+ </div>
747
+ `, isInline: true, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.Accordion{display:flex;flex-direction:column;gap:4px;width:100%}\n"] });
748
+ }
749
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: AccordionComponent, decorators: [{
750
+ type: Component,
751
+ args: [{ selector: 'accordion', standalone: true, template: `
752
+ <div class="Accordion">
753
+ <ng-content></ng-content>
754
+ </div>
755
+ `, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.Accordion{display:flex;flex-direction:column;gap:4px;width:100%}\n"] }]
756
+ }] });
757
+
758
+ class StepperComponent {
759
+ steps = input([]);
760
+ index = model(0);
761
+ clickable = input(false, { transform: booleanAttribute });
762
+ label = input('Pasos');
763
+ select(next) {
764
+ if (!this.clickable() || next === this.index())
765
+ return;
766
+ this.index.set(next);
767
+ }
768
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: StepperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
769
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: StepperComponent, isStandalone: true, selector: "stepper", inputs: { steps: { classPropertyName: "steps", publicName: "steps", isSignal: true, isRequired: false, transformFunction: null }, index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: false, transformFunction: null }, clickable: { classPropertyName: "clickable", publicName: "clickable", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { index: "indexChange" }, ngImport: i0, template: `
770
+ <ol class="Stepper" [attr.aria-label]="label()">
771
+ @for (step of steps(); track $index) {
772
+ <li
773
+ class="Stepper__Item"
774
+ [class.Stepper__Item--done]="$index < index()"
775
+ [class.Stepper__Item--current]="$index === index()"
776
+ >
777
+ <button
778
+ type="button"
779
+ class="Stepper__Btn"
780
+ [disabled]="!clickable() || $index === index()"
781
+ (click)="select($index)"
782
+ >
783
+ <span class="Stepper__Index">{{ $index + 1 }}</span>
784
+ <span class="Stepper__Text">
785
+ <span class="Stepper__Label">{{ step.label }}</span>
786
+ @if (step.description) {
787
+ <span class="Stepper__Desc">{{ step.description }}</span>
788
+ }
789
+ </span>
790
+ </button>
791
+ </li>
792
+ }
793
+ </ol>
794
+ `, isInline: true, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.Stepper{display:flex;flex-wrap:wrap;gap:4px;margin:0;padding:0;list-style:none}.Stepper__Item{flex:1;min-width:120px}.Stepper__Btn{display:flex;align-items:center;gap:8px;width:100%;padding:8px;border:none;border-radius:12px;background:transparent;color:inherit;font:inherit;text-align:left;cursor:default}.Stepper__Btn:not(:disabled){cursor:pointer}.Stepper__Btn:not(:disabled):hover{background:var(--color-surface-muted, #f5f5f5)}.Stepper__Index{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;flex-shrink:0;border-radius:50%;background:var(--color-surface-emphasis, #e5e5e5);color:var(--color-fg-muted, #a3a3a3);font-size:14px;font-weight:400}.Stepper__Item--done .Stepper__Index{background:color-mix(in srgb,var(--color-brand, #22c55e) 18%,var(--color-surface-muted, #f5f5f5));color:var(--color-fg-brand, #16a34a)}.Stepper__Item--current .Stepper__Index{background:var(--color-brand, #22c55e);color:var(--color-fg-inverse, #fafafa)}.Stepper__Text{display:flex;flex-direction:column;gap:4px;min-width:0}.Stepper__Label,.Stepper__Desc{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:400}.Stepper__Label{color:var(--color-fg-muted, #a3a3a3)}.Stepper__Item--done .Stepper__Label,.Stepper__Item--current .Stepper__Label{color:var(--color-fg, #171717)}.Stepper__Desc{color:var(--color-fg-muted, #a3a3a3)}\n"] });
795
+ }
796
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: StepperComponent, decorators: [{
797
+ type: Component,
798
+ args: [{ selector: 'stepper', standalone: true, template: `
799
+ <ol class="Stepper" [attr.aria-label]="label()">
800
+ @for (step of steps(); track $index) {
801
+ <li
802
+ class="Stepper__Item"
803
+ [class.Stepper__Item--done]="$index < index()"
804
+ [class.Stepper__Item--current]="$index === index()"
805
+ >
806
+ <button
807
+ type="button"
808
+ class="Stepper__Btn"
809
+ [disabled]="!clickable() || $index === index()"
810
+ (click)="select($index)"
811
+ >
812
+ <span class="Stepper__Index">{{ $index + 1 }}</span>
813
+ <span class="Stepper__Text">
814
+ <span class="Stepper__Label">{{ step.label }}</span>
815
+ @if (step.description) {
816
+ <span class="Stepper__Desc">{{ step.description }}</span>
817
+ }
818
+ </span>
819
+ </button>
820
+ </li>
821
+ }
822
+ </ol>
823
+ `, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.Stepper{display:flex;flex-wrap:wrap;gap:4px;margin:0;padding:0;list-style:none}.Stepper__Item{flex:1;min-width:120px}.Stepper__Btn{display:flex;align-items:center;gap:8px;width:100%;padding:8px;border:none;border-radius:12px;background:transparent;color:inherit;font:inherit;text-align:left;cursor:default}.Stepper__Btn:not(:disabled){cursor:pointer}.Stepper__Btn:not(:disabled):hover{background:var(--color-surface-muted, #f5f5f5)}.Stepper__Index{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;flex-shrink:0;border-radius:50%;background:var(--color-surface-emphasis, #e5e5e5);color:var(--color-fg-muted, #a3a3a3);font-size:14px;font-weight:400}.Stepper__Item--done .Stepper__Index{background:color-mix(in srgb,var(--color-brand, #22c55e) 18%,var(--color-surface-muted, #f5f5f5));color:var(--color-fg-brand, #16a34a)}.Stepper__Item--current .Stepper__Index{background:var(--color-brand, #22c55e);color:var(--color-fg-inverse, #fafafa)}.Stepper__Text{display:flex;flex-direction:column;gap:4px;min-width:0}.Stepper__Label,.Stepper__Desc{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:400}.Stepper__Label{color:var(--color-fg-muted, #a3a3a3)}.Stepper__Item--done .Stepper__Label,.Stepper__Item--current .Stepper__Label{color:var(--color-fg, #171717)}.Stepper__Desc{color:var(--color-fg-muted, #a3a3a3)}\n"] }]
824
+ }] });
825
+
826
+ class BreadcrumbsComponent {
827
+ items = input([]);
828
+ label = input('Ruta');
829
+ itemClick = output();
830
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: BreadcrumbsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
831
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: BreadcrumbsComponent, isStandalone: true, selector: "breadcrumbs", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, ngImport: i0, template: `
832
+ <nav class="Breadcrumbs" [attr.aria-label]="label()">
833
+ <ol class="Breadcrumbs__List">
834
+ @for (item of items(); track $index) {
835
+ @if ($index > 0) {
836
+ <li class="Breadcrumbs__Sep" aria-hidden="true">
837
+ <lucide-icon name="chevron-right" [size]="14"></lucide-icon>
838
+ </li>
839
+ }
840
+ <li class="Breadcrumbs__Item">
841
+ @if ($last) {
842
+ <span class="Breadcrumbs__Current">{{ item.label }}</span>
843
+ } @else if (item.routerLink) {
844
+ <a class="Breadcrumbs__Link" [routerLink]="item.routerLink" (click)="itemClick.emit(item)">{{ item.label }}</a>
845
+ } @else if (item.href) {
846
+ <a class="Breadcrumbs__Link" [href]="item.href" (click)="itemClick.emit(item)">{{ item.label }}</a>
847
+ } @else {
848
+ <button type="button" class="Breadcrumbs__Link" (click)="itemClick.emit(item)">{{ item.label }}</button>
849
+ }
850
+ </li>
851
+ }
852
+ </ol>
853
+ </nav>
854
+ `, isInline: true, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.Breadcrumbs__List{display:flex;flex-wrap:wrap;align-items:center;gap:4px;margin:0;padding:0;list-style:none}.Breadcrumbs__Sep{display:inline-flex;color:var(--color-fg-muted, #a3a3a3)}.Breadcrumbs__Sep lucide-icon{--lucide-stroke: currentColor}.Breadcrumbs__Link,.Breadcrumbs__Current{display:inline-flex;align-items:center;padding:2px 4px;border:none;border-radius:8px;background:transparent;font:inherit;font-size:14px;font-weight:400;text-decoration:none}.Breadcrumbs__Link{color:var(--color-fg-muted, #a3a3a3);cursor:pointer}.Breadcrumbs__Link:hover{color:var(--color-fg-brand, #16a34a)}.Breadcrumbs__Current{color:var(--color-fg, #171717)}\n"], dependencies: [{ kind: "component", type: LucideIconComponent, selector: "lucide-icon", inputs: ["name", "size", "spin", "filled"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
855
+ }
856
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: BreadcrumbsComponent, decorators: [{
857
+ type: Component,
858
+ args: [{ selector: 'breadcrumbs', standalone: true, imports: [LucideIconComponent, RouterLink], template: `
859
+ <nav class="Breadcrumbs" [attr.aria-label]="label()">
860
+ <ol class="Breadcrumbs__List">
861
+ @for (item of items(); track $index) {
862
+ @if ($index > 0) {
863
+ <li class="Breadcrumbs__Sep" aria-hidden="true">
864
+ <lucide-icon name="chevron-right" [size]="14"></lucide-icon>
865
+ </li>
866
+ }
867
+ <li class="Breadcrumbs__Item">
868
+ @if ($last) {
869
+ <span class="Breadcrumbs__Current">{{ item.label }}</span>
870
+ } @else if (item.routerLink) {
871
+ <a class="Breadcrumbs__Link" [routerLink]="item.routerLink" (click)="itemClick.emit(item)">{{ item.label }}</a>
872
+ } @else if (item.href) {
873
+ <a class="Breadcrumbs__Link" [href]="item.href" (click)="itemClick.emit(item)">{{ item.label }}</a>
874
+ } @else {
875
+ <button type="button" class="Breadcrumbs__Link" (click)="itemClick.emit(item)">{{ item.label }}</button>
876
+ }
877
+ </li>
878
+ }
879
+ </ol>
880
+ </nav>
881
+ `, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.Breadcrumbs__List{display:flex;flex-wrap:wrap;align-items:center;gap:4px;margin:0;padding:0;list-style:none}.Breadcrumbs__Sep{display:inline-flex;color:var(--color-fg-muted, #a3a3a3)}.Breadcrumbs__Sep lucide-icon{--lucide-stroke: currentColor}.Breadcrumbs__Link,.Breadcrumbs__Current{display:inline-flex;align-items:center;padding:2px 4px;border:none;border-radius:8px;background:transparent;font:inherit;font-size:14px;font-weight:400;text-decoration:none}.Breadcrumbs__Link{color:var(--color-fg-muted, #a3a3a3);cursor:pointer}.Breadcrumbs__Link:hover{color:var(--color-fg-brand, #16a34a)}.Breadcrumbs__Current{color:var(--color-fg, #171717)}\n"] }]
882
+ }] });
883
+
884
+ class TabsComponent {
885
+ items = input([]);
886
+ value = model('');
887
+ label = input('Secciones');
888
+ disabled = input(false, { transform: booleanAttribute });
889
+ select(item) {
890
+ if (item.disabled || this.disabled() || item.value === this.value())
891
+ return;
892
+ this.value.set(item.value);
893
+ }
894
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
895
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: TabsComponent, isStandalone: true, selector: "tabs", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, ngImport: i0, template: `
896
+ <div class="Tabs">
897
+ <div class="Tabs__Bar" role="tablist" [attr.aria-label]="label()">
898
+ @for (item of items(); track item.value) {
899
+ <button
900
+ type="button"
901
+ class="Tabs__Tab"
902
+ role="tab"
903
+ [class.Tabs__Tab--on]="item.value === value()"
904
+ [disabled]="item.disabled === true || disabled()"
905
+ [attr.aria-selected]="item.value === value()"
906
+ (click)="select(item)"
907
+ >
908
+ @if (item.icon) {
909
+ <lucide-icon [name]="item.icon" [size]="14"></lucide-icon>
910
+ }
911
+ <span>{{ item.label }}</span>
912
+ </button>
913
+ }
914
+ </div>
915
+ <div class="Tabs__Panel" role="tabpanel">
916
+ <ng-content></ng-content>
917
+ </div>
918
+ </div>
919
+ `, isInline: true, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.Tabs{display:flex;flex-direction:column;gap:8px;width:100%}.Tabs__Bar{display:flex;flex-wrap:wrap;gap:4px}.Tabs__Tab{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;border:none;border-radius:12px;background:transparent;color:var(--color-fg-muted, #a3a3a3);font:inherit;font-size:14px;font-weight:400;cursor:pointer}.Tabs__Tab lucide-icon{--lucide-stroke: currentColor}.Tabs__Tab:hover:not(:disabled):not(.Tabs__Tab--on){background:var(--color-surface-muted, #f5f5f5);color:var(--color-fg, #171717)}.Tabs__Tab--on{background:var(--color-surface-muted, #f5f5f5);color:var(--color-fg-brand, #16a34a)}.Tabs__Tab:disabled{opacity:.45;cursor:not-allowed}.Tabs__Panel{display:flex;flex-direction:column;gap:4px;min-width:0;font-size:14px;color:var(--color-fg-secondary, #525252)}\n"], dependencies: [{ kind: "component", type: LucideIconComponent, selector: "lucide-icon", inputs: ["name", "size", "spin", "filled"] }] });
920
+ }
921
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TabsComponent, decorators: [{
922
+ type: Component,
923
+ args: [{ selector: 'tabs', standalone: true, imports: [LucideIconComponent], template: `
924
+ <div class="Tabs">
925
+ <div class="Tabs__Bar" role="tablist" [attr.aria-label]="label()">
926
+ @for (item of items(); track item.value) {
927
+ <button
928
+ type="button"
929
+ class="Tabs__Tab"
930
+ role="tab"
931
+ [class.Tabs__Tab--on]="item.value === value()"
932
+ [disabled]="item.disabled === true || disabled()"
933
+ [attr.aria-selected]="item.value === value()"
934
+ (click)="select(item)"
935
+ >
936
+ @if (item.icon) {
937
+ <lucide-icon [name]="item.icon" [size]="14"></lucide-icon>
938
+ }
939
+ <span>{{ item.label }}</span>
940
+ </button>
941
+ }
942
+ </div>
943
+ <div class="Tabs__Panel" role="tabpanel">
944
+ <ng-content></ng-content>
945
+ </div>
946
+ </div>
947
+ `, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.Tabs{display:flex;flex-direction:column;gap:8px;width:100%}.Tabs__Bar{display:flex;flex-wrap:wrap;gap:4px}.Tabs__Tab{display:inline-flex;align-items:center;gap:4px;padding:4px 8px;border:none;border-radius:12px;background:transparent;color:var(--color-fg-muted, #a3a3a3);font:inherit;font-size:14px;font-weight:400;cursor:pointer}.Tabs__Tab lucide-icon{--lucide-stroke: currentColor}.Tabs__Tab:hover:not(:disabled):not(.Tabs__Tab--on){background:var(--color-surface-muted, #f5f5f5);color:var(--color-fg, #171717)}.Tabs__Tab--on{background:var(--color-surface-muted, #f5f5f5);color:var(--color-fg-brand, #16a34a)}.Tabs__Tab:disabled{opacity:.45;cursor:not-allowed}.Tabs__Panel{display:flex;flex-direction:column;gap:4px;min-width:0;font-size:14px;color:var(--color-fg-secondary, #525252)}\n"] }]
948
+ }] });
949
+
950
+ class NoticeComponent {
951
+ tone = input('info');
952
+ title = input(null);
953
+ message = input(null);
954
+ icon = input(null);
955
+ resolvedIcon() {
956
+ if (this.icon())
957
+ return this.icon();
958
+ switch (this.tone()) {
959
+ case 'success':
960
+ return 'check-circle';
961
+ case 'warning':
962
+ return 'triangle-alert';
963
+ case 'danger':
964
+ return 'circle-alert';
965
+ default:
966
+ return 'info';
967
+ }
968
+ }
969
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: NoticeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
970
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: NoticeComponent, isStandalone: true, selector: "notice", inputs: { tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, message: { classPropertyName: "message", publicName: "message", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
971
+ <div
972
+ class="Notice"
973
+ [class.Notice--info]="tone() === 'info'"
974
+ [class.Notice--success]="tone() === 'success'"
975
+ [class.Notice--warning]="tone() === 'warning'"
976
+ [class.Notice--danger]="tone() === 'danger'"
977
+ role="status"
978
+ >
979
+ <span class="Notice__Icon">
980
+ <lucide-icon [name]="resolvedIcon()" [size]="14"></lucide-icon>
981
+ </span>
982
+ <div class="Notice__Body">
983
+ @if (title()) {
984
+ <p class="Notice__Title">{{ title() }}</p>
985
+ }
986
+ @if (message()) {
987
+ <p class="Notice__Message">{{ message() }}</p>
988
+ }
989
+ <ng-content></ng-content>
990
+ </div>
991
+ </div>
992
+ `, isInline: true, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.Notice{display:flex;align-items:flex-start;gap:8px;width:100%;padding:8px;border-radius:12px;font-size:14px;font-weight:400}.Notice lucide-icon{--lucide-stroke: currentColor}.Notice--info{background:color-mix(in srgb,var(--color-info-bg, #eff6ff) 88%,var(--color-surface, #ffffff));color:var(--color-info-fg, #2563eb)}.Notice--success{background:color-mix(in srgb,var(--color-success-bg, #f0fdf4) 88%,var(--color-surface, #ffffff));color:var(--color-success-fg, #16a34a)}.Notice--warning{background:color-mix(in srgb,var(--color-warning-bg, #fffbeb) 88%,var(--color-surface, #ffffff));color:var(--color-warning-fg, #d97706)}.Notice--danger{background:color-mix(in srgb,var(--color-danger-bg, #fef2f2) 88%,var(--color-surface, #ffffff));color:var(--color-danger-fg, #dc2626)}.Notice__Icon{display:inline-flex;flex-shrink:0;margin-top:2px}.Notice__Body{display:flex;flex-direction:column;gap:4px;min-width:0;flex:1}.Notice__Title,.Notice__Message{margin:0;font-size:14px;font-weight:400}.Notice__Title{color:inherit}.Notice__Message{color:var(--color-fg-secondary, #525252)}\n"], dependencies: [{ kind: "component", type: LucideIconComponent, selector: "lucide-icon", inputs: ["name", "size", "spin", "filled"] }] });
993
+ }
994
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: NoticeComponent, decorators: [{
995
+ type: Component,
996
+ args: [{ selector: 'notice', standalone: true, imports: [LucideIconComponent], template: `
997
+ <div
998
+ class="Notice"
999
+ [class.Notice--info]="tone() === 'info'"
1000
+ [class.Notice--success]="tone() === 'success'"
1001
+ [class.Notice--warning]="tone() === 'warning'"
1002
+ [class.Notice--danger]="tone() === 'danger'"
1003
+ role="status"
1004
+ >
1005
+ <span class="Notice__Icon">
1006
+ <lucide-icon [name]="resolvedIcon()" [size]="14"></lucide-icon>
1007
+ </span>
1008
+ <div class="Notice__Body">
1009
+ @if (title()) {
1010
+ <p class="Notice__Title">{{ title() }}</p>
1011
+ }
1012
+ @if (message()) {
1013
+ <p class="Notice__Message">{{ message() }}</p>
1014
+ }
1015
+ <ng-content></ng-content>
1016
+ </div>
1017
+ </div>
1018
+ `, styles: [":host{display:block;width:100%;user-select:none;-webkit-user-select:none}.Notice{display:flex;align-items:flex-start;gap:8px;width:100%;padding:8px;border-radius:12px;font-size:14px;font-weight:400}.Notice lucide-icon{--lucide-stroke: currentColor}.Notice--info{background:color-mix(in srgb,var(--color-info-bg, #eff6ff) 88%,var(--color-surface, #ffffff));color:var(--color-info-fg, #2563eb)}.Notice--success{background:color-mix(in srgb,var(--color-success-bg, #f0fdf4) 88%,var(--color-surface, #ffffff));color:var(--color-success-fg, #16a34a)}.Notice--warning{background:color-mix(in srgb,var(--color-warning-bg, #fffbeb) 88%,var(--color-surface, #ffffff));color:var(--color-warning-fg, #d97706)}.Notice--danger{background:color-mix(in srgb,var(--color-danger-bg, #fef2f2) 88%,var(--color-surface, #ffffff));color:var(--color-danger-fg, #dc2626)}.Notice__Icon{display:inline-flex;flex-shrink:0;margin-top:2px}.Notice__Body{display:flex;flex-direction:column;gap:4px;min-width:0;flex:1}.Notice__Title,.Notice__Message{margin:0;font-size:14px;font-weight:400}.Notice__Title{color:inherit}.Notice__Message{color:var(--color-fg-secondary, #525252)}\n"] }]
361
1019
  }] });
362
1020
 
363
1021
  /*
@@ -368,5 +1026,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImpo
368
1026
  * Generated bundle index. Do not edit.
369
1027
  */
370
1028
 
371
- export { EmptyStateComponent, KeyValueListComponent, LoadErrorComponent, SectionHeaderComponent, SmartPaginationComponent };
1029
+ export { AccordionComponent, AccordionItemComponent, AvatarComponent, BreadcrumbsComponent, DataTableComponent, EmptyStateComponent, KeyValueListComponent, ListRowComponent, LoadErrorComponent, NoticeComponent, SectionHeaderComponent, SkeletonComponent, SmartPaginationComponent, StepperComponent, SurfaceCardComponent, TabsComponent };
372
1030
  //# sourceMappingURL=xosue-utils-helpers.mjs.map