@cerca/design-system 1.0.3 → 1.0.4

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.
@@ -224,6 +224,7 @@ class AdInputComponent {
224
224
  size = input('small', ...(ngDevMode ? [{ debugName: "size" }] : []));
225
225
  prefix = input(undefined, ...(ngDevMode ? [{ debugName: "prefix" }] : []));
226
226
  suffix = input(undefined, ...(ngDevMode ? [{ debugName: "suffix" }] : []));
227
+ mask = input(undefined, ...(ngDevMode ? [{ debugName: "mask" }] : []));
227
228
  value = '';
228
229
  passwordVisible = signal(false, ...(ngDevMode ? [{ debugName: "passwordVisible" }] : []));
229
230
  onChange = () => { };
@@ -234,19 +235,61 @@ class AdInputComponent {
234
235
  }
235
236
  return this.type();
236
237
  }, ...(ngDevMode ? [{ debugName: "inputType" }] : []));
238
+ isIcon(name) {
239
+ if (!name)
240
+ return false;
241
+ // Simple heuristic: if it contains '$' or is just one character, it's likely text
242
+ // In our system, icon names are usually strings like 'user', 'lock', etc.
243
+ // We can also check against a known set of icons if needed, but for now:
244
+ const knownIcons = ['user', 'lock', 'eye', 'plus', 'download', 'eye-invisible', 'email', 'person', 'search', 'logout', 'menu'];
245
+ return knownIcons.includes(name);
246
+ }
237
247
  onInputChange(event) {
238
248
  const target = event.target;
239
- this.value = target.value;
240
- this.onChange(this.value);
249
+ let val = target.value;
250
+ if (this.mask() === 'currency') {
251
+ // 1. Remove all non-numeric characters except the decimal separator (comma)
252
+ let cleanValue = val.replace(/[^\d,]/g, '');
253
+ // 2. Handle multiple commas (keep only the first one)
254
+ const parts = cleanValue.split(',');
255
+ if (parts.length > 2) {
256
+ cleanValue = parts[0] + ',' + parts.slice(1).join('');
257
+ }
258
+ // 3. Format for display (Thousand separators as dots)
259
+ const formatted = this.formatCurrencyDisplay(cleanValue);
260
+ target.value = formatted;
261
+ this.value = formatted;
262
+ // 4. Update the model with numeric value
263
+ const numericValue = parseFloat(cleanValue.replace(',', '.'));
264
+ this.onChange(isNaN(numericValue) ? null : numericValue);
265
+ }
266
+ else {
267
+ this.value = val;
268
+ this.onChange(this.value);
269
+ }
241
270
  this.onTouched();
242
271
  }
272
+ formatCurrencyDisplay(value) {
273
+ if (!value)
274
+ return '';
275
+ const parts = value.split(',');
276
+ // Add dots every 3 digits
277
+ parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, '.');
278
+ return parts.join(',');
279
+ }
243
280
  togglePasswordVisibility() {
244
281
  if (this.type() === 'password') {
245
282
  this.passwordVisible.update(visible => !visible);
246
283
  }
247
284
  }
248
285
  writeValue(value) {
249
- this.value = value || '';
286
+ if (this.mask() === 'currency' && value !== undefined && value !== null) {
287
+ const stringValue = value.toString().replace('.', ',');
288
+ this.value = this.formatCurrencyDisplay(stringValue);
289
+ }
290
+ else {
291
+ this.value = value || '';
292
+ }
250
293
  }
251
294
  registerOnChange(fn) {
252
295
  this.onChange = fn;
@@ -258,13 +301,13 @@ class AdInputComponent {
258
301
  this._disabled.set(isDisabled);
259
302
  }
260
303
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
261
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: AdInputComponent, isStandalone: true, selector: "ad-input", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, prefix: { classPropertyName: "prefix", publicName: "prefix", isSignal: true, isRequired: false, transformFunction: null }, suffix: { classPropertyName: "suffix", publicName: "suffix", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
304
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: AdInputComponent, isStandalone: true, selector: "ad-input", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, prefix: { classPropertyName: "prefix", publicName: "prefix", isSignal: true, isRequired: false, transformFunction: null }, suffix: { classPropertyName: "suffix", publicName: "suffix", isSignal: true, isRequired: false, transformFunction: null }, mask: { classPropertyName: "mask", publicName: "mask", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
262
305
  {
263
306
  provide: NG_VALUE_ACCESSOR,
264
307
  useExisting: forwardRef(() => AdInputComponent),
265
308
  multi: true
266
309
  }
267
- ], ngImport: i0, template: "@if (label()) {\r\n<label class=\"block text-sm font-medium leading-6 text-slate-900 mb-2\">{{ label() }}</label>\r\n}\r\n\r\n<div class=\"flex items-center w-full rounded-md border border-slate-300 bg-white px-3 py-1.5 shadow-sm transition-all focus-within:border-cerca-primary\"\r\n [class.bg-slate-50]=\"disabled\" [class.text-slate-500]=\"disabled\" [class.cursor-not-allowed]=\"disabled\"\r\n [class.border-cerca-alert]=\"error()\" [class.text-cerca-alert-text]=\"error()\"\r\n [class.focus-within:border-cerca-alert]=\"error()\">\r\n\r\n @if (prefix()) {\r\n <span class=\"mr-2 flex items-center\" [class.text-slate-500]=\"!error()\" [class.text-cerca-alert-text]=\"error()\">\r\n <ad-icon [name]=\"prefix()!\" size=\"sm\"></ad-icon>\r\n </span>\r\n }\r\n\r\n @if (type() === 'textarea') {\r\n <textarea [rows]=\"rows()\" [placeholder]=\"placeholder()\" [disabled]=\"disabled\" [(ngModel)]=\"value\"\r\n (ngModelChange)=\"onChange($event)\" (blur)=\"onTouched()\"\r\n class=\"block w-full border-0 p-0 text-slate-900 placeholder:text-slate-400 focus:ring-0 outline-none sm:text-sm sm:leading-6 bg-transparent disabled:cursor-not-allowed resize-none\"></textarea>\r\n } @else {\r\n <input [type]=\"inputType()\" [placeholder]=\"placeholder()\" [disabled]=\"disabled\" [(ngModel)]=\"value\"\r\n (ngModelChange)=\"onChange($event)\" (blur)=\"onTouched()\"\r\n class=\"block w-full border-0 p-0 text-slate-900 placeholder:text-slate-400 focus:ring-0 outline-none sm:text-sm sm:leading-6 bg-transparent disabled:cursor-not-allowed\" />\r\n }\r\n\r\n @if (type() === 'password') {\r\n <button type=\"button\" (click)=\"togglePasswordVisibility()\"\r\n class=\"ml-2 text-slate-500 hover:text-slate-700 focus:outline-none cursor-pointer\">\r\n <ad-icon [name]=\"passwordVisible() ? 'eye-invisible' : 'eye'\" size=\"sm\"></ad-icon>\r\n </button>\r\n }\r\n\r\n @if (type() !== 'password' && suffix()) {\r\n <span class=\"ml-2 text-slate-500 flex items-center\">\r\n <ad-icon [name]=\"suffix()!\" size=\"sm\"></ad-icon>\r\n </span>\r\n }\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AdIconComponent, selector: "ad-icon", inputs: ["name", "size", "color"] }] });
310
+ ], ngImport: i0, template: "@if (label()) {\r\n<label class=\"block text-sm font-medium leading-6 text-slate-900 mb-2\">{{ label() }}</label>\r\n}\r\n\r\n<div class=\"flex items-center w-full rounded-md border border-slate-300 bg-white px-3 py-1.5 shadow-sm transition-all focus-within:border-cerca-primary\"\r\n [class.bg-slate-50]=\"disabled\" [class.text-slate-500]=\"disabled\" [class.cursor-not-allowed]=\"disabled\"\r\n [class.border-cerca-alert]=\"error()\" [class.text-cerca-alert-text]=\"error()\"\r\n [class.focus-within:border-cerca-alert]=\"error()\">\r\n\r\n @if (prefix()) {\r\n <span class=\"mr-2 flex items-center whitespace-nowrap\" [class.text-slate-500]=\"!error()\"\r\n [class.text-cerca-alert-text]=\"error()\">\r\n @if (isIcon(prefix())) {\r\n <ad-icon [name]=\"prefix()!\" size=\"sm\"></ad-icon>\r\n } @else {\r\n <span class=\"text-sm font-medium\">{{ prefix() }}</span>\r\n }\r\n </span>\r\n }\r\n\r\n @if (type() === 'textarea') {\r\n <textarea [rows]=\"rows()\" [placeholder]=\"placeholder()\" [disabled]=\"disabled\" [(ngModel)]=\"value\"\r\n (ngModelChange)=\"onChange($event)\" (blur)=\"onTouched()\"\r\n class=\"block w-full border-0 p-0 text-slate-900 placeholder:text-slate-400 focus:ring-0 outline-none sm:text-sm sm:leading-6 bg-transparent disabled:cursor-not-allowed resize-none\"></textarea>\r\n } @else {\r\n <input [type]=\"inputType()\" [placeholder]=\"placeholder()\" [disabled]=\"disabled\" [value]=\"value\"\r\n (input)=\"onInputChange($event)\" (blur)=\"onTouched()\"\r\n class=\"block w-full border-0 p-0 text-slate-900 placeholder:text-slate-400 focus:ring-0 outline-none sm:text-sm sm:leading-6 bg-transparent disabled:cursor-not-allowed\" />\r\n }\r\n\r\n @if (type() === 'password') {\r\n <button type=\"button\" (click)=\"togglePasswordVisibility()\"\r\n class=\"ml-2 text-slate-500 hover:text-slate-700 focus:outline-none cursor-pointer\">\r\n <ad-icon [name]=\"passwordVisible() ? 'eye-invisible' : 'eye'\" size=\"sm\"></ad-icon>\r\n </button>\r\n }\r\n\r\n @if (type() !== 'password' && suffix()) {\r\n <span class=\"ml-2 text-slate-500 flex items-center\">\r\n <ad-icon [name]=\"suffix()!\" size=\"sm\"></ad-icon>\r\n </span>\r\n }\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AdIconComponent, selector: "ad-icon", inputs: ["name", "size", "color"] }] });
268
311
  }
269
312
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdInputComponent, decorators: [{
270
313
  type: Component,
@@ -278,10 +321,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImpor
278
321
  useExisting: forwardRef(() => AdInputComponent),
279
322
  multi: true
280
323
  }
281
- ], template: "@if (label()) {\r\n<label class=\"block text-sm font-medium leading-6 text-slate-900 mb-2\">{{ label() }}</label>\r\n}\r\n\r\n<div class=\"flex items-center w-full rounded-md border border-slate-300 bg-white px-3 py-1.5 shadow-sm transition-all focus-within:border-cerca-primary\"\r\n [class.bg-slate-50]=\"disabled\" [class.text-slate-500]=\"disabled\" [class.cursor-not-allowed]=\"disabled\"\r\n [class.border-cerca-alert]=\"error()\" [class.text-cerca-alert-text]=\"error()\"\r\n [class.focus-within:border-cerca-alert]=\"error()\">\r\n\r\n @if (prefix()) {\r\n <span class=\"mr-2 flex items-center\" [class.text-slate-500]=\"!error()\" [class.text-cerca-alert-text]=\"error()\">\r\n <ad-icon [name]=\"prefix()!\" size=\"sm\"></ad-icon>\r\n </span>\r\n }\r\n\r\n @if (type() === 'textarea') {\r\n <textarea [rows]=\"rows()\" [placeholder]=\"placeholder()\" [disabled]=\"disabled\" [(ngModel)]=\"value\"\r\n (ngModelChange)=\"onChange($event)\" (blur)=\"onTouched()\"\r\n class=\"block w-full border-0 p-0 text-slate-900 placeholder:text-slate-400 focus:ring-0 outline-none sm:text-sm sm:leading-6 bg-transparent disabled:cursor-not-allowed resize-none\"></textarea>\r\n } @else {\r\n <input [type]=\"inputType()\" [placeholder]=\"placeholder()\" [disabled]=\"disabled\" [(ngModel)]=\"value\"\r\n (ngModelChange)=\"onChange($event)\" (blur)=\"onTouched()\"\r\n class=\"block w-full border-0 p-0 text-slate-900 placeholder:text-slate-400 focus:ring-0 outline-none sm:text-sm sm:leading-6 bg-transparent disabled:cursor-not-allowed\" />\r\n }\r\n\r\n @if (type() === 'password') {\r\n <button type=\"button\" (click)=\"togglePasswordVisibility()\"\r\n class=\"ml-2 text-slate-500 hover:text-slate-700 focus:outline-none cursor-pointer\">\r\n <ad-icon [name]=\"passwordVisible() ? 'eye-invisible' : 'eye'\" size=\"sm\"></ad-icon>\r\n </button>\r\n }\r\n\r\n @if (type() !== 'password' && suffix()) {\r\n <span class=\"ml-2 text-slate-500 flex items-center\">\r\n <ad-icon [name]=\"suffix()!\" size=\"sm\"></ad-icon>\r\n </span>\r\n }\r\n</div>" }]
324
+ ], template: "@if (label()) {\r\n<label class=\"block text-sm font-medium leading-6 text-slate-900 mb-2\">{{ label() }}</label>\r\n}\r\n\r\n<div class=\"flex items-center w-full rounded-md border border-slate-300 bg-white px-3 py-1.5 shadow-sm transition-all focus-within:border-cerca-primary\"\r\n [class.bg-slate-50]=\"disabled\" [class.text-slate-500]=\"disabled\" [class.cursor-not-allowed]=\"disabled\"\r\n [class.border-cerca-alert]=\"error()\" [class.text-cerca-alert-text]=\"error()\"\r\n [class.focus-within:border-cerca-alert]=\"error()\">\r\n\r\n @if (prefix()) {\r\n <span class=\"mr-2 flex items-center whitespace-nowrap\" [class.text-slate-500]=\"!error()\"\r\n [class.text-cerca-alert-text]=\"error()\">\r\n @if (isIcon(prefix())) {\r\n <ad-icon [name]=\"prefix()!\" size=\"sm\"></ad-icon>\r\n } @else {\r\n <span class=\"text-sm font-medium\">{{ prefix() }}</span>\r\n }\r\n </span>\r\n }\r\n\r\n @if (type() === 'textarea') {\r\n <textarea [rows]=\"rows()\" [placeholder]=\"placeholder()\" [disabled]=\"disabled\" [(ngModel)]=\"value\"\r\n (ngModelChange)=\"onChange($event)\" (blur)=\"onTouched()\"\r\n class=\"block w-full border-0 p-0 text-slate-900 placeholder:text-slate-400 focus:ring-0 outline-none sm:text-sm sm:leading-6 bg-transparent disabled:cursor-not-allowed resize-none\"></textarea>\r\n } @else {\r\n <input [type]=\"inputType()\" [placeholder]=\"placeholder()\" [disabled]=\"disabled\" [value]=\"value\"\r\n (input)=\"onInputChange($event)\" (blur)=\"onTouched()\"\r\n class=\"block w-full border-0 p-0 text-slate-900 placeholder:text-slate-400 focus:ring-0 outline-none sm:text-sm sm:leading-6 bg-transparent disabled:cursor-not-allowed\" />\r\n }\r\n\r\n @if (type() === 'password') {\r\n <button type=\"button\" (click)=\"togglePasswordVisibility()\"\r\n class=\"ml-2 text-slate-500 hover:text-slate-700 focus:outline-none cursor-pointer\">\r\n <ad-icon [name]=\"passwordVisible() ? 'eye-invisible' : 'eye'\" size=\"sm\"></ad-icon>\r\n </button>\r\n }\r\n\r\n @if (type() !== 'password' && suffix()) {\r\n <span class=\"ml-2 text-slate-500 flex items-center\">\r\n <ad-icon [name]=\"suffix()!\" size=\"sm\"></ad-icon>\r\n </span>\r\n }\r\n</div>" }]
282
325
  }], propDecorators: { type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], disabled: [{
283
326
  type: Input
284
- }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], prefix: [{ type: i0.Input, args: [{ isSignal: true, alias: "prefix", required: false }] }], suffix: [{ type: i0.Input, args: [{ isSignal: true, alias: "suffix", required: false }] }] } });
327
+ }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], prefix: [{ type: i0.Input, args: [{ isSignal: true, alias: "prefix", required: false }] }], suffix: [{ type: i0.Input, args: [{ isSignal: true, alias: "suffix", required: false }] }], mask: [{ type: i0.Input, args: [{ isSignal: true, alias: "mask", required: false }] }] } });
285
328
 
