valtech-components 4.0.1013 → 4.0.1014

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.
Files changed (28) hide show
  1. package/esm2022/lib/components/atoms/display/display.component.mjs +2 -2
  2. package/esm2022/lib/components/organisms/data-table/data-table.component.mjs +317 -35
  3. package/esm2022/lib/components/organisms/data-table/types.mjs +1 -1
  4. package/esm2022/lib/components/organisms/field-schema-editor/field-schema-editor.component.mjs +4 -1
  5. package/esm2022/lib/components/organisms/field-schema-editor/types.mjs +1 -1
  6. package/esm2022/lib/components/organisms/form/form.component.mjs +7 -1
  7. package/esm2022/lib/components/organisms/survey-builder/survey-builder.component.mjs +386 -155
  8. package/esm2022/lib/components/organisms/survey-builder/survey-builder.i18n.mjs +15 -1
  9. package/esm2022/lib/components/organisms/survey-builder/types.mjs +1 -1
  10. package/esm2022/lib/components/types.mjs +1 -1
  11. package/esm2022/lib/services/forms/form-schema-builder.service.mjs +3 -1
  12. package/esm2022/lib/services/forms/types.mjs +1 -1
  13. package/esm2022/lib/services/requests/types.mjs +1 -1
  14. package/esm2022/lib/version.mjs +2 -2
  15. package/fesm2022/valtech-components.mjs +728 -190
  16. package/fesm2022/valtech-components.mjs.map +1 -1
  17. package/lib/components/organisms/data-table/data-table.component.d.ts +10 -1
  18. package/lib/components/organisms/data-table/types.d.ts +14 -0
  19. package/lib/components/organisms/field-schema-editor/field-schema-editor.component.d.ts +1 -0
  20. package/lib/components/organisms/field-schema-editor/types.d.ts +2 -0
  21. package/lib/components/organisms/survey-builder/survey-builder.component.d.ts +28 -5
  22. package/lib/components/organisms/survey-builder/types.d.ts +1 -0
  23. package/lib/components/types.d.ts +2 -0
  24. package/lib/services/forms/types.d.ts +2 -0
  25. package/lib/services/requests/types.d.ts +6 -0
  26. package/lib/version.d.ts +1 -1
  27. package/package.json +1 -1
  28. package/src/lib/components/styles/typography.scss +1 -1
@@ -70,7 +70,7 @@ import fixWebmDuration from 'fix-webm-duration';
70
70
  * Current version of valtech-components.
71
71
  * This is automatically updated during the publish process.
72
72
  */
73
- const VERSION = '4.0.1013';
73
+ const VERSION = '4.0.1014';
74
74
 
75
75
  function evaluateValtechAccess(rule, context, features = {}, visitedFeatures = new Set()) {
76
76
  if (rule == null)
@@ -8881,7 +8881,7 @@ class DisplayComponent {
8881
8881
  {{ getDisplayContent() }}
8882
8882
  </p>
8883
8883
  </ion-text>
8884
- `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-xl-wide: 1280px;--val-container-md-wide: 900px;--val-container-aside: 0px;--val-container-padding: 16px;--val-radius-xs: 10px;--val-radius-sm: 16px;--val-radius-md: 20px;--val-radius-lg: 28px;--val-radius-xl: 36px;--val-radius-full: 999px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--ion-color-warning: #ffde38;--ion-color-warning-rgb: 255, 222, 56;--ion-color-warning-contrast: #000000;--ion-color-warning-contrast-rgb: 0, 0, 0;--ion-color-warning-shade: #e0c331;--ion-color-warning-tint: #ffe14c;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-dark)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.small{font-size:1.5rem;line-height:2rem;font-weight:800}@media (min-width: 768px){.small{font-size:2rem;line-height:2.5rem}}.medium{font-size:2rem;line-height:2.5rem;font-weight:800}@media (min-width: 768px){.medium{font-size:2.5rem;line-height:3rem}}.large{font-size:2.5rem;line-height:3rem;font-weight:800}@media (min-width: 768px){.large{font-size:3rem;line-height:3.5rem}}.xlarge{font-size:3rem;line-height:2.5rem;font-weight:800}@media (min-width: 768px){.xlarge{font-size:4.375rem;line-height:4.125rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }] }); }
8884
+ `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-xl-wide: 1280px;--val-container-md-wide: 900px;--val-container-aside: 0px;--val-container-padding: 16px;--val-radius-xs: 10px;--val-radius-sm: 16px;--val-radius-md: 20px;--val-radius-lg: 28px;--val-radius-xl: 36px;--val-radius-full: 999px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--ion-color-warning: #ffde38;--ion-color-warning-rgb: 255, 222, 56;--ion-color-warning-contrast: #000000;--ion-color-warning-contrast-rgb: 0, 0, 0;--ion-color-warning-shade: #e0c331;--ion-color-warning-tint: #ffe14c;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-dark)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.small{font-size:1.5rem;line-height:2rem;font-weight:800}@media (min-width: 768px){.small{font-size:2rem;line-height:2.5rem}}.medium{font-size:2rem;line-height:2.5rem;font-weight:800}@media (min-width: 768px){.medium{font-size:2.5rem;line-height:3rem}}.large{font-size:2.5rem;line-height:3rem;font-weight:800}@media (min-width: 768px){.large{font-size:3rem;line-height:3.5rem}}.xlarge{font-size:3rem;line-height:3.5rem;font-weight:800}@media (min-width: 768px){.xlarge{font-size:4.375rem;line-height:4.125rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }] }); }
8885
8885
  }
8886
8886
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DisplayComponent, decorators: [{
8887
8887
  type: Component,
@@ -8891,7 +8891,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
8891
8891
  {{ getDisplayContent() }}
8892
8892
  </p>
8893
8893
  </ion-text>
8894
- `, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-xl-wide: 1280px;--val-container-md-wide: 900px;--val-container-aside: 0px;--val-container-padding: 16px;--val-radius-xs: 10px;--val-radius-sm: 16px;--val-radius-md: 20px;--val-radius-lg: 28px;--val-radius-xl: 36px;--val-radius-full: 999px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--ion-color-warning: #ffde38;--ion-color-warning-rgb: 255, 222, 56;--ion-color-warning-contrast: #000000;--ion-color-warning-contrast-rgb: 0, 0, 0;--ion-color-warning-shade: #e0c331;--ion-color-warning-tint: #ffe14c;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-dark)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.small{font-size:1.5rem;line-height:2rem;font-weight:800}@media (min-width: 768px){.small{font-size:2rem;line-height:2.5rem}}.medium{font-size:2rem;line-height:2.5rem;font-weight:800}@media (min-width: 768px){.medium{font-size:2.5rem;line-height:3rem}}.large{font-size:2.5rem;line-height:3rem;font-weight:800}@media (min-width: 768px){.large{font-size:3rem;line-height:3.5rem}}.xlarge{font-size:3rem;line-height:2.5rem;font-weight:800}@media (min-width: 768px){.xlarge{font-size:4.375rem;line-height:4.125rem}}\n"] }]
8894
+ `, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-xl-wide: 1280px;--val-container-md-wide: 900px;--val-container-aside: 0px;--val-container-padding: 16px;--val-radius-xs: 10px;--val-radius-sm: 16px;--val-radius-md: 20px;--val-radius-lg: 28px;--val-radius-xl: 36px;--val-radius-full: 999px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--ion-color-warning: #ffde38;--ion-color-warning-rgb: 255, 222, 56;--ion-color-warning-contrast: #000000;--ion-color-warning-contrast-rgb: 0, 0, 0;--ion-color-warning-shade: #e0c331;--ion-color-warning-tint: #ffe14c;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-dark)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.small{font-size:1.5rem;line-height:2rem;font-weight:800}@media (min-width: 768px){.small{font-size:2rem;line-height:2.5rem}}.medium{font-size:2rem;line-height:2.5rem;font-weight:800}@media (min-width: 768px){.medium{font-size:2.5rem;line-height:3rem}}.large{font-size:2.5rem;line-height:3rem;font-weight:800}@media (min-width: 768px){.large{font-size:3rem;line-height:3.5rem}}.xlarge{font-size:3rem;line-height:3.5rem;font-weight:800}@media (min-width: 768px){.xlarge{font-size:4.375rem;line-height:4.125rem}}\n"] }]
8895
8895
  }], propDecorators: { props: [{
8896
8896
  type: Input
8897
8897
  }] } });
