b2b-tools 0.1.2 → 0.1.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.
@@ -1,1083 +1,1194 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, output, ChangeDetectionStrategy, Component, inject, computed, signal, effect, Directive, contentChildren, HostListener } from '@angular/core';
3
- import { CommonModule, NgTemplateOutlet } from '@angular/common';
2
+ import { input, Directive, output, computed, Component, contentChildren, signal, effect, HostListener, ChangeDetectionStrategy, inject, Input } from '@angular/core';
3
+ import { NgTemplateOutlet, CommonModule } from '@angular/common';
4
4
  import { DomSanitizer } from '@angular/platform-browser';
5
5
 
6
- class TableModalImageComponent {
7
- open = input(false, ...(ngDevMode ? [{ debugName: "open" }] : []));
8
- src = input('', ...(ngDevMode ? [{ debugName: "src" }] : []));
9
- alt = input('', ...(ngDevMode ? [{ debugName: "alt" }] : []));
6
+ class AdvancedCardTemplateDirective {
7
+ templateRef;
8
+ templateId = input.required({ ...(ngDevMode ? { debugName: "templateId" } : {}), alias: 'advancedCardTemplate' });
9
+ constructor(templateRef) {
10
+ this.templateRef = templateRef;
11
+ }
12
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCardTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
13
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.4", type: AdvancedCardTemplateDirective, isStandalone: true, selector: "[advancedCardTemplate]", inputs: { templateId: { classPropertyName: "templateId", publicName: "advancedCardTemplate", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
14
+ }
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCardTemplateDirective, decorators: [{
16
+ type: Directive,
17
+ args: [{
18
+ selector: '[advancedCardTemplate]',
19
+ standalone: true,
20
+ }]
21
+ }], ctorParameters: () => [{ type: i0.TemplateRef }], propDecorators: { templateId: [{ type: i0.Input, args: [{ isSignal: true, alias: "advancedCardTemplate", required: true }] }] } });
22
+
23
+ class CardCompactComponent {
24
+ configuration = input.required(...(ngDevMode ? [{ debugName: "configuration" }] : []));
25
+ expanded = input.required(...(ngDevMode ? [{ debugName: "expanded" }] : []));
26
+ badgeClass = input.required(...(ngDevMode ? [{ debugName: "badgeClass" }] : []));
27
+ expand = output();
28
+ hasHighlights = computed(() => (this.configuration().highlights?.length ?? 0) > 0, ...(ngDevMode ? [{ debugName: "hasHighlights" }] : []));
29
+ onExpand() {
30
+ this.expand.emit();
31
+ }
32
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardCompactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
33
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: CardCompactComponent, isStandalone: true, selector: "lib-card-compact", inputs: { configuration: { classPropertyName: "configuration", publicName: "configuration", isSignal: true, isRequired: true, transformFunction: null }, expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: true, transformFunction: null }, badgeClass: { classPropertyName: "badgeClass", publicName: "badgeClass", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { expand: "expand" }, ngImport: i0, template: "@let config = configuration();\r\n\r\n<section\r\n class=\"ac ac--compact\"\r\n [class.ac--hidden]=\"expanded()\"\r\n tabindex=\"0\"\r\n role=\"button\"\r\n (click)=\"onExpand()\"\r\n (keydown.enter)=\"onExpand()\"\r\n>\r\n <header class=\"ac__header\">\r\n <div class=\"ac__title-wrap\">\r\n <h3 class=\"ac__title\">{{ config.title }}</h3>\r\n\r\n @if (config.subtitle) {\r\n <p class=\"ac__subtitle\">{{ config.subtitle }}</p>\r\n }\r\n </div>\r\n\r\n @if (config.badge) {\r\n <span [class]=\"badgeClass()(config.badge.tone)\">\r\n {{ config.badge.label }}\r\n </span>\r\n }\r\n </header>\r\n\r\n @if (hasHighlights()) {\r\n @let highlightList = config.highlights;\r\n\r\n <div class=\"ac__highlights\">\r\n @for (highlight of highlightList; track highlight.label) {\r\n <div class=\"ac__hl\">\r\n <div class=\"ac__hl-value\">{{ highlight.value }}</div>\r\n <div class=\"ac__hl-label\">\r\n {{ highlight.label }}\r\n @if (highlight.hint) {\r\n <span class=\"ac__hl-hint\">\u00B7 {{ highlight.hint }}</span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <footer class=\"ac__footer\">\r\n <button type=\"button\" class=\"btn btn--primary\" (click)=\"onExpand(); $event.stopPropagation()\">\r\n {{ config.primaryCta?.label ?? 'Ver detalle' }}\r\n <span class=\"btn__chev\">\u203A</span>\r\n </button>\r\n </footer>\r\n</section>\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] });
34
+ }
35
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardCompactComponent, decorators: [{
36
+ type: Component,
37
+ args: [{ selector: 'lib-card-compact', imports: [], template: "@let config = configuration();\r\n\r\n<section\r\n class=\"ac ac--compact\"\r\n [class.ac--hidden]=\"expanded()\"\r\n tabindex=\"0\"\r\n role=\"button\"\r\n (click)=\"onExpand()\"\r\n (keydown.enter)=\"onExpand()\"\r\n>\r\n <header class=\"ac__header\">\r\n <div class=\"ac__title-wrap\">\r\n <h3 class=\"ac__title\">{{ config.title }}</h3>\r\n\r\n @if (config.subtitle) {\r\n <p class=\"ac__subtitle\">{{ config.subtitle }}</p>\r\n }\r\n </div>\r\n\r\n @if (config.badge) {\r\n <span [class]=\"badgeClass()(config.badge.tone)\">\r\n {{ config.badge.label }}\r\n </span>\r\n }\r\n </header>\r\n\r\n @if (hasHighlights()) {\r\n @let highlightList = config.highlights;\r\n\r\n <div class=\"ac__highlights\">\r\n @for (highlight of highlightList; track highlight.label) {\r\n <div class=\"ac__hl\">\r\n <div class=\"ac__hl-value\">{{ highlight.value }}</div>\r\n <div class=\"ac__hl-label\">\r\n {{ highlight.label }}\r\n @if (highlight.hint) {\r\n <span class=\"ac__hl-hint\">\u00B7 {{ highlight.hint }}</span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <footer class=\"ac__footer\">\r\n <button type=\"button\" class=\"btn btn--primary\" (click)=\"onExpand(); $event.stopPropagation()\">\r\n {{ config.primaryCta?.label ?? 'Ver detalle' }}\r\n <span class=\"btn__chev\">\u203A</span>\r\n </button>\r\n </footer>\r\n</section>\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
38
+ }], propDecorators: { configuration: [{ type: i0.Input, args: [{ isSignal: true, alias: "configuration", required: true }] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: true }] }], badgeClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeClass", required: true }] }], expand: [{ type: i0.Output, args: ["expand"] }] } });
39
+
40
+ class CardHeaderComponent {
41
+ variant = input('inline', ...(ngDevMode ? [{ debugName: "variant" }] : []));
42
+ title = input.required(...(ngDevMode ? [{ debugName: "title" }] : []));
43
+ badge = input(undefined, ...(ngDevMode ? [{ debugName: "badge" }] : []));
44
+ actions = input(undefined, ...(ngDevMode ? [{ debugName: "actions" }] : []));
45
+ sticky = input(false, ...(ngDevMode ? [{ debugName: "sticky" }] : []));
46
+ badgeClass = input.required(...(ngDevMode ? [{ debugName: "badgeClass" }] : []));
47
+ actionClick = output();
10
48
  close = output();
49
+ onAction(advancedAction) {
50
+ if (advancedAction.disabled)
51
+ return;
52
+ this.actionClick.emit(advancedAction);
53
+ }
11
54
  onClose() {
12
55
  this.close.emit();
13
56
  }
14
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: TableModalImageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
15
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: TableModalImageComponent, isStandalone: true, selector: "table-modal-image", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: false, transformFunction: null }, alt: { classPropertyName: "alt", publicName: "alt", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { close: "close" }, ngImport: i0, template: "@if (open()) {\r\n <div class=\"dt-modal-backdrop\" (click)=\"onClose()\">\r\n <div class=\"dt-modal\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"dt-modal-header\">\r\n <span class=\"dt-modal-title\">{{ alt() }}</span>\r\n <button type=\"button\" class=\"dt-btn\" (click)=\"onClose()\">Cerrar</button>\r\n </div>\r\n\r\n <div class=\"dt-modal-body\">\r\n <img class=\"dt-modal-img\" [src]=\"src()\" [alt]=\"alt()\" />\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n", styles: [".dt-modal-backdrop{position:fixed;inset:0;background:#0000008c;display:flex;justify-content:center;align-items:center;padding:18px;z-index:9999}.dt-modal{width:min(900px,95vw);max-height:90vh;background:var(--white);border-radius:var(--radius-md);border:var(--border);overflow:hidden;display:flex;flex-direction:column}.dt-modal-header{padding:12px;border-bottom:var(--border);display:flex;justify-content:space-between;align-items:center;background:var(--gray-white)}.dt-modal-title{font-weight:600;color:var(--black);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dt-modal-body{padding:12px;overflow:auto}.dt-modal-img{width:100%;height:auto;border-radius:var(--radius-sm)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
57
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
58
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: CardHeaderComponent, isStandalone: true, selector: "ac-card-header", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, badge: { classPropertyName: "badge", publicName: "badge", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, sticky: { classPropertyName: "sticky", publicName: "sticky", isSignal: true, isRequired: false, transformFunction: null }, badgeClass: { classPropertyName: "badgeClass", publicName: "badgeClass", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { actionClick: "actionClick", close: "close" }, ngImport: i0, template: "<header\r\n [class.acx__header]=\"variant() === 'inline'\"\r\n [class.acx__header--sticky]=\"variant() === 'inline' && sticky()\"\r\n [class.panel__header]=\"variant() === 'panel'\"\r\n>\r\n <div [class.acx__title]=\"variant() === 'inline'\" [class.panel__title]=\"variant() === 'panel'\">\r\n <h3\r\n [class.acx__title-text]=\"variant() === 'inline'\"\r\n [class.panel__title-text]=\"variant() === 'panel'\"\r\n >\r\n {{ title() }}\r\n </h3>\r\n\r\n @if (badge()) {\r\n <span [class]=\"badgeClass()(badge()?.tone)\">\r\n {{ badge()?.label }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <div [class.acx__actions]=\"variant() === 'inline'\" [class.panel__actions]=\"variant() === 'panel'\">\r\n @let headerActions = actions();\r\n @if (headerActions?.length) {\r\n @for (headerAction of headerActions; track headerAction.id) {\r\n <button\r\n type=\"button\"\r\n class=\"btn\"\r\n [class.btn--primary]=\"headerAction.tone === 'primary'\"\r\n [class.btn--danger]=\"headerAction.tone === 'danger'\"\r\n [class.btn--secondary]=\"!headerAction.tone || headerAction.tone === 'secondary'\"\r\n [disabled]=\"headerAction.disabled\"\r\n (click)=\"onAction(headerAction)\"\r\n >\r\n {{ headerAction.label }}\r\n </button>\r\n }\r\n }\r\n\r\n <button type=\"button\" class=\"icon-btn\" (click)=\"onClose()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <rect width=\"24\" height=\"24\" fill=\"none\" />\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M6.4 19L5 17.6l5.6-5.6L5 6.4L6.4 5l5.6 5.6L17.6 5L19 6.4L13.4 12l5.6 5.6l-1.4 1.4l-5.6-5.6z\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n</header>\r\n", styles: [":host{display:block}.panel__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] });
16
59
  }
17
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: TableModalImageComponent, decorators: [{
60
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardHeaderComponent, decorators: [{
18
61
  type: Component,
19
- args: [{ selector: 'table-modal-image', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (open()) {\r\n <div class=\"dt-modal-backdrop\" (click)=\"onClose()\">\r\n <div class=\"dt-modal\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"dt-modal-header\">\r\n <span class=\"dt-modal-title\">{{ alt() }}</span>\r\n <button type=\"button\" class=\"dt-btn\" (click)=\"onClose()\">Cerrar</button>\r\n </div>\r\n\r\n <div class=\"dt-modal-body\">\r\n <img class=\"dt-modal-img\" [src]=\"src()\" [alt]=\"alt()\" />\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n", styles: [".dt-modal-backdrop{position:fixed;inset:0;background:#0000008c;display:flex;justify-content:center;align-items:center;padding:18px;z-index:9999}.dt-modal{width:min(900px,95vw);max-height:90vh;background:var(--white);border-radius:var(--radius-md);border:var(--border);overflow:hidden;display:flex;flex-direction:column}.dt-modal-header{padding:12px;border-bottom:var(--border);display:flex;justify-content:space-between;align-items:center;background:var(--gray-white)}.dt-modal-title{font-weight:600;color:var(--black);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dt-modal-body{padding:12px;overflow:auto}.dt-modal-img{width:100%;height:auto;border-radius:var(--radius-sm)}\n"] }]
20
- }], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], src: [{ type: i0.Input, args: [{ isSignal: true, alias: "src", required: false }] }], alt: [{ type: i0.Input, args: [{ isSignal: true, alias: "alt", required: false }] }], close: [{ type: i0.Output, args: ["close"] }] } });
62
+ args: [{ selector: 'ac-card-header', imports: [], template: "<header\r\n [class.acx__header]=\"variant() === 'inline'\"\r\n [class.acx__header--sticky]=\"variant() === 'inline' && sticky()\"\r\n [class.panel__header]=\"variant() === 'panel'\"\r\n>\r\n <div [class.acx__title]=\"variant() === 'inline'\" [class.panel__title]=\"variant() === 'panel'\">\r\n <h3\r\n [class.acx__title-text]=\"variant() === 'inline'\"\r\n [class.panel__title-text]=\"variant() === 'panel'\"\r\n >\r\n {{ title() }}\r\n </h3>\r\n\r\n @if (badge()) {\r\n <span [class]=\"badgeClass()(badge()?.tone)\">\r\n {{ badge()?.label }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <div [class.acx__actions]=\"variant() === 'inline'\" [class.panel__actions]=\"variant() === 'panel'\">\r\n @let headerActions = actions();\r\n @if (headerActions?.length) {\r\n @for (headerAction of headerActions; track headerAction.id) {\r\n <button\r\n type=\"button\"\r\n class=\"btn\"\r\n [class.btn--primary]=\"headerAction.tone === 'primary'\"\r\n [class.btn--danger]=\"headerAction.tone === 'danger'\"\r\n [class.btn--secondary]=\"!headerAction.tone || headerAction.tone === 'secondary'\"\r\n [disabled]=\"headerAction.disabled\"\r\n (click)=\"onAction(headerAction)\"\r\n >\r\n {{ headerAction.label }}\r\n </button>\r\n }\r\n }\r\n\r\n <button type=\"button\" class=\"icon-btn\" (click)=\"onClose()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <rect width=\"24\" height=\"24\" fill=\"none\" />\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M6.4 19L5 17.6l5.6-5.6L5 6.4L6.4 5l5.6 5.6L17.6 5L19 6.4L13.4 12l5.6 5.6l-1.4 1.4l-5.6-5.6z\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n</header>\r\n", styles: [":host{display:block}.panel__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
63
+ }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], badge: [{ type: i0.Input, args: [{ isSignal: true, alias: "badge", required: false }] }], actions: [{ type: i0.Input, args: [{ isSignal: true, alias: "actions", required: false }] }], sticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "sticky", required: false }] }], badgeClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeClass", required: true }] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }], close: [{ type: i0.Output, args: ["close"] }] } });
21
64
 
22
- const SVG_ICONS = {
23
- edit: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5 21q-.825 0-1.412-.587T3 19V5q0-.825.588-1.412T5 3h8.925l-2 2H5v14h14v-6.95l2-2V19q0 .825-.587 1.413T19 21zm4-6v-4.25l9.175-9.175q.3-.3.675-.45t.75-.15q.4 0 .763.15t.662.45L22.425 3q.275.3.425.663T23 4.4t-.137.738t-.438.662L13.25 15zM21.025 4.4l-1.4-1.4zM11 13h1.4l5.8-5.8l-.7-.7l-.725-.7L11 11.575zm6.5-6.5l-.725-.7zl.7.7z"/></svg>',
24
- delete: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M7 21q-.825 0-1.412-.587T5 19V6H4V4h5V3h6v1h5v2h-1v13q0 .825-.587 1.413T17 21zM17 6H7v13h10zM9 17h2V8H9zm4 0h2V8h-2zM7 6v13z"/></svg>',
25
- open: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14 14"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"><path d="M7 3.625c-4.187 0-5.945 3.766-5.945 3.844S2.813 11.312 7 11.312s5.945-3.765 5.945-3.843S11.187 3.625 7 3.625M2.169 5.813L.61 4.252m4.525-.354L4.5 1.843m7.331 3.97l1.559-1.56m-4.525-.355L9.5 1.843"/><path d="M5.306 7.081a1.738 1.738 0 1 0 3.388.776a1.738 1.738 0 1 0-3.388-.776"/></g></svg>',
26
- copy: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M9 18q-.825 0-1.412-.587T7 16V4q0-.825.588-1.412T9 2h9q.825 0 1.413.588T20 4v12q0 .825-.587 1.413T18 18zm-4 4q-.825 0-1.412-.587T3 20V6h2v14h11v2z"/></svg>'
27
- };
65
+ class CardSummaryComponent {
66
+ blocks = input(undefined, ...(ngDevMode ? [{ debugName: "blocks" }] : []));
67
+ hasBlocks = computed(() => (this.blocks()?.length ?? 0) > 0, ...(ngDevMode ? [{ debugName: "hasBlocks" }] : []));
68
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardSummaryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
69
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: CardSummaryComponent, isStandalone: true, selector: "ac-card-summary", inputs: { blocks: { classPropertyName: "blocks", publicName: "blocks", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (hasBlocks()) {\r\n @let list = blocks();\r\n\r\n <div class=\"acx__summary\">\r\n @for (block of list; track block.title) {\r\n <div class=\"block\">\r\n <div class=\"block__title\">{{ block.title }}</div>\r\n\r\n @for (row of block.rows; track row.label) {\r\n <div class=\"block__row\">\r\n <span class=\"block__label\">{{ row.label }}</span>\r\n <span class=\"block__value\">{{ row.value }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n}\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] });
70
+ }
71
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardSummaryComponent, decorators: [{
72
+ type: Component,
73
+ args: [{ selector: 'ac-card-summary', imports: [], template: "@if (hasBlocks()) {\r\n @let list = blocks();\r\n\r\n <div class=\"acx__summary\">\r\n @for (block of list; track block.title) {\r\n <div class=\"block\">\r\n <div class=\"block__title\">{{ block.title }}</div>\r\n\r\n @for (row of block.rows; track row.label) {\r\n <div class=\"block__row\">\r\n <span class=\"block__label\">{{ row.label }}</span>\r\n <span class=\"block__value\">{{ row.value }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n}\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
74
+ }], propDecorators: { blocks: [{ type: i0.Input, args: [{ isSignal: true, alias: "blocks", required: false }] }] } });
28
75
 
29
- const TIME_ZONES = {
30
- // AFRICA
31
- CAIRO: { city: 'Cairo', timeZone: 'Africa/Cairo', name: 'Egypt', currency: 'EGP', locale: 'ar-EG', utcOffset: +2 },
32
- CASABLANCA: { city: 'Casablanca', timeZone: 'Africa/Casablanca', name: 'Morocco', currency: 'MAD', locale: 'ar-MA', utcOffset: 0 },
33
- JOHANNESBURG: { city: 'Johannesburg', timeZone: 'Africa/Johannesburg', name: 'South Africa', currency: 'ZAR', locale: 'en-ZA', utcOffset: +2 },
34
- // AMERICA
35
- BUENOS_AIRES: { city: 'Buenos Aires', timeZone: 'America/Argentina/Buenos_Aires', name: 'Argentina', currency: 'ARS', locale: 'es-AR', utcOffset: -3 },
36
- SAO_PAULO: { city: 'Sao Paulo', timeZone: 'America/Sao_Paulo', name: 'Brazil', currency: 'BRL', locale: 'pt-BR', utcOffset: -3 },
37
- TORONTO: { city: 'Toronto', timeZone: 'America/Toronto', name: 'Canada', currency: 'CAD', locale: 'en-CA', utcOffset: -5 },
38
- VANCOUVER: { city: 'Vancouver', timeZone: 'America/Vancouver', name: 'Canada (Pacific)', currency: 'CAD', locale: 'en-CA', utcOffset: -8 },
39
- BOGOTA: { city: 'Bogota', timeZone: 'America/Bogota', name: 'Colombia', currency: 'COP', locale: 'es-CO', utcOffset: -5 },
40
- CANCUN: { city: 'Cancun', timeZone: 'America/Cancun', name: 'Mexico (Quintana Roo)', currency: 'MXN', locale: 'es-MX', utcOffset: -5 },
41
- MEXICO_CITY: { city: 'Mexico City', timeZone: 'America/Mexico_City', name: 'Mexico', currency: 'MXN', locale: 'es-MX', utcOffset: -6 },
42
- TIJUANA: { city: 'Tijuana', timeZone: 'America/Tijuana', name: 'Mexico (Pacific)', currency: 'MXN', locale: 'es-MX', utcOffset: -8 },
43
- LIMA: { city: 'Lima', timeZone: 'America/Lima', name: 'Peru', currency: 'PEN', locale: 'es-PE', utcOffset: -5 },
44
- SANTIAGO: { city: 'Santiago', timeZone: 'America/Santiago', name: 'Chile', currency: 'CLP', locale: 'es-CL', utcOffset: -4 },
45
- CHICAGO: { city: 'Chicago', timeZone: 'America/Chicago', name: 'United States (Central)', currency: 'USD', locale: 'en-US', utcOffset: -6 },
46
- DENVER: { city: 'Denver', timeZone: 'America/Denver', name: 'United States (Mountain)', currency: 'USD', locale: 'en-US', utcOffset: -7 },
47
- LOS_ANGELES: { city: 'Los Angeles', timeZone: 'America/Los_Angeles', name: 'United States (Pacific)', currency: 'USD', locale: 'en-US', utcOffset: -8 },
48
- NEW_YORK: { city: 'New York', timeZone: 'America/New_York', name: 'United States (Eastern)', currency: 'USD', locale: 'en-US', utcOffset: -5 },
49
- // ASIA
50
- SHANGHAI: { city: 'Shanghai', timeZone: 'Asia/Shanghai', name: 'China', currency: 'CNY', locale: 'zh-CN', utcOffset: +8 },
51
- KOLKATA: { city: 'Kolkata', timeZone: 'Asia/Kolkata', name: 'India', currency: 'INR', locale: 'en-IN', utcOffset: +5.5 },
52
- TOKYO: { city: 'Tokyo', timeZone: 'Asia/Tokyo', name: 'Japan', currency: 'JPY', locale: 'ja-JP', utcOffset: +9 },
53
- SEOUL: { city: 'Seoul', timeZone: 'Asia/Seoul', name: 'South Korea', currency: 'KRW', locale: 'ko-KR', utcOffset: +9 },
54
- DUBAI: { city: 'Dubai', timeZone: 'Asia/Dubai', name: 'United Arab Emirates', currency: 'AED', locale: 'ar-AE', utcOffset: +4 },
55
- // EUROPE
56
- BERLIN: { city: 'Berlin', timeZone: 'Europe/Berlin', name: 'Germany', currency: 'EUR', locale: 'de-DE', utcOffset: +1 },
57
- PARIS: { city: 'Paris', timeZone: 'Europe/Paris', name: 'France', currency: 'EUR', locale: 'fr-FR', utcOffset: +1 },
58
- ROME: { city: 'Rome', timeZone: 'Europe/Rome', name: 'Italy', currency: 'EUR', locale: 'it-IT', utcOffset: +1 },
59
- MADRID: { city: 'Madrid', timeZone: 'Europe/Madrid', name: 'Spain', currency: 'EUR', locale: 'es-ES', utcOffset: +1 },
60
- ZURICH: { city: 'Zurich', timeZone: 'Europe/Zurich', name: 'Switzerland', currency: 'CHF', locale: 'de-CH', utcOffset: +1 },
61
- LONDON: { city: 'London', timeZone: 'Europe/London', name: 'United Kingdom', currency: 'GBP', locale: 'en-GB', utcOffset: 0 },
62
- // OCEANIA
63
- SYDNEY: { city: 'Sydney', timeZone: 'Australia/Sydney', name: 'Australia', currency: 'AUD', locale: 'en-AU', utcOffset: +10 },
64
- AUCKLAND: { city: 'Auckland', timeZone: 'Pacific/Auckland', name: 'New Zealand', currency: 'NZD', locale: 'en-NZ', utcOffset: +12 },
65
- };
76
+ class CardTabContentComponent {
77
+ activeTab = input.required(...(ngDevMode ? [{ debugName: "activeTab" }] : []));
78
+ cardId = input.required(...(ngDevMode ? [{ debugName: "cardId" }] : []));
79
+ /**
80
+ * Función que resuelve el TemplateRef para el tab actual.
81
+ * (La lógica real sigue en el root: getActiveTemplate())
82
+ */
83
+ templateRef = input(null, ...(ngDevMode ? [{ debugName: "templateRef" }] : []));
84
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardTabContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
85
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: CardTabContentComponent, isStandalone: true, selector: "ac-card-tab-content", inputs: { activeTab: { classPropertyName: "activeTab", publicName: "activeTab", isSignal: true, isRequired: true, transformFunction: null }, cardId: { classPropertyName: "cardId", publicName: "cardId", isSignal: true, isRequired: true, transformFunction: null }, templateRef: { classPropertyName: "templateRef", publicName: "templateRef", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@let tab = activeTab();\r\n@let template = templateRef();\r\n\r\n<div class=\"tabs__content\">\r\n @if (tab) {\r\n @switch (tab.kind) {\r\n @case ('text') {\r\n <div class=\"tab-text\">\r\n {{ tab.text ?? '' }}\r\n </div>\r\n }\r\n\r\n @case ('empty') {\r\n <div class=\"empty\">Sin contenido.</div>\r\n }\r\n\r\n @case ('template') {\r\n @if (template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n cardId: cardId(),\r\n tabId: tab.id,\r\n }\"\r\n />\r\n } @else {\r\n <div class=\"empty\">Template no encontrado para \"{{ tab.templateId }}\"</div>\r\n }\r\n }\r\n }\r\n } @else {\r\n <div class=\"empty\">Sin tabs configurados.</div>\r\n }\r\n</div>\r\n", styles: ["", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
86
+ }
87
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardTabContentComponent, decorators: [{
88
+ type: Component,
89
+ args: [{ selector: 'ac-card-tab-content', imports: [NgTemplateOutlet], template: "@let tab = activeTab();\r\n@let template = templateRef();\r\n\r\n<div class=\"tabs__content\">\r\n @if (tab) {\r\n @switch (tab.kind) {\r\n @case ('text') {\r\n <div class=\"tab-text\">\r\n {{ tab.text ?? '' }}\r\n </div>\r\n }\r\n\r\n @case ('empty') {\r\n <div class=\"empty\">Sin contenido.</div>\r\n }\r\n\r\n @case ('template') {\r\n @if (template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n cardId: cardId(),\r\n tabId: tab.id,\r\n }\"\r\n />\r\n } @else {\r\n <div class=\"empty\">Template no encontrado para \"{{ tab.templateId }}\"</div>\r\n }\r\n }\r\n }\r\n } @else {\r\n <div class=\"empty\">Sin tabs configurados.</div>\r\n }\r\n</div>\r\n", styles: [":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
90
+ }], propDecorators: { activeTab: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeTab", required: true }] }], cardId: [{ type: i0.Input, args: [{ isSignal: true, alias: "cardId", required: true }] }], templateRef: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateRef", required: false }] }] } });
66
91
 
67
- class TableGridComponent {
68
- sanitizer = inject(DomSanitizer);
69
- // Inputs
70
- config = input({}, ...(ngDevMode ? [{ debugName: "config" }] : []));
71
- columns = input([], ...(ngDevMode ? [{ debugName: "columns" }] : []));
72
- rows = input([], ...(ngDevMode ? [{ debugName: "rows" }] : []));
73
- gridTemplateColumns = input('', ...(ngDevMode ? [{ debugName: "gridTemplateColumns" }] : []));
74
- columnQueries = input({}, ...(ngDevMode ? [{ debugName: "columnQueries" }] : []));
75
- sortState = input(null, ...(ngDevMode ? [{ debugName: "sortState" }] : []));
76
- selectedIdsSet = input(new Set(), ...(ngDevMode ? [{ debugName: "selectedIdsSet" }] : []));
77
- timeZone = input(TIME_ZONES.MEXICO_CITY, ...(ngDevMode ? [{ debugName: "timeZone" }] : []));
78
- // Outputs
79
- headerSort = output();
80
- columnQueryChange = output();
81
- rowClick = output();
82
- toggleRow = output();
83
- toggleAllOnPage = output();
84
- openImage = output();
85
- actionClick = output();
86
- bodyScroll = output();
87
- // Derived
88
- showSelectionColumn = computed(() => !!this.config().selectable, ...(ngDevMode ? [{ debugName: "showSelectionColumn" }] : []));
89
- // Helpers
90
- getRowIdKey() {
91
- return this.config().rowIdKey ?? 'id';
92
+ class CardTabsBarComponent {
93
+ tabs = input.required(...(ngDevMode ? [{ debugName: "tabs" }] : []));
94
+ activeTabId = input.required(...(ngDevMode ? [{ debugName: "activeTabId" }] : []));
95
+ badgeClass = input.required(...(ngDevMode ? [{ debugName: "badgeClass" }] : []));
96
+ tabSelected = output();
97
+ tabAction = output();
98
+ activeTab = computed(() => {
99
+ const id = this.activeTabId();
100
+ if (!id)
101
+ return null;
102
+ return this.tabs().find((tab) => tab.id === id) ?? null;
103
+ }, ...(ngDevMode ? [{ debugName: "activeTab" }] : []));
104
+ selectTab(id) {
105
+ this.tabSelected.emit(id);
92
106
  }
93
- getRowId(row) {
94
- const getter = this.config().rowIdGetter;
95
- if (getter)
96
- return getter(row);
97
- const key = this.getRowIdKey();
98
- return row?.[key];
107
+ clickAction(advancedTabAction) {
108
+ if (advancedTabAction.disabled)
109
+ return;
110
+ this.tabAction.emit(advancedTabAction);
99
111
  }
100
- isSelected(row) {
101
- return this.selectedIdsSet().has(this.getRowId(row));
112
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardTabsBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
113
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: CardTabsBarComponent, isStandalone: true, selector: "ac-card-tabs-bar", inputs: { tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: true, transformFunction: null }, activeTabId: { classPropertyName: "activeTabId", publicName: "activeTabId", isSignal: true, isRequired: true, transformFunction: null }, badgeClass: { classPropertyName: "badgeClass", publicName: "badgeClass", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { tabSelected: "tabSelected", tabAction: "tabAction" }, ngImport: i0, template: "@let tabList = tabs();\r\n@let currentId = activeTabId();\r\n@let current = activeTab();\r\n\r\n<div class=\"tabs__bar\">\r\n @for (tab of tabList; track tab.id) {\r\n <button\r\n type=\"button\"\r\n class=\"tab\"\r\n [class.tab--active]=\"currentId === tab.id\"\r\n (click)=\"selectTab(tab.id)\"\r\n >\r\n <span>{{ tab.label }}</span>\r\n @if (tab.pill) {\r\n <span class=\"pill\" [class]=\"badgeClass()(tab.pill.tone)\">\r\n {{ tab.pill.label }}\r\n </span>\r\n }\r\n </button>\r\n }\r\n\r\n <div class=\"tabs__spacer\"></div>\r\n\r\n @if (current?.actions?.length) {\r\n <div class=\"tabs__actions\">\r\n @for (actions of current?.actions ?? []; track actions.id) {\r\n <button\r\n type=\"button\"\r\n class=\"btn btn--sm\"\r\n [class.btn--primary]=\"actions.tone === 'primary'\"\r\n [class.btn--danger]=\"actions.tone === 'danger'\"\r\n [class.btn--secondary]=\"!actions.tone || actions.tone === 'secondary'\"\r\n [disabled]=\"actions.disabled\"\r\n (click)=\"clickAction(actions)\"\r\n >\r\n {{ actions.label }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n</div>\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] });
114
+ }
115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardTabsBarComponent, decorators: [{
116
+ type: Component,
117
+ args: [{ selector: 'ac-card-tabs-bar', imports: [], template: "@let tabList = tabs();\r\n@let currentId = activeTabId();\r\n@let current = activeTab();\r\n\r\n<div class=\"tabs__bar\">\r\n @for (tab of tabList; track tab.id) {\r\n <button\r\n type=\"button\"\r\n class=\"tab\"\r\n [class.tab--active]=\"currentId === tab.id\"\r\n (click)=\"selectTab(tab.id)\"\r\n >\r\n <span>{{ tab.label }}</span>\r\n @if (tab.pill) {\r\n <span class=\"pill\" [class]=\"badgeClass()(tab.pill.tone)\">\r\n {{ tab.pill.label }}\r\n </span>\r\n }\r\n </button>\r\n }\r\n\r\n <div class=\"tabs__spacer\"></div>\r\n\r\n @if (current?.actions?.length) {\r\n <div class=\"tabs__actions\">\r\n @for (actions of current?.actions ?? []; track actions.id) {\r\n <button\r\n type=\"button\"\r\n class=\"btn btn--sm\"\r\n [class.btn--primary]=\"actions.tone === 'primary'\"\r\n [class.btn--danger]=\"actions.tone === 'danger'\"\r\n [class.btn--secondary]=\"!actions.tone || actions.tone === 'secondary'\"\r\n [disabled]=\"actions.disabled\"\r\n (click)=\"clickAction(actions)\"\r\n >\r\n {{ actions.label }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n</div>\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
118
+ }], propDecorators: { tabs: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabs", required: true }] }], activeTabId: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeTabId", required: true }] }], badgeClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeClass", required: true }] }], tabSelected: [{ type: i0.Output, args: ["tabSelected"] }], tabAction: [{ type: i0.Output, args: ["tabAction"] }] } });
119
+
120
+ class AdvancedCardContentComponent {
121
+ viewModel = input.required(...(ngDevMode ? [{ debugName: "viewModel" }] : []));
122
+ badgeClass = input.required(...(ngDevMode ? [{ debugName: "badgeClass" }] : []));
123
+ tabSelected = output();
124
+ tabAction = output();
125
+ onSelect(id) {
126
+ this.tabSelected.emit(id);
102
127
  }
103
- isAllSelectedOnPage() {
104
- const rows = this.rows();
105
- if (!rows.length)
106
- return false;
107
- const set = this.selectedIdsSet();
108
- return rows.every((r) => set.has(this.getRowId(r)));
128
+ onAction(a) {
129
+ this.tabAction.emit(a);
109
130
  }
110
- getSortIcon(colKey) {
111
- const sorted = this.sortState();
112
- if (!sorted || sorted.key !== colKey)
113
- return '↕';
114
- return sorted.dir === 'asc' ? '↑' : '↓';
131
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCardContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
132
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: AdvancedCardContentComponent, isStandalone: true, selector: "ac-advanced-card-content", inputs: { viewModel: { classPropertyName: "viewModel", publicName: "viewModel", isSignal: true, isRequired: true, transformFunction: null }, badgeClass: { classPropertyName: "badgeClass", publicName: "badgeClass", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { tabSelected: "tabSelected", tabAction: "tabAction" }, ngImport: i0, template: "@let vm = viewModel();\r\n\r\n<ac-card-summary [blocks]=\"vm.summaryBlocks\" />\r\n\r\n@if (vm.tabs.length) {\r\n <div class=\"tabs\">\r\n <ac-card-tabs-bar\r\n [tabs]=\"vm.tabs\"\r\n [activeTabId]=\"vm.activeTabId\"\r\n [badgeClass]=\"badgeClass()\"\r\n (tabSelected)=\"onSelect($event)\"\r\n (tabAction)=\"onAction($event)\"\r\n />\r\n\r\n <ac-card-tab-content\r\n [activeTab]=\"vm.activeTab\"\r\n [cardId]=\"vm.cardId\"\r\n [templateRef]=\"vm.templateRef\"\r\n />\r\n </div>\r\n} @else {\r\n <div class=\"acx__content\">\r\n <ng-content></ng-content>\r\n </div>\r\n}\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"], dependencies: [{ kind: "component", type: CardSummaryComponent, selector: "ac-card-summary", inputs: ["blocks"] }, { kind: "component", type: CardTabsBarComponent, selector: "ac-card-tabs-bar", inputs: ["tabs", "activeTabId", "badgeClass"], outputs: ["tabSelected", "tabAction"] }, { kind: "component", type: CardTabContentComponent, selector: "ac-card-tab-content", inputs: ["activeTab", "cardId", "templateRef"] }] });
133
+ }
134
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCardContentComponent, decorators: [{
135
+ type: Component,
136
+ args: [{ selector: 'ac-advanced-card-content', imports: [CardSummaryComponent, CardTabsBarComponent, CardTabContentComponent], template: "@let vm = viewModel();\r\n\r\n<ac-card-summary [blocks]=\"vm.summaryBlocks\" />\r\n\r\n@if (vm.tabs.length) {\r\n <div class=\"tabs\">\r\n <ac-card-tabs-bar\r\n [tabs]=\"vm.tabs\"\r\n [activeTabId]=\"vm.activeTabId\"\r\n [badgeClass]=\"badgeClass()\"\r\n (tabSelected)=\"onSelect($event)\"\r\n (tabAction)=\"onAction($event)\"\r\n />\r\n\r\n <ac-card-tab-content\r\n [activeTab]=\"vm.activeTab\"\r\n [cardId]=\"vm.cardId\"\r\n [templateRef]=\"vm.templateRef\"\r\n />\r\n </div>\r\n} @else {\r\n <div class=\"acx__content\">\r\n <ng-content></ng-content>\r\n </div>\r\n}\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
137
+ }], propDecorators: { viewModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewModel", required: true }] }], badgeClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeClass", required: true }] }], tabSelected: [{ type: i0.Output, args: ["tabSelected"] }], tabAction: [{ type: i0.Output, args: ["tabAction"] }] } });
138
+
139
+ class AdvancedCardOverlayComponent {
140
+ config = input.required(...(ngDevMode ? [{ debugName: "config" }] : []));
141
+ mode = input.required(...(ngDevMode ? [{ debugName: "mode" }] : []));
142
+ closeOnBackdrop = input(true, ...(ngDevMode ? [{ debugName: "closeOnBackdrop" }] : []));
143
+ badgeClass = input.required(...(ngDevMode ? [{ debugName: "badgeClass" }] : []));
144
+ viewModel = input.required(...(ngDevMode ? [{ debugName: "viewModel" }] : []));
145
+ actionClick = output();
146
+ close = output();
147
+ tabSelected = output();
148
+ tabAction = output();
149
+ onBackdrop() {
150
+ if (this.closeOnBackdrop())
151
+ this.close.emit();
115
152
  }
116
- getDisplayText(row, column) {
117
- const value = this.getCellValue(row, column);
118
- if (column.formatter) {
119
- try {
120
- return column.formatter(value, row);
121
- }
122
- catch {
123
- return '';
124
- }
125
- }
126
- switch (column.type) {
127
- case 'string':
128
- return value == null ? '' : String(value);
129
- case 'integer':
130
- case 'decimal':
131
- case 'currency': {
132
- const currencyValue = Number(value);
133
- if (!Number.isFinite(currencyValue))
134
- return value == null ? '' : String(value);
135
- if (column.type === 'currency') {
136
- try {
137
- return new Intl.NumberFormat(this.timeZone().locale, {
138
- style: 'currency',
139
- currency: column.options?.currency ?? this.timeZone().currency,
140
- maximumFractionDigits: 2,
141
- }).format(currencyValue);
142
- }
143
- catch {
144
- return String(currencyValue);
145
- }
146
- }
147
- return String(currencyValue);
148
- }
149
- case 'date':
150
- case 'datetime': {
151
- const dateTime = value instanceof Date ? value : new Date(String(value));
152
- if (Number.isNaN(dateTime.getTime()))
153
- return value == null ? '' : String(value);
154
- const locale = this.timeZone().locale;
155
- return column.type === 'datetime'
156
- ? dateTime.toLocaleString(locale)
157
- : dateTime.toLocaleDateString(locale);
158
- }
159
- case 'boolean':
160
- return value ? 'Sí' : 'No';
161
- default:
162
- return value == null ? '' : String(value);
163
- }
164
- }
165
- getImageSrc(row, col) {
166
- return this.getCellString(row, col);
167
- }
168
- getImageAlt(row, col) {
169
- const altFn = col.options?.image?.alt;
170
- return altFn ? altFn(row) : col.label;
171
- }
172
- getStatusClass(row, col) {
173
- const raw = this.getCellString(row, col);
174
- return col.options?.status?.classMap?.[raw] ?? '';
175
- }
176
- getLinkHref(row, col) {
177
- const getter = col.options?.link?.hrefGetter;
178
- return getter ? getter(row) : this.getCellString(row, col);
179
- }
180
- getLinkLabel(row, col) {
181
- const getter = col.options?.link?.labelGetter;
182
- if (getter)
183
- return getter(row);
184
- const cellValue = this.getCellValue(row, col);
185
- return cellValue == null ? '' : String(cellValue);
186
- }
187
- getColumnActions(col) {
188
- return col.actions ?? [];
189
- }
190
- isActionVisible(action, row) {
191
- return action.visible ? action.visible(row) : true;
192
- }
193
- isActionDisabled(action, row) {
194
- return action.disabled ? action.disabled(row) : false;
195
- }
196
- emitAction(action, row, event) {
197
- event.stopPropagation();
198
- this.actionClick.emit({ actionId: action.id, row });
153
+ onAction(a) {
154
+ this.actionClick.emit(a);
199
155
  }
200
- getActionSvg(action) {
201
- const key = (action.icon ?? action.id).toLowerCase();
202
- return this.sanitizer.bypassSecurityTrustHtml(SVG_ICONS[key] ?? '*');
156
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCardOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
157
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.1.4", type: AdvancedCardOverlayComponent, isStandalone: true, selector: "ac-advanced-card-overlay", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: true, transformFunction: null }, closeOnBackdrop: { classPropertyName: "closeOnBackdrop", publicName: "closeOnBackdrop", isSignal: true, isRequired: false, transformFunction: null }, badgeClass: { classPropertyName: "badgeClass", publicName: "badgeClass", isSignal: true, isRequired: true, transformFunction: null }, viewModel: { classPropertyName: "viewModel", publicName: "viewModel", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { actionClick: "actionClick", close: "close", tabSelected: "tabSelected", tabAction: "tabAction" }, ngImport: i0, template: "@let isModal = mode() === 'modal';\r\n\r\n<div class=\"overlay\" [class.modal-center]=\"isModal\" (click)=\"onBackdrop()\">\r\n <section\r\n class=\"panel\"\r\n [class.panel--drawer]=\"!isModal\"\r\n [class.panel--modal]=\"isModal\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <ac-card-header\r\n variant=\"panel\"\r\n [title]=\"config().title\"\r\n [badge]=\"config().badge\"\r\n [actions]=\"config().actions\"\r\n [badgeClass]=\"badgeClass()\"\r\n (actionClick)=\"onAction($event)\"\r\n (close)=\"close.emit()\"\r\n />\r\n\r\n <div class=\"panel__body min-croll\">\r\n <ac-advanced-card-content\r\n [viewModel]=\"viewModel()\"\r\n [badgeClass]=\"badgeClass()\"\r\n (tabSelected)=\"tabSelected.emit($event)\"\r\n (tabAction)=\"tabAction.emit($event)\"\r\n >\r\n <ng-content></ng-content>\r\n </ac-advanced-card-content>\r\n </div>\r\n </section>\r\n</div>\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"], dependencies: [{ kind: "component", type: CardHeaderComponent, selector: "ac-card-header", inputs: ["variant", "title", "badge", "actions", "sticky", "badgeClass"], outputs: ["actionClick", "close"] }, { kind: "component", type: AdvancedCardContentComponent, selector: "ac-advanced-card-content", inputs: ["viewModel", "badgeClass"], outputs: ["tabSelected", "tabAction"] }] });
158
+ }
159
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCardOverlayComponent, decorators: [{
160
+ type: Component,
161
+ args: [{ selector: 'ac-advanced-card-overlay', imports: [CardHeaderComponent, AdvancedCardContentComponent], template: "@let isModal = mode() === 'modal';\r\n\r\n<div class=\"overlay\" [class.modal-center]=\"isModal\" (click)=\"onBackdrop()\">\r\n <section\r\n class=\"panel\"\r\n [class.panel--drawer]=\"!isModal\"\r\n [class.panel--modal]=\"isModal\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <ac-card-header\r\n variant=\"panel\"\r\n [title]=\"config().title\"\r\n [badge]=\"config().badge\"\r\n [actions]=\"config().actions\"\r\n [badgeClass]=\"badgeClass()\"\r\n (actionClick)=\"onAction($event)\"\r\n (close)=\"close.emit()\"\r\n />\r\n\r\n <div class=\"panel__body min-croll\">\r\n <ac-advanced-card-content\r\n [viewModel]=\"viewModel()\"\r\n [badgeClass]=\"badgeClass()\"\r\n (tabSelected)=\"tabSelected.emit($event)\"\r\n (tabAction)=\"tabAction.emit($event)\"\r\n >\r\n <ng-content></ng-content>\r\n </ac-advanced-card-content>\r\n </div>\r\n </section>\r\n</div>\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
162
+ }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: true }] }], closeOnBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnBackdrop", required: false }] }], badgeClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeClass", required: true }] }], viewModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewModel", required: true }] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }], close: [{ type: i0.Output, args: ["close"] }], tabSelected: [{ type: i0.Output, args: ["tabSelected"] }], tabAction: [{ type: i0.Output, args: ["tabAction"] }] } });
163
+
164
+ class AdvancedCardInlineComponent {
165
+ config = input.required(...(ngDevMode ? [{ debugName: "config" }] : []));
166
+ stickyHeader = input(false, ...(ngDevMode ? [{ debugName: "stickyHeader" }] : []));
167
+ fullWidth = input(false, ...(ngDevMode ? [{ debugName: "fullWidth" }] : []));
168
+ badgeClass = input.required(...(ngDevMode ? [{ debugName: "badgeClass" }] : []));
169
+ viewModel = input.required(...(ngDevMode ? [{ debugName: "viewModel" }] : []));
170
+ actionClick = output();
171
+ close = output();
172
+ onAction(a) {
173
+ this.actionClick.emit(a);
203
174
  }
204
- onHeaderClickSort(column) {
205
- if (!column.sortable)
175
+ tabSelected = output();
176
+ tabAction = output();
177
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCardInlineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
178
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.1.4", type: AdvancedCardInlineComponent, isStandalone: true, selector: "ac-advanced-card-inline", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, stickyHeader: { classPropertyName: "stickyHeader", publicName: "stickyHeader", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null }, badgeClass: { classPropertyName: "badgeClass", publicName: "badgeClass", isSignal: true, isRequired: true, transformFunction: null }, viewModel: { classPropertyName: "viewModel", publicName: "viewModel", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { actionClick: "actionClick", close: "close", tabSelected: "tabSelected", tabAction: "tabAction" }, ngImport: i0, template: "<section class=\"ac ac--expanded\" [class.ac--full]=\"fullWidth()\">\r\n <ac-card-header\r\n variant=\"inline\"\r\n [title]=\"config().title\"\r\n [badge]=\"config().badge\"\r\n [actions]=\"config().actions\"\r\n [sticky]=\"stickyHeader()\"\r\n [badgeClass]=\"badgeClass()\"\r\n (actionClick)=\"onAction($event)\"\r\n (close)=\"close.emit()\"\r\n />\r\n\r\n <div class=\"acx__body\">\r\n <ac-advanced-card-content\r\n [viewModel]=\"viewModel()\"\r\n [badgeClass]=\"badgeClass()\"\r\n (tabSelected)=\"tabSelected.emit($event)\"\r\n (tabAction)=\"tabAction.emit($event)\"\r\n >\r\n <ng-content></ng-content>\r\n </ac-advanced-card-content>\r\n </div>\r\n</section>\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"], dependencies: [{ kind: "component", type: AdvancedCardContentComponent, selector: "ac-advanced-card-content", inputs: ["viewModel", "badgeClass"], outputs: ["tabSelected", "tabAction"] }, { kind: "component", type: CardHeaderComponent, selector: "ac-card-header", inputs: ["variant", "title", "badge", "actions", "sticky", "badgeClass"], outputs: ["actionClick", "close"] }] });
179
+ }
180
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCardInlineComponent, decorators: [{
181
+ type: Component,
182
+ args: [{ selector: 'ac-advanced-card-inline', imports: [AdvancedCardContentComponent, CardHeaderComponent], template: "<section class=\"ac ac--expanded\" [class.ac--full]=\"fullWidth()\">\r\n <ac-card-header\r\n variant=\"inline\"\r\n [title]=\"config().title\"\r\n [badge]=\"config().badge\"\r\n [actions]=\"config().actions\"\r\n [sticky]=\"stickyHeader()\"\r\n [badgeClass]=\"badgeClass()\"\r\n (actionClick)=\"onAction($event)\"\r\n (close)=\"close.emit()\"\r\n />\r\n\r\n <div class=\"acx__body\">\r\n <ac-advanced-card-content\r\n [viewModel]=\"viewModel()\"\r\n [badgeClass]=\"badgeClass()\"\r\n (tabSelected)=\"tabSelected.emit($event)\"\r\n (tabAction)=\"tabAction.emit($event)\"\r\n >\r\n <ng-content></ng-content>\r\n </ac-advanced-card-content>\r\n </div>\r\n</section>\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
183
+ }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], stickyHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "stickyHeader", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], badgeClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeClass", required: true }] }], viewModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewModel", required: true }] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }], close: [{ type: i0.Output, args: ["close"] }], tabSelected: [{ type: i0.Output, args: ["tabSelected"] }], tabAction: [{ type: i0.Output, args: ["tabAction"] }] } });
184
+
185
+ class AdvancedCard {
186
+ config = input.required(...(ngDevMode ? [{ debugName: "config" }] : []));
187
+ fullWidthOnExpand = input(true, ...(ngDevMode ? [{ debugName: "fullWidthOnExpand" }] : []));
188
+ stickyHeader = input(true, ...(ngDevMode ? [{ debugName: "stickyHeader" }] : []));
189
+ closeOnEsc = input(true, ...(ngDevMode ? [{ debugName: "closeOnEsc" }] : []));
190
+ // ===== Outputs
191
+ expandedChange = output();
192
+ action = output();
193
+ tabChanged = output();
194
+ tabAction = output();
195
+ // ===== Projected templates (via directive)
196
+ projectedTemplates = contentChildren(AdvancedCardTemplateDirective, { ...(ngDevMode ? { debugName: "projectedTemplates" } : {}), descendants: true });
197
+ // ===== State
198
+ expanded = signal(false, ...(ngDevMode ? [{ debugName: "expanded" }] : []));
199
+ activeTabId = signal(null, ...(ngDevMode ? [{ debugName: "activeTabId" }] : []));
200
+ // ===== Computeds
201
+ cardId = computed(() => this.config().id, ...(ngDevMode ? [{ debugName: "cardId" }] : []));
202
+ expandMode = computed(() => this.config().expandMode ?? 'inline', ...(ngDevMode ? [{ debugName: "expandMode" }] : []));
203
+ closeOnBackdrop = computed(() => this.config().closeOnBackdrop ?? true, ...(ngDevMode ? [{ debugName: "closeOnBackdrop" }] : []));
204
+ isInline = computed(() => this.expandMode() === 'inline', ...(ngDevMode ? [{ debugName: "isInline" }] : []));
205
+ isDrawer = computed(() => this.expandMode() === 'drawer', ...(ngDevMode ? [{ debugName: "isDrawer" }] : []));
206
+ isModal = computed(() => this.expandMode() === 'modal', ...(ngDevMode ? [{ debugName: "isModal" }] : []));
207
+ hasHighlights = computed(() => (this.config().highlights?.length ?? 0) > 0, ...(ngDevMode ? [{ debugName: "hasHighlights" }] : []));
208
+ hasSummaryBlocks = computed(() => (this.config().summaryBlocks?.length ?? 0) > 0, ...(ngDevMode ? [{ debugName: "hasSummaryBlocks" }] : []));
209
+ tabs = computed(() => this.config().tabs ?? [], ...(ngDevMode ? [{ debugName: "tabs" }] : []));
210
+ activeTab = computed(() => {
211
+ const id = this.activeTabId();
212
+ if (!id)
213
+ return null;
214
+ return this.tabs().find((t) => t.id === id) ?? null;
215
+ }, ...(ngDevMode ? [{ debugName: "activeTab" }] : []));
216
+ templateMap = computed(() => {
217
+ const map = new Map();
218
+ for (const dir of this.projectedTemplates()) {
219
+ map.set(dir.templateId(), dir);
220
+ }
221
+ return map;
222
+ }, ...(ngDevMode ? [{ debugName: "templateMap" }] : []));
223
+ density = computed(() => this.config().density ?? 'comfortable', ...(ngDevMode ? [{ debugName: "density" }] : []));
224
+ size = computed(() => this.config().size ?? 'md', ...(ngDevMode ? [{ debugName: "size" }] : []));
225
+ hostClass = computed(() => {
226
+ return `ac-host ac-density--${this.density()} ac-size--${this.size()}`;
227
+ }, ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
228
+ activeTemplateRef = computed(() => {
229
+ const template = this.getActiveTemplate();
230
+ // tip: puede ser TemplateRef<any>; lo normalizamos
231
+ return (template?.templateRef ?? null);
232
+ }, ...(ngDevMode ? [{ debugName: "activeTemplateRef" }] : []));
233
+ contentVm = computed(() => ({
234
+ cardId: this.cardId(),
235
+ summaryBlocks: this.config().summaryBlocks,
236
+ tabs: this.tabs(),
237
+ activeTabId: this.activeTabId(),
238
+ activeTab: this.activeTab(),
239
+ templateRef: this.activeTemplateRef(),
240
+ }), ...(ngDevMode ? [{ debugName: "contentVm" }] : []));
241
+ // Effects
242
+ notifyExpandenChangesEffect = effect(() => {
243
+ this.expandedChange.emit(this.expanded());
244
+ }, ...(ngDevMode ? [{ debugName: "notifyExpandenChangesEffect" }] : []));
245
+ initiActiveTabEffect = effect(() => {
246
+ const tabs = this.tabs();
247
+ if (!tabs.length) {
248
+ this.activeTabId.set(null);
206
249
  return;
207
- this.headerSort.emit(column);
250
+ }
251
+ const preferred = this.config().defaultTabId;
252
+ const current = this.activeTabId();
253
+ const stillExists = current && tabs.some((t) => t.id === current);
254
+ if (!stillExists) {
255
+ const next = preferred && tabs.some((t) => t.id === preferred) ? preferred : (tabs[0]?.id ?? null);
256
+ this.activeTabId.set(next);
257
+ }
258
+ }, ...(ngDevMode ? [{ debugName: "initiActiveTabEffect" }] : []));
259
+ // ===== Actions
260
+ toggleExpand() {
261
+ this.expanded.update((v) => !v);
208
262
  }
209
- onColumnQueryInput(key, value) {
210
- this.columnQueryChange.emit({ key, value });
263
+ expand() {
264
+ if (!this.expanded())
265
+ this.expanded.set(true);
211
266
  }
212
- onRowClick(row) {
213
- this.rowClick.emit(row);
267
+ collapse() {
268
+ if (this.expanded())
269
+ this.expanded.set(false);
214
270
  }
215
- onToggleRow(row) {
216
- this.toggleRow.emit(row);
271
+ onActionClick(a) {
272
+ if (a.disabled)
273
+ return;
274
+ this.action.emit({ actionId: a.id, cardId: this.cardId() });
217
275
  }
218
- onToggleAllOnPage() {
219
- this.toggleAllOnPage.emit();
276
+ // ===== Tabs
277
+ selectTab(tabId) {
278
+ if (this.activeTabId() === tabId)
279
+ return;
280
+ this.activeTabId.set(tabId);
281
+ this.tabChanged.emit({ tabId, cardId: this.cardId() });
220
282
  }
221
- onOpenImage(src, alt, event) {
222
- event.stopPropagation();
223
- this.openImage.emit({ src, alt });
283
+ onTabActionClick(tab, a) {
284
+ if (a.disabled)
285
+ return;
286
+ this.tabAction.emit({ tabId: tab.id, actionId: a.id, cardId: this.cardId() });
224
287
  }
225
- onBodyScroll(event) {
226
- this.bodyScroll.emit(event);
288
+ getActiveTemplate() {
289
+ const at = this.activeTab();
290
+ if (!at || at.kind !== 'template' || !at.templateId)
291
+ return null;
292
+ return this.templateMap().get(at.templateId) ?? null;
227
293
  }
228
- getCellValue(row, col) {
229
- if (col.valueGetter) {
230
- try {
231
- return col.valueGetter(row);
232
- }
233
- catch {
234
- return null;
235
- }
294
+ // ===== Styling helpers
295
+ badgeClass(tone) {
296
+ switch (tone) {
297
+ case 'success':
298
+ return 'badge badge--success';
299
+ case 'warning':
300
+ return 'badge badge--warning';
301
+ case 'danger':
302
+ return 'badge badge--danger';
303
+ case 'primary':
304
+ return 'badge badge--primary';
305
+ default:
306
+ return 'badge badge--neutral';
236
307
  }
237
- return row?.[col.key];
238
308
  }
239
- getCellString(row, col) {
240
- const value = this.getCellValue(row, col);
241
- return value == null ? '' : String(value);
309
+ // ===== Keyboard
310
+ onKeydown(ev) {
311
+ if (!this.closeOnEsc())
312
+ return;
313
+ if (ev.key === 'Escape')
314
+ this.collapse();
242
315
  }
243
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: TableGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
244
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: TableGridComponent, isStandalone: true, selector: "table-grid", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, gridTemplateColumns: { classPropertyName: "gridTemplateColumns", publicName: "gridTemplateColumns", isSignal: true, isRequired: false, transformFunction: null }, columnQueries: { classPropertyName: "columnQueries", publicName: "columnQueries", isSignal: true, isRequired: false, transformFunction: null }, sortState: { classPropertyName: "sortState", publicName: "sortState", isSignal: true, isRequired: false, transformFunction: null }, selectedIdsSet: { classPropertyName: "selectedIdsSet", publicName: "selectedIdsSet", isSignal: true, isRequired: false, transformFunction: null }, timeZone: { classPropertyName: "timeZone", publicName: "timeZone", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { headerSort: "headerSort", columnQueryChange: "columnQueryChange", rowClick: "rowClick", toggleRow: "toggleRow", toggleAllOnPage: "toggleAllOnPage", openImage: "openImage", actionClick: "actionClick", bodyScroll: "bodyScroll" }, ngImport: i0, template: "<div class=\"dt-grid\">\r\n <div class=\"dt-xscroll\">\r\n <!-- Header -->\r\n <div class=\"dt-row dt-header\" [style.gridTemplateColumns]=\"gridTemplateColumns()\">\r\n @if (showSelectionColumn()) {\r\n <div class=\"dt-cell dt-cell--header dt-cell--center dt-select-col\">\r\n @if ((config().selectionMode ?? 'multiple') === 'multiple') {\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isAllSelectedOnPage()\"\r\n (change)=\"onToggleAllOnPage()\"\r\n aria-label=\"Seleccionar todo\"\r\n />\r\n }\r\n </div>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <div\r\n class=\"dt-cell dt-cell--header\"\r\n [class.dt-cell--sortable]=\"!!col.sortable\"\r\n [attr.data-align]=\"col.align ?? 'left'\"\r\n (click)=\"onHeaderClickSort(col)\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n >\r\n <span class=\"dt-header-label\">{{ col.label }}</span>\r\n @if (col.sortable) {\r\n <span class=\"dt-sort\">{{ getSortIcon(col.key) }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Filters row (under header) -->\r\n @if (config().columnFilters) {\r\n <div class=\"dt-row dt-filters\" [style.gridTemplateColumns]=\"gridTemplateColumns()\">\r\n @if (showSelectionColumn()) {\r\n <div class=\"dt-cell dt-cell--filter dt-select-col\"></div>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <div class=\"dt-cell dt-cell--filter\" [attr.data-align]=\"col.align ?? 'left'\">\r\n @if (col.filterable) {\r\n <input\r\n type=\"text\"\r\n [value]=\"columnQueries()[col.key] ?? null\"\r\n (input)=\"onColumnQueryInput(col.key, $any($event.target).value)\"\r\n [placeholder]=\"'Filtrar ' + col.label\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Body -->\r\n <div\r\n class=\"dt-body\"\r\n [style.maxHeight.px]=\"config().scroll?.heightPx ?? null\"\r\n (scroll)=\"onBodyScroll($event)\"\r\n >\r\n @if (rows().length === 0) {\r\n <div class=\"dt-empty\">\r\n {{ config().emptyText ?? 'Sin resultados' }}\r\n </div>\r\n } @else {\r\n @for (row of rows(); track getRowId(row)) {\r\n <div class=\"dt-row dt-data\" [style.gridTemplateColumns]=\"gridTemplateColumns()\">\r\n @if (showSelectionColumn()) {\r\n <div class=\"dt-cell dt-cell--center dt-select-col\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isSelected(row)\"\r\n (change)=\"onToggleRow(row)\"\r\n aria-label=\"Seleccionar fila\"\r\n />\r\n </div>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <div\r\n class=\"dt-cell\"\r\n [attr.data-align]=\"col.align ?? 'left'\"\r\n (click)=\"onRowClick(row)\"\r\n >\r\n @switch (col.type) {\r\n @case ('image') {\r\n @if ((col.options?.image?.hidden ?? false) === true) {\r\n <button\r\n type=\"button\"\r\n class=\"dt-link\"\r\n (click)=\"onOpenImage(getImageSrc(row, col), getImageAlt(row, col), $event)\"\r\n >\r\n Ver imagen\r\n </button>\r\n } @else {\r\n <img\r\n class=\"dt-img\"\r\n [class.dt-img--full]=\"!!col.options?.image?.showFull\"\r\n [src]=\"getImageSrc(row, col)\"\r\n [alt]=\"getImageAlt(row, col)\"\r\n (click)=\"\r\n (col.options?.image?.openInModal ?? true) &&\r\n onOpenImage(getImageSrc(row, col), getImageAlt(row, col), $event)\r\n \"\r\n />\r\n }\r\n }\r\n\r\n @case ('status') {\r\n <span class=\"dt-badge\" [attr.data-variant]=\"getStatusClass(row, col)\">\r\n {{ getDisplayText(row, col) }}\r\n </span>\r\n }\r\n\r\n @case ('link') {\r\n <a\r\n class=\"dt-link\"\r\n [href]=\"getLinkHref(row, col)\"\r\n [target]=\"col.options?.link?.target ?? '_blank'\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n {{ getLinkLabel(row, col) }}\r\n </a>\r\n }\r\n\r\n @case ('actions') {\r\n <div class=\"dt-actions\">\r\n @for (action of getColumnActions(col); track action.id) {\r\n @if (isActionVisible(action, row)) {\r\n <button\r\n type=\"button\"\r\n class=\"dt-action-btn\"\r\n [class.dt-action--edit]=\"action.id === 'edit'\"\r\n [class.dt-action--delete]=\"action.id === 'delete'\"\r\n [class.dt-action--open]=\"action.id === 'open'\"\r\n [class.dt-action--copy]=\"action.id === 'copy'\"\r\n [disabled]=\"isActionDisabled(action, row)\"\r\n [title]=\"action.tooltip ?? action.label\"\r\n (click)=\"emitAction(action, row, $event)\"\r\n >\r\n @if ((action.render ?? 'icon') === 'text') {\r\n <span class=\"dt-action-text\">{{ action.label }}</span>\r\n } @else {\r\n <span\r\n class=\"dt-action-svg\"\r\n [innerHTML]=\"getActionSvg(action)\"\r\n ></span>\r\n }\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n @default {\r\n <span class=\"dt-text\">{{ getDisplayText(row, col) }}</span>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".dt-grid{width:100%}.dt-row{display:grid;align-items:stretch;min-width:max-content}.dt-xscroll{overflow-x:auto;overflow-y:hidden}.dt-header{background:var(--gray-white);border-bottom:var(--border);font-weight:600;color:var(--black)}.dt-cell--header{-webkit-user-select:none;user-select:none}.dt-cell--sortable{cursor:pointer}.dt-filters{background:var(--xxs-light-gray);border-bottom:var(--border)}.dt-cell--filter{padding:8px 12px}input{width:100%;padding:7px 8px;border:1px solid var(--light-gray);border-radius:var(--radius-sm);background:var(--white);color:var(--black);outline:none}input::placeholder{color:var(--xs-dark-gray)}input:focus{border-color:var(--blue);box-shadow:var(--focus-ring)}.dt-body{overflow-y:auto;overflow-x:hidden;min-width:max-content}@media(max-heicg:900px){.dt-body{max-height:none!important;overflow-y:visible!important;overflow-x:auto!important}}.dt-cell{padding:10px 12px;min-height:30px;border-bottom:1px solid var(--xxs-light-gray);display:flex;align-items:center;gap:8px;color:var(--black)}.dt-cell[data-align=left]{justify-content:flex-start;text-align:left}.dt-cell[data-align=center]{justify-content:center;text-align:center}.dt-cell[data-align=right]{justify-content:flex-end;text-align:right}.dt-cell--center,.dt-select-col{justify-content:center}.dt-header-label{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.dt-sort{margin-left:auto;font-size:12px;opacity:.7;color:var(--xs-dark-gray)}.dt-data:hover{background:var(--gray)}.dt-text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.dt-img{width:40px;height:40px;object-fit:cover;border-radius:var(--radius-sm);border:1px solid var(--xs-light-gray);cursor:pointer}.dt-img--full{width:100%;height:auto}.dt-link{color:var(--blue);text-decoration:none;background:transparent;border:none;cursor:pointer;padding:0;font:inherit}.dt-link:hover{text-decoration:underline}.dt-badge{padding:4px 10px;border-radius:999px;border:1px solid var(--xs-light-gray);font-size:12px;background:var(--xxs-light-gray)}.dt-badge[data-variant=success]{background:#208b6a1f;border-color:#208b6a59}.dt-badge[data-variant=warn]{background:#ffbc5733;border-color:#ffbc5773}.dt-badge[data-variant=error]{background:#e600181f;border-color:#e6001859}.dt-badge[data-variant=info]{background:#7390ec24;border-color:#7390ec59}.dt-empty{padding:18px 12px;color:var(--xs-dark-gray)}.dt-actions{display:inline-flex;align-items:center;gap:6px}.dt-action-svg{width:24px;height:24px;display:inline-flex}.dt-action-svg svg{width:24px;height:24px;color:inherit}.dt-action-btn{width:32px;height:32px;border:1px solid var(--xs-light-gray);border-radius:var(--radius-sm);background:var(--white);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--xs-dark-gray)}.dt-action-btn:hover:not(:disabled){background:var(--gray-white);border-color:var(--dark-gray)}.dt-action-btn.dt-action--edit{color:var(--blue)}.dt-action-btn.dt-action--edit:hover:not(:disabled){color:var(--white);background-color:var(--blue)}.dt-action-btn.dt-action--open{color:var(--blue-medium)}.dt-action-btn.dt-action--open:hover:not(:disabled){color:var(--blue-dark)}.dt-action-btn.dt-action--copy{color:var(--xs-dark-gray)}.dt-action-btn.dt-action--copy:hover:not(:disabled){color:var(--white);background-color:var(--xs-dark-gray)}.dt-action-btn.dt-action--delete{color:var(--red)}.dt-action-btn.dt-action--delete:hover:not(:disabled){color:var(--white);background-color:var(--red)}.dt-action-btn:disabled{color:var(--disabled-text);background:var(--soft-white);cursor:not-allowed}.dt-action-text{font-size:24px;padding:0 8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
316
+ onBackdropClick() {
317
+ if (!this.closeOnBackdrop())
318
+ return;
319
+ this.collapse();
320
+ }
321
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCard, deps: [], target: i0.ɵɵFactoryTarget.Component });
322
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: AdvancedCard, isStandalone: true, selector: "advanced-card", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, fullWidthOnExpand: { classPropertyName: "fullWidthOnExpand", publicName: "fullWidthOnExpand", isSignal: true, isRequired: false, transformFunction: null }, stickyHeader: { classPropertyName: "stickyHeader", publicName: "stickyHeader", isSignal: true, isRequired: false, transformFunction: null }, closeOnEsc: { classPropertyName: "closeOnEsc", publicName: "closeOnEsc", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expandedChange: "expandedChange", action: "action", tabChanged: "tabChanged", tabAction: "tabAction" }, host: { listeners: { "document:keydown": "onKeydown($event)" }, properties: { "class": "hostClass()" } }, queries: [{ propertyName: "projectedTemplates", predicate: AdvancedCardTemplateDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"ac__card\">\r\n <lib-card-compact\r\n [configuration]=\"config()\"\r\n [expanded]=\"expanded()\"\r\n [badgeClass]=\"badgeClass.bind(this)\"\r\n (expand)=\"expand()\"\r\n />\r\n\r\n @let mode = expandMode();\r\n\r\n @if (expanded()) {\r\n @if (mode === 'inline') {\r\n <ac-advanced-card-inline\r\n [config]=\"config()\"\r\n [stickyHeader]=\"stickyHeader()\"\r\n [fullWidth]=\"fullWidthOnExpand()\"\r\n [badgeClass]=\"badgeClass.bind(this)\"\r\n [viewModel]=\"contentVm()\"\r\n (actionClick)=\"onActionClick($event)\"\r\n (close)=\"collapse()\"\r\n (tabSelected)=\"selectTab($event)\"\r\n (tabAction)=\"onTabActionClick(activeTab()!, $event)\"\r\n >\r\n <ng-content></ng-content>\r\n </ac-advanced-card-inline>\r\n } @else {\r\n <ac-advanced-card-overlay\r\n [config]=\"config()\"\r\n [mode]=\"mode === 'modal' ? 'modal' : 'drawer'\"\r\n [closeOnBackdrop]=\"closeOnBackdrop()\"\r\n [badgeClass]=\"badgeClass.bind(this)\"\r\n [viewModel]=\"contentVm()\"\r\n (actionClick)=\"onActionClick($event)\"\r\n (close)=\"collapse()\"\r\n (tabSelected)=\"selectTab($event)\"\r\n (tabAction)=\"onTabActionClick(activeTab()!, $event)\"\r\n >\r\n <ng-content></ng-content>\r\n </ac-advanced-card-overlay>\r\n }\r\n }\r\n</div>\r\n\r\n<div class=\"ac__projected-templates\" aria-hidden=\"true\">\r\n <ng-content select=\"ng-template[advancedCardTemplate]\"></ng-content>\r\n</div>\r\n", styles: [":host.ac-host{--ac-surface: #ffffff;--ac-surface-2: #fafafa;--ac-border: #e5e7eb;--ac-border-soft: #eef2f7;--ac-shadow: 0 8px 22px rgba(17, 24, 39, .06);--ac-text: #111827;--ac-muted: #6b7280;--ac-radius: 14px;--ac-radius-sm: 10px;--ac-gap: 16px;--ac-title-size: 18px;--ac-subtitle-size: 13px;--ac-pad-card: 16px;--ac-pad-header: 14px 18px;--ac-pad-body: 18px;--ac-btn-radius: 10px;--ac-btn-pad: 8px 12px;--ac-btn-font: 700;--ac-primary: #1d4ed8;--ac-danger: #dc2626;--ac-badge-success-bg: #e6f9f1;--ac-badge-success-fg: #0f766e;--ac-badge-warning-bg: #fff7ed;--ac-badge-warning-fg: #b45309;--ac-badge-danger-bg: #fef2f2;--ac-badge-danger-fg: #b91c1c;--ac-badge-primary-bg: #eff6ff;--ac-badge-primary-fg: #1d4ed8;--ac-badge-neutral-bg: #f3f4f6;--ac-badge-neutral-fg: #374151;--ac-overlay: rgba(17, 24, 39, .45);--ac-overlay-blur: 2px;--ac-modal-max: 1200px;--ac-drawer-height: min(85vh, 900px);--ac-modal-height: min(80vh, 880px)}:host.ac-density--compact{--ac-gap: 12px;--ac-pad-card: 12px;--ac-pad-header: 12px 14px;--ac-pad-body: 14px;--ac-subtitle-size: 12px;--ac-btn-pad: 7px 10px}:host.ac-size--sm{--ac-title-size: 16px;--ac-radius: 12px;--ac-modal-max: 1000px}:host.ac-size--lg{--ac-title-size: 20px;--ac-radius: 16px;--ac-modal-max: 1400px}.ac__card{padding:10px;gap:10px}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"], dependencies: [{ kind: "component", type: CardCompactComponent, selector: "lib-card-compact", inputs: ["configuration", "expanded", "badgeClass"], outputs: ["expand"] }, { kind: "component", type: AdvancedCardOverlayComponent, selector: "ac-advanced-card-overlay", inputs: ["config", "mode", "closeOnBackdrop", "badgeClass", "viewModel"], outputs: ["actionClick", "close", "tabSelected", "tabAction"] }, { kind: "component", type: AdvancedCardInlineComponent, selector: "ac-advanced-card-inline", inputs: ["config", "stickyHeader", "fullWidth", "badgeClass", "viewModel"], outputs: ["actionClick", "close", "tabSelected", "tabAction"] }] });
245
323
  }
246
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: TableGridComponent, decorators: [{
324
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCard, decorators: [{
247
325
  type: Component,
248
- args: [{ selector: 'table-grid', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"dt-grid\">\r\n <div class=\"dt-xscroll\">\r\n <!-- Header -->\r\n <div class=\"dt-row dt-header\" [style.gridTemplateColumns]=\"gridTemplateColumns()\">\r\n @if (showSelectionColumn()) {\r\n <div class=\"dt-cell dt-cell--header dt-cell--center dt-select-col\">\r\n @if ((config().selectionMode ?? 'multiple') === 'multiple') {\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isAllSelectedOnPage()\"\r\n (change)=\"onToggleAllOnPage()\"\r\n aria-label=\"Seleccionar todo\"\r\n />\r\n }\r\n </div>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <div\r\n class=\"dt-cell dt-cell--header\"\r\n [class.dt-cell--sortable]=\"!!col.sortable\"\r\n [attr.data-align]=\"col.align ?? 'left'\"\r\n (click)=\"onHeaderClickSort(col)\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n >\r\n <span class=\"dt-header-label\">{{ col.label }}</span>\r\n @if (col.sortable) {\r\n <span class=\"dt-sort\">{{ getSortIcon(col.key) }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Filters row (under header) -->\r\n @if (config().columnFilters) {\r\n <div class=\"dt-row dt-filters\" [style.gridTemplateColumns]=\"gridTemplateColumns()\">\r\n @if (showSelectionColumn()) {\r\n <div class=\"dt-cell dt-cell--filter dt-select-col\"></div>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <div class=\"dt-cell dt-cell--filter\" [attr.data-align]=\"col.align ?? 'left'\">\r\n @if (col.filterable) {\r\n <input\r\n type=\"text\"\r\n [value]=\"columnQueries()[col.key] ?? null\"\r\n (input)=\"onColumnQueryInput(col.key, $any($event.target).value)\"\r\n [placeholder]=\"'Filtrar ' + col.label\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Body -->\r\n <div\r\n class=\"dt-body\"\r\n [style.maxHeight.px]=\"config().scroll?.heightPx ?? null\"\r\n (scroll)=\"onBodyScroll($event)\"\r\n >\r\n @if (rows().length === 0) {\r\n <div class=\"dt-empty\">\r\n {{ config().emptyText ?? 'Sin resultados' }}\r\n </div>\r\n } @else {\r\n @for (row of rows(); track getRowId(row)) {\r\n <div class=\"dt-row dt-data\" [style.gridTemplateColumns]=\"gridTemplateColumns()\">\r\n @if (showSelectionColumn()) {\r\n <div class=\"dt-cell dt-cell--center dt-select-col\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isSelected(row)\"\r\n (change)=\"onToggleRow(row)\"\r\n aria-label=\"Seleccionar fila\"\r\n />\r\n </div>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <div\r\n class=\"dt-cell\"\r\n [attr.data-align]=\"col.align ?? 'left'\"\r\n (click)=\"onRowClick(row)\"\r\n >\r\n @switch (col.type) {\r\n @case ('image') {\r\n @if ((col.options?.image?.hidden ?? false) === true) {\r\n <button\r\n type=\"button\"\r\n class=\"dt-link\"\r\n (click)=\"onOpenImage(getImageSrc(row, col), getImageAlt(row, col), $event)\"\r\n >\r\n Ver imagen\r\n </button>\r\n } @else {\r\n <img\r\n class=\"dt-img\"\r\n [class.dt-img--full]=\"!!col.options?.image?.showFull\"\r\n [src]=\"getImageSrc(row, col)\"\r\n [alt]=\"getImageAlt(row, col)\"\r\n (click)=\"\r\n (col.options?.image?.openInModal ?? true) &&\r\n onOpenImage(getImageSrc(row, col), getImageAlt(row, col), $event)\r\n \"\r\n />\r\n }\r\n }\r\n\r\n @case ('status') {\r\n <span class=\"dt-badge\" [attr.data-variant]=\"getStatusClass(row, col)\">\r\n {{ getDisplayText(row, col) }}\r\n </span>\r\n }\r\n\r\n @case ('link') {\r\n <a\r\n class=\"dt-link\"\r\n [href]=\"getLinkHref(row, col)\"\r\n [target]=\"col.options?.link?.target ?? '_blank'\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n {{ getLinkLabel(row, col) }}\r\n </a>\r\n }\r\n\r\n @case ('actions') {\r\n <div class=\"dt-actions\">\r\n @for (action of getColumnActions(col); track action.id) {\r\n @if (isActionVisible(action, row)) {\r\n <button\r\n type=\"button\"\r\n class=\"dt-action-btn\"\r\n [class.dt-action--edit]=\"action.id === 'edit'\"\r\n [class.dt-action--delete]=\"action.id === 'delete'\"\r\n [class.dt-action--open]=\"action.id === 'open'\"\r\n [class.dt-action--copy]=\"action.id === 'copy'\"\r\n [disabled]=\"isActionDisabled(action, row)\"\r\n [title]=\"action.tooltip ?? action.label\"\r\n (click)=\"emitAction(action, row, $event)\"\r\n >\r\n @if ((action.render ?? 'icon') === 'text') {\r\n <span class=\"dt-action-text\">{{ action.label }}</span>\r\n } @else {\r\n <span\r\n class=\"dt-action-svg\"\r\n [innerHTML]=\"getActionSvg(action)\"\r\n ></span>\r\n }\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n @default {\r\n <span class=\"dt-text\">{{ getDisplayText(row, col) }}</span>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".dt-grid{width:100%}.dt-row{display:grid;align-items:stretch;min-width:max-content}.dt-xscroll{overflow-x:auto;overflow-y:hidden}.dt-header{background:var(--gray-white);border-bottom:var(--border);font-weight:600;color:var(--black)}.dt-cell--header{-webkit-user-select:none;user-select:none}.dt-cell--sortable{cursor:pointer}.dt-filters{background:var(--xxs-light-gray);border-bottom:var(--border)}.dt-cell--filter{padding:8px 12px}input{width:100%;padding:7px 8px;border:1px solid var(--light-gray);border-radius:var(--radius-sm);background:var(--white);color:var(--black);outline:none}input::placeholder{color:var(--xs-dark-gray)}input:focus{border-color:var(--blue);box-shadow:var(--focus-ring)}.dt-body{overflow-y:auto;overflow-x:hidden;min-width:max-content}@media(max-heicg:900px){.dt-body{max-height:none!important;overflow-y:visible!important;overflow-x:auto!important}}.dt-cell{padding:10px 12px;min-height:30px;border-bottom:1px solid var(--xxs-light-gray);display:flex;align-items:center;gap:8px;color:var(--black)}.dt-cell[data-align=left]{justify-content:flex-start;text-align:left}.dt-cell[data-align=center]{justify-content:center;text-align:center}.dt-cell[data-align=right]{justify-content:flex-end;text-align:right}.dt-cell--center,.dt-select-col{justify-content:center}.dt-header-label{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.dt-sort{margin-left:auto;font-size:12px;opacity:.7;color:var(--xs-dark-gray)}.dt-data:hover{background:var(--gray)}.dt-text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.dt-img{width:40px;height:40px;object-fit:cover;border-radius:var(--radius-sm);border:1px solid var(--xs-light-gray);cursor:pointer}.dt-img--full{width:100%;height:auto}.dt-link{color:var(--blue);text-decoration:none;background:transparent;border:none;cursor:pointer;padding:0;font:inherit}.dt-link:hover{text-decoration:underline}.dt-badge{padding:4px 10px;border-radius:999px;border:1px solid var(--xs-light-gray);font-size:12px;background:var(--xxs-light-gray)}.dt-badge[data-variant=success]{background:#208b6a1f;border-color:#208b6a59}.dt-badge[data-variant=warn]{background:#ffbc5733;border-color:#ffbc5773}.dt-badge[data-variant=error]{background:#e600181f;border-color:#e6001859}.dt-badge[data-variant=info]{background:#7390ec24;border-color:#7390ec59}.dt-empty{padding:18px 12px;color:var(--xs-dark-gray)}.dt-actions{display:inline-flex;align-items:center;gap:6px}.dt-action-svg{width:24px;height:24px;display:inline-flex}.dt-action-svg svg{width:24px;height:24px;color:inherit}.dt-action-btn{width:32px;height:32px;border:1px solid var(--xs-light-gray);border-radius:var(--radius-sm);background:var(--white);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--xs-dark-gray)}.dt-action-btn:hover:not(:disabled){background:var(--gray-white);border-color:var(--dark-gray)}.dt-action-btn.dt-action--edit{color:var(--blue)}.dt-action-btn.dt-action--edit:hover:not(:disabled){color:var(--white);background-color:var(--blue)}.dt-action-btn.dt-action--open{color:var(--blue-medium)}.dt-action-btn.dt-action--open:hover:not(:disabled){color:var(--blue-dark)}.dt-action-btn.dt-action--copy{color:var(--xs-dark-gray)}.dt-action-btn.dt-action--copy:hover:not(:disabled){color:var(--white);background-color:var(--xs-dark-gray)}.dt-action-btn.dt-action--delete{color:var(--red)}.dt-action-btn.dt-action--delete:hover:not(:disabled){color:var(--white);background-color:var(--red)}.dt-action-btn:disabled{color:var(--disabled-text);background:var(--soft-white);cursor:not-allowed}.dt-action-text{font-size:24px;padding:0 8px}\n"] }]
249
- }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], gridTemplateColumns: [{ type: i0.Input, args: [{ isSignal: true, alias: "gridTemplateColumns", required: false }] }], columnQueries: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnQueries", required: false }] }], sortState: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortState", required: false }] }], selectedIdsSet: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedIdsSet", required: false }] }], timeZone: [{ type: i0.Input, args: [{ isSignal: true, alias: "timeZone", required: false }] }], headerSort: [{ type: i0.Output, args: ["headerSort"] }], columnQueryChange: [{ type: i0.Output, args: ["columnQueryChange"] }], rowClick: [{ type: i0.Output, args: ["rowClick"] }], toggleRow: [{ type: i0.Output, args: ["toggleRow"] }], toggleAllOnPage: [{ type: i0.Output, args: ["toggleAllOnPage"] }], openImage: [{ type: i0.Output, args: ["openImage"] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }], bodyScroll: [{ type: i0.Output, args: ["bodyScroll"] }] } });
326
+ args: [{ selector: 'advanced-card', imports: [CardCompactComponent, AdvancedCardOverlayComponent, AdvancedCardInlineComponent], host: {
327
+ '[class]': 'hostClass()',
328
+ }, template: "<div class=\"ac__card\">\r\n <lib-card-compact\r\n [configuration]=\"config()\"\r\n [expanded]=\"expanded()\"\r\n [badgeClass]=\"badgeClass.bind(this)\"\r\n (expand)=\"expand()\"\r\n />\r\n\r\n @let mode = expandMode();\r\n\r\n @if (expanded()) {\r\n @if (mode === 'inline') {\r\n <ac-advanced-card-inline\r\n [config]=\"config()\"\r\n [stickyHeader]=\"stickyHeader()\"\r\n [fullWidth]=\"fullWidthOnExpand()\"\r\n [badgeClass]=\"badgeClass.bind(this)\"\r\n [viewModel]=\"contentVm()\"\r\n (actionClick)=\"onActionClick($event)\"\r\n (close)=\"collapse()\"\r\n (tabSelected)=\"selectTab($event)\"\r\n (tabAction)=\"onTabActionClick(activeTab()!, $event)\"\r\n >\r\n <ng-content></ng-content>\r\n </ac-advanced-card-inline>\r\n } @else {\r\n <ac-advanced-card-overlay\r\n [config]=\"config()\"\r\n [mode]=\"mode === 'modal' ? 'modal' : 'drawer'\"\r\n [closeOnBackdrop]=\"closeOnBackdrop()\"\r\n [badgeClass]=\"badgeClass.bind(this)\"\r\n [viewModel]=\"contentVm()\"\r\n (actionClick)=\"onActionClick($event)\"\r\n (close)=\"collapse()\"\r\n (tabSelected)=\"selectTab($event)\"\r\n (tabAction)=\"onTabActionClick(activeTab()!, $event)\"\r\n >\r\n <ng-content></ng-content>\r\n </ac-advanced-card-overlay>\r\n }\r\n }\r\n</div>\r\n\r\n<div class=\"ac__projected-templates\" aria-hidden=\"true\">\r\n <ng-content select=\"ng-template[advancedCardTemplate]\"></ng-content>\r\n</div>\r\n", styles: [":host.ac-host{--ac-surface: #ffffff;--ac-surface-2: #fafafa;--ac-border: #e5e7eb;--ac-border-soft: #eef2f7;--ac-shadow: 0 8px 22px rgba(17, 24, 39, .06);--ac-text: #111827;--ac-muted: #6b7280;--ac-radius: 14px;--ac-radius-sm: 10px;--ac-gap: 16px;--ac-title-size: 18px;--ac-subtitle-size: 13px;--ac-pad-card: 16px;--ac-pad-header: 14px 18px;--ac-pad-body: 18px;--ac-btn-radius: 10px;--ac-btn-pad: 8px 12px;--ac-btn-font: 700;--ac-primary: #1d4ed8;--ac-danger: #dc2626;--ac-badge-success-bg: #e6f9f1;--ac-badge-success-fg: #0f766e;--ac-badge-warning-bg: #fff7ed;--ac-badge-warning-fg: #b45309;--ac-badge-danger-bg: #fef2f2;--ac-badge-danger-fg: #b91c1c;--ac-badge-primary-bg: #eff6ff;--ac-badge-primary-fg: #1d4ed8;--ac-badge-neutral-bg: #f3f4f6;--ac-badge-neutral-fg: #374151;--ac-overlay: rgba(17, 24, 39, .45);--ac-overlay-blur: 2px;--ac-modal-max: 1200px;--ac-drawer-height: min(85vh, 900px);--ac-modal-height: min(80vh, 880px)}:host.ac-density--compact{--ac-gap: 12px;--ac-pad-card: 12px;--ac-pad-header: 12px 14px;--ac-pad-body: 14px;--ac-subtitle-size: 12px;--ac-btn-pad: 7px 10px}:host.ac-size--sm{--ac-title-size: 16px;--ac-radius: 12px;--ac-modal-max: 1000px}:host.ac-size--lg{--ac-title-size: 20px;--ac-radius: 16px;--ac-modal-max: 1400px}.ac__card{padding:10px;gap:10px}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
329
+ }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], fullWidthOnExpand: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidthOnExpand", required: false }] }], stickyHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "stickyHeader", required: false }] }], closeOnEsc: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEsc", required: false }] }], expandedChange: [{ type: i0.Output, args: ["expandedChange"] }], action: [{ type: i0.Output, args: ["action"] }], tabChanged: [{ type: i0.Output, args: ["tabChanged"] }], tabAction: [{ type: i0.Output, args: ["tabAction"] }], projectedTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => AdvancedCardTemplateDirective), { ...{
330
+ descendants: true,
331
+ }, isSignal: true }] }], onKeydown: [{
332
+ type: HostListener,
333
+ args: ['document:keydown', ['$event']]
334
+ }] } });
250
335
 
251
- class TablePaginationComponent {
252
- Math = Math;
253
- // Inputs
254
- page = input(1, ...(ngDevMode ? [{ debugName: "page" }] : []));
255
- pageSize = input(10, ...(ngDevMode ? [{ debugName: "pageSize" }] : []));
256
- pageCount = input(1, ...(ngDevMode ? [{ debugName: "pageCount" }] : []));
257
- totalCount = input(0, ...(ngDevMode ? [{ debugName: "totalCount" }] : []));
258
- pageSizeOptions = input([10, 25, 50], ...(ngDevMode ? [{ debugName: "pageSizeOptions" }] : []));
259
- pagerItems = input([], ...(ngDevMode ? [{ debugName: "pagerItems" }] : []));
260
- // Outputs
261
- pageChange = output();
262
- pageSizeChange = output();
263
- startItem = computed(() => {
264
- if (this.totalCount() <= 0)
265
- return 0;
266
- return (this.page() - 1) * this.pageSize() + 1;
267
- }, ...(ngDevMode ? [{ debugName: "startItem" }] : []));
268
- endItem = computed(() => {
269
- if (this.totalCount() <= 0)
270
- return 0;
271
- return Math.min(this.page() * this.pageSize(), this.totalCount());
272
- }, ...(ngDevMode ? [{ debugName: "endItem" }] : []));
273
- goToPage(page) {
274
- const clamped = Math.max(1, Math.min(this.pageCount(), page));
275
- this.pageChange.emit(clamped);
276
- }
277
- prevPage() {
278
- this.goToPage(this.page() - 1);
279
- }
280
- nextPage() {
281
- this.goToPage(this.page() + 1);
282
- }
283
- onPageSizeSelect(size) {
284
- if (!Number.isFinite(size) || size <= 0)
336
+ class SimpleTable {
337
+ headers = input.required(...(ngDevMode ? [{ debugName: "headers" }] : []));
338
+ data = input([], ...(ngDevMode ? [{ debugName: "data" }] : []));
339
+ sortState = signal({
340
+ key: null,
341
+ direction: 'none',
342
+ }, ...(ngDevMode ? [{ debugName: "sortState" }] : []));
343
+ sortedData = computed(() => {
344
+ const { key, direction } = this.sortState();
345
+ const currentData = [...this.data()];
346
+ if (!key || direction === 'none')
347
+ return currentData;
348
+ return currentData.sort((a, b) => {
349
+ const valueA = a[key];
350
+ const valueB = b[key];
351
+ if (valueA == null && valueB == null)
352
+ return 0;
353
+ if (valueA == null)
354
+ return 1;
355
+ if (valueB == null)
356
+ return -1;
357
+ const numberA = Number(valueA);
358
+ const numberB = Number(valueB);
359
+ if (!isNaN(numberA) && !isNaN(numberB)) {
360
+ return direction === 'asc' ? numberA - numberB : numberB - numberA;
361
+ }
362
+ if (valueA instanceof Date && valueB instanceof Date) {
363
+ return direction === 'asc'
364
+ ? valueA.getTime() - valueB.getTime()
365
+ : valueB.getTime() - valueA.getTime();
366
+ }
367
+ const aStr = String(valueA);
368
+ const bStr = String(valueB);
369
+ return direction === 'asc' ? aStr.localeCompare(bStr) : bStr.localeCompare(aStr);
370
+ });
371
+ }, ...(ngDevMode ? [{ debugName: "sortedData" }] : []));
372
+ sortBy(key) {
373
+ const current = this.sortState();
374
+ if (current.key !== key) {
375
+ this.sortState.set({ key, direction: 'asc' });
285
376
  return;
286
- this.pageSizeChange.emit(size);
287
- }
288
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: TablePaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
289
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: TablePaginationComponent, isStandalone: true, selector: "table-pagination", inputs: { page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, pageCount: { classPropertyName: "pageCount", publicName: "pageCount", isSignal: true, isRequired: false, transformFunction: null }, totalCount: { classPropertyName: "totalCount", publicName: "totalCount", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null }, pagerItems: { classPropertyName: "pagerItems", publicName: "pagerItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageChange: "pageChange", pageSizeChange: "pageSizeChange" }, ngImport: i0, template: "<div class=\"dt-pagination dt-pagination--classic\">\r\n <!-- Info -->\r\n <span class=\"dt-page-info dt-hide-sm\">\r\n Mostrando {{ startItem() }} \u2013 {{ endItem() }} de {{ totalCount() }}\r\n </span>\r\n\r\n <!-- Compact info (mobile) -->\r\n <span class=\"dt-page-compact dt-show-xs\">\r\n {{ page() }} / {{ pageCount() }}\r\n </span>\r\n\r\n <!-- Rows per page -->\r\n <div class=\"dt-rows dt-hide-md\">\r\n <span>Filas:</span>\r\n <select [value]=\"pageSize()\" (change)=\"onPageSizeSelect(+$any($event.target).value)\">\r\n @for (size of pageSizeOptions(); track size) {\r\n <option [value]=\"size\">{{ size }}</option>\r\n }\r\n </select>\r\n </div>\r\n\r\n <!-- Pager -->\r\n <div class=\"dt-pager\">\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-btn dt-hide-sm\"\r\n (click)=\"goToPage(1)\"\r\n [disabled]=\"page() === 1\"\r\n aria-label=\"Primera p\u00E1gina\"\r\n >\r\n <!-- svg -->\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"m11 18l-6-6l6-6l1.4 1.4L7.825 12l4.575 4.6zm6.6 0l-6-6l6-6L19 7.4L14.425 12L19 16.6z\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-btn\"\r\n (click)=\"prevPage()\"\r\n [disabled]=\"page() === 1\"\r\n aria-label=\"P\u00E1gina anterior\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path fill=\"currentColor\" d=\"m14 18l-6-6l6-6l1.4 1.4l-4.6 4.6l4.6 4.6z\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- n\u00FAmeros/ellipsis: se ocultar\u00E1n en XS por CSS -->\r\n @for (item of pagerItems(); track $index) {\r\n @if (item === '\u2026') {\r\n <span class=\"dt-pager-ellipsis dt-hide-xs\">\u2026</span>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-chip dt-hide-xs\"\r\n [class.dt-pager-chip--active]=\"item === page()\"\r\n (click)=\"goToPage(item)\"\r\n >\r\n {{ item }}\r\n </button>\r\n }\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-btn\"\r\n (click)=\"nextPage()\"\r\n [disabled]=\"page() === pageCount()\"\r\n aria-label=\"P\u00E1gina siguiente\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path fill=\"currentColor\" d=\"M12.6 12L8 7.4L9.4 6l6 6l-6 6L8 16.6z\" />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-btn dt-hide-sm\"\r\n (click)=\"goToPage(pageCount())\"\r\n [disabled]=\"page() === pageCount()\"\r\n aria-label=\"\u00DAltima p\u00E1gina\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M9.575 12L5 7.4L6.4 6l6 6l-6 6L5 16.6zm6.6 0L11.6 7.4L13 6l6 6l-6 6l-1.4-1.4z\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [".dt-pagination{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 12px;font-size:13px}.dt-page-info{white-space:nowrap;color:var(--xs-dark-gray)}.dt-rows{display:flex;align-items:center;gap:6px;color:var(--xs-dark-gray)}.dt-rows select{padding:6px 28px 6px 8px;border-radius:var(--radius-sm);border:1px solid var(--light-gray);background:var(--white);font-size:13px;color:var(--black)}.dt-pager{display:flex;align-items:center;gap:4px}.dt-pager-btn,.dt-pager-chip{min-width:28px;height:28px;border-radius:var(--radius-sm);border:1px solid var(--xs-light-gray);background:var(--white);cursor:pointer;font-size:13px;display:inline-flex;align-items:center;justify-content:center;line-height:1;padding:0}.dt-pager-btn:hover:not(:disabled),.dt-pager-chip:hover:not(:disabled){border-color:var(--dark-gray);background:var(--gray-white);color:var(--xs-dark-gray)}.dt-pager-chip--active{background:#3361fa;color:var(--white);border-color:var(--blue);font-weight:600}.dt-pager-chip--active:hover:not(:disabled){background:#3361fa;color:var(--white);border-color:var(--blue)}.dt-pager-btn:disabled,.dt-pager-chip:disabled{opacity:1;color:var(--disabled-text);background:var(--soft-white);border-color:var(--disabled);cursor:not-allowed}.dt-pager-ellipsis{padding:0 6px;color:var(--xs-dark-gray)}.dt-hide-xs,.dt-hide-sm,.dt-hide-md{display:inline-flex}.dt-show-xs{display:none}.dt-page-compact{white-space:nowrap;color:var(--xs-dark-gray)}@media(max-width:1200px){.dt-hide-md{display:none!important}}@media(max-width:900px){.dt-hide-sm{display:none!important}.dt-pagination{justify-content:center}}@media(max-width:640px){.dt-hide-xs{display:none!important}.dt-show-xs{display:inline-flex!important}.dt-pagination{gap:10px}.dt-pager{gap:8px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
377
+ }
378
+ const next = {
379
+ none: 'asc',
380
+ asc: 'desc',
381
+ desc: 'none',
382
+ };
383
+ this.sortState.set({ key, direction: next[current.direction] });
384
+ }
385
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: SimpleTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
386
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: SimpleTable, isStandalone: true, selector: "simple-table", inputs: { headers: { classPropertyName: "headers", publicName: "headers", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"table-item\">\n <table class=\"simple-table\">\n <thead>\n <tr>\n @for (header of headers(); track header.key) {\n <th\n scope=\"col\"\n class=\"sortable\"\n [class.active]=\"sortState().key === header.key && sortState().direction !== 'none'\"\n (click)=\"sortBy(header.key)\"\n >\n <span class=\"th-content\">\n <span class=\"th-label\">{{ header.label }}</span>\n\n <!-- icono -->\n <span class=\"sort-icon\" aria-hidden=\"true\">\n @if (sortState().key !== header.key || sortState().direction === 'none') {\n <!-- doble flecha (neutral) -->\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n >\n <rect width=\"24\" height=\"24\" fill=\"none\" />\n <path\n fill=\"currentColor\"\n d=\"M12.53 3.47a.75.75 0 0 0-1.06 0l-4 4a.75.75 0 0 0 0 1.06h9.06a.75.75 0 0 0 0-1.06zm4 13.06a.75.75 0 0 0 0-1.06H7.47a.75.75 0 0 0 0 1.06l4 4a.75.75 0 0 0 1.06 0z\"\n />\n </svg>\n } @else if (sortState().direction === 'asc') {\n <!-- flecha arriba -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <rect width=\"24\" height=\"24\" fill=\"none\" />\n <path\n fill=\"currentColor\"\n d=\"M8.2 14q-.225 0-.362-.15T7.7 13.5q0-.05.15-.35l3.625-3.625q.125-.125.25-.175T12 9.3t.275.05t.25.175l3.625 3.625q.075.075.113.163t.037.187q0 .2-.137.35T15.8 14z\"\n />\n </svg>\n } @else {\n <!-- flecha abajo -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <rect width=\"24\" height=\"24\" fill=\"none\" />\n <path\n fill=\"currentColor\"\n d=\"M11.475 14.475L7.85 10.85q-.075-.075-.112-.162T7.7 10.5q0-.2.138-.35T8.2 10h7.6q.225 0 .363.15t.137.35q0 .05-.15.35l-3.625 3.625q-.125.125-.25.175T12 14.7t-.275-.05t-.25-.175\"\n />\n </svg>\n }\n </span>\n </span>\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @for (row of sortedData(); track row) {\n <tr>\n @for (header of headers(); track header.key) {\n <td [attr.data-label]=\"header.label\">\n {{ row[header.key] }}\n </td>\n }\n </tr>\n } @empty {\n <tr>\n <td class=\"empty\" [attr.colspan]=\"headers().length\">Datos no localizados.</td>\n </tr>\n }\n </tbody>\n </table>\n</div>\n", styles: [".table-item{background:#fff;overflow:hidden}.simple-table{width:100%;border-collapse:separate;border-spacing:0;font-size:14px}.simple-table thead th{text-align:left;padding:12px 10px;border-bottom:1px solid #e5e7eb;background:#f9fafb;font-weight:600;color:#111827;position:sticky;top:0;vertical-align:middle}.th-content{display:flex;align-items:center;justify-content:space-between;gap:8px}.th-label{line-height:1.2}.sort-icon{display:inline-flex;align-items:center;justify-content:center;height:1em;opacity:.85}.sort-icon svg{width:1em;height:1em;display:block}.simple-table tbody td{padding:12px 10px;border-bottom:1px solid #f3f4f6;color:#374151}.simple-table tbody tr:hover td{background:#fcfcfd}.simple-table tbody tr:last-child td{border-bottom:0}.simple-table th.sortable .sort-icon{color:#9ca3af}.simple-table th.sortable.active .sort-icon{color:#111827}.empty{text-align:center;padding:18px 10px;color:#6b7280}.simple-table th.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .2s ease}.simple-table th.sortable:hover{background:#f3f4f6}.simple-table th.active{color:#111827}@media(max-width:640px){.table-item{padding:10px}.simple-table thead{display:none}.simple-table,.simple-table tbody,.simple-table tr,.simple-table td{display:block;width:100%}.simple-table tbody tr{border:1px solid #e5e7eb;padding:8px 10px;margin-bottom:10px;background:#fff}.simple-table tbody td{border:0;border-bottom:1px dashed #eef2f7;padding:10px 0;display:grid;grid-template-columns:140px 1fr;gap:10px;align-items:start}.simple-table tbody td:last-child{border-bottom:0}.simple-table tbody td:before{content:attr(data-label);font-weight:600;color:#111827;opacity:.9}.simple-table tbody tr:has(.empty){border:0;padding:0;margin:0}.simple-table tbody td.empty{display:block;border:1px dashed #e5e7eb;border-radius:12px;padding:14px 12px;text-align:center;background:#fafafa}}\n"] });
290
387
  }
291
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: TablePaginationComponent, decorators: [{
388
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: SimpleTable, decorators: [{
292
389
  type: Component,
293
- args: [{ selector: 'table-pagination', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"dt-pagination dt-pagination--classic\">\r\n <!-- Info -->\r\n <span class=\"dt-page-info dt-hide-sm\">\r\n Mostrando {{ startItem() }} \u2013 {{ endItem() }} de {{ totalCount() }}\r\n </span>\r\n\r\n <!-- Compact info (mobile) -->\r\n <span class=\"dt-page-compact dt-show-xs\">\r\n {{ page() }} / {{ pageCount() }}\r\n </span>\r\n\r\n <!-- Rows per page -->\r\n <div class=\"dt-rows dt-hide-md\">\r\n <span>Filas:</span>\r\n <select [value]=\"pageSize()\" (change)=\"onPageSizeSelect(+$any($event.target).value)\">\r\n @for (size of pageSizeOptions(); track size) {\r\n <option [value]=\"size\">{{ size }}</option>\r\n }\r\n </select>\r\n </div>\r\n\r\n <!-- Pager -->\r\n <div class=\"dt-pager\">\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-btn dt-hide-sm\"\r\n (click)=\"goToPage(1)\"\r\n [disabled]=\"page() === 1\"\r\n aria-label=\"Primera p\u00E1gina\"\r\n >\r\n <!-- svg -->\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"m11 18l-6-6l6-6l1.4 1.4L7.825 12l4.575 4.6zm6.6 0l-6-6l6-6L19 7.4L14.425 12L19 16.6z\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-btn\"\r\n (click)=\"prevPage()\"\r\n [disabled]=\"page() === 1\"\r\n aria-label=\"P\u00E1gina anterior\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path fill=\"currentColor\" d=\"m14 18l-6-6l6-6l1.4 1.4l-4.6 4.6l4.6 4.6z\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- n\u00FAmeros/ellipsis: se ocultar\u00E1n en XS por CSS -->\r\n @for (item of pagerItems(); track $index) {\r\n @if (item === '\u2026') {\r\n <span class=\"dt-pager-ellipsis dt-hide-xs\">\u2026</span>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-chip dt-hide-xs\"\r\n [class.dt-pager-chip--active]=\"item === page()\"\r\n (click)=\"goToPage(item)\"\r\n >\r\n {{ item }}\r\n </button>\r\n }\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-btn\"\r\n (click)=\"nextPage()\"\r\n [disabled]=\"page() === pageCount()\"\r\n aria-label=\"P\u00E1gina siguiente\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path fill=\"currentColor\" d=\"M12.6 12L8 7.4L9.4 6l6 6l-6 6L8 16.6z\" />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-btn dt-hide-sm\"\r\n (click)=\"goToPage(pageCount())\"\r\n [disabled]=\"page() === pageCount()\"\r\n aria-label=\"\u00DAltima p\u00E1gina\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M9.575 12L5 7.4L6.4 6l6 6l-6 6L5 16.6zm6.6 0L11.6 7.4L13 6l6 6l-6 6l-1.4-1.4z\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [".dt-pagination{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 12px;font-size:13px}.dt-page-info{white-space:nowrap;color:var(--xs-dark-gray)}.dt-rows{display:flex;align-items:center;gap:6px;color:var(--xs-dark-gray)}.dt-rows select{padding:6px 28px 6px 8px;border-radius:var(--radius-sm);border:1px solid var(--light-gray);background:var(--white);font-size:13px;color:var(--black)}.dt-pager{display:flex;align-items:center;gap:4px}.dt-pager-btn,.dt-pager-chip{min-width:28px;height:28px;border-radius:var(--radius-sm);border:1px solid var(--xs-light-gray);background:var(--white);cursor:pointer;font-size:13px;display:inline-flex;align-items:center;justify-content:center;line-height:1;padding:0}.dt-pager-btn:hover:not(:disabled),.dt-pager-chip:hover:not(:disabled){border-color:var(--dark-gray);background:var(--gray-white);color:var(--xs-dark-gray)}.dt-pager-chip--active{background:#3361fa;color:var(--white);border-color:var(--blue);font-weight:600}.dt-pager-chip--active:hover:not(:disabled){background:#3361fa;color:var(--white);border-color:var(--blue)}.dt-pager-btn:disabled,.dt-pager-chip:disabled{opacity:1;color:var(--disabled-text);background:var(--soft-white);border-color:var(--disabled);cursor:not-allowed}.dt-pager-ellipsis{padding:0 6px;color:var(--xs-dark-gray)}.dt-hide-xs,.dt-hide-sm,.dt-hide-md{display:inline-flex}.dt-show-xs{display:none}.dt-page-compact{white-space:nowrap;color:var(--xs-dark-gray)}@media(max-width:1200px){.dt-hide-md{display:none!important}}@media(max-width:900px){.dt-hide-sm{display:none!important}.dt-pagination{justify-content:center}}@media(max-width:640px){.dt-hide-xs{display:none!important}.dt-show-xs{display:inline-flex!important}.dt-pagination{gap:10px}.dt-pager{gap:8px}}\n"] }]
294
- }], propDecorators: { page: [{ type: i0.Input, args: [{ isSignal: true, alias: "page", required: false }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], pageCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageCount", required: false }] }], totalCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalCount", required: false }] }], pageSizeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSizeOptions", required: false }] }], pagerItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "pagerItems", required: false }] }], pageChange: [{ type: i0.Output, args: ["pageChange"] }], pageSizeChange: [{ type: i0.Output, args: ["pageSizeChange"] }] } });
390
+ args: [{ selector: 'simple-table', imports: [], template: "<div class=\"table-item\">\n <table class=\"simple-table\">\n <thead>\n <tr>\n @for (header of headers(); track header.key) {\n <th\n scope=\"col\"\n class=\"sortable\"\n [class.active]=\"sortState().key === header.key && sortState().direction !== 'none'\"\n (click)=\"sortBy(header.key)\"\n >\n <span class=\"th-content\">\n <span class=\"th-label\">{{ header.label }}</span>\n\n <!-- icono -->\n <span class=\"sort-icon\" aria-hidden=\"true\">\n @if (sortState().key !== header.key || sortState().direction === 'none') {\n <!-- doble flecha (neutral) -->\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n >\n <rect width=\"24\" height=\"24\" fill=\"none\" />\n <path\n fill=\"currentColor\"\n d=\"M12.53 3.47a.75.75 0 0 0-1.06 0l-4 4a.75.75 0 0 0 0 1.06h9.06a.75.75 0 0 0 0-1.06zm4 13.06a.75.75 0 0 0 0-1.06H7.47a.75.75 0 0 0 0 1.06l4 4a.75.75 0 0 0 1.06 0z\"\n />\n </svg>\n } @else if (sortState().direction === 'asc') {\n <!-- flecha arriba -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <rect width=\"24\" height=\"24\" fill=\"none\" />\n <path\n fill=\"currentColor\"\n d=\"M8.2 14q-.225 0-.362-.15T7.7 13.5q0-.05.15-.35l3.625-3.625q.125-.125.25-.175T12 9.3t.275.05t.25.175l3.625 3.625q.075.075.113.163t.037.187q0 .2-.137.35T15.8 14z\"\n />\n </svg>\n } @else {\n <!-- flecha abajo -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <rect width=\"24\" height=\"24\" fill=\"none\" />\n <path\n fill=\"currentColor\"\n d=\"M11.475 14.475L7.85 10.85q-.075-.075-.112-.162T7.7 10.5q0-.2.138-.35T8.2 10h7.6q.225 0 .363.15t.137.35q0 .05-.15.35l-3.625 3.625q-.125.125-.25.175T12 14.7t-.275-.05t-.25-.175\"\n />\n </svg>\n }\n </span>\n </span>\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @for (row of sortedData(); track row) {\n <tr>\n @for (header of headers(); track header.key) {\n <td [attr.data-label]=\"header.label\">\n {{ row[header.key] }}\n </td>\n }\n </tr>\n } @empty {\n <tr>\n <td class=\"empty\" [attr.colspan]=\"headers().length\">Datos no localizados.</td>\n </tr>\n }\n </tbody>\n </table>\n</div>\n", styles: [".table-item{background:#fff;overflow:hidden}.simple-table{width:100%;border-collapse:separate;border-spacing:0;font-size:14px}.simple-table thead th{text-align:left;padding:12px 10px;border-bottom:1px solid #e5e7eb;background:#f9fafb;font-weight:600;color:#111827;position:sticky;top:0;vertical-align:middle}.th-content{display:flex;align-items:center;justify-content:space-between;gap:8px}.th-label{line-height:1.2}.sort-icon{display:inline-flex;align-items:center;justify-content:center;height:1em;opacity:.85}.sort-icon svg{width:1em;height:1em;display:block}.simple-table tbody td{padding:12px 10px;border-bottom:1px solid #f3f4f6;color:#374151}.simple-table tbody tr:hover td{background:#fcfcfd}.simple-table tbody tr:last-child td{border-bottom:0}.simple-table th.sortable .sort-icon{color:#9ca3af}.simple-table th.sortable.active .sort-icon{color:#111827}.empty{text-align:center;padding:18px 10px;color:#6b7280}.simple-table th.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .2s ease}.simple-table th.sortable:hover{background:#f3f4f6}.simple-table th.active{color:#111827}@media(max-width:640px){.table-item{padding:10px}.simple-table thead{display:none}.simple-table,.simple-table tbody,.simple-table tr,.simple-table td{display:block;width:100%}.simple-table tbody tr{border:1px solid #e5e7eb;padding:8px 10px;margin-bottom:10px;background:#fff}.simple-table tbody td{border:0;border-bottom:1px dashed #eef2f7;padding:10px 0;display:grid;grid-template-columns:140px 1fr;gap:10px;align-items:start}.simple-table tbody td:last-child{border-bottom:0}.simple-table tbody td:before{content:attr(data-label);font-weight:600;color:#111827;opacity:.9}.simple-table tbody tr:has(.empty){border:0;padding:0;margin:0}.simple-table tbody td.empty{display:block;border:1px dashed #e5e7eb;border-radius:12px;padding:14px 12px;text-align:center;background:#fafafa}}\n"] }]
391
+ }], propDecorators: { headers: [{ type: i0.Input, args: [{ isSignal: true, alias: "headers", required: true }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }] } });
295
392
 
296
- class TableToolbarComponent {
297
- // Inputs
298
- enabled = input(true, ...(ngDevMode ? [{ debugName: "enabled" }] : []));
299
- query = input('', ...(ngDevMode ? [{ debugName: "query" }] : []));
300
- placeholder = input('Buscar...', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
301
- showClear = input(true, ...(ngDevMode ? [{ debugName: "showClear" }] : []));
302
- // Outputs
303
- queryChange = output();
304
- clear = output();
305
- onInput(value) {
306
- this.queryChange.emit(value);
307
- }
308
- onClear() {
309
- this.clear.emit();
393
+ class TableModalImageComponent {
394
+ open = input(false, ...(ngDevMode ? [{ debugName: "open" }] : []));
395
+ src = input('', ...(ngDevMode ? [{ debugName: "src" }] : []));
396
+ alt = input('', ...(ngDevMode ? [{ debugName: "alt" }] : []));
397
+ close = output();
398
+ onClose() {
399
+ this.close.emit();
310
400
  }
311
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: TableToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
312
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: TableToolbarComponent, isStandalone: true, selector: "table-toolbar", inputs: { enabled: { classPropertyName: "enabled", publicName: "enabled", isSignal: true, isRequired: false, transformFunction: null }, query: { classPropertyName: "query", publicName: "query", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, showClear: { classPropertyName: "showClear", publicName: "showClear", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { queryChange: "queryChange", clear: "clear" }, ngImport: i0, template: "@if (enabled()) {\r\n <div class=\"dt-toolbar\">\r\n <input\r\n class=\"dt-input\"\r\n type=\"text\"\r\n [placeholder]=\"placeholder()\"\r\n [value]=\"query()\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n />\r\n\r\n @if (showClear()) {\r\n <button type=\"button\" class=\"dt-btn\" (click)=\"onClear()\">\r\n Limpiar\r\n </button>\r\n }\r\n </div>\r\n}\r\n", styles: [".dt-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px}.dt-input{width:100%;max-width:360px;padding:8px 10px;border-radius:var(--radius-sm);border:var(--border);outline:none}.dt-input:focus{box-shadow:0 0 0 3px #2563eb26}.dt-btn{padding:8px 10px;border-radius:var(--radius-sm);border:var(--border);background:var(--white);cursor:pointer}.dt-btn:hover{filter:brightness(.98)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
401
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: TableModalImageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
402
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: TableModalImageComponent, isStandalone: true, selector: "table-modal-image", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, src: { classPropertyName: "src", publicName: "src", isSignal: true, isRequired: false, transformFunction: null }, alt: { classPropertyName: "alt", publicName: "alt", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { close: "close" }, ngImport: i0, template: "@if (open()) {\r\n <div class=\"dt-modal-backdrop\" (click)=\"onClose()\">\r\n <div class=\"dt-modal\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"dt-modal-header\">\r\n <span class=\"dt-modal-title\">{{ alt() }}</span>\r\n <button type=\"button\" class=\"dt-btn\" (click)=\"onClose()\">Cerrar</button>\r\n </div>\r\n\r\n <div class=\"dt-modal-body\">\r\n <img class=\"dt-modal-img\" [src]=\"src()\" [alt]=\"alt()\" />\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n", styles: [".dt-modal-backdrop{position:fixed;inset:0;background:#0000008c;display:flex;justify-content:center;align-items:center;padding:18px;z-index:9999}.dt-modal{width:min(900px,95vw);max-height:90vh;background:var(--white);border-radius:var(--radius-md);border:var(--border);overflow:hidden;display:flex;flex-direction:column}.dt-modal-header{padding:12px;border-bottom:var(--border);display:flex;justify-content:space-between;align-items:center;background:var(--gray-white)}.dt-modal-title{font-weight:600;color:var(--black);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dt-modal-body{padding:12px;overflow:auto}.dt-modal-img{width:100%;height:auto;border-radius:var(--radius-sm)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
313
403
  }
314
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: TableToolbarComponent, decorators: [{
404
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: TableModalImageComponent, decorators: [{
315
405
  type: Component,
316
- args: [{ selector: 'table-toolbar', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (enabled()) {\r\n <div class=\"dt-toolbar\">\r\n <input\r\n class=\"dt-input\"\r\n type=\"text\"\r\n [placeholder]=\"placeholder()\"\r\n [value]=\"query()\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n />\r\n\r\n @if (showClear()) {\r\n <button type=\"button\" class=\"dt-btn\" (click)=\"onClear()\">\r\n Limpiar\r\n </button>\r\n }\r\n </div>\r\n}\r\n", styles: [".dt-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px}.dt-input{width:100%;max-width:360px;padding:8px 10px;border-radius:var(--radius-sm);border:var(--border);outline:none}.dt-input:focus{box-shadow:0 0 0 3px #2563eb26}.dt-btn{padding:8px 10px;border-radius:var(--radius-sm);border:var(--border);background:var(--white);cursor:pointer}.dt-btn:hover{filter:brightness(.98)}\n"] }]
317
- }], propDecorators: { enabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "enabled", required: false }] }], query: [{ type: i0.Input, args: [{ isSignal: true, alias: "query", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], queryChange: [{ type: i0.Output, args: ["queryChange"] }], clear: [{ type: i0.Output, args: ["clear"] }] } });
406
+ args: [{ selector: 'table-modal-image', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (open()) {\r\n <div class=\"dt-modal-backdrop\" (click)=\"onClose()\">\r\n <div class=\"dt-modal\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"dt-modal-header\">\r\n <span class=\"dt-modal-title\">{{ alt() }}</span>\r\n <button type=\"button\" class=\"dt-btn\" (click)=\"onClose()\">Cerrar</button>\r\n </div>\r\n\r\n <div class=\"dt-modal-body\">\r\n <img class=\"dt-modal-img\" [src]=\"src()\" [alt]=\"alt()\" />\r\n </div>\r\n </div>\r\n </div>\r\n}\r\n", styles: [".dt-modal-backdrop{position:fixed;inset:0;background:#0000008c;display:flex;justify-content:center;align-items:center;padding:18px;z-index:9999}.dt-modal{width:min(900px,95vw);max-height:90vh;background:var(--white);border-radius:var(--radius-md);border:var(--border);overflow:hidden;display:flex;flex-direction:column}.dt-modal-header{padding:12px;border-bottom:var(--border);display:flex;justify-content:space-between;align-items:center;background:var(--gray-white)}.dt-modal-title{font-weight:600;color:var(--black);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dt-modal-body{padding:12px;overflow:auto}.dt-modal-img{width:100%;height:auto;border-radius:var(--radius-sm)}\n"] }]
407
+ }], propDecorators: { open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], src: [{ type: i0.Input, args: [{ isSignal: true, alias: "src", required: false }] }], alt: [{ type: i0.Input, args: [{ isSignal: true, alias: "alt", required: false }] }], close: [{ type: i0.Output, args: ["close"] }] } });
318
408
 
319
- class AdvancedTable {
409
+ const SVG_ICONS = {
410
+ edit: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5 21q-.825 0-1.412-.587T3 19V5q0-.825.588-1.412T5 3h8.925l-2 2H5v14h14v-6.95l2-2V19q0 .825-.587 1.413T19 21zm4-6v-4.25l9.175-9.175q.3-.3.675-.45t.75-.15q.4 0 .763.15t.662.45L22.425 3q.275.3.425.663T23 4.4t-.137.738t-.438.662L13.25 15zM21.025 4.4l-1.4-1.4zM11 13h1.4l5.8-5.8l-.7-.7l-.725-.7L11 11.575zm6.5-6.5l-.725-.7zl.7.7z"/></svg>',
411
+ delete: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M7 21q-.825 0-1.412-.587T5 19V6H4V4h5V3h6v1h5v2h-1v13q0 .825-.587 1.413T17 21zM17 6H7v13h10zM9 17h2V8H9zm4 0h2V8h-2zM7 6v13z"/></svg>',
412
+ open: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 14 14"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"><path d="M7 3.625c-4.187 0-5.945 3.766-5.945 3.844S2.813 11.312 7 11.312s5.945-3.765 5.945-3.843S11.187 3.625 7 3.625M2.169 5.813L.61 4.252m4.525-.354L4.5 1.843m7.331 3.97l1.559-1.56m-4.525-.355L9.5 1.843"/><path d="M5.306 7.081a1.738 1.738 0 1 0 3.388.776a1.738 1.738 0 1 0-3.388-.776"/></g></svg>',
413
+ copy: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M9 18q-.825 0-1.412-.587T7 16V4q0-.825.588-1.412T9 2h9q.825 0 1.413.588T20 4v12q0 .825-.587 1.413T18 18zm-4 4q-.825 0-1.412-.587T3 20V6h2v14h11v2z"/></svg>',
414
+ };
415
+
416
+ const TIME_ZONES = {
417
+ // AFRICA
418
+ CAIRO: { city: 'Cairo', timeZone: 'Africa/Cairo', name: 'Egypt', currency: 'EGP', locale: 'ar-EG', utcOffset: +2 },
419
+ CASABLANCA: { city: 'Casablanca', timeZone: 'Africa/Casablanca', name: 'Morocco', currency: 'MAD', locale: 'ar-MA', utcOffset: 0 },
420
+ JOHANNESBURG: { city: 'Johannesburg', timeZone: 'Africa/Johannesburg', name: 'South Africa', currency: 'ZAR', locale: 'en-ZA', utcOffset: +2 },
421
+ // AMERICA
422
+ BUENOS_AIRES: { city: 'Buenos Aires', timeZone: 'America/Argentina/Buenos_Aires', name: 'Argentina', currency: 'ARS', locale: 'es-AR', utcOffset: -3 },
423
+ SAO_PAULO: { city: 'Sao Paulo', timeZone: 'America/Sao_Paulo', name: 'Brazil', currency: 'BRL', locale: 'pt-BR', utcOffset: -3 },
424
+ TORONTO: { city: 'Toronto', timeZone: 'America/Toronto', name: 'Canada', currency: 'CAD', locale: 'en-CA', utcOffset: -5 },
425
+ VANCOUVER: { city: 'Vancouver', timeZone: 'America/Vancouver', name: 'Canada (Pacific)', currency: 'CAD', locale: 'en-CA', utcOffset: -8 },
426
+ BOGOTA: { city: 'Bogota', timeZone: 'America/Bogota', name: 'Colombia', currency: 'COP', locale: 'es-CO', utcOffset: -5 },
427
+ CANCUN: { city: 'Cancun', timeZone: 'America/Cancun', name: 'Mexico (Quintana Roo)', currency: 'MXN', locale: 'es-MX', utcOffset: -5 },
428
+ MEXICO_CITY: { city: 'Mexico City', timeZone: 'America/Mexico_City', name: 'Mexico', currency: 'MXN', locale: 'es-MX', utcOffset: -6 },
429
+ TIJUANA: { city: 'Tijuana', timeZone: 'America/Tijuana', name: 'Mexico (Pacific)', currency: 'MXN', locale: 'es-MX', utcOffset: -8 },
430
+ LIMA: { city: 'Lima', timeZone: 'America/Lima', name: 'Peru', currency: 'PEN', locale: 'es-PE', utcOffset: -5 },
431
+ SANTIAGO: { city: 'Santiago', timeZone: 'America/Santiago', name: 'Chile', currency: 'CLP', locale: 'es-CL', utcOffset: -4 },
432
+ CHICAGO: { city: 'Chicago', timeZone: 'America/Chicago', name: 'United States (Central)', currency: 'USD', locale: 'en-US', utcOffset: -6 },
433
+ DENVER: { city: 'Denver', timeZone: 'America/Denver', name: 'United States (Mountain)', currency: 'USD', locale: 'en-US', utcOffset: -7 },
434
+ LOS_ANGELES: { city: 'Los Angeles', timeZone: 'America/Los_Angeles', name: 'United States (Pacific)', currency: 'USD', locale: 'en-US', utcOffset: -8 },
435
+ NEW_YORK: { city: 'New York', timeZone: 'America/New_York', name: 'United States (Eastern)', currency: 'USD', locale: 'en-US', utcOffset: -5 },
436
+ // ASIA
437
+ SHANGHAI: { city: 'Shanghai', timeZone: 'Asia/Shanghai', name: 'China', currency: 'CNY', locale: 'zh-CN', utcOffset: +8 },
438
+ KOLKATA: { city: 'Kolkata', timeZone: 'Asia/Kolkata', name: 'India', currency: 'INR', locale: 'en-IN', utcOffset: +5.5 },
439
+ TOKYO: { city: 'Tokyo', timeZone: 'Asia/Tokyo', name: 'Japan', currency: 'JPY', locale: 'ja-JP', utcOffset: +9 },
440
+ SEOUL: { city: 'Seoul', timeZone: 'Asia/Seoul', name: 'South Korea', currency: 'KRW', locale: 'ko-KR', utcOffset: +9 },
441
+ DUBAI: { city: 'Dubai', timeZone: 'Asia/Dubai', name: 'United Arab Emirates', currency: 'AED', locale: 'ar-AE', utcOffset: +4 },
442
+ // EUROPE
443
+ BERLIN: { city: 'Berlin', timeZone: 'Europe/Berlin', name: 'Germany', currency: 'EUR', locale: 'de-DE', utcOffset: +1 },
444
+ PARIS: { city: 'Paris', timeZone: 'Europe/Paris', name: 'France', currency: 'EUR', locale: 'fr-FR', utcOffset: +1 },
445
+ ROME: { city: 'Rome', timeZone: 'Europe/Rome', name: 'Italy', currency: 'EUR', locale: 'it-IT', utcOffset: +1 },
446
+ MADRID: { city: 'Madrid', timeZone: 'Europe/Madrid', name: 'Spain', currency: 'EUR', locale: 'es-ES', utcOffset: +1 },
447
+ ZURICH: { city: 'Zurich', timeZone: 'Europe/Zurich', name: 'Switzerland', currency: 'CHF', locale: 'de-CH', utcOffset: +1 },
448
+ LONDON: { city: 'London', timeZone: 'Europe/London', name: 'United Kingdom', currency: 'GBP', locale: 'en-GB', utcOffset: 0 },
449
+ // OCEANIA
450
+ SYDNEY: { city: 'Sydney', timeZone: 'Australia/Sydney', name: 'Australia', currency: 'AUD', locale: 'en-AU', utcOffset: +10 },
451
+ AUCKLAND: { city: 'Auckland', timeZone: 'Pacific/Auckland', name: 'New Zealand', currency: 'NZD', locale: 'en-NZ', utcOffset: +12 },
452
+ };
453
+
454
+ const TABLE_I18N_EN = {
455
+ noData: 'No data available',
456
+ rowsPerPage: 'Rows per page',
457
+ search: 'Search',
458
+ clear: 'Clear',
459
+ actions: 'Actions',
460
+ previous: 'Previous',
461
+ next: 'Next',
462
+ showing: (from, to, total) => `Showing ${from}–${to} of ${total}`,
463
+ filter: 'Filter by',
464
+ empty: 'No results found.',
465
+ seeImage: 'See image',
466
+ };
467
+ const TABLE_I18N_ES = {
468
+ noData: 'No hay información disponible',
469
+ rowsPerPage: 'Filas por página',
470
+ search: 'Buscar',
471
+ clear: 'Limpiar',
472
+ actions: 'Acciones',
473
+ previous: 'Anterior',
474
+ next: 'Siguiente',
475
+ showing: (from, to, total) => `Mostrando ${from}–${to} de ${total}`,
476
+ filter: 'Filtrar por',
477
+ empty: 'No se encontraron resultados.',
478
+ seeImage: 'Ver imagen',
479
+ };
480
+ const TABLE_I18N_BY_LANG = {
481
+ EN: TABLE_I18N_EN,
482
+ ES: TABLE_I18N_ES,
483
+ };
484
+ const TABLE_LANG_DEFAULT = 'EN';
485
+ const TABLE_I18N_DEFAULT = TABLE_I18N_EN;
486
+
487
+ class TableGridComponent {
488
+ sanitizer = inject(DomSanitizer);
320
489
  // Inputs
490
+ config = input({}, ...(ngDevMode ? [{ debugName: "config" }] : []));
321
491
  columns = input([], ...(ngDevMode ? [{ debugName: "columns" }] : []));
322
- data = input([], ...(ngDevMode ? [{ debugName: "data" }] : []));
323
- config = input({
324
- globalSearch: true,
325
- columnFilters: false,
326
- selectable: false,
327
- selectionMode: 'multiple',
328
- pagination: { enabled: false, pageSize: 10, pageSizeOptions: [10, 25, 50] },
329
- scroll: { mode: 'none' },
330
- emptyText: 'Sin resultados',
331
- rowIdKey: 'id',
332
- globalSearchVisibleOnly: true,
333
- }, ...(ngDevMode ? [{ debugName: "config" }] : []));
492
+ rows = input([], ...(ngDevMode ? [{ debugName: "rows" }] : []));
493
+ gridTemplateColumns = input('', ...(ngDevMode ? [{ debugName: "gridTemplateColumns" }] : []));
494
+ columnQueries = input({}, ...(ngDevMode ? [{ debugName: "columnQueries" }] : []));
495
+ sortState = input(null, ...(ngDevMode ? [{ debugName: "sortState" }] : []));
496
+ selectedIdsSet = input(new Set(), ...(ngDevMode ? [{ debugName: "selectedIdsSet" }] : []));
497
+ timeZone = input(TIME_ZONES.MEXICO_CITY, ...(ngDevMode ? [{ debugName: "timeZone" }] : []));
498
+ i18n = input(TABLE_I18N_DEFAULT, ...(ngDevMode ? [{ debugName: "i18n" }] : []));
334
499
  // Outputs
500
+ headerSort = output();
501
+ columnQueryChange = output();
335
502
  rowClick = output();
336
- selectionChange = output();
503
+ toggleRow = output();
504
+ toggleAllOnPage = output();
505
+ openImage = output();
337
506
  actionClick = output();
338
- // Signals
339
- globalQuery = signal('', ...(ngDevMode ? [{ debugName: "globalQuery" }] : []));
340
- columnQueries = signal({}, ...(ngDevMode ? [{ debugName: "columnQueries" }] : []));
341
- sortState = signal(null, ...(ngDevMode ? [{ debugName: "sortState" }] : []));
342
- page = signal(1, ...(ngDevMode ? [{ debugName: "page" }] : []));
343
- visibleCount = signal(0, ...(ngDevMode ? [{ debugName: "visibleCount" }] : []));
344
- modalOpen = signal(false, ...(ngDevMode ? [{ debugName: "modalOpen" }] : []));
345
- modalImageSrc = signal('', ...(ngDevMode ? [{ debugName: "modalImageSrc" }] : []));
346
- modalImageAlt = signal('', ...(ngDevMode ? [{ debugName: "modalImageAlt" }] : []));
347
- selectedIdsSet = signal(new Set(), ...(ngDevMode ? [{ debugName: "selectedIdsSet" }] : []));
348
- pageSize = signal(this.config().pagination?.pageSize ?? 10, ...(ngDevMode ? [{ debugName: "pageSize" }] : []));
349
- // Computed Data
350
- selectedIds = computed(() => Array.from(this.selectedIdsSet()), ...(ngDevMode ? [{ debugName: "selectedIds" }] : []));
351
- visibleColumns = computed(() => (this.columns() ?? []).filter((c) => !c.hidden), ...(ngDevMode ? [{ debugName: "visibleColumns" }] : []));
507
+ bodyScroll = output();
508
+ // Derived
352
509
  showSelectionColumn = computed(() => !!this.config().selectable, ...(ngDevMode ? [{ debugName: "showSelectionColumn" }] : []));
353
- gridTemplateColumns = computed(() => {
354
- const cols = [];
355
- if (this.showSelectionColumn())
356
- cols.push('48px'); // selección
357
- for (const c of this.visibleColumns()) {
358
- cols.push(this.sizeToCss(c.size));
359
- }
360
- return cols.join(' ');
361
- }, ...(ngDevMode ? [{ debugName: "gridTemplateColumns" }] : []));
362
- filteredData = computed(() => {
363
- const rows = this.data() ?? [];
364
- const colsAll = this.columns() ?? [];
365
- const colsVisible = this.visibleColumns();
366
- const config = this.config();
367
- const globalQuery = this.globalQuery().trim().toLowerCase();
368
- const columnQueries = this.columnQueries();
369
- const colsForGlobal = (config.globalSearchVisibleOnly ?? true) ? colsVisible : colsAll.filter((c) => !c.hidden);
370
- return rows.filter((row) => {
371
- // column filters (AND)
372
- for (const [key, q] of Object.entries(columnQueries)) {
373
- const query = (q ?? '').trim().toLowerCase();
374
- if (!query)
375
- continue;
376
- const col = colsAll.find((c) => c.key === key);
377
- if (!col)
378
- continue;
379
- const value = this.getCellValue(row, col);
380
- const text = this.valueToSearchableText(value, col.type, row).toLowerCase();
381
- if (!text.includes(query))
382
- return false;
510
+ // Helpers
511
+ getRowIdKey() {
512
+ return this.config().rowIdKey ?? 'id';
513
+ }
514
+ getRowId(row) {
515
+ const getter = this.config().rowIdGetter;
516
+ if (getter)
517
+ return getter(row);
518
+ const key = this.getRowIdKey();
519
+ return row?.[key];
520
+ }
521
+ isSelected(row) {
522
+ return this.selectedIdsSet().has(this.getRowId(row));
523
+ }
524
+ isAllSelectedOnPage() {
525
+ const rows = this.rows();
526
+ if (!rows.length)
527
+ return false;
528
+ const set = this.selectedIdsSet();
529
+ return rows.every((r) => set.has(this.getRowId(r)));
530
+ }
531
+ getSortIcon(colKey) {
532
+ const sorted = this.sortState();
533
+ if (!sorted || sorted.key !== colKey)
534
+ return '↕';
535
+ return sorted.dir === 'asc' ? '↑' : '↓';
536
+ }
537
+ getDisplayText(row, column) {
538
+ const value = this.getCellValue(row, column);
539
+ if (column.formatter) {
540
+ try {
541
+ return column.formatter(value, row);
383
542
  }
384
- // global search (OR across columns)
385
- if (config.globalSearch && globalQuery) {
386
- let any = false;
387
- for (const col of colsForGlobal) {
388
- const value = this.getCellValue(row, col);
389
- const text = this.valueToSearchableText(value, col.type, row).toLowerCase();
390
- if (text.includes(globalQuery)) {
391
- any = true;
392
- break;
393
- }
394
- }
395
- if (!any)
396
- return false;
543
+ catch {
544
+ return '';
397
545
  }
398
- return true;
399
- });
400
- }, ...(ngDevMode ? [{ debugName: "filteredData" }] : []));
401
- sortedData = computed(() => {
402
- const data = [...this.filteredData()];
403
- const sort = this.sortState();
404
- if (!sort)
405
- return data;
406
- const col = (this.columns() ?? []).find((c) => c.key === sort.key);
407
- if (!col)
408
- return data;
409
- const dir = sort.dir === 'asc' ? 1 : -1;
410
- data.sort((a, b) => {
411
- const va = this.getCellValue(a, col);
412
- const vb = this.getCellValue(b, col);
413
- return dir * this.compareValues(va, vb, col.type);
414
- });
415
- return data;
416
- }, ...(ngDevMode ? [{ debugName: "sortedData" }] : []));
417
- pagedData = computed(() => {
418
- const config = this.config();
419
- const rows = this.sortedData();
420
- const fixedN = config.fixedRowCount;
421
- const cappedRows = typeof fixedN === 'number' && fixedN > 0 ? rows.slice(0, fixedN) : rows;
422
- const mode = config.scroll?.mode ?? 'none';
423
- if (mode === 'infinite') {
424
- return cappedRows.slice(0, this.visibleCount());
425
- }
426
- // pagination
427
- if (config.pagination?.enabled) {
428
- const size = this.pageSize();
429
- const page = this.page();
430
- const start = (page - 1) * size;
431
- return cappedRows.slice(start, start + size);
432
- }
433
- return cappedRows;
434
- }, ...(ngDevMode ? [{ debugName: "pagedData" }] : []));
435
- pagerItems = computed(() => {
436
- const config = this.config();
437
- if (!config.pagination?.enabled)
438
- return [];
439
- const totalPages = this.pageCount();
440
- const current = this.page();
441
- if (totalPages <= 1)
442
- return [];
443
- if (totalPages <= 7) {
444
- return Array.from({ length: totalPages }, (_, i) => i + 1);
445
- }
446
- const items = [];
447
- const first = 1;
448
- const last = totalPages;
449
- const around = 1;
450
- const start = Math.max(2, current - around);
451
- const end = Math.min(last - 1, current + around);
452
- items.push(first);
453
- if (start > 2)
454
- items.push('…');
455
- for (let p = start; p <= end; p++) {
456
- items.push(p);
457
- }
458
- if (end < last - 1)
459
- items.push('…');
460
- items.push(last);
461
- return items;
462
- }, ...(ngDevMode ? [{ debugName: "pagerItems" }] : []));
463
- totalCount = computed(() => this.sortedData().length, ...(ngDevMode ? [{ debugName: "totalCount" }] : []));
464
- pageCount = computed(() => {
465
- const config = this.config();
466
- if (!config.pagination?.enabled)
467
- return 1;
468
- return Math.max(1, Math.ceil(this.totalCount() / this.pageSize()));
469
- }, ...(ngDevMode ? [{ debugName: "pageCount" }] : []));
470
- isAllSelectedOnPage = computed(() => {
471
- if (!this.showSelectionColumn())
472
- return false;
473
- const ids = this.pagedData().map((r) => this.getRowId(r));
474
- if (ids.length === 0)
475
- return false;
476
- const set = this.selectedIdsSet();
477
- return ids.every((id) => set.has(id));
478
- }, ...(ngDevMode ? [{ debugName: "isAllSelectedOnPage" }] : []));
479
- // Effects
480
- infiniteScrollEffect = effect(() => {
481
- const config = this.config();
482
- const mode = config.scroll?.mode ?? 'none';
483
- const batch = config.scroll?.batchSize ?? 50;
484
- if (mode === 'infinite') {
485
- this.visibleCount.set(batch);
486
- }
487
- else {
488
- this.visibleCount.set(Number.MAX_SAFE_INTEGER);
489
- }
490
- }, ...(ngDevMode ? [{ debugName: "infiniteScrollEffect" }] : []));
491
- selectionDataEffect = effect(() => {
492
- this.selectionChange.emit(this.selectedIds());
493
- }, ...(ngDevMode ? [{ debugName: "selectionDataEffect" }] : []));
494
- pagesCountEffect = effect(() => {
495
- const totalPages = this.pageCount();
496
- if (this.page() > totalPages) {
497
- this.page.set(totalPages);
498
- }
499
- }, ...(ngDevMode ? [{ debugName: "pagesCountEffect" }] : []));
500
- // UI Actions
501
- onHeaderClickSort(col) {
502
- if (!col.sortable)
503
- return;
504
- const current = this.sortState();
505
- if (!current || current.key !== col.key) {
506
- this.sortState.set({ key: col.key, dir: 'asc' });
507
- }
508
- else if (current.dir === 'asc') {
509
- this.sortState.set({ key: col.key, dir: 'desc' });
510
546
  }
511
- else {
512
- this.sortState.set(null);
547
+ switch (column.type) {
548
+ case 'string':
549
+ return value == null ? '' : String(value);
550
+ case 'integer':
551
+ case 'decimal':
552
+ case 'currency': {
553
+ const currencyValue = Number(value);
554
+ if (!Number.isFinite(currencyValue))
555
+ return value == null ? '' : String(value);
556
+ if (column.type === 'currency') {
557
+ try {
558
+ return new Intl.NumberFormat(this.timeZone().locale, {
559
+ style: 'currency',
560
+ currency: column.options?.currency ?? this.timeZone().currency,
561
+ maximumFractionDigits: 2,
562
+ }).format(currencyValue);
563
+ }
564
+ catch {
565
+ return String(currencyValue);
566
+ }
567
+ }
568
+ return String(currencyValue);
569
+ }
570
+ case 'date':
571
+ case 'datetime': {
572
+ const dateTime = value instanceof Date ? value : new Date(String(value));
573
+ if (Number.isNaN(dateTime.getTime()))
574
+ return value == null ? '' : String(value);
575
+ const locale = this.timeZone().locale;
576
+ return column.type === 'datetime'
577
+ ? dateTime.toLocaleString(locale)
578
+ : dateTime.toLocaleDateString(locale);
579
+ }
580
+ case 'boolean':
581
+ return value ? 'Sí' : 'No';
582
+ default:
583
+ return value == null ? '' : String(value);
513
584
  }
514
- this.page.set(1);
515
585
  }
516
- onBodyScroll(event) {
517
- const config = this.config();
518
- if ((config.scroll?.mode ?? 'none') !== 'infinite')
519
- return;
520
- const el = event.target;
521
- const thresholdPx = 120;
522
- const nearBottom = el.scrollTop + el.clientHeight >= el.scrollHeight - thresholdPx;
523
- if (!nearBottom)
524
- return;
525
- const batch = config.scroll?.batchSize ?? 50;
526
- const next = Math.min(this.sortedData().length, this.visibleCount() + batch);
527
- this.visibleCount.set(next);
586
+ getImageSrc(row, col) {
587
+ return this.getCellString(row, col);
528
588
  }
529
- onPageSizeChange(size) {
530
- if (!Number.isFinite(size) || size <= 0)
531
- return;
532
- this.pageSize.set(size);
533
- this.page.set(1);
589
+ getImageAlt(row, col) {
590
+ const altFn = col.options?.image?.alt;
591
+ return altFn ? altFn(row) : col.label;
534
592
  }
535
- getCellValue(row, col) {
536
- try {
537
- return col.valueGetter ? col.valueGetter(row) : row?.[col.key];
538
- }
539
- catch {
540
- return undefined;
541
- }
593
+ getStatusClass(row, col) {
594
+ const raw = this.getCellString(row, col);
595
+ return col.options?.status?.classMap?.[raw] ?? '';
542
596
  }
543
- getRowId(row) {
544
- const config = this.config();
545
- if (config.rowIdGetter)
546
- return config.rowIdGetter(row);
547
- const key = config.rowIdKey ?? 'id';
548
- const value = row?.[key];
549
- return (value ?? JSON.stringify(row));
597
+ getLinkHref(row, col) {
598
+ const getter = col.options?.link?.hrefGetter;
599
+ return getter ? getter(row) : this.getCellString(row, col);
550
600
  }
551
- setGlobalQuery(query) {
552
- this.globalQuery.set(query ?? '');
553
- this.page.set(1);
554
- this.resetInfiniteIfNeeded();
601
+ getLinkLabel(row, col) {
602
+ const getter = col.options?.link?.labelGetter;
603
+ if (getter)
604
+ return getter(row);
605
+ const cellValue = this.getCellValue(row, col);
606
+ return cellValue == null ? '' : String(cellValue);
555
607
  }
556
- setColumnQuery(key, query) {
557
- const next = { ...this.columnQueries() };
558
- next[key] = query ?? '';
559
- this.columnQueries.set(next);
560
- this.page.set(1);
561
- this.resetInfiniteIfNeeded();
608
+ getColumnActions(col) {
609
+ return col.actions ?? [];
562
610
  }
563
- clearFilters() {
564
- this.globalQuery.set('');
565
- this.columnQueries.set({});
566
- this.page.set(1);
567
- this.resetInfiniteIfNeeded();
611
+ isActionVisible(action, row) {
612
+ return action.visible ? action.visible(row) : true;
613
+ }
614
+ isActionDisabled(action, row) {
615
+ return action.disabled ? action.disabled(row) : false;
616
+ }
617
+ emitAction(action, row, event) {
618
+ event.stopPropagation();
619
+ this.actionClick.emit({ actionId: action.id, row });
620
+ }
621
+ getActionSvg(action) {
622
+ const key = (action.icon ?? action.id).toLowerCase();
623
+ return this.sanitizer.bypassSecurityTrustHtml(SVG_ICONS[key] ?? '*');
624
+ }
625
+ onHeaderClickSort(column) {
626
+ if (!column.sortable)
627
+ return;
628
+ this.headerSort.emit(column);
629
+ }
630
+ onColumnQueryInput(key, value) {
631
+ this.columnQueryChange.emit({ key, value });
568
632
  }
569
633
  onRowClick(row) {
570
634
  this.rowClick.emit(row);
571
635
  }
572
- toggleRowSelection(row) {
573
- const config = this.config();
574
- if (!config.selectable)
575
- return;
576
- const id = this.getRowId(row);
577
- const mode = config.selectionMode ?? 'multiple';
578
- const set = new Set(this.selectedIdsSet());
579
- if (mode === 'single') {
580
- if (set.has(id))
581
- set.clear();
582
- else {
583
- set.clear();
584
- set.add(id);
636
+ onToggleRow(row) {
637
+ this.toggleRow.emit(row);
638
+ }
639
+ onToggleAllOnPage() {
640
+ this.toggleAllOnPage.emit();
641
+ }
642
+ onOpenImage(src, alt, event) {
643
+ event.stopPropagation();
644
+ this.openImage.emit({ src, alt });
645
+ }
646
+ onBodyScroll(event) {
647
+ this.bodyScroll.emit(event);
648
+ }
649
+ getCellValue(row, col) {
650
+ if (col.valueGetter) {
651
+ try {
652
+ return col.valueGetter(row);
653
+ }
654
+ catch {
655
+ return null;
585
656
  }
586
657
  }
587
- else {
588
- if (set.has(id))
589
- set.delete(id);
590
- else
591
- set.add(id);
592
- }
593
- this.selectedIdsSet.set(set);
658
+ return row?.[col.key];
594
659
  }
595
- toggleSelectAllOnPage() {
596
- const config = this.config();
597
- if (!config.selectable)
598
- return;
599
- if ((config.selectionMode ?? 'multiple') === 'single')
600
- return;
601
- const ids = this.pagedData().map((r) => this.getRowId(r));
602
- const set = new Set(this.selectedIdsSet());
603
- const allSelected = ids.every((id) => set.has(id));
604
- if (allSelected)
605
- ids.forEach((id) => set.delete(id));
606
- else
607
- ids.forEach((id) => set.add(id));
608
- this.selectedIdsSet.set(set);
660
+ getCellString(row, col) {
661
+ const value = this.getCellValue(row, col);
662
+ return value == null ? '' : String(value);
663
+ }
664
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: TableGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
665
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: TableGridComponent, isStandalone: true, selector: "table-grid", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, gridTemplateColumns: { classPropertyName: "gridTemplateColumns", publicName: "gridTemplateColumns", isSignal: true, isRequired: false, transformFunction: null }, columnQueries: { classPropertyName: "columnQueries", publicName: "columnQueries", isSignal: true, isRequired: false, transformFunction: null }, sortState: { classPropertyName: "sortState", publicName: "sortState", isSignal: true, isRequired: false, transformFunction: null }, selectedIdsSet: { classPropertyName: "selectedIdsSet", publicName: "selectedIdsSet", isSignal: true, isRequired: false, transformFunction: null }, timeZone: { classPropertyName: "timeZone", publicName: "timeZone", isSignal: true, isRequired: false, transformFunction: null }, i18n: { classPropertyName: "i18n", publicName: "i18n", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { headerSort: "headerSort", columnQueryChange: "columnQueryChange", rowClick: "rowClick", toggleRow: "toggleRow", toggleAllOnPage: "toggleAllOnPage", openImage: "openImage", actionClick: "actionClick", bodyScroll: "bodyScroll" }, ngImport: i0, template: "<div class=\"dt-grid\">\r\n <div class=\"dt-xscroll\">\r\n <!-- Header -->\r\n <div class=\"dt-row dt-header\" [style.gridTemplateColumns]=\"gridTemplateColumns()\">\r\n @if (showSelectionColumn()) {\r\n <div class=\"dt-cell dt-cell--header dt-cell--center dt-select-col\">\r\n @if ((config().selectionMode ?? 'multiple') === 'multiple') {\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isAllSelectedOnPage()\"\r\n (change)=\"onToggleAllOnPage()\"\r\n aria-label=\"Select all\"\r\n />\r\n }\r\n </div>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <div\r\n class=\"dt-cell dt-cell--header\"\r\n [class.dt-cell--sortable]=\"!!col.sortable\"\r\n [attr.data-align]=\"col.align ?? 'left'\"\r\n (click)=\"onHeaderClickSort(col)\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n >\r\n <span class=\"dt-header-label\">{{ col.label }}</span>\r\n @if (col.sortable) {\r\n <span class=\"dt-sort\">{{ getSortIcon(col.key) }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Filters row (under header) -->\r\n @if (config().columnFilters) {\r\n <div class=\"dt-row dt-filters\" [style.gridTemplateColumns]=\"gridTemplateColumns()\">\r\n @if (showSelectionColumn()) {\r\n <div class=\"dt-cell dt-cell--filter dt-select-col\"></div>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <div class=\"dt-cell dt-cell--filter\" [attr.data-align]=\"col.align ?? 'left'\">\r\n @if (col.filterable) {\r\n <input\r\n type=\"text\"\r\n [value]=\"columnQueries()[col.key] ?? null\"\r\n (input)=\"onColumnQueryInput(col.key, $any($event.target).value)\"\r\n [placeholder]=\"i18n().filter + ' ' + col.label\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Body -->\r\n <div\r\n class=\"dt-body\"\r\n [style.maxHeight.px]=\"config().scroll?.heightPx ?? null\"\r\n (scroll)=\"onBodyScroll($event)\"\r\n >\r\n @if (rows().length === 0) {\r\n <div class=\"dt-empty\">\r\n {{ config().emptyText ?? i18n().empty }}\r\n </div>\r\n } @else {\r\n @for (row of rows(); track getRowId(row)) {\r\n <div class=\"dt-row dt-data\" [style.gridTemplateColumns]=\"gridTemplateColumns()\">\r\n @if (showSelectionColumn()) {\r\n <div class=\"dt-cell dt-cell--center dt-select-col\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isSelected(row)\"\r\n (change)=\"onToggleRow(row)\"\r\n aria-label=\"Seleccionar fila\"\r\n />\r\n </div>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <div\r\n class=\"dt-cell\"\r\n [attr.data-align]=\"col.align ?? 'left'\"\r\n (click)=\"onRowClick(row)\"\r\n >\r\n @switch (col.type) {\r\n @case ('image') {\r\n @if ((col.options?.image?.hidden ?? false) === true) {\r\n <button\r\n type=\"button\"\r\n class=\"dt-link\"\r\n (click)=\"onOpenImage(getImageSrc(row, col), getImageAlt(row, col), $event)\"\r\n >\r\n {{ i18n().seeImage }}\r\n </button>\r\n } @else {\r\n <img\r\n class=\"dt-img\"\r\n [class.dt-img--full]=\"!!col.options?.image?.showFull\"\r\n [src]=\"getImageSrc(row, col)\"\r\n [alt]=\"getImageAlt(row, col)\"\r\n (click)=\"\r\n (col.options?.image?.openInModal ?? true) &&\r\n onOpenImage(getImageSrc(row, col), getImageAlt(row, col), $event)\r\n \"\r\n />\r\n }\r\n }\r\n\r\n @case ('status') {\r\n <span class=\"dt-badge\" [attr.data-variant]=\"getStatusClass(row, col)\">\r\n {{ getDisplayText(row, col) }}\r\n </span>\r\n }\r\n\r\n @case ('link') {\r\n <a\r\n class=\"dt-link\"\r\n [href]=\"getLinkHref(row, col)\"\r\n [target]=\"col.options?.link?.target ?? '_blank'\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n {{ getLinkLabel(row, col) }}\r\n </a>\r\n }\r\n\r\n @case ('actions') {\r\n <div class=\"dt-actions\">\r\n @for (action of getColumnActions(col); track action.id) {\r\n @if (isActionVisible(action, row)) {\r\n <button\r\n type=\"button\"\r\n class=\"dt-action-btn\"\r\n [class.dt-action--edit]=\"action.id === 'edit'\"\r\n [class.dt-action--delete]=\"action.id === 'delete'\"\r\n [class.dt-action--open]=\"action.id === 'open'\"\r\n [class.dt-action--copy]=\"action.id === 'copy'\"\r\n [disabled]=\"isActionDisabled(action, row)\"\r\n [title]=\"action.tooltip ?? action.label\"\r\n (click)=\"emitAction(action, row, $event)\"\r\n >\r\n @if ((action.render ?? 'icon') === 'text') {\r\n <span class=\"dt-action-text\">{{ action.label }}</span>\r\n } @else {\r\n <span class=\"dt-action-svg\" [innerHTML]=\"getActionSvg(action)\"></span>\r\n }\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n @default {\r\n <span class=\"dt-text\">{{ getDisplayText(row, col) }}</span>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".dt-grid{width:100%}.dt-row{display:grid;align-items:stretch;min-width:max-content}.dt-xscroll{overflow-x:auto;overflow-y:hidden}.dt-header{background:var(--gray-white);border-bottom:var(--border);font-weight:600;color:var(--black)}.dt-cell--header{-webkit-user-select:none;user-select:none}.dt-cell--sortable{cursor:pointer}.dt-filters{background:var(--xxs-light-gray);border-bottom:var(--border)}.dt-cell--filter{padding:8px 12px;font-size:10px}input{width:100%;padding:7px 8px;border:1px solid var(--light-gray);border-radius:var(--radius-sm);background:var(--white);color:var(--black);outline:none}input::placeholder{color:var(--xs-dark-gray);font-size:11px}input:focus{border-color:var(--blue);box-shadow:var(--focus-ring)}.dt-body{overflow-y:auto;overflow-x:hidden;min-width:max-content}@media(max-heicg:900px){.dt-body{max-height:none!important;overflow-y:visible!important;overflow-x:auto!important}}.dt-cell{padding:10px 12px;min-height:30px;border-bottom:1px solid var(--xxs-light-gray);display:flex;align-items:center;gap:8px;color:var(--black)}.dt-cell[data-align=left]{justify-content:flex-start;text-align:left}.dt-cell[data-align=center]{justify-content:center;text-align:center}.dt-cell[data-align=right]{justify-content:flex-end;text-align:right}.dt-cell--center,.dt-select-col{justify-content:center}.dt-header-label{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.dt-sort{margin-left:auto;font-size:12px;opacity:.7;color:var(--xs-dark-gray)}.dt-data:hover{background:var(--gray)}.dt-text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.dt-img{width:40px;height:40px;object-fit:cover;border-radius:var(--radius-sm);border:1px solid var(--xs-light-gray);cursor:pointer}.dt-img--full{width:100%;height:auto}.dt-link{color:var(--blue);text-decoration:none;background:transparent;border:none;cursor:pointer;padding:0;font:inherit}.dt-link:hover{text-decoration:underline}.dt-badge{padding:4px 10px;border-radius:999px;border:1px solid var(--xs-light-gray);font-size:12px;background:var(--xxs-light-gray)}.dt-badge[data-variant=success]{background:#208b6a1f;border-color:#208b6a59}.dt-badge[data-variant=warn]{background:#ffbc5733;border-color:#ffbc5773}.dt-badge[data-variant=error]{background:#e600181f;border-color:#e6001859}.dt-badge[data-variant=info]{background:#7390ec24;border-color:#7390ec59}.dt-empty{padding:18px 12px;color:var(--xs-dark-gray)}.dt-actions{display:inline-flex;align-items:center;gap:6px}.dt-action-svg{width:24px;height:24px;display:inline-flex}.dt-action-svg svg{width:24px;height:24px;color:inherit}.dt-action-btn{width:32px;height:32px;border:1px solid var(--xs-light-gray);border-radius:var(--radius-sm);background:var(--white);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--xs-dark-gray)}.dt-action-btn:hover:not(:disabled){background:var(--gray-white);border-color:var(--dark-gray)}.dt-action-btn.dt-action--edit{color:var(--blue)}.dt-action-btn.dt-action--edit:hover:not(:disabled){color:var(--white);background-color:var(--blue)}.dt-action-btn.dt-action--open{color:var(--blue-medium)}.dt-action-btn.dt-action--open:hover:not(:disabled){color:var(--blue-dark)}.dt-action-btn.dt-action--copy{color:var(--xs-dark-gray)}.dt-action-btn.dt-action--copy:hover:not(:disabled){color:var(--white);background-color:var(--xs-dark-gray)}.dt-action-btn.dt-action--delete{color:var(--red)}.dt-action-btn.dt-action--delete:hover:not(:disabled){color:var(--white);background-color:var(--red)}.dt-action-btn:disabled{color:var(--disabled-text);background:var(--soft-white);cursor:not-allowed}.dt-action-text{font-size:24px;padding:0 8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
666
+ }
667
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: TableGridComponent, decorators: [{
668
+ type: Component,
669
+ args: [{ selector: 'table-grid', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"dt-grid\">\r\n <div class=\"dt-xscroll\">\r\n <!-- Header -->\r\n <div class=\"dt-row dt-header\" [style.gridTemplateColumns]=\"gridTemplateColumns()\">\r\n @if (showSelectionColumn()) {\r\n <div class=\"dt-cell dt-cell--header dt-cell--center dt-select-col\">\r\n @if ((config().selectionMode ?? 'multiple') === 'multiple') {\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isAllSelectedOnPage()\"\r\n (change)=\"onToggleAllOnPage()\"\r\n aria-label=\"Select all\"\r\n />\r\n }\r\n </div>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <div\r\n class=\"dt-cell dt-cell--header\"\r\n [class.dt-cell--sortable]=\"!!col.sortable\"\r\n [attr.data-align]=\"col.align ?? 'left'\"\r\n (click)=\"onHeaderClickSort(col)\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n >\r\n <span class=\"dt-header-label\">{{ col.label }}</span>\r\n @if (col.sortable) {\r\n <span class=\"dt-sort\">{{ getSortIcon(col.key) }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Filters row (under header) -->\r\n @if (config().columnFilters) {\r\n <div class=\"dt-row dt-filters\" [style.gridTemplateColumns]=\"gridTemplateColumns()\">\r\n @if (showSelectionColumn()) {\r\n <div class=\"dt-cell dt-cell--filter dt-select-col\"></div>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <div class=\"dt-cell dt-cell--filter\" [attr.data-align]=\"col.align ?? 'left'\">\r\n @if (col.filterable) {\r\n <input\r\n type=\"text\"\r\n [value]=\"columnQueries()[col.key] ?? null\"\r\n (input)=\"onColumnQueryInput(col.key, $any($event.target).value)\"\r\n [placeholder]=\"i18n().filter + ' ' + col.label\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Body -->\r\n <div\r\n class=\"dt-body\"\r\n [style.maxHeight.px]=\"config().scroll?.heightPx ?? null\"\r\n (scroll)=\"onBodyScroll($event)\"\r\n >\r\n @if (rows().length === 0) {\r\n <div class=\"dt-empty\">\r\n {{ config().emptyText ?? i18n().empty }}\r\n </div>\r\n } @else {\r\n @for (row of rows(); track getRowId(row)) {\r\n <div class=\"dt-row dt-data\" [style.gridTemplateColumns]=\"gridTemplateColumns()\">\r\n @if (showSelectionColumn()) {\r\n <div class=\"dt-cell dt-cell--center dt-select-col\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"isSelected(row)\"\r\n (change)=\"onToggleRow(row)\"\r\n aria-label=\"Seleccionar fila\"\r\n />\r\n </div>\r\n }\r\n\r\n @for (col of columns(); track col.key) {\r\n <div\r\n class=\"dt-cell\"\r\n [attr.data-align]=\"col.align ?? 'left'\"\r\n (click)=\"onRowClick(row)\"\r\n >\r\n @switch (col.type) {\r\n @case ('image') {\r\n @if ((col.options?.image?.hidden ?? false) === true) {\r\n <button\r\n type=\"button\"\r\n class=\"dt-link\"\r\n (click)=\"onOpenImage(getImageSrc(row, col), getImageAlt(row, col), $event)\"\r\n >\r\n {{ i18n().seeImage }}\r\n </button>\r\n } @else {\r\n <img\r\n class=\"dt-img\"\r\n [class.dt-img--full]=\"!!col.options?.image?.showFull\"\r\n [src]=\"getImageSrc(row, col)\"\r\n [alt]=\"getImageAlt(row, col)\"\r\n (click)=\"\r\n (col.options?.image?.openInModal ?? true) &&\r\n onOpenImage(getImageSrc(row, col), getImageAlt(row, col), $event)\r\n \"\r\n />\r\n }\r\n }\r\n\r\n @case ('status') {\r\n <span class=\"dt-badge\" [attr.data-variant]=\"getStatusClass(row, col)\">\r\n {{ getDisplayText(row, col) }}\r\n </span>\r\n }\r\n\r\n @case ('link') {\r\n <a\r\n class=\"dt-link\"\r\n [href]=\"getLinkHref(row, col)\"\r\n [target]=\"col.options?.link?.target ?? '_blank'\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n {{ getLinkLabel(row, col) }}\r\n </a>\r\n }\r\n\r\n @case ('actions') {\r\n <div class=\"dt-actions\">\r\n @for (action of getColumnActions(col); track action.id) {\r\n @if (isActionVisible(action, row)) {\r\n <button\r\n type=\"button\"\r\n class=\"dt-action-btn\"\r\n [class.dt-action--edit]=\"action.id === 'edit'\"\r\n [class.dt-action--delete]=\"action.id === 'delete'\"\r\n [class.dt-action--open]=\"action.id === 'open'\"\r\n [class.dt-action--copy]=\"action.id === 'copy'\"\r\n [disabled]=\"isActionDisabled(action, row)\"\r\n [title]=\"action.tooltip ?? action.label\"\r\n (click)=\"emitAction(action, row, $event)\"\r\n >\r\n @if ((action.render ?? 'icon') === 'text') {\r\n <span class=\"dt-action-text\">{{ action.label }}</span>\r\n } @else {\r\n <span class=\"dt-action-svg\" [innerHTML]=\"getActionSvg(action)\"></span>\r\n }\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n\r\n @default {\r\n <span class=\"dt-text\">{{ getDisplayText(row, col) }}</span>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".dt-grid{width:100%}.dt-row{display:grid;align-items:stretch;min-width:max-content}.dt-xscroll{overflow-x:auto;overflow-y:hidden}.dt-header{background:var(--gray-white);border-bottom:var(--border);font-weight:600;color:var(--black)}.dt-cell--header{-webkit-user-select:none;user-select:none}.dt-cell--sortable{cursor:pointer}.dt-filters{background:var(--xxs-light-gray);border-bottom:var(--border)}.dt-cell--filter{padding:8px 12px;font-size:10px}input{width:100%;padding:7px 8px;border:1px solid var(--light-gray);border-radius:var(--radius-sm);background:var(--white);color:var(--black);outline:none}input::placeholder{color:var(--xs-dark-gray);font-size:11px}input:focus{border-color:var(--blue);box-shadow:var(--focus-ring)}.dt-body{overflow-y:auto;overflow-x:hidden;min-width:max-content}@media(max-heicg:900px){.dt-body{max-height:none!important;overflow-y:visible!important;overflow-x:auto!important}}.dt-cell{padding:10px 12px;min-height:30px;border-bottom:1px solid var(--xxs-light-gray);display:flex;align-items:center;gap:8px;color:var(--black)}.dt-cell[data-align=left]{justify-content:flex-start;text-align:left}.dt-cell[data-align=center]{justify-content:center;text-align:center}.dt-cell[data-align=right]{justify-content:flex-end;text-align:right}.dt-cell--center,.dt-select-col{justify-content:center}.dt-header-label{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.dt-sort{margin-left:auto;font-size:12px;opacity:.7;color:var(--xs-dark-gray)}.dt-data:hover{background:var(--gray)}.dt-text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.dt-img{width:40px;height:40px;object-fit:cover;border-radius:var(--radius-sm);border:1px solid var(--xs-light-gray);cursor:pointer}.dt-img--full{width:100%;height:auto}.dt-link{color:var(--blue);text-decoration:none;background:transparent;border:none;cursor:pointer;padding:0;font:inherit}.dt-link:hover{text-decoration:underline}.dt-badge{padding:4px 10px;border-radius:999px;border:1px solid var(--xs-light-gray);font-size:12px;background:var(--xxs-light-gray)}.dt-badge[data-variant=success]{background:#208b6a1f;border-color:#208b6a59}.dt-badge[data-variant=warn]{background:#ffbc5733;border-color:#ffbc5773}.dt-badge[data-variant=error]{background:#e600181f;border-color:#e6001859}.dt-badge[data-variant=info]{background:#7390ec24;border-color:#7390ec59}.dt-empty{padding:18px 12px;color:var(--xs-dark-gray)}.dt-actions{display:inline-flex;align-items:center;gap:6px}.dt-action-svg{width:24px;height:24px;display:inline-flex}.dt-action-svg svg{width:24px;height:24px;color:inherit}.dt-action-btn{width:32px;height:32px;border:1px solid var(--xs-light-gray);border-radius:var(--radius-sm);background:var(--white);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;color:var(--xs-dark-gray)}.dt-action-btn:hover:not(:disabled){background:var(--gray-white);border-color:var(--dark-gray)}.dt-action-btn.dt-action--edit{color:var(--blue)}.dt-action-btn.dt-action--edit:hover:not(:disabled){color:var(--white);background-color:var(--blue)}.dt-action-btn.dt-action--open{color:var(--blue-medium)}.dt-action-btn.dt-action--open:hover:not(:disabled){color:var(--blue-dark)}.dt-action-btn.dt-action--copy{color:var(--xs-dark-gray)}.dt-action-btn.dt-action--copy:hover:not(:disabled){color:var(--white);background-color:var(--xs-dark-gray)}.dt-action-btn.dt-action--delete{color:var(--red)}.dt-action-btn.dt-action--delete:hover:not(:disabled){color:var(--white);background-color:var(--red)}.dt-action-btn:disabled{color:var(--disabled-text);background:var(--soft-white);cursor:not-allowed}.dt-action-text{font-size:24px;padding:0 8px}\n"] }]
670
+ }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], rows: [{ type: i0.Input, args: [{ isSignal: true, alias: "rows", required: false }] }], gridTemplateColumns: [{ type: i0.Input, args: [{ isSignal: true, alias: "gridTemplateColumns", required: false }] }], columnQueries: [{ type: i0.Input, args: [{ isSignal: true, alias: "columnQueries", required: false }] }], sortState: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortState", required: false }] }], selectedIdsSet: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedIdsSet", required: false }] }], timeZone: [{ type: i0.Input, args: [{ isSignal: true, alias: "timeZone", required: false }] }], i18n: [{ type: i0.Input, args: [{ isSignal: true, alias: "i18n", required: false }] }], headerSort: [{ type: i0.Output, args: ["headerSort"] }], columnQueryChange: [{ type: i0.Output, args: ["columnQueryChange"] }], rowClick: [{ type: i0.Output, args: ["rowClick"] }], toggleRow: [{ type: i0.Output, args: ["toggleRow"] }], toggleAllOnPage: [{ type: i0.Output, args: ["toggleAllOnPage"] }], openImage: [{ type: i0.Output, args: ["openImage"] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }], bodyScroll: [{ type: i0.Output, args: ["bodyScroll"] }] } });
671
+
672
+ class TablePaginationComponent {
673
+ Math = Math;
674
+ // Inputs
675
+ page = input(1, ...(ngDevMode ? [{ debugName: "page" }] : []));
676
+ pageSize = input(10, ...(ngDevMode ? [{ debugName: "pageSize" }] : []));
677
+ pageCount = input(1, ...(ngDevMode ? [{ debugName: "pageCount" }] : []));
678
+ totalCount = input(0, ...(ngDevMode ? [{ debugName: "totalCount" }] : []));
679
+ pageSizeOptions = input([10, 25, 50], ...(ngDevMode ? [{ debugName: "pageSizeOptions" }] : []));
680
+ pagerItems = input([], ...(ngDevMode ? [{ debugName: "pagerItems" }] : []));
681
+ i18n = input(TABLE_I18N_DEFAULT, ...(ngDevMode ? [{ debugName: "i18n" }] : []));
682
+ // Outputs
683
+ pageChange = output();
684
+ pageSizeChange = output();
685
+ startItem = computed(() => {
686
+ if (this.totalCount() <= 0)
687
+ return 0;
688
+ return (this.page() - 1) * this.pageSize() + 1;
689
+ }, ...(ngDevMode ? [{ debugName: "startItem" }] : []));
690
+ endItem = computed(() => {
691
+ if (this.totalCount() <= 0)
692
+ return 0;
693
+ return Math.min(this.page() * this.pageSize(), this.totalCount());
694
+ }, ...(ngDevMode ? [{ debugName: "endItem" }] : []));
695
+ goToPage(page) {
696
+ const clamped = Math.max(1, Math.min(this.pageCount(), page));
697
+ this.pageChange.emit(clamped);
609
698
  }
610
699
  prevPage() {
611
- this.page.set(Math.max(1, this.page() - 1));
700
+ this.goToPage(this.page() - 1);
612
701
  }
613
702
  nextPage() {
614
- this.page.set(Math.min(this.pageCount(), this.page() + 1));
615
- }
616
- goToPage(p) {
617
- const clamped = Math.max(1, Math.min(this.pageCount(), p));
618
- this.page.set(clamped);
619
- }
620
- openImageModal(src, alt) {
621
- this.modalImageSrc.set(src);
622
- this.modalImageAlt.set(alt);
623
- this.modalOpen.set(true);
624
- }
625
- closeModal() {
626
- this.modalOpen.set(false);
627
- this.modalImageSrc.set('');
628
- this.modalImageAlt.set('');
703
+ this.goToPage(this.page() + 1);
629
704
  }
630
- // Private functions
631
- resetInfiniteIfNeeded() {
632
- const config = this.config();
633
- if ((config.scroll?.mode ?? 'none') !== 'infinite')
705
+ onPageSizeSelect(size) {
706
+ if (!Number.isFinite(size) || size <= 0)
634
707
  return;
635
- const batch = config.scroll?.batchSize ?? 50;
636
- this.visibleCount.set(batch);
637
- }
638
- sizeToCss(size) {
639
- switch (size) {
640
- case 'XS':
641
- return '80px';
642
- case 'SM':
643
- return '120px';
644
- case 'MD':
645
- return '180px';
646
- case 'LG':
647
- return '260px';
648
- case 'XL':
649
- return '360px';
650
- case 'AUTO':
651
- default:
652
- return '1fr';
653
- }
654
- }
655
- toNumber(value) {
656
- if (typeof value === 'number')
657
- return value;
658
- if (typeof value === 'string') {
659
- return Number(value.replace(/,/g, '').trim());
660
- }
661
- return Number.NaN;
662
- }
663
- toDate(value) {
664
- if (value instanceof Date && !Number.isNaN(value.getTime()))
665
- return value;
666
- if (typeof value === 'string' || typeof value === 'number') {
667
- const date = new Date(value);
668
- return Number.isNaN(date.getTime()) ? null : date;
669
- }
670
- return null;
671
- }
672
- compareValues(firstValue, secondValue, type) {
673
- const firstNull = firstValue == null || firstValue === '';
674
- const secondNull = secondValue == null || secondValue === '';
675
- if (firstNull && secondNull)
676
- return 0;
677
- if (firstNull)
678
- return 1;
679
- if (secondNull)
680
- return -1;
681
- let response = null;
682
- switch (type) {
683
- case 'integer':
684
- case 'decimal':
685
- case 'currency': {
686
- const firstNumber = this.toNumber(firstValue);
687
- const secondNumber = this.toNumber(secondValue);
688
- if (!Number.isFinite(firstNumber) && !Number.isFinite(secondNumber))
689
- response = 0;
690
- else if (!Number.isFinite(firstNumber))
691
- response = 1;
692
- else if (!Number.isFinite(secondNumber))
693
- response = -1;
694
- else
695
- response = firstNumber === secondNumber ? 0 : firstNumber < secondNumber ? -1 : 1;
696
- break;
697
- }
698
- case 'date':
699
- case 'datetime': {
700
- const firstDate = this.toDate(firstValue);
701
- const toCompareDate = this.toDate(secondValue);
702
- if (!firstDate && !toCompareDate)
703
- response = 0;
704
- else if (!firstDate)
705
- response = 1;
706
- else if (!toCompareDate)
707
- response = -1;
708
- else {
709
- const ta = firstDate.getTime();
710
- const tb = toCompareDate.getTime();
711
- response = ta === tb ? 0 : ta < tb ? -1 : 1;
712
- }
713
- break;
714
- }
715
- case 'boolean': {
716
- const firstBool = firstValue === true ? 1 : 0;
717
- const secondBool = secondValue === true ? 1 : 0;
718
- response = firstBool - secondBool;
719
- break;
720
- }
721
- default: {
722
- const firstString = String(firstValue).toLowerCase();
723
- const secondString = String(secondValue).toLowerCase();
724
- response = firstString.localeCompare(secondString, 'es');
725
- break;
726
- }
727
- }
728
- return response;
729
- }
730
- valueToSearchableText(value, type, row) {
731
- if (value == null)
732
- return '';
733
- if (type === 'image')
734
- return '';
735
- if (type === 'boolean')
736
- return value === true ? 'si true yes 1' : 'no false 0';
737
- return String(value);
708
+ this.pageSizeChange.emit(size);
738
709
  }
739
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
740
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: AdvancedTable, isStandalone: true, selector: "advanced-table", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowClick: "rowClick", selectionChange: "selectionChange", actionClick: "actionClick" }, ngImport: i0, template: "<div class=\"dt-container\">\r\n <div class=\"dt-toolbar\">\r\n <!-- Search and Clean -->\r\n <table-toolbar\r\n [enabled]=\"config().globalSearch ?? true\"\r\n [query]=\"globalQuery()\"\r\n placeholder=\"Buscar...\"\r\n [showClear]=\"true\"\r\n (queryChange)=\"setGlobalQuery($event)\"\r\n (clear)=\"clearFilters()\"\r\n />\r\n\r\n <!-- Pagination -->\r\n @if (config().pagination?.enabled) {\r\n <table-pagination\r\n [page]=\"page()\"\r\n [pageSize]=\"pageSize()\"\r\n [pageCount]=\"pageCount()\"\r\n [totalCount]=\"totalCount()\"\r\n [pagerItems]=\"pagerItems()\"\r\n [pageSizeOptions]=\"config().pagination!.pageSizeOptions ?? [10, 25, 50]\"\r\n (pageChange)=\"goToPage($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"\r\n />\r\n }\r\n </div>\r\n\r\n <div class=\"dt-grid\">\r\n <!-- Data Table -->\r\n <table-grid\r\n [config]=\"config()\"\r\n [columns]=\"visibleColumns()\"\r\n [rows]=\"pagedData()\"\r\n [gridTemplateColumns]=\"gridTemplateColumns()\"\r\n [columnQueries]=\"columnQueries()\"\r\n [sortState]=\"sortState()\"\r\n [selectedIdsSet]=\"selectedIdsSet()\"\r\n (headerSort)=\"onHeaderClickSort($event)\"\r\n (columnQueryChange)=\"setColumnQuery($event.key, $event.value)\"\r\n (rowClick)=\"onRowClick($event)\"\r\n (toggleRow)=\"toggleRowSelection($event)\"\r\n (toggleAllOnPage)=\"toggleSelectAllOnPage()\"\r\n (openImage)=\"openImageModal($event.src, $event.alt)\"\r\n (actionClick)=\"actionClick.emit($event)\"\r\n (bodyScroll)=\"onBodyScroll($event)\"\r\n />\r\n </div>\r\n\r\n <!-- Image Modal -->\r\n <table-modal-image\r\n [open]=\"modalOpen()\"\r\n [src]=\"modalImageSrc()\"\r\n [alt]=\"modalImageAlt()\"\r\n (close)=\"closeModal()\"\r\n />\r\n</div>\r\n", styles: [":host{display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;--black: #171717;--black-light: #343434;--black-dark: #000000;--black-navy: #191a21;--xs-dark-gray: #5A5A5A;--dark-gray: #9E9E9E;--medium-gray: #D5D5D5;--gray: #F8F8F8;--light-gray: #C6C6C6;--xs-light-gray: #DFDFDF;--gray-white: #F5F4F4;--xxs-light-gray: #F2F2F2;--soft-white: #EEEEEE;--green-success: #208B6A;--blue: #3360fa;--blue-info: #7390EC;--orange: #F77C00;--yellow-warning: #FFBC57;--red: #E60018;--white: #FFFFFF;--disabled: #C6C6C6;--disabled-text: #9E9E9E;--radius-sm: 4px;--radius-md: 6px;--border: 1px solid var(--xs-light-gray);--focus-ring: 0 0 0 3px rgba(51, 96, 250, .18)}.dt-container{border:var(--border);border-radius:var(--radius-md);background:var(--white);overflow:hidden}.dt-toolbar{display:flex;justify-content:space-between;align-items:center;gap:12px;border-bottom:var(--border);background:var(--xxs-light-gray)}.dt-empty{padding:18px 12px;color:var(--xs-dark-gray)}@media(max-width:900px){.dt-toolbar{flex-wrap:wrap;align-items:flex-start;row-gap:10px;padding:10px 12px}.dt-toolbar>b2b-table-toolbar{flex:1 1 100%}.dt-toolbar>b2b-table-pagination{flex:1 1 100%;display:flex;justify-content:center}}\n"], dependencies: [{ kind: "component", type: TableModalImageComponent, selector: "table-modal-image", inputs: ["open", "src", "alt"], outputs: ["close"] }, { kind: "component", type: TableGridComponent, selector: "table-grid", inputs: ["config", "columns", "rows", "gridTemplateColumns", "columnQueries", "sortState", "selectedIdsSet", "timeZone"], outputs: ["headerSort", "columnQueryChange", "rowClick", "toggleRow", "toggleAllOnPage", "openImage", "actionClick", "bodyScroll"] }, { kind: "component", type: TablePaginationComponent, selector: "table-pagination", inputs: ["page", "pageSize", "pageCount", "totalCount", "pageSizeOptions", "pagerItems"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: TableToolbarComponent, selector: "table-toolbar", inputs: ["enabled", "query", "placeholder", "showClear"], outputs: ["queryChange", "clear"] }] });
710
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: TablePaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
711
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: TablePaginationComponent, isStandalone: true, selector: "table-pagination", inputs: { page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, pageCount: { classPropertyName: "pageCount", publicName: "pageCount", isSignal: true, isRequired: false, transformFunction: null }, totalCount: { classPropertyName: "totalCount", publicName: "totalCount", isSignal: true, isRequired: false, transformFunction: null }, pageSizeOptions: { classPropertyName: "pageSizeOptions", publicName: "pageSizeOptions", isSignal: true, isRequired: false, transformFunction: null }, pagerItems: { classPropertyName: "pagerItems", publicName: "pagerItems", isSignal: true, isRequired: false, transformFunction: null }, i18n: { classPropertyName: "i18n", publicName: "i18n", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pageChange: "pageChange", pageSizeChange: "pageSizeChange" }, ngImport: i0, template: "<div class=\"dt-pagination dt-pagination--classic\">\r\n <!-- Info -->\r\n <span class=\"dt-page-info dt-hide-sm\">\r\n {{ i18n().showing(startItem(), endItem(), totalCount()) }}\r\n </span>\r\n\r\n <!-- Compact info (mobile) -->\r\n <span class=\"dt-page-compact dt-show-xs\"> {{ page() }} / {{ pageCount() }} </span>\r\n\r\n <!-- Rows per page -->\r\n <div class=\"dt-rows dt-hide-md\">\r\n <span>{{ i18n().rowsPerPage }}</span>\r\n <select [value]=\"pageSize()\" (change)=\"onPageSizeSelect(+$any($event.target).value)\">\r\n @for (size of pageSizeOptions(); track size) {\r\n <option [value]=\"size\">{{ size }}</option>\r\n }\r\n </select>\r\n </div>\r\n\r\n <!-- Pager -->\r\n <div class=\"dt-pager\">\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-btn dt-hide-sm\"\r\n (click)=\"goToPage(1)\"\r\n [disabled]=\"page() === 1\"\r\n aria-label=\"First page\"\r\n >\r\n <!-- svg -->\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"m11 18l-6-6l6-6l1.4 1.4L7.825 12l4.575 4.6zm6.6 0l-6-6l6-6L19 7.4L14.425 12L19 16.6z\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-btn\"\r\n (click)=\"prevPage()\"\r\n [disabled]=\"page() === 1\"\r\n aria-label=\"Prev page\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path fill=\"currentColor\" d=\"m14 18l-6-6l6-6l1.4 1.4l-4.6 4.6l4.6 4.6z\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- n\u00FAmeros/ellipsis: se ocultar\u00E1n en XS por CSS -->\r\n @for (item of pagerItems(); track $index) {\r\n @if (item === '\u2026') {\r\n <span class=\"dt-pager-ellipsis dt-hide-xs\">\u2026</span>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-chip dt-hide-xs\"\r\n [class.dt-pager-chip--active]=\"item === page()\"\r\n (click)=\"goToPage(item)\"\r\n >\r\n {{ item }}\r\n </button>\r\n }\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-btn\"\r\n (click)=\"nextPage()\"\r\n [disabled]=\"page() === pageCount()\"\r\n aria-label=\"Next page\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path fill=\"currentColor\" d=\"M12.6 12L8 7.4L9.4 6l6 6l-6 6L8 16.6z\" />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-btn dt-hide-sm\"\r\n (click)=\"goToPage(pageCount())\"\r\n [disabled]=\"page() === pageCount()\"\r\n aria-label=\"Last page\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M9.575 12L5 7.4L6.4 6l6 6l-6 6L5 16.6zm6.6 0L11.6 7.4L13 6l6 6l-6 6l-1.4-1.4z\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [".dt-pagination{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 12px;font-size:13px}.dt-page-info{white-space:nowrap;color:var(--xs-dark-gray)}.dt-rows{display:flex;align-items:center;gap:6px;color:var(--xs-dark-gray)}.dt-rows select{padding:6px 28px 6px 8px;border-radius:var(--radius-sm);border:1px solid var(--light-gray);background:var(--white);font-size:13px;color:var(--black)}.dt-pager{display:flex;align-items:center;gap:4px}.dt-pager-btn,.dt-pager-chip{min-width:28px;height:28px;border-radius:var(--radius-sm);border:1px solid var(--xs-light-gray);background:var(--white);cursor:pointer;font-size:13px;display:inline-flex;align-items:center;justify-content:center;line-height:1;padding:0}.dt-pager-btn:hover:not(:disabled),.dt-pager-chip:hover:not(:disabled){border-color:var(--dark-gray);background:var(--gray-white);color:var(--xs-dark-gray)}.dt-pager-chip--active{background:#3361fa;color:var(--white);border-color:var(--blue);font-weight:600}.dt-pager-chip--active:hover:not(:disabled){background:#3361fa;color:var(--white);border-color:var(--blue)}.dt-pager-btn:disabled,.dt-pager-chip:disabled{opacity:1;color:var(--disabled-text);background:var(--soft-white);border-color:var(--disabled);cursor:not-allowed}.dt-pager-ellipsis{padding:0 6px;color:var(--xs-dark-gray)}.dt-hide-xs,.dt-hide-sm,.dt-hide-md{display:inline-flex}.dt-show-xs{display:none}.dt-page-compact{white-space:nowrap;color:var(--xs-dark-gray)}@media(max-width:1200px){.dt-hide-md{display:none!important}}@media(max-width:900px){.dt-hide-sm{display:none!important}.dt-pagination{justify-content:center}}@media(max-width:640px){.dt-hide-xs{display:none!important}.dt-show-xs{display:inline-flex!important}.dt-pagination{gap:10px}.dt-pager{gap:8px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
741
712
  }
742
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedTable, decorators: [{
713
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: TablePaginationComponent, decorators: [{
743
714
  type: Component,
744
- args: [{ selector: 'advanced-table', imports: [
745
- TableModalImageComponent,
746
- TableGridComponent,
747
- TablePaginationComponent,
748
- TableToolbarComponent,
749
- ], template: "<div class=\"dt-container\">\r\n <div class=\"dt-toolbar\">\r\n <!-- Search and Clean -->\r\n <table-toolbar\r\n [enabled]=\"config().globalSearch ?? true\"\r\n [query]=\"globalQuery()\"\r\n placeholder=\"Buscar...\"\r\n [showClear]=\"true\"\r\n (queryChange)=\"setGlobalQuery($event)\"\r\n (clear)=\"clearFilters()\"\r\n />\r\n\r\n <!-- Pagination -->\r\n @if (config().pagination?.enabled) {\r\n <table-pagination\r\n [page]=\"page()\"\r\n [pageSize]=\"pageSize()\"\r\n [pageCount]=\"pageCount()\"\r\n [totalCount]=\"totalCount()\"\r\n [pagerItems]=\"pagerItems()\"\r\n [pageSizeOptions]=\"config().pagination!.pageSizeOptions ?? [10, 25, 50]\"\r\n (pageChange)=\"goToPage($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"\r\n />\r\n }\r\n </div>\r\n\r\n <div class=\"dt-grid\">\r\n <!-- Data Table -->\r\n <table-grid\r\n [config]=\"config()\"\r\n [columns]=\"visibleColumns()\"\r\n [rows]=\"pagedData()\"\r\n [gridTemplateColumns]=\"gridTemplateColumns()\"\r\n [columnQueries]=\"columnQueries()\"\r\n [sortState]=\"sortState()\"\r\n [selectedIdsSet]=\"selectedIdsSet()\"\r\n (headerSort)=\"onHeaderClickSort($event)\"\r\n (columnQueryChange)=\"setColumnQuery($event.key, $event.value)\"\r\n (rowClick)=\"onRowClick($event)\"\r\n (toggleRow)=\"toggleRowSelection($event)\"\r\n (toggleAllOnPage)=\"toggleSelectAllOnPage()\"\r\n (openImage)=\"openImageModal($event.src, $event.alt)\"\r\n (actionClick)=\"actionClick.emit($event)\"\r\n (bodyScroll)=\"onBodyScroll($event)\"\r\n />\r\n </div>\r\n\r\n <!-- Image Modal -->\r\n <table-modal-image\r\n [open]=\"modalOpen()\"\r\n [src]=\"modalImageSrc()\"\r\n [alt]=\"modalImageAlt()\"\r\n (close)=\"closeModal()\"\r\n />\r\n</div>\r\n", styles: [":host{display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;--black: #171717;--black-light: #343434;--black-dark: #000000;--black-navy: #191a21;--xs-dark-gray: #5A5A5A;--dark-gray: #9E9E9E;--medium-gray: #D5D5D5;--gray: #F8F8F8;--light-gray: #C6C6C6;--xs-light-gray: #DFDFDF;--gray-white: #F5F4F4;--xxs-light-gray: #F2F2F2;--soft-white: #EEEEEE;--green-success: #208B6A;--blue: #3360fa;--blue-info: #7390EC;--orange: #F77C00;--yellow-warning: #FFBC57;--red: #E60018;--white: #FFFFFF;--disabled: #C6C6C6;--disabled-text: #9E9E9E;--radius-sm: 4px;--radius-md: 6px;--border: 1px solid var(--xs-light-gray);--focus-ring: 0 0 0 3px rgba(51, 96, 250, .18)}.dt-container{border:var(--border);border-radius:var(--radius-md);background:var(--white);overflow:hidden}.dt-toolbar{display:flex;justify-content:space-between;align-items:center;gap:12px;border-bottom:var(--border);background:var(--xxs-light-gray)}.dt-empty{padding:18px 12px;color:var(--xs-dark-gray)}@media(max-width:900px){.dt-toolbar{flex-wrap:wrap;align-items:flex-start;row-gap:10px;padding:10px 12px}.dt-toolbar>b2b-table-toolbar{flex:1 1 100%}.dt-toolbar>b2b-table-pagination{flex:1 1 100%;display:flex;justify-content:center}}\n"] }]
750
- }], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], rowClick: [{ type: i0.Output, args: ["rowClick"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }] } });
715
+ args: [{ selector: 'table-pagination', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"dt-pagination dt-pagination--classic\">\r\n <!-- Info -->\r\n <span class=\"dt-page-info dt-hide-sm\">\r\n {{ i18n().showing(startItem(), endItem(), totalCount()) }}\r\n </span>\r\n\r\n <!-- Compact info (mobile) -->\r\n <span class=\"dt-page-compact dt-show-xs\"> {{ page() }} / {{ pageCount() }} </span>\r\n\r\n <!-- Rows per page -->\r\n <div class=\"dt-rows dt-hide-md\">\r\n <span>{{ i18n().rowsPerPage }}</span>\r\n <select [value]=\"pageSize()\" (change)=\"onPageSizeSelect(+$any($event.target).value)\">\r\n @for (size of pageSizeOptions(); track size) {\r\n <option [value]=\"size\">{{ size }}</option>\r\n }\r\n </select>\r\n </div>\r\n\r\n <!-- Pager -->\r\n <div class=\"dt-pager\">\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-btn dt-hide-sm\"\r\n (click)=\"goToPage(1)\"\r\n [disabled]=\"page() === 1\"\r\n aria-label=\"First page\"\r\n >\r\n <!-- svg -->\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"m11 18l-6-6l6-6l1.4 1.4L7.825 12l4.575 4.6zm6.6 0l-6-6l6-6L19 7.4L14.425 12L19 16.6z\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-btn\"\r\n (click)=\"prevPage()\"\r\n [disabled]=\"page() === 1\"\r\n aria-label=\"Prev page\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path fill=\"currentColor\" d=\"m14 18l-6-6l6-6l1.4 1.4l-4.6 4.6l4.6 4.6z\" />\r\n </svg>\r\n </button>\r\n\r\n <!-- n\u00FAmeros/ellipsis: se ocultar\u00E1n en XS por CSS -->\r\n @for (item of pagerItems(); track $index) {\r\n @if (item === '\u2026') {\r\n <span class=\"dt-pager-ellipsis dt-hide-xs\">\u2026</span>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-chip dt-hide-xs\"\r\n [class.dt-pager-chip--active]=\"item === page()\"\r\n (click)=\"goToPage(item)\"\r\n >\r\n {{ item }}\r\n </button>\r\n }\r\n }\r\n\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-btn\"\r\n (click)=\"nextPage()\"\r\n [disabled]=\"page() === pageCount()\"\r\n aria-label=\"Next page\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path fill=\"currentColor\" d=\"M12.6 12L8 7.4L9.4 6l6 6l-6 6L8 16.6z\" />\r\n </svg>\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"dt-pager-btn dt-hide-sm\"\r\n (click)=\"goToPage(pageCount())\"\r\n [disabled]=\"page() === pageCount()\"\r\n aria-label=\"Last page\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M9.575 12L5 7.4L6.4 6l6 6l-6 6L5 16.6zm6.6 0L11.6 7.4L13 6l6 6l-6 6l-1.4-1.4z\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [".dt-pagination{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 12px;font-size:13px}.dt-page-info{white-space:nowrap;color:var(--xs-dark-gray)}.dt-rows{display:flex;align-items:center;gap:6px;color:var(--xs-dark-gray)}.dt-rows select{padding:6px 28px 6px 8px;border-radius:var(--radius-sm);border:1px solid var(--light-gray);background:var(--white);font-size:13px;color:var(--black)}.dt-pager{display:flex;align-items:center;gap:4px}.dt-pager-btn,.dt-pager-chip{min-width:28px;height:28px;border-radius:var(--radius-sm);border:1px solid var(--xs-light-gray);background:var(--white);cursor:pointer;font-size:13px;display:inline-flex;align-items:center;justify-content:center;line-height:1;padding:0}.dt-pager-btn:hover:not(:disabled),.dt-pager-chip:hover:not(:disabled){border-color:var(--dark-gray);background:var(--gray-white);color:var(--xs-dark-gray)}.dt-pager-chip--active{background:#3361fa;color:var(--white);border-color:var(--blue);font-weight:600}.dt-pager-chip--active:hover:not(:disabled){background:#3361fa;color:var(--white);border-color:var(--blue)}.dt-pager-btn:disabled,.dt-pager-chip:disabled{opacity:1;color:var(--disabled-text);background:var(--soft-white);border-color:var(--disabled);cursor:not-allowed}.dt-pager-ellipsis{padding:0 6px;color:var(--xs-dark-gray)}.dt-hide-xs,.dt-hide-sm,.dt-hide-md{display:inline-flex}.dt-show-xs{display:none}.dt-page-compact{white-space:nowrap;color:var(--xs-dark-gray)}@media(max-width:1200px){.dt-hide-md{display:none!important}}@media(max-width:900px){.dt-hide-sm{display:none!important}.dt-pagination{justify-content:center}}@media(max-width:640px){.dt-hide-xs{display:none!important}.dt-show-xs{display:inline-flex!important}.dt-pagination{gap:10px}.dt-pager{gap:8px}}\n"] }]
716
+ }], propDecorators: { page: [{ type: i0.Input, args: [{ isSignal: true, alias: "page", required: false }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], pageCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageCount", required: false }] }], totalCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalCount", required: false }] }], pageSizeOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSizeOptions", required: false }] }], pagerItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "pagerItems", required: false }] }], i18n: [{ type: i0.Input, args: [{ isSignal: true, alias: "i18n", required: false }] }], pageChange: [{ type: i0.Output, args: ["pageChange"] }], pageSizeChange: [{ type: i0.Output, args: ["pageSizeChange"] }] } });
751
717
 
752
- class AdvancedCardTemplateDirective {
753
- templateRef;
754
- templateId = input.required({ ...(ngDevMode ? { debugName: "templateId" } : {}), alias: 'advancedCardTemplate' });
755
- constructor(templateRef) {
756
- this.templateRef = templateRef;
718
+ class TableToolbarComponent {
719
+ // Inputs
720
+ enabled = input(true, ...(ngDevMode ? [{ debugName: "enabled" }] : []));
721
+ query = input('', ...(ngDevMode ? [{ debugName: "query" }] : []));
722
+ showClear = input(true, ...(ngDevMode ? [{ debugName: "showClear" }] : []));
723
+ i18n = input(TABLE_I18N_DEFAULT, ...(ngDevMode ? [{ debugName: "i18n" }] : []));
724
+ // Outputs
725
+ queryChange = output();
726
+ clear = output();
727
+ onInput(value) {
728
+ this.queryChange.emit(value);
757
729
  }
758
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCardTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
759
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.4", type: AdvancedCardTemplateDirective, isStandalone: true, selector: "[advancedCardTemplate]", inputs: { templateId: { classPropertyName: "templateId", publicName: "advancedCardTemplate", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
760
- }
761
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCardTemplateDirective, decorators: [{
762
- type: Directive,
763
- args: [{
764
- selector: '[advancedCardTemplate]',
765
- standalone: true,
766
- }]
767
- }], ctorParameters: () => [{ type: i0.TemplateRef }], propDecorators: { templateId: [{ type: i0.Input, args: [{ isSignal: true, alias: "advancedCardTemplate", required: true }] }] } });
768
-
769
- class CardCompactComponent {
770
- configuration = input.required(...(ngDevMode ? [{ debugName: "configuration" }] : []));
771
- expanded = input.required(...(ngDevMode ? [{ debugName: "expanded" }] : []));
772
- badgeClass = input.required(...(ngDevMode ? [{ debugName: "badgeClass" }] : []));
773
- expand = output();
774
- hasHighlights = computed(() => (this.configuration().highlights?.length ?? 0) > 0, ...(ngDevMode ? [{ debugName: "hasHighlights" }] : []));
775
- onExpand() {
776
- this.expand.emit();
730
+ onClear() {
731
+ this.clear.emit();
777
732
  }
778
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardCompactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
779
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: CardCompactComponent, isStandalone: true, selector: "lib-card-compact", inputs: { configuration: { classPropertyName: "configuration", publicName: "configuration", isSignal: true, isRequired: true, transformFunction: null }, expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: true, transformFunction: null }, badgeClass: { classPropertyName: "badgeClass", publicName: "badgeClass", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { expand: "expand" }, ngImport: i0, template: "@let config = configuration();\r\n\r\n<section\r\n class=\"ac ac--compact\"\r\n [class.ac--hidden]=\"expanded()\"\r\n tabindex=\"0\"\r\n role=\"button\"\r\n (click)=\"onExpand()\"\r\n (keydown.enter)=\"onExpand()\"\r\n>\r\n <header class=\"ac__header\">\r\n <div class=\"ac__title-wrap\">\r\n <h3 class=\"ac__title\">{{ config.title }}</h3>\r\n\r\n @if (config.subtitle) {\r\n <p class=\"ac__subtitle\">{{ config.subtitle }}</p>\r\n }\r\n </div>\r\n\r\n @if (config.badge) {\r\n <span [class]=\"badgeClass()(config.badge.tone)\">\r\n {{ config.badge.label }}\r\n </span>\r\n }\r\n </header>\r\n\r\n @if (hasHighlights()) {\r\n @let highlightList = config.highlights;\r\n\r\n <div class=\"ac__highlights\">\r\n @for (highlight of highlightList; track highlight.label) {\r\n <div class=\"ac__hl\">\r\n <div class=\"ac__hl-value\">{{ highlight.value }}</div>\r\n <div class=\"ac__hl-label\">\r\n {{ highlight.label }}\r\n @if (highlight.hint) {\r\n <span class=\"ac__hl-hint\">\u00B7 {{ highlight.hint }}</span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <footer class=\"ac__footer\">\r\n <button type=\"button\" class=\"btn btn--primary\" (click)=\"onExpand(); $event.stopPropagation()\">\r\n {{ config.primaryCta?.label ?? 'Ver detalle' }}\r\n <span class=\"btn__chev\">\u203A</span>\r\n </button>\r\n </footer>\r\n</section>\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] });
733
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: TableToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
734
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: TableToolbarComponent, isStandalone: true, selector: "table-toolbar", inputs: { enabled: { classPropertyName: "enabled", publicName: "enabled", isSignal: true, isRequired: false, transformFunction: null }, query: { classPropertyName: "query", publicName: "query", isSignal: true, isRequired: false, transformFunction: null }, showClear: { classPropertyName: "showClear", publicName: "showClear", isSignal: true, isRequired: false, transformFunction: null }, i18n: { classPropertyName: "i18n", publicName: "i18n", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { queryChange: "queryChange", clear: "clear" }, ngImport: i0, template: "@if (enabled()) {\r\n <div class=\"dt-toolbar\">\r\n <input\r\n class=\"dt-input\"\r\n type=\"text\"\r\n [placeholder]=\"i18n().search\"\r\n [value]=\"query()\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n />\r\n\r\n @if (showClear()) {\r\n <button type=\"button\" class=\"dt-btn\" (click)=\"onClear()\">{{ i18n().clear }}</button>\r\n }\r\n </div>\r\n}\r\n", styles: [".dt-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px}.dt-input{width:100%;max-width:360px;padding:8px 10px;border-radius:var(--radius-sm);border:var(--border);outline:none}.dt-input:focus{box-shadow:0 0 0 3px #2563eb26}.dt-btn{padding:8px 10px;border-radius:var(--radius-sm);border:var(--border);background:var(--white);cursor:pointer}.dt-btn:hover{filter:brightness(.98)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
780
735
  }
781
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardCompactComponent, decorators: [{
736
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: TableToolbarComponent, decorators: [{
782
737
  type: Component,
783
- args: [{ selector: 'lib-card-compact', imports: [], template: "@let config = configuration();\r\n\r\n<section\r\n class=\"ac ac--compact\"\r\n [class.ac--hidden]=\"expanded()\"\r\n tabindex=\"0\"\r\n role=\"button\"\r\n (click)=\"onExpand()\"\r\n (keydown.enter)=\"onExpand()\"\r\n>\r\n <header class=\"ac__header\">\r\n <div class=\"ac__title-wrap\">\r\n <h3 class=\"ac__title\">{{ config.title }}</h3>\r\n\r\n @if (config.subtitle) {\r\n <p class=\"ac__subtitle\">{{ config.subtitle }}</p>\r\n }\r\n </div>\r\n\r\n @if (config.badge) {\r\n <span [class]=\"badgeClass()(config.badge.tone)\">\r\n {{ config.badge.label }}\r\n </span>\r\n }\r\n </header>\r\n\r\n @if (hasHighlights()) {\r\n @let highlightList = config.highlights;\r\n\r\n <div class=\"ac__highlights\">\r\n @for (highlight of highlightList; track highlight.label) {\r\n <div class=\"ac__hl\">\r\n <div class=\"ac__hl-value\">{{ highlight.value }}</div>\r\n <div class=\"ac__hl-label\">\r\n {{ highlight.label }}\r\n @if (highlight.hint) {\r\n <span class=\"ac__hl-hint\">\u00B7 {{ highlight.hint }}</span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <footer class=\"ac__footer\">\r\n <button type=\"button\" class=\"btn btn--primary\" (click)=\"onExpand(); $event.stopPropagation()\">\r\n {{ config.primaryCta?.label ?? 'Ver detalle' }}\r\n <span class=\"btn__chev\">\u203A</span>\r\n </button>\r\n </footer>\r\n</section>\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
784
- }], propDecorators: { configuration: [{ type: i0.Input, args: [{ isSignal: true, alias: "configuration", required: true }] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: true }] }], badgeClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeClass", required: true }] }], expand: [{ type: i0.Output, args: ["expand"] }] } });
738
+ args: [{ selector: 'table-toolbar', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (enabled()) {\r\n <div class=\"dt-toolbar\">\r\n <input\r\n class=\"dt-input\"\r\n type=\"text\"\r\n [placeholder]=\"i18n().search\"\r\n [value]=\"query()\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n />\r\n\r\n @if (showClear()) {\r\n <button type=\"button\" class=\"dt-btn\" (click)=\"onClear()\">{{ i18n().clear }}</button>\r\n }\r\n </div>\r\n}\r\n", styles: [".dt-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px}.dt-input{width:100%;max-width:360px;padding:8px 10px;border-radius:var(--radius-sm);border:var(--border);outline:none}.dt-input:focus{box-shadow:0 0 0 3px #2563eb26}.dt-btn{padding:8px 10px;border-radius:var(--radius-sm);border:var(--border);background:var(--white);cursor:pointer}.dt-btn:hover{filter:brightness(.98)}\n"] }]
739
+ }], propDecorators: { enabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "enabled", required: false }] }], query: [{ type: i0.Input, args: [{ isSignal: true, alias: "query", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], i18n: [{ type: i0.Input, args: [{ isSignal: true, alias: "i18n", required: false }] }], queryChange: [{ type: i0.Output, args: ["queryChange"] }], clear: [{ type: i0.Output, args: ["clear"] }] } });
785
740
 
786
- class CardHeaderComponent {
787
- variant = input('inline', ...(ngDevMode ? [{ debugName: "variant" }] : []));
788
- title = input.required(...(ngDevMode ? [{ debugName: "title" }] : []));
789
- badge = input(undefined, ...(ngDevMode ? [{ debugName: "badge" }] : []));
790
- actions = input(undefined, ...(ngDevMode ? [{ debugName: "actions" }] : []));
791
- sticky = input(false, ...(ngDevMode ? [{ debugName: "sticky" }] : []));
792
- badgeClass = input.required(...(ngDevMode ? [{ debugName: "badgeClass" }] : []));
793
- actionClick = output();
794
- close = output();
795
- onAction(advancedAction) {
796
- if (advancedAction.disabled)
797
- return;
798
- this.actionClick.emit(advancedAction);
799
- }
800
- onClose() {
801
- this.close.emit();
802
- }
803
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
804
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: CardHeaderComponent, isStandalone: true, selector: "ac-card-header", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, badge: { classPropertyName: "badge", publicName: "badge", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, sticky: { classPropertyName: "sticky", publicName: "sticky", isSignal: true, isRequired: false, transformFunction: null }, badgeClass: { classPropertyName: "badgeClass", publicName: "badgeClass", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { actionClick: "actionClick", close: "close" }, ngImport: i0, template: "<header\r\n [class.acx__header]=\"variant() === 'inline'\"\r\n [class.acx__header--sticky]=\"variant() === 'inline' && sticky()\"\r\n [class.panel__header]=\"variant() === 'panel'\"\r\n>\r\n <div [class.acx__title]=\"variant() === 'inline'\" [class.panel__title]=\"variant() === 'panel'\">\r\n <h3\r\n [class.acx__title-text]=\"variant() === 'inline'\"\r\n [class.panel__title-text]=\"variant() === 'panel'\"\r\n >\r\n {{ title() }}\r\n </h3>\r\n\r\n @if (badge()) {\r\n <span [class]=\"badgeClass()(badge()?.tone)\">\r\n {{ badge()?.label }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <div [class.acx__actions]=\"variant() === 'inline'\" [class.panel__actions]=\"variant() === 'panel'\">\r\n @let headerActions = actions();\r\n @if (headerActions?.length) {\r\n @for (headerAction of headerActions; track headerAction.id) {\r\n <button\r\n type=\"button\"\r\n class=\"btn\"\r\n [class.btn--primary]=\"headerAction.tone === 'primary'\"\r\n [class.btn--danger]=\"headerAction.tone === 'danger'\"\r\n [class.btn--secondary]=\"!headerAction.tone || headerAction.tone === 'secondary'\"\r\n [disabled]=\"headerAction.disabled\"\r\n (click)=\"onAction(headerAction)\"\r\n >\r\n {{ headerAction.label }}\r\n </button>\r\n }\r\n }\r\n\r\n <button type=\"button\" class=\"icon-btn\" (click)=\"onClose()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <rect width=\"24\" height=\"24\" fill=\"none\" />\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M6.4 19L5 17.6l5.6-5.6L5 6.4L6.4 5l5.6 5.6L17.6 5L19 6.4L13.4 12l5.6 5.6l-1.4 1.4l-5.6-5.6z\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n</header>\r\n", styles: [":host{display:block}.panel__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] });
805
- }
806
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardHeaderComponent, decorators: [{
807
- type: Component,
808
- args: [{ selector: 'ac-card-header', imports: [], template: "<header\r\n [class.acx__header]=\"variant() === 'inline'\"\r\n [class.acx__header--sticky]=\"variant() === 'inline' && sticky()\"\r\n [class.panel__header]=\"variant() === 'panel'\"\r\n>\r\n <div [class.acx__title]=\"variant() === 'inline'\" [class.panel__title]=\"variant() === 'panel'\">\r\n <h3\r\n [class.acx__title-text]=\"variant() === 'inline'\"\r\n [class.panel__title-text]=\"variant() === 'panel'\"\r\n >\r\n {{ title() }}\r\n </h3>\r\n\r\n @if (badge()) {\r\n <span [class]=\"badgeClass()(badge()?.tone)\">\r\n {{ badge()?.label }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <div [class.acx__actions]=\"variant() === 'inline'\" [class.panel__actions]=\"variant() === 'panel'\">\r\n @let headerActions = actions();\r\n @if (headerActions?.length) {\r\n @for (headerAction of headerActions; track headerAction.id) {\r\n <button\r\n type=\"button\"\r\n class=\"btn\"\r\n [class.btn--primary]=\"headerAction.tone === 'primary'\"\r\n [class.btn--danger]=\"headerAction.tone === 'danger'\"\r\n [class.btn--secondary]=\"!headerAction.tone || headerAction.tone === 'secondary'\"\r\n [disabled]=\"headerAction.disabled\"\r\n (click)=\"onAction(headerAction)\"\r\n >\r\n {{ headerAction.label }}\r\n </button>\r\n }\r\n }\r\n\r\n <button type=\"button\" class=\"icon-btn\" (click)=\"onClose()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <rect width=\"24\" height=\"24\" fill=\"none\" />\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M6.4 19L5 17.6l5.6-5.6L5 6.4L6.4 5l5.6 5.6L17.6 5L19 6.4L13.4 12l5.6 5.6l-1.4 1.4l-5.6-5.6z\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n</header>\r\n", styles: [":host{display:block}.panel__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
809
- }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], badge: [{ type: i0.Input, args: [{ isSignal: true, alias: "badge", required: false }] }], actions: [{ type: i0.Input, args: [{ isSignal: true, alias: "actions", required: false }] }], sticky: [{ type: i0.Input, args: [{ isSignal: true, alias: "sticky", required: false }] }], badgeClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeClass", required: true }] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }], close: [{ type: i0.Output, args: ["close"] }] } });
810
-
811
- class CardSummaryComponent {
812
- blocks = input(undefined, ...(ngDevMode ? [{ debugName: "blocks" }] : []));
813
- hasBlocks = computed(() => (this.blocks()?.length ?? 0) > 0, ...(ngDevMode ? [{ debugName: "hasBlocks" }] : []));
814
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardSummaryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
815
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: CardSummaryComponent, isStandalone: true, selector: "ac-card-summary", inputs: { blocks: { classPropertyName: "blocks", publicName: "blocks", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (hasBlocks()) {\r\n @let list = blocks();\r\n\r\n <div class=\"acx__summary\">\r\n @for (block of list; track block.title) {\r\n <div class=\"block\">\r\n <div class=\"block__title\">{{ block.title }}</div>\r\n\r\n @for (row of block.rows; track row.label) {\r\n <div class=\"block__row\">\r\n <span class=\"block__label\">{{ row.label }}</span>\r\n <span class=\"block__value\">{{ row.value }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n}\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] });
816
- }
817
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardSummaryComponent, decorators: [{
818
- type: Component,
819
- args: [{ selector: 'ac-card-summary', imports: [], template: "@if (hasBlocks()) {\r\n @let list = blocks();\r\n\r\n <div class=\"acx__summary\">\r\n @for (block of list; track block.title) {\r\n <div class=\"block\">\r\n <div class=\"block__title\">{{ block.title }}</div>\r\n\r\n @for (row of block.rows; track row.label) {\r\n <div class=\"block__row\">\r\n <span class=\"block__label\">{{ row.label }}</span>\r\n <span class=\"block__value\">{{ row.value }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n}\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
820
- }], propDecorators: { blocks: [{ type: i0.Input, args: [{ isSignal: true, alias: "blocks", required: false }] }] } });
821
-
822
- class CardTabContentComponent {
823
- activeTab = input.required(...(ngDevMode ? [{ debugName: "activeTab" }] : []));
824
- cardId = input.required(...(ngDevMode ? [{ debugName: "cardId" }] : []));
825
- /**
826
- * Función que resuelve el TemplateRef para el tab actual.
827
- * (La lógica real sigue en el root: getActiveTemplate())
828
- */
829
- templateRef = input(null, ...(ngDevMode ? [{ debugName: "templateRef" }] : []));
830
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardTabContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
831
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: CardTabContentComponent, isStandalone: true, selector: "ac-card-tab-content", inputs: { activeTab: { classPropertyName: "activeTab", publicName: "activeTab", isSignal: true, isRequired: true, transformFunction: null }, cardId: { classPropertyName: "cardId", publicName: "cardId", isSignal: true, isRequired: true, transformFunction: null }, templateRef: { classPropertyName: "templateRef", publicName: "templateRef", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@let tab = activeTab();\r\n@let template = templateRef();\r\n\r\n<div class=\"tabs__content\">\r\n @if (tab) {\r\n @switch (tab.kind) {\r\n @case ('text') {\r\n <div class=\"tab-text\">\r\n {{ tab.text ?? '' }}\r\n </div>\r\n }\r\n\r\n @case ('empty') {\r\n <div class=\"empty\">Sin contenido.</div>\r\n }\r\n\r\n @case ('template') {\r\n @if (template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n cardId: cardId(),\r\n tabId: tab.id,\r\n }\"\r\n />\r\n } @else {\r\n <div class=\"empty\">Template no encontrado para \"{{ tab.templateId }}\"</div>\r\n }\r\n }\r\n }\r\n } @else {\r\n <div class=\"empty\">Sin tabs configurados.</div>\r\n }\r\n</div>\r\n", styles: ["", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
832
- }
833
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardTabContentComponent, decorators: [{
834
- type: Component,
835
- args: [{ selector: 'ac-card-tab-content', imports: [NgTemplateOutlet], template: "@let tab = activeTab();\r\n@let template = templateRef();\r\n\r\n<div class=\"tabs__content\">\r\n @if (tab) {\r\n @switch (tab.kind) {\r\n @case ('text') {\r\n <div class=\"tab-text\">\r\n {{ tab.text ?? '' }}\r\n </div>\r\n }\r\n\r\n @case ('empty') {\r\n <div class=\"empty\">Sin contenido.</div>\r\n }\r\n\r\n @case ('template') {\r\n @if (template) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n cardId: cardId(),\r\n tabId: tab.id,\r\n }\"\r\n />\r\n } @else {\r\n <div class=\"empty\">Template no encontrado para \"{{ tab.templateId }}\"</div>\r\n }\r\n }\r\n }\r\n } @else {\r\n <div class=\"empty\">Sin tabs configurados.</div>\r\n }\r\n</div>\r\n", styles: [":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
836
- }], propDecorators: { activeTab: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeTab", required: true }] }], cardId: [{ type: i0.Input, args: [{ isSignal: true, alias: "cardId", required: true }] }], templateRef: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateRef", required: false }] }] } });
837
-
838
- class CardTabsBarComponent {
839
- tabs = input.required(...(ngDevMode ? [{ debugName: "tabs" }] : []));
840
- activeTabId = input.required(...(ngDevMode ? [{ debugName: "activeTabId" }] : []));
841
- badgeClass = input.required(...(ngDevMode ? [{ debugName: "badgeClass" }] : []));
842
- tabSelected = output();
843
- tabAction = output();
844
- activeTab = computed(() => {
845
- const id = this.activeTabId();
846
- if (!id)
847
- return null;
848
- return this.tabs().find((tab) => tab.id === id) ?? null;
849
- }, ...(ngDevMode ? [{ debugName: "activeTab" }] : []));
850
- selectTab(id) {
851
- this.tabSelected.emit(id);
852
- }
853
- clickAction(advancedTabAction) {
854
- if (advancedTabAction.disabled)
855
- return;
856
- this.tabAction.emit(advancedTabAction);
857
- }
858
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardTabsBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
859
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: CardTabsBarComponent, isStandalone: true, selector: "ac-card-tabs-bar", inputs: { tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: true, transformFunction: null }, activeTabId: { classPropertyName: "activeTabId", publicName: "activeTabId", isSignal: true, isRequired: true, transformFunction: null }, badgeClass: { classPropertyName: "badgeClass", publicName: "badgeClass", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { tabSelected: "tabSelected", tabAction: "tabAction" }, ngImport: i0, template: "@let tabList = tabs();\r\n@let currentId = activeTabId();\r\n@let current = activeTab();\r\n\r\n<div class=\"tabs__bar\">\r\n @for (tab of tabList; track tab.id) {\r\n <button\r\n type=\"button\"\r\n class=\"tab\"\r\n [class.tab--active]=\"currentId === tab.id\"\r\n (click)=\"selectTab(tab.id)\"\r\n >\r\n <span>{{ tab.label }}</span>\r\n @if (tab.pill) {\r\n <span class=\"pill\" [class]=\"badgeClass()(tab.pill.tone)\">\r\n {{ tab.pill.label }}\r\n </span>\r\n }\r\n </button>\r\n }\r\n\r\n <div class=\"tabs__spacer\"></div>\r\n\r\n @if (current?.actions?.length) {\r\n <div class=\"tabs__actions\">\r\n @for (actions of current?.actions ?? []; track actions.id) {\r\n <button\r\n type=\"button\"\r\n class=\"btn btn--sm\"\r\n [class.btn--primary]=\"actions.tone === 'primary'\"\r\n [class.btn--danger]=\"actions.tone === 'danger'\"\r\n [class.btn--secondary]=\"!actions.tone || actions.tone === 'secondary'\"\r\n [disabled]=\"actions.disabled\"\r\n (click)=\"clickAction(actions)\"\r\n >\r\n {{ actions.label }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n</div>\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] });
860
- }
861
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: CardTabsBarComponent, decorators: [{
862
- type: Component,
863
- args: [{ selector: 'ac-card-tabs-bar', imports: [], template: "@let tabList = tabs();\r\n@let currentId = activeTabId();\r\n@let current = activeTab();\r\n\r\n<div class=\"tabs__bar\">\r\n @for (tab of tabList; track tab.id) {\r\n <button\r\n type=\"button\"\r\n class=\"tab\"\r\n [class.tab--active]=\"currentId === tab.id\"\r\n (click)=\"selectTab(tab.id)\"\r\n >\r\n <span>{{ tab.label }}</span>\r\n @if (tab.pill) {\r\n <span class=\"pill\" [class]=\"badgeClass()(tab.pill.tone)\">\r\n {{ tab.pill.label }}\r\n </span>\r\n }\r\n </button>\r\n }\r\n\r\n <div class=\"tabs__spacer\"></div>\r\n\r\n @if (current?.actions?.length) {\r\n <div class=\"tabs__actions\">\r\n @for (actions of current?.actions ?? []; track actions.id) {\r\n <button\r\n type=\"button\"\r\n class=\"btn btn--sm\"\r\n [class.btn--primary]=\"actions.tone === 'primary'\"\r\n [class.btn--danger]=\"actions.tone === 'danger'\"\r\n [class.btn--secondary]=\"!actions.tone || actions.tone === 'secondary'\"\r\n [disabled]=\"actions.disabled\"\r\n (click)=\"clickAction(actions)\"\r\n >\r\n {{ actions.label }}\r\n </button>\r\n }\r\n </div>\r\n }\r\n</div>\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
864
- }], propDecorators: { tabs: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabs", required: true }] }], activeTabId: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeTabId", required: true }] }], badgeClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeClass", required: true }] }], tabSelected: [{ type: i0.Output, args: ["tabSelected"] }], tabAction: [{ type: i0.Output, args: ["tabAction"] }] } });
865
-
866
- class AdvancedCardContentComponent {
867
- viewModel = input.required(...(ngDevMode ? [{ debugName: "viewModel" }] : []));
868
- badgeClass = input.required(...(ngDevMode ? [{ debugName: "badgeClass" }] : []));
869
- tabSelected = output();
870
- tabAction = output();
871
- onSelect(id) {
872
- this.tabSelected.emit(id);
873
- }
874
- onAction(a) {
875
- this.tabAction.emit(a);
876
- }
877
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCardContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
878
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: AdvancedCardContentComponent, isStandalone: true, selector: "ac-advanced-card-content", inputs: { viewModel: { classPropertyName: "viewModel", publicName: "viewModel", isSignal: true, isRequired: true, transformFunction: null }, badgeClass: { classPropertyName: "badgeClass", publicName: "badgeClass", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { tabSelected: "tabSelected", tabAction: "tabAction" }, ngImport: i0, template: "@let vm = viewModel();\r\n\r\n<ac-card-summary [blocks]=\"vm.summaryBlocks\" />\r\n\r\n@if (vm.tabs.length) {\r\n <div class=\"tabs\">\r\n <ac-card-tabs-bar\r\n [tabs]=\"vm.tabs\"\r\n [activeTabId]=\"vm.activeTabId\"\r\n [badgeClass]=\"badgeClass()\"\r\n (tabSelected)=\"onSelect($event)\"\r\n (tabAction)=\"onAction($event)\"\r\n />\r\n\r\n <ac-card-tab-content\r\n [activeTab]=\"vm.activeTab\"\r\n [cardId]=\"vm.cardId\"\r\n [templateRef]=\"vm.templateRef\"\r\n />\r\n </div>\r\n} @else {\r\n <div class=\"acx__content\">\r\n <ng-content></ng-content>\r\n </div>\r\n}\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"], dependencies: [{ kind: "component", type: CardSummaryComponent, selector: "ac-card-summary", inputs: ["blocks"] }, { kind: "component", type: CardTabsBarComponent, selector: "ac-card-tabs-bar", inputs: ["tabs", "activeTabId", "badgeClass"], outputs: ["tabSelected", "tabAction"] }, { kind: "component", type: CardTabContentComponent, selector: "ac-card-tab-content", inputs: ["activeTab", "cardId", "templateRef"] }] });
879
- }
880
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCardContentComponent, decorators: [{
881
- type: Component,
882
- args: [{ selector: 'ac-advanced-card-content', imports: [CardSummaryComponent, CardTabsBarComponent, CardTabContentComponent], template: "@let vm = viewModel();\r\n\r\n<ac-card-summary [blocks]=\"vm.summaryBlocks\" />\r\n\r\n@if (vm.tabs.length) {\r\n <div class=\"tabs\">\r\n <ac-card-tabs-bar\r\n [tabs]=\"vm.tabs\"\r\n [activeTabId]=\"vm.activeTabId\"\r\n [badgeClass]=\"badgeClass()\"\r\n (tabSelected)=\"onSelect($event)\"\r\n (tabAction)=\"onAction($event)\"\r\n />\r\n\r\n <ac-card-tab-content\r\n [activeTab]=\"vm.activeTab\"\r\n [cardId]=\"vm.cardId\"\r\n [templateRef]=\"vm.templateRef\"\r\n />\r\n </div>\r\n} @else {\r\n <div class=\"acx__content\">\r\n <ng-content></ng-content>\r\n </div>\r\n}\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
883
- }], propDecorators: { viewModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewModel", required: true }] }], badgeClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeClass", required: true }] }], tabSelected: [{ type: i0.Output, args: ["tabSelected"] }], tabAction: [{ type: i0.Output, args: ["tabAction"] }] } });
884
-
885
- class AdvancedCardOverlayComponent {
886
- config = input.required(...(ngDevMode ? [{ debugName: "config" }] : []));
887
- mode = input.required(...(ngDevMode ? [{ debugName: "mode" }] : []));
888
- closeOnBackdrop = input(true, ...(ngDevMode ? [{ debugName: "closeOnBackdrop" }] : []));
889
- badgeClass = input.required(...(ngDevMode ? [{ debugName: "badgeClass" }] : []));
890
- viewModel = input.required(...(ngDevMode ? [{ debugName: "viewModel" }] : []));
891
- actionClick = output();
892
- close = output();
893
- tabSelected = output();
894
- tabAction = output();
895
- onBackdrop() {
896
- if (this.closeOnBackdrop())
897
- this.close.emit();
741
+ class AdvancedTable {
742
+ // Inputs
743
+ columns = input([], ...(ngDevMode ? [{ debugName: "columns" }] : []));
744
+ data = input([], ...(ngDevMode ? [{ debugName: "data" }] : []));
745
+ config = input({
746
+ globalSearch: true,
747
+ columnFilters: false,
748
+ selectable: false,
749
+ selectionMode: 'multiple',
750
+ pagination: { enabled: false, pageSize: 10, pageSizeOptions: [10, 25, 50] },
751
+ scroll: { mode: 'none' },
752
+ emptyText: 'Sin resultados',
753
+ rowIdKey: 'id',
754
+ globalSearchVisibleOnly: true,
755
+ }, ...(ngDevMode ? [{ debugName: "config" }] : []));
756
+ set lang(value) {
757
+ this._lang.set(value ?? TABLE_LANG_DEFAULT);
898
758
  }
899
- onAction(a) {
900
- this.actionClick.emit(a);
759
+ set i18n(value) {
760
+ this._override.set(value ?? {});
901
761
  }
902
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCardOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
903
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.1.4", type: AdvancedCardOverlayComponent, isStandalone: true, selector: "ac-advanced-card-overlay", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: true, transformFunction: null }, closeOnBackdrop: { classPropertyName: "closeOnBackdrop", publicName: "closeOnBackdrop", isSignal: true, isRequired: false, transformFunction: null }, badgeClass: { classPropertyName: "badgeClass", publicName: "badgeClass", isSignal: true, isRequired: true, transformFunction: null }, viewModel: { classPropertyName: "viewModel", publicName: "viewModel", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { actionClick: "actionClick", close: "close", tabSelected: "tabSelected", tabAction: "tabAction" }, ngImport: i0, template: "@let isModal = mode() === 'modal';\r\n\r\n<div class=\"overlay\" [class.modal-center]=\"isModal\" (click)=\"onBackdrop()\">\r\n <section\r\n class=\"panel\"\r\n [class.panel--drawer]=\"!isModal\"\r\n [class.panel--modal]=\"isModal\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <ac-card-header\r\n variant=\"panel\"\r\n [title]=\"config().title\"\r\n [badge]=\"config().badge\"\r\n [actions]=\"config().actions\"\r\n [badgeClass]=\"badgeClass()\"\r\n (actionClick)=\"onAction($event)\"\r\n (close)=\"close.emit()\"\r\n />\r\n\r\n <div class=\"panel__body min-croll\">\r\n <ac-advanced-card-content\r\n [viewModel]=\"viewModel()\"\r\n [badgeClass]=\"badgeClass()\"\r\n (tabSelected)=\"tabSelected.emit($event)\"\r\n (tabAction)=\"tabAction.emit($event)\"\r\n >\r\n <ng-content></ng-content>\r\n </ac-advanced-card-content>\r\n </div>\r\n </section>\r\n</div>\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"], dependencies: [{ kind: "component", type: CardHeaderComponent, selector: "ac-card-header", inputs: ["variant", "title", "badge", "actions", "sticky", "badgeClass"], outputs: ["actionClick", "close"] }, { kind: "component", type: AdvancedCardContentComponent, selector: "ac-advanced-card-content", inputs: ["viewModel", "badgeClass"], outputs: ["tabSelected", "tabAction"] }] });
904
- }
905
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCardOverlayComponent, decorators: [{
906
- type: Component,
907
- args: [{ selector: 'ac-advanced-card-overlay', imports: [CardHeaderComponent, AdvancedCardContentComponent], template: "@let isModal = mode() === 'modal';\r\n\r\n<div class=\"overlay\" [class.modal-center]=\"isModal\" (click)=\"onBackdrop()\">\r\n <section\r\n class=\"panel\"\r\n [class.panel--drawer]=\"!isModal\"\r\n [class.panel--modal]=\"isModal\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <ac-card-header\r\n variant=\"panel\"\r\n [title]=\"config().title\"\r\n [badge]=\"config().badge\"\r\n [actions]=\"config().actions\"\r\n [badgeClass]=\"badgeClass()\"\r\n (actionClick)=\"onAction($event)\"\r\n (close)=\"close.emit()\"\r\n />\r\n\r\n <div class=\"panel__body min-croll\">\r\n <ac-advanced-card-content\r\n [viewModel]=\"viewModel()\"\r\n [badgeClass]=\"badgeClass()\"\r\n (tabSelected)=\"tabSelected.emit($event)\"\r\n (tabAction)=\"tabAction.emit($event)\"\r\n >\r\n <ng-content></ng-content>\r\n </ac-advanced-card-content>\r\n </div>\r\n </section>\r\n</div>\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
908
- }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: true }] }], closeOnBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnBackdrop", required: false }] }], badgeClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeClass", required: true }] }], viewModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewModel", required: true }] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }], close: [{ type: i0.Output, args: ["close"] }], tabSelected: [{ type: i0.Output, args: ["tabSelected"] }], tabAction: [{ type: i0.Output, args: ["tabAction"] }] } });
909
-
910
- class AdvancedCardInlineComponent {
911
- config = input.required(...(ngDevMode ? [{ debugName: "config" }] : []));
912
- stickyHeader = input(false, ...(ngDevMode ? [{ debugName: "stickyHeader" }] : []));
913
- fullWidth = input(false, ...(ngDevMode ? [{ debugName: "fullWidth" }] : []));
914
- badgeClass = input.required(...(ngDevMode ? [{ debugName: "badgeClass" }] : []));
915
- viewModel = input.required(...(ngDevMode ? [{ debugName: "viewModel" }] : []));
762
+ // Outputs
763
+ rowClick = output();
764
+ selectionChange = output();
916
765
  actionClick = output();
917
- close = output();
918
- onAction(a) {
919
- this.actionClick.emit(a);
920
- }
921
- tabSelected = output();
922
- tabAction = output();
923
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCardInlineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
924
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.1.4", type: AdvancedCardInlineComponent, isStandalone: true, selector: "ac-advanced-card-inline", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, stickyHeader: { classPropertyName: "stickyHeader", publicName: "stickyHeader", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null }, badgeClass: { classPropertyName: "badgeClass", publicName: "badgeClass", isSignal: true, isRequired: true, transformFunction: null }, viewModel: { classPropertyName: "viewModel", publicName: "viewModel", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { actionClick: "actionClick", close: "close", tabSelected: "tabSelected", tabAction: "tabAction" }, ngImport: i0, template: "<section class=\"ac ac--expanded\" [class.ac--full]=\"fullWidth()\">\r\n <ac-card-header\r\n variant=\"inline\"\r\n [title]=\"config().title\"\r\n [badge]=\"config().badge\"\r\n [actions]=\"config().actions\"\r\n [sticky]=\"stickyHeader()\"\r\n [badgeClass]=\"badgeClass()\"\r\n (actionClick)=\"onAction($event)\"\r\n (close)=\"close.emit()\"\r\n />\r\n\r\n <div class=\"acx__body\">\r\n <ac-advanced-card-content\r\n [viewModel]=\"viewModel()\"\r\n [badgeClass]=\"badgeClass()\"\r\n (tabSelected)=\"tabSelected.emit($event)\"\r\n (tabAction)=\"tabAction.emit($event)\"\r\n >\r\n <ng-content></ng-content>\r\n </ac-advanced-card-content>\r\n </div>\r\n</section>\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"], dependencies: [{ kind: "component", type: AdvancedCardContentComponent, selector: "ac-advanced-card-content", inputs: ["viewModel", "badgeClass"], outputs: ["tabSelected", "tabAction"] }, { kind: "component", type: CardHeaderComponent, selector: "ac-card-header", inputs: ["variant", "title", "badge", "actions", "sticky", "badgeClass"], outputs: ["actionClick", "close"] }] });
925
- }
926
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCardInlineComponent, decorators: [{
927
- type: Component,
928
- args: [{ selector: 'ac-advanced-card-inline', imports: [AdvancedCardContentComponent, CardHeaderComponent], template: "<section class=\"ac ac--expanded\" [class.ac--full]=\"fullWidth()\">\r\n <ac-card-header\r\n variant=\"inline\"\r\n [title]=\"config().title\"\r\n [badge]=\"config().badge\"\r\n [actions]=\"config().actions\"\r\n [sticky]=\"stickyHeader()\"\r\n [badgeClass]=\"badgeClass()\"\r\n (actionClick)=\"onAction($event)\"\r\n (close)=\"close.emit()\"\r\n />\r\n\r\n <div class=\"acx__body\">\r\n <ac-advanced-card-content\r\n [viewModel]=\"viewModel()\"\r\n [badgeClass]=\"badgeClass()\"\r\n (tabSelected)=\"tabSelected.emit($event)\"\r\n (tabAction)=\"tabAction.emit($event)\"\r\n >\r\n <ng-content></ng-content>\r\n </ac-advanced-card-content>\r\n </div>\r\n</section>\r\n", styles: [":host{display:block}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
929
- }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], stickyHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "stickyHeader", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], badgeClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeClass", required: true }] }], viewModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewModel", required: true }] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }], close: [{ type: i0.Output, args: ["close"] }], tabSelected: [{ type: i0.Output, args: ["tabSelected"] }], tabAction: [{ type: i0.Output, args: ["tabAction"] }] } });
930
-
931
- class AdvancedCard {
932
- config = input.required(...(ngDevMode ? [{ debugName: "config" }] : []));
933
- fullWidthOnExpand = input(true, ...(ngDevMode ? [{ debugName: "fullWidthOnExpand" }] : []));
934
- stickyHeader = input(true, ...(ngDevMode ? [{ debugName: "stickyHeader" }] : []));
935
- closeOnEsc = input(true, ...(ngDevMode ? [{ debugName: "closeOnEsc" }] : []));
936
- // ===== Outputs
937
- expandedChange = output();
938
- action = output();
939
- tabChanged = output();
940
- tabAction = output();
941
- // ===== Projected templates (via directive)
942
- projectedTemplates = contentChildren(AdvancedCardTemplateDirective, { ...(ngDevMode ? { debugName: "projectedTemplates" } : {}), descendants: true });
943
- // ===== State
944
- expanded = signal(false, ...(ngDevMode ? [{ debugName: "expanded" }] : []));
945
- activeTabId = signal(null, ...(ngDevMode ? [{ debugName: "activeTabId" }] : []));
946
- // ===== Computeds
947
- cardId = computed(() => this.config().id, ...(ngDevMode ? [{ debugName: "cardId" }] : []));
948
- expandMode = computed(() => this.config().expandMode ?? 'inline', ...(ngDevMode ? [{ debugName: "expandMode" }] : []));
949
- closeOnBackdrop = computed(() => this.config().closeOnBackdrop ?? true, ...(ngDevMode ? [{ debugName: "closeOnBackdrop" }] : []));
950
- isInline = computed(() => this.expandMode() === 'inline', ...(ngDevMode ? [{ debugName: "isInline" }] : []));
951
- isDrawer = computed(() => this.expandMode() === 'drawer', ...(ngDevMode ? [{ debugName: "isDrawer" }] : []));
952
- isModal = computed(() => this.expandMode() === 'modal', ...(ngDevMode ? [{ debugName: "isModal" }] : []));
953
- hasHighlights = computed(() => (this.config().highlights?.length ?? 0) > 0, ...(ngDevMode ? [{ debugName: "hasHighlights" }] : []));
954
- hasSummaryBlocks = computed(() => (this.config().summaryBlocks?.length ?? 0) > 0, ...(ngDevMode ? [{ debugName: "hasSummaryBlocks" }] : []));
955
- tabs = computed(() => this.config().tabs ?? [], ...(ngDevMode ? [{ debugName: "tabs" }] : []));
956
- activeTab = computed(() => {
957
- const id = this.activeTabId();
958
- if (!id)
959
- return null;
960
- return this.tabs().find((t) => t.id === id) ?? null;
961
- }, ...(ngDevMode ? [{ debugName: "activeTab" }] : []));
962
- templateMap = computed(() => {
963
- const map = new Map();
964
- for (const dir of this.projectedTemplates()) {
965
- map.set(dir.templateId(), dir);
766
+ // Signals
767
+ globalQuery = signal('', ...(ngDevMode ? [{ debugName: "globalQuery" }] : []));
768
+ columnQueries = signal({}, ...(ngDevMode ? [{ debugName: "columnQueries" }] : []));
769
+ sortState = signal(null, ...(ngDevMode ? [{ debugName: "sortState" }] : []));
770
+ page = signal(1, ...(ngDevMode ? [{ debugName: "page" }] : []));
771
+ visibleCount = signal(0, ...(ngDevMode ? [{ debugName: "visibleCount" }] : []));
772
+ modalOpen = signal(false, ...(ngDevMode ? [{ debugName: "modalOpen" }] : []));
773
+ modalImageSrc = signal('', ...(ngDevMode ? [{ debugName: "modalImageSrc" }] : []));
774
+ modalImageAlt = signal('', ...(ngDevMode ? [{ debugName: "modalImageAlt" }] : []));
775
+ selectedIdsSet = signal(new Set(), ...(ngDevMode ? [{ debugName: "selectedIdsSet" }] : []));
776
+ pageSize = signal(this.config().pagination?.pageSize ?? 10, ...(ngDevMode ? [{ debugName: "pageSize" }] : []));
777
+ _lang = signal(TABLE_LANG_DEFAULT, ...(ngDevMode ? [{ debugName: "_lang" }] : []));
778
+ _override = signal({}, ...(ngDevMode ? [{ debugName: "_override" }] : []));
779
+ // Computed Data
780
+ selectedIds = computed(() => Array.from(this.selectedIdsSet()), ...(ngDevMode ? [{ debugName: "selectedIds" }] : []));
781
+ visibleColumns = computed(() => (this.columns() ?? []).filter((c) => !c.hidden), ...(ngDevMode ? [{ debugName: "visibleColumns" }] : []));
782
+ showSelectionColumn = computed(() => !!this.config().selectable, ...(ngDevMode ? [{ debugName: "showSelectionColumn" }] : []));
783
+ gridTemplateColumns = computed(() => {
784
+ const cols = [];
785
+ if (this.showSelectionColumn())
786
+ cols.push('48px'); // selección
787
+ for (const c of this.visibleColumns()) {
788
+ cols.push(this.sizeToCss(c.size));
966
789
  }
967
- return map;
968
- }, ...(ngDevMode ? [{ debugName: "templateMap" }] : []));
969
- density = computed(() => this.config().density ?? 'comfortable', ...(ngDevMode ? [{ debugName: "density" }] : []));
970
- size = computed(() => this.config().size ?? 'md', ...(ngDevMode ? [{ debugName: "size" }] : []));
971
- hostClass = computed(() => {
972
- return `ac-host ac-density--${this.density()} ac-size--${this.size()}`;
973
- }, ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
974
- activeTemplateRef = computed(() => {
975
- const template = this.getActiveTemplate();
976
- // tip: puede ser TemplateRef<any>; lo normalizamos
977
- return (template?.templateRef ?? null);
978
- }, ...(ngDevMode ? [{ debugName: "activeTemplateRef" }] : []));
979
- contentVm = computed(() => ({
980
- cardId: this.cardId(),
981
- summaryBlocks: this.config().summaryBlocks,
982
- tabs: this.tabs(),
983
- activeTabId: this.activeTabId(),
984
- activeTab: this.activeTab(),
985
- templateRef: this.activeTemplateRef(),
986
- }), ...(ngDevMode ? [{ debugName: "contentVm" }] : []));
790
+ return cols.join(' ');
791
+ }, ...(ngDevMode ? [{ debugName: "gridTemplateColumns" }] : []));
792
+ filteredData = computed(() => {
793
+ const rows = this.data() ?? [];
794
+ const colsAll = this.columns() ?? [];
795
+ const colsVisible = this.visibleColumns();
796
+ const config = this.config();
797
+ const globalQuery = this.globalQuery().trim().toLowerCase();
798
+ const columnQueries = this.columnQueries();
799
+ const colsForGlobal = (config.globalSearchVisibleOnly ?? true) ? colsVisible : colsAll.filter((c) => !c.hidden);
800
+ return rows.filter((row) => {
801
+ // column filters (AND)
802
+ for (const [key, q] of Object.entries(columnQueries)) {
803
+ const query = (q ?? '').trim().toLowerCase();
804
+ if (!query)
805
+ continue;
806
+ const col = colsAll.find((c) => c.key === key);
807
+ if (!col)
808
+ continue;
809
+ const value = this.getCellValue(row, col);
810
+ const text = this.valueToSearchableText(value, col.type, row).toLowerCase();
811
+ if (!text.includes(query))
812
+ return false;
813
+ }
814
+ // global search (OR across columns)
815
+ if (config.globalSearch && globalQuery) {
816
+ let any = false;
817
+ for (const col of colsForGlobal) {
818
+ const value = this.getCellValue(row, col);
819
+ const text = this.valueToSearchableText(value, col.type, row).toLowerCase();
820
+ if (text.includes(globalQuery)) {
821
+ any = true;
822
+ break;
823
+ }
824
+ }
825
+ if (!any)
826
+ return false;
827
+ }
828
+ return true;
829
+ });
830
+ }, ...(ngDevMode ? [{ debugName: "filteredData" }] : []));
831
+ sortedData = computed(() => {
832
+ const data = [...this.filteredData()];
833
+ const sort = this.sortState();
834
+ if (!sort)
835
+ return data;
836
+ const col = (this.columns() ?? []).find((c) => c.key === sort.key);
837
+ if (!col)
838
+ return data;
839
+ const dir = sort.dir === 'asc' ? 1 : -1;
840
+ data.sort((a, b) => {
841
+ const va = this.getCellValue(a, col);
842
+ const vb = this.getCellValue(b, col);
843
+ return dir * this.compareValues(va, vb, col.type);
844
+ });
845
+ return data;
846
+ }, ...(ngDevMode ? [{ debugName: "sortedData" }] : []));
847
+ pagedData = computed(() => {
848
+ const config = this.config();
849
+ const rows = this.sortedData();
850
+ const fixedN = config.fixedRowCount;
851
+ const cappedRows = typeof fixedN === 'number' && fixedN > 0 ? rows.slice(0, fixedN) : rows;
852
+ const mode = config.scroll?.mode ?? 'none';
853
+ if (mode === 'infinite') {
854
+ return cappedRows.slice(0, this.visibleCount());
855
+ }
856
+ // pagination
857
+ if (config.pagination?.enabled) {
858
+ const size = this.pageSize();
859
+ const page = this.page();
860
+ const start = (page - 1) * size;
861
+ return cappedRows.slice(start, start + size);
862
+ }
863
+ return cappedRows;
864
+ }, ...(ngDevMode ? [{ debugName: "pagedData" }] : []));
865
+ pagerItems = computed(() => {
866
+ const config = this.config();
867
+ if (!config.pagination?.enabled)
868
+ return [];
869
+ const totalPages = this.pageCount();
870
+ const current = this.page();
871
+ if (totalPages <= 1)
872
+ return [];
873
+ if (totalPages <= 7) {
874
+ return Array.from({ length: totalPages }, (_, i) => i + 1);
875
+ }
876
+ const items = [];
877
+ const first = 1;
878
+ const last = totalPages;
879
+ const around = 1;
880
+ const start = Math.max(2, current - around);
881
+ const end = Math.min(last - 1, current + around);
882
+ items.push(first);
883
+ if (start > 2)
884
+ items.push('…');
885
+ for (let p = start; p <= end; p++) {
886
+ items.push(p);
887
+ }
888
+ if (end < last - 1)
889
+ items.push('…');
890
+ items.push(last);
891
+ return items;
892
+ }, ...(ngDevMode ? [{ debugName: "pagerItems" }] : []));
893
+ totalCount = computed(() => this.sortedData().length, ...(ngDevMode ? [{ debugName: "totalCount" }] : []));
894
+ pageCount = computed(() => {
895
+ const config = this.config();
896
+ if (!config.pagination?.enabled)
897
+ return 1;
898
+ return Math.max(1, Math.ceil(this.totalCount() / this.pageSize()));
899
+ }, ...(ngDevMode ? [{ debugName: "pageCount" }] : []));
900
+ isAllSelectedOnPage = computed(() => {
901
+ if (!this.showSelectionColumn())
902
+ return false;
903
+ const ids = this.pagedData().map((r) => this.getRowId(r));
904
+ if (ids.length === 0)
905
+ return false;
906
+ const set = this.selectedIdsSet();
907
+ return ids.every((id) => set.has(id));
908
+ }, ...(ngDevMode ? [{ debugName: "isAllSelectedOnPage" }] : []));
909
+ i18nCom = computed(() => {
910
+ const base = TABLE_I18N_BY_LANG[this._lang()];
911
+ const override = this._override();
912
+ return { ...base, ...override };
913
+ }, ...(ngDevMode ? [{ debugName: "i18nCom" }] : []));
987
914
  // Effects
988
- notifyExpandenChangesEffect = effect(() => {
989
- this.expandedChange.emit(this.expanded());
990
- }, ...(ngDevMode ? [{ debugName: "notifyExpandenChangesEffect" }] : []));
991
- initiActiveTabEffect = effect(() => {
992
- const tabs = this.tabs();
993
- if (!tabs.length) {
994
- this.activeTabId.set(null);
915
+ infiniteScrollEffect = effect(() => {
916
+ const config = this.config();
917
+ const mode = config.scroll?.mode ?? 'none';
918
+ const batch = config.scroll?.batchSize ?? 50;
919
+ if (mode === 'infinite') {
920
+ this.visibleCount.set(batch);
921
+ }
922
+ else {
923
+ this.visibleCount.set(Number.MAX_SAFE_INTEGER);
924
+ }
925
+ }, ...(ngDevMode ? [{ debugName: "infiniteScrollEffect" }] : []));
926
+ selectionDataEffect = effect(() => {
927
+ this.selectionChange.emit(this.selectedIds());
928
+ }, ...(ngDevMode ? [{ debugName: "selectionDataEffect" }] : []));
929
+ pagesCountEffect = effect(() => {
930
+ const totalPages = this.pageCount();
931
+ if (this.page() > totalPages) {
932
+ this.page.set(totalPages);
933
+ }
934
+ }, ...(ngDevMode ? [{ debugName: "pagesCountEffect" }] : []));
935
+ // UI Actions
936
+ onHeaderClickSort(col) {
937
+ if (!col.sortable)
995
938
  return;
939
+ const current = this.sortState();
940
+ if (!current || current.key !== col.key) {
941
+ this.sortState.set({ key: col.key, dir: 'asc' });
996
942
  }
997
- const preferred = this.config().defaultTabId;
998
- const current = this.activeTabId();
999
- const stillExists = current && tabs.some((t) => t.id === current);
1000
- if (!stillExists) {
1001
- const next = preferred && tabs.some((t) => t.id === preferred) ? preferred : (tabs[0]?.id ?? null);
1002
- this.activeTabId.set(next);
943
+ else if (current.dir === 'asc') {
944
+ this.sortState.set({ key: col.key, dir: 'desc' });
945
+ }
946
+ else {
947
+ this.sortState.set(null);
948
+ }
949
+ this.page.set(1);
950
+ }
951
+ onBodyScroll(event) {
952
+ const config = this.config();
953
+ if ((config.scroll?.mode ?? 'none') !== 'infinite')
954
+ return;
955
+ const el = event.target;
956
+ const thresholdPx = 120;
957
+ const nearBottom = el.scrollTop + el.clientHeight >= el.scrollHeight - thresholdPx;
958
+ if (!nearBottom)
959
+ return;
960
+ const batch = config.scroll?.batchSize ?? 50;
961
+ const next = Math.min(this.sortedData().length, this.visibleCount() + batch);
962
+ this.visibleCount.set(next);
963
+ }
964
+ onPageSizeChange(size) {
965
+ if (!Number.isFinite(size) || size <= 0)
966
+ return;
967
+ this.pageSize.set(size);
968
+ this.page.set(1);
969
+ }
970
+ getCellValue(row, col) {
971
+ try {
972
+ return col.valueGetter ? col.valueGetter(row) : row?.[col.key];
973
+ }
974
+ catch {
975
+ return undefined;
1003
976
  }
1004
- }, ...(ngDevMode ? [{ debugName: "initiActiveTabEffect" }] : []));
1005
- // ===== Actions
1006
- toggleExpand() {
1007
- this.expanded.update((v) => !v);
1008
977
  }
1009
- expand() {
1010
- if (!this.expanded())
1011
- this.expanded.set(true);
978
+ getRowId(row) {
979
+ const config = this.config();
980
+ if (config.rowIdGetter)
981
+ return config.rowIdGetter(row);
982
+ const key = config.rowIdKey ?? 'id';
983
+ const value = row?.[key];
984
+ return (value ?? JSON.stringify(row));
1012
985
  }
1013
- collapse() {
1014
- if (this.expanded())
1015
- this.expanded.set(false);
986
+ setGlobalQuery(query) {
987
+ this.globalQuery.set(query ?? '');
988
+ this.page.set(1);
989
+ this.resetInfiniteIfNeeded();
1016
990
  }
1017
- onActionClick(a) {
1018
- if (a.disabled)
1019
- return;
1020
- this.action.emit({ actionId: a.id, cardId: this.cardId() });
991
+ setColumnQuery(key, query) {
992
+ const next = { ...this.columnQueries() };
993
+ next[key] = query ?? '';
994
+ this.columnQueries.set(next);
995
+ this.page.set(1);
996
+ this.resetInfiniteIfNeeded();
1021
997
  }
1022
- // ===== Tabs
1023
- selectTab(tabId) {
1024
- if (this.activeTabId() === tabId)
998
+ clearFilters() {
999
+ this.globalQuery.set('');
1000
+ this.columnQueries.set({});
1001
+ this.page.set(1);
1002
+ this.resetInfiniteIfNeeded();
1003
+ }
1004
+ onRowClick(row) {
1005
+ this.rowClick.emit(row);
1006
+ }
1007
+ toggleRowSelection(row) {
1008
+ const config = this.config();
1009
+ if (!config.selectable)
1025
1010
  return;
1026
- this.activeTabId.set(tabId);
1027
- this.tabChanged.emit({ tabId, cardId: this.cardId() });
1011
+ const id = this.getRowId(row);
1012
+ const mode = config.selectionMode ?? 'multiple';
1013
+ const set = new Set(this.selectedIdsSet());
1014
+ if (mode === 'single') {
1015
+ if (set.has(id))
1016
+ set.clear();
1017
+ else {
1018
+ set.clear();
1019
+ set.add(id);
1020
+ }
1021
+ }
1022
+ else {
1023
+ if (set.has(id))
1024
+ set.delete(id);
1025
+ else
1026
+ set.add(id);
1027
+ }
1028
+ this.selectedIdsSet.set(set);
1028
1029
  }
1029
- onTabActionClick(tab, a) {
1030
- if (a.disabled)
1030
+ toggleSelectAllOnPage() {
1031
+ const config = this.config();
1032
+ if (!config.selectable)
1031
1033
  return;
1032
- this.tabAction.emit({ tabId: tab.id, actionId: a.id, cardId: this.cardId() });
1034
+ if ((config.selectionMode ?? 'multiple') === 'single')
1035
+ return;
1036
+ const ids = this.pagedData().map((r) => this.getRowId(r));
1037
+ const set = new Set(this.selectedIdsSet());
1038
+ const allSelected = ids.every((id) => set.has(id));
1039
+ if (allSelected)
1040
+ ids.forEach((id) => set.delete(id));
1041
+ else
1042
+ ids.forEach((id) => set.add(id));
1043
+ this.selectedIdsSet.set(set);
1033
1044
  }
1034
- getActiveTemplate() {
1035
- const at = this.activeTab();
1036
- if (!at || at.kind !== 'template' || !at.templateId)
1037
- return null;
1038
- return this.templateMap().get(at.templateId) ?? null;
1045
+ prevPage() {
1046
+ this.page.set(Math.max(1, this.page() - 1));
1039
1047
  }
1040
- // ===== Styling helpers
1041
- badgeClass(tone) {
1042
- switch (tone) {
1043
- case 'success':
1044
- return 'badge badge--success';
1045
- case 'warning':
1046
- return 'badge badge--warning';
1047
- case 'danger':
1048
- return 'badge badge--danger';
1049
- case 'primary':
1050
- return 'badge badge--primary';
1048
+ nextPage() {
1049
+ this.page.set(Math.min(this.pageCount(), this.page() + 1));
1050
+ }
1051
+ goToPage(p) {
1052
+ const clamped = Math.max(1, Math.min(this.pageCount(), p));
1053
+ this.page.set(clamped);
1054
+ }
1055
+ openImageModal(src, alt) {
1056
+ this.modalImageSrc.set(src);
1057
+ this.modalImageAlt.set(alt);
1058
+ this.modalOpen.set(true);
1059
+ }
1060
+ closeModal() {
1061
+ this.modalOpen.set(false);
1062
+ this.modalImageSrc.set('');
1063
+ this.modalImageAlt.set('');
1064
+ }
1065
+ // Private functions
1066
+ resetInfiniteIfNeeded() {
1067
+ const config = this.config();
1068
+ if ((config.scroll?.mode ?? 'none') !== 'infinite')
1069
+ return;
1070
+ const batch = config.scroll?.batchSize ?? 50;
1071
+ this.visibleCount.set(batch);
1072
+ }
1073
+ sizeToCss(size) {
1074
+ switch (size) {
1075
+ case 'XS':
1076
+ return '80px';
1077
+ case 'SM':
1078
+ return '120px';
1079
+ case 'MD':
1080
+ return '180px';
1081
+ case 'LG':
1082
+ return '260px';
1083
+ case 'XL':
1084
+ return '360px';
1085
+ case 'AUTO-XL':
1086
+ return 'minmax(360px, 1fr)';
1087
+ case 'AUTO':
1051
1088
  default:
1052
- return 'badge badge--neutral';
1089
+ return 'minmax(240px, 1fr)';
1053
1090
  }
1054
1091
  }
1055
- // ===== Keyboard
1056
- onKeydown(ev) {
1057
- if (!this.closeOnEsc())
1058
- return;
1059
- if (ev.key === 'Escape')
1060
- this.collapse();
1092
+ toNumber(value) {
1093
+ if (typeof value === 'number')
1094
+ return value;
1095
+ if (typeof value === 'string') {
1096
+ return Number(value.replace(/,/g, '').trim());
1097
+ }
1098
+ return Number.NaN;
1061
1099
  }
1062
- onBackdropClick() {
1063
- if (!this.closeOnBackdrop())
1064
- return;
1065
- this.collapse();
1100
+ toDate(value) {
1101
+ if (value instanceof Date && !Number.isNaN(value.getTime()))
1102
+ return value;
1103
+ if (typeof value === 'string' || typeof value === 'number') {
1104
+ const date = new Date(value);
1105
+ return Number.isNaN(date.getTime()) ? null : date;
1106
+ }
1107
+ return null;
1066
1108
  }
1067
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCard, deps: [], target: i0.ɵɵFactoryTarget.Component });
1068
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: AdvancedCard, isStandalone: true, selector: "advanced-card", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, fullWidthOnExpand: { classPropertyName: "fullWidthOnExpand", publicName: "fullWidthOnExpand", isSignal: true, isRequired: false, transformFunction: null }, stickyHeader: { classPropertyName: "stickyHeader", publicName: "stickyHeader", isSignal: true, isRequired: false, transformFunction: null }, closeOnEsc: { classPropertyName: "closeOnEsc", publicName: "closeOnEsc", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expandedChange: "expandedChange", action: "action", tabChanged: "tabChanged", tabAction: "tabAction" }, host: { listeners: { "document:keydown": "onKeydown($event)" }, properties: { "class": "hostClass()" } }, queries: [{ propertyName: "projectedTemplates", predicate: AdvancedCardTemplateDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"ac__card\">\r\n <lib-card-compact\r\n [configuration]=\"config()\"\r\n [expanded]=\"expanded()\"\r\n [badgeClass]=\"badgeClass.bind(this)\"\r\n (expand)=\"expand()\"\r\n />\r\n\r\n @let mode = expandMode();\r\n\r\n @if (expanded()) {\r\n @if (mode === 'inline') {\r\n <ac-advanced-card-inline\r\n [config]=\"config()\"\r\n [stickyHeader]=\"stickyHeader()\"\r\n [fullWidth]=\"fullWidthOnExpand()\"\r\n [badgeClass]=\"badgeClass.bind(this)\"\r\n [viewModel]=\"contentVm()\"\r\n (actionClick)=\"onActionClick($event)\"\r\n (close)=\"collapse()\"\r\n (tabSelected)=\"selectTab($event)\"\r\n (tabAction)=\"onTabActionClick(activeTab()!, $event)\"\r\n >\r\n <ng-content></ng-content>\r\n </ac-advanced-card-inline>\r\n } @else {\r\n <ac-advanced-card-overlay\r\n [config]=\"config()\"\r\n [mode]=\"mode === 'modal' ? 'modal' : 'drawer'\"\r\n [closeOnBackdrop]=\"closeOnBackdrop()\"\r\n [badgeClass]=\"badgeClass.bind(this)\"\r\n [viewModel]=\"contentVm()\"\r\n (actionClick)=\"onActionClick($event)\"\r\n (close)=\"collapse()\"\r\n (tabSelected)=\"selectTab($event)\"\r\n (tabAction)=\"onTabActionClick(activeTab()!, $event)\"\r\n >\r\n <ng-content></ng-content>\r\n </ac-advanced-card-overlay>\r\n }\r\n }\r\n</div>\r\n\r\n<div class=\"ac__projected-templates\" aria-hidden=\"true\">\r\n <ng-content select=\"ng-template[advancedCardTemplate]\"></ng-content>\r\n</div>\r\n", styles: [":host.ac-host{--ac-surface: #ffffff;--ac-surface-2: #fafafa;--ac-border: #e5e7eb;--ac-border-soft: #eef2f7;--ac-shadow: 0 8px 22px rgba(17, 24, 39, .06);--ac-text: #111827;--ac-muted: #6b7280;--ac-radius: 14px;--ac-radius-sm: 10px;--ac-gap: 16px;--ac-title-size: 18px;--ac-subtitle-size: 13px;--ac-pad-card: 16px;--ac-pad-header: 14px 18px;--ac-pad-body: 18px;--ac-btn-radius: 10px;--ac-btn-pad: 8px 12px;--ac-btn-font: 700;--ac-primary: #1d4ed8;--ac-danger: #dc2626;--ac-badge-success-bg: #e6f9f1;--ac-badge-success-fg: #0f766e;--ac-badge-warning-bg: #fff7ed;--ac-badge-warning-fg: #b45309;--ac-badge-danger-bg: #fef2f2;--ac-badge-danger-fg: #b91c1c;--ac-badge-primary-bg: #eff6ff;--ac-badge-primary-fg: #1d4ed8;--ac-badge-neutral-bg: #f3f4f6;--ac-badge-neutral-fg: #374151;--ac-overlay: rgba(17, 24, 39, .45);--ac-overlay-blur: 2px;--ac-modal-max: 1200px;--ac-drawer-height: min(85vh, 900px);--ac-modal-height: min(80vh, 880px)}:host.ac-density--compact{--ac-gap: 12px;--ac-pad-card: 12px;--ac-pad-header: 12px 14px;--ac-pad-body: 14px;--ac-subtitle-size: 12px;--ac-btn-pad: 7px 10px}:host.ac-size--sm{--ac-title-size: 16px;--ac-radius: 12px;--ac-modal-max: 1000px}:host.ac-size--lg{--ac-title-size: 20px;--ac-radius: 16px;--ac-modal-max: 1400px}.ac__card{padding:10px;gap:10px}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"], dependencies: [{ kind: "component", type: CardCompactComponent, selector: "lib-card-compact", inputs: ["configuration", "expanded", "badgeClass"], outputs: ["expand"] }, { kind: "component", type: AdvancedCardOverlayComponent, selector: "ac-advanced-card-overlay", inputs: ["config", "mode", "closeOnBackdrop", "badgeClass", "viewModel"], outputs: ["actionClick", "close", "tabSelected", "tabAction"] }, { kind: "component", type: AdvancedCardInlineComponent, selector: "ac-advanced-card-inline", inputs: ["config", "stickyHeader", "fullWidth", "badgeClass", "viewModel"], outputs: ["actionClick", "close", "tabSelected", "tabAction"] }] });
1109
+ compareValues(firstValue, secondValue, type) {
1110
+ const firstNull = firstValue == null || firstValue === '';
1111
+ const secondNull = secondValue == null || secondValue === '';
1112
+ if (firstNull && secondNull)
1113
+ return 0;
1114
+ if (firstNull)
1115
+ return 1;
1116
+ if (secondNull)
1117
+ return -1;
1118
+ let response = null;
1119
+ switch (type) {
1120
+ case 'integer':
1121
+ case 'decimal':
1122
+ case 'currency': {
1123
+ const firstNumber = this.toNumber(firstValue);
1124
+ const secondNumber = this.toNumber(secondValue);
1125
+ if (!Number.isFinite(firstNumber) && !Number.isFinite(secondNumber))
1126
+ response = 0;
1127
+ else if (!Number.isFinite(firstNumber))
1128
+ response = 1;
1129
+ else if (!Number.isFinite(secondNumber))
1130
+ response = -1;
1131
+ else
1132
+ response = firstNumber === secondNumber ? 0 : firstNumber < secondNumber ? -1 : 1;
1133
+ break;
1134
+ }
1135
+ case 'date':
1136
+ case 'datetime': {
1137
+ const firstDate = this.toDate(firstValue);
1138
+ const toCompareDate = this.toDate(secondValue);
1139
+ if (!firstDate && !toCompareDate)
1140
+ response = 0;
1141
+ else if (!firstDate)
1142
+ response = 1;
1143
+ else if (!toCompareDate)
1144
+ response = -1;
1145
+ else {
1146
+ const ta = firstDate.getTime();
1147
+ const tb = toCompareDate.getTime();
1148
+ response = ta === tb ? 0 : ta < tb ? -1 : 1;
1149
+ }
1150
+ break;
1151
+ }
1152
+ case 'boolean': {
1153
+ const firstBool = firstValue === true ? 1 : 0;
1154
+ const secondBool = secondValue === true ? 1 : 0;
1155
+ response = firstBool - secondBool;
1156
+ break;
1157
+ }
1158
+ default: {
1159
+ const firstString = String(firstValue).toLowerCase();
1160
+ const secondString = String(secondValue).toLowerCase();
1161
+ response = firstString.localeCompare(secondString, 'es');
1162
+ break;
1163
+ }
1164
+ }
1165
+ return response;
1166
+ }
1167
+ valueToSearchableText(value, type, row) {
1168
+ if (value == null)
1169
+ return '';
1170
+ if (type === 'image')
1171
+ return '';
1172
+ if (type === 'boolean')
1173
+ return value === true ? 'si true yes 1' : 'no false 0';
1174
+ return String(value);
1175
+ }
1176
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
1177
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.4", type: AdvancedTable, isStandalone: true, selector: "advanced-table", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, lang: { classPropertyName: "lang", publicName: "lang", isSignal: false, isRequired: false, transformFunction: null }, i18n: { classPropertyName: "i18n", publicName: "i18n", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { rowClick: "rowClick", selectionChange: "selectionChange", actionClick: "actionClick" }, ngImport: i0, template: "<div class=\"dt-container\">\r\n <div class=\"dt-toolbar\">\r\n <!-- Search and Clean -->\r\n <table-toolbar\r\n [enabled]=\"config().globalSearch ?? true\"\r\n [query]=\"globalQuery()\"\r\n [i18n]=\"i18nCom()\"\r\n [showClear]=\"true\"\r\n (queryChange)=\"setGlobalQuery($event)\"\r\n (clear)=\"clearFilters()\"\r\n />\r\n\r\n <!-- Pagination -->\r\n @if (config().pagination?.enabled) {\r\n <table-pagination\r\n [page]=\"page()\"\r\n [pageSize]=\"pageSize()\"\r\n [pageCount]=\"pageCount()\"\r\n [totalCount]=\"totalCount()\"\r\n [pagerItems]=\"pagerItems()\"\r\n [pageSizeOptions]=\"config().pagination!.pageSizeOptions ?? [10, 25, 50]\"\r\n [i18n]=\"i18nCom()\"\r\n (pageChange)=\"goToPage($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"\r\n />\r\n }\r\n </div>\r\n\r\n <div class=\"dt-grid\">\r\n <!-- Data Table -->\r\n <table-grid\r\n [config]=\"config()\"\r\n [columns]=\"visibleColumns()\"\r\n [rows]=\"pagedData()\"\r\n [gridTemplateColumns]=\"gridTemplateColumns()\"\r\n [columnQueries]=\"columnQueries()\"\r\n [sortState]=\"sortState()\"\r\n [selectedIdsSet]=\"selectedIdsSet()\"\r\n (headerSort)=\"onHeaderClickSort($event)\"\r\n (columnQueryChange)=\"setColumnQuery($event.key, $event.value)\"\r\n (rowClick)=\"onRowClick($event)\"\r\n (toggleRow)=\"toggleRowSelection($event)\"\r\n (toggleAllOnPage)=\"toggleSelectAllOnPage()\"\r\n (openImage)=\"openImageModal($event.src, $event.alt)\"\r\n (actionClick)=\"actionClick.emit($event)\"\r\n (bodyScroll)=\"onBodyScroll($event)\"\r\n />\r\n </div>\r\n\r\n <!-- Image Modal -->\r\n <table-modal-image\r\n [open]=\"modalOpen()\"\r\n [src]=\"modalImageSrc()\"\r\n [alt]=\"modalImageAlt()\"\r\n (close)=\"closeModal()\"\r\n />\r\n</div>\r\n", styles: [":host{display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;--black: #171717;--black-light: #343434;--black-dark: #000000;--black-navy: #191a21;--xs-dark-gray: #5A5A5A;--dark-gray: #9E9E9E;--medium-gray: #D5D5D5;--gray: #F8F8F8;--light-gray: #C6C6C6;--xs-light-gray: #DFDFDF;--gray-white: #F5F4F4;--xxs-light-gray: #F2F2F2;--soft-white: #EEEEEE;--green-success: #208B6A;--blue: #3360fa;--blue-info: #7390EC;--orange: #F77C00;--yellow-warning: #FFBC57;--red: #E60018;--white: #FFFFFF;--disabled: #C6C6C6;--disabled-text: #9E9E9E;--radius-sm: 4px;--radius-md: 6px;--border: 1px solid var(--xs-light-gray);--focus-ring: 0 0 0 3px rgba(51, 96, 250, .18)}.dt-container{border:var(--border);border-radius:var(--radius-md);background:var(--white);overflow:hidden}.dt-toolbar{display:flex;justify-content:space-between;align-items:center;gap:12px;border-bottom:var(--border);background:var(--xxs-light-gray)}.dt-empty{padding:18px 12px;color:var(--xs-dark-gray)}@media(max-width:900px){.dt-toolbar{flex-wrap:wrap;align-items:flex-start;row-gap:10px;padding:10px 12px}.dt-toolbar>b2b-table-toolbar{flex:1 1 100%}.dt-toolbar>b2b-table-pagination{flex:1 1 100%;display:flex;justify-content:center}}\n"], dependencies: [{ kind: "component", type: TableModalImageComponent, selector: "table-modal-image", inputs: ["open", "src", "alt"], outputs: ["close"] }, { kind: "component", type: TableGridComponent, selector: "table-grid", inputs: ["config", "columns", "rows", "gridTemplateColumns", "columnQueries", "sortState", "selectedIdsSet", "timeZone", "i18n"], outputs: ["headerSort", "columnQueryChange", "rowClick", "toggleRow", "toggleAllOnPage", "openImage", "actionClick", "bodyScroll"] }, { kind: "component", type: TablePaginationComponent, selector: "table-pagination", inputs: ["page", "pageSize", "pageCount", "totalCount", "pageSizeOptions", "pagerItems", "i18n"], outputs: ["pageChange", "pageSizeChange"] }, { kind: "component", type: TableToolbarComponent, selector: "table-toolbar", inputs: ["enabled", "query", "showClear", "i18n"], outputs: ["queryChange", "clear"] }] });
1069
1178
  }
1070
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedCard, decorators: [{
1179
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImport: i0, type: AdvancedTable, decorators: [{
1071
1180
  type: Component,
1072
- args: [{ selector: 'advanced-card', imports: [CardCompactComponent, AdvancedCardOverlayComponent, AdvancedCardInlineComponent], host: {
1073
- '[class]': 'hostClass()',
1074
- }, template: "<div class=\"ac__card\">\r\n <lib-card-compact\r\n [configuration]=\"config()\"\r\n [expanded]=\"expanded()\"\r\n [badgeClass]=\"badgeClass.bind(this)\"\r\n (expand)=\"expand()\"\r\n />\r\n\r\n @let mode = expandMode();\r\n\r\n @if (expanded()) {\r\n @if (mode === 'inline') {\r\n <ac-advanced-card-inline\r\n [config]=\"config()\"\r\n [stickyHeader]=\"stickyHeader()\"\r\n [fullWidth]=\"fullWidthOnExpand()\"\r\n [badgeClass]=\"badgeClass.bind(this)\"\r\n [viewModel]=\"contentVm()\"\r\n (actionClick)=\"onActionClick($event)\"\r\n (close)=\"collapse()\"\r\n (tabSelected)=\"selectTab($event)\"\r\n (tabAction)=\"onTabActionClick(activeTab()!, $event)\"\r\n >\r\n <ng-content></ng-content>\r\n </ac-advanced-card-inline>\r\n } @else {\r\n <ac-advanced-card-overlay\r\n [config]=\"config()\"\r\n [mode]=\"mode === 'modal' ? 'modal' : 'drawer'\"\r\n [closeOnBackdrop]=\"closeOnBackdrop()\"\r\n [badgeClass]=\"badgeClass.bind(this)\"\r\n [viewModel]=\"contentVm()\"\r\n (actionClick)=\"onActionClick($event)\"\r\n (close)=\"collapse()\"\r\n (tabSelected)=\"selectTab($event)\"\r\n (tabAction)=\"onTabActionClick(activeTab()!, $event)\"\r\n >\r\n <ng-content></ng-content>\r\n </ac-advanced-card-overlay>\r\n }\r\n }\r\n</div>\r\n\r\n<div class=\"ac__projected-templates\" aria-hidden=\"true\">\r\n <ng-content select=\"ng-template[advancedCardTemplate]\"></ng-content>\r\n</div>\r\n", styles: [":host.ac-host{--ac-surface: #ffffff;--ac-surface-2: #fafafa;--ac-border: #e5e7eb;--ac-border-soft: #eef2f7;--ac-shadow: 0 8px 22px rgba(17, 24, 39, .06);--ac-text: #111827;--ac-muted: #6b7280;--ac-radius: 14px;--ac-radius-sm: 10px;--ac-gap: 16px;--ac-title-size: 18px;--ac-subtitle-size: 13px;--ac-pad-card: 16px;--ac-pad-header: 14px 18px;--ac-pad-body: 18px;--ac-btn-radius: 10px;--ac-btn-pad: 8px 12px;--ac-btn-font: 700;--ac-primary: #1d4ed8;--ac-danger: #dc2626;--ac-badge-success-bg: #e6f9f1;--ac-badge-success-fg: #0f766e;--ac-badge-warning-bg: #fff7ed;--ac-badge-warning-fg: #b45309;--ac-badge-danger-bg: #fef2f2;--ac-badge-danger-fg: #b91c1c;--ac-badge-primary-bg: #eff6ff;--ac-badge-primary-fg: #1d4ed8;--ac-badge-neutral-bg: #f3f4f6;--ac-badge-neutral-fg: #374151;--ac-overlay: rgba(17, 24, 39, .45);--ac-overlay-blur: 2px;--ac-modal-max: 1200px;--ac-drawer-height: min(85vh, 900px);--ac-modal-height: min(80vh, 880px)}:host.ac-density--compact{--ac-gap: 12px;--ac-pad-card: 12px;--ac-pad-header: 12px 14px;--ac-pad-body: 14px;--ac-subtitle-size: 12px;--ac-btn-pad: 7px 10px}:host.ac-size--sm{--ac-title-size: 16px;--ac-radius: 12px;--ac-modal-max: 1000px}:host.ac-size--lg{--ac-title-size: 20px;--ac-radius: 16px;--ac-modal-max: 1400px}.ac__card{padding:10px;gap:10px}\n", ":host{display:block}.ac{border:1px solid var(--ac-border);border-radius:var(--ac-radius-sm);background:var(--ac-surface);box-shadow:var(--ac-shadow)}.ac--hidden{display:none}.ac--compact{padding:var(--ac-pad-card);cursor:pointer;transition:transform .15s ease,box-shadow .15s ease;border-right:1px solid var(--ac-primary)}.ac--compact:hover{transform:translateY(-1px);box-shadow:0 12px 28px #1118271f;border-right:2px solid var(--ac-primary)}.ac__header{display:flex;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid #eaeaea}.ac__title{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.ac__subtitle{margin:4px 0 0;font-size:var(--ac-subtitle-size);color:var(--ac-muted)}.ac__highlights{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:14px}.ac__hl{border-right:1px solid #eaeaea;padding:0 10px;box-sizing:border-box}.ac__hl:nth-child(3n){border-right:none}.ac__hl-value{font-weight:900;font-size:calc(var(--ac-title-size) - 0px);color:var(--ac-text)}.ac__hl-label{font-size:12px;color:var(--ac-muted)}.ac__hl-hint{color:#9ca3af}.ac__footer{margin-top:14px;display:flex;justify-content:flex-end}.ac--expanded{margin-top:16px}.ac--full{width:100%}.acx__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface)}.acx__header--sticky{position:sticky;top:0;z-index:10}.acx__title{display:flex;align-items:center;gap:10px}.acx__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.acx__actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.acx__body{padding:var(--ac-pad-body);display:grid;gap:var(--ac-gap)}.acx__summary{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;padding-bottom:15px}.block{border:1px solid var(--ac-border-soft);border-radius:5px;padding:12px;background:var(--ac-surface-2);overflow:auto;scrollbar-width:thin;max-height:250px}.block__title{font-weight:800;color:var(--ac-text);margin-bottom:8px;font-size:13px}.block__row{display:flex;justify-content:space-between;gap:10px;padding:4px 0}.block__label{color:var(--ac-muted);font-size:12px}.block__value{color:var(--ac-text);font-size:12px;font-weight:800}.tabs{border:1px solid var(--ac-border-soft);border-radius:5px;overflow:hidden;background:var(--ac-surface)}.tabs__bar{display:flex;align-items:center;gap:6px;padding:8px;background:var(--ac-surface-2);border-bottom:1px solid var(--ac-border-soft)}.tab{padding:10px 14px;border-radius:5px;border:1px solid transparent;background:transparent;font-weight:800;cursor:pointer;color:var(--ac-badge-neutral-fg);display:inline-flex;align-items:center;gap:8px;height:100%}.tab:hover{background:#f3f4f6}.tab--active{background:var(--ac-surface);border-color:var(--ac-border);color:var(--ac-text);box-shadow:0 6px 18px #11182714}.tabs__spacer{flex:1}.tabs__actions{display:flex;gap:8px;flex-wrap:wrap}.tabs__content{padding:16px}.tab-text{color:var(--ac-text);line-height:1.5}.empty{border:1px dashed #d1d5db;border-radius:var(--ac-radius);padding:16px;color:var(--ac-muted);text-align:center;background:#fcfcfc}.btn{border-radius:var(--ac-btn-radius);padding:var(--ac-btn-pad);font-weight:var(--ac-btn-font);cursor:pointer;border:1px solid var(--ac-border);background:var(--ac-surface);color:var(--ac-text)}.btn:hover{transform:translateY(-1px);filter:brightness(1.1)}.btn--primary{background:var(--ac-primary);color:#fff;border-color:var(--ac-primary)}.btn--secondary{background:var(--ac-surface);border-color:#d1d5db}.btn--danger{background:var(--ac-danger);color:#fff;border-color:var(--ac-danger)}.btn--sm{padding:6px 10px;font-size:13px}.icon-btn{width:36px;height:36px;border-radius:var(--ac-btn-radius);border:1px solid var(--ac-border);background:var(--ac-surface);cursor:pointer;font-weight:900;padding:6px 4px;color:#000}.icon-btn>svg{fill:currentColor}.icon-btn:hover{transform:translateY(-1px)}.badge{font-size:12px;padding:4px 10px;border-radius:5px;font-weight:800;margin:auto 0}.badge--success{background:var(--ac-badge-success-bg);color:var(--ac-badge-success-fg)}.badge--warning{background:var(--ac-badge-warning-bg);color:var(--ac-badge-warning-fg)}.badge--danger{background:var(--ac-badge-danger-bg);color:var(--ac-badge-danger-fg)}.badge--primary{background:var(--ac-badge-primary-bg);color:var(--ac-badge-primary-fg)}.badge--neutral{background:var(--ac-badge-neutral-bg);color:var(--ac-badge-neutral-fg)}.overlay{position:fixed;inset:0;background:var(--ac-overlay);-webkit-backdrop-filter:blur(var(--ac-overlay-blur));backdrop-filter:blur(var(--ac-overlay-blur));z-index:999;display:flex;align-items:flex-end;justify-content:center;padding:16px}.panel{width:100%;max-width:var(--ac-modal-max);background:var(--ac-surface);border-radius:var(--ac-radius);border:1px solid var(--ac-border);box-shadow:0 20px 60px #00000040;overflow:hidden}.panel--drawer{border-bottom-left-radius:0;border-bottom-right-radius:0;height:var(--ac-drawer-height)}.panel--modal{height:var(--ac-modal-height)}.overlay.modal-center{align-items:center}.panel__header{display:flex;justify-content:space-between;gap:12px;padding:var(--ac-pad-header);border-bottom:1px solid var(--ac-border-soft);background:var(--ac-surface);position:sticky;top:0;z-index:10}.panel__title{display:flex;align-items:center;gap:10px}.panel__title-text{margin:0;font-size:var(--ac-title-size);font-weight:900;color:var(--ac-text)}.panel__body{padding:var(--ac-pad-body);overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent;height:calc(100% - 64px)}.ac__projected-templates{display:none}@media(max-width:1100px){.acx__summary,.ac__highlights{grid-template-columns:repeat(2,1fr)}}@media(max-width:640px){.ac__highlights{grid-template-columns:1fr}}.panel__body::-webkit-scrollbar{width:8px;height:8px}.panel__body::-webkit-scrollbar-track{background:transparent}.panel__body::-webkit-scrollbar-thumb{background-color:#00000059;border-radius:999px;border:2px solid transparent;background-clip:padding-box}.panel__body::-webkit-scrollbar-thumb:hover{background-color:#00000080}.panel__body::-webkit-scrollbar-corner{background:transparent}\n"] }]
1075
- }], propDecorators: { config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: true }] }], fullWidthOnExpand: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidthOnExpand", required: false }] }], stickyHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "stickyHeader", required: false }] }], closeOnEsc: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnEsc", required: false }] }], expandedChange: [{ type: i0.Output, args: ["expandedChange"] }], action: [{ type: i0.Output, args: ["action"] }], tabChanged: [{ type: i0.Output, args: ["tabChanged"] }], tabAction: [{ type: i0.Output, args: ["tabAction"] }], projectedTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => AdvancedCardTemplateDirective), { ...{
1076
- descendants: true,
1077
- }, isSignal: true }] }], onKeydown: [{
1078
- type: HostListener,
1079
- args: ['document:keydown', ['$event']]
1080
- }] } });
1181
+ args: [{ selector: 'advanced-table', imports: [
1182
+ TableModalImageComponent,
1183
+ TableGridComponent,
1184
+ TablePaginationComponent,
1185
+ TableToolbarComponent,
1186
+ ], template: "<div class=\"dt-container\">\r\n <div class=\"dt-toolbar\">\r\n <!-- Search and Clean -->\r\n <table-toolbar\r\n [enabled]=\"config().globalSearch ?? true\"\r\n [query]=\"globalQuery()\"\r\n [i18n]=\"i18nCom()\"\r\n [showClear]=\"true\"\r\n (queryChange)=\"setGlobalQuery($event)\"\r\n (clear)=\"clearFilters()\"\r\n />\r\n\r\n <!-- Pagination -->\r\n @if (config().pagination?.enabled) {\r\n <table-pagination\r\n [page]=\"page()\"\r\n [pageSize]=\"pageSize()\"\r\n [pageCount]=\"pageCount()\"\r\n [totalCount]=\"totalCount()\"\r\n [pagerItems]=\"pagerItems()\"\r\n [pageSizeOptions]=\"config().pagination!.pageSizeOptions ?? [10, 25, 50]\"\r\n [i18n]=\"i18nCom()\"\r\n (pageChange)=\"goToPage($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"\r\n />\r\n }\r\n </div>\r\n\r\n <div class=\"dt-grid\">\r\n <!-- Data Table -->\r\n <table-grid\r\n [config]=\"config()\"\r\n [columns]=\"visibleColumns()\"\r\n [rows]=\"pagedData()\"\r\n [gridTemplateColumns]=\"gridTemplateColumns()\"\r\n [columnQueries]=\"columnQueries()\"\r\n [sortState]=\"sortState()\"\r\n [selectedIdsSet]=\"selectedIdsSet()\"\r\n (headerSort)=\"onHeaderClickSort($event)\"\r\n (columnQueryChange)=\"setColumnQuery($event.key, $event.value)\"\r\n (rowClick)=\"onRowClick($event)\"\r\n (toggleRow)=\"toggleRowSelection($event)\"\r\n (toggleAllOnPage)=\"toggleSelectAllOnPage()\"\r\n (openImage)=\"openImageModal($event.src, $event.alt)\"\r\n (actionClick)=\"actionClick.emit($event)\"\r\n (bodyScroll)=\"onBodyScroll($event)\"\r\n />\r\n </div>\r\n\r\n <!-- Image Modal -->\r\n <table-modal-image\r\n [open]=\"modalOpen()\"\r\n [src]=\"modalImageSrc()\"\r\n [alt]=\"modalImageAlt()\"\r\n (close)=\"closeModal()\"\r\n />\r\n</div>\r\n", styles: [":host{display:block;font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;--black: #171717;--black-light: #343434;--black-dark: #000000;--black-navy: #191a21;--xs-dark-gray: #5A5A5A;--dark-gray: #9E9E9E;--medium-gray: #D5D5D5;--gray: #F8F8F8;--light-gray: #C6C6C6;--xs-light-gray: #DFDFDF;--gray-white: #F5F4F4;--xxs-light-gray: #F2F2F2;--soft-white: #EEEEEE;--green-success: #208B6A;--blue: #3360fa;--blue-info: #7390EC;--orange: #F77C00;--yellow-warning: #FFBC57;--red: #E60018;--white: #FFFFFF;--disabled: #C6C6C6;--disabled-text: #9E9E9E;--radius-sm: 4px;--radius-md: 6px;--border: 1px solid var(--xs-light-gray);--focus-ring: 0 0 0 3px rgba(51, 96, 250, .18)}.dt-container{border:var(--border);border-radius:var(--radius-md);background:var(--white);overflow:hidden}.dt-toolbar{display:flex;justify-content:space-between;align-items:center;gap:12px;border-bottom:var(--border);background:var(--xxs-light-gray)}.dt-empty{padding:18px 12px;color:var(--xs-dark-gray)}@media(max-width:900px){.dt-toolbar{flex-wrap:wrap;align-items:flex-start;row-gap:10px;padding:10px 12px}.dt-toolbar>b2b-table-toolbar{flex:1 1 100%}.dt-toolbar>b2b-table-pagination{flex:1 1 100%;display:flex;justify-content:center}}\n"] }]
1187
+ }], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], config: [{ type: i0.Input, args: [{ isSignal: true, alias: "config", required: false }] }], lang: [{
1188
+ type: Input
1189
+ }], i18n: [{
1190
+ type: Input
1191
+ }], rowClick: [{ type: i0.Output, args: ["rowClick"] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], actionClick: [{ type: i0.Output, args: ["actionClick"] }] } });
1081
1192
 
1082
1193
  /*
1083
1194
  * Public API Surface of b2b-tools
@@ -1087,5 +1198,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.4", ngImpor
1087
1198
  * Generated bundle index. Do not edit.
1088
1199
  */
1089
1200
 
1090
- export { AdvancedCard, AdvancedCardTemplateDirective, AdvancedTable, SVG_ICONS, TIME_ZONES };
1201
+ export { AdvancedCard, AdvancedCardTemplateDirective, AdvancedTable, SVG_ICONS, SimpleTable, TIME_ZONES };
1091
1202
  //# sourceMappingURL=b2b-tools.mjs.map