286
329
  class AdSelectComponent {
287
330
  options = input([], ...(ngDevMode ? [{ debugName: "options" }] : []));
@@ -435,10 +478,10 @@ class DynamicFieldComponent {
435
478
  }
436
479
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: DynamicFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
437
480
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: DynamicFieldComponent, isStandalone: true, selector: "ad-dynamic-field", inputs: { field: { classPropertyName: "field", publicName: "field", isSignal: true, isRequired: true, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
438
- <div class="mb-4" [formGroup]="form()">
481
+ <div [formGroup]="form()">
439
482
  <!-- Label -->
440
483
  @if (renderType !== 'checkbox' && renderType !== 'switch' && field().label) {
441
- <label [for]="controlName" class="block text-sm font-medium leading-6 text-slate-900 dark:text-slate-200 mb-2">
484
+ <label [for]="controlName" class="block text-sm font-medium leading-6 text-slate-900 dark:text-slate-200 mb-1">
442
485
  {{ field().label }}
443
486
  @if (isRequired) { <span class="text-cerca-rose">*</span> }
444
487
  </label>
@@ -505,6 +548,16 @@ class DynamicFieldComponent {
505
548
  [formControlName]="controlName"
506
549
  [options]="getSwitchOptions()">
507
550
  </ad-switch>
551
+ }
552
+ @case ('currency') {
553
+ <ad-input
554
+ [formControlName]="controlName"
555
+ [placeholder]="placeholder"
556
+ type="text"
557
+ prefix="$"
558
+ mask="currency"
559
+ [disabled]="field().disabled || false">
560
+ </ad-input>
508
561
  }
509
562
  @case ('custom') {
510
563
  @if (getRenderer(controlName); as component) {
@@ -528,7 +581,7 @@ class DynamicFieldComponent {
528
581
  </p>
529
582
  }
530
583
  </div>
531
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: AdInputComponent, selector: "ad-input", inputs: ["type", "placeholder", "label", "error", "rows", "disabled", "size", "prefix", "suffix"] }, { kind: "component", type: AdSelectComponent, selector: "ad-select", inputs: ["options", "placeholder", "label", "size", "allowClear", "showSearch", "disabled"] }, { kind: "component", type: AdSwitchComponent, selector: "ad-switch", inputs: ["options", "disabled"] }] });
584
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: AdInputComponent, selector: "ad-input", inputs: ["type", "placeholder", "label", "error", "rows", "disabled", "size", "prefix", "suffix", "mask"] }, { kind: "component", type: AdSelectComponent, selector: "ad-select", inputs: ["options", "placeholder", "label", "size", "allowClear", "showSearch", "disabled"] }, { kind: "component", type: AdSwitchComponent, selector: "ad-switch", inputs: ["options", "disabled"] }] });
532
585
  }
533
586
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: DynamicFieldComponent, decorators: [{
534
587
  type: Component,
@@ -537,10 +590,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImpor
537
590
  standalone: true,
538
591
  imports: [CommonModule, ReactiveFormsModule, AdInputComponent, AdSelectComponent, AdSwitchComponent],
539
592
  template: `
540
- <div class="mb-4" [formGroup]="form()">
593
+ <div [formGroup]="form()">
541
594
  <!-- Label -->
542
595
  @if (renderType !== 'checkbox' && renderType !== 'switch' && field().label) {
543
- <label [for]="controlName" class="block text-sm font-medium leading-6 text-slate-900 dark:text-slate-200 mb-2">
596
+ <label [for]="controlName" class="block text-sm font-medium leading-6 text-slate-900 dark:text-slate-200 mb-1">
544
597
  {{ field().label }}
545
598
  @if (isRequired) { <span class="text-cerca-rose">*</span> }
546
599
  </label>
@@ -607,6 +660,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImpor
607
660
  [formControlName]="controlName"
608
661
  [options]="getSwitchOptions()">
609
662
  </ad-switch>
663
+ }
664
+ @case ('currency') {
665
+ <ad-input
666
+ [formControlName]="controlName"
667
+ [placeholder]="placeholder"
668
+ type="text"
669
+ prefix="$"
670
+ mask="currency"
671
+ [disabled]="field().disabled || false">
672
+ </ad-input>
610
673
  }
611
674
  @case ('custom') {
612
675
  @if (getRenderer(controlName); as component) {
@@ -853,20 +916,27 @@ class AdFormRendererComponent {
853
916
  };
854
917
  getGridClass(props) {
855
918
  const classes = [];
856
- // Base Span (Mobile/Default) mapped to MD because our grid starts at MD
919
+ // Helper to map 24-scale (AntD) to 12-scale (Tailwind)
920
+ const to12Scale = (val) => {
921
+ if (!val)
922
+ return 12;
923
+ return Math.max(1, Math.min(12, Math.round(val / 2)));
924
+ };
925
+ // Base Span (Mobile/Default)
857
926
  if (props?.span) {
858
- classes.push(this.mdColSpanMap[props.span] || 'md:col-span-12');
927
+ const span12 = to12Scale(props.span);
928
+ classes.push(this.mdColSpanMap[span12] || 'md:col-span-12');
859
929
  }
860
930
  else {
861
931
  classes.push('md:col-span-12'); // Default full width
862
932
  }
863
933
  // LG Override
864
934
  if (props?.lg) {
865
- classes.push(this.lgColSpanMap[props.lg]);
935
+ classes.push(this.lgColSpanMap[to12Scale(props.lg)]);
866
936
  }
867
937
  // XL Override
868
938
  if (props?.xl) {
869
- classes.push(this.xlColSpanMap[props.xl]);
939
+ classes.push(this.xlColSpanMap[to12Scale(props.xl)]);
870
940
  }
871
941
  return classes.join(' ');
872
942
  }
@@ -893,7 +963,7 @@ class AdFormRendererComponent {
893
963
  @switch (node.layoutType) {
894
964
 
895
965
  @case ('row') {
896
- <div class="grid grid-cols-1 md:grid-cols-12 gap-6 items-start w-full md:col-span-12">
966
+ <div class="grid grid-cols-1 md:grid-cols-12 gap-4 items-start w-full md:col-span-12">
897
967
  <ad-form-renderer [nodes]="node.children || []" [form]="form()"></ad-form-renderer>
898
968
  </div>
899
969
  }
@@ -971,7 +1041,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImpor
971
1041
  @switch (node.layoutType) {
972
1042
 
973
1043
  @case ('row') {
974
- <div class="grid grid-cols-1 md:grid-cols-12 gap-6 items-start w-full md:col-span-12">
1044
+ <div class="grid grid-cols-1 md:grid-cols-12 gap-4 items-start w-full md:col-span-12">
975
1045
  <ad-form-renderer [nodes]="node.children || []" [form]="form()"></ad-form-renderer>
976
1046
  </div>
977
1047
  }
@@ -1034,7 +1104,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImpor
1034
1104
  }]
1035
1105
  }], propDecorators: { nodes: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodes", required: true }] }], form: [{ type: i0.Input, args: [{ isSignal: true, alias: "form", required: true }] }] } });
1036
1106
 
1037
- class FormEngineComponent {
1107
+ class AdFormEngineComponent {
1038
1108
  // Inputs (Signals)
1039
1109
  schema = input.required(...(ngDevMode ? [{ debugName: "schema" }] : []));
1040
1110
  model = input({}, ...(ngDevMode ? [{ debugName: "model" }] : []));
@@ -1084,14 +1154,14 @@ class FormEngineComponent {
1084
1154
  onCancel() {
1085
1155
  this.formCancel.emit();
1086
1156
  }
1087
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: FormEngineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1088
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: FormEngineComponent, isStandalone: true, selector: "ad-form-engine", inputs: { schema: { classPropertyName: "schema", publicName: "schema", isSignal: true, isRequired: true, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: false, transformFunction: null }, showCancel: { classPropertyName: "showCancel", publicName: "showCancel", isSignal: true, isRequired: false, transformFunction: null }, showSubmit: { classPropertyName: "showSubmit", publicName: "showSubmit", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { formSubmit: "formSubmit", formCancel: "formCancel" }, ngImport: i0, template: `
1157
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdFormEngineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1158
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: AdFormEngineComponent, isStandalone: true, selector: "ad-form-engine", inputs: { schema: { classPropertyName: "schema", publicName: "schema", isSignal: true, isRequired: true, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: false, transformFunction: null }, showCancel: { classPropertyName: "showCancel", publicName: "showCancel", isSignal: true, isRequired: false, transformFunction: null }, showSubmit: { classPropertyName: "showSubmit", publicName: "showSubmit", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { formSubmit: "formSubmit", formCancel: "formCancel" }, ngImport: i0, template: `
1089
1159
  @if (form()) {
1090
1160
  <form [formGroup]="form()" class="space-y-6" (ngSubmit)="submit()">
1091
1161
 
1092
1162
  <!-- NEW: Recursive Schema Rendering -->
1093
1163
  @if (schema().fields) {
1094
- <div class="grid grid-cols-1 md:grid-cols-12 gap-6 w-full">
1164
+ <div class="grid grid-cols-1 md:grid-cols-12 gap-4 w-full">
1095
1165
  <ad-form-renderer [nodes]="schema().fields!" [form]="form()"></ad-form-renderer>
1096
1166
  </div>
1097
1167
  }
@@ -1129,7 +1199,7 @@ class FormEngineComponent {
1129
1199
  }
1130
1200
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DynamicLayoutComponent, selector: "ad-dynamic-layout", inputs: ["field", "form"] }, { kind: "component", type: AdButtonComponent, selector: "ad-button", inputs: ["variant", "type", "disabled", "loading", "icon", "size", "block"] }, { kind: "component", type: AdFormRendererComponent, selector: "ad-form-renderer", inputs: ["nodes", "form"] }] });
1131
1201
  }
1132
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: FormEngineComponent, decorators: [{
1202
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdFormEngineComponent, decorators: [{
1133
1203
  type: Component,
1134
1204
  args: [{
1135
1205
  selector: 'ad-form-engine',
@@ -1141,7 +1211,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImpor
1141
1211
 
1142
1212
  <!-- NEW: Recursive Schema Rendering -->
1143
1213
  @if (schema().fields) {
1144
- <div class="grid grid-cols-1 md:grid-cols-12 gap-6 w-full">
1214
+ <div class="grid grid-cols-1 md:grid-cols-12 gap-4 w-full">
1145
1215
  <ad-form-renderer [nodes]="schema().fields!" [form]="form()"></ad-form-renderer>
1146
1216
  </div>
1147
1217
  }
@@ -1223,14 +1293,14 @@ class AdModalWrapperComponent {
1223
1293
  </div>
1224
1294
  }
1225
1295
  </ad-modal>
1226
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AdModalComponent, selector: "ad-modal", inputs: ["resource"], outputs: ["close"] }, { kind: "component", type: FormEngineComponent, selector: "ad-form-engine", inputs: ["schema", "model", "showCancel", "showSubmit"], outputs: ["formSubmit", "formCancel"] }] });
1296
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AdModalComponent, selector: "ad-modal", inputs: ["resource"], outputs: ["close"] }, { kind: "component", type: AdFormEngineComponent, selector: "ad-form-engine", inputs: ["schema", "model", "showCancel", "showSubmit"], outputs: ["formSubmit", "formCancel"] }] });
1227
1297
  }
1228
1298
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdModalWrapperComponent, decorators: [{
1229
1299
  type: Component,
1230
1300
  args: [{
1231
1301
  selector: 'ad-modal-wrapper',
1232
1302
  standalone: true,
1233
- imports: [CommonModule, AdModalComponent, FormEngineComponent],
1303
+ imports: [CommonModule, AdModalComponent, AdFormEngineComponent],
1234
1304
  template: `
1235
1305
  <ad-modal
1236
1306
  [resource]="modalResource()"
@@ -1296,25 +1366,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImpor
1296
1366
  }], ctorParameters: () => [{ type: i0.ApplicationRef }, { type: i0.EnvironmentInjector }] });
1297
1367
 
