valtech-components 4.0.1012 → 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 (32) 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/request-review-panel/request-review-panel.component.mjs +12 -4
  8. package/esm2022/lib/components/organisms/request-review-panel/types.mjs +1 -1
  9. package/esm2022/lib/components/organisms/survey-builder/survey-builder.component.mjs +386 -155
  10. package/esm2022/lib/components/organisms/survey-builder/survey-builder.i18n.mjs +15 -1
  11. package/esm2022/lib/components/organisms/survey-builder/types.mjs +1 -1
  12. package/esm2022/lib/components/types.mjs +1 -1
  13. package/esm2022/lib/services/forms/form-schema-builder.service.mjs +3 -1
  14. package/esm2022/lib/services/forms/types.mjs +1 -1
  15. package/esm2022/lib/services/requests/types.mjs +1 -1
  16. package/esm2022/lib/version.mjs +2 -2
  17. package/fesm2022/valtech-components.mjs +739 -193
  18. package/fesm2022/valtech-components.mjs.map +1 -1
  19. package/lib/components/organisms/data-table/data-table.component.d.ts +10 -1
  20. package/lib/components/organisms/data-table/types.d.ts +14 -0
  21. package/lib/components/organisms/field-schema-editor/field-schema-editor.component.d.ts +1 -0
  22. package/lib/components/organisms/field-schema-editor/types.d.ts +2 -0
  23. package/lib/components/organisms/request-review-panel/request-review-panel.component.d.ts +6 -2
  24. package/lib/components/organisms/request-review-panel/types.d.ts +15 -0
  25. package/lib/components/organisms/survey-builder/survey-builder.component.d.ts +28 -5
  26. package/lib/components/organisms/survey-builder/types.d.ts +1 -0
  27. package/lib/components/types.d.ts +2 -0
  28. package/lib/services/forms/types.d.ts +2 -0
  29. package/lib/services/requests/types.d.ts +6 -0
  30. package/lib/version.d.ts +1 -1
  31. package/package.json +1 -1
  32. 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.1012';
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,
@@ -40974,7 +40985,9 @@ const NAMESPACE$2 = 'RequestReviewPanel';
40974
40985
  class RequestReviewPanelComponent {
40975
40986
  constructor() {
40976
40987
  this.i18n = inject(I18nService);
40977
- this.props = input.required();
40988
+ this.props = input({ items: [] });
40989
+ this.requestId = '';
40990
+ this.loaded = new EventEmitter();
40978
40991
  this.decision = new EventEmitter();
40979
40992
  /** ID del ítem cuyo formulario de rechazo está abierto. */
40980
40993
  this._rejectingId = signal('');
@@ -41041,7 +41054,7 @@ class RequestReviewPanelComponent {
41041
41054
  this.decision.emit({ itemId: item.id, approved: true });
41042
41055
  }
41043
41056
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestReviewPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
41044
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RequestReviewPanelComponent, isStandalone: true, selector: "val-request-review-panel", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: true, transformFunction: null }, itemBody: { classPropertyName: "itemBody", publicName: "itemBody", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { decision: "decision" }, ngImport: i0, template: `
41057
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RequestReviewPanelComponent, isStandalone: true, selector: "val-request-review-panel", inputs: { props: { classPropertyName: "props", publicName: "props", isSignal: true, isRequired: false, transformFunction: null }, requestId: { classPropertyName: "requestId", publicName: "requestId", isSignal: false, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: false, isRequired: false, transformFunction: null }, itemBody: { classPropertyName: "itemBody", publicName: "itemBody", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { loaded: "loaded", decision: "decision" }, ngImport: i0, template: `
41045
41058
  <div class="rrp">
41046
41059
  @if (cfg().loading) {
41047
41060
  <div class="rrp__skel" aria-hidden="true">
@@ -41280,7 +41293,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
41280
41293
  }
41281
41294
  </div>
41282
41295
  `, styles: [":host{display:block}.rrp{display:flex;flex-direction:column;gap:12px}.rrp__skel{display:flex;flex-direction:column;gap:10px}.rrp__count{margin:0;font-size:.8125rem;font-weight:700;color:var(--ion-color-medium, #92949c);font-variant-numeric:tabular-nums}.rrp__queue{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:12px}.rrp__item{display:flex;flex-direction:column;gap:8px;padding:14px 16px;border-radius:14px;background:var(--ion-card-background, var(--ion-background-color, #fff));border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1))}.rrp__title{margin:0;font-size:1rem;font-weight:700;color:var(--ion-text-color, #000)}.rrp__meta{margin:0;font-size:.8125rem;color:var(--ion-color-medium, #92949c)}.rrp__body{display:flex;flex-direction:column;gap:8px}.rrp__reject{display:flex;flex-direction:column;gap:6px}.rrp__reject-label{font-size:.8125rem;font-weight:600;color:var(--ion-text-color, #000)}.rrp__reject-input{width:100%;box-sizing:border-box;padding:10px 12px;border-radius:10px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-background-color, #fff);color:var(--ion-text-color, #000);font-family:inherit;font-size:.875rem;resize:vertical}.rrp__reject-input:focus{outline:none;border-color:var(--ion-color-primary)}.rrp__reject-hint{margin:0;font-size:.75rem;color:var(--ion-color-medium, #92949c)}.rrp__actions{display:flex;flex-direction:column;gap:8px;margin-top:4px}@media (min-width: 576px){.rrp__actions{flex-direction:row;justify-content:flex-end;align-items:center;flex-wrap:wrap}}\n"] }]
41283
- }], ctorParameters: () => [], propDecorators: { itemBody: [{
41296
+ }], ctorParameters: () => [], propDecorators: { requestId: [{
41297
+ type: Input
41298
+ }], config: [{
41299
+ type: Input
41300
+ }], loaded: [{
41301
+ type: Output
41302
+ }], itemBody: [{
41284
41303
  type: Input
41285
41304
  }], decision: [{
41286
41305
  type: Output
@@ -41334,6 +41353,9 @@ const SURVEY_QUESTION_TYPES = [
41334
41353
 
41335
41354
  const SURVEY_BUILDER_I18N = {
41336
41355
  es: {
41356
+ surveyNameLabel: 'Nombre interno',
41357
+ surveyNamePlaceholder: 'Ej: encuesta-ventas-entrada',
41358
+ noSurveyName: 'Ponle un nombre interno a la encuesta',
41337
41359
  titleLabel: 'Título',
41338
41360
  titlePlaceholder: 'Ej: ¿Qué te pareció el evento?',
41339
41361
  subtitleLabel: 'Subtítulo',
@@ -41357,8 +41379,10 @@ const SURVEY_BUILDER_I18N = {
41357
41379
  successImageLabel: 'Imagen de cierre',
41358
41380
  successImagePlaceholder: 'URL de la imagen que se muestra al terminar',
41359
41381
  questionsLabel: 'Preguntas',
41382
+ sectionQuestionsLabel: 'Sin sección',
41360
41383
  questionLabelPlaceholder: 'Escribe la pregunta',
41361
41384
  addQuestion: 'Agregar pregunta',
41385
+ addQuestionToSection: 'Agregar aquí',
41362
41386
  removeQuestion: 'Quitar pregunta',
41363
41387
  editQuestion: 'Editar pregunta',
41364
41388
  duplicateQuestion: 'Duplicar pregunta',
@@ -41376,6 +41400,8 @@ const SURVEY_BUILDER_I18N = {
41376
41400
  loadError: 'No pudimos cargar la encuesta para editar.',
41377
41401
  stepStart: 'Inicio',
41378
41402
  stepQuestions: 'Preguntas',
41403
+ sectionSubtitleLabel: 'Subtítulo',
41404
+ sectionSubtitlePlaceholder: 'Escribe un subtítulo para esta sección',
41379
41405
  stepClose: 'Cierre',
41380
41406
  stepReview: 'Revisar',
41381
41407
  wizardStepsLabel: 'Pasos para crear la encuesta',
@@ -41393,6 +41419,9 @@ const SURVEY_BUILDER_I18N = {
41393
41419
  reviewDefaultClose: 'Cierre por defecto',
41394
41420
  },
41395
41421
  en: {
41422
+ surveyNameLabel: 'Internal name',
41423
+ surveyNamePlaceholder: 'E.g: event-feedback',
41424
+ noSurveyName: 'Give the survey an internal name',
41396
41425
  titleLabel: 'Title',
41397
41426
  titlePlaceholder: 'E.g: How was the event?',
41398
41427
  subtitleLabel: 'Subtitle',
@@ -41416,8 +41445,10 @@ const SURVEY_BUILDER_I18N = {
41416
41445
  successImageLabel: 'Closing image',
41417
41446
  successImagePlaceholder: 'Image URL shown after submit',
41418
41447
  questionsLabel: 'Questions',
41448
+ sectionQuestionsLabel: 'No section',
41419
41449
  questionLabelPlaceholder: 'Write the question',
41420
41450
  addQuestion: 'Add question',
41451
+ addQuestionToSection: 'Add here',
41421
41452
  removeQuestion: 'Remove question',
41422
41453
  editQuestion: 'Edit question',
41423
41454
  duplicateQuestion: 'Duplicate question',
@@ -41435,6 +41466,8 @@ const SURVEY_BUILDER_I18N = {
41435
41466
  loadError: "We couldn't load the survey to edit.",
41436
41467
  stepStart: 'Start',
41437
41468
  stepQuestions: 'Questions',
41469
+ sectionSubtitleLabel: 'Subtitle',
41470
+ sectionSubtitlePlaceholder: 'Add a subtitle for this section',
41438
41471
  stepClose: 'Close',
41439
41472
  stepReview: 'Review',
41440
41473
  wizardStepsLabel: 'Survey builder steps',
@@ -41598,6 +41631,44 @@ let rowUid = 0;
41598
41631
  * `val-survey-response` sabe renderizar, no a lo que el editor sabe editar.
41599
41632
  */
41600
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
+ }
41601
41672
  constructor() {
41602
41673
  this.props = {};
41603
41674
  this.saved = new EventEmitter();
@@ -41613,6 +41684,7 @@ class SurveyBuilderComponent {
41613
41684
  this.formBuilder = inject(RequestFormBuilderService);
41614
41685
  this.errors = inject(ValtechErrorService);
41615
41686
  this.modals = inject(ModalService);
41687
+ this.surveyNameControl = new FormControl('', { nonNullable: true });
41616
41688
  this.titleControl = new FormControl('', { nonNullable: true });
41617
41689
  this.subtitleControl = new FormControl('', { nonNullable: true });
41618
41690
  this.headerImageControl = new FormControl('', { nonNullable: true });
@@ -41625,12 +41697,20 @@ class SurveyBuilderComponent {
41625
41697
  this.validationError = signal('');
41626
41698
  this.saving = signal(false);
41627
41699
  this.uploadingImage = signal('');
41628
- this.wizardSteps = [
41629
- { id: 'start', labelKey: 'stepStart' },
41630
- { id: 'questions', labelKey: 'stepQuestions' },
41631
- { id: 'close', labelKey: 'stepClose' },
41632
- { id: 'review', labelKey: 'stepReview' },
41633
- ];
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
+ });
41634
41714
  this.allowedImageTypes = ['image/jpeg', 'image/png', 'image/webp', 'image/gif'];
41635
41715
  this.maxImageBytes = 10 * 1024 * 1024;
41636
41716
  if (!this.i18n.hasNamespace(NAMESPACE$1)) {
@@ -41649,14 +41729,15 @@ class SurveyBuilderComponent {
41649
41729
  async ngOnInit() {
41650
41730
  // Sembrado directo: la app ya tenía la encuesta, no hace falta leerla.
41651
41731
  if (this.props.initial) {
41652
- 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);
41653
41733
  return;
41654
41734
  }
41655
41735
  if (!this.props.typeId)
41656
41736
  return;
41657
41737
  try {
41658
41738
  const cfg = await firstValueFrom(this.requests.getRequestType(this.props.typeId));
41659
- 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);
41660
41741
  }
41661
41742
  catch (err) {
41662
41743
  this.errors.handle(err, {
@@ -41700,7 +41781,7 @@ class SurveyBuilderComponent {
41700
41781
  nextStep() {
41701
41782
  if (!this.validateWizardStep(this.wizardStep()))
41702
41783
  return;
41703
- 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));
41704
41785
  }
41705
41786
  previousStep() {
41706
41787
  this.validationError.set('');
@@ -41743,6 +41824,18 @@ class SurveyBuilderComponent {
41743
41824
  state: this.saving() ? ComponentStates.WORKING : ComponentStates.ENABLED,
41744
41825
  };
41745
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
+ }
41746
41839
  interpolate(template, values) {
41747
41840
  return Object.entries(values).reduce((text, [key, value]) => text.replaceAll(`{${key}}`, String(value)), template);
41748
41841
  }
@@ -41763,7 +41856,16 @@ class SurveyBuilderComponent {
41763
41856
  icon: { name: icon, slot: 'icon-only' },
41764
41857
  };
41765
41858
  }
41766
- 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);
41767
41869
  const row = {
41768
41870
  id: `row-${rowUid++}`,
41769
41871
  name: '',
@@ -41772,12 +41874,45 @@ class SurveyBuilderComponent {
41772
41874
  hintText: '',
41773
41875
  type: this.questionTypes()[0],
41774
41876
  required: true,
41877
+ sectionId: normalizedSectionId,
41878
+ sectionLabel: targetGroup?.label || undefined,
41775
41879
  };
41776
- 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
+ });
41777
41886
  // Una pregunta recién agregada está vacía: abrirla es el único paso
41778
41887
  // siguiente posible, y dejarla cerrada la haría ver como una fila rota.
41779
41888
  this.editingId.set(row.id);
41780
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
+ }
41781
41916
  toggleEdit(row) {
41782
41917
  this.editingId.update(current => (current === row.id ? '' : row.id));
41783
41918
  }
@@ -41820,20 +41955,28 @@ class SurveyBuilderComponent {
41820
41955
  * paso obligatorio que no se veía por ningún lado.
41821
41956
  */
41822
41957
  draftQuestion(field) {
41823
- 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)));
41824
41959
  if (this.validationError())
41825
41960
  this.validationError.set('');
41826
41961
  }
41827
41962
  applyQuestion(field) {
41828
41963
  this.questions.update(rows => rows.map(r => r.id === field.id
41829
41964
  ? {
41830
- ...field,
41965
+ ...this.withResolvedSection(field),
41831
41966
  name: this.formBuilder.uniqueFieldName(field.name || field.label, rows.filter(o => o.id !== r.id)),
41832
41967
  }
41833
41968
  : r));
41834
41969
  this.editingId.set('');
41835
41970
  this.validationError.set('');
41836
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
+ }
41837
41980
  async onPresentationFileSelected(slot, event) {
41838
41981
  const input = event.target;
41839
41982
  const file = input.files?.[0];
@@ -41893,9 +42036,10 @@ class SurveyBuilderComponent {
41893
42036
  label: row.label.trim(),
41894
42037
  type: row.type,
41895
42038
  required: row.required,
41896
- sectionId: row.sectionLabel ? this.formBuilder.toToken(row.sectionLabel) : undefined,
42039
+ sectionId: row.sectionId,
41897
42040
  sectionLabel: row.sectionLabel,
41898
- sectionOrder: this.sectionOrderFor(row.sectionLabel, rows),
42041
+ sectionSubtitle: this.sectionSubtitles()[this.normalizeSectionId(row.sectionId)] ?? '',
42042
+ sectionOrder: this.sectionOrderFor(row.sectionId, rows),
41899
42043
  placeholderText: row.placeholderText,
41900
42044
  hintText: row.hintText,
41901
42045
  options: row.options,
@@ -41905,7 +42049,13 @@ class SurveyBuilderComponent {
41905
42049
  const presentation = this.presentationPayload();
41906
42050
  // La app guarda: acá solo se valida y se entrega lo escrito.
41907
42051
  if (this.props.persist === false) {
41908
- 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
+ });
41909
42059
  return;
41910
42060
  }
41911
42061
  this.saving.set(true);
@@ -41916,6 +42066,7 @@ class SurveyBuilderComponent {
41916
42066
  // endpoint (`persist: false`) y arma el id con la entidad adentro.
41917
42067
  const typeId = this.props.typeId ?? `${this.props.typePrefix ?? DEFAULT_TYPE_PREFIX}:${this.formBuilder.toToken(title)}`;
41918
42068
  const payload = {
42069
+ name: this.surveyNameControl.value.trim() || title,
41919
42070
  label: title,
41920
42071
  subtitle,
41921
42072
  presentation,
@@ -41943,14 +42094,23 @@ class SurveyBuilderComponent {
41943
42094
  });
41944
42095
  }
41945
42096
  }
41946
- hydrate(label, subtitle, questions, presentation) {
42097
+ hydrate(name, label, subtitle, questions, presentation) {
42098
+ this.surveyNameControl.setValue(name ?? '');
41947
42099
  this.titleControl.setValue(label ?? '');
41948
42100
  this.subtitleControl.setValue(subtitle ?? '');
41949
42101
  this.headerImageControl.setValue(presentation?.headerImageUrl ?? '');
41950
42102
  this.successTitleControl.setValue(presentation?.successTitle || this.defaultSuccessTitle());
41951
42103
  this.successMessageControl.setValue(presentation?.successMessage || this.defaultSuccessMessage());
41952
42104
  this.successImageControl.setValue(presentation?.successImageUrl ?? '');
41953
- 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);
41954
42114
  }
41955
42115
  presentationPayload() {
41956
42116
  const presentation = {
@@ -41970,6 +42130,13 @@ class SurveyBuilderComponent {
41970
42130
  validateWizardStep(step) {
41971
42131
  this.validationError.set('');
41972
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
+ }
41973
42140
  if (!this.titleControl.value.trim()) {
41974
42141
  this.titleControl.markAsTouched();
41975
42142
  this.validationError.set(this.t('noTitle'));
@@ -42005,7 +42172,9 @@ class SurveyBuilderComponent {
42005
42172
  hintText: f.hintText ?? '',
42006
42173
  type: f.type,
42007
42174
  required: !!f.required,
42175
+ sectionId: f.sectionId,
42008
42176
  sectionLabel: f.sectionLabel ?? '',
42177
+ sectionSubtitle: f.sectionSubtitle ?? '',
42009
42178
  sectionOrder: f.sectionOrder,
42010
42179
  options: f.options,
42011
42180
  };
@@ -42029,7 +42198,7 @@ class SurveyBuilderComponent {
42029
42198
  };
42030
42199
  }
42031
42200
  async openPreview() {
42032
- await this.modals.open({
42201
+ await this.modals.openAdaptive({
42033
42202
  component: SurveyPreviewModalComponent,
42034
42203
  componentProps: {
42035
42204
  modalTitle: this.t('previewTitle'),
@@ -42045,26 +42214,25 @@ class SurveyBuilderComponent {
42045
42214
  order: index,
42046
42215
  name: question.name || this.formBuilder.toToken(question.label),
42047
42216
  typeLabel: this.typeLabel(question.type),
42048
- sectionId: question.sectionLabel ? this.formBuilder.toToken(question.sectionLabel) : undefined,
42049
- 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()),
42050
42220
  })),
42051
42221
  },
42052
- size: 'medium',
42053
- });
42222
+ }, 'wide');
42054
42223
  }
42055
- sectionOrderFor(sectionLabel, rows) {
42056
- const label = sectionLabel?.trim();
42057
- if (!label)
42058
- return undefined;
42059
- const labels = [...new Set(rows.map(row => row.sectionLabel?.trim()).filter(Boolean))];
42060
- 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;
42061
42229
  }
42062
42230
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SurveyBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
42063
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: `
42064
42232
  <div class="survey-builder">
42065
42233
  @if (isWizard()) {
42066
42234
  <nav class="survey-builder__steps" [attr.aria-label]="t('wizardStepsLabel')">
42067
- @for (step of wizardSteps; track step.id; let i = $index) {
42235
+ @for (step of wizardSteps(); track step.id; let i = $index) {
42068
42236
  <button
42069
42237
  type="button"
42070
42238
  class="survey-builder__step"
@@ -42073,7 +42241,7 @@ class SurveyBuilderComponent {
42073
42241
  (click)="goToStep(i)"
42074
42242
  >
42075
42243
  <span>{{ i + 1 }}</span>
42076
- {{ t(step.labelKey) }}
42244
+ {{ step.label }}
42077
42245
  </button>
42078
42246
  }
42079
42247
  </nav>
@@ -42090,6 +42258,9 @@ class SurveyBuilderComponent {
42090
42258
 
42091
42259
  @if (showWizardSection(0)) {
42092
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>
42093
42264
  <val-form-field [label]="t('titleLabel')">
42094
42265
  <val-text-input [props]="{ control: titleControl, placeholder: t('titlePlaceholder') }" />
42095
42266
  </val-form-field>
@@ -42215,7 +42386,7 @@ class SurveyBuilderComponent {
42215
42386
  </div>
42216
42387
  }
42217
42388
 
42218
- @if (showWizardSection(2)) {
42389
+ @if (showWizardSection(closeStep())) {
42219
42390
  <section class="survey-builder__section">
42220
42391
  <span class="survey-builder__questions-label">{{ t('stepClose') }}</span>
42221
42392
  <p class="survey-builder__optional-note">{{ t('successOptionalNote') }}</p>
@@ -42262,7 +42433,7 @@ class SurveyBuilderComponent {
42262
42433
  </section>
42263
42434
  }
42264
42435
 
42265
- @if (showWizardSection(1)) {
42436
+ @if (showCurrentSectionQuestionStep()) {
42266
42437
  <div class="survey-builder__questions">
42267
42438
  <span class="survey-builder__questions-label">{{ t('questionsLabel') }}</span>
42268
42439
 
@@ -42270,68 +42441,113 @@ class SurveyBuilderComponent {
42270
42441
  <p class="survey-builder__empty">{{ t('noQuestions') }}</p>
42271
42442
  }
42272
42443
 
42273
- @for (row of questions(); track row.id; let i = $index; let first = $first; let last = $last) {
42274
- <div class="survey-builder__row">
42275
- <div class="survey-builder__row-head">
42276
- <div class="survey-builder__row-text">
42277
- <strong>{{ row.label || t('untitledQuestion') }}</strong>
42278
- <span>
42279
- {{ typeLabel(row.type) }}{{ row.required ? ' · ' + t('requiredTag') : '' }}{{ row.sectionLabel ? ' · ' + row.sectionLabel : '' }}
42280
- </span>
42281
- </div>
42282
- <div class="survey-builder__row-actions">
42283
- <val-button
42284
- [props]="iconAction('q-up-' + row.id, 'arrow-up-outline', t('moveUp'), first)"
42285
- (onClick)="move(i, -1)"
42286
- />
42287
- <val-button
42288
- [props]="iconAction('q-down-' + row.id, 'arrow-down-outline', t('moveDown'), last)"
42289
- (onClick)="move(i, 1)"
42290
- />
42291
- <val-button
42292
- [props]="iconAction('q-copy-' + row.id, 'copy-outline', t('duplicateQuestion'))"
42293
- (onClick)="duplicate(row)"
42294
- />
42295
- <val-button
42296
- [props]="iconAction('q-edit-' + row.id, 'create-outline', t('editQuestion'))"
42297
- (onClick)="toggleEdit(row)"
42298
- />
42299
- <val-button
42300
- [props]="iconAction('q-remove-' + row.id, 'trash-outline', t('removeQuestion'), false, 'danger')"
42301
- (onClick)="removeQuestion(row)"
42302
- />
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>
42303
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
+ />
42304
42475
  </div>
42305
42476
 
42306
- @if (editingId() === row.id) {
42307
- <div class="survey-builder__row-editor">
42308
- <val-field-schema-editor
42309
- #editor
42310
- [props]="editorProps(row)"
42311
- (changed)="draftQuestion($event)"
42312
- (save)="applyQuestion($event)"
42313
- />
42314
- <div class="survey-builder__row-editor-actions">
42315
- <val-button
42316
- [props]="{
42317
- token: 'q-done-' + row.id,
42318
- text: t('doneEditing'),
42319
- color: 'dark',
42320
- fill: 'solid',
42321
- shape: 'round',
42322
- size: 'default',
42323
- type: 'button',
42324
- state: 'ENABLED',
42325
- }"
42326
- (onClick)="editor.submit()"
42327
- />
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>
42328
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
+ }
42329
42544
  </div>
42330
42545
  }
42331
- </div>
42546
+ </section>
42547
+ }
42332
42548
  }
42333
42549
 
42334
- <val-button
42550
+ <val-button
42335
42551
  [props]="{
42336
42552
  token: 'survey-builder-add-question',
42337
42553
  text: t('addQuestion'),
@@ -42343,12 +42559,12 @@ class SurveyBuilderComponent {
42343
42559
  state: 'ENABLED',
42344
42560
  icon: { name: 'add-outline', slot: 'start' },
42345
42561
  }"
42346
- (onClick)="addQuestion()"
42562
+ (onClick)="addQuestion(questionGroups()[0]?.id)"
42347
42563
  />
42348
42564
  </div>
42349
42565
  }
42350
42566
 
42351
- @if (showWizardSection(3)) {
42567
+ @if (showWizardSection(reviewStep())) {
42352
42568
  <section class="survey-builder__review">
42353
42569
  <span class="survey-builder__questions-label">{{ t('reviewTitle') }}</span>
42354
42570
  <strong>{{ titleControl.value || t('untitledQuestion') }}</strong>
@@ -42371,7 +42587,7 @@ class SurveyBuilderComponent {
42371
42587
  @if (wizardStep() > 0) {
42372
42588
  <val-button [props]="wizardBackProps()" (onClick)="previousStep()" />
42373
42589
  }
42374
- @if (wizardStep() < wizardSteps.length - 1) {
42590
+ @if (wizardStep() < wizardSteps().length - 1) {
42375
42591
  <val-button [props]="wizardNextProps()" (onClick)="nextStep()" />
42376
42592
  } @else {
42377
42593
  <val-button [props]="saveProps()" (onClick)="save()" />
@@ -42381,7 +42597,7 @@ class SurveyBuilderComponent {
42381
42597
  <val-button [props]="saveProps()" (onClick)="save()" />
42382
42598
  }
42383
42599
  </div>
42384
- `, 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"] }] }); }
42385
42601
  }
42386
42602
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SurveyBuilderComponent, decorators: [{
42387
42603
  type: Component,
@@ -42398,7 +42614,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42398
42614
  <div class="survey-builder">
42399
42615
  @if (isWizard()) {
42400
42616
  <nav class="survey-builder__steps" [attr.aria-label]="t('wizardStepsLabel')">
42401
- @for (step of wizardSteps; track step.id; let i = $index) {
42617
+ @for (step of wizardSteps(); track step.id; let i = $index) {
42402
42618
  <button
42403
42619
  type="button"
42404
42620
  class="survey-builder__step"
@@ -42407,7 +42623,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42407
42623
  (click)="goToStep(i)"
42408
42624
  >
42409
42625
  <span>{{ i + 1 }}</span>
42410
- {{ t(step.labelKey) }}
42626
+ {{ step.label }}
42411
42627
  </button>
42412
42628
  }
42413
42629
  </nav>
@@ -42424,6 +42640,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42424
42640
 
42425
42641
  @if (showWizardSection(0)) {
42426
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>
42427
42646
  <val-form-field [label]="t('titleLabel')">
42428
42647
  <val-text-input [props]="{ control: titleControl, placeholder: t('titlePlaceholder') }" />
42429
42648
  </val-form-field>
@@ -42549,7 +42768,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42549
42768
  </div>
42550
42769
  }
42551
42770
 
42552
- @if (showWizardSection(2)) {
42771
+ @if (showWizardSection(closeStep())) {
42553
42772
  <section class="survey-builder__section">
42554
42773
  <span class="survey-builder__questions-label">{{ t('stepClose') }}</span>
42555
42774
  <p class="survey-builder__optional-note">{{ t('successOptionalNote') }}</p>
@@ -42596,7 +42815,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42596
42815
  </section>
42597
42816
  }
42598
42817
 
42599
- @if (showWizardSection(1)) {
42818
+ @if (showCurrentSectionQuestionStep()) {
42600
42819
  <div class="survey-builder__questions">
42601
42820
  <span class="survey-builder__questions-label">{{ t('questionsLabel') }}</span>
42602
42821
 
@@ -42604,68 +42823,113 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42604
42823
  <p class="survey-builder__empty">{{ t('noQuestions') }}</p>
42605
42824
  }
42606
42825
 
42607
- @for (row of questions(); track row.id; let i = $index; let first = $first; let last = $last) {
42608
- <div class="survey-builder__row">
42609
- <div class="survey-builder__row-head">
42610
- <div class="survey-builder__row-text">
42611
- <strong>{{ row.label || t('untitledQuestion') }}</strong>
42612
- <span>
42613
- {{ typeLabel(row.type) }}{{ row.required ? ' · ' + t('requiredTag') : '' }}{{ row.sectionLabel ? ' · ' + row.sectionLabel : '' }}
42614
- </span>
42615
- </div>
42616
- <div class="survey-builder__row-actions">
42617
- <val-button
42618
- [props]="iconAction('q-up-' + row.id, 'arrow-up-outline', t('moveUp'), first)"
42619
- (onClick)="move(i, -1)"
42620
- />
42621
- <val-button
42622
- [props]="iconAction('q-down-' + row.id, 'arrow-down-outline', t('moveDown'), last)"
42623
- (onClick)="move(i, 1)"
42624
- />
42625
- <val-button
42626
- [props]="iconAction('q-copy-' + row.id, 'copy-outline', t('duplicateQuestion'))"
42627
- (onClick)="duplicate(row)"
42628
- />
42629
- <val-button
42630
- [props]="iconAction('q-edit-' + row.id, 'create-outline', t('editQuestion'))"
42631
- (onClick)="toggleEdit(row)"
42632
- />
42633
- <val-button
42634
- [props]="iconAction('q-remove-' + row.id, 'trash-outline', t('removeQuestion'), false, 'danger')"
42635
- (onClick)="removeQuestion(row)"
42636
- />
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>
42637
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
+ />
42638
42857
  </div>
42639
42858
 
42640
- @if (editingId() === row.id) {
42641
- <div class="survey-builder__row-editor">
42642
- <val-field-schema-editor
42643
- #editor
42644
- [props]="editorProps(row)"
42645
- (changed)="draftQuestion($event)"
42646
- (save)="applyQuestion($event)"
42647
- />
42648
- <div class="survey-builder__row-editor-actions">
42649
- <val-button
42650
- [props]="{
42651
- token: 'q-done-' + row.id,
42652
- text: t('doneEditing'),
42653
- color: 'dark',
42654
- fill: 'solid',
42655
- shape: 'round',
42656
- size: 'default',
42657
- type: 'button',
42658
- state: 'ENABLED',
42659
- }"
42660
- (onClick)="editor.submit()"
42661
- />
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>
42662
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
+ }
42663
42926
  </div>
42664
42927
  }
42665
- </div>
42928
+ </section>
42929
+ }
42666
42930
  }
42667
42931
 
42668
- <val-button
42932
+ <val-button
42669
42933
  [props]="{
42670
42934
  token: 'survey-builder-add-question',
42671
42935
  text: t('addQuestion'),
@@ -42677,12 +42941,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42677
42941
  state: 'ENABLED',
42678
42942
  icon: { name: 'add-outline', slot: 'start' },
42679
42943
  }"
42680
- (onClick)="addQuestion()"
42944
+ (onClick)="addQuestion(questionGroups()[0]?.id)"
42681
42945
  />
42682
42946
  </div>
42683
42947
  }
42684
42948
 
42685
- @if (showWizardSection(3)) {
42949
+ @if (showWizardSection(reviewStep())) {
42686
42950
  <section class="survey-builder__review">
42687
42951
  <span class="survey-builder__questions-label">{{ t('reviewTitle') }}</span>
42688
42952
  <strong>{{ titleControl.value || t('untitledQuestion') }}</strong>
@@ -42705,7 +42969,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42705
42969
  @if (wizardStep() > 0) {
42706
42970
  <val-button [props]="wizardBackProps()" (onClick)="previousStep()" />
42707
42971
  }
42708
- @if (wizardStep() < wizardSteps.length - 1) {
42972
+ @if (wizardStep() < wizardSteps().length - 1) {
42709
42973
  <val-button [props]="wizardNextProps()" (onClick)="nextStep()" />
42710
42974
  } @else {
42711
42975
  <val-button [props]="saveProps()" (onClick)="save()" />
@@ -42715,7 +42979,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42715
42979
  <val-button [props]="saveProps()" (onClick)="save()" />
42716
42980
  }
42717
42981
  </div>
42718
- `, 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"] }]
42719
42983
  }], ctorParameters: () => [], propDecorators: { props: [{
42720
42984
  type: Input
42721
42985
  }], saved: [{
@@ -51167,6 +51431,39 @@ class DataTableComponent {
51167
51431
  get visibleColumns() {
51168
51432
  return this._visibleColumns;
51169
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
+ }
51170
51467
  get totalColumns() {
51171
51468
  let count = this.visibleColumns.length;
51172
51469
  if (this.props.showSelectionColumn)
@@ -51268,6 +51565,21 @@ class DataTableComponent {
51268
51565
  return 'none';
51269
51566
  return this.currentSort.direction === 'asc' ? 'ascending' : 'descending';
51270
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
+ }
51271
51583
  getRowNumber(index) {
51272
51584
  const start = this.props.rowNumberStart ?? 1;
51273
51585
  if (this.props.pagination) {
@@ -51654,22 +51966,139 @@ class DataTableComponent {
51654
51966
 
51655
51967
  <!-- Card body with fields -->
51656
51968
  <div class="card-body">
51657
- @for (column of visibleColumns; track column.key) {
51658
- <div class="card-field">
51659
- <span class="card-field__label">{{ column.label }}</span>
51660
- <span class="card-field__value">
51661
- @if (column.cellTemplate) {
51662
- <ng-container
51663
- *ngTemplateOutlet="
51664
- column.cellTemplate;
51665
- context: { row, column, value: getCellValue(row, column) }
51666
- "
51667
- ></ng-container>
51668
- } @else {
51669
- {{ getFormattedValue(row, column) }}
51670
- }
51671
- </span>
51672
- </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
+ }
51673
52102
  }
51674
52103
  </div>
51675
52104
 
@@ -51758,7 +52187,7 @@ class DataTableComponent {
51758
52187
  </div>
51759
52188
  }
51760
52189
  </div>
51761
- `, 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 }); }
51762
52191
  }
51763
52192
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DataTableComponent, decorators: [{
51764
52193
  type: Component,
@@ -52013,22 +52442,139 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
52013
52442
 
52014
52443
  <!-- Card body with fields -->
52015
52444
  <div class="card-body">
52016
- @for (column of visibleColumns; track column.key) {
52017
- <div class="card-field">
52018
- <span class="card-field__label">{{ column.label }}</span>
52019
- <span class="card-field__value">
52020
- @if (column.cellTemplate) {
52021
- <ng-container
52022
- *ngTemplateOutlet="
52023
- column.cellTemplate;
52024
- context: { row, column, value: getCellValue(row, column) }
52025
- "
52026
- ></ng-container>
52027
- } @else {
52028
- {{ getFormattedValue(row, column) }}
52029
- }
52030
- </span>
52031
- </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
+ }
52032
52578
  }
52033
52579
  </div>
52034
52580
 
@@ -52117,7 +52663,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
52117
52663
  </div>
52118
52664
  }
52119
52665
  </div>
52120
- `, 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"] }]
52121
52667
  }], propDecorators: { props: [{
52122
52668
  type: Input
52123
52669
  }], rowClick: [{