@@ -38144,6 +38144,9 @@ class FormComponent {
38144
38144
  @for (s of props.sections; track s.name) {
38145
38145
  <div class="section">
38146
38146
  <val-title [props]="{ content: s.name, size: 'large', color: '', bold: false }"></val-title>
38147
+ @if (s.subtitle) {
38148
+ <p class="section-subtitle">{{ s.subtitle }}</p>
38149
+ }
38147
38150
  @for (f of s.fields; track f.name) {
38148
38151
  <div class="input" [attr.data-testid]="f.token">
38149
38152
  @if (f.type !== types.PHONE && f.type !== types.HANDLE && f.type !== types.ATTACHMENT) {
@@ -38360,6 +38363,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
38360
38363
  @for (s of props.sections; track s.name) {
38361
38364
  <div class="section">
38362
38365
  <val-title [props]="{ content: s.name, size: 'large', color: '', bold: false }"></val-title>
38366
+ @if (s.subtitle) {
38367
+ <p class="section-subtitle">{{ s.subtitle }}</p>
38368
+ }
38363
38369
  @for (f of s.fields; track f.name) {
38364
38370
  <div class="input" [attr.data-testid]="f.token">
38365
38371
  @if (f.type !== types.PHONE && f.type !== types.HANDLE && f.type !== types.ATTACHMENT) {
@@ -39127,6 +39133,7 @@ class FormSchemaBuilderService {
39127
39133
  const section = sectionsById.get(key) ??
39128
39134
  {
39129
39135
  name: def.sectionLabel || '',
39136
+ subtitle: def.sectionSubtitle || '',
39130
39137
  order: def.sectionOrder ?? 0,
39131
39138
  fields: [],
39132
39139
  };
@@ -39213,6 +39220,7 @@ class FormSchemaBuilderService {
39213
39220
  options: this.normalizeOptions(field.options),
39214
39221
  sectionId: field.sectionId,
39215
39222
  sectionLabel: field.sectionLabel?.trim() ?? '',
39223
+ sectionSubtitle: field.sectionSubtitle?.trim() ?? '',
39216
39224
  sectionOrder: field.sectionOrder,
39217
39225
  step: field.step,
39218
39226
  unitLabel: field.unitLabel,
@@ -40604,6 +40612,7 @@ class FieldSchemaEditorComponent {
40604
40612
  this.selectedPresetId = signal('');
40605
40613
  /** Se refresca con cada cambio de tipo — `needsOptions` no puede leer el control directo. */
40606
40614
  this.currentType = signal('TEXT');
40615
+ this.currentSectionId = '';
40607
40616
  /** Una vez que se toca el token a mano (o se edita un campo ya guardado) deja de derivarse del label. */
40608
40617
  this.nameLocked = false;
40609
40618
  this.name = '';
@@ -40659,6 +40668,7 @@ class FieldSchemaEditorComponent {
40659
40668
  const initial = this.props.field;
40660
40669
  if (initial) {
40661
40670
  this.fieldId = initial.id;
40671
+ this.currentSectionId = initial.sectionId ?? '';
40662
40672
  this.nameLocked = true;
40663
40673
  this.name = initial.name;
40664
40674
  this.labelControl.setValue(initial.label ?? '');
@@ -40746,6 +40756,7 @@ class FieldSchemaEditorComponent {
40746
40756
  placeholderText: (this.placeholderControl.value || '').trim(),
40747
40757
  hintText: (this.hintControl.value || '').trim(),
40748
40758
  type: this.coerceType(this.typeControl.value),
40759
+ sectionId: this.currentSectionId,
40749
40760
  required: this.requiredControl.value,
40750
40761
  sectionLabel: (this.sectionControl.value || '').trim(),
40751
40762
  options: this.needsOptions() ? this.options().map((option, index) => ({ ...option, order: index })) : undefined,
@@ -41342,6 +41353,9 @@ const SURVEY_QUESTION_TYPES = [
41342
41353
 
41343
41354
  const SURVEY_BUILDER_I18N = {
41344
41355
  es: {
41356
+ surveyNameLabel: 'Nombre interno',
41357
+ surveyNamePlaceholder: 'Ej: encuesta-ventas-entrada',
41358
+ noSurveyName: 'Ponle un nombre interno a la encuesta',
41345
41359
  titleLabel: 'Título',
41346
41360
  titlePlaceholder: 'Ej: ¿Qué te pareció el evento?',
41347
41361
  subtitleLabel: 'Subtítulo',
@@ -41365,8 +41379,10 @@ const SURVEY_BUILDER_I18N = {
41365
41379
  successImageLabel: 'Imagen de cierre',
41366
41380
  successImagePlaceholder: 'URL de la imagen que se muestra al terminar',
41367
41381
  questionsLabel: 'Preguntas',
41382
+ sectionQuestionsLabel: 'Sin sección',
41368
41383
  questionLabelPlaceholder: 'Escribe la pregunta',
41369
41384
  addQuestion: 'Agregar pregunta',
41385
+ addQuestionToSection: 'Agregar aquí',
41370
41386
  removeQuestion: 'Quitar pregunta',
41371
41387
  editQuestion: 'Editar pregunta',
41372
41388
  duplicateQuestion: 'Duplicar pregunta',
@@ -41384,6 +41400,8 @@ const SURVEY_BUILDER_I18N = {
41384
41400
  loadError: 'No pudimos cargar la encuesta para editar.',
41385
41401
  stepStart: 'Inicio',
41386
41402
  stepQuestions: 'Preguntas',
41403
+ sectionSubtitleLabel: 'Subtítulo',
41404
+ sectionSubtitlePlaceholder: 'Escribe un subtítulo para esta sección',
41387
41405
  stepClose: 'Cierre',
41388
41406
  stepReview: 'Revisar',
41389
41407
  wizardStepsLabel: 'Pasos para crear la encuesta',
@@ -41401,6 +41419,9 @@ const SURVEY_BUILDER_I18N = {
41401
41419
  reviewDefaultClose: 'Cierre por defecto',
41402
41420
  },
41403
41421
  en: {
41422
+ surveyNameLabel: 'Internal name',
41423
+ surveyNamePlaceholder: 'E.g: event-feedback',
41424
+ noSurveyName: 'Give the survey an internal name',
41404
41425
  titleLabel: 'Title',
41405
41426
  titlePlaceholder: 'E.g: How was the event?',
41406
41427
  subtitleLabel: 'Subtitle',
@@ -41424,8 +41445,10 @@ const SURVEY_BUILDER_I18N = {
41424
41445
  successImageLabel: 'Closing image',
41425
41446
  successImagePlaceholder: 'Image URL shown after submit',
41426
41447
  questionsLabel: 'Questions',
41448
+ sectionQuestionsLabel: 'No section',
41427
41449
  questionLabelPlaceholder: 'Write the question',
41428
41450
  addQuestion: 'Add question',
41451
+ addQuestionToSection: 'Add here',
41429
41452
  removeQuestion: 'Remove question',
41430
41453
  editQuestion: 'Edit question',
41431
41454
  duplicateQuestion: 'Duplicate question',
@@ -41443,6 +41466,8 @@ const SURVEY_BUILDER_I18N = {
41443
41466
  loadError: "We couldn't load the survey to edit.",
41444
41467
  stepStart: 'Start',
41445
41468
  stepQuestions: 'Questions',
41469
+ sectionSubtitleLabel: 'Subtitle',
41470
+ sectionSubtitlePlaceholder: 'Add a subtitle for this section',
41446
41471
  stepClose: 'Close',
41447
41472
  stepReview: 'Review',
41448
41473
  wizardStepsLabel: 'Survey builder steps',
@@ -41606,6 +41631,44 @@ let rowUid = 0;
41606
41631
  * `val-survey-response` sabe renderizar, no a lo que el editor sabe editar.
41607
41632
  */
41608
41633
  class SurveyBuilderComponent {
41634
+ groupQuestions(rows) {
41635
+ const groups = [];
41636
+ const index = new Map();
41637
+ rows.forEach(question => {
41638
+ const section = (question.sectionLabel ?? '').trim();
41639
+ const sectionKey = question.sectionId || (section ? this.formBuilder.toToken(section) : '__default__');
41640
+ const label = section;
41641
+ let position = index.get(sectionKey);
41642
+ if (position == null) {
41643
+ position = groups.length;
41644
+ index.set(sectionKey, position);
41645
+ groups.push({ id: sectionKey, label, rows: [] });
41646
+ }
41647
+ groups[position].rows.push(question);
41648
+ });
41649
+ if (!groups.length) {
41650
+ const defaultId = '__default__';
41651
+ groups.push({ id: defaultId, label: '', rows: [] });
41652
+ }
41653
+ return groups;
41654
+ }
41655
+ normalizeSectionId(sectionId) {
41656
+ return (sectionId ?? '').trim() || '__default__';
41657
+ }
41658
+ questionGroupById(sectionId) {
41659
+ return this.questionGroups().find(group => group.id === sectionId);
41660
+ }
41661
+ sectionSubtitleControl(sectionId) {
41662
+ const normalized = this.normalizeSectionId(sectionId);
41663
+ if (!this.sectionSubtitleControls[normalized]) {
41664
+ const control = new FormControl(this.sectionSubtitles()[normalized] ?? '', { nonNullable: true });
41665
+ control.valueChanges.subscribe(value => {
41666
+ this.sectionSubtitles.update(values => ({ ...values, [normalized]: value }));
41667
+ });
41668
+ this.sectionSubtitleControls[normalized] = control;
41669
+ }
41670
+ return this.sectionSubtitleControls[normalized];
41671
+ }
41609
41672
  constructor() {
41610
41673
  this.props = {};
41611
41674
  this.saved = new EventEmitter();
@@ -41621,6 +41684,7 @@ class SurveyBuilderComponent {
41621
41684
  this.formBuilder = inject(RequestFormBuilderService);
41622
41685
  this.errors = inject(ValtechErrorService);
41623
41686
  this.modals = inject(ModalService);
41687
+ this.surveyNameControl = new FormControl('', { nonNullable: true });
41624
41688
  this.titleControl = new FormControl('', { nonNullable: true });
41625
41689
  this.subtitleControl = new FormControl('', { nonNullable: true });
41626
41690
  this.headerImageControl = new FormControl('', { nonNullable: true });
@@ -41633,12 +41697,20 @@ class SurveyBuilderComponent {
41633
41697
  this.validationError = signal('');
41634
41698
  this.saving = signal(false);
41635
41699
  this.uploadingImage = signal('');
41636
- this.wizardSteps = [
41637
- { id: 'start', labelKey: 'stepStart' },
41638
- { id: 'questions', labelKey: 'stepQuestions' },
41639
- { id: 'close', labelKey: 'stepClose' },
41640
- { id: 'review', labelKey: 'stepReview' },
41641
- ];
41700
+ this.sectionSubtitles = signal({});
41701
+ this.sectionSubtitleControls = {};
41702
+ this.questionGroups = computed(() => this.groupQuestions(this.questions()));
41703
+ this.wizardSteps = computed(() => {
41704
+ const groups = this.questionGroups();
41705
+ const steps = [{ id: 'start', label: this.t('stepStart') }];
41706
+ groups.forEach((group, index) => {
41707
+ const sectionLabel = group.label || `${this.t('sectionQuestionsLabel')} ${index + 1}`;
41708
+ steps.push({ id: `section-${group.id}`, label: `${index + 1}. ${sectionLabel}` });
41709
+ });
41710
+ steps.push({ id: 'close', label: this.t('stepClose') });
41711
+ steps.push({ id: 'review', label: this.t('stepReview') });
41712
+ return steps;
41713
+ });
41642
41714
  this.allowedImageTypes = ['image/jpeg', 'image/png', 'image/webp', 'image/gif'];
41643
41715
  this.maxImageBytes = 10 * 1024 * 1024;
41644
41716
  if (!this.i18n.hasNamespace(NAMESPACE$1)) {
@@ -41657,14 +41729,15 @@ class SurveyBuilderComponent {
41657
41729
  async ngOnInit() {
41658
41730
  // Sembrado directo: la app ya tenía la encuesta, no hace falta leerla.
41659
41731
  if (this.props.initial) {
41660
- this.hydrate(this.props.initial.label, this.props.initial.subtitle, this.props.initial.questions, this.props.initial.presentation);
41732
+ this.hydrate(this.props.initial.name, this.props.initial.label, this.props.initial.subtitle, this.props.initial.questions, this.props.initial.presentation);
41661
41733
  return;
41662
41734
  }
41663
41735
  if (!this.props.typeId)
41664
41736
  return;
41665
41737
  try {
41666
41738
  const cfg = await firstValueFrom(this.requests.getRequestType(this.props.typeId));
41667
- this.hydrate(cfg.label, cfg.subtitle ?? '', cfg.fieldSchema, cfg.presentation);
41739
+ const metadataName = typeof cfg.metadata?.['name'] === 'string' ? cfg.metadata['name'] : '';
41740
+ this.hydrate(metadataName || cfg.label, cfg.label, cfg.subtitle ?? '', cfg.fieldSchema, cfg.presentation);
41668
41741
  }
41669
41742
  catch (err) {
41670
41743
  this.errors.handle(err, {
@@ -41708,7 +41781,7 @@ class SurveyBuilderComponent {
41708
41781
  nextStep() {
41709
41782
  if (!this.validateWizardStep(this.wizardStep()))
41710
41783
  return;
41711
- this.wizardStep.update(step => Math.min(step + 1, this.wizardSteps.length - 1));
41784
+ this.wizardStep.update(step => Math.min(step + 1, this.wizardSteps().length - 1));
41712
41785
  }
41713
41786
  previousStep() {
41714
41787
  this.validationError.set('');
@@ -41751,6 +41824,18 @@ class SurveyBuilderComponent {
41751
41824
  state: this.saving() ? ComponentStates.WORKING : ComponentStates.ENABLED,
41752
41825
  };
41753
41826
  }
41827
+ closeStep() {
41828
+ return Math.max(this.wizardSteps().length - 2, 0);
41829
+ }
41830
+ reviewStep() {
41831
+ return Math.max(this.wizardSteps().length - 1, 0);
41832
+ }
41833
+ sectionStepIndex(sectionIndex) {
41834
+ return sectionIndex + 1;
41835
+ }
41836
+ showCurrentSectionQuestionStep() {
41837
+ return this.isWizard() && this.wizardStep() >= 1 && this.wizardStep() < this.reviewStep();
41838
+ }
41754
41839
  interpolate(template, values) {
41755
41840
  return Object.entries(values).reduce((text, [key, value]) => text.replaceAll(`{${key}}`, String(value)), template);
41756
41841
  }
@@ -41771,7 +41856,16 @@ class SurveyBuilderComponent {
41771
41856
  icon: { name: icon, slot: 'icon-only' },
41772
41857
  };
41773
41858
  }
41774
- addQuestion() {
41859
+ addQuestionAriaLabel(sectionLabel) {
41860
+ const section = (sectionLabel ?? '').trim();
41861
+ if (!section) {
41862
+ return this.t('addQuestionToSection');
41863
+ }
41864
+ return `${this.t('addQuestionToSection')} (${section})`;
41865
+ }
41866
+ addQuestion(sectionId) {
41867
+ const normalizedSectionId = this.normalizeSectionId(sectionId);
41868
+ const targetGroup = this.questionGroupById(normalizedSectionId);
41775
41869
  const row = {
41776
41870
  id: `row-${rowUid++}`,
41777
41871
  name: '',
@@ -41780,12 +41874,45 @@ class SurveyBuilderComponent {
41780
41874
  hintText: '',
41781
41875
  type: this.questionTypes()[0],
41782
41876
  required: true,
41877
+ sectionId: normalizedSectionId,
41878
+ sectionLabel: targetGroup?.label || undefined,
41783
41879
  };
41784
- this.questions.update(rows => [...rows, row]);
41880
+ this.questions.update(rows => {
41881
+ const next = [...rows];
41882
+ const insertionIndex = this.nextQuestionIndexForSection(next, normalizedSectionId);
41883
+ next.splice(insertionIndex, 0, row);
41884
+ return next;
41885
+ });
41785
41886
  // Una pregunta recién agregada está vacía: abrirla es el único paso
41786
41887
  // siguiente posible, y dejarla cerrada la haría ver como una fila rota.
41787
41888
  this.editingId.set(row.id);
41788
41889
  }
41890
+ rowGlobalIndex(sectionId, groupRowIndex) {
41891
+ const normalized = this.normalizeSectionId(sectionId);
41892
+ let index = 0;
41893
+ for (const row of this.questions()) {
41894
+ if (this.normalizeSectionId(row.sectionId) === normalized) {
41895
+ if (groupRowIndex === 0)
41896
+ return index;
41897
+ groupRowIndex -= 1;
41898
+ }
41899
+ index += 1;
41900
+ }
41901
+ return Math.min(index - 1, 0);
41902
+ }
41903
+ nextQuestionIndexForSection(rows, sectionId) {
41904
+ const normalized = this.normalizeSectionId(sectionId);
41905
+ if (!rows.length)
41906
+ return 0;
41907
+ if (!normalized)
41908
+ return rows.length;
41909
+ for (let i = rows.length - 1; i >= 0; i -= 1) {
41910
+ if (this.normalizeSectionId(rows[i].sectionId) === normalized) {
41911
+ return i + 1;
41912
+ }
41913
+ }
41914
+ return rows.length;
41915
+ }
41789
41916
  toggleEdit(row) {
41790
41917
  this.editingId.update(current => (current === row.id ? '' : row.id));
41791
41918
  }
@@ -41828,20 +41955,28 @@ class SurveyBuilderComponent {
41828
41955
  * paso obligatorio que no se veía por ningún lado.
41829
41956
  */
41830
41957
  draftQuestion(field) {
41831
- this.questions.update(rows => rows.map(r => (r.id === field.id ? { ...r, ...field } : r)));
41958
+ this.questions.update(rows => rows.map(r => (r.id === field.id ? this.withResolvedSection({ ...r, ...field }) : r)));
41832
41959
  if (this.validationError())
41833
41960
  this.validationError.set('');
41834
41961
  }
41835
41962
  applyQuestion(field) {
41836
41963
  this.questions.update(rows => rows.map(r => r.id === field.id
41837
41964
  ? {
41838
- ...field,
41965
+ ...this.withResolvedSection(field),
41839
41966
  name: this.formBuilder.uniqueFieldName(field.name || field.label, rows.filter(o => o.id !== r.id)),
41840
41967
  }
41841
41968
  : r));
41842
41969
  this.editingId.set('');
41843
41970
  this.validationError.set('');
41844
41971
  }
41972
+ withResolvedSection(field) {
41973
+ const label = (field.sectionLabel ?? '').trim();
41974
+ const id = this.normalizeSectionId(field.sectionId);
41975
+ if (id !== '__default__' || !label) {
41976
+ return { ...field, sectionId: id, sectionLabel: label || undefined };
41977
+ }
41978
+ return { ...field, sectionId: this.formBuilder.toToken(label), sectionLabel: label };
41979
+ }
41845
41980
  async onPresentationFileSelected(slot, event) {
41846
41981
  const input = event.target;
41847
41982
  const file = input.files?.[0];
@@ -41901,9 +42036,10 @@ class SurveyBuilderComponent {
41901
42036
  label: row.label.trim(),
41902
42037
  type: row.type,
41903
42038
  required: row.required,
41904
- sectionId: row.sectionLabel ? this.formBuilder.toToken(row.sectionLabel) : undefined,
42039
+ sectionId: row.sectionId,
41905
42040
  sectionLabel: row.sectionLabel,
41906
- sectionOrder: this.sectionOrderFor(row.sectionLabel, rows),
42041
+ sectionSubtitle: this.sectionSubtitles()[this.normalizeSectionId(row.sectionId)] ?? '',
42042
+ sectionOrder: this.sectionOrderFor(row.sectionId, rows),
41907
42043
  placeholderText: row.placeholderText,
41908
42044
  hintText: row.hintText,
41909
42045
  options: row.options,
@@ -41913,7 +42049,13 @@ class SurveyBuilderComponent {
41913
42049
  const presentation = this.presentationPayload();
41914
42050
  // La app guarda: acá solo se valida y se entrega lo escrito.
41915
42051
  if (this.props.persist === false) {
41916
- this.draft.emit({ label: title, subtitle, presentation, questions: fieldSchema });
42052
+ this.draft.emit({
42053
+ name: this.surveyNameControl.value.trim() || title,
42054
+ label: title,
42055
+ subtitle,
42056
+ presentation,
42057
+ questions: fieldSchema,
42058
+ });
41917
42059
  return;
41918
42060
  }
41919
42061
  this.saving.set(true);
@@ -41924,6 +42066,7 @@ class SurveyBuilderComponent {
41924
42066
  // endpoint (`persist: false`) y arma el id con la entidad adentro.
41925
42067
  const typeId = this.props.typeId ?? `${this.props.typePrefix ?? DEFAULT_TYPE_PREFIX}:${this.formBuilder.toToken(title)}`;
41926
42068
  const payload = {
42069
+ name: this.surveyNameControl.value.trim() || title,
41927
42070
  label: title,
41928
42071
  subtitle,
41929
42072
  presentation,
@@ -41951,14 +42094,23 @@ class SurveyBuilderComponent {
41951
42094
  });
41952
42095
  }
41953
42096
  }
41954
- hydrate(label, subtitle, questions, presentation) {
42097
+ hydrate(name, label, subtitle, questions, presentation) {
42098
+ this.surveyNameControl.setValue(name ?? '');
41955
42099
  this.titleControl.setValue(label ?? '');
41956
42100
  this.subtitleControl.setValue(subtitle ?? '');
41957
42101
  this.headerImageControl.setValue(presentation?.headerImageUrl ?? '');
41958
42102
  this.successTitleControl.setValue(presentation?.successTitle || this.defaultSuccessTitle());
41959
42103
  this.successMessageControl.setValue(presentation?.successMessage || this.defaultSuccessMessage());
41960
42104
  this.successImageControl.setValue(presentation?.successImageUrl ?? '');
41961
- this.questions.set([...(questions ?? [])].sort((a, b) => a.order - b.order).map(f => this.rowFromField(f)));
42105
+ const rows = [...(questions ?? [])].sort((a, b) => a.order - b.order).map(f => this.rowFromField(f));
42106
+ const subtitles = {};
42107
+ rows.forEach(row => {
42108
+ const id = this.normalizeSectionId(row.sectionId);
42109
+ if (row.sectionSubtitle && subtitles[id] === undefined)
42110
+ subtitles[id] = row.sectionSubtitle;
42111
+ });
42112
+ this.sectionSubtitles.set(subtitles);
42113
+ this.questions.set(rows);
41962
42114
  }
41963
42115
  presentationPayload() {
41964
42116
  const presentation = {
@@ -41978,6 +42130,13 @@ class SurveyBuilderComponent {
41978
42130
  validateWizardStep(step) {
41979
42131
  this.validationError.set('');
41980
42132
  if (step === 0) {
42133
+ if (!this.isWizard())
42134
+ return true;
42135
+ if (!this.surveyNameControl.value.trim()) {
42136
+ this.surveyNameControl.markAsTouched();
42137
+ this.validationError.set(this.t('noSurveyName'));
42138
+ return false;
42139
+ }
41981
42140
  if (!this.titleControl.value.trim()) {
41982
42141
  this.titleControl.markAsTouched();
41983
42142
  this.validationError.set(this.t('noTitle'));
@@ -42013,7 +42172,9 @@ class SurveyBuilderComponent {
42013
42172
  hintText: f.hintText ?? '',
42014
42173
  type: f.type,
42015
42174
  required: !!f.required,
42175
+ sectionId: f.sectionId,
42016
42176
  sectionLabel: f.sectionLabel ?? '',
42177
+ sectionSubtitle: f.sectionSubtitle ?? '',
42017
42178
  sectionOrder: f.sectionOrder,
42018
42179
  options: f.options,
42019
42180
  };
@@ -42037,7 +42198,7 @@ class SurveyBuilderComponent {
42037
42198
  };
42038
42199
  }
42039
42200
  async openPreview() {
42040
- await this.modals.open({
42201
+ await this.modals.openAdaptive({
42041
42202
  component: SurveyPreviewModalComponent,
42042
42203
  componentProps: {
42043
42204
  modalTitle: this.t('previewTitle'),
@@ -42053,26 +42214,25 @@ class SurveyBuilderComponent {
42053
42214
  order: index,
42054
42215
  name: question.name || this.formBuilder.toToken(question.label),
42055
42216
  typeLabel: this.typeLabel(question.type),
42056
- sectionId: question.sectionLabel ? this.formBuilder.toToken(question.sectionLabel) : undefined,
42057
- sectionOrder: this.sectionOrderFor(question.sectionLabel, this.questions()),
42217
+ sectionId: this.normalizeSectionId(question.sectionId),
42218
+ sectionSubtitle: this.sectionSubtitles()[this.normalizeSectionId(question.sectionId)] ?? '',
42219
+ sectionOrder: this.sectionOrderFor(question.sectionId, this.questions()),
42058
42220
  })),
42059
42221
  },
42060
- size: 'medium',
42061
- });
42222
+ }, 'wide');
42062
42223
  }
42063
- sectionOrderFor(sectionLabel, rows) {
42064
- const label = sectionLabel?.trim();
42065
- if (!label)
42066
- return undefined;
42067
- const labels = [...new Set(rows.map(row => row.sectionLabel?.trim()).filter(Boolean))];
42068
- return labels.indexOf(label);
42224
+ sectionOrderFor(sectionId, rows) {
42225
+ const id = this.normalizeSectionId(sectionId);
42226
+ const sectionIds = [...new Set(rows.map(row => this.normalizeSectionId(row.sectionId)).filter(Boolean))];
42227
+ const index = sectionIds.indexOf(id);
42228
+ return index >= 0 ? index : undefined;
42069
42229
  }
42070
42230
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SurveyBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
42071
42231
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SurveyBuilderComponent, isStandalone: true, selector: "val-survey-builder", inputs: { props: "props" }, outputs: { saved: "saved", draft: "draft" }, ngImport: i0, template: `
42072
42232
  <div class="survey-builder">
42073
42233
  @if (isWizard()) {
42074
42234
  <nav class="survey-builder__steps" [attr.aria-label]="t('wizardStepsLabel')">
42075
- @for (step of wizardSteps; track step.id; let i = $index) {
42235
+ @for (step of wizardSteps(); track step.id; let i = $index) {
42076
42236
  <button
42077
42237
  type="button"
42078
42238
  class="survey-builder__step"
@@ -42081,7 +42241,7 @@ class SurveyBuilderComponent {
42081
42241
  (click)="goToStep(i)"
42082
42242
  >
42083
42243
  <span>{{ i + 1 }}</span>
42084
- {{ t(step.labelKey) }}
42244
+ {{ step.label }}
42085
42245
  </button>
42086
42246
  }
42087
42247
  </nav>
@@ -42098,6 +42258,9 @@ class SurveyBuilderComponent {
42098
42258
 
42099
42259
  @if (showWizardSection(0)) {
42100
42260
  <section class="survey-builder__section">
42261
+ <val-form-field [label]="t('surveyNameLabel')">
42262
+ <val-text-input [props]="{ control: surveyNameControl, placeholder: t('surveyNamePlaceholder') }" />
42263
+ </val-form-field>
42101
42264
  <val-form-field [label]="t('titleLabel')">
42102
42265
  <val-text-input [props]="{ control: titleControl, placeholder: t('titlePlaceholder') }" />
42103
42266
  </val-form-field>
@@ -42223,7 +42386,7 @@ class SurveyBuilderComponent {
42223
42386
  </div>
42224
42387
  }
42225
42388
 
42226
- @if (showWizardSection(2)) {
42389
+ @if (showWizardSection(closeStep())) {
42227
42390
  <section class="survey-builder__section">
42228
42391
  <span class="survey-builder__questions-label">{{ t('stepClose') }}</span>
42229
42392
  <p class="survey-builder__optional-note">{{ t('successOptionalNote') }}</p>
@@ -42270,7 +42433,7 @@ class SurveyBuilderComponent {
42270
42433
  </section>
42271
42434
  }
42272
42435
 
42273
- @if (showWizardSection(1)) {
42436
+ @if (showCurrentSectionQuestionStep()) {
42274
42437
  <div class="survey-builder__questions">
42275
42438
  <span class="survey-builder__questions-label">{{ t('questionsLabel') }}</span>
42276
42439
 
@@ -42278,68 +42441,113 @@ class SurveyBuilderComponent {
42278
42441
  <p class="survey-builder__empty">{{ t('noQuestions') }}</p>
42279
42442
  }
42280
42443
 
42281
- @for (row of questions(); track row.id; let i = $index; let first = $first; let last = $last) {
42282
- <div class="survey-builder__row">
42283
- <div class="survey-builder__row-head">
42284
- <div class="survey-builder__row-text">
42285
- <strong>{{ row.label || t('untitledQuestion') }}</strong>
42286
- <span>
42287
- {{ typeLabel(row.type) }}{{ row.required ? ' · ' + t('requiredTag') : '' }}{{ row.sectionLabel ? ' · ' + row.sectionLabel : '' }}
42288
- </span>
42289
- </div>
42290
- <div class="survey-builder__row-actions">
42291
- <val-button
42292
- [props]="iconAction('q-up-' + row.id, 'arrow-up-outline', t('moveUp'), first)"
42293
- (onClick)="move(i, -1)"
42294
- />
42295
- <val-button
42296
- [props]="iconAction('q-down-' + row.id, 'arrow-down-outline', t('moveDown'), last)"
42297
- (onClick)="move(i, 1)"
42298
- />
42299
- <val-button
42300
- [props]="iconAction('q-copy-' + row.id, 'copy-outline', t('duplicateQuestion'))"
42301
- (onClick)="duplicate(row)"
42302
- />
42303
- <val-button
42304
- [props]="iconAction('q-edit-' + row.id, 'create-outline', t('editQuestion'))"
42305
- (onClick)="toggleEdit(row)"
42306
- />
42307
- <val-button
42308
- [props]="iconAction('q-remove-' + row.id, 'trash-outline', t('removeQuestion'), false, 'danger')"
42309
- (onClick)="removeQuestion(row)"
42310
- />
42444
+ @for (group of questionGroups(); track group.id; let sectionIndex = $index) {
42445
+ @if (wizardStep() === sectionStepIndex(sectionIndex)) {
42446
+ <section class="survey-builder__question-section">
42447
+ <div class="survey-builder__section-head">
42448
+ <div>
42449
+ <strong>{{ group.label || t('sectionQuestionsLabel') }}</strong>
42450
+ <div class="survey-builder__section-subtitle">
42451
+ <val-form-field [label]="t('sectionSubtitleLabel')">
42452
+ <val-text-input
42453
+ [props]="{
42454
+ control: sectionSubtitleControl(group.id),
42455
+ placeholder: t('sectionSubtitlePlaceholder'),
42456
+ }"
42457
+ />
42458
+ </val-form-field>
42459
+ </div>
42311
42460
  </div>
42461
+ <val-button
42462
+ [props]="{
42463
+ token: 'survey-builder-add-question-' + group.id,
42464
+ text: t('addQuestionToSection'),
42465
+ color: 'dark',
42466
+ fill: 'outline',
42467
+ shape: 'round',
42468
+ size: 'small',
42469
+ type: 'button',
42470
+ state: 'ENABLED',
42471
+ icon: { name: 'add-outline', slot: 'start' },
42472
+ }"
42473
+ (onClick)="addQuestion(group.id)"
42474
+ />
42312
42475
  </div>
42313
42476
 
42314
- @if (editingId() === row.id) {
42315
- <div class="survey-builder__row-editor">
42316
- <val-field-schema-editor
42317
- #editor
42318
- [props]="editorProps(row)"
42319
- (changed)="draftQuestion($event)"
42320
- (save)="applyQuestion($event)"
42321
- />
42322
- <div class="survey-builder__row-editor-actions">
42323
- <val-button
42324
- [props]="{
42325
- token: 'q-done-' + row.id,
42326
- text: t('doneEditing'),
42327
- color: 'dark',
42328
- fill: 'solid',
42329
- shape: 'round',
42330
- size: 'default',
42331
- type: 'button',
42332
- state: 'ENABLED',
42333
- }"
42334
- (onClick)="editor.submit()"
42335
- />
42477
+ @for (row of group.rows; track row.id; let i = $index; let first = $first; let last = $last) {
42478
+ @let globalIndex = rowGlobalIndex(group.id, i);
42479
+ <div class="survey-builder__row">
42480
+ <div class="survey-builder__row-head">
42481
+ <div class="survey-builder__row-text">
42482
+ <strong>{{ row.label || t('untitledQuestion') }}</strong>
42483
+ <span>
42484
+ {{
42485
+ typeLabel(row.type) +
42486
+ (row.required ? ' · ' + t('requiredTag') : '') +
42487
+ (row.sectionLabel ? ' · ' + row.sectionLabel : '')
42488
+ }}
42489
+ </span>
42490
+ </div>
42491
+ <div class="survey-builder__row-actions">
42492
+ <val-button
42493
+ [props]="iconAction('q-add-' + row.id, 'add-outline', addQuestionAriaLabel(row.sectionLabel), false)"
42494
+ (onClick)="addQuestion(row.sectionId || group.id)"
42495
+ />
42496
+ <val-button
42497
+ [props]="iconAction('q-up-' + row.id, 'arrow-up-outline', t('moveUp'), first)"
42498
+ (onClick)="move(globalIndex, -1)"
42499
+ />
42500
+ <val-button
42501
+ [props]="iconAction('q-down-' + row.id, 'arrow-down-outline', t('moveDown'), last)"
42502
+ (onClick)="move(globalIndex, 1)"
42503
+ />
42504
+ <val-button
42505
+ [props]="iconAction('q-copy-' + row.id, 'copy-outline', t('duplicateQuestion'))"
42506
+ (onClick)="duplicate(row)"
42507
+ />
42508
+ <val-button
42509
+ [props]="iconAction('q-edit-' + row.id, 'create-outline', t('editQuestion'))"
42510
+ (onClick)="toggleEdit(row)"
42511
+ />
42512
+ <val-button
42513
+ [props]="iconAction('q-remove-' + row.id, 'trash-outline', t('removeQuestion'), false, 'danger')"
42514
+ (onClick)="removeQuestion(row)"
42515
+ />
42516
+ </div>
42336
42517
  </div>
42518
+
42519
+ @if (editingId() === row.id) {
42520
+ <div class="survey-builder__row-editor">
42521
+ <val-field-schema-editor
42522
+ #editor
42523
+ [props]="editorProps(row)"
42524
+ (changed)="draftQuestion($event)"
42525
+ (save)="applyQuestion($event)"
42526
+ />
42527
+ <div class="survey-builder__row-editor-actions">
42528
+ <val-button
42529
+ [props]="{
42530
+ token: 'q-done-' + row.id,
42531
+ text: t('doneEditing'),
42532
+ color: 'dark',
42533
+ fill: 'solid',
42534
+ shape: 'round',
42535
+ size: 'default',
42536
+ type: 'button',
42537
+ state: 'ENABLED',
42538
+ }"
42539
+ (onClick)="editor.submit()"
42540
+ />
42541
+ </div>
42542
+ </div>
42543
+ }
42337
42544
  </div>
42338
42545
  }
42339
- </div>
42546
+ </section>
42547
+ }
42340
42548
  }
42341
42549
 
42342
- <val-button
42550
+ <val-button
42343
42551
  [props]="{
42344
42552
  token: 'survey-builder-add-question',
42345
42553
  text: t('addQuestion'),
@@ -42351,12 +42559,12 @@ class SurveyBuilderComponent {
42351
42559
  state: 'ENABLED',
42352
42560
  icon: { name: 'add-outline', slot: 'start' },
42353
42561
  }"
42354
- (onClick)="addQuestion()"
42562
+ (onClick)="addQuestion(questionGroups()[0]?.id)"
42355
42563
  />
42356
42564
  </div>
42357
42565
  }
42358
42566
 
42359
- @if (showWizardSection(3)) {
42567
+ @if (showWizardSection(reviewStep())) {
42360
42568
  <section class="survey-builder__review">
42361
42569
  <span class="survey-builder__questions-label">{{ t('reviewTitle') }}</span>
42362
42570
  <strong>{{ titleControl.value || t('untitledQuestion') }}</strong>
@@ -42379,7 +42587,7 @@ class SurveyBuilderComponent {
42379
42587
  @if (wizardStep() > 0) {
42380
42588
  <val-button [props]="wizardBackProps()" (onClick)="previousStep()" />
42381
42589
  }
42382
- @if (wizardStep() < wizardSteps.length - 1) {
42590
+ @if (wizardStep() < wizardSteps().length - 1) {
42383
42591
  <val-button [props]="wizardNextProps()" (onClick)="nextStep()" />
42384
42592
  } @else {
42385
42593
  <val-button [props]="saveProps()" (onClick)="save()" />
@@ -42389,7 +42597,7 @@ class SurveyBuilderComponent {
42389
42597
  <val-button [props]="saveProps()" (onClick)="save()" />
42390
42598
  }
42391
42599
  </div>
42392
- `, isInline: true, styles: [":host{display:block}.survey-builder{display:flex;flex-direction:column;gap:16px}.survey-builder__questions{display:flex;flex-direction:column;gap:12px}.survey-builder__presentation{display:flex;flex-direction:column;gap:12px;padding-top:4px}.survey-builder__section,.survey-builder__review{display:flex;flex-direction:column;gap:12px}.survey-builder__steps{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin-top:16px;margin-bottom:12px}.survey-builder__step{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:40px;padding:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .12));border-radius:8px;background:var(--ion-card-background, var(--ion-background-color, #fff));color:var(--ion-color-medium-shade, #6b6675);font-size:.8125rem;font-weight:700;cursor:pointer}.survey-builder__step span{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:999px;background:var(--ion-color-light, #f4f5f8);color:inherit;font-size:.75rem}.survey-builder__step--active{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-builder__wizard-actions{display:flex;justify-content:flex-end;gap:8px}.survey-builder__review{padding:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:var(--val-radius-md, 12px);background:var(--ion-card-background, var(--ion-background-color, #fff))}.survey-builder__review strong{color:var(--ion-text-color, #000)}.survey-builder__review span:not(.survey-builder__questions-label){color:var(--ion-color-medium, #92949c);font-size:.875rem}.survey-builder__image-field{display:flex;flex-direction:column;gap:10px}.survey-builder__image-preview{position:relative;width:100%}.survey-builder__image-preview img{display:block;width:100%;aspect-ratio:16 / 9;object-fit:contain;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;background:var(--ion-color-light, #f4f5f8)}.survey-builder__image-clear{position:absolute;top:8px;right:8px;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;border-radius:999px;background:#0009;color:#fff;cursor:pointer}.survey-builder__image-upload{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:44px;padding:10px 18px;border:2px dashed var(--ion-color-dark, #2f2c3a);border-radius:20px;color:var(--ion-color-dark, #2f2c3a);font-size:.875rem;font-weight:600;cursor:pointer}.survey-builder__image-upload:hover{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-builder__image-upload--loading{opacity:.7;cursor:default}.survey-builder__image-upload ion-spinner{width:16px;height:16px}.survey-builder__image-upload input{display:none}.survey-builder__questions-label{font-size:.8125rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--ion-color-medium, #92949c)}.survey-builder__empty{margin:0;font-size:.875rem;color:var(--ion-color-medium, #92949c)}.survey-builder__optional-note{margin:0;color:var(--ion-color-medium, #92949c);font-size:.875rem;line-height:1.35}.survey-builder__row{display:flex;flex-direction:column;gap:12px;padding:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:var(--val-radius-md, 12px);background:var(--ion-card-background, var(--ion-background-color, #fff))}.survey-builder__row-head{display:flex;flex-direction:column;gap:8px}.survey-builder__row-text{display:flex;flex-direction:column;gap:2px;min-width:0}.survey-builder__row-text strong{color:var(--ion-text-color, #000);font-size:.9375rem}.survey-builder__row-text span{color:var(--ion-color-medium, #92949c);font-size:.8125rem}.survey-builder__row-actions{display:flex;gap:4px;flex-wrap:wrap}.survey-builder__row-editor{display:flex;flex-direction:column;gap:12px;padding-top:12px;border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .1))}.survey-builder__row-editor-actions{display:flex;justify-content:flex-end}.survey-builder__error{margin:0;color:var(--ion-color-danger);font-size:.875rem;font-weight:700}@media (min-width: 576px){.survey-builder__row-head{flex-direction:row;align-items:flex-start;justify-content:space-between}.survey-builder__row-text{flex:1}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["preset", "props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: FormFieldComponent, selector: "val-form-field", inputs: ["label"] }, { kind: "component", type: FieldSchemaEditorComponent, selector: "val-field-schema-editor", inputs: ["props"], outputs: ["save", "changed"] }] }); }
42600
+ `, isInline: true, styles: [":host{display:block}.survey-builder{display:flex;flex-direction:column;gap:16px}.survey-builder__questions{display:flex;flex-direction:column;gap:12px}.survey-builder__question-section{display:flex;flex-direction:column;gap:10px;padding:10px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:var(--val-radius-sm, 10px)}.survey-builder__section-head{display:flex;justify-content:space-between;align-items:center;gap:8px}.survey-builder__section-head strong{color:var(--ion-text-color, #000);font-size:.875rem}.survey-builder__presentation{display:flex;flex-direction:column;gap:12px;padding-top:4px}.survey-builder__section,.survey-builder__review{display:flex;flex-direction:column;gap:12px}.survey-builder__steps{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin-top:16px;margin-bottom:12px}.survey-builder__step{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:40px;padding:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .12));border-radius:8px;background:var(--ion-card-background, var(--ion-background-color, #fff));color:var(--ion-color-medium-shade, #6b6675);font-size:.8125rem;font-weight:700;cursor:pointer}.survey-builder__step span{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:999px;background:var(--ion-color-light, #f4f5f8);color:inherit;font-size:.75rem}.survey-builder__step--active{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-builder__wizard-actions{display:flex;justify-content:flex-end;gap:8px}.survey-builder__review{padding:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:var(--val-radius-md, 12px);background:var(--ion-card-background, var(--ion-background-color, #fff))}.survey-builder__review strong{color:var(--ion-text-color, #000)}.survey-builder__review span:not(.survey-builder__questions-label){color:var(--ion-color-medium, #92949c);font-size:.875rem}.survey-builder__image-field{display:flex;flex-direction:column;gap:10px}.survey-builder__image-preview{position:relative;width:100%}.survey-builder__image-preview img{display:block;width:100%;aspect-ratio:16 / 9;object-fit:contain;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;background:var(--ion-color-light, #f4f5f8)}.survey-builder__image-clear{position:absolute;top:8px;right:8px;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;border-radius:999px;background:#0009;color:#fff;cursor:pointer}.survey-builder__image-upload{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:44px;padding:10px 18px;border:2px dashed var(--ion-color-dark, #2f2c3a);border-radius:20px;color:var(--ion-color-dark, #2f2c3a);font-size:.875rem;font-weight:600;cursor:pointer}.survey-builder__image-upload:hover{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-builder__image-upload--loading{opacity:.7;cursor:default}.survey-builder__image-upload ion-spinner{width:16px;height:16px}.survey-builder__image-upload input{display:none}.survey-builder__questions-label{font-size:.8125rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--ion-color-medium, #92949c)}.survey-builder__empty{margin:0;font-size:.875rem;color:var(--ion-color-medium, #92949c)}.survey-builder__optional-note{margin:0;color:var(--ion-color-medium, #92949c);font-size:.875rem;line-height:1.35}.survey-builder__row{display:flex;flex-direction:column;gap:12px;padding:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:var(--val-radius-md, 12px);background:var(--ion-card-background, var(--ion-background-color, #fff))}.survey-builder__row-head{display:flex;flex-direction:column;gap:8px}.survey-builder__row-text{display:flex;flex-direction:column;gap:2px;min-width:0}.survey-builder__row-text strong{color:var(--ion-text-color, #000);font-size:.9375rem}.survey-builder__row-text span{color:var(--ion-color-medium, #92949c);font-size:.8125rem}.survey-builder__row-actions{display:flex;gap:4px;flex-wrap:wrap}.survey-builder__row-editor{display:flex;flex-direction:column;gap:12px;padding-top:12px;border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .1))}.survey-builder__row-editor-actions{display:flex;justify-content:flex-end}.survey-builder__error{margin:0;color:var(--ion-color-danger);font-size:.875rem;font-weight:700}@media (min-width: 576px){.survey-builder__row-head{flex-direction:row;align-items:flex-start;justify-content:space-between}.survey-builder__row-text{flex:1}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["preset", "props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: FormFieldComponent, selector: "val-form-field", inputs: ["label"] }, { kind: "component", type: FieldSchemaEditorComponent, selector: "val-field-schema-editor", inputs: ["props"], outputs: ["save", "changed"] }] }); }
42393
42601
  }
42394
42602
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SurveyBuilderComponent, decorators: [{
42395
42603
  type: Component,
@@ -42406,7 +42614,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42406
42614
  <div class="survey-builder">
42407
42615
  @if (isWizard()) {
42408
42616
  <nav class="survey-builder__steps" [attr.aria-label]="t('wizardStepsLabel')">
42409
- @for (step of wizardSteps; track step.id; let i = $index) {
42617
+ @for (step of wizardSteps(); track step.id; let i = $index) {
42410
42618
  <button
42411
42619
  type="button"
42412
42620
  class="survey-builder__step"
@@ -42415,7 +42623,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42415
42623
  (click)="goToStep(i)"
42416
42624
  >
42417
42625
  <span>{{ i + 1 }}</span>
42418
- {{ t(step.labelKey) }}
42626
+ {{ step.label }}
42419
42627
  </button>
42420
42628
  }
42421
42629
  </nav>
@@ -42432,6 +42640,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42432
42640
 
42433
42641
  @if (showWizardSection(0)) {
42434
42642
  <section class="survey-builder__section">
42643
+ <val-form-field [label]="t('surveyNameLabel')">
42644
+ <val-text-input [props]="{ control: surveyNameControl, placeholder: t('surveyNamePlaceholder') }" />
42645
+ </val-form-field>
42435
42646
  <val-form-field [label]="t('titleLabel')">
42436
42647
  <val-text-input [props]="{ control: titleControl, placeholder: t('titlePlaceholder') }" />
42437
42648
  </val-form-field>
@@ -42557,7 +42768,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42557
42768
  </div>
42558
42769
  }
42559
42770
 
42560
- @if (showWizardSection(2)) {
42771
+ @if (showWizardSection(closeStep())) {
42561
42772
  <section class="survey-builder__section">
42562
42773
  <span class="survey-builder__questions-label">{{ t('stepClose') }}</span>
42563
42774
  <p class="survey-builder__optional-note">{{ t('successOptionalNote') }}</p>
@@ -42604,7 +42815,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42604
42815
  </section>
42605
42816
  }
42606
42817
 
42607
- @if (showWizardSection(1)) {
42818
+ @if (showCurrentSectionQuestionStep()) {
42608
42819
  <div class="survey-builder__questions">
42609
42820
  <span class="survey-builder__questions-label">{{ t('questionsLabel') }}</span>
42610
42821
 
@@ -42612,68 +42823,113 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42612
42823
  <p class="survey-builder__empty">{{ t('noQuestions') }}</p>
42613
42824
  }
42614
42825
 
42615
- @for (row of questions(); track row.id; let i = $index; let first = $first; let last = $last) {
42616
- <div class="survey-builder__row">
42617
- <div class="survey-builder__row-head">
42618
- <div class="survey-builder__row-text">
42619
- <strong>{{ row.label || t('untitledQuestion') }}</strong>
42620
- <span>
42621
- {{ typeLabel(row.type) }}{{ row.required ? ' · ' + t('requiredTag') : '' }}{{ row.sectionLabel ? ' · ' + row.sectionLabel : '' }}
42622
- </span>
42623
- </div>
42624
- <div class="survey-builder__row-actions">
42625
- <val-button
42626
- [props]="iconAction('q-up-' + row.id, 'arrow-up-outline', t('moveUp'), first)"
42627
- (onClick)="move(i, -1)"
42628
- />
42629
- <val-button
42630
- [props]="iconAction('q-down-' + row.id, 'arrow-down-outline', t('moveDown'), last)"
42631
- (onClick)="move(i, 1)"
42632
- />
42633
- <val-button
42634
- [props]="iconAction('q-copy-' + row.id, 'copy-outline', t('duplicateQuestion'))"
42635
- (onClick)="duplicate(row)"
42636
- />
42637
- <val-button
42638
- [props]="iconAction('q-edit-' + row.id, 'create-outline', t('editQuestion'))"
42639
- (onClick)="toggleEdit(row)"
42640
- />
42641
- <val-button
42642
- [props]="iconAction('q-remove-' + row.id, 'trash-outline', t('removeQuestion'), false, 'danger')"
42643
- (onClick)="removeQuestion(row)"
42644
- />
42826
+ @for (group of questionGroups(); track group.id; let sectionIndex = $index) {
42827
+ @if (wizardStep() === sectionStepIndex(sectionIndex)) {
42828
+ <section class="survey-builder__question-section">
42829
+ <div class="survey-builder__section-head">
42830
+ <div>
42831
+ <strong>{{ group.label || t('sectionQuestionsLabel') }}</strong>
42832
+ <div class="survey-builder__section-subtitle">
42833
+ <val-form-field [label]="t('sectionSubtitleLabel')">
42834
+ <val-text-input
42835
+ [props]="{
42836
+ control: sectionSubtitleControl(group.id),
42837
+ placeholder: t('sectionSubtitlePlaceholder'),
42838
+ }"
42839
+ />
42840
+ </val-form-field>
42841
+ </div>
42645
42842
  </div>
42843
+ <val-button
42844
+ [props]="{
42845
+ token: 'survey-builder-add-question-' + group.id,
42846
+ text: t('addQuestionToSection'),
42847
+ color: 'dark',
42848
+ fill: 'outline',
42849
+ shape: 'round',
42850
+ size: 'small',
42851
+ type: 'button',
42852
+ state: 'ENABLED',
42853
+ icon: { name: 'add-outline', slot: 'start' },
42854
+ }"
42855
+ (onClick)="addQuestion(group.id)"
42856
+ />
42646
42857
  </div>
42647
42858
 
42648
- @if (editingId() === row.id) {
42649
- <div class="survey-builder__row-editor">
42650
- <val-field-schema-editor
42651
- #editor
42652
- [props]="editorProps(row)"
42653
- (changed)="draftQuestion($event)"
42654
- (save)="applyQuestion($event)"
42655
- />
42656
- <div class="survey-builder__row-editor-actions">
42657
- <val-button
42658
- [props]="{
42659
- token: 'q-done-' + row.id,
42660
- text: t('doneEditing'),
42661
- color: 'dark',
42662
- fill: 'solid',
42663
- shape: 'round',
42664
- size: 'default',
42665
- type: 'button',
42666
- state: 'ENABLED',
42667
- }"
42668
- (onClick)="editor.submit()"
42669
- />
42859
+ @for (row of group.rows; track row.id; let i = $index; let first = $first; let last = $last) {
42860
+ @let globalIndex = rowGlobalIndex(group.id, i);
42861
+ <div class="survey-builder__row">
42862
+ <div class="survey-builder__row-head">
42863
+ <div class="survey-builder__row-text">
42864
+ <strong>{{ row.label || t('untitledQuestion') }}</strong>
42865
+ <span>
42866
+ {{
42867
+ typeLabel(row.type) +
42868
+ (row.required ? ' · ' + t('requiredTag') : '') +
42869
+ (row.sectionLabel ? ' · ' + row.sectionLabel : '')
42870
+ }}
42871
+ </span>
42872
+ </div>
42873
+ <div class="survey-builder__row-actions">
42874
+ <val-button
42875
+ [props]="iconAction('q-add-' + row.id, 'add-outline', addQuestionAriaLabel(row.sectionLabel), false)"
42876
+ (onClick)="addQuestion(row.sectionId || group.id)"
42877
+ />
42878
+ <val-button
42879
+ [props]="iconAction('q-up-' + row.id, 'arrow-up-outline', t('moveUp'), first)"
42880
+ (onClick)="move(globalIndex, -1)"
42881
+ />
42882
+ <val-button
42883
+ [props]="iconAction('q-down-' + row.id, 'arrow-down-outline', t('moveDown'), last)"
42884
+ (onClick)="move(globalIndex, 1)"
42885
+ />
42886
+ <val-button
42887
+ [props]="iconAction('q-copy-' + row.id, 'copy-outline', t('duplicateQuestion'))"
42888
+ (onClick)="duplicate(row)"
42889
+ />
42890
+ <val-button
42891
+ [props]="iconAction('q-edit-' + row.id, 'create-outline', t('editQuestion'))"
42892
+ (onClick)="toggleEdit(row)"
42893
+ />
42894
+ <val-button
42895
+ [props]="iconAction('q-remove-' + row.id, 'trash-outline', t('removeQuestion'), false, 'danger')"
42896
+ (onClick)="removeQuestion(row)"
42897
+ />
42898
+ </div>
42670
42899
  </div>
42900
+
42901
+ @if (editingId() === row.id) {
42902
+ <div class="survey-builder__row-editor">
42903
+ <val-field-schema-editor
42904
+ #editor
42905
+ [props]="editorProps(row)"
42906
+ (changed)="draftQuestion($event)"
42907
+ (save)="applyQuestion($event)"
42908
+ />
42909
+ <div class="survey-builder__row-editor-actions">
42910
+ <val-button
42911
+ [props]="{
42912
+ token: 'q-done-' + row.id,
42913
+ text: t('doneEditing'),
42914
+ color: 'dark',
42915
+ fill: 'solid',
42916
+ shape: 'round',
42917
+ size: 'default',
42918
+ type: 'button',
42919
+ state: 'ENABLED',
42920
+ }"
42921
+ (onClick)="editor.submit()"
42922
+ />
42923
+ </div>
42924
+ </div>
42925
+ }
42671
42926
  </div>
42672
42927
  }
42673
- </div>
42928
+ </section>
42929
+ }
42674
42930
  }
42675
42931
 
42676
- <val-button
42932
+ <val-button
42677
42933
  [props]="{
42678
42934
  token: 'survey-builder-add-question',
42679
42935
  text: t('addQuestion'),
@@ -42685,12 +42941,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42685
42941
  state: 'ENABLED',
42686
42942
  icon: { name: 'add-outline', slot: 'start' },
42687
42943
  }"
42688
- (onClick)="addQuestion()"
42944
+ (onClick)="addQuestion(questionGroups()[0]?.id)"
42689
42945
  />
42690
42946
  </div>
42691
42947
  }
42692
42948
 
42693
- @if (showWizardSection(3)) {
42949
+ @if (showWizardSection(reviewStep())) {
42694
42950
  <section class="survey-builder__review">
42695
42951
  <span class="survey-builder__questions-label">{{ t('reviewTitle') }}</span>
42696
42952
  <strong>{{ titleControl.value || t('untitledQuestion') }}</strong>
@@ -42713,7 +42969,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42713
42969
  @if (wizardStep() > 0) {
42714
42970
  <val-button [props]="wizardBackProps()" (onClick)="previousStep()" />
42715
42971
  }
42716
- @if (wizardStep() < wizardSteps.length - 1) {
42972
+ @if (wizardStep() < wizardSteps().length - 1) {
42717
42973
  <val-button [props]="wizardNextProps()" (onClick)="nextStep()" />
42718
42974
  } @else {
42719
42975
  <val-button [props]="saveProps()" (onClick)="save()" />
@@ -42723,7 +42979,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42723
42979
  <val-button [props]="saveProps()" (onClick)="save()" />
42724
42980
  }
42725
42981
  </div>
42726
- `, styles: [":host{display:block}.survey-builder{display:flex;flex-direction:column;gap:16px}.survey-builder__questions{display:flex;flex-direction:column;gap:12px}.survey-builder__presentation{display:flex;flex-direction:column;gap:12px;padding-top:4px}.survey-builder__section,.survey-builder__review{display:flex;flex-direction:column;gap:12px}.survey-builder__steps{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin-top:16px;margin-bottom:12px}.survey-builder__step{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:40px;padding:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .12));border-radius:8px;background:var(--ion-card-background, var(--ion-background-color, #fff));color:var(--ion-color-medium-shade, #6b6675);font-size:.8125rem;font-weight:700;cursor:pointer}.survey-builder__step span{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:999px;background:var(--ion-color-light, #f4f5f8);color:inherit;font-size:.75rem}.survey-builder__step--active{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-builder__wizard-actions{display:flex;justify-content:flex-end;gap:8px}.survey-builder__review{padding:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:var(--val-radius-md, 12px);background:var(--ion-card-background, var(--ion-background-color, #fff))}.survey-builder__review strong{color:var(--ion-text-color, #000)}.survey-builder__review span:not(.survey-builder__questions-label){color:var(--ion-color-medium, #92949c);font-size:.875rem}.survey-builder__image-field{display:flex;flex-direction:column;gap:10px}.survey-builder__image-preview{position:relative;width:100%}.survey-builder__image-preview img{display:block;width:100%;aspect-ratio:16 / 9;object-fit:contain;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;background:var(--ion-color-light, #f4f5f8)}.survey-builder__image-clear{position:absolute;top:8px;right:8px;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;border-radius:999px;background:#0009;color:#fff;cursor:pointer}.survey-builder__image-upload{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:44px;padding:10px 18px;border:2px dashed var(--ion-color-dark, #2f2c3a);border-radius:20px;color:var(--ion-color-dark, #2f2c3a);font-size:.875rem;font-weight:600;cursor:pointer}.survey-builder__image-upload:hover{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-builder__image-upload--loading{opacity:.7;cursor:default}.survey-builder__image-upload ion-spinner{width:16px;height:16px}.survey-builder__image-upload input{display:none}.survey-builder__questions-label{font-size:.8125rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--ion-color-medium, #92949c)}.survey-builder__empty{margin:0;font-size:.875rem;color:var(--ion-color-medium, #92949c)}.survey-builder__optional-note{margin:0;color:var(--ion-color-medium, #92949c);font-size:.875rem;line-height:1.35}.survey-builder__row{display:flex;flex-direction:column;gap:12px;padding:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:var(--val-radius-md, 12px);background:var(--ion-card-background, var(--ion-background-color, #fff))}.survey-builder__row-head{display:flex;flex-direction:column;gap:8px}.survey-builder__row-text{display:flex;flex-direction:column;gap:2px;min-width:0}.survey-builder__row-text strong{color:var(--ion-text-color, #000);font-size:.9375rem}.survey-builder__row-text span{color:var(--ion-color-medium, #92949c);font-size:.8125rem}.survey-builder__row-actions{display:flex;gap:4px;flex-wrap:wrap}.survey-builder__row-editor{display:flex;flex-direction:column;gap:12px;padding-top:12px;border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .1))}.survey-builder__row-editor-actions{display:flex;justify-content:flex-end}.survey-builder__error{margin:0;color:var(--ion-color-danger);font-size:.875rem;font-weight:700}@media (min-width: 576px){.survey-builder__row-head{flex-direction:row;align-items:flex-start;justify-content:space-between}.survey-builder__row-text{flex:1}}\n"] }]
42982
+ `, styles: [":host{display:block}.survey-builder{display:flex;flex-direction:column;gap:16px}.survey-builder__questions{display:flex;flex-direction:column;gap:12px}.survey-builder__question-section{display:flex;flex-direction:column;gap:10px;padding:10px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:var(--val-radius-sm, 10px)}.survey-builder__section-head{display:flex;justify-content:space-between;align-items:center;gap:8px}.survey-builder__section-head strong{color:var(--ion-text-color, #000);font-size:.875rem}.survey-builder__presentation{display:flex;flex-direction:column;gap:12px;padding-top:4px}.survey-builder__section,.survey-builder__review{display:flex;flex-direction:column;gap:12px}.survey-builder__steps{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin-top:16px;margin-bottom:12px}.survey-builder__step{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:40px;padding:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .12));border-radius:8px;background:var(--ion-card-background, var(--ion-background-color, #fff));color:var(--ion-color-medium-shade, #6b6675);font-size:.8125rem;font-weight:700;cursor:pointer}.survey-builder__step span{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:999px;background:var(--ion-color-light, #f4f5f8);color:inherit;font-size:.75rem}.survey-builder__step--active{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-builder__wizard-actions{display:flex;justify-content:flex-end;gap:8px}.survey-builder__review{padding:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:var(--val-radius-md, 12px);background:var(--ion-card-background, var(--ion-background-color, #fff))}.survey-builder__review strong{color:var(--ion-text-color, #000)}.survey-builder__review span:not(.survey-builder__questions-label){color:var(--ion-color-medium, #92949c);font-size:.875rem}.survey-builder__image-field{display:flex;flex-direction:column;gap:10px}.survey-builder__image-preview{position:relative;width:100%}.survey-builder__image-preview img{display:block;width:100%;aspect-ratio:16 / 9;object-fit:contain;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;background:var(--ion-color-light, #f4f5f8)}.survey-builder__image-clear{position:absolute;top:8px;right:8px;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;border-radius:999px;background:#0009;color:#fff;cursor:pointer}.survey-builder__image-upload{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:44px;padding:10px 18px;border:2px dashed var(--ion-color-dark, #2f2c3a);border-radius:20px;color:var(--ion-color-dark, #2f2c3a);font-size:.875rem;font-weight:600;cursor:pointer}.survey-builder__image-upload:hover{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-builder__image-upload--loading{opacity:.7;cursor:default}.survey-builder__image-upload ion-spinner{width:16px;height:16px}.survey-builder__image-upload input{display:none}.survey-builder__questions-label{font-size:.8125rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--ion-color-medium, #92949c)}.survey-builder__empty{margin:0;font-size:.875rem;color:var(--ion-color-medium, #92949c)}.survey-builder__optional-note{margin:0;color:var(--ion-color-medium, #92949c);font-size:.875rem;line-height:1.35}.survey-builder__row{display:flex;flex-direction:column;gap:12px;padding:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:var(--val-radius-md, 12px);background:var(--ion-card-background, var(--ion-background-color, #fff))}.survey-builder__row-head{display:flex;flex-direction:column;gap:8px}.survey-builder__row-text{display:flex;flex-direction:column;gap:2px;min-width:0}.survey-builder__row-text strong{color:var(--ion-text-color, #000);font-size:.9375rem}.survey-builder__row-text span{color:var(--ion-color-medium, #92949c);font-size:.8125rem}.survey-builder__row-actions{display:flex;gap:4px;flex-wrap:wrap}.survey-builder__row-editor{display:flex;flex-direction:column;gap:12px;padding-top:12px;border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .1))}.survey-builder__row-editor-actions{display:flex;justify-content:flex-end}.survey-builder__error{margin:0;color:var(--ion-color-danger);font-size:.875rem;font-weight:700}@media (min-width: 576px){.survey-builder__row-head{flex-direction:row;align-items:flex-start;justify-content:space-between}.survey-builder__row-text{flex:1}}\n"] }]
42727
42983
  }], ctorParameters: () => [], propDecorators: { props: [{
42728
42984
  type: Input
42729
42985
  }], saved: [{
@@ -51175,6 +51431,39 @@ class DataTableComponent {
51175
51431
  get visibleColumns() {
51176
51432
  return this._visibleColumns;
51177
51433
  }
51434
+ get mobileCardLayout() {
51435
+ return this.props.mobileCardLayout || {};
51436
+ }
51437
+ get mobileCardLayoutActive() {
51438
+ return Object.keys(this.mobileCardLayout).length > 0;
51439
+ }
51440
+ get mobileCardPrimaryColumns() {
51441
+ return this.mobileCardLayout.primary ? this.resolveMobileCardColumns(this.mobileCardLayout.primary) : [];
51442
+ }
51443
+ get mobileCardSecondaryColumns() {
51444
+ return this.mobileCardLayout.secondary ? this.resolveMobileCardColumns(this.mobileCardLayout.secondary) : [];
51445
+ }
51446
+ get mobileCardMetaColumns() {
51447
+ return this.resolveMobileCardColumns(this.mobileCardLayout.meta);
51448
+ }
51449
+ get mobileCardStatusColumns() {
51450
+ return this.resolveMobileCardColumns(this.mobileCardLayout.status);
51451
+ }
51452
+ get mobileCardAdditionalColumns() {
51453
+ if (this.mobileCardLayoutActive && this.mobileCardLayout.showUnmappedColumns === false) {
51454
+ return [];
51455
+ }
51456
+ const mapped = new Set([
51457
+ ...this.mobileCardPrimaryColumns.map(c => c.key),
51458
+ ...this.mobileCardSecondaryColumns.map(c => c.key),
51459
+ ...this.mobileCardMetaColumns.map(c => c.key),
51460
+ ...this.mobileCardStatusColumns.map(c => c.key),
51461
+ ]);
51462
+ if (mapped.size === 0) {
51463
+ return this.visibleColumns;
51464
+ }
51465
+ return this.visibleColumns.filter(column => !mapped.has(column.key));
51466
+ }
51178
51467
  get totalColumns() {
51179
51468
  let count = this.visibleColumns.length;
51180
51469
  if (this.props.showSelectionColumn)
@@ -51276,6 +51565,21 @@ class DataTableComponent {
51276
51565
  return 'none';
51277
51566
  return this.currentSort.direction === 'asc' ? 'ascending' : 'descending';
51278
51567
  }
51568
+ getMobileCardFieldAriaLabel(column, row) {
51569
+ const value = this.getCellValue(row, column);
51570
+ const textValue = value === null || value === undefined ? '' : `${value}`;
51571
+ return textValue ? `${column.label}: ${textValue}` : column.label;
51572
+ }
51573
+ resolveMobileCardColumns(keys) {
51574
+ if (!keys)
51575
+ return [];
51576
+ const orderedKeys = Array.isArray(keys) ? keys : [keys];
51577
+ const columnByKey = new Map(this.visibleColumns.map(column => [column.key, column]));
51578
+ return orderedKeys
51579
+ .map(key => columnByKey.get(key))
51580
+ .filter((column) => Boolean(column))
51581
+ .filter((column, index, list) => list.findIndex(c => c.key === column.key) === index);
51582
+ }
51279
51583
  getRowNumber(index) {
51280
51584
  const start = this.props.rowNumberStart ?? 1;
51281
51585
  if (this.props.pagination) {
@@ -51662,22 +51966,139 @@ class DataTableComponent {
51662
51966
 
51663
51967
  <!-- Card body with fields -->
51664
51968
  <div class="card-body">
51665
- @for (column of visibleColumns; track column.key) {
51666
- <div class="card-field">
51667
- <span class="card-field__label">{{ column.label }}</span>
51668
- <span class="card-field__value">
51669
- @if (column.cellTemplate) {
51670
- <ng-container
51671
- *ngTemplateOutlet="
51672
- column.cellTemplate;
51673
- context: { row, column, value: getCellValue(row, column) }
51674
- "
51675
- ></ng-container>
51676
- } @else {
51677
- {{ getFormattedValue(row, column) }}
51678
- }
51679
- </span>
51680
- </div>
51969
+ @if (mobileCardLayoutActive) {
51970
+ @if (mobileCardPrimaryColumns.length) {
51971
+ @for (column of mobileCardPrimaryColumns; track column.key) {
51972
+ <div
51973
+ class="card-field card-field--primary"
51974
+ [attr.aria-label]="getMobileCardFieldAriaLabel(column, row)"
51975
+ >
51976
+ <span class="card-field__label">{{ column.label }}</span>
51977
+ <span class="card-field__value">
51978
+ @if (column.cellTemplate) {
51979
+ <ng-container
51980
+ *ngTemplateOutlet="
51981
+ column.cellTemplate;
51982
+ context: { row, column, value: getCellValue(row, column) }
51983
+ "
51984
+ ></ng-container>
51985
+ } @else {
51986
+ {{ getFormattedValue(row, column) }}
51987
+ }
51988
+ </span>
51989
+ </div>
51990
+ }
51991
+ }
51992
+
51993
+ @if (mobileCardSecondaryColumns.length) {
51994
+ @for (column of mobileCardSecondaryColumns; track column.key) {
51995
+ <div
51996
+ class="card-field card-field--secondary"
51997
+ [attr.aria-label]="getMobileCardFieldAriaLabel(column, row)"
51998
+ >
51999
+ <span class="card-field__label">{{ column.label }}</span>
52000
+ <span class="card-field__value">
52001
+ @if (column.cellTemplate) {
52002
+ <ng-container
52003
+ *ngTemplateOutlet="
52004
+ column.cellTemplate;
52005
+ context: { row, column, value: getCellValue(row, column) }
52006
+ "
52007
+ ></ng-container>
52008
+ } @else {
52009
+ {{ getFormattedValue(row, column) }}
52010
+ }
52011
+ </span>
52012
+ </div>
52013
+ }
52014
+ }
52015
+
52016
+ @if (mobileCardMetaColumns.length) {
52017
+ @for (column of mobileCardMetaColumns; track column.key) {
52018
+ <div
52019
+ class="card-field card-field--meta"
52020
+ [attr.aria-label]="getMobileCardFieldAriaLabel(column, row)"
52021
+ >
52022
+ <span class="card-field__label">{{ column.label }}</span>
52023
+ <span class="card-field__value">
52024
+ @if (column.cellTemplate) {
52025
+ <ng-container
52026
+ *ngTemplateOutlet="
52027
+ column.cellTemplate;
52028
+ context: { row, column, value: getCellValue(row, column) }
52029
+ "
52030
+ ></ng-container>
52031
+ } @else {
52032
+ {{ getFormattedValue(row, column) }}
52033
+ }
52034
+ </span>
52035
+ </div>
52036
+ }
52037
+ }
52038
+
52039
+ @if (mobileCardStatusColumns.length) {
52040
+ @for (column of mobileCardStatusColumns; track column.key) {
52041
+ <div
52042
+ class="card-field card-field--status"
52043
+ [attr.aria-label]="getMobileCardFieldAriaLabel(column, row)"
52044
+ >
52045
+ <span class="card-field__label">{{ column.label }}</span>
52046
+ <span class="card-field__value">
52047
+ @if (column.cellTemplate) {
52048
+ <ng-container
52049
+ *ngTemplateOutlet="
52050
+ column.cellTemplate;
52051
+ context: { row, column, value: getCellValue(row, column) }
52052
+ "
52053
+ ></ng-container>
52054
+ } @else {
52055
+ {{ getFormattedValue(row, column) }}
52056
+ }
52057
+ </span>
52058
+ </div>
52059
+ }
52060
+ }
52061
+
52062
+ @if (mobileCardAdditionalColumns.length) {
52063
+ @for (column of mobileCardAdditionalColumns; track column.key) {
52064
+ <div
52065
+ class="card-field card-field--meta"
52066
+ [attr.aria-label]="getMobileCardFieldAriaLabel(column, row)"
52067
+ >
52068
+ <span class="card-field__label">{{ column.label }}</span>
52069
+ <span class="card-field__value">
52070
+ @if (column.cellTemplate) {
52071
+ <ng-container
52072
+ *ngTemplateOutlet="
52073
+ column.cellTemplate;
52074
+ context: { row, column, value: getCellValue(row, column) }
52075
+ "
52076
+ ></ng-container>
52077
+ } @else {
52078
+ {{ getFormattedValue(row, column) }}
52079
+ }
52080
+ </span>
52081
+ </div>
52082
+ }
52083
+ }
52084
+ } @else {
52085
+ @for (column of visibleColumns; track column.key) {
52086
+ <div class="card-field">
52087
+ <span class="card-field__label">{{ column.label }}</span>
52088
+ <span class="card-field__value">
52089
+ @if (column.cellTemplate) {
52090
+ <ng-container
52091
+ *ngTemplateOutlet="
52092
+ column.cellTemplate;
52093
+ context: { row, column, value: getCellValue(row, column) }
52094
+ "
52095
+ ></ng-container>
52096
+ } @else {
52097
+ {{ getFormattedValue(row, column) }}
52098
+ }
52099
+ </span>
52100
+ </div>
52101
+ }
51681
52102
  }
51682
52103
  </div>
51683
52104
 
@@ -51766,7 +52187,7 @@ class DataTableComponent {
51766
52187
  </div>
51767
52188
  }
51768
52189
  </div>
51769
- `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-xl-wide: 1280px;--val-container-md-wide: 900px;--val-container-aside: 0px;--val-container-padding: 16px;--val-radius-xs: 10px;--val-radius-sm: 16px;--val-radius-md: 20px;--val-radius-lg: 28px;--val-radius-xl: 36px;--val-radius-full: 999px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--ion-color-warning: #ffde38;--ion-color-warning-rgb: 255, 222, 56;--ion-color-warning-contrast: #000000;--ion-color-warning-contrast-rgb: 0, 0, 0;--ion-color-warning-shade: #e0c331;--ion-color-warning-tint: #ffe14c;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-dark)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}:host{display:block}.data-table-container{--dt-elevation-none: none;--dt-elevation-low: 0 1px 3px rgba(0, 0, 0, .08), 0 1px 2px rgba(0, 0, 0, .04);--dt-elevation-medium: 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06);--dt-elevation-high: 0 10px 15px -3px rgba(0, 0, 0, .1), 0 4px 6px -2px rgba(0, 0, 0, .05);--dt-primary: var(--ion-color-primary, #4f46e5);--dt-primary-rgb: var(--ion-color-primary-rgb, 79, 70, 229);--dt-surface: var(--ion-background-color, #ffffff);--dt-surface-variant: #f8fafc;--dt-border: #e2e8f0;--dt-text-primary: #1e293b;--dt-text-secondary: #64748b;--dt-text-muted: #94a3b8;--dt-gradient-start: #6366f1;--dt-gradient-end: #8b5cf6;--dt-border-radius: 16px;--dt-cell-padding-x: 16px;--dt-cell-padding-y: 14px;--dt-header-padding-y: 12px}.data-table-container{position:relative;background:var(--dt-surface);border-radius:var(--dt-border-radius);box-shadow:var(--dt-elevation-medium);border:1px solid var(--dt-border);overflow:hidden}.data-table-container.elevation-none{box-shadow:var(--dt-elevation-none)}.data-table-container.elevation-low{box-shadow:var(--dt-elevation-low)}.data-table-container.elevation-high{box-shadow:var(--dt-elevation-high)}.data-table-container.header-gradient:before{content:\"\";position:absolute;top:0;left:0;right:0;height:4px;background:linear-gradient(90deg,var(--dt-gradient-start),var(--dt-gradient-end));border-radius:var(--dt-border-radius) var(--dt-border-radius) 0 0;z-index:2}.loading-overlay{position:absolute;inset:0;background:#ffffffe6;backdrop-filter:blur(2px);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;z-index:10}.loading-overlay ion-spinner{--color: var(--dt-primary);width:32px;height:32px}.loading-message{font-size:.875rem;font-weight:500;color:var(--dt-text-secondary)}.table-wrapper{overflow-x:auto;max-height:var(--max-height)}.table-wrapper.is-loading{opacity:.5;pointer-events:none}.table-wrapper::-webkit-scrollbar{height:8px;width:8px}.table-wrapper::-webkit-scrollbar-track{background:var(--dt-surface-variant);border-radius:4px}.table-wrapper::-webkit-scrollbar-thumb{background:var(--dt-border);border-radius:4px}.table-wrapper::-webkit-scrollbar-thumb:hover{background:var(--dt-text-muted)}table{width:100%;border-collapse:collapse;font-size:.875rem}th,td{padding:var(--dt-cell-padding-y) var(--dt-cell-padding-x);text-align:left;vertical-align:middle}thead{background:var(--dt-surface-variant)}thead th{font-weight:600;font-size:.8125rem;color:var(--dt-text-secondary);white-space:nowrap;position:relative;border-bottom:1px solid var(--dt-border);padding:var(--dt-header-padding-y) var(--dt-cell-padding-x);transition:all .2s ease}thead th.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}thead th.sortable:hover{background:#00000008;color:var(--dt-text-primary)}thead th.sorted{color:var(--dt-primary);background:rgba(var(--dt-primary-rgb),.04)}.header-content{display:flex;align-items:center;gap:8px}.sort-icons{display:flex;flex-direction:column;gap:0;opacity:.4;transition:opacity .2s ease}.sortable:hover .sort-icons{opacity:.7}.sorted .sort-icons{opacity:1}.sort-icons ion-icon{font-size:.75rem;color:var(--dt-text-muted);margin:-3px 0;transition:all .2s ease}.sort-icons ion-icon.active{color:var(--dt-primary);transform:scale(1.2)}tbody tr{border-bottom:1px solid var(--dt-border)}tbody tr:last-child{border-bottom:none}tbody tr.clickable{cursor:pointer}tbody tr.selected{background:rgba(var(--dt-primary-rgb),.06)}tbody td{color:var(--dt-text-primary);font-size:.875rem}.hoverable tbody tr:hover:not(.empty-row){background:var(--dt-surface-variant)}.hoverable tbody tr:hover:not(.empty-row).selected{background:rgba(var(--dt-primary-rgb),.08)}.align-left{text-align:left}.align-center{text-align:center}.align-right{text-align:right}.selection-cell{width:52px;min-width:52px;max-width:52px;text-align:center;padding:8px 12px;box-sizing:border-box}.selection-cell ion-checkbox{--size: 20px;--border-radius: 50%;--border-width: 2px;--border-color: var(--dt-border);--border-color-checked: var(--dt-primary);--background: transparent;--background-checked: var(--dt-primary);--checkmark-color: white;--checkmark-width: 2px;margin:0;display:block}.selection-cell ion-checkbox::part(container){border-radius:50%}.selection-cell input[type=radio]{width:20px;height:20px;cursor:pointer;accent-color:var(--dt-primary);margin:0;display:block}.checkbox-circular .selection-cell ion-checkbox{--border-radius: 50%}.checkbox-circular .selection-cell ion-checkbox::part(container){border-radius:50%}.row-number-cell{width:60px;text-align:center;color:var(--dt-text-muted);font-size:.75rem;font-weight:500}.actions-cell{text-align:center;white-space:nowrap}.sticky-start{position:sticky;left:0;background:inherit;z-index:1;box-shadow:2px 0 4px #0000000d}.sticky-end{position:sticky;right:0;background:inherit;z-index:1;box-shadow:-2px 0 4px #0000000d}.empty-row td{padding:64px 16px}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;color:var(--dt-text-secondary)}.empty-icon{font-size:3.5rem;margin-bottom:20px;opacity:.4;color:var(--dt-text-muted)}.empty-title{font-size:1.125rem;font-weight:600;margin:0 0 8px;color:var(--dt-text-primary)}.empty-description{font-size:.875rem;margin:0;max-width:320px;color:var(--dt-text-secondary);line-height:1.5}.pagination-container{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-top:1px solid var(--dt-border);background:var(--dt-surface);flex-wrap:wrap;gap:16px}.pagination-info{display:flex;align-items:center;gap:20px;font-size:.875rem;color:var(--dt-text-secondary)}.pagination-info span{font-weight:500}.page-size-select{--padding-start: 12px;--padding-end: 12px;font-size:.875rem;min-width:140px;--background: var(--dt-surface-variant);--border-radius: 8px}.pagination-controls{display:flex;align-items:center;gap:8px}.pagination-controls ion-button{--padding-start: 10px;--padding-end: 10px;--border-radius: 8px;--background: var(--dt-surface-variant);--background-hover: var(--dt-border);--color: var(--dt-text-secondary);--color-hover: var(--dt-text-primary);margin:0;height:36px;min-width:36px}.pagination-controls ion-button:disabled{opacity:.4}.pagination-controls ion-button ion-icon{font-size:1rem}.page-indicator{padding:0 16px;font-size:.875rem;color:var(--dt-text-primary);font-weight:600;background:var(--dt-surface-variant);border-radius:8px;height:36px;display:flex;align-items:center;min-width:80px;justify-content:center}.bordered th,.bordered td{border:1px solid var(--dt-border)}.striped tbody tr:nth-child(2n){background:var(--dt-surface-variant)}.striped tbody tr:nth-child(2n).selected{background:rgba(var(--dt-primary-rgb),.08)}.sticky-header .table-wrapper{overflow-y:auto}.sticky-header thead{position:sticky;top:0;z-index:5;box-shadow:0 1px 0 var(--dt-border)}.size-small{--dt-cell-padding-x: 12px;--dt-cell-padding-y: 10px;--dt-header-padding-y: 10px}.size-small th,.size-small td{font-size:.8125rem}.size-small thead th{font-size:.75rem}.size-small .selection-cell{width:44px;padding:6px 8px}.size-small .selection-cell ion-checkbox{--size: 18px}.size-small .row-number-cell{width:48px;font-size:.6875rem}.size-small .pagination-container{padding:12px 16px}.size-small .pagination-info,.size-small .page-indicator{font-size:.8125rem}.size-small .pagination-controls ion-button{height:32px;min-width:32px}.size-small .page-indicator{height:32px;min-width:70px}.size-large{--dt-cell-padding-x: 20px;--dt-cell-padding-y: 18px;--dt-header-padding-y: 16px}.size-large th,.size-large td{font-size:.9375rem}.size-large thead th{font-size:.875rem}.size-large .selection-cell{width:60px;padding:12px 16px}.size-large .selection-cell ion-checkbox{--size: 24px}.size-large .row-number-cell{width:72px;font-size:.875rem}.size-large .pagination-container{padding:20px 24px}.size-large .pagination-info,.size-large .page-indicator{font-size:.9375rem}.size-large .pagination-controls ion-button{height:40px;min-width:40px}.size-large .page-indicator{height:40px;min-width:90px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@media (max-width: 768px){.data-table-container{--dt-border-radius: 12px}.pagination-container{flex-direction:column;align-items:stretch;gap:12px}.pagination-info{justify-content:space-between}.pagination-controls{justify-content:center}}.table-toolbar{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:20px;border-bottom:1px solid var(--dt-border);background:var(--dt-surface);flex-wrap:wrap}.table-toolbar:empty{display:none}@media (max-width: 576px){.table-toolbar{flex-direction:column;align-items:stretch;padding:16px}}.status-badge{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:9999px;font-size:.75rem;font-weight:600;white-space:nowrap;letter-spacing:.025em}.status-badge--success{background:#dcfce7;color:#15803d}.status-badge--warning{background:#fef3c7;color:#b45309}.status-badge--danger{background:#fee2e2;color:#dc2626}.status-badge--primary{background:#e0e7ff;color:#4338ca}.status-badge--secondary{background:#f1f5f9;color:#475569}.status-badge--medium{background:#f1f5f9;color:#64748b}.status-badge--tertiary{background:#f3e8ff;color:#7c3aed}.status-badge--filled.status-badge--success{background:#22c55e;color:#fff}.status-badge--filled.status-badge--warning{background:#f59e0b;color:#fff}.status-badge--filled.status-badge--danger{background:#ef4444;color:#fff}.status-badge--filled.status-badge--primary{background:var(--dt-primary);color:#fff}.status-badge--outlined{background:transparent;border:1.5px solid currentColor}.status-badge--outlined.status-badge--success{color:#16a34a}.status-badge--outlined.status-badge--warning{color:#d97706}.status-badge--outlined.status-badge--danger{color:#dc2626}.status-badge--outlined.status-badge--primary{color:var(--dt-primary)}.action-buttons{display:flex;gap:6px;justify-content:center}.action-buttons ion-button{--padding-start: 8px;--padding-end: 8px;--border-radius: 8px;margin:0}.action-buttons ion-button ion-icon{font-size:1.125rem}.card-list{display:none;padding:12px;gap:12px}.data-card{background:var(--dt-surface);border:1px solid var(--dt-border);border-radius:12px;padding:16px;margin-bottom:12px;transition:all .2s ease}.data-card.selected{border-color:var(--dt-primary);background:rgba(var(--dt-primary-rgb),.04);box-shadow:0 0 0 1px var(--dt-primary)}.data-card.clickable{cursor:pointer}.data-card.clickable:hover{box-shadow:var(--dt-elevation-medium);transform:translateY(-2px)}.data-card.clickable:active{transform:translateY(0)}.card-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid var(--dt-border)}.card-selection{display:flex;align-items:center}.card-body{display:flex;flex-direction:column;gap:12px}.card-field{display:flex;justify-content:space-between;align-items:flex-start;gap:16px}.card-field__label{font-size:.75rem;font-weight:600;color:var(--dt-text-muted);flex-shrink:0}.card-field__value{font-size:.875rem;color:var(--dt-text-primary);text-align:right;word-break:break-word;font-weight:500}.card-actions{display:flex;justify-content:flex-end;margin-top:16px;padding-top:12px;border-top:1px solid var(--dt-border)}@media (max-width: 768px){.responsive-cards .table-wrapper{display:none}.responsive-cards .card-list{display:block}}:host-context(body.dark) .data-table-container,:host-context(.dark) .data-table-container,:host-context(.ion-palette-dark) .data-table-container,:host-context(html.ion-palette-dark) .data-table-container,:host-context([data-theme=dark]) .data-table-container{--dt-surface: #1e293b;--dt-surface-variant: #334155;--dt-border: #475569;--dt-text-primary: #f1f5f9;--dt-text-secondary: #94a3b8;--dt-text-muted: #64748b}:host-context(body.dark) .loading-overlay,:host-context(.dark) .loading-overlay,:host-context(.ion-palette-dark) .loading-overlay,:host-context(html.ion-palette-dark) .loading-overlay,:host-context([data-theme=dark]) .loading-overlay{background:#1e293be6}:host-context(body.dark) .status-badge--success,:host-context(.dark) .status-badge--success,:host-context(.ion-palette-dark) .status-badge--success,:host-context(html.ion-palette-dark) .status-badge--success,:host-context([data-theme=dark]) .status-badge--success{background:#22c55e33;color:#4ade80}:host-context(body.dark) .status-badge--warning,:host-context(.dark) .status-badge--warning,:host-context(.ion-palette-dark) .status-badge--warning,:host-context(html.ion-palette-dark) .status-badge--warning,:host-context([data-theme=dark]) .status-badge--warning{background:#f59e0b33;color:#fbbf24}:host-context(body.dark) .status-badge--danger,:host-context(.dark) .status-badge--danger,:host-context(.ion-palette-dark) .status-badge--danger,:host-context(html.ion-palette-dark) .status-badge--danger,:host-context([data-theme=dark]) .status-badge--danger{background:#ef444433;color:#f87171}:host-context(body.dark) .status-badge--primary,:host-context(.dark) .status-badge--primary,:host-context(.ion-palette-dark) .status-badge--primary,:host-context(html.ion-palette-dark) .status-badge--primary,:host-context([data-theme=dark]) .status-badge--primary{background:#6366f133;color:#a5b4fc}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "errorText", "helperText", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
52190
+ `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-xl-wide: 1280px;--val-container-md-wide: 900px;--val-container-aside: 0px;--val-container-padding: 16px;--val-radius-xs: 10px;--val-radius-sm: 16px;--val-radius-md: 20px;--val-radius-lg: 28px;--val-radius-xl: 36px;--val-radius-full: 999px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--ion-color-warning: #ffde38;--ion-color-warning-rgb: 255, 222, 56;--ion-color-warning-contrast: #000000;--ion-color-warning-contrast-rgb: 0, 0, 0;--ion-color-warning-shade: #e0c331;--ion-color-warning-tint: #ffe14c;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-dark)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}:host{display:block}.data-table-container{--dt-elevation-none: none;--dt-elevation-low: 0 1px 3px rgba(0, 0, 0, .08), 0 1px 2px rgba(0, 0, 0, .04);--dt-elevation-medium: 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06);--dt-elevation-high: 0 10px 15px -3px rgba(0, 0, 0, .1), 0 4px 6px -2px rgba(0, 0, 0, .05);--dt-primary: var(--ion-color-primary, #4f46e5);--dt-primary-rgb: var(--ion-color-primary-rgb, 79, 70, 229);--dt-surface: var(--ion-background-color, #ffffff);--dt-surface-variant: #f8fafc;--dt-border: #e2e8f0;--dt-text-primary: #1e293b;--dt-text-secondary: #64748b;--dt-text-muted: #94a3b8;--dt-gradient-start: #6366f1;--dt-gradient-end: #8b5cf6;--dt-border-radius: 16px;--dt-cell-padding-x: 16px;--dt-cell-padding-y: 14px;--dt-header-padding-y: 12px}.data-table-container{position:relative;background:var(--dt-surface);border-radius:var(--dt-border-radius);box-shadow:var(--dt-elevation-medium);border:1px solid var(--dt-border);overflow:hidden}.data-table-container.elevation-none{box-shadow:var(--dt-elevation-none)}.data-table-container.elevation-low{box-shadow:var(--dt-elevation-low)}.data-table-container.elevation-high{box-shadow:var(--dt-elevation-high)}.data-table-container.header-gradient:before{content:\"\";position:absolute;top:0;left:0;right:0;height:4px;background:linear-gradient(90deg,var(--dt-gradient-start),var(--dt-gradient-end));border-radius:var(--dt-border-radius) var(--dt-border-radius) 0 0;z-index:2}.loading-overlay{position:absolute;inset:0;background:#ffffffe6;backdrop-filter:blur(2px);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;z-index:10}.loading-overlay ion-spinner{--color: var(--dt-primary);width:32px;height:32px}.loading-message{font-size:.875rem;font-weight:500;color:var(--dt-text-secondary)}.table-wrapper{overflow-x:auto;max-height:var(--max-height)}.table-wrapper.is-loading{opacity:.5;pointer-events:none}.table-wrapper::-webkit-scrollbar{height:8px;width:8px}.table-wrapper::-webkit-scrollbar-track{background:var(--dt-surface-variant);border-radius:4px}.table-wrapper::-webkit-scrollbar-thumb{background:var(--dt-border);border-radius:4px}.table-wrapper::-webkit-scrollbar-thumb:hover{background:var(--dt-text-muted)}table{width:100%;border-collapse:collapse;font-size:.875rem}th,td{padding:var(--dt-cell-padding-y) var(--dt-cell-padding-x);text-align:left;vertical-align:middle}thead{background:var(--dt-surface-variant)}thead th{font-weight:600;font-size:.8125rem;color:var(--dt-text-secondary);white-space:nowrap;position:relative;border-bottom:1px solid var(--dt-border);padding:var(--dt-header-padding-y) var(--dt-cell-padding-x);transition:all .2s ease}thead th.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}thead th.sortable:hover{background:#00000008;color:var(--dt-text-primary)}thead th.sorted{color:var(--dt-primary);background:rgba(var(--dt-primary-rgb),.04)}.header-content{display:flex;align-items:center;gap:8px}.sort-icons{display:flex;flex-direction:column;gap:0;opacity:.4;transition:opacity .2s ease}.sortable:hover .sort-icons{opacity:.7}.sorted .sort-icons{opacity:1}.sort-icons ion-icon{font-size:.75rem;color:var(--dt-text-muted);margin:-3px 0;transition:all .2s ease}.sort-icons ion-icon.active{color:var(--dt-primary);transform:scale(1.2)}tbody tr{border-bottom:1px solid var(--dt-border)}tbody tr:last-child{border-bottom:none}tbody tr.clickable{cursor:pointer}tbody tr.selected{background:rgba(var(--dt-primary-rgb),.06)}tbody td{color:var(--dt-text-primary);font-size:.875rem}.hoverable tbody tr:hover:not(.empty-row){background:var(--dt-surface-variant)}.hoverable tbody tr:hover:not(.empty-row).selected{background:rgba(var(--dt-primary-rgb),.08)}.align-left{text-align:left}.align-center{text-align:center}.align-right{text-align:right}.selection-cell{width:52px;min-width:52px;max-width:52px;text-align:center;padding:8px 12px;box-sizing:border-box}.selection-cell ion-checkbox{--size: 20px;--border-radius: 50%;--border-width: 2px;--border-color: var(--dt-border);--border-color-checked: var(--dt-primary);--background: transparent;--background-checked: var(--dt-primary);--checkmark-color: white;--checkmark-width: 2px;margin:0;display:block}.selection-cell ion-checkbox::part(container){border-radius:50%}.selection-cell input[type=radio]{width:20px;height:20px;cursor:pointer;accent-color:var(--dt-primary);margin:0;display:block}.checkbox-circular .selection-cell ion-checkbox{--border-radius: 50%}.checkbox-circular .selection-cell ion-checkbox::part(container){border-radius:50%}.row-number-cell{width:60px;text-align:center;color:var(--dt-text-muted);font-size:.75rem;font-weight:500}.actions-cell{text-align:center;white-space:nowrap}.sticky-start{position:sticky;left:0;background:inherit;z-index:1;box-shadow:2px 0 4px #0000000d}.sticky-end{position:sticky;right:0;background:inherit;z-index:1;box-shadow:-2px 0 4px #0000000d}.empty-row td{padding:64px 16px}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;color:var(--dt-text-secondary)}.empty-icon{font-size:3.5rem;margin-bottom:20px;opacity:.4;color:var(--dt-text-muted)}.empty-title{font-size:1.125rem;font-weight:600;margin:0 0 8px;color:var(--dt-text-primary)}.empty-description{font-size:.875rem;margin:0;max-width:320px;color:var(--dt-text-secondary);line-height:1.5}.pagination-container{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-top:1px solid var(--dt-border);background:var(--dt-surface);flex-wrap:wrap;gap:16px}.pagination-info{display:flex;align-items:center;gap:20px;font-size:.875rem;color:var(--dt-text-secondary)}.pagination-info span{font-weight:500}.page-size-select{--padding-start: 12px;--padding-end: 12px;font-size:.875rem;min-width:140px;--background: var(--dt-surface-variant);--border-radius: 8px}.pagination-controls{display:flex;align-items:center;gap:8px}.pagination-controls ion-button{--padding-start: 10px;--padding-end: 10px;--border-radius: 8px;--background: var(--dt-surface-variant);--background-hover: var(--dt-border);--color: var(--dt-text-secondary);--color-hover: var(--dt-text-primary);margin:0;height:36px;min-width:36px}.pagination-controls ion-button:disabled{opacity:.4}.pagination-controls ion-button ion-icon{font-size:1rem}.page-indicator{padding:0 16px;font-size:.875rem;color:var(--dt-text-primary);font-weight:600;background:var(--dt-surface-variant);border-radius:8px;height:36px;display:flex;align-items:center;min-width:80px;justify-content:center}.bordered th,.bordered td{border:1px solid var(--dt-border)}.striped tbody tr:nth-child(2n){background:var(--dt-surface-variant)}.striped tbody tr:nth-child(2n).selected{background:rgba(var(--dt-primary-rgb),.08)}.sticky-header .table-wrapper{overflow-y:auto}.sticky-header thead{position:sticky;top:0;z-index:5;box-shadow:0 1px 0 var(--dt-border)}.size-small{--dt-cell-padding-x: 12px;--dt-cell-padding-y: 10px;--dt-header-padding-y: 10px}.size-small th,.size-small td{font-size:.8125rem}.size-small thead th{font-size:.75rem}.size-small .selection-cell{width:44px;padding:6px 8px}.size-small .selection-cell ion-checkbox{--size: 18px}.size-small .row-number-cell{width:48px;font-size:.6875rem}.size-small .pagination-container{padding:12px 16px}.size-small .pagination-info,.size-small .page-indicator{font-size:.8125rem}.size-small .pagination-controls ion-button{height:32px;min-width:32px}.size-small .page-indicator{height:32px;min-width:70px}.size-large{--dt-cell-padding-x: 20px;--dt-cell-padding-y: 18px;--dt-header-padding-y: 16px}.size-large th,.size-large td{font-size:.9375rem}.size-large thead th{font-size:.875rem}.size-large .selection-cell{width:60px;padding:12px 16px}.size-large .selection-cell ion-checkbox{--size: 24px}.size-large .row-number-cell{width:72px;font-size:.875rem}.size-large .pagination-container{padding:20px 24px}.size-large .pagination-info,.size-large .page-indicator{font-size:.9375rem}.size-large .pagination-controls ion-button{height:40px;min-width:40px}.size-large .page-indicator{height:40px;min-width:90px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@media (max-width: 768px){.data-table-container{--dt-border-radius: 12px}.pagination-container{flex-direction:column;align-items:stretch;gap:12px}.pagination-info{justify-content:space-between}.pagination-controls{justify-content:center}}.table-toolbar{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:20px;border-bottom:1px solid var(--dt-border);background:var(--dt-surface);flex-wrap:wrap}.table-toolbar:empty{display:none}@media (max-width: 576px){.table-toolbar{flex-direction:column;align-items:stretch;padding:16px}}.status-badge{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:9999px;font-size:.75rem;font-weight:600;white-space:nowrap;letter-spacing:.025em}.status-badge--success{background:#dcfce7;color:#15803d}.status-badge--warning{background:#fef3c7;color:#b45309}.status-badge--danger{background:#fee2e2;color:#dc2626}.status-badge--primary{background:#e0e7ff;color:#4338ca}.status-badge--secondary{background:#f1f5f9;color:#475569}.status-badge--medium{background:#f1f5f9;color:#64748b}.status-badge--tertiary{background:#f3e8ff;color:#7c3aed}.status-badge--filled.status-badge--success{background:#22c55e;color:#fff}.status-badge--filled.status-badge--warning{background:#f59e0b;color:#fff}.status-badge--filled.status-badge--danger{background:#ef4444;color:#fff}.status-badge--filled.status-badge--primary{background:var(--dt-primary);color:#fff}.status-badge--outlined{background:transparent;border:1.5px solid currentColor}.status-badge--outlined.status-badge--success{color:#16a34a}.status-badge--outlined.status-badge--warning{color:#d97706}.status-badge--outlined.status-badge--danger{color:#dc2626}.status-badge--outlined.status-badge--primary{color:var(--dt-primary)}.action-buttons{display:flex;gap:6px;justify-content:center}.action-buttons ion-button{--padding-start: 8px;--padding-end: 8px;--border-radius: 8px;margin:0}.action-buttons ion-button ion-icon{font-size:1.125rem}.card-list{display:none;padding:12px;gap:12px}.data-card{background:var(--dt-surface);border:1px solid var(--dt-border);border-radius:12px;padding:16px;margin-bottom:12px;transition:all .2s ease}.data-card.selected{border-color:var(--dt-primary);background:rgba(var(--dt-primary-rgb),.04);box-shadow:0 0 0 1px var(--dt-primary)}.data-card.clickable{cursor:pointer}.data-card.clickable:hover{box-shadow:var(--dt-elevation-medium);transform:translateY(-2px)}.data-card.clickable:active{transform:translateY(0)}.card-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid var(--dt-border)}.card-selection{display:flex;align-items:center}.card-selection ion-checkbox,.card-selection input[type=radio]{min-width:44px;min-height:44px;display:inline-flex;align-items:center;justify-content:center}.card-body{display:flex;flex-direction:column;gap:12px}.card-field{display:flex;justify-content:space-between;align-items:flex-start;gap:16px}.card-field__label{font-size:.75rem;font-weight:600;color:var(--dt-text-muted);flex-shrink:0}.card-field__value{font-size:.875rem;color:var(--dt-text-primary);text-align:right;word-break:break-word;font-weight:500}.card-field--primary .card-field__label{color:var(--dt-text-primary)}.card-field--primary .card-field__value{font-size:1rem;font-weight:600}.card-field--secondary .card-field__label,.card-field--status .card-field__label{color:var(--dt-text-muted)}.card-field--status .card-field__value{font-size:.8125rem;font-weight:600}.card-actions{display:flex;justify-content:flex-end;margin-top:16px;padding-top:12px;border-top:1px solid var(--dt-border)}@media (max-width: 768px){.responsive-cards .table-wrapper{display:none}.responsive-cards .card-list{display:block}}:host-context(body.dark) .data-table-container,:host-context(.dark) .data-table-container,:host-context(.ion-palette-dark) .data-table-container,:host-context(html.ion-palette-dark) .data-table-container,:host-context([data-theme=dark]) .data-table-container{--dt-surface: #1e293b;--dt-surface-variant: #334155;--dt-border: #475569;--dt-text-primary: #f1f5f9;--dt-text-secondary: #94a3b8;--dt-text-muted: #64748b}:host-context(body.dark) .loading-overlay,:host-context(.dark) .loading-overlay,:host-context(.ion-palette-dark) .loading-overlay,:host-context(html.ion-palette-dark) .loading-overlay,:host-context([data-theme=dark]) .loading-overlay{background:#1e293be6}:host-context(body.dark) .status-badge--success,:host-context(.dark) .status-badge--success,:host-context(.ion-palette-dark) .status-badge--success,:host-context(html.ion-palette-dark) .status-badge--success,:host-context([data-theme=dark]) .status-badge--success{background:#22c55e33;color:#4ade80}:host-context(body.dark) .status-badge--warning,:host-context(.dark) .status-badge--warning,:host-context(.ion-palette-dark) .status-badge--warning,:host-context(html.ion-palette-dark) .status-badge--warning,:host-context([data-theme=dark]) .status-badge--warning{background:#f59e0b33;color:#fbbf24}:host-context(body.dark) .status-badge--danger,:host-context(.dark) .status-badge--danger,:host-context(.ion-palette-dark) .status-badge--danger,:host-context(html.ion-palette-dark) .status-badge--danger,:host-context([data-theme=dark]) .status-badge--danger{background:#ef444433;color:#f87171}:host-context(body.dark) .status-badge--primary,:host-context(.dark) .status-badge--primary,:host-context(.ion-palette-dark) .status-badge--primary,:host-context(html.ion-palette-dark) .status-badge--primary,:host-context([data-theme=dark]) .status-badge--primary{background:#6366f133;color:#a5b4fc}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "errorText", "helperText", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
51770
52191
  }
51771
52192
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DataTableComponent, decorators: [{
51772
52193
  type: Component,
@@ -52021,22 +52442,139 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
52021
52442
 
52022
52443
  <!-- Card body with fields -->
52023
52444
  <div class="card-body">
52024
- @for (column of visibleColumns; track column.key) {
52025
- <div class="card-field">
52026
- <span class="card-field__label">{{ column.label }}</span>
52027
- <span class="card-field__value">
52028
- @if (column.cellTemplate) {
52029
- <ng-container
52030
- *ngTemplateOutlet="
52031
- column.cellTemplate;
52032
- context: { row, column, value: getCellValue(row, column) }
52033
- "
52034
- ></ng-container>
52035
- } @else {
52036
- {{ getFormattedValue(row, column) }}
52037
- }
52038
- </span>
52039
- </div>
52445
+ @if (mobileCardLayoutActive) {
52446
+ @if (mobileCardPrimaryColumns.length) {
52447
+ @for (column of mobileCardPrimaryColumns; track column.key) {
52448
+ <div
52449
+ class="card-field card-field--primary"
52450
+ [attr.aria-label]="getMobileCardFieldAriaLabel(column, row)"
52451
+ >
52452
+ <span class="card-field__label">{{ column.label }}</span>
52453
+ <span class="card-field__value">
52454
+ @if (column.cellTemplate) {
52455
+ <ng-container
52456
+ *ngTemplateOutlet="
52457
+ column.cellTemplate;
52458
+ context: { row, column, value: getCellValue(row, column) }
52459
+ "
52460
+ ></ng-container>
52461
+ } @else {
52462
+ {{ getFormattedValue(row, column) }}
52463
+ }
52464
+ </span>
52465
+ </div>
52466
+ }
52467
+ }
52468
+
52469
+ @if (mobileCardSecondaryColumns.length) {
52470
+ @for (column of mobileCardSecondaryColumns; track column.key) {
52471
+ <div
52472
+ class="card-field card-field--secondary"
52473
+ [attr.aria-label]="getMobileCardFieldAriaLabel(column, row)"
52474
+ >
52475
+ <span class="card-field__label">{{ column.label }}</span>
52476
+ <span class="card-field__value">
52477
+ @if (column.cellTemplate) {
52478
+ <ng-container
52479
+ *ngTemplateOutlet="
52480
+ column.cellTemplate;
52481
+ context: { row, column, value: getCellValue(row, column) }
52482
+ "
52483
+ ></ng-container>
52484
+ } @else {
52485
+ {{ getFormattedValue(row, column) }}
52486
+ }
52487
+ </span>
52488
+ </div>
52489
+ }
52490
+ }
52491
+
52492
+ @if (mobileCardMetaColumns.length) {
52493
+ @for (column of mobileCardMetaColumns; track column.key) {
52494
+ <div
52495
+ class="card-field card-field--meta"
52496
+ [attr.aria-label]="getMobileCardFieldAriaLabel(column, row)"
52497
+ >
52498
+ <span class="card-field__label">{{ column.label }}</span>
52499
+ <span class="card-field__value">
52500
+ @if (column.cellTemplate) {
52501
+ <ng-container
52502
+ *ngTemplateOutlet="
52503
+ column.cellTemplate;
52504
+ context: { row, column, value: getCellValue(row, column) }
52505
+ "
52506
+ ></ng-container>
52507
+ } @else {
52508
+ {{ getFormattedValue(row, column) }}
52509
+ }
52510
+ </span>
52511
+ </div>
52512
+ }
52513
+ }
52514
+
52515
+ @if (mobileCardStatusColumns.length) {
52516
+ @for (column of mobileCardStatusColumns; track column.key) {
52517
+ <div
52518
+ class="card-field card-field--status"
52519
+ [attr.aria-label]="getMobileCardFieldAriaLabel(column, row)"
52520
+ >
52521
+ <span class="card-field__label">{{ column.label }}</span>
52522
+ <span class="card-field__value">
52523
+ @if (column.cellTemplate) {
52524
+ <ng-container
52525
+ *ngTemplateOutlet="
52526
+ column.cellTemplate;
52527
+ context: { row, column, value: getCellValue(row, column) }
52528
+ "
52529
+ ></ng-container>
52530
+ } @else {
52531
+ {{ getFormattedValue(row, column) }}
52532
+ }
52533
+ </span>
52534
+ </div>
52535
+ }
52536
+ }
52537
+
52538
+ @if (mobileCardAdditionalColumns.length) {
52539
+ @for (column of mobileCardAdditionalColumns; track column.key) {
52540
+ <div
52541
+ class="card-field card-field--meta"
52542
+ [attr.aria-label]="getMobileCardFieldAriaLabel(column, row)"
52543
+ >
52544
+ <span class="card-field__label">{{ column.label }}</span>
52545
+ <span class="card-field__value">
52546
+ @if (column.cellTemplate) {
52547
+ <ng-container
52548
+ *ngTemplateOutlet="
52549
+ column.cellTemplate;
52550
+ context: { row, column, value: getCellValue(row, column) }
52551
+ "
52552
+ ></ng-container>
52553
+ } @else {
52554
+ {{ getFormattedValue(row, column) }}
52555
+ }
52556
+ </span>
52557
+ </div>
52558
+ }
52559
+ }
52560
+ } @else {
52561
+ @for (column of visibleColumns; track column.key) {
52562
+ <div class="card-field">
52563
+ <span class="card-field__label">{{ column.label }}</span>
52564
+ <span class="card-field__value">
52565
+ @if (column.cellTemplate) {
52566
+ <ng-container
52567
+ *ngTemplateOutlet="
52568
+ column.cellTemplate;
52569
+ context: { row, column, value: getCellValue(row, column) }
52570
+ "
52571
+ ></ng-container>
52572
+ } @else {
52573
+ {{ getFormattedValue(row, column) }}
52574
+ }
52575
+ </span>
52576
+ </div>
52577
+ }
52040
52578
  }
52041
52579
  </div>
52042
52580
 
@@ -52125,7 +52663,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
52125
52663
  </div>
52126
52664
  }
52127
52665
  </div>
52128
- `, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-xl-wide: 1280px;--val-container-md-wide: 900px;--val-container-aside: 0px;--val-container-padding: 16px;--val-radius-xs: 10px;--val-radius-sm: 16px;--val-radius-md: 20px;--val-radius-lg: 28px;--val-radius-xl: 36px;--val-radius-full: 999px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--ion-color-warning: #ffde38;--ion-color-warning-rgb: 255, 222, 56;--ion-color-warning-contrast: #000000;--ion-color-warning-contrast-rgb: 0, 0, 0;--ion-color-warning-shade: #e0c331;--ion-color-warning-tint: #ffe14c;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-dark)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}:host{display:block}.data-table-container{--dt-elevation-none: none;--dt-elevation-low: 0 1px 3px rgba(0, 0, 0, .08), 0 1px 2px rgba(0, 0, 0, .04);--dt-elevation-medium: 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06);--dt-elevation-high: 0 10px 15px -3px rgba(0, 0, 0, .1), 0 4px 6px -2px rgba(0, 0, 0, .05);--dt-primary: var(--ion-color-primary, #4f46e5);--dt-primary-rgb: var(--ion-color-primary-rgb, 79, 70, 229);--dt-surface: var(--ion-background-color, #ffffff);--dt-surface-variant: #f8fafc;--dt-border: #e2e8f0;--dt-text-primary: #1e293b;--dt-text-secondary: #64748b;--dt-text-muted: #94a3b8;--dt-gradient-start: #6366f1;--dt-gradient-end: #8b5cf6;--dt-border-radius: 16px;--dt-cell-padding-x: 16px;--dt-cell-padding-y: 14px;--dt-header-padding-y: 12px}.data-table-container{position:relative;background:var(--dt-surface);border-radius:var(--dt-border-radius);box-shadow:var(--dt-elevation-medium);border:1px solid var(--dt-border);overflow:hidden}.data-table-container.elevation-none{box-shadow:var(--dt-elevation-none)}.data-table-container.elevation-low{box-shadow:var(--dt-elevation-low)}.data-table-container.elevation-high{box-shadow:var(--dt-elevation-high)}.data-table-container.header-gradient:before{content:\"\";position:absolute;top:0;left:0;right:0;height:4px;background:linear-gradient(90deg,var(--dt-gradient-start),var(--dt-gradient-end));border-radius:var(--dt-border-radius) var(--dt-border-radius) 0 0;z-index:2}.loading-overlay{position:absolute;inset:0;background:#ffffffe6;backdrop-filter:blur(2px);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;z-index:10}.loading-overlay ion-spinner{--color: var(--dt-primary);width:32px;height:32px}.loading-message{font-size:.875rem;font-weight:500;color:var(--dt-text-secondary)}.table-wrapper{overflow-x:auto;max-height:var(--max-height)}.table-wrapper.is-loading{opacity:.5;pointer-events:none}.table-wrapper::-webkit-scrollbar{height:8px;width:8px}.table-wrapper::-webkit-scrollbar-track{background:var(--dt-surface-variant);border-radius:4px}.table-wrapper::-webkit-scrollbar-thumb{background:var(--dt-border);border-radius:4px}.table-wrapper::-webkit-scrollbar-thumb:hover{background:var(--dt-text-muted)}table{width:100%;border-collapse:collapse;font-size:.875rem}th,td{padding:var(--dt-cell-padding-y) var(--dt-cell-padding-x);text-align:left;vertical-align:middle}thead{background:var(--dt-surface-variant)}thead th{font-weight:600;font-size:.8125rem;color:var(--dt-text-secondary);white-space:nowrap;position:relative;border-bottom:1px solid var(--dt-border);padding:var(--dt-header-padding-y) var(--dt-cell-padding-x);transition:all .2s ease}thead th.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}thead th.sortable:hover{background:#00000008;color:var(--dt-text-primary)}thead th.sorted{color:var(--dt-primary);background:rgba(var(--dt-primary-rgb),.04)}.header-content{display:flex;align-items:center;gap:8px}.sort-icons{display:flex;flex-direction:column;gap:0;opacity:.4;transition:opacity .2s ease}.sortable:hover .sort-icons{opacity:.7}.sorted .sort-icons{opacity:1}.sort-icons ion-icon{font-size:.75rem;color:var(--dt-text-muted);margin:-3px 0;transition:all .2s ease}.sort-icons ion-icon.active{color:var(--dt-primary);transform:scale(1.2)}tbody tr{border-bottom:1px solid var(--dt-border)}tbody tr:last-child{border-bottom:none}tbody tr.clickable{cursor:pointer}tbody tr.selected{background:rgba(var(--dt-primary-rgb),.06)}tbody td{color:var(--dt-text-primary);font-size:.875rem}.hoverable tbody tr:hover:not(.empty-row){background:var(--dt-surface-variant)}.hoverable tbody tr:hover:not(.empty-row).selected{background:rgba(var(--dt-primary-rgb),.08)}.align-left{text-align:left}.align-center{text-align:center}.align-right{text-align:right}.selection-cell{width:52px;min-width:52px;max-width:52px;text-align:center;padding:8px 12px;box-sizing:border-box}.selection-cell ion-checkbox{--size: 20px;--border-radius: 50%;--border-width: 2px;--border-color: var(--dt-border);--border-color-checked: var(--dt-primary);--background: transparent;--background-checked: var(--dt-primary);--checkmark-color: white;--checkmark-width: 2px;margin:0;display:block}.selection-cell ion-checkbox::part(container){border-radius:50%}.selection-cell input[type=radio]{width:20px;height:20px;cursor:pointer;accent-color:var(--dt-primary);margin:0;display:block}.checkbox-circular .selection-cell ion-checkbox{--border-radius: 50%}.checkbox-circular .selection-cell ion-checkbox::part(container){border-radius:50%}.row-number-cell{width:60px;text-align:center;color:var(--dt-text-muted);font-size:.75rem;font-weight:500}.actions-cell{text-align:center;white-space:nowrap}.sticky-start{position:sticky;left:0;background:inherit;z-index:1;box-shadow:2px 0 4px #0000000d}.sticky-end{position:sticky;right:0;background:inherit;z-index:1;box-shadow:-2px 0 4px #0000000d}.empty-row td{padding:64px 16px}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;color:var(--dt-text-secondary)}.empty-icon{font-size:3.5rem;margin-bottom:20px;opacity:.4;color:var(--dt-text-muted)}.empty-title{font-size:1.125rem;font-weight:600;margin:0 0 8px;color:var(--dt-text-primary)}.empty-description{font-size:.875rem;margin:0;max-width:320px;color:var(--dt-text-secondary);line-height:1.5}.pagination-container{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-top:1px solid var(--dt-border);background:var(--dt-surface);flex-wrap:wrap;gap:16px}.pagination-info{display:flex;align-items:center;gap:20px;font-size:.875rem;color:var(--dt-text-secondary)}.pagination-info span{font-weight:500}.page-size-select{--padding-start: 12px;--padding-end: 12px;font-size:.875rem;min-width:140px;--background: var(--dt-surface-variant);--border-radius: 8px}.pagination-controls{display:flex;align-items:center;gap:8px}.pagination-controls ion-button{--padding-start: 10px;--padding-end: 10px;--border-radius: 8px;--background: var(--dt-surface-variant);--background-hover: var(--dt-border);--color: var(--dt-text-secondary);--color-hover: var(--dt-text-primary);margin:0;height:36px;min-width:36px}.pagination-controls ion-button:disabled{opacity:.4}.pagination-controls ion-button ion-icon{font-size:1rem}.page-indicator{padding:0 16px;font-size:.875rem;color:var(--dt-text-primary);font-weight:600;background:var(--dt-surface-variant);border-radius:8px;height:36px;display:flex;align-items:center;min-width:80px;justify-content:center}.bordered th,.bordered td{border:1px solid var(--dt-border)}.striped tbody tr:nth-child(2n){background:var(--dt-surface-variant)}.striped tbody tr:nth-child(2n).selected{background:rgba(var(--dt-primary-rgb),.08)}.sticky-header .table-wrapper{overflow-y:auto}.sticky-header thead{position:sticky;top:0;z-index:5;box-shadow:0 1px 0 var(--dt-border)}.size-small{--dt-cell-padding-x: 12px;--dt-cell-padding-y: 10px;--dt-header-padding-y: 10px}.size-small th,.size-small td{font-size:.8125rem}.size-small thead th{font-size:.75rem}.size-small .selection-cell{width:44px;padding:6px 8px}.size-small .selection-cell ion-checkbox{--size: 18px}.size-small .row-number-cell{width:48px;font-size:.6875rem}.size-small .pagination-container{padding:12px 16px}.size-small .pagination-info,.size-small .page-indicator{font-size:.8125rem}.size-small .pagination-controls ion-button{height:32px;min-width:32px}.size-small .page-indicator{height:32px;min-width:70px}.size-large{--dt-cell-padding-x: 20px;--dt-cell-padding-y: 18px;--dt-header-padding-y: 16px}.size-large th,.size-large td{font-size:.9375rem}.size-large thead th{font-size:.875rem}.size-large .selection-cell{width:60px;padding:12px 16px}.size-large .selection-cell ion-checkbox{--size: 24px}.size-large .row-number-cell{width:72px;font-size:.875rem}.size-large .pagination-container{padding:20px 24px}.size-large .pagination-info,.size-large .page-indicator{font-size:.9375rem}.size-large .pagination-controls ion-button{height:40px;min-width:40px}.size-large .page-indicator{height:40px;min-width:90px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@media (max-width: 768px){.data-table-container{--dt-border-radius: 12px}.pagination-container{flex-direction:column;align-items:stretch;gap:12px}.pagination-info{justify-content:space-between}.pagination-controls{justify-content:center}}.table-toolbar{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:20px;border-bottom:1px solid var(--dt-border);background:var(--dt-surface);flex-wrap:wrap}.table-toolbar:empty{display:none}@media (max-width: 576px){.table-toolbar{flex-direction:column;align-items:stretch;padding:16px}}.status-badge{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:9999px;font-size:.75rem;font-weight:600;white-space:nowrap;letter-spacing:.025em}.status-badge--success{background:#dcfce7;color:#15803d}.status-badge--warning{background:#fef3c7;color:#b45309}.status-badge--danger{background:#fee2e2;color:#dc2626}.status-badge--primary{background:#e0e7ff;color:#4338ca}.status-badge--secondary{background:#f1f5f9;color:#475569}.status-badge--medium{background:#f1f5f9;color:#64748b}.status-badge--tertiary{background:#f3e8ff;color:#7c3aed}.status-badge--filled.status-badge--success{background:#22c55e;color:#fff}.status-badge--filled.status-badge--warning{background:#f59e0b;color:#fff}.status-badge--filled.status-badge--danger{background:#ef4444;color:#fff}.status-badge--filled.status-badge--primary{background:var(--dt-primary);color:#fff}.status-badge--outlined{background:transparent;border:1.5px solid currentColor}.status-badge--outlined.status-badge--success{color:#16a34a}.status-badge--outlined.status-badge--warning{color:#d97706}.status-badge--outlined.status-badge--danger{color:#dc2626}.status-badge--outlined.status-badge--primary{color:var(--dt-primary)}.action-buttons{display:flex;gap:6px;justify-content:center}.action-buttons ion-button{--padding-start: 8px;--padding-end: 8px;--border-radius: 8px;margin:0}.action-buttons ion-button ion-icon{font-size:1.125rem}.card-list{display:none;padding:12px;gap:12px}.data-card{background:var(--dt-surface);border:1px solid var(--dt-border);border-radius:12px;padding:16px;margin-bottom:12px;transition:all .2s ease}.data-card.selected{border-color:var(--dt-primary);background:rgba(var(--dt-primary-rgb),.04);box-shadow:0 0 0 1px var(--dt-primary)}.data-card.clickable{cursor:pointer}.data-card.clickable:hover{box-shadow:var(--dt-elevation-medium);transform:translateY(-2px)}.data-card.clickable:active{transform:translateY(0)}.card-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid var(--dt-border)}.card-selection{display:flex;align-items:center}.card-body{display:flex;flex-direction:column;gap:12px}.card-field{display:flex;justify-content:space-between;align-items:flex-start;gap:16px}.card-field__label{font-size:.75rem;font-weight:600;color:var(--dt-text-muted);flex-shrink:0}.card-field__value{font-size:.875rem;color:var(--dt-text-primary);text-align:right;word-break:break-word;font-weight:500}.card-actions{display:flex;justify-content:flex-end;margin-top:16px;padding-top:12px;border-top:1px solid var(--dt-border)}@media (max-width: 768px){.responsive-cards .table-wrapper{display:none}.responsive-cards .card-list{display:block}}:host-context(body.dark) .data-table-container,:host-context(.dark) .data-table-container,:host-context(.ion-palette-dark) .data-table-container,:host-context(html.ion-palette-dark) .data-table-container,:host-context([data-theme=dark]) .data-table-container{--dt-surface: #1e293b;--dt-surface-variant: #334155;--dt-border: #475569;--dt-text-primary: #f1f5f9;--dt-text-secondary: #94a3b8;--dt-text-muted: #64748b}:host-context(body.dark) .loading-overlay,:host-context(.dark) .loading-overlay,:host-context(.ion-palette-dark) .loading-overlay,:host-context(html.ion-palette-dark) .loading-overlay,:host-context([data-theme=dark]) .loading-overlay{background:#1e293be6}:host-context(body.dark) .status-badge--success,:host-context(.dark) .status-badge--success,:host-context(.ion-palette-dark) .status-badge--success,:host-context(html.ion-palette-dark) .status-badge--success,:host-context([data-theme=dark]) .status-badge--success{background:#22c55e33;color:#4ade80}:host-context(body.dark) .status-badge--warning,:host-context(.dark) .status-badge--warning,:host-context(.ion-palette-dark) .status-badge--warning,:host-context(html.ion-palette-dark) .status-badge--warning,:host-context([data-theme=dark]) .status-badge--warning{background:#f59e0b33;color:#fbbf24}:host-context(body.dark) .status-badge--danger,:host-context(.dark) .status-badge--danger,:host-context(.ion-palette-dark) .status-badge--danger,:host-context(html.ion-palette-dark) .status-badge--danger,:host-context([data-theme=dark]) .status-badge--danger{background:#ef444433;color:#f87171}:host-context(body.dark) .status-badge--primary,:host-context(.dark) .status-badge--primary,:host-context(.ion-palette-dark) .status-badge--primary,:host-context(html.ion-palette-dark) .status-badge--primary,:host-context([data-theme=dark]) .status-badge--primary{background:#6366f133;color:#a5b4fc}\n"] }]
52666
+ `, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-xl-wide: 1280px;--val-container-md-wide: 900px;--val-container-aside: 0px;--val-container-padding: 16px;--val-radius-xs: 10px;--val-radius-sm: 16px;--val-radius-md: 20px;--val-radius-lg: 28px;--val-radius-xl: 36px;--val-radius-full: 999px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--ion-color-warning: #ffde38;--ion-color-warning-rgb: 255, 222, 56;--ion-color-warning-contrast: #000000;--ion-color-warning-contrast-rgb: 0, 0, 0;--ion-color-warning-shade: #e0c331;--ion-color-warning-tint: #ffe14c;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-dark)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}:host{display:block}.data-table-container{--dt-elevation-none: none;--dt-elevation-low: 0 1px 3px rgba(0, 0, 0, .08), 0 1px 2px rgba(0, 0, 0, .04);--dt-elevation-medium: 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -1px rgba(0, 0, 0, .06);--dt-elevation-high: 0 10px 15px -3px rgba(0, 0, 0, .1), 0 4px 6px -2px rgba(0, 0, 0, .05);--dt-primary: var(--ion-color-primary, #4f46e5);--dt-primary-rgb: var(--ion-color-primary-rgb, 79, 70, 229);--dt-surface: var(--ion-background-color, #ffffff);--dt-surface-variant: #f8fafc;--dt-border: #e2e8f0;--dt-text-primary: #1e293b;--dt-text-secondary: #64748b;--dt-text-muted: #94a3b8;--dt-gradient-start: #6366f1;--dt-gradient-end: #8b5cf6;--dt-border-radius: 16px;--dt-cell-padding-x: 16px;--dt-cell-padding-y: 14px;--dt-header-padding-y: 12px}.data-table-container{position:relative;background:var(--dt-surface);border-radius:var(--dt-border-radius);box-shadow:var(--dt-elevation-medium);border:1px solid var(--dt-border);overflow:hidden}.data-table-container.elevation-none{box-shadow:var(--dt-elevation-none)}.data-table-container.elevation-low{box-shadow:var(--dt-elevation-low)}.data-table-container.elevation-high{box-shadow:var(--dt-elevation-high)}.data-table-container.header-gradient:before{content:\"\";position:absolute;top:0;left:0;right:0;height:4px;background:linear-gradient(90deg,var(--dt-gradient-start),var(--dt-gradient-end));border-radius:var(--dt-border-radius) var(--dt-border-radius) 0 0;z-index:2}.loading-overlay{position:absolute;inset:0;background:#ffffffe6;backdrop-filter:blur(2px);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;z-index:10}.loading-overlay ion-spinner{--color: var(--dt-primary);width:32px;height:32px}.loading-message{font-size:.875rem;font-weight:500;color:var(--dt-text-secondary)}.table-wrapper{overflow-x:auto;max-height:var(--max-height)}.table-wrapper.is-loading{opacity:.5;pointer-events:none}.table-wrapper::-webkit-scrollbar{height:8px;width:8px}.table-wrapper::-webkit-scrollbar-track{background:var(--dt-surface-variant);border-radius:4px}.table-wrapper::-webkit-scrollbar-thumb{background:var(--dt-border);border-radius:4px}.table-wrapper::-webkit-scrollbar-thumb:hover{background:var(--dt-text-muted)}table{width:100%;border-collapse:collapse;font-size:.875rem}th,td{padding:var(--dt-cell-padding-y) var(--dt-cell-padding-x);text-align:left;vertical-align:middle}thead{background:var(--dt-surface-variant)}thead th{font-weight:600;font-size:.8125rem;color:var(--dt-text-secondary);white-space:nowrap;position:relative;border-bottom:1px solid var(--dt-border);padding:var(--dt-header-padding-y) var(--dt-cell-padding-x);transition:all .2s ease}thead th.sortable{cursor:pointer;-webkit-user-select:none;user-select:none}thead th.sortable:hover{background:#00000008;color:var(--dt-text-primary)}thead th.sorted{color:var(--dt-primary);background:rgba(var(--dt-primary-rgb),.04)}.header-content{display:flex;align-items:center;gap:8px}.sort-icons{display:flex;flex-direction:column;gap:0;opacity:.4;transition:opacity .2s ease}.sortable:hover .sort-icons{opacity:.7}.sorted .sort-icons{opacity:1}.sort-icons ion-icon{font-size:.75rem;color:var(--dt-text-muted);margin:-3px 0;transition:all .2s ease}.sort-icons ion-icon.active{color:var(--dt-primary);transform:scale(1.2)}tbody tr{border-bottom:1px solid var(--dt-border)}tbody tr:last-child{border-bottom:none}tbody tr.clickable{cursor:pointer}tbody tr.selected{background:rgba(var(--dt-primary-rgb),.06)}tbody td{color:var(--dt-text-primary);font-size:.875rem}.hoverable tbody tr:hover:not(.empty-row){background:var(--dt-surface-variant)}.hoverable tbody tr:hover:not(.empty-row).selected{background:rgba(var(--dt-primary-rgb),.08)}.align-left{text-align:left}.align-center{text-align:center}.align-right{text-align:right}.selection-cell{width:52px;min-width:52px;max-width:52px;text-align:center;padding:8px 12px;box-sizing:border-box}.selection-cell ion-checkbox{--size: 20px;--border-radius: 50%;--border-width: 2px;--border-color: var(--dt-border);--border-color-checked: var(--dt-primary);--background: transparent;--background-checked: var(--dt-primary);--checkmark-color: white;--checkmark-width: 2px;margin:0;display:block}.selection-cell ion-checkbox::part(container){border-radius:50%}.selection-cell input[type=radio]{width:20px;height:20px;cursor:pointer;accent-color:var(--dt-primary);margin:0;display:block}.checkbox-circular .selection-cell ion-checkbox{--border-radius: 50%}.checkbox-circular .selection-cell ion-checkbox::part(container){border-radius:50%}.row-number-cell{width:60px;text-align:center;color:var(--dt-text-muted);font-size:.75rem;font-weight:500}.actions-cell{text-align:center;white-space:nowrap}.sticky-start{position:sticky;left:0;background:inherit;z-index:1;box-shadow:2px 0 4px #0000000d}.sticky-end{position:sticky;right:0;background:inherit;z-index:1;box-shadow:-2px 0 4px #0000000d}.empty-row td{padding:64px 16px}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;color:var(--dt-text-secondary)}.empty-icon{font-size:3.5rem;margin-bottom:20px;opacity:.4;color:var(--dt-text-muted)}.empty-title{font-size:1.125rem;font-weight:600;margin:0 0 8px;color:var(--dt-text-primary)}.empty-description{font-size:.875rem;margin:0;max-width:320px;color:var(--dt-text-secondary);line-height:1.5}.pagination-container{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-top:1px solid var(--dt-border);background:var(--dt-surface);flex-wrap:wrap;gap:16px}.pagination-info{display:flex;align-items:center;gap:20px;font-size:.875rem;color:var(--dt-text-secondary)}.pagination-info span{font-weight:500}.page-size-select{--padding-start: 12px;--padding-end: 12px;font-size:.875rem;min-width:140px;--background: var(--dt-surface-variant);--border-radius: 8px}.pagination-controls{display:flex;align-items:center;gap:8px}.pagination-controls ion-button{--padding-start: 10px;--padding-end: 10px;--border-radius: 8px;--background: var(--dt-surface-variant);--background-hover: var(--dt-border);--color: var(--dt-text-secondary);--color-hover: var(--dt-text-primary);margin:0;height:36px;min-width:36px}.pagination-controls ion-button:disabled{opacity:.4}.pagination-controls ion-button ion-icon{font-size:1rem}.page-indicator{padding:0 16px;font-size:.875rem;color:var(--dt-text-primary);font-weight:600;background:var(--dt-surface-variant);border-radius:8px;height:36px;display:flex;align-items:center;min-width:80px;justify-content:center}.bordered th,.bordered td{border:1px solid var(--dt-border)}.striped tbody tr:nth-child(2n){background:var(--dt-surface-variant)}.striped tbody tr:nth-child(2n).selected{background:rgba(var(--dt-primary-rgb),.08)}.sticky-header .table-wrapper{overflow-y:auto}.sticky-header thead{position:sticky;top:0;z-index:5;box-shadow:0 1px 0 var(--dt-border)}.size-small{--dt-cell-padding-x: 12px;--dt-cell-padding-y: 10px;--dt-header-padding-y: 10px}.size-small th,.size-small td{font-size:.8125rem}.size-small thead th{font-size:.75rem}.size-small .selection-cell{width:44px;padding:6px 8px}.size-small .selection-cell ion-checkbox{--size: 18px}.size-small .row-number-cell{width:48px;font-size:.6875rem}.size-small .pagination-container{padding:12px 16px}.size-small .pagination-info,.size-small .page-indicator{font-size:.8125rem}.size-small .pagination-controls ion-button{height:32px;min-width:32px}.size-small .page-indicator{height:32px;min-width:70px}.size-large{--dt-cell-padding-x: 20px;--dt-cell-padding-y: 18px;--dt-header-padding-y: 16px}.size-large th,.size-large td{font-size:.9375rem}.size-large thead th{font-size:.875rem}.size-large .selection-cell{width:60px;padding:12px 16px}.size-large .selection-cell ion-checkbox{--size: 24px}.size-large .row-number-cell{width:72px;font-size:.875rem}.size-large .pagination-container{padding:20px 24px}.size-large .pagination-info,.size-large .page-indicator{font-size:.9375rem}.size-large .pagination-controls ion-button{height:40px;min-width:40px}.size-large .page-indicator{height:40px;min-width:90px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@media (max-width: 768px){.data-table-container{--dt-border-radius: 12px}.pagination-container{flex-direction:column;align-items:stretch;gap:12px}.pagination-info{justify-content:space-between}.pagination-controls{justify-content:center}}.table-toolbar{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:20px;border-bottom:1px solid var(--dt-border);background:var(--dt-surface);flex-wrap:wrap}.table-toolbar:empty{display:none}@media (max-width: 576px){.table-toolbar{flex-direction:column;align-items:stretch;padding:16px}}.status-badge{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:9999px;font-size:.75rem;font-weight:600;white-space:nowrap;letter-spacing:.025em}.status-badge--success{background:#dcfce7;color:#15803d}.status-badge--warning{background:#fef3c7;color:#b45309}.status-badge--danger{background:#fee2e2;color:#dc2626}.status-badge--primary{background:#e0e7ff;color:#4338ca}.status-badge--secondary{background:#f1f5f9;color:#475569}.status-badge--medium{background:#f1f5f9;color:#64748b}.status-badge--tertiary{background:#f3e8ff;color:#7c3aed}.status-badge--filled.status-badge--success{background:#22c55e;color:#fff}.status-badge--filled.status-badge--warning{background:#f59e0b;color:#fff}.status-badge--filled.status-badge--danger{background:#ef4444;color:#fff}.status-badge--filled.status-badge--primary{background:var(--dt-primary);color:#fff}.status-badge--outlined{background:transparent;border:1.5px solid currentColor}.status-badge--outlined.status-badge--success{color:#16a34a}.status-badge--outlined.status-badge--warning{color:#d97706}.status-badge--outlined.status-badge--danger{color:#dc2626}.status-badge--outlined.status-badge--primary{color:var(--dt-primary)}.action-buttons{display:flex;gap:6px;justify-content:center}.action-buttons ion-button{--padding-start: 8px;--padding-end: 8px;--border-radius: 8px;margin:0}.action-buttons ion-button ion-icon{font-size:1.125rem}.card-list{display:none;padding:12px;gap:12px}.data-card{background:var(--dt-surface);border:1px solid var(--dt-border);border-radius:12px;padding:16px;margin-bottom:12px;transition:all .2s ease}.data-card.selected{border-color:var(--dt-primary);background:rgba(var(--dt-primary-rgb),.04);box-shadow:0 0 0 1px var(--dt-primary)}.data-card.clickable{cursor:pointer}.data-card.clickable:hover{box-shadow:var(--dt-elevation-medium);transform:translateY(-2px)}.data-card.clickable:active{transform:translateY(0)}.card-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid var(--dt-border)}.card-selection{display:flex;align-items:center}.card-selection ion-checkbox,.card-selection input[type=radio]{min-width:44px;min-height:44px;display:inline-flex;align-items:center;justify-content:center}.card-body{display:flex;flex-direction:column;gap:12px}.card-field{display:flex;justify-content:space-between;align-items:flex-start;gap:16px}.card-field__label{font-size:.75rem;font-weight:600;color:var(--dt-text-muted);flex-shrink:0}.card-field__value{font-size:.875rem;color:var(--dt-text-primary);text-align:right;word-break:break-word;font-weight:500}.card-field--primary .card-field__label{color:var(--dt-text-primary)}.card-field--primary .card-field__value{font-size:1rem;font-weight:600}.card-field--secondary .card-field__label,.card-field--status .card-field__label{color:var(--dt-text-muted)}.card-field--status .card-field__value{font-size:.8125rem;font-weight:600}.card-actions{display:flex;justify-content:flex-end;margin-top:16px;padding-top:12px;border-top:1px solid var(--dt-border)}@media (max-width: 768px){.responsive-cards .table-wrapper{display:none}.responsive-cards .card-list{display:block}}:host-context(body.dark) .data-table-container,:host-context(.dark) .data-table-container,:host-context(.ion-palette-dark) .data-table-container,:host-context(html.ion-palette-dark) .data-table-container,:host-context([data-theme=dark]) .data-table-container{--dt-surface: #1e293b;--dt-surface-variant: #334155;--dt-border: #475569;--dt-text-primary: #f1f5f9;--dt-text-secondary: #94a3b8;--dt-text-muted: #64748b}:host-context(body.dark) .loading-overlay,:host-context(.dark) .loading-overlay,:host-context(.ion-palette-dark) .loading-overlay,:host-context(html.ion-palette-dark) .loading-overlay,:host-context([data-theme=dark]) .loading-overlay{background:#1e293be6}:host-context(body.dark) .status-badge--success,:host-context(.dark) .status-badge--success,:host-context(.ion-palette-dark) .status-badge--success,:host-context(html.ion-palette-dark) .status-badge--success,:host-context([data-theme=dark]) .status-badge--success{background:#22c55e33;color:#4ade80}:host-context(body.dark) .status-badge--warning,:host-context(.dark) .status-badge--warning,:host-context(.ion-palette-dark) .status-badge--warning,:host-context(html.ion-palette-dark) .status-badge--warning,:host-context([data-theme=dark]) .status-badge--warning{background:#f59e0b33;color:#fbbf24}:host-context(body.dark) .status-badge--danger,:host-context(.dark) .status-badge--danger,:host-context(.ion-palette-dark) .status-badge--danger,:host-context(html.ion-palette-dark) .status-badge--danger,:host-context([data-theme=dark]) .status-badge--danger{background:#ef444433;color:#f87171}:host-context(body.dark) .status-badge--primary,:host-context(.dark) .status-badge--primary,:host-context(.ion-palette-dark) .status-badge--primary,:host-context(html.ion-palette-dark) .status-badge--primary,:host-context([data-theme=dark]) .status-badge--primary{background:#6366f133;color:#a5b4fc}\n"] }]
52129
52667
  }], propDecorators: { props: [{
52130
52668
  type: Input
52131
52669
  }], rowClick: [{