1298
1368
  class TableEngineComponent {
1299
- // Signals
1300
- schema = input.required(...(ngDevMode ? [{ debugName: "schema" }] : [])); // Optional if using columns directly, but Schema approach implies passing the whole schema object usually.
1301
- // Actually, keeping flexible to support both direct cols or schema.
1302
- // Let's support independent inputs for now to match old API but strict typed.
1303
- // Re-defining inputs to match Core Schema
1369
+ schema = input.required(...(ngDevMode ? [{ debugName: "schema" }] : []));
1304
1370
  columns = input([], ...(ngDevMode ? [{ debugName: "columns" }] : []));
1305
1371
  data = input([], ...(ngDevMode ? [{ debugName: "data" }] : []));
1306
1372
  loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
1307
1373
  total = input(0, ...(ngDevMode ? [{ debugName: "total" }] : []));
1308
1374
  pageSize = input(10, ...(ngDevMode ? [{ debugName: "pageSize" }] : []));
1309
1375
  pageIndex = input(1, ...(ngDevMode ? [{ debugName: "pageIndex" }] : []));
1310
- actions = input([], ...(ngDevMode ? [{ debugName: "actions" }] : [])); // Parameterized actions
1376
+ actions = input([], ...(ngDevMode ? [{ debugName: "actions" }] : []));
1311
1377
  queryParamsChange = output();
1312
1378
  action = output();
1313
1379
  Math = Math;
1314
1380
  displayColumns = computed(() => {
1315
- // Filter visible if property exists, or default true
1316
- // CoreTableColumn doesn't have is_v displayColumns = computed(() => {
1317
- // Use schema columns if available, otherwise fallback to columns input
1318
1381
  return this.schema().columns || this.columns();
1319
1382
  }, ...(ngDevMode ? [{ debugName: "displayColumns" }] : []));
1320
1383
  hasActions = computed(() => {
@@ -1322,12 +1385,24 @@ class TableEngineComponent {
1322
1385
  const inputActions = this.actions();
1323
1386
  return schemaActions.length > 0 || inputActions.length > 0;
1324
1387
  }, ...(ngDevMode ? [{ debugName: "hasActions" }] : []));
1325
- // Helper to get combined actions
1388
+ stickyActions = computed(() => {
1389
+ return this.schema().stickyActions ?? false;
1390
+ }, ...(ngDevMode ? [{ debugName: "stickyActions" }] : []));
1326
1391
  getActions = computed(() => {
1327
1392
  const schemaActions = this.schema().actions || [];
1328
1393
  const inputActions = this.actions();
1329
1394
  return [...schemaActions, ...inputActions];
1330
1395
  }, ...(ngDevMode ? [{ debugName: "getActions" }] : []));
1396
+ /**
1397
+ * Returns the box-shadow for a sticky column to create a visual separator
1398
+ */
1399
+ getStickyColumnShadow(sticky) {
1400
+ if (sticky === 'left')
1401
+ return '4px 0 8px -4px rgba(0,0,0,0.08)';
1402
+ if (sticky === 'right')
1403
+ return '-4px 0 8px -4px rgba(0,0,0,0.08)';
1404
+ return null;
1405
+ }
1331
1406
  mapVariant(color) {
1332
1407
  if (color === 'primary')
1333
1408
  return 'primary';
@@ -1353,96 +1428,120 @@ class TableEngineComponent {
1353
1428
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: TableEngineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1354
1429
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: TableEngineComponent, isStandalone: true, selector: "ad-table-engine", inputs: { schema: { classPropertyName: "schema", publicName: "schema", isSignal: true, isRequired: true, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, total: { classPropertyName: "total", publicName: "total", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, pageIndex: { classPropertyName: "pageIndex", publicName: "pageIndex", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { queryParamsChange: "queryParamsChange", action: "action" }, ngImport: i0, template: `
1355
1430
  <div class="flow-root">
1356
- <div class="-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8">
1357
- <div class="inline-block min-w-full py-2 align-middle sm:px-6 lg:px-8">
1358
- <div class="relative">
1359
- @if (loading()) {
1360
- <div class="absolute inset-0 bg-white/50 z-10 flex items-center justify-center">
1361
- <svg class="animate-spin h-8 w-8 text-sky-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
1362
- <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
1363
- <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
1364
- </svg>
1365
- </div>
1366
- }
1367
-
1368
- <table class="min-w-full divide-y divide-slate-300">
1369
- <thead>
1431
+ <!-- Scroll container: overflow-x-auto allows horizontal scroll, sticky works inside it -->
1432
+ <div class="relative rounded-xl border border-slate-200/70 overflow-x-auto">
1433
+ @if (loading()) {
1434
+ <div class="absolute inset-0 bg-white/60 backdrop-blur-[1px] z-30 flex items-center justify-center">
1435
+ <svg class="animate-spin h-8 w-8 text-sky-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
1436
+ <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
1437
+ <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
1438
+ </svg>
1439
+ </div>
1440
+ }
1441
+
1442
+ <table class="min-w-full">
1443
+ <thead>
1444
+ <tr class="bg-slate-50 border-b border-slate-200">
1445
+ @for (column of displayColumns(); track column.key) {
1446
+ <th scope="col"
1447
+ class="px-5 py-3.5 text-left text-xs font-semibold text-slate-500 uppercase tracking-wider"
1448
+ [style.position]="column.sticky ? 'sticky' : null"
1449
+ [style.left]="column.sticky === 'left' ? '0' : null"
1450
+ [style.right]="column.sticky === 'right' ? '0' : null"
1451
+ [style.z-index]="column.sticky ? '20' : null"
1452
+ [style.background-color]="column.sticky ? '#f8fafc' : null"
1453
+ [style.box-shadow]="getStickyColumnShadow(column.sticky)"
1454
+ [style.width]="column.width || 'auto'"
1455
+ [style.min-width]="column.width || 'auto'"
1456
+ [style.max-width]="column.width || 'none'">
1457
+ {{ column.label }}
1458
+ </th>
1459
+ }
1460
+ @if (hasActions()) {
1461
+ <th scope="col"
1462
+ class="px-5 py-3.5 text-center text-xs font-semibold text-slate-500 uppercase tracking-wider"
1463
+ [style.position]="stickyActions() ? 'sticky' : null"
1464
+ [style.right]="stickyActions() ? '0' : null"
1465
+ [style.z-index]="stickyActions() ? '20' : null"
1466
+ [style.background-color]="stickyActions() ? '#f8fafc' : null"
1467
+ [style.box-shadow]="stickyActions() ? '-4px 0 8px -4px rgba(0,0,0,0.08)' : null">
1468
+ Acciones
1469
+ </th>
1470
+ }
1471
+ </tr>
1472
+ </thead>
1473
+ <tbody class="bg-white divide-y divide-slate-100">
1474
+ @for (item of data(); track item; let idx = $index) {
1475
+ <tr class="hover:bg-slate-50/70 transition-colors duration-150 ease-in-out">
1476
+ @for (column of displayColumns(); track column.key) {
1477
+ <td class="whitespace-nowrap px-5 py-4 text-sm text-slate-600 truncate"
1478
+ [style.position]="column.sticky ? 'sticky' : null"
1479
+ [style.left]="column.sticky === 'left' ? '0' : null"
1480
+ [style.right]="column.sticky === 'right' ? '0' : null"
1481
+ [style.z-index]="column.sticky ? '10' : null"
1482
+ [style.background-color]="column.sticky ? '#ffffff' : null"
1483
+ [style.box-shadow]="getStickyColumnShadow(column.sticky)"
1484
+ [style.width]="column.width || 'auto'"
1485
+ [style.min-width]="column.width || 'auto'"
1486
+ [style.max-width]="column.width || 'none'">
1487
+ {{ item[column.key] }}
1488
+ </td>
1489
+ }
1490
+ @if (hasActions()) {
1491
+ <td class="whitespace-nowrap px-5 py-4 text-right text-sm"
1492
+ [style.position]="stickyActions() ? 'sticky' : null"
1493
+ [style.right]="stickyActions() ? '0' : null"
1494
+ [style.z-index]="stickyActions() ? '10' : null"
1495
+ [style.background-color]="stickyActions() ? '#ffffff' : null"
1496
+ [style.box-shadow]="stickyActions() ? '-4px 0 8px -4px rgba(0,0,0,0.08)' : null">
1497
+ <div class="flex justify-end items-center gap-2">
1498
+ @for (act of getActions(); track act.action) {
1499
+ <ad-button
1500
+ [variant]="mapVariant(act.color)"
1501
+ size="small"
1502
+ (click)="onActionClick(act.action, item)">
1503
+ @if (act.icon) {
1504
+ <ad-icon [name]="act.icon" class="mr-1"></ad-icon>
1505
+ }
1506
+ {{ act.label }}
1507
+ </ad-button>
1508
+
1509
+ }
1510
+ </div>
1511
+ </td>
1512
+ }
1513
+ </tr>
1514
+ }
1515
+ @if (data().length === 0 && !loading()) {
1370
1516
  <tr>
1371
- <!-- Checkbox Column if selectable (Future) -->
1372
-
1373
- @for (column of displayColumns(); track column.key) {
1374
- <th scope="col"
1375
- class="py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-slate-900 sm:pl-0"
1376
- [style.width]="column.width || 'auto'">
1377
- {{ column.label }}
1378
- </th>
1379
- }
1380
- @if (hasActions()) {
1381
- <th scope="col" class="relative py-3.5 pl-3 pr-4 sm:pr-0">
1382
- <span class="sr-only">Acciones</span>
1383
- </th>
1384
- }
1517
+ <td [attr.colspan]="displayColumns().length + (hasActions() ? 1 : 0)"
1518
+ class="py-12 text-center">
1519
+ <div class="flex flex-col items-center gap-2">
1520
+ <span class="material-icons-outlined text-3xl text-slate-300">inbox</span>
1521
+ <p class="text-sm text-slate-400 font-medium">No hay datos disponibles</p>
1522
+ </div>
1523
+ </td>
1385
1524
  </tr>
1386
- </thead>
1387
- <tbody class="divide-y divide-slate-200 bg-white">
1388
- @for (item of data(); track item) {
1389
- <tr>
1390
- @for (column of displayColumns(); track column.key) {
1391
- <td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm text-slate-500 sm:pl-0">
1392
- <!-- Simple rendering for now. Registry support can be added here -->
1393
- {{ item[column.key] }}
1394
- </td>
1395
- }
1396
- @if (hasActions()) {
1397
- <td class="whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-0">
1398
- <div class="flex justify-end gap-2">
1399
- @for (act of getActions(); track act.action) {
1400
- <ad-button
1401
- [variant]="mapVariant(act.color)"
1402
- size="small"
1403
- (click)="onActionClick(act.action, item)">
1404
- @if (act.icon) {
1405
- <ad-icon [name]="act.icon" class="mr-1"></ad-icon>
1406
- }
1407
- {{ act.label }}
1408
- </ad-button>
1409
- }
1410
- </div>
1411
- </td>
1412
- }
1413
- </tr>
1414
- }
1415
- @if (data().length === 0 && !loading()) {
1416
- <tr>
1417
- <td [attr.colspan]="displayColumns().length + (hasActions() ? 1 : 0)" class="py-8 text-center text-sm text-slate-500">
1418
- No hay datos disponibles
1419
- </td>
1420
- </tr>
1421
- }
1422
- </tbody>
1423
- </table>
1424
- </div>
1425
- </div>
1525
+ }
1526
+ </tbody>
1527
+ </table>
1426
1528
  </div>
1427
1529
 
1428
1530
  <!-- Pagination -->
1429
- <div class="flex items-center justify-between border-t border-slate-200 bg-white px-4 py-3 sm:px-6 mt-4">
1430
- <!-- Simplified Pagination for brevity, can be expanded -->
1531
+ <div class="flex items-center justify-between px-2 py-4">
1431
1532
  <div class="flex flex-1 justify-between sm:hidden">
1432
- <ad-button variant="secondary" [disabled]="pageIndex() === 1" (click)="onPageChange(pageIndex() - 1)">Anterior</ad-button>
1433
- <ad-button variant="secondary" [disabled]="pageIndex() * pageSize() >= total()" (click)="onPageChange(pageIndex() + 1)">Siguiente</ad-button>
1533
+ <ad-button variant="outline" [disabled]="pageIndex() === 1" (click)="onPageChange(pageIndex() - 1)">Anterior</ad-button>
1534
+ <ad-button variant="outline" [disabled]="pageIndex() * pageSize() >= total()" (click)="onPageChange(pageIndex() + 1)">Siguiente</ad-button>
1434
1535
  </div>
1435
1536
  <div class="hidden sm:flex sm:flex-1 sm:items-center sm:justify-between">
1436
1537
  <div>
1437
- <p class="text-sm text-slate-700">
1438
- Mostrando <span class="font-medium">{{ (pageIndex() - 1) * pageSize() + 1 }}</span> a <span class="font-medium">{{ Math.min(pageIndex() * pageSize(), total()) }}</span> de <span class="font-medium">{{ total() }}</span> resultados
1538
+ <p class="text-sm text-slate-500">
1539
+ Mostrando <span class="font-semibold text-slate-700">{{ (pageIndex() - 1) * pageSize() + 1 }}</span> a <span class="font-semibold text-slate-700">{{ Math.min(pageIndex() * pageSize(), total()) }}</span> de <span class="font-semibold text-slate-700">{{ total() }}</span> resultados
1439
1540
  </p>
1440
1541
  </div>
1441
- <div>
1442
- <nav class="isolate inline-flex -space-x-px rounded-md shadow-sm" aria-label="Pagination">
1443
- <ad-button variant="secondary" class="rounded-l-md" [disabled]="pageIndex() === 1" (click)="onPageChange(pageIndex() - 1)">Ant</ad-button>
1444
- <ad-button variant="secondary" class="rounded-r-md" [disabled]="pageIndex() * pageSize() >= total()" (click)="onPageChange(pageIndex() + 1)">Sig</ad-button>
1445
- </nav>
1542
+ <div class="flex items-center gap-2">
1543
+ <ad-button variant="outline" size="small" [disabled]="pageIndex() === 1" (click)="onPageChange(pageIndex() - 1)">Ant</ad-button>
1544
+ <ad-button variant="outline" size="small" [disabled]="pageIndex() * pageSize() >= total()" (click)="onPageChange(pageIndex() + 1)">Sig</ad-button>
1446
1545
  </div>
1447
1546
  </div>
1448
1547
  </div>
@@ -1457,96 +1556,120 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImpor
1457
1556
  imports: [CommonModule, AdButtonComponent, AdIconComponent],
1458
1557
  template: `
1459
1558
  <div class="flow-root">
1460
- <div class="-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8">
1461
- <div class="inline-block min-w-full py-2 align-middle sm:px-6 lg:px-8">
1462
- <div class="relative">
1463
- @if (loading()) {
1464
- <div class="absolute inset-0 bg-white/50 z-10 flex items-center justify-center">
1465
- <svg class="animate-spin h-8 w-8 text-sky-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
1466
- <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
1467
- <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
1468
- </svg>
1469
- </div>
1470
- }
1471
-
1472
- <table class="min-w-full divide-y divide-slate-300">
1473
- <thead>
1559
+ <!-- Scroll container: overflow-x-auto allows horizontal scroll, sticky works inside it -->
1560
+ <div class="relative rounded-xl border border-slate-200/70 overflow-x-auto">
1561
+ @if (loading()) {
1562
+ <div class="absolute inset-0 bg-white/60 backdrop-blur-[1px] z-30 flex items-center justify-center">
1563
+ <svg class="animate-spin h-8 w-8 text-sky-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
1564
+ <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
1565
+ <path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
1566
+ </svg>
1567
+ </div>
1568
+ }
1569
+
1570
+ <table class="min-w-full">
1571
+ <thead>
1572
+ <tr class="bg-slate-50 border-b border-slate-200">
1573
+ @for (column of displayColumns(); track column.key) {
1574
+ <th scope="col"
1575
+ class="px-5 py-3.5 text-left text-xs font-semibold text-slate-500 uppercase tracking-wider"
1576
+ [style.position]="column.sticky ? 'sticky' : null"
1577
+ [style.left]="column.sticky === 'left' ? '0' : null"
1578
+ [style.right]="column.sticky === 'right' ? '0' : null"
1579
+ [style.z-index]="column.sticky ? '20' : null"
1580
+ [style.background-color]="column.sticky ? '#f8fafc' : null"
1581
+ [style.box-shadow]="getStickyColumnShadow(column.sticky)"
1582
+ [style.width]="column.width || 'auto'"
1583
+ [style.min-width]="column.width || 'auto'"
1584
+ [style.max-width]="column.width || 'none'">
1585
+ {{ column.label }}
1586
+ </th>
1587
+ }
1588
+ @if (hasActions()) {
1589
+ <th scope="col"
1590
+ class="px-5 py-3.5 text-center text-xs font-semibold text-slate-500 uppercase tracking-wider"
1591
+ [style.position]="stickyActions() ? 'sticky' : null"
1592
+ [style.right]="stickyActions() ? '0' : null"
1593
+ [style.z-index]="stickyActions() ? '20' : null"
1594
+ [style.background-color]="stickyActions() ? '#f8fafc' : null"
1595
+ [style.box-shadow]="stickyActions() ? '-4px 0 8px -4px rgba(0,0,0,0.08)' : null">
1596
+ Acciones
1597
+ </th>
1598
+ }
1599
+ </tr>
1600
+ </thead>
1601
+ <tbody class="bg-white divide-y divide-slate-100">
1602
+ @for (item of data(); track item; let idx = $index) {
1603
+ <tr class="hover:bg-slate-50/70 transition-colors duration-150 ease-in-out">
1604
+ @for (column of displayColumns(); track column.key) {
1605
+ <td class="whitespace-nowrap px-5 py-4 text-sm text-slate-600 truncate"
1606
+ [style.position]="column.sticky ? 'sticky' : null"
1607
+ [style.left]="column.sticky === 'left' ? '0' : null"
1608
+ [style.right]="column.sticky === 'right' ? '0' : null"
1609
+ [style.z-index]="column.sticky ? '10' : null"
1610
+ [style.background-color]="column.sticky ? '#ffffff' : null"
1611
+ [style.box-shadow]="getStickyColumnShadow(column.sticky)"
1612
+ [style.width]="column.width || 'auto'"
1613
+ [style.min-width]="column.width || 'auto'"
1614
+ [style.max-width]="column.width || 'none'">
1615
+ {{ item[column.key] }}
1616
+ </td>
1617
+ }
1618
+ @if (hasActions()) {
1619
+ <td class="whitespace-nowrap px-5 py-4 text-right text-sm"
1620
+ [style.position]="stickyActions() ? 'sticky' : null"
1621
+ [style.right]="stickyActions() ? '0' : null"
1622
+ [style.z-index]="stickyActions() ? '10' : null"
1623
+ [style.background-color]="stickyActions() ? '#ffffff' : null"
1624
+ [style.box-shadow]="stickyActions() ? '-4px 0 8px -4px rgba(0,0,0,0.08)' : null">
1625
+ <div class="flex justify-end items-center gap-2">
1626
+ @for (act of getActions(); track act.action) {
1627
+ <ad-button
1628
+ [variant]="mapVariant(act.color)"
1629
+ size="small"
1630
+ (click)="onActionClick(act.action, item)">
1631
+ @if (act.icon) {
1632
+ <ad-icon [name]="act.icon" class="mr-1"></ad-icon>
1633
+ }
1634
+ {{ act.label }}
1635
+ </ad-button>
1636
+
1637
+ }
1638
+ </div>
1639
+ </td>
1640
+ }
1641
+ </tr>
1642
+ }
1643
+ @if (data().length === 0 && !loading()) {
1474
1644
  <tr>
1475
- <!-- Checkbox Column if selectable (Future) -->
1476
-
1477
- @for (column of displayColumns(); track column.key) {
1478
- <th scope="col"
1479
- class="py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-slate-900 sm:pl-0"
1480
- [style.width]="column.width || 'auto'">
1481
- {{ column.label }}
1482
- </th>
1483
- }
1484
- @if (hasActions()) {
1485
- <th scope="col" class="relative py-3.5 pl-3 pr-4 sm:pr-0">
1486
- <span class="sr-only">Acciones</span>
1487
- </th>
1488
- }
1645
+ <td [attr.colspan]="displayColumns().length + (hasActions() ? 1 : 0)"
1646
+ class="py-12 text-center">
1647
+ <div class="flex flex-col items-center gap-2">
1648
+ <span class="material-icons-outlined text-3xl text-slate-300">inbox</span>
1649
+ <p class="text-sm text-slate-400 font-medium">No hay datos disponibles</p>
1650
+ </div>
1651
+ </td>
1489
1652
  </tr>
1490
- </thead>
1491
- <tbody class="divide-y divide-slate-200 bg-white">
1492
- @for (item of data(); track item) {
1493
- <tr>
1494
- @for (column of displayColumns(); track column.key) {
1495
- <td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm text-slate-500 sm:pl-0">
1496
- <!-- Simple rendering for now. Registry support can be added here -->
1497
- {{ item[column.key] }}
1498
- </td>
1499
- }
1500
- @if (hasActions()) {
1501
- <td class="whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-0">
1502
- <div class="flex justify-end gap-2">
1503
- @for (act of getActions(); track act.action) {
1504
- <ad-button
1505
- [variant]="mapVariant(act.color)"
1506
- size="small"
1507
- (click)="onActionClick(act.action, item)">
1508
- @if (act.icon) {
1509
- <ad-icon [name]="act.icon" class="mr-1"></ad-icon>
1510
- }
1511
- {{ act.label }}
1512
- </ad-button>
1513
- }
1514
- </div>
1515
- </td>
1516
- }
1517
- </tr>
1518
- }
1519
- @if (data().length === 0 && !loading()) {
1520
- <tr>
1521
- <td [attr.colspan]="displayColumns().length + (hasActions() ? 1 : 0)" class="py-8 text-center text-sm text-slate-500">
1522
- No hay datos disponibles
1523
- </td>
1524
- </tr>
1525
- }
1526
- </tbody>
1527
- </table>
1528
- </div>
1529
- </div>
1653
+ }
1654
+ </tbody>
1655
+ </table>
1530
1656
  </div>
1531
1657
 
1532
1658
  <!-- Pagination -->
1533
- <div class="flex items-center justify-between border-t border-slate-200 bg-white px-4 py-3 sm:px-6 mt-4">
1534
- <!-- Simplified Pagination for brevity, can be expanded -->
1659
+ <div class="flex items-center justify-between px-2 py-4">
1535
1660
  <div class="flex flex-1 justify-between sm:hidden">
1536
- <ad-button variant="secondary" [disabled]="pageIndex() === 1" (click)="onPageChange(pageIndex() - 1)">Anterior</ad-button>
1537
- <ad-button variant="secondary" [disabled]="pageIndex() * pageSize() >= total()" (click)="onPageChange(pageIndex() + 1)">Siguiente</ad-button>
1661
+ <ad-button variant="outline" [disabled]="pageIndex() === 1" (click)="onPageChange(pageIndex() - 1)">Anterior</ad-button>
1662
+ <ad-button variant="outline" [disabled]="pageIndex() * pageSize() >= total()" (click)="onPageChange(pageIndex() + 1)">Siguiente</ad-button>
1538
1663
  </div>
1539
1664
  <div class="hidden sm:flex sm:flex-1 sm:items-center sm:justify-between">
1540
1665
  <div>
1541
- <p class="text-sm text-slate-700">
1542
- Mostrando <span class="font-medium">{{ (pageIndex() - 1) * pageSize() + 1 }}</span> a <span class="font-medium">{{ Math.min(pageIndex() * pageSize(), total()) }}</span> de <span class="font-medium">{{ total() }}</span> resultados
1666
+ <p class="text-sm text-slate-500">
1667
+ Mostrando <span class="font-semibold text-slate-700">{{ (pageIndex() - 1) * pageSize() + 1 }}</span> a <span class="font-semibold text-slate-700">{{ Math.min(pageIndex() * pageSize(), total()) }}</span> de <span class="font-semibold text-slate-700">{{ total() }}</span> resultados
1543
1668
  </p>
1544
1669
  </div>
1545
- <div>
1546
- <nav class="isolate inline-flex -space-x-px rounded-md shadow-sm" aria-label="Pagination">
1547
- <ad-button variant="secondary" class="rounded-l-md" [disabled]="pageIndex() === 1" (click)="onPageChange(pageIndex() - 1)">Ant</ad-button>
1548
- <ad-button variant="secondary" class="rounded-r-md" [disabled]="pageIndex() * pageSize() >= total()" (click)="onPageChange(pageIndex() + 1)">Sig</ad-button>
1549
- </nav>
1670
+ <div class="flex items-center gap-2">
1671
+ <ad-button variant="outline" size="small" [disabled]="pageIndex() === 1" (click)="onPageChange(pageIndex() - 1)">Ant</ad-button>
1672
+ <ad-button variant="outline" size="small" [disabled]="pageIndex() * pageSize() >= total()" (click)="onPageChange(pageIndex() + 1)">Sig</ad-button>
1550
1673
  </div>
1551
1674
  </div>
1552
1675
  </div>
@@ -1713,6 +1836,8 @@ class AdDescriptionHeaderComponent {
1713
1836
  subtitle = computed(() => this.resource().subtitle, ...(ngDevMode ? [{ debugName: "subtitle" }] : []));
1714
1837
  buttons = computed(() => this.resource().buttons, ...(ngDevMode ? [{ debugName: "buttons" }] : []));
1715
1838
  showDivider = computed(() => this.resource().showDivider, ...(ngDevMode ? [{ debugName: "showDivider" }] : []));
1839
+ backButton = computed(() => this.resource().backButton, ...(ngDevMode ? [{ debugName: "backButton" }] : []));
1840
+ onBack = computed(() => this.resource().onBack, ...(ngDevMode ? [{ debugName: "onBack" }] : []));
1716
1841
  getModalTriggerResource(button) {
1717
1842
  return {
1718
1843
  resource: button.modalResource,
@@ -1732,6 +1857,15 @@ class AdDescriptionHeaderComponent {
1732
1857
  onClick();
1733
1858
  }
1734
1859
  }
1860
+ /**
1861
+ * Maneja el clic en el botón de regresar
1862
+ */
1863
+ handleBack() {
1864
+ const onBackFn = this.onBack();
1865
+ if (onBackFn) {
1866
+ onBackFn();
1867
+ }
1868
+ }
1735
1869
  /**
1736
1870
  * Maneja la confirmación de un modal
1737
1871
  * @param onConfirm Callback de confirmación
@@ -1752,11 +1886,11 @@ class AdDescriptionHeaderComponent {
1752
1886
  }
1753
1887
  }
1754
1888
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdDescriptionHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1755
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: AdDescriptionHeaderComponent, isStandalone: true, selector: "ad-description-header", inputs: { resource: { classPropertyName: "resource", publicName: "resource", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div class=\"premium-header-card\">\r\n <div class=\"header-main\">\r\n <div class=\"title-group\">\r\n <h1 class=\"premium-title\">\r\n {{ title() }}\r\n @if (accentedTitle()) {\r\n <span class=\"accent-text\">\r\n {{ accentedTitle() }}\r\n </span>\r\n }\r\n </h1>\r\n @if (subtitle()) {\r\n <p class=\"premium-subtitle\">\r\n {{ subtitle() }}\r\n </p>\r\n }\r\n </div>\r\n @if (buttons() && buttons()!.length > 0) {\r\n <div class=\"header-actions\">\r\n @for (button of buttons(); track $index) {\r\n @if (button.isModalTrigger && button.modalResource) {\r\n <ad-modal-trigger [resource]=\"getModalTriggerResource(button)\"\r\n (confirm)=\"handleModalConfirm(button.onModalConfirm, $event)\"\r\n (cancel)=\"handleModalCancel(button.onModalCancel)\">\r\n </ad-modal-trigger>\r\n } @else {\r\n <ad-button [variant]=\"button.variant || 'primary'\" [type]=\"button.type || 'button'\"\r\n [disabled]=\"button.disabled || false\" (click)=\"handleButtonClick(button.onClick)\" [icon]=\"button.icon\">\r\n {{ button.label }}\r\n </ad-button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n\r\n<!-- Divider is no longer needed with the card style -->\r\n@if (showDivider() && false) {\r\n<div class=\"ad-description-header__divider\"></div>\r\n}", styles: [":root{--color-primary: #002855;--color-primary-hover: #003366;--color-primary-active: #001a38;--color-primary-light: #F1F5F9;--color-primary-accent: #5BC2E7;--color-background: #F8FAFC;--color-surface: #FFFFFF;--color-border: #F1F5F9;--color-secondary: #475569;--color-secondary-light: #94A3B8;--color-success: #A2D033;--color-success-bg: rgba(162, 208, 51, .05);--color-success-text: #7A9F26;--color-alert: #EF4444;--color-alert-bg: rgba(239, 68, 68, .05);--color-alert-text: #DC2626;--color-warning: #F59E0B;--color-warning-bg: rgba(245, 158, 11, .05);--color-warning-text: #D97706;--color-slate-900: #0f172a;--color-slate-800: #1e293b;--color-slate-700: #334155;--color-slate-500: #64748b;--color-slate-400: #94a3b8;--color-slate-200: #e2e8f0;--color-slate-100: #f1f5f9;--color-slate-50: #f8fafc;--color-white: #ffffff;--radius-cerca: 1.25rem;--radius-cerca-sm: .75rem;--radius-cerca-lg: 2rem;--shadow-premium: 0 20px 25px -5px rgba(0, 0, 0, .02), 0 8px 10px -6px rgba(0, 0, 0, .02);--shadow-premium-hover: 0 30px 40px -5px rgba(0, 0, 0, .05), 0 15px 20px -5px rgba(0, 0, 0, .03);--shadow-glass: 0 8px 32px 0 rgba(31, 38, 135, .07);--shadow-sidebar: 4px 0 24px 0 rgba(0, 0, 0, .05);--shadow-glow-primary: 0 0 20px rgba(91, 194, 231, .15);--gradient-premium: linear-gradient(135deg, #002855 0%, #001a38 100%);--gradient-glass: linear-gradient(135deg, rgba(255, 255, 255, .1), rgba(255, 255, 255, .05));--gradient-accent: linear-gradient(135deg, #5BC2E7 0%, #002855 100%);--ant-primary-color: var(--color-primary);--ant-primary-color-hover: var(--color-primary-hover);--ant-primary-color-active: var(--color-primary-active);--ant-primary-color-outline: rgba(0, 40, 85, .2);--ant-success-color: var(--color-success);--ant-success-color-hover: #b3e040;--ant-success-color-active: #8fb82b;--ant-success-color-outline: rgba(162, 208, 51, .2);--ant-info-color: var(--color-primary);--ant-link-color: var(--color-primary-accent);--ant-link-color-hover: #4db3d9;--ant-link-color-active: var(--color-primary)}:root{--font-sans: \"Inter\", system-ui, sans-serif;--font-display: \"Outfit\", sans-serif}:root,[data-theme=light]{--color-bg-primary: var(--color-surface);--color-bg-secondary: var(--color-background);--color-text-primary: var(--color-slate-900);--color-text-secondary: var(--color-secondary);--color-text-muted: var(--color-secondary-light);--color-border-subtle: var(--color-slate-200);--color-border-strong: var(--color-slate-300);--color-brand: var(--color-primary);--color-brand-hover: var(--color-primary-hover);--color-focus-ring: var(--ant-primary-color-outline);--color-success: var(--color-success);--color-danger: var(--color-alert);--surface-glass-bg: rgba(255, 255, 255, .7);--surface-glass-border: rgba(255, 255, 255, .3);--surface-glass-blur: 12px;--surface-glass-shadow: var(--shadow-glass);--font-heading-xl: 32px;--font-heading-lg: 24px;--font-heading-md: 20px;--font-body-lg: 18px;--font-body-md: 16px;--font-caption: 12px;--font-family-base: var(--font-sans);--font-weight-regular: 400;--font-weight-medium: 500;--font-weight-semibold: 600;--font-weight-bold: 700;--radius-sm: var(--radius-cerca-sm);--radius-md: var(--radius-cerca);--radius-lg: var(--radius-cerca-lg);--radius-xl: 3rem;--radius-full: 9999px;--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, .05);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .1);--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, .1)}[data-theme=dark]{--color-bg-primary: var(--color-slate-900);--color-bg-secondary: var(--color-slate-800);--color-text-primary: var(--color-white);--color-text-secondary: var(--color-slate-400);--color-text-muted: var(--color-slate-500);--color-border-subtle: var(--color-slate-700);--color-border-strong: var(--color-slate-600);--color-brand: var(--color-primary-light);--color-brand-hover: var(--color-primary-accent);--color-focus-ring: rgba(59, 130, 246, .5);--surface-glass-bg: rgba(15, 23, 42, .8);--surface-glass-border: rgba(255, 255, 255, .1);--surface-glass-blur: 16px;--surface-glass-shadow: 0 10px 15px -3px rgba(0, 0, 0, .3)}:root{--h1-size: var(--font-size-h1);--h1-weight: var(--font-weight-semibold);--h2-size: var(--font-size-h2);--h2-weight: var(--font-weight-semibold);--h3-size: var(--font-size-h3);--h3-weight: var(--font-weight-semibold);--body-size: var(--font-size-body);--body-weight: var(--font-weight-regular);--sm-size: var(--font-size-sm);--sm-weight: var(--font-weight-regular);--caption-size: var(--font-size-caption);--caption-weight: var(--font-weight-regular)}:root{--btn-height-md: 44px;--btn-radius: var(--radius-md);--btn-font-weight: var(--font-weight-medium);--btn-bg-primary: var(--color-brand);--btn-text-primary: #FFFFFF;--btn-shadow-default: var(--shadow-sm);--btn-shadow-hover: var(--shadow-md);--btn-transition: .15s ease;--btn-focus-ring: 0 0 0 2px var(--color-focus-ring)}:root{--card-bg: var(--color-bg-primary);--card-radius: var(--radius-lg);--card-shadow: var(--shadow-sm);--card-shadow-hover: var(--shadow-md)}:root{--input-height-md: 44px;--input-bg: var(--color-bg-primary);--input-radius: var(--radius-md);--input-border-default: var(--color-border-subtle);--input-border-hover: var(--color-border-strong);--input-border-focus: var(--color-brand);--input-border-error: var(--color-danger);--input-transition: .12s ease-in-out;--input-focus-ring: 0 0 0 3px var(--color-focus-ring);--input-error-ring: 0 0 0 3px rgba(239, 68, 68, .15)}.ad-badge-tokens{--badge-radius: var(--radius-sm);--badge-padding-v: var(--space-1);--badge-padding-h: var(--space-2);--badge-font-size: var(--font-size-xs);--badge-font-weight: var(--font-weight-medium);--badge-success-bg: #D1FAE5;--badge-success-text: #065F46;--badge-success-border: #A7F3D0;--badge-warning-bg: #FEF3C7;--badge-warning-text: #92400E;--badge-warning-border: #FDE68A;--badge-error-bg: #FFE4E6;--badge-error-text: #9F1239;--badge-error-border: #FECDD3;--badge-info-bg: var(--color-info-50);--badge-info-text: var(--color-info-700);--badge-info-border: var(--color-info-200);--badge-neutral-bg: var(--color-slate-100);--badge-neutral-text: var(--color-slate-700);--badge-neutral-border: var(--color-slate-200)}.ad-label-tokens{--label-font-size: var(--font-size-sm);--label-font-weight: var(--font-weight-medium);--label-color: var(--color-text-secondary);--label-required-color: var(--color-error-500);--label-margin-bottom: var(--space-2)}.ad-select-tokens{--select-bg: var(--color-bg-primary);--select-border: var(--color-border-subtle);--select-border-hover: var(--color-border-strong);--select-border-focus: var(--color-brand-primary);--select-shadow-focus: var(--shadow-focus);--select-radius: var(--radius-md);--select-height: 44px;--select-padding-h: var(--space-4);--select-dropdown-bg: var(--color-bg-primary);--select-dropdown-shadow: var(--shadow-md);--select-dropdown-max-height: 240px;--select-option-padding: var(--space-3) var(--space-4);--select-option-hover: var(--color-bg-secondary);--select-option-selected-bg: var(--color-brand-50);--select-option-selected-text: var(--color-brand-primary)}.ad-form-field-tokens{--form-field-margin-bottom: var(--space-6);--form-field-label-margin: var(--space-2);--form-field-message-margin: var(--space-1);--form-field-message-font-size: var(--font-size-xs);--form-field-message-color: var(--color-text-muted);--form-field-error-color: var(--color-error-600)}.ad-header-tokens{--header-height: 72px;--header-bg: var(--color-surface);--header-border-color: var(--color-border);--header-padding: 0 var(--space-6);--header-shadow: 0 1px 2px rgba(0, 0, 0, .05);--header-z-index: 100;--header-logo-height: 32px;--header-user-gap: var(--space-4)}.ad-sidebar-tokens{--sidebar-width: 280px;--sidebar-collapsed-width: 80px;--sidebar-bg: var(--color-slate-900);--sidebar-border-color: var(--color-slate-800);--sidebar-padding: var(--space-4);--sidebar-z-index: 101;--sidebar-transition: width .3s cubic-bezier(.4, 0, .2, 1);--sidebar-item-height: 48px;--sidebar-item-radius: var(--radius-lg);--sidebar-item-padding: 0 var(--space-4);--sidebar-item-gap: var(--space-3);--sidebar-accent-color: var(--color-primary);--sidebar-text-color: var(--color-surface);--sidebar-text-muted: var(--color-slate-400)}.ad-data-table-tokens{--table-bg: var(--color-bg-primary);--table-header-bg: var(--color-bg-secondary);--table-border-color: var(--color-border-subtle);--table-header-color: var(--color-text-muted);--table-row-hover: rgba(var(--color-brand-primary-rgb), .04);--table-cell-padding: var(--space-4);--table-font-size: var(--font-size-sm);--table-radius: var(--radius-lg)}:root{--modal-bg: var(--color-surface);--modal-overlay-bg: rgba(0, 0, 0, .5);--modal-radius: var(--radius-cerca);--modal-shadow: var(--shadow-premium);--modal-z-index: 1000;--modal-header-padding: 12px 24px;--modal-body-padding: 24px;--modal-footer-padding: 16px 24px;--modal-sm-width: 400px;--modal-md-width: 600px;--modal-lg-width: 900px}.premium-header-card{background:#fff;padding:1.5rem 2rem;border-radius:16px;box-shadow:var(--shadow-premium, 0 4px 20px -2px rgba(0, 0, 0, .1));margin-bottom:2rem;position:relative;overflow:hidden;border:1px solid rgba(0,0,0,.03)}.premium-header-card:after{content:\"\";position:absolute;top:0;left:0;width:100%;height:4px;background:linear-gradient(to right,var(--color-primary),var(--color-primary-accent, #00d2ff))}.header-main{display:flex;justify-content:space-between;align-items:center;gap:1.5rem;flex-wrap:wrap}@media(max-width:768px){.header-main{flex-direction:column;align-items:stretch}}.title-group{display:flex;flex-direction:column;gap:.25rem}.premium-title{font-size:1.5rem;font-weight:800;letter-spacing:-.04em;margin:0;color:var(--color-slate-900, #1e293b);line-height:1.2}.premium-title .accent-text{background:linear-gradient(135deg,var(--color-primary) 0%,var(--color-primary-accent, #00d2ff) 100%);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;margin-left:.3rem}.premium-subtitle{margin-top:0rem;color:var(--color-slate-500, #64748b);font-size:.9rem;font-weight:500;letter-spacing:-.01em}.header-actions{display:flex;gap:var(--spacing-sm);align-items:center}@media(max-width:768px){.header-actions{width:100%;justify-content:flex-start}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AdButtonComponent, selector: "ad-button", inputs: ["variant", "type", "disabled", "loading", "icon", "size", "block"] }, { kind: "component", type: AdModalTriggerComponent, selector: "ad-modal-trigger", inputs: ["resource"], outputs: ["confirm", "cancel"] }] });
1889
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: AdDescriptionHeaderComponent, isStandalone: true, selector: "ad-description-header", inputs: { resource: { classPropertyName: "resource", publicName: "resource", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div class=\"premium-header-card\">\r\n <div class=\"header-main\">\r\n <div class=\"title-wrapper\">\r\n @if (backButton()) {\r\n <ad-button variant=\"ghost\" icon=\"arrow_back\" (click)=\"handleBack()\" class=\"back-btn\" />\r\n }\r\n <div class=\"title-group\">\r\n <h1 class=\"premium-title\">\r\n {{ title() }}\r\n @if (accentedTitle()) {\r\n <span class=\"accent-text\">\r\n {{ accentedTitle() }}\r\n </span>\r\n }\r\n </h1>\r\n @if (subtitle()) {\r\n <p class=\"premium-subtitle\">\r\n {{ subtitle() }}\r\n </p>\r\n }\r\n </div>\r\n </div>\r\n @if (buttons() && buttons()!.length > 0) {\r\n <div class=\"header-actions\">\r\n @for (button of buttons(); track $index) {\r\n @if (button.isModalTrigger && button.modalResource) {\r\n <ad-modal-trigger [resource]=\"getModalTriggerResource(button)\"\r\n (confirm)=\"handleModalConfirm(button.onModalConfirm, $event)\"\r\n (cancel)=\"handleModalCancel(button.onModalCancel)\">\r\n </ad-modal-trigger>\r\n } @else {\r\n <ad-button [variant]=\"button.variant || 'primary'\" [type]=\"button.type || 'button'\"\r\n [disabled]=\"button.disabled || false\" (click)=\"handleButtonClick(button.onClick)\" [icon]=\"button.icon\">\r\n {{ button.label }}\r\n </ad-button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n\r\n<!-- Divider is no longer needed with the card style -->\r\n@if (showDivider() && false) {\r\n<div class=\"ad-description-header__divider\"></div>\r\n}", styles: [":root{--color-primary: #002855;--color-primary-hover: #003366;--color-primary-active: #001a38;--color-primary-light: #F1F5F9;--color-primary-accent: #5BC2E7;--color-background: #F8FAFC;--color-surface: #FFFFFF;--color-border: #F1F5F9;--color-secondary: #475569;--color-secondary-light: #94A3B8;--color-success: #A2D033;--color-success-bg: rgba(162, 208, 51, .05);--color-success-text: #7A9F26;--color-alert: #EF4444;--color-alert-bg: rgba(239, 68, 68, .05);--color-alert-text: #DC2626;--color-warning: #F59E0B;--color-warning-bg: rgba(245, 158, 11, .05);--color-warning-text: #D97706;--color-slate-900: #0f172a;--color-slate-800: #1e293b;--color-slate-700: #334155;--color-slate-500: #64748b;--color-slate-400: #94a3b8;--color-slate-200: #e2e8f0;--color-slate-100: #f1f5f9;--color-slate-50: #f8fafc;--color-white: #ffffff;--radius-cerca: 1.25rem;--radius-cerca-sm: .75rem;--radius-cerca-lg: 2rem;--shadow-premium: 0 20px 25px -5px rgba(0, 0, 0, .02), 0 8px 10px -6px rgba(0, 0, 0, .02);--shadow-premium-hover: 0 30px 40px -5px rgba(0, 0, 0, .05), 0 15px 20px -5px rgba(0, 0, 0, .03);--shadow-glass: 0 8px 32px 0 rgba(31, 38, 135, .07);--shadow-sidebar: 4px 0 24px 0 rgba(0, 0, 0, .05);--shadow-glow-primary: 0 0 20px rgba(91, 194, 231, .15);--gradient-premium: linear-gradient(135deg, #002855 0%, #001a38 100%);--gradient-glass: linear-gradient(135deg, rgba(255, 255, 255, .1), rgba(255, 255, 255, .05));--gradient-accent: linear-gradient(135deg, #5BC2E7 0%, #002855 100%);--ant-primary-color: var(--color-primary);--ant-primary-color-hover: var(--color-primary-hover);--ant-primary-color-active: var(--color-primary-active);--ant-primary-color-outline: rgba(0, 40, 85, .2);--ant-success-color: var(--color-success);--ant-success-color-hover: #b3e040;--ant-success-color-active: #8fb82b;--ant-success-color-outline: rgba(162, 208, 51, .2);--ant-info-color: var(--color-primary);--ant-link-color: var(--color-primary-accent);--ant-link-color-hover: #4db3d9;--ant-link-color-active: var(--color-primary)}:root{--font-sans: \"Inter\", system-ui, sans-serif;--font-display: \"Outfit\", sans-serif}:root,[data-theme=light]{--color-bg-primary: var(--color-surface);--color-bg-secondary: var(--color-background);--color-text-primary: var(--color-slate-900);--color-text-secondary: var(--color-secondary);--color-text-muted: var(--color-secondary-light);--color-border-subtle: var(--color-slate-200);--color-border-strong: var(--color-slate-300);--color-brand: var(--color-primary);--color-brand-hover: var(--color-primary-hover);--color-focus-ring: var(--ant-primary-color-outline);--color-success: var(--color-success);--color-danger: var(--color-alert);--surface-glass-bg: rgba(255, 255, 255, .7);--surface-glass-border: rgba(255, 255, 255, .3);--surface-glass-blur: 12px;--surface-glass-shadow: var(--shadow-glass);--font-heading-xl: 32px;--font-heading-lg: 24px;--font-heading-md: 20px;--font-body-lg: 18px;--font-body-md: 16px;--font-caption: 12px;--font-family-base: var(--font-sans);--font-weight-regular: 400;--font-weight-medium: 500;--font-weight-semibold: 600;--font-weight-bold: 700;--radius-sm: var(--radius-cerca-sm);--radius-md: var(--radius-cerca);--radius-lg: var(--radius-cerca-lg);--radius-xl: 3rem;--radius-full: 9999px;--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, .05);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .1);--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, .1)}[data-theme=dark]{--color-bg-primary: var(--color-slate-900);--color-bg-secondary: var(--color-slate-800);--color-text-primary: var(--color-white);--color-text-secondary: var(--color-slate-400);--color-text-muted: var(--color-slate-500);--color-border-subtle: var(--color-slate-700);--color-border-strong: var(--color-slate-600);--color-brand: var(--color-primary-light);--color-brand-hover: var(--color-primary-accent);--color-focus-ring: rgba(59, 130, 246, .5);--surface-glass-bg: rgba(15, 23, 42, .8);--surface-glass-border: rgba(255, 255, 255, .1);--surface-glass-blur: 16px;--surface-glass-shadow: 0 10px 15px -3px rgba(0, 0, 0, .3)}:root{--h1-size: var(--font-size-h1);--h1-weight: var(--font-weight-semibold);--h2-size: var(--font-size-h2);--h2-weight: var(--font-weight-semibold);--h3-size: var(--font-size-h3);--h3-weight: var(--font-weight-semibold);--body-size: var(--font-size-body);--body-weight: var(--font-weight-regular);--sm-size: var(--font-size-sm);--sm-weight: var(--font-weight-regular);--caption-size: var(--font-size-caption);--caption-weight: var(--font-weight-regular)}:root{--btn-height-md: 44px;--btn-radius: var(--radius-md);--btn-font-weight: var(--font-weight-medium);--btn-bg-primary: var(--color-brand);--btn-text-primary: #FFFFFF;--btn-shadow-default: var(--shadow-sm);--btn-shadow-hover: var(--shadow-md);--btn-transition: .15s ease;--btn-focus-ring: 0 0 0 2px var(--color-focus-ring)}:root{--card-bg: var(--color-bg-primary);--card-radius: var(--radius-lg);--card-shadow: var(--shadow-sm);--card-shadow-hover: var(--shadow-md)}:root{--input-height-md: 44px;--input-bg: var(--color-bg-primary);--input-radius: var(--radius-md);--input-border-default: var(--color-border-subtle);--input-border-hover: var(--color-border-strong);--input-border-focus: var(--color-brand);--input-border-error: var(--color-danger);--input-transition: .12s ease-in-out;--input-focus-ring: 0 0 0 3px var(--color-focus-ring);--input-error-ring: 0 0 0 3px rgba(239, 68, 68, .15)}.ad-badge-tokens{--badge-radius: var(--radius-sm);--badge-padding-v: var(--space-1);--badge-padding-h: var(--space-2);--badge-font-size: var(--font-size-xs);--badge-font-weight: var(--font-weight-medium);--badge-success-bg: #D1FAE5;--badge-success-text: #065F46;--badge-success-border: #A7F3D0;--badge-warning-bg: #FEF3C7;--badge-warning-text: #92400E;--badge-warning-border: #FDE68A;--badge-error-bg: #FFE4E6;--badge-error-text: #9F1239;--badge-error-border: #FECDD3;--badge-info-bg: var(--color-info-50);--badge-info-text: var(--color-info-700);--badge-info-border: var(--color-info-200);--badge-neutral-bg: var(--color-slate-100);--badge-neutral-text: var(--color-slate-700);--badge-neutral-border: var(--color-slate-200)}.ad-label-tokens{--label-font-size: var(--font-size-sm);--label-font-weight: var(--font-weight-medium);--label-color: var(--color-text-secondary);--label-required-color: var(--color-error-500);--label-margin-bottom: var(--space-2)}.ad-select-tokens{--select-bg: var(--color-bg-primary);--select-border: var(--color-border-subtle);--select-border-hover: var(--color-border-strong);--select-border-focus: var(--color-brand-primary);--select-shadow-focus: var(--shadow-focus);--select-radius: var(--radius-md);--select-height: 44px;--select-padding-h: var(--space-4);--select-dropdown-bg: var(--color-bg-primary);--select-dropdown-shadow: var(--shadow-md);--select-dropdown-max-height: 240px;--select-option-padding: var(--space-3) var(--space-4);--select-option-hover: var(--color-bg-secondary);--select-option-selected-bg: var(--color-brand-50);--select-option-selected-text: var(--color-brand-primary)}.ad-form-field-tokens{--form-field-margin-bottom: var(--space-6);--form-field-label-margin: var(--space-2);--form-field-message-margin: var(--space-1);--form-field-message-font-size: var(--font-size-xs);--form-field-message-color: var(--color-text-muted);--form-field-error-color: var(--color-error-600)}.ad-header-tokens{--header-height: 72px;--header-bg: var(--color-surface);--header-border-color: var(--color-border);--header-padding: 0 var(--space-6);--header-shadow: 0 1px 2px rgba(0, 0, 0, .05);--header-z-index: 100;--header-logo-height: 32px;--header-user-gap: var(--space-4)}.ad-sidebar-tokens{--sidebar-width: 280px;--sidebar-collapsed-width: 80px;--sidebar-bg: var(--color-slate-900);--sidebar-border-color: var(--color-slate-800);--sidebar-padding: var(--space-4);--sidebar-z-index: 101;--sidebar-transition: width .3s cubic-bezier(.4, 0, .2, 1);--sidebar-item-height: 48px;--sidebar-item-radius: var(--radius-lg);--sidebar-item-padding: 0 var(--space-4);--sidebar-item-gap: var(--space-3);--sidebar-accent-color: var(--color-primary);--sidebar-text-color: var(--color-surface);--sidebar-text-muted: var(--color-slate-400)}.ad-data-table-tokens{--table-bg: var(--color-bg-primary);--table-header-bg: var(--color-bg-secondary);--table-border-color: var(--color-border-subtle);--table-header-color: var(--color-text-muted);--table-row-hover: rgba(var(--color-brand-primary-rgb), .04);--table-cell-padding: var(--space-4);--table-font-size: var(--font-size-sm);--table-radius: var(--radius-lg)}:root{--modal-bg: var(--color-surface);--modal-overlay-bg: rgba(0, 0, 0, .5);--modal-radius: var(--radius-cerca);--modal-shadow: var(--shadow-premium);--modal-z-index: 1000;--modal-header-padding: 12px 24px;--modal-body-padding: 24px;--modal-footer-padding: 16px 24px;--modal-sm-width: 400px;--modal-md-width: 600px;--modal-lg-width: 900px}.premium-header-card{background:#fff;padding:1.5rem 2rem;border-radius:16px;box-shadow:var(--shadow-premium, 0 4px 20px -2px rgba(0, 0, 0, .1));margin-bottom:2rem;position:relative;overflow:hidden;border:1px solid rgba(0,0,0,.03)}.premium-header-card:after{content:\"\";position:absolute;top:0;left:0;width:100%;height:4px;background:linear-gradient(to right,var(--color-primary),var(--color-primary-accent, #00d2ff))}.header-main{display:flex;justify-content:space-between;align-items:center;gap:1.5rem;flex-wrap:wrap}@media(max-width:768px){.header-main{flex-direction:column;align-items:stretch}}.title-wrapper{display:flex;align-items:center;gap:1rem}.title-group{display:flex;flex-direction:column;gap:.25rem}.back-btn ::ng-deep button{padding:.5rem;height:2.5rem;width:2.5rem;border-radius:50%;color:var(--color-slate-500, #64748b);display:flex;align-items:center;justify-content:center}.back-btn ::ng-deep button:hover{background-color:var(--color-slate-100, #f1f5f9);color:var(--color-slate-700, #334155)}.premium-title{font-size:1.5rem;font-weight:800;letter-spacing:-.04em;margin:0;color:var(--color-slate-900, #1e293b);line-height:1.2}.premium-title .accent-text{background:linear-gradient(135deg,var(--color-primary) 0%,var(--color-primary-accent, #00d2ff) 100%);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;margin-left:.3rem}.premium-subtitle{margin-top:0rem;color:var(--color-slate-500, #64748b);font-size:.9rem;font-weight:500;letter-spacing:-.01em}.header-actions{display:flex;gap:var(--spacing-sm);align-items:center}@media(max-width:768px){.header-actions{width:100%;justify-content:flex-start}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AdButtonComponent, selector: "ad-button", inputs: ["variant", "type", "disabled", "loading", "icon", "size", "block"] }, { kind: "component", type: AdModalTriggerComponent, selector: "ad-modal-trigger", inputs: ["resource"], outputs: ["confirm", "cancel"] }] });
1756
1890
  }
1757
1891
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdDescriptionHeaderComponent, decorators: [{
1758
1892
  type: Component,
1759
- args: [{ selector: 'ad-description-header', standalone: true, imports: [CommonModule, AdButtonComponent, AdModalTriggerComponent], template: "<div class=\"premium-header-card\">\r\n <div class=\"header-main\">\r\n <div class=\"title-group\">\r\n <h1 class=\"premium-title\">\r\n {{ title() }}\r\n @if (accentedTitle()) {\r\n <span class=\"accent-text\">\r\n {{ accentedTitle() }}\r\n </span>\r\n }\r\n </h1>\r\n @if (subtitle()) {\r\n <p class=\"premium-subtitle\">\r\n {{ subtitle() }}\r\n </p>\r\n }\r\n </div>\r\n @if (buttons() && buttons()!.length > 0) {\r\n <div class=\"header-actions\">\r\n @for (button of buttons(); track $index) {\r\n @if (button.isModalTrigger && button.modalResource) {\r\n <ad-modal-trigger [resource]=\"getModalTriggerResource(button)\"\r\n (confirm)=\"handleModalConfirm(button.onModalConfirm, $event)\"\r\n (cancel)=\"handleModalCancel(button.onModalCancel)\">\r\n </ad-modal-trigger>\r\n } @else {\r\n <ad-button [variant]=\"button.variant || 'primary'\" [type]=\"button.type || 'button'\"\r\n [disabled]=\"button.disabled || false\" (click)=\"handleButtonClick(button.onClick)\" [icon]=\"button.icon\">\r\n {{ button.label }}\r\n </ad-button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n\r\n<!-- Divider is no longer needed with the card style -->\r\n@if (showDivider() && false) {\r\n<div class=\"ad-description-header__divider\"></div>\r\n}", styles: [":root{--color-primary: #002855;--color-primary-hover: #003366;--color-primary-active: #001a38;--color-primary-light: #F1F5F9;--color-primary-accent: #5BC2E7;--color-background: #F8FAFC;--color-surface: #FFFFFF;--color-border: #F1F5F9;--color-secondary: #475569;--color-secondary-light: #94A3B8;--color-success: #A2D033;--color-success-bg: rgba(162, 208, 51, .05);--color-success-text: #7A9F26;--color-alert: #EF4444;--color-alert-bg: rgba(239, 68, 68, .05);--color-alert-text: #DC2626;--color-warning: #F59E0B;--color-warning-bg: rgba(245, 158, 11, .05);--color-warning-text: #D97706;--color-slate-900: #0f172a;--color-slate-800: #1e293b;--color-slate-700: #334155;--color-slate-500: #64748b;--color-slate-400: #94a3b8;--color-slate-200: #e2e8f0;--color-slate-100: #f1f5f9;--color-slate-50: #f8fafc;--color-white: #ffffff;--radius-cerca: 1.25rem;--radius-cerca-sm: .75rem;--radius-cerca-lg: 2rem;--shadow-premium: 0 20px 25px -5px rgba(0, 0, 0, .02), 0 8px 10px -6px rgba(0, 0, 0, .02);--shadow-premium-hover: 0 30px 40px -5px rgba(0, 0, 0, .05), 0 15px 20px -5px rgba(0, 0, 0, .03);--shadow-glass: 0 8px 32px 0 rgba(31, 38, 135, .07);--shadow-sidebar: 4px 0 24px 0 rgba(0, 0, 0, .05);--shadow-glow-primary: 0 0 20px rgba(91, 194, 231, .15);--gradient-premium: linear-gradient(135deg, #002855 0%, #001a38 100%);--gradient-glass: linear-gradient(135deg, rgba(255, 255, 255, .1), rgba(255, 255, 255, .05));--gradient-accent: linear-gradient(135deg, #5BC2E7 0%, #002855 100%);--ant-primary-color: var(--color-primary);--ant-primary-color-hover: var(--color-primary-hover);--ant-primary-color-active: var(--color-primary-active);--ant-primary-color-outline: rgba(0, 40, 85, .2);--ant-success-color: var(--color-success);--ant-success-color-hover: #b3e040;--ant-success-color-active: #8fb82b;--ant-success-color-outline: rgba(162, 208, 51, .2);--ant-info-color: var(--color-primary);--ant-link-color: var(--color-primary-accent);--ant-link-color-hover: #4db3d9;--ant-link-color-active: var(--color-primary)}:root{--font-sans: \"Inter\", system-ui, sans-serif;--font-display: \"Outfit\", sans-serif}:root,[data-theme=light]{--color-bg-primary: var(--color-surface);--color-bg-secondary: var(--color-background);--color-text-primary: var(--color-slate-900);--color-text-secondary: var(--color-secondary);--color-text-muted: var(--color-secondary-light);--color-border-subtle: var(--color-slate-200);--color-border-strong: var(--color-slate-300);--color-brand: var(--color-primary);--color-brand-hover: var(--color-primary-hover);--color-focus-ring: var(--ant-primary-color-outline);--color-success: var(--color-success);--color-danger: var(--color-alert);--surface-glass-bg: rgba(255, 255, 255, .7);--surface-glass-border: rgba(255, 255, 255, .3);--surface-glass-blur: 12px;--surface-glass-shadow: var(--shadow-glass);--font-heading-xl: 32px;--font-heading-lg: 24px;--font-heading-md: 20px;--font-body-lg: 18px;--font-body-md: 16px;--font-caption: 12px;--font-family-base: var(--font-sans);--font-weight-regular: 400;--font-weight-medium: 500;--font-weight-semibold: 600;--font-weight-bold: 700;--radius-sm: var(--radius-cerca-sm);--radius-md: var(--radius-cerca);--radius-lg: var(--radius-cerca-lg);--radius-xl: 3rem;--radius-full: 9999px;--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, .05);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .1);--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, .1)}[data-theme=dark]{--color-bg-primary: var(--color-slate-900);--color-bg-secondary: var(--color-slate-800);--color-text-primary: var(--color-white);--color-text-secondary: var(--color-slate-400);--color-text-muted: var(--color-slate-500);--color-border-subtle: var(--color-slate-700);--color-border-strong: var(--color-slate-600);--color-brand: var(--color-primary-light);--color-brand-hover: var(--color-primary-accent);--color-focus-ring: rgba(59, 130, 246, .5);--surface-glass-bg: rgba(15, 23, 42, .8);--surface-glass-border: rgba(255, 255, 255, .1);--surface-glass-blur: 16px;--surface-glass-shadow: 0 10px 15px -3px rgba(0, 0, 0, .3)}:root{--h1-size: var(--font-size-h1);--h1-weight: var(--font-weight-semibold);--h2-size: var(--font-size-h2);--h2-weight: var(--font-weight-semibold);--h3-size: var(--font-size-h3);--h3-weight: var(--font-weight-semibold);--body-size: var(--font-size-body);--body-weight: var(--font-weight-regular);--sm-size: var(--font-size-sm);--sm-weight: var(--font-weight-regular);--caption-size: var(--font-size-caption);--caption-weight: var(--font-weight-regular)}:root{--btn-height-md: 44px;--btn-radius: var(--radius-md);--btn-font-weight: var(--font-weight-medium);--btn-bg-primary: var(--color-brand);--btn-text-primary: #FFFFFF;--btn-shadow-default: var(--shadow-sm);--btn-shadow-hover: var(--shadow-md);--btn-transition: .15s ease;--btn-focus-ring: 0 0 0 2px var(--color-focus-ring)}:root{--card-bg: var(--color-bg-primary);--card-radius: var(--radius-lg);--card-shadow: var(--shadow-sm);--card-shadow-hover: var(--shadow-md)}:root{--input-height-md: 44px;--input-bg: var(--color-bg-primary);--input-radius: var(--radius-md);--input-border-default: var(--color-border-subtle);--input-border-hover: var(--color-border-strong);--input-border-focus: var(--color-brand);--input-border-error: var(--color-danger);--input-transition: .12s ease-in-out;--input-focus-ring: 0 0 0 3px var(--color-focus-ring);--input-error-ring: 0 0 0 3px rgba(239, 68, 68, .15)}.ad-badge-tokens{--badge-radius: var(--radius-sm);--badge-padding-v: var(--space-1);--badge-padding-h: var(--space-2);--badge-font-size: var(--font-size-xs);--badge-font-weight: var(--font-weight-medium);--badge-success-bg: #D1FAE5;--badge-success-text: #065F46;--badge-success-border: #A7F3D0;--badge-warning-bg: #FEF3C7;--badge-warning-text: #92400E;--badge-warning-border: #FDE68A;--badge-error-bg: #FFE4E6;--badge-error-text: #9F1239;--badge-error-border: #FECDD3;--badge-info-bg: var(--color-info-50);--badge-info-text: var(--color-info-700);--badge-info-border: var(--color-info-200);--badge-neutral-bg: var(--color-slate-100);--badge-neutral-text: var(--color-slate-700);--badge-neutral-border: var(--color-slate-200)}.ad-label-tokens{--label-font-size: var(--font-size-sm);--label-font-weight: var(--font-weight-medium);--label-color: var(--color-text-secondary);--label-required-color: var(--color-error-500);--label-margin-bottom: var(--space-2)}.ad-select-tokens{--select-bg: var(--color-bg-primary);--select-border: var(--color-border-subtle);--select-border-hover: var(--color-border-strong);--select-border-focus: var(--color-brand-primary);--select-shadow-focus: var(--shadow-focus);--select-radius: var(--radius-md);--select-height: 44px;--select-padding-h: var(--space-4);--select-dropdown-bg: var(--color-bg-primary);--select-dropdown-shadow: var(--shadow-md);--select-dropdown-max-height: 240px;--select-option-padding: var(--space-3) var(--space-4);--select-option-hover: var(--color-bg-secondary);--select-option-selected-bg: var(--color-brand-50);--select-option-selected-text: var(--color-brand-primary)}.ad-form-field-tokens{--form-field-margin-bottom: var(--space-6);--form-field-label-margin: var(--space-2);--form-field-message-margin: var(--space-1);--form-field-message-font-size: var(--font-size-xs);--form-field-message-color: var(--color-text-muted);--form-field-error-color: var(--color-error-600)}.ad-header-tokens{--header-height: 72px;--header-bg: var(--color-surface);--header-border-color: var(--color-border);--header-padding: 0 var(--space-6);--header-shadow: 0 1px 2px rgba(0, 0, 0, .05);--header-z-index: 100;--header-logo-height: 32px;--header-user-gap: var(--space-4)}.ad-sidebar-tokens{--sidebar-width: 280px;--sidebar-collapsed-width: 80px;--sidebar-bg: var(--color-slate-900);--sidebar-border-color: var(--color-slate-800);--sidebar-padding: var(--space-4);--sidebar-z-index: 101;--sidebar-transition: width .3s cubic-bezier(.4, 0, .2, 1);--sidebar-item-height: 48px;--sidebar-item-radius: var(--radius-lg);--sidebar-item-padding: 0 var(--space-4);--sidebar-item-gap: var(--space-3);--sidebar-accent-color: var(--color-primary);--sidebar-text-color: var(--color-surface);--sidebar-text-muted: var(--color-slate-400)}.ad-data-table-tokens{--table-bg: var(--color-bg-primary);--table-header-bg: var(--color-bg-secondary);--table-border-color: var(--color-border-subtle);--table-header-color: var(--color-text-muted);--table-row-hover: rgba(var(--color-brand-primary-rgb), .04);--table-cell-padding: var(--space-4);--table-font-size: var(--font-size-sm);--table-radius: var(--radius-lg)}:root{--modal-bg: var(--color-surface);--modal-overlay-bg: rgba(0, 0, 0, .5);--modal-radius: var(--radius-cerca);--modal-shadow: var(--shadow-premium);--modal-z-index: 1000;--modal-header-padding: 12px 24px;--modal-body-padding: 24px;--modal-footer-padding: 16px 24px;--modal-sm-width: 400px;--modal-md-width: 600px;--modal-lg-width: 900px}.premium-header-card{background:#fff;padding:1.5rem 2rem;border-radius:16px;box-shadow:var(--shadow-premium, 0 4px 20px -2px rgba(0, 0, 0, .1));margin-bottom:2rem;position:relative;overflow:hidden;border:1px solid rgba(0,0,0,.03)}.premium-header-card:after{content:\"\";position:absolute;top:0;left:0;width:100%;height:4px;background:linear-gradient(to right,var(--color-primary),var(--color-primary-accent, #00d2ff))}.header-main{display:flex;justify-content:space-between;align-items:center;gap:1.5rem;flex-wrap:wrap}@media(max-width:768px){.header-main{flex-direction:column;align-items:stretch}}.title-group{display:flex;flex-direction:column;gap:.25rem}.premium-title{font-size:1.5rem;font-weight:800;letter-spacing:-.04em;margin:0;color:var(--color-slate-900, #1e293b);line-height:1.2}.premium-title .accent-text{background:linear-gradient(135deg,var(--color-primary) 0%,var(--color-primary-accent, #00d2ff) 100%);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;margin-left:.3rem}.premium-subtitle{margin-top:0rem;color:var(--color-slate-500, #64748b);font-size:.9rem;font-weight:500;letter-spacing:-.01em}.header-actions{display:flex;gap:var(--spacing-sm);align-items:center}@media(max-width:768px){.header-actions{width:100%;justify-content:flex-start}}\n"] }]
1893
+ args: [{ selector: 'ad-description-header', standalone: true, imports: [CommonModule, AdButtonComponent, AdModalTriggerComponent], template: "<div class=\"premium-header-card\">\r\n <div class=\"header-main\">\r\n <div class=\"title-wrapper\">\r\n @if (backButton()) {\r\n <ad-button variant=\"ghost\" icon=\"arrow_back\" (click)=\"handleBack()\" class=\"back-btn\" />\r\n }\r\n <div class=\"title-group\">\r\n <h1 class=\"premium-title\">\r\n {{ title() }}\r\n @if (accentedTitle()) {\r\n <span class=\"accent-text\">\r\n {{ accentedTitle() }}\r\n </span>\r\n }\r\n </h1>\r\n @if (subtitle()) {\r\n <p class=\"premium-subtitle\">\r\n {{ subtitle() }}\r\n </p>\r\n }\r\n </div>\r\n </div>\r\n @if (buttons() && buttons()!.length > 0) {\r\n <div class=\"header-actions\">\r\n @for (button of buttons(); track $index) {\r\n @if (button.isModalTrigger && button.modalResource) {\r\n <ad-modal-trigger [resource]=\"getModalTriggerResource(button)\"\r\n (confirm)=\"handleModalConfirm(button.onModalConfirm, $event)\"\r\n (cancel)=\"handleModalCancel(button.onModalCancel)\">\r\n </ad-modal-trigger>\r\n } @else {\r\n <ad-button [variant]=\"button.variant || 'primary'\" [type]=\"button.type || 'button'\"\r\n [disabled]=\"button.disabled || false\" (click)=\"handleButtonClick(button.onClick)\" [icon]=\"button.icon\">\r\n {{ button.label }}\r\n </ad-button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n\r\n<!-- Divider is no longer needed with the card style -->\r\n@if (showDivider() && false) {\r\n<div class=\"ad-description-header__divider\"></div>\r\n}", styles: [":root{--color-primary: #002855;--color-primary-hover: #003366;--color-primary-active: #001a38;--color-primary-light: #F1F5F9;--color-primary-accent: #5BC2E7;--color-background: #F8FAFC;--color-surface: #FFFFFF;--color-border: #F1F5F9;--color-secondary: #475569;--color-secondary-light: #94A3B8;--color-success: #A2D033;--color-success-bg: rgba(162, 208, 51, .05);--color-success-text: #7A9F26;--color-alert: #EF4444;--color-alert-bg: rgba(239, 68, 68, .05);--color-alert-text: #DC2626;--color-warning: #F59E0B;--color-warning-bg: rgba(245, 158, 11, .05);--color-warning-text: #D97706;--color-slate-900: #0f172a;--color-slate-800: #1e293b;--color-slate-700: #334155;--color-slate-500: #64748b;--color-slate-400: #94a3b8;--color-slate-200: #e2e8f0;--color-slate-100: #f1f5f9;--color-slate-50: #f8fafc;--color-white: #ffffff;--radius-cerca: 1.25rem;--radius-cerca-sm: .75rem;--radius-cerca-lg: 2rem;--shadow-premium: 0 20px 25px -5px rgba(0, 0, 0, .02), 0 8px 10px -6px rgba(0, 0, 0, .02);--shadow-premium-hover: 0 30px 40px -5px rgba(0, 0, 0, .05), 0 15px 20px -5px rgba(0, 0, 0, .03);--shadow-glass: 0 8px 32px 0 rgba(31, 38, 135, .07);--shadow-sidebar: 4px 0 24px 0 rgba(0, 0, 0, .05);--shadow-glow-primary: 0 0 20px rgba(91, 194, 231, .15);--gradient-premium: linear-gradient(135deg, #002855 0%, #001a38 100%);--gradient-glass: linear-gradient(135deg, rgba(255, 255, 255, .1), rgba(255, 255, 255, .05));--gradient-accent: linear-gradient(135deg, #5BC2E7 0%, #002855 100%);--ant-primary-color: var(--color-primary);--ant-primary-color-hover: var(--color-primary-hover);--ant-primary-color-active: var(--color-primary-active);--ant-primary-color-outline: rgba(0, 40, 85, .2);--ant-success-color: var(--color-success);--ant-success-color-hover: #b3e040;--ant-success-color-active: #8fb82b;--ant-success-color-outline: rgba(162, 208, 51, .2);--ant-info-color: var(--color-primary);--ant-link-color: var(--color-primary-accent);--ant-link-color-hover: #4db3d9;--ant-link-color-active: var(--color-primary)}:root{--font-sans: \"Inter\", system-ui, sans-serif;--font-display: \"Outfit\", sans-serif}:root,[data-theme=light]{--color-bg-primary: var(--color-surface);--color-bg-secondary: var(--color-background);--color-text-primary: var(--color-slate-900);--color-text-secondary: var(--color-secondary);--color-text-muted: var(--color-secondary-light);--color-border-subtle: var(--color-slate-200);--color-border-strong: var(--color-slate-300);--color-brand: var(--color-primary);--color-brand-hover: var(--color-primary-hover);--color-focus-ring: var(--ant-primary-color-outline);--color-success: var(--color-success);--color-danger: var(--color-alert);--surface-glass-bg: rgba(255, 255, 255, .7);--surface-glass-border: rgba(255, 255, 255, .3);--surface-glass-blur: 12px;--surface-glass-shadow: var(--shadow-glass);--font-heading-xl: 32px;--font-heading-lg: 24px;--font-heading-md: 20px;--font-body-lg: 18px;--font-body-md: 16px;--font-caption: 12px;--font-family-base: var(--font-sans);--font-weight-regular: 400;--font-weight-medium: 500;--font-weight-semibold: 600;--font-weight-bold: 700;--radius-sm: var(--radius-cerca-sm);--radius-md: var(--radius-cerca);--radius-lg: var(--radius-cerca-lg);--radius-xl: 3rem;--radius-full: 9999px;--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, .05);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .1);--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, .1)}[data-theme=dark]{--color-bg-primary: var(--color-slate-900);--color-bg-secondary: var(--color-slate-800);--color-text-primary: var(--color-white);--color-text-secondary: var(--color-slate-400);--color-text-muted: var(--color-slate-500);--color-border-subtle: var(--color-slate-700);--color-border-strong: var(--color-slate-600);--color-brand: var(--color-primary-light);--color-brand-hover: var(--color-primary-accent);--color-focus-ring: rgba(59, 130, 246, .5);--surface-glass-bg: rgba(15, 23, 42, .8);--surface-glass-border: rgba(255, 255, 255, .1);--surface-glass-blur: 16px;--surface-glass-shadow: 0 10px 15px -3px rgba(0, 0, 0, .3)}:root{--h1-size: var(--font-size-h1);--h1-weight: var(--font-weight-semibold);--h2-size: var(--font-size-h2);--h2-weight: var(--font-weight-semibold);--h3-size: var(--font-size-h3);--h3-weight: var(--font-weight-semibold);--body-size: var(--font-size-body);--body-weight: var(--font-weight-regular);--sm-size: var(--font-size-sm);--sm-weight: var(--font-weight-regular);--caption-size: var(--font-size-caption);--caption-weight: var(--font-weight-regular)}:root{--btn-height-md: 44px;--btn-radius: var(--radius-md);--btn-font-weight: var(--font-weight-medium);--btn-bg-primary: var(--color-brand);--btn-text-primary: #FFFFFF;--btn-shadow-default: var(--shadow-sm);--btn-shadow-hover: var(--shadow-md);--btn-transition: .15s ease;--btn-focus-ring: 0 0 0 2px var(--color-focus-ring)}:root{--card-bg: var(--color-bg-primary);--card-radius: var(--radius-lg);--card-shadow: var(--shadow-sm);--card-shadow-hover: var(--shadow-md)}:root{--input-height-md: 44px;--input-bg: var(--color-bg-primary);--input-radius: var(--radius-md);--input-border-default: var(--color-border-subtle);--input-border-hover: var(--color-border-strong);--input-border-focus: var(--color-brand);--input-border-error: var(--color-danger);--input-transition: .12s ease-in-out;--input-focus-ring: 0 0 0 3px var(--color-focus-ring);--input-error-ring: 0 0 0 3px rgba(239, 68, 68, .15)}.ad-badge-tokens{--badge-radius: var(--radius-sm);--badge-padding-v: var(--space-1);--badge-padding-h: var(--space-2);--badge-font-size: var(--font-size-xs);--badge-font-weight: var(--font-weight-medium);--badge-success-bg: #D1FAE5;--badge-success-text: #065F46;--badge-success-border: #A7F3D0;--badge-warning-bg: #FEF3C7;--badge-warning-text: #92400E;--badge-warning-border: #FDE68A;--badge-error-bg: #FFE4E6;--badge-error-text: #9F1239;--badge-error-border: #FECDD3;--badge-info-bg: var(--color-info-50);--badge-info-text: var(--color-info-700);--badge-info-border: var(--color-info-200);--badge-neutral-bg: var(--color-slate-100);--badge-neutral-text: var(--color-slate-700);--badge-neutral-border: var(--color-slate-200)}.ad-label-tokens{--label-font-size: var(--font-size-sm);--label-font-weight: var(--font-weight-medium);--label-color: var(--color-text-secondary);--label-required-color: var(--color-error-500);--label-margin-bottom: var(--space-2)}.ad-select-tokens{--select-bg: var(--color-bg-primary);--select-border: var(--color-border-subtle);--select-border-hover: var(--color-border-strong);--select-border-focus: var(--color-brand-primary);--select-shadow-focus: var(--shadow-focus);--select-radius: var(--radius-md);--select-height: 44px;--select-padding-h: var(--space-4);--select-dropdown-bg: var(--color-bg-primary);--select-dropdown-shadow: var(--shadow-md);--select-dropdown-max-height: 240px;--select-option-padding: var(--space-3) var(--space-4);--select-option-hover: var(--color-bg-secondary);--select-option-selected-bg: var(--color-brand-50);--select-option-selected-text: var(--color-brand-primary)}.ad-form-field-tokens{--form-field-margin-bottom: var(--space-6);--form-field-label-margin: var(--space-2);--form-field-message-margin: var(--space-1);--form-field-message-font-size: var(--font-size-xs);--form-field-message-color: var(--color-text-muted);--form-field-error-color: var(--color-error-600)}.ad-header-tokens{--header-height: 72px;--header-bg: var(--color-surface);--header-border-color: var(--color-border);--header-padding: 0 var(--space-6);--header-shadow: 0 1px 2px rgba(0, 0, 0, .05);--header-z-index: 100;--header-logo-height: 32px;--header-user-gap: var(--space-4)}.ad-sidebar-tokens{--sidebar-width: 280px;--sidebar-collapsed-width: 80px;--sidebar-bg: var(--color-slate-900);--sidebar-border-color: var(--color-slate-800);--sidebar-padding: var(--space-4);--sidebar-z-index: 101;--sidebar-transition: width .3s cubic-bezier(.4, 0, .2, 1);--sidebar-item-height: 48px;--sidebar-item-radius: var(--radius-lg);--sidebar-item-padding: 0 var(--space-4);--sidebar-item-gap: var(--space-3);--sidebar-accent-color: var(--color-primary);--sidebar-text-color: var(--color-surface);--sidebar-text-muted: var(--color-slate-400)}.ad-data-table-tokens{--table-bg: var(--color-bg-primary);--table-header-bg: var(--color-bg-secondary);--table-border-color: var(--color-border-subtle);--table-header-color: var(--color-text-muted);--table-row-hover: rgba(var(--color-brand-primary-rgb), .04);--table-cell-padding: var(--space-4);--table-font-size: var(--font-size-sm);--table-radius: var(--radius-lg)}:root{--modal-bg: var(--color-surface);--modal-overlay-bg: rgba(0, 0, 0, .5);--modal-radius: var(--radius-cerca);--modal-shadow: var(--shadow-premium);--modal-z-index: 1000;--modal-header-padding: 12px 24px;--modal-body-padding: 24px;--modal-footer-padding: 16px 24px;--modal-sm-width: 400px;--modal-md-width: 600px;--modal-lg-width: 900px}.premium-header-card{background:#fff;padding:1.5rem 2rem;border-radius:16px;box-shadow:var(--shadow-premium, 0 4px 20px -2px rgba(0, 0, 0, .1));margin-bottom:2rem;position:relative;overflow:hidden;border:1px solid rgba(0,0,0,.03)}.premium-header-card:after{content:\"\";position:absolute;top:0;left:0;width:100%;height:4px;background:linear-gradient(to right,var(--color-primary),var(--color-primary-accent, #00d2ff))}.header-main{display:flex;justify-content:space-between;align-items:center;gap:1.5rem;flex-wrap:wrap}@media(max-width:768px){.header-main{flex-direction:column;align-items:stretch}}.title-wrapper{display:flex;align-items:center;gap:1rem}.title-group{display:flex;flex-direction:column;gap:.25rem}.back-btn ::ng-deep button{padding:.5rem;height:2.5rem;width:2.5rem;border-radius:50%;color:var(--color-slate-500, #64748b);display:flex;align-items:center;justify-content:center}.back-btn ::ng-deep button:hover{background-color:var(--color-slate-100, #f1f5f9);color:var(--color-slate-700, #334155)}.premium-title{font-size:1.5rem;font-weight:800;letter-spacing:-.04em;margin:0;color:var(--color-slate-900, #1e293b);line-height:1.2}.premium-title .accent-text{background:linear-gradient(135deg,var(--color-primary) 0%,var(--color-primary-accent, #00d2ff) 100%);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;margin-left:.3rem}.premium-subtitle{margin-top:0rem;color:var(--color-slate-500, #64748b);font-size:.9rem;font-weight:500;letter-spacing:-.01em}.header-actions{display:flex;gap:var(--spacing-sm);align-items:center}@media(max-width:768px){.header-actions{width:100%;justify-content:flex-start}}\n"] }]
1760
1894
  }], propDecorators: { resource: [{ type: i0.Input, args: [{ isSignal: true, alias: "resource", required: true }] }] } });
1761
1895
 
1762
1896
  const DescriptionHeaderButtonSchema = z.object({
@@ -1778,6 +1912,8 @@ const DescriptionHeaderResourceSchema = z.object({
1778
1912
  subtitle: z.string().optional(),
1779
1913
  buttons: z.array(DescriptionHeaderButtonSchema).optional(),
1780
1914
  showDivider: z.boolean().optional(),
1915
+ backButton: z.boolean().optional(),
1916
+ onBack: z.custom().optional(),
1781
1917
  });
1782
1918
 
1783
1919
  class AdFormFieldComponent {
@@ -1790,11 +1926,11 @@ class AdFormFieldComponent {
1790
1926
  forAttr = computed(() => this.resource().for || '', ...(ngDevMode ? [{ debugName: "forAttr" }] : []));
1791
1927
  hasError = computed(() => !!this.errorMessage(), ...(ngDevMode ? [{ debugName: "hasError" }] : []));
1792
1928
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdFormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1793
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: AdFormFieldComponent, isStandalone: true, selector: "ad-form-field", inputs: { resource: { classPropertyName: "resource", publicName: "resource", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div class=\"ad-form-field\" [class.has-error]=\"hasError()\">\r\n @if (label()) {\r\n <ad-label [text]=\"label()\" [for]=\"forAttr()\" [required]=\"required()\" [error]=\"hasError()\">\r\n </ad-label>\r\n }\r\n\r\n <div class=\"ad-form-field-content\">\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n @if (hint() || errorMessage()) {\r\n <div class=\"ad-form-field-info\">\r\n @if (errorMessage()) {\r\n <span class=\"ad-form-field-error\">{{ errorMessage() }}</span>\r\n }\r\n @if (hint() && !errorMessage()) {\r\n <span class=\"ad-form-field-hint\">{{ hint() }}</span>\r\n }\r\n </div>\r\n }\r\n</div>", styles: [".ad-form-field{display:flex;flex-direction:column;margin-bottom:var(--form-field-margin-bottom);width:100%}.ad-form-field .ad-form-field-content{position:relative;display:flex;flex-direction:column}.ad-form-field .ad-form-field-info{margin-top:var(--form-field-message-margin);min-height:1.25rem}.ad-form-field .ad-form-field-error{color:var(--form-field-error-color);font-size:var(--form-field-message-font-size);font-weight:var(--font-weight-medium);display:block;animation:fadeIn .2s ease-out}.ad-form-field .ad-form-field-hint{color:var(--form-field-message-color);font-size:var(--form-field-message-font-size);display:block}@keyframes fadeIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AdLabelComponent, selector: "ad-label", inputs: ["text", "for", "required", "error"] }] });
1929
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: AdFormFieldComponent, isStandalone: true, selector: "ad-form-field", inputs: { resource: { classPropertyName: "resource", publicName: "resource", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div class=\"ad-form-field\" [class.has-error]=\"hasError()\">\r\n @if (label()) {\r\n <ad-label [text]=\"label()\" [for]=\"forAttr()\" [required]=\"required()\" [error]=\"hasError()\">\r\n </ad-label>\r\n }\r\n\r\n <div class=\"ad-form-field-content\">\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n @if (hint() || errorMessage()) {\r\n <div class=\"ad-form-field-info\">\r\n @if (errorMessage()) {\r\n <span class=\"ad-form-field-error\">{{ errorMessage() }}</span>\r\n }\r\n @if (hint() && !errorMessage()) {\r\n <span class=\"ad-form-field-hint\">{{ hint() }}</span>\r\n }\r\n </div>\r\n }\r\n</div>", styles: [".ad-form-field{display:flex;flex-direction:column;width:100%}.ad-form-field .ad-form-field-content{position:relative;display:flex;flex-direction:column}.ad-form-field .ad-form-field-info{margin-top:var(--form-field-message-margin);min-height:1.25rem}.ad-form-field .ad-form-field-error{color:var(--form-field-error-color);font-size:var(--form-field-message-font-size);font-weight:var(--font-weight-medium);display:block;animation:fadeIn .2s ease-out}.ad-form-field .ad-form-field-hint{color:var(--form-field-message-color);font-size:var(--form-field-message-font-size);display:block}@keyframes fadeIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AdLabelComponent, selector: "ad-label", inputs: ["text", "for", "required", "error"] }] });
1794
1930
  }
1795
1931
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdFormFieldComponent, decorators: [{
1796
1932
  type: Component,
1797
- args: [{ selector: 'ad-form-field', standalone: true, imports: [CommonModule, AdLabelComponent], template: "<div class=\"ad-form-field\" [class.has-error]=\"hasError()\">\r\n @if (label()) {\r\n <ad-label [text]=\"label()\" [for]=\"forAttr()\" [required]=\"required()\" [error]=\"hasError()\">\r\n </ad-label>\r\n }\r\n\r\n <div class=\"ad-form-field-content\">\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n @if (hint() || errorMessage()) {\r\n <div class=\"ad-form-field-info\">\r\n @if (errorMessage()) {\r\n <span class=\"ad-form-field-error\">{{ errorMessage() }}</span>\r\n }\r\n @if (hint() && !errorMessage()) {\r\n <span class=\"ad-form-field-hint\">{{ hint() }}</span>\r\n }\r\n </div>\r\n }\r\n</div>", styles: [".ad-form-field{display:flex;flex-direction:column;margin-bottom:var(--form-field-margin-bottom);width:100%}.ad-form-field .ad-form-field-content{position:relative;display:flex;flex-direction:column}.ad-form-field .ad-form-field-info{margin-top:var(--form-field-message-margin);min-height:1.25rem}.ad-form-field .ad-form-field-error{color:var(--form-field-error-color);font-size:var(--form-field-message-font-size);font-weight:var(--font-weight-medium);display:block;animation:fadeIn .2s ease-out}.ad-form-field .ad-form-field-hint{color:var(--form-field-message-color);font-size:var(--form-field-message-font-size);display:block}@keyframes fadeIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}\n"] }]
1933
+ args: [{ selector: 'ad-form-field', standalone: true, imports: [CommonModule, AdLabelComponent], template: "<div class=\"ad-form-field\" [class.has-error]=\"hasError()\">\r\n @if (label()) {\r\n <ad-label [text]=\"label()\" [for]=\"forAttr()\" [required]=\"required()\" [error]=\"hasError()\">\r\n </ad-label>\r\n }\r\n\r\n <div class=\"ad-form-field-content\">\r\n <ng-content></ng-content>\r\n </div>\r\n\r\n @if (hint() || errorMessage()) {\r\n <div class=\"ad-form-field-info\">\r\n @if (errorMessage()) {\r\n <span class=\"ad-form-field-error\">{{ errorMessage() }}</span>\r\n }\r\n @if (hint() && !errorMessage()) {\r\n <span class=\"ad-form-field-hint\">{{ hint() }}</span>\r\n }\r\n </div>\r\n }\r\n</div>", styles: [".ad-form-field{display:flex;flex-direction:column;width:100%}.ad-form-field .ad-form-field-content{position:relative;display:flex;flex-direction:column}.ad-form-field .ad-form-field-info{margin-top:var(--form-field-message-margin);min-height:1.25rem}.ad-form-field .ad-form-field-error{color:var(--form-field-error-color);font-size:var(--form-field-message-font-size);font-weight:var(--font-weight-medium);display:block;animation:fadeIn .2s ease-out}.ad-form-field .ad-form-field-hint{color:var(--form-field-message-color);font-size:var(--form-field-message-font-size);display:block}@keyframes fadeIn{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}\n"] }]
1798
1934
  }], propDecorators: { resource: [{ type: i0.Input, args: [{ isSignal: true, alias: "resource", required: true }] }] } });
1799
1935
 
1800
1936
  const FormFieldResourceSchema = z.object({
@@ -2043,7 +2179,7 @@ class AdLoginComponent {
2043
2179
  return (control && control.invalid && (control.dirty || control.touched)) || false;
2044
2180
  }
2045
2181
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdLoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2046
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: AdLoginComponent, isStandalone: true, selector: "ad-login", inputs: { resource: { classPropertyName: "resource", publicName: "resource", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { loginSubmit: "loginSubmit", forgotPasswordClick: "forgotPasswordClick" }, ngImport: i0, template: "<div class=\"min-h-screen flex items-center justify-center bg-auth-gradient py-12 px-4 sm:px-6 lg:px-8\">\r\n <div class=\"w-full max-w-md space-y-8 bg-white p-8 rounded-xl shadow-lg border border-slate-100\">\r\n <div class=\"text-center\">\r\n @if (logo()) {\r\n <img [src]=\"logo()\" alt=\"Logo\" class=\"mx-auto h-12 w-auto\" />\r\n } @else if (icon()) {\r\n <div class=\"mx-auto h-12 w-12 flex items-center justify-center rounded-full bg-sky-100 text-sky-600\">\r\n <!-- Fallback icon or remove nz-icon -->\r\n <span class=\"text-2xl font-bold\">C</span>\r\n </div>\r\n }\r\n <h2 class=\"mt-6 text-3xl font-extrabold text-cerca-navy\">\r\n {{ title() }}\r\n @if (titleAccent()) {\r\n <span class=\"accent-text\">{{ titleAccent() }}</span>\r\n }\r\n </h2>\r\n <p class=\"mt-2 text-sm text-slate-600 uppercase tracking-wide\">{{ subtitle() }}</p>\r\n </div>\r\n\r\n @if (errorMessage()) {\r\n <div class=\"bg-red-50 border-l-4 border-red-500 p-4 mb-4 rounded-md\">\r\n <div class=\"flex\">\r\n <div class=\"ml-3\">\r\n <p class=\"text-sm text-red-700\">{{ errorMessage() }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <form [formGroup]=\"loginForm\" class=\"mt-8 space-y-6\" (ngSubmit)=\"submitForm()\">\r\n <div class=\"space-y-4\">\r\n <div class=\"form-group\">\r\n <ad-input formControlName=\"email\" placeholder=\"correo@ejemplo.com\" label=\"Correo Electr\u00F3nico\"\r\n type=\"email\" prefix=\"user\" [error]=\"fieldInvalid('email')\">\r\n </ad-input>\r\n @if (fieldInvalid('email')) {\r\n <p class=\"mt-1 text-sm text-red-600\">\r\n @if (loginForm.get('email')?.hasError('required')) { El campo es requerido }\r\n @else { Ingrese un correo v\u00E1lido }\r\n </p>\r\n }\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <ad-input formControlName=\"password\" placeholder=\"********\" label=\"Contrase\u00F1a\" type=\"password\"\r\n prefix=\"lock\" [error]=\"fieldInvalid('password')\">\r\n </ad-input>\r\n @if (fieldInvalid('password')) {\r\n <p class=\"mt-1 text-sm text-red-600\">\r\n La contrase\u00F1a es requerida\r\n </p>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex items-center justify-between\">\r\n <div class=\"flex items-center\">\r\n <input id=\"remember-me\" formControlName=\"remember\" type=\"checkbox\"\r\n class=\"h-4 w-4 rounded border-slate-300 text-sky-600 focus:ring-sky-600\">\r\n <label for=\"remember-me\" class=\"ml-2 block text-sm text-slate-900\">Recordarme</label>\r\n </div>\r\n\r\n @if (recoverPasswordUrl()) {\r\n <a [href]=\"recoverPasswordUrl()\" class=\"text-sm font-medium text-sky-600 hover:text-sky-500\">\r\n {{ forgotPasswordLabel() }}\r\n </a>\r\n } @else {\r\n <a class=\"text-sm font-medium text-sky-600 hover:text-sky-500 cursor-pointer\"\r\n (click)=\"forgotPasswordClick.emit()\">\r\n {{ forgotPasswordLabel() }}\r\n </a>\r\n }\r\n </div>\r\n\r\n <div>\r\n <div>\r\n <ad-button [loading]=\"loading()\" variant=\"primary\" type=\"submit\" [block]=\"true\"\r\n class=\"w-full justify-center\" [disabled]=\"loginForm.invalid || loading()\">\r\n Iniciar Sesi\u00F3n\r\n </ad-button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"mt-6 text-center text-xs text-slate-400\">\r\n <p>\u00BFNecesitas ayuda? Contacta a <a [href]=\"'mailto:' + supportEmail()\"\r\n class=\"hover:text-sky-600 transition-colors\">{{ supportEmail() }}</a></p>\r\n </div>\r\n </div>\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: AdInputComponent, selector: "ad-input", inputs: ["type", "placeholder", "label", "error", "rows", "disabled", "size", "prefix", "suffix"] }, { kind: "component", type: AdButtonComponent, selector: "ad-button", inputs: ["variant", "type", "disabled", "loading", "icon", "size", "block"] }] });
2182
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: AdLoginComponent, isStandalone: true, selector: "ad-login", inputs: { resource: { classPropertyName: "resource", publicName: "resource", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { loginSubmit: "loginSubmit", forgotPasswordClick: "forgotPasswordClick" }, ngImport: i0, template: "<div class=\"min-h-screen flex items-center justify-center bg-auth-gradient py-12 px-4 sm:px-6 lg:px-8\">\r\n <div class=\"w-full max-w-md space-y-8 bg-white p-8 rounded-xl shadow-lg border border-slate-100\">\r\n <div class=\"text-center\">\r\n @if (logo()) {\r\n <img [src]=\"logo()\" alt=\"Logo\" class=\"mx-auto h-12 w-auto\" />\r\n } @else if (icon()) {\r\n <div class=\"mx-auto h-12 w-12 flex items-center justify-center rounded-full bg-sky-100 text-sky-600\">\r\n <!-- Fallback icon or remove nz-icon -->\r\n <span class=\"text-2xl font-bold\">C</span>\r\n </div>\r\n }\r\n <h2 class=\"mt-6 text-3xl font-extrabold text-cerca-navy\">\r\n {{ title() }}\r\n @if (titleAccent()) {\r\n <span class=\"accent-text\">{{ titleAccent() }}</span>\r\n }\r\n </h2>\r\n <p class=\"mt-2 text-sm text-slate-600 uppercase tracking-wide\">{{ subtitle() }}</p>\r\n </div>\r\n\r\n @if (errorMessage()) {\r\n <div class=\"bg-red-50 border-l-4 border-red-500 p-4 mb-4 rounded-md\">\r\n <div class=\"flex\">\r\n <div class=\"ml-3\">\r\n <p class=\"text-sm text-red-700\">{{ errorMessage() }}</p>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <form [formGroup]=\"loginForm\" class=\"mt-8 space-y-6\" (ngSubmit)=\"submitForm()\">\r\n <div class=\"space-y-4\">\r\n <div class=\"form-group\">\r\n <ad-input formControlName=\"email\" placeholder=\"correo@ejemplo.com\" label=\"Correo Electr\u00F3nico\"\r\n type=\"email\" prefix=\"user\" [error]=\"fieldInvalid('email')\">\r\n </ad-input>\r\n @if (fieldInvalid('email')) {\r\n <p class=\"mt-1 text-sm text-red-600\">\r\n @if (loginForm.get('email')?.hasError('required')) { El campo es requerido }\r\n @else { Ingrese un correo v\u00E1lido }\r\n </p>\r\n }\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <ad-input formControlName=\"password\" placeholder=\"********\" label=\"Contrase\u00F1a\" type=\"password\"\r\n prefix=\"lock\" [error]=\"fieldInvalid('password')\">\r\n </ad-input>\r\n @if (fieldInvalid('password')) {\r\n <p class=\"mt-1 text-sm text-red-600\">\r\n La contrase\u00F1a es requerida\r\n </p>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex items-center justify-between\">\r\n <div class=\"flex items-center\">\r\n <input id=\"remember-me\" formControlName=\"remember\" type=\"checkbox\"\r\n class=\"h-4 w-4 rounded border-slate-300 text-sky-600 focus:ring-sky-600\">\r\n <label for=\"remember-me\" class=\"ml-2 block text-sm text-slate-900\">Recordarme</label>\r\n </div>\r\n\r\n @if (recoverPasswordUrl()) {\r\n <a [href]=\"recoverPasswordUrl()\" class=\"text-sm font-medium text-sky-600 hover:text-sky-500\">\r\n {{ forgotPasswordLabel() }}\r\n </a>\r\n } @else {\r\n <a class=\"text-sm font-medium text-sky-600 hover:text-sky-500 cursor-pointer\"\r\n (click)=\"forgotPasswordClick.emit()\">\r\n {{ forgotPasswordLabel() }}\r\n </a>\r\n }\r\n </div>\r\n\r\n <div>\r\n <div>\r\n <ad-button [loading]=\"loading()\" variant=\"primary\" type=\"submit\" [block]=\"true\"\r\n class=\"w-full justify-center\" [disabled]=\"loginForm.invalid || loading()\">\r\n Iniciar Sesi\u00F3n\r\n </ad-button>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <div class=\"mt-6 text-center text-xs text-slate-400\">\r\n <p>\u00BFNecesitas ayuda? Contacta a <a [href]=\"'mailto:' + supportEmail()\"\r\n class=\"hover:text-sky-600 transition-colors\">{{ supportEmail() }}</a></p>\r\n </div>\r\n </div>\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: AdInputComponent, selector: "ad-input", inputs: ["type", "placeholder", "label", "error", "rows", "disabled", "size", "prefix", "suffix", "mask"] }, { kind: "component", type: AdButtonComponent, selector: "ad-button", inputs: ["variant", "type", "disabled", "loading", "icon", "size", "block"] }] });
2047
2183
  }
2048
2184
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdLoginComponent, decorators: [{
2049
2185
  type: Component,
@@ -2861,5 +2997,5 @@ const ListPageTemplateResourceSchema = z.object({
2861
2997
  * Generated bundle index. Do not edit.
2862
2998
  */
2863
2999
 
2864
- export { AdAdminLayoutComponent, AdAuthLayoutComponent, AdBadgeComponent, AdButtonComponent, AdCardComponent, AdDashboardTemplateComponent, AdDataTableComponent, AdDescriptionHeaderComponent, AdDocViewerComponent, AdDocumentationWrapperComponent, AdFormFieldComponent, AdFormLayoutComponent, AdFormPageTemplateComponent, AdFormSectionComponent, AdHeaderComponent, AdIconComponent, AdInputComponent, AdLabelComponent, AdListPageTemplateComponent, AdLoadingComponent, AdLoginComponent, AdModalComponent, AdModalService, AdModalTriggerComponent, AdModalWrapperComponent, AdSearchBarComponent, AdSelectComponent, AdSidebarComponent, AdStatCardComponent, AdSwitchComponent, AdTableColumnSchema, AdTableComponent, AdminLayoutResourceSchema, AdminSectionCardActionSchema, AdminSectionCardComponent, AdminSectionCardResourceSchema, AuthLayoutResourceSchema, CardResourceSchema, ComponentApiInputSchema, ComponentApiOutputSchema, ComponentVariantSchema, DashboardTemplateResourceSchema, DataTableColumnSchema, DataTableResourceSchema, DescriptionHeaderButtonSchema, DescriptionHeaderResourceSchema, DesignSystem, DocStatusSchema, DocViewerResourceSchema, DocumentationWrapperResourceSchema, FieldRendererRegistry, FormEngineComponent, FormEngineService, FormFieldResourceSchema, FormLayoutResourceSchema, FormPageTemplateResourceSchema, FormSectionResourceSchema, HeaderResourceSchema, ListPageTemplateResourceSchema, LoginResourceSchema, ModalResourceSchema, ModalTriggerResourceSchema, NavItemSchema, STAT_CARD_COLOR_MAP, SearchBarResourceSchema, SidebarResourceSchema, StatCardColorSchema, StatCardResourceSchema, TableEngineComponent, TableResourceSchema, UserSchema, ValidatorRegistry };
3000
+ export { AdAdminLayoutComponent, AdAuthLayoutComponent, AdBadgeComponent, AdButtonComponent, AdCardComponent, AdDashboardTemplateComponent, AdDataTableComponent, AdDescriptionHeaderComponent, AdDocViewerComponent, AdDocumentationWrapperComponent, AdFormEngineComponent, AdFormFieldComponent, AdFormLayoutComponent, AdFormPageTemplateComponent, AdFormSectionComponent, AdHeaderComponent, AdIconComponent, AdInputComponent, AdLabelComponent, AdListPageTemplateComponent, AdLoadingComponent, AdLoginComponent, AdModalComponent, AdModalService, AdModalTriggerComponent, AdModalWrapperComponent, AdSearchBarComponent, AdSelectComponent, AdSidebarComponent, AdStatCardComponent, AdSwitchComponent, AdTableColumnSchema, AdTableComponent, AdminLayoutResourceSchema, AdminSectionCardActionSchema, AdminSectionCardComponent, AdminSectionCardResourceSchema, AuthLayoutResourceSchema, CardResourceSchema, ComponentApiInputSchema, ComponentApiOutputSchema, ComponentVariantSchema, DashboardTemplateResourceSchema, DataTableColumnSchema, DataTableResourceSchema, DescriptionHeaderButtonSchema, DescriptionHeaderResourceSchema, DesignSystem, DocStatusSchema, DocViewerResourceSchema, DocumentationWrapperResourceSchema, FieldRendererRegistry, FormEngineService, FormFieldResourceSchema, FormLayoutResourceSchema, FormPageTemplateResourceSchema, FormSectionResourceSchema, HeaderResourceSchema, ListPageTemplateResourceSchema, LoginResourceSchema, ModalResourceSchema, ModalTriggerResourceSchema, NavItemSchema, STAT_CARD_COLOR_MAP, SearchBarResourceSchema, SidebarResourceSchema, StatCardColorSchema, StatCardResourceSchema, TableEngineComponent, TableResourceSchema, UserSchema, ValidatorRegistry };
2865
3001
  //# sourceMappingURL=cerca-design-system.mjs.map