@forgeroute/ui 0.4.73 → 0.4.74

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.
@@ -1385,15 +1385,49 @@ i0.ɵɵngDeclareClassMetadata({
1385
1385
  }]
1386
1386
  }
1387
1387
  });
1388
+ const HEX = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
1389
+ const BADGE_INK_DARK = "#0f172a";
1390
+ const BADGE_INK_LIGHT = "#ffffff";
1391
+ function normalizeBadgeColor(value) {
1392
+ const raw = (value ?? "").trim();
1393
+ if (!HEX.test(raw)) return null;
1394
+ const hex = raw.slice(1).toLowerCase();
1395
+ return "#" + (hex.length === 3 ? hex.split("").map((c) => c + c).join("") : hex);
1396
+ }
1397
+ function channel(v) {
1398
+ const s = v / 255;
1399
+ return s <= .03928 ? s / 12.92 : Math.pow((s + .055) / 1.055, 2.4);
1400
+ }
1401
+ function relativeLuminance(hex) {
1402
+ const n = parseInt(hex.slice(1), 16);
1403
+ return .2126 * channel(n >> 16 & 255) + .7152 * channel(n >> 8 & 255) + .0722 * channel(n & 255);
1404
+ }
1405
+ function contrastRatio(a, b) {
1406
+ const la = relativeLuminance(a), lb = relativeLuminance(b);
1407
+ const [hi, lo] = la >= lb ? [la, lb] : [lb, la];
1408
+ return (hi + .05) / (lo + .05);
1409
+ }
1410
+ function readableInk(background) {
1411
+ return contrastRatio(background, "#0f172a") >= contrastRatio(background, "#ffffff") ? BADGE_INK_DARK : BADGE_INK_LIGHT;
1412
+ }
1413
+ function customBadgeStyles(value) {
1414
+ const bg = normalizeBadgeColor(value);
1415
+ return bg ? {
1416
+ bg,
1417
+ color: readableInk(bg)
1418
+ } : null;
1419
+ }
1388
1420
  var BadgeComponent = class BadgeComponent {
1389
1421
  constructor() {
1390
1422
  this.label = input.required(...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
1391
1423
  this.variant = input(null, ...ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []);
1424
+ this.color = input(null, ...ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []);
1392
1425
  this.resolvedVariant = computed(() => {
1393
1426
  if (this.variant()) return this.variant();
1394
1427
  return SEMANTIC_BADGE_MAP[this.label()] ?? autoVariant(this.label());
1395
1428
  }, ...ngDevMode ? [{ debugName: "resolvedVariant" }] : /* istanbul ignore next */ []);
1396
- this.styles = computed(() => BADGE_VARIANT_STYLES[this.resolvedVariant()] ?? BADGE_VARIANT_STYLES["gray"], ...ngDevMode ? [{ debugName: "styles" }] : /* istanbul ignore next */ []);
1429
+ this.customStyles = computed(() => customBadgeStyles(this.color()), ...ngDevMode ? [{ debugName: "customStyles" }] : /* istanbul ignore next */ []);
1430
+ this.styles = computed(() => this.customStyles() ?? BADGE_VARIANT_STYLES[this.resolvedVariant()] ?? BADGE_VARIANT_STYLES["gray"], ...ngDevMode ? [{ debugName: "styles" }] : /* istanbul ignore next */ []);
1397
1431
  }
1398
1432
  static {
1399
1433
  this.ɵfac = i0.ɵɵngDeclareFactory({
@@ -1426,13 +1460,20 @@ var BadgeComponent = class BadgeComponent {
1426
1460
  isSignal: true,
1427
1461
  isRequired: false,
1428
1462
  transformFunction: null
1463
+ },
1464
+ color: {
1465
+ classPropertyName: "color",
1466
+ publicName: "color",
1467
+ isSignal: true,
1468
+ isRequired: false,
1469
+ transformFunction: null
1429
1470
  }
1430
1471
  },
1431
1472
  ngImport: i0,
1432
1473
  template: `
1433
1474
  <span
1434
1475
  class="badge"
1435
- [class.badge-gray]="resolvedVariant() === 'gray'"
1476
+ [class.badge-gray]="!customStyles() && resolvedVariant() === 'gray'"
1436
1477
  [style.background]="styles().bg"
1437
1478
  [style.color]="styles().color">
1438
1479
  {{ label() }}
@@ -1458,7 +1499,7 @@ i0.ɵɵngDeclareClassMetadata({
1458
1499
  template: `
1459
1500
  <span
1460
1501
  class="badge"
1461
- [class.badge-gray]="resolvedVariant() === 'gray'"
1502
+ [class.badge-gray]="!customStyles() && resolvedVariant() === 'gray'"
1462
1503
  [style.background]="styles().bg"
1463
1504
  [style.color]="styles().color">
1464
1505
  {{ label() }}
@@ -1483,6 +1524,14 @@ i0.ɵɵngDeclareClassMetadata({
1483
1524
  alias: "variant",
1484
1525
  required: false
1485
1526
  }]
1527
+ }],
1528
+ color: [{
1529
+ type: i0.Input,
1530
+ args: [{
1531
+ isSignal: true,
1532
+ alias: "color",
1533
+ required: false
1534
+ }]
1486
1535
  }]
1487
1536
  }
1488
1537
  });
@@ -1829,6 +1878,9 @@ const BUILT_IN_ICONS = {
1829
1878
  "create-invoice": "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z M14 2v6h6 M16 13H8 M16 17H8 M10 9H8",
1830
1879
  "create-estimate": "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z M14 2v6h6 M12 18v-6 M9 15h6",
1831
1880
  "add-note": "M12 20h9 M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z",
1881
+ "history": "M3 3v5h5 M3.05 13A9 9 0 1 0 6 5.3L3 8 M12 7v5l4 2",
1882
+ "move-up": "M12 19V5 M5 12l7-7 7 7",
1883
+ "move-down": "M12 5v14 M19 12l-7 7-7-7",
1832
1884
  "invite-portal": "M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z M15 9l3 3-3 3 M18 12H8"
1833
1885
  };
1834
1886
  function builtInActionIcon(type) {
@@ -2085,6 +2137,7 @@ var MoreMenuComponent = class MoreMenuComponent {
2085
2137
  <div class="mm-wrapper">
2086
2138
  <button
2087
2139
  class="mm-trigger"
2140
+ data-testid="more-menu-trigger"
2088
2141
  [attr.aria-expanded]="open()"
2089
2142
  aria-haspopup="menu"
2090
2143
  [attr.aria-label]="ariaLabel()"
@@ -2101,6 +2154,7 @@ var MoreMenuComponent = class MoreMenuComponent {
2101
2154
  @for (action of visibleActions(); track action.type) {
2102
2155
  <button
2103
2156
  class="mm-item"
2157
+ data-testid="more-menu-item"
2104
2158
  [class.mm-danger]="action.variant === 'danger'"
2105
2159
  [disabled]="isDisabled(action)"
2106
2160
  role="menuitem"
@@ -2141,6 +2195,7 @@ i0.ɵɵngDeclareClassMetadata({
2141
2195
  <div class="mm-wrapper">
2142
2196
  <button
2143
2197
  class="mm-trigger"
2198
+ data-testid="more-menu-trigger"
2144
2199
  [attr.aria-expanded]="open()"
2145
2200
  aria-haspopup="menu"
2146
2201
  [attr.aria-label]="ariaLabel()"
@@ -2157,6 +2212,7 @@ i0.ɵɵngDeclareClassMetadata({
2157
2212
  @for (action of visibleActions(); track action.type) {
2158
2213
  <button
2159
2214
  class="mm-item"
2215
+ data-testid="more-menu-item"
2160
2216
  [class.mm-danger]="action.variant === 'danger'"
2161
2217
  [disabled]="isDisabled(action)"
2162
2218
  role="menuitem"
@@ -7413,7 +7469,7 @@ var ProgressBarComponent = class ProgressBarComponent {
7413
7469
  </div>
7414
7470
  `,
7415
7471
  isInline: true,
7416
- styles: [":host{display:block}.pb{display:flex;align-items:center;gap:8px;min-width:100px}.pb-track{flex:1;height:6px;background:#e2e8f0;border-radius:3px;overflow:hidden}.pb-fill{height:100%;border-radius:3px;transition:width .3s}@media(prefers-reduced-motion:reduce){.pb-fill{transition:none}}.pb-blue{background:var(--ui-progress-fill, var(--ui-accent, #3b82f6))}.pb-green{background:#16a34a}.pb-amber{background:#f59e0b}.pb-red{background:#ef4444}.pb-slate{background:#94a3b8}@media(forced-colors:active){.pb-track{background:Canvas;border:1px solid CanvasText}.pb-fill{background:Highlight;forced-color-adjust:none}}.pb-label{font-size:.75rem;font-weight:500;color:#64748b;white-space:nowrap}\n"],
7472
+ styles: [":host{display:block}.pb{display:flex;align-items:center;gap:8px;min-width:100px}.pb-track{flex:1;height:6px;background:#e2e8f0;border-radius:3px;overflow:hidden}.pb-fill{height:100%;border-radius:3px;transition:width .3s}@media(prefers-reduced-motion:reduce){.pb-fill{transition:none}}.pb-blue{background:var(--ui-progress-fill, var(--ui-accent, #3b82f6))}.pb-green{background:#16a34a}.pb-amber{background:#f59e0b}.pb-orange{background:#f97316}.pb-red{background:#ef4444}.pb-slate{background:#94a3b8}@media(forced-colors:active){.pb-track{background:Canvas;border:1px solid CanvasText}.pb-fill{background:Highlight;forced-color-adjust:none}}.pb-label{font-size:.75rem;font-weight:500;color:#64748b;white-space:nowrap}\n"],
7417
7473
  dependencies: [{
7418
7474
  kind: "directive",
7419
7475
  type: TooltipDirective,
@@ -7451,7 +7507,7 @@ i0.ɵɵngDeclareClassMetadata({
7451
7507
  @if (label()) { <span class="pb-label">{{ label() }}</span> }
7452
7508
  </div>
7453
7509
  `,
7454
- styles: [":host{display:block}.pb{display:flex;align-items:center;gap:8px;min-width:100px}.pb-track{flex:1;height:6px;background:#e2e8f0;border-radius:3px;overflow:hidden}.pb-fill{height:100%;border-radius:3px;transition:width .3s}@media(prefers-reduced-motion:reduce){.pb-fill{transition:none}}.pb-blue{background:var(--ui-progress-fill, var(--ui-accent, #3b82f6))}.pb-green{background:#16a34a}.pb-amber{background:#f59e0b}.pb-red{background:#ef4444}.pb-slate{background:#94a3b8}@media(forced-colors:active){.pb-track{background:Canvas;border:1px solid CanvasText}.pb-fill{background:Highlight;forced-color-adjust:none}}.pb-label{font-size:.75rem;font-weight:500;color:#64748b;white-space:nowrap}\n"]
7510
+ styles: [":host{display:block}.pb{display:flex;align-items:center;gap:8px;min-width:100px}.pb-track{flex:1;height:6px;background:#e2e8f0;border-radius:3px;overflow:hidden}.pb-fill{height:100%;border-radius:3px;transition:width .3s}@media(prefers-reduced-motion:reduce){.pb-fill{transition:none}}.pb-blue{background:var(--ui-progress-fill, var(--ui-accent, #3b82f6))}.pb-green{background:#16a34a}.pb-amber{background:#f59e0b}.pb-orange{background:#f97316}.pb-red{background:#ef4444}.pb-slate{background:#94a3b8}@media(forced-colors:active){.pb-track{background:Canvas;border:1px solid CanvasText}.pb-fill{background:Highlight;forced-color-adjust:none}}.pb-label{font-size:.75rem;font-weight:500;color:#64748b;white-space:nowrap}\n"]
7455
7511
  }]
7456
7512
  }],
7457
7513
  propDecorators: {
@@ -9905,6 +9961,48 @@ i0.ɵɵngDeclareClassMetadata({
9905
9961
  }]
9906
9962
  }
9907
9963
  });
9964
+ var HintComponent = class HintComponent {
9965
+ static {
9966
+ this.ɵfac = i0.ɵɵngDeclareFactory({
9967
+ minVersion: "12.0.0",
9968
+ version: "22.2.2",
9969
+ ngImport: i0,
9970
+ type: HintComponent,
9971
+ deps: [],
9972
+ target: i0.ɵɵFactoryTarget.Component
9973
+ });
9974
+ }
9975
+ static {
9976
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
9977
+ minVersion: "14.0.0",
9978
+ version: "22.2.2",
9979
+ type: HintComponent,
9980
+ isStandalone: true,
9981
+ selector: "ui-hint",
9982
+ ngImport: i0,
9983
+ template: `<p class="hint"><ng-content /></p>`,
9984
+ isInline: true,
9985
+ styles: [":host{display:block}.hint{font-size:.75rem;line-height:1.4;color:#64748b;margin:0}\n"],
9986
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
9987
+ });
9988
+ }
9989
+ };
9990
+ i0.ɵɵngDeclareClassMetadata({
9991
+ minVersion: "12.0.0",
9992
+ version: "22.2.2",
9993
+ ngImport: i0,
9994
+ type: HintComponent,
9995
+ decorators: [{
9996
+ type: Component,
9997
+ args: [{
9998
+ selector: "ui-hint",
9999
+ standalone: true,
10000
+ changeDetection: ChangeDetectionStrategy.OnPush,
10001
+ template: `<p class="hint"><ng-content /></p>`,
10002
+ styles: [":host{display:block}.hint{font-size:.75rem;line-height:1.4;color:#64748b;margin:0}\n"]
10003
+ }]
10004
+ }]
10005
+ });
9908
10006
  function detectCsvDelimiter(text) {
9909
10007
  const counts = {
9910
10008
  ",": 0,
@@ -10014,6 +10112,7 @@ var ImportExportComponent = class ImportExportComponent {
10014
10112
  this.importing = false;
10015
10113
  this.importResult = null;
10016
10114
  this.csvFile = null;
10115
+ this.idPrefix = `ie-ex-${ImportExportComponent.nextId++}-`;
10017
10116
  this.destroyRef.onDestroy(() => this.stopImportTimer());
10018
10117
  effect(() => {
10019
10118
  const v = this._configInput();
@@ -10209,6 +10308,12 @@ var ImportExportComponent = class ImportExportComponent {
10209
10308
  if (new Set(candidates).size === 1) this.columnMapping[field.key] = candidates[0];
10210
10309
  }
10211
10310
  }
10311
+ static {
10312
+ this.nextId = 0;
10313
+ }
10314
+ exampleId(field) {
10315
+ return this.idPrefix + field.key;
10316
+ }
10212
10317
  get canSubmit() {
10213
10318
  return (this.config.importFields ?? []).filter((f) => f.required).every((f) => !!this.columnMapping[f.key]);
10214
10319
  }
@@ -10496,10 +10601,12 @@ var ImportExportComponent = class ImportExportComponent {
10496
10601
  }
10497
10602
  {{ field.label }}
10498
10603
  @if (field.required) { <span class="ie-required" aria-hidden="true">*</span> }
10604
+ @if (field.example) { <ui-hint class="ie-field-example" [attr.id]="exampleId(field)">e.g. {{ field.example }}</ui-hint> }
10499
10605
  </span>
10500
10606
  <div role="cell">
10501
10607
  <ui-select
10502
10608
  [ariaLabel]="field.label + ' column' + (field.required ? ', required' : '')"
10609
+ [ariaDescribedBy]="field.example ? exampleId(field) : ''"
10503
10610
  [options]="csvHeaderOptions"
10504
10611
  [(ngModel)]="columnMapping[field.key]"
10505
10612
  [error]="field.required && !columnMapping[field.key] ? 'Required' : ''" />
@@ -10653,7 +10760,7 @@ var ImportExportComponent = class ImportExportComponent {
10653
10760
  </ui-modal>
10654
10761
  `,
10655
10762
  isInline: true,
10656
- styles: [".ie-actions{display:flex;gap:8px}.ie-steps{display:flex;align-items:center;margin-bottom:24px;gap:0;list-style:none;padding:0}.ie-step{display:flex;align-items:center;gap:6px;flex-shrink:0}.ie-step-num{width:24px;height:24px;border-radius:50%;background:#e2e8f0;color:#64748b;font-size:.75rem;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0}.ie-step-label{font-size:.8125rem;color:#64748b;font-weight:500}.ie-step.active .ie-step-num{background:#3b82f6;color:#fff}.ie-step.active .ie-step-label{color:#1e293b;font-weight:600}.ie-step.done .ie-step-num{background:#22c55e;color:#fff}.ie-step.done .ie-step-label{color:#64748b}.ie-step:not(:last-child){flex:1 1 auto}.ie-step:not(:last-child):after{content:\"\";flex:1;height:1px;background:#e2e8f0;margin:0 8px;min-width:16px}.ie-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}.ie-source-step{display:flex;flex-direction:column;gap:16px}.ie-upload-area{display:flex;flex-direction:column;gap:12px}.ie-template-hint{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:.875rem;color:#64748b;background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:10px 14px}.ie-file-hidden{position:absolute;inset:0;width:100%;height:100%;margin:0;padding:0;opacity:0;overflow:hidden;cursor:pointer}.ie-dropzone{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:40px 24px;border:2px dashed #7c8ba1;border-radius:10px;cursor:pointer;transition:border-color .18s ease,background .18s ease}.ie-dropzone:hover,.ie-dropzone:focus-within{border-color:#3b82f6;background:#f0f7ff}.ie-dropzone:focus-within{outline:2px solid #3b82f6;outline-offset:2px}.ie-dropzone.has-error{border-color:#ef4444}.ie-dropzone-text{font-size:.9375rem;font-weight:600;color:#1e293b}.ie-dropzone-sub{font-size:.8125rem;color:#64748b}.ie-mapping{display:flex;flex-direction:column;gap:12px}.ie-mapping-hint{font-size:.875rem;color:#64748b;margin:0}.ie-mapping-success{display:flex;align-items:flex-start;gap:8px;padding:10px 14px;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:8px;font-size:.875rem;color:#15803d}.ie-mapping-success svg{flex-shrink:0;margin-top:1px;color:#16a34a}.ie-mapping-unmatched{display:flex;align-items:flex-start;gap:6px;font-size:.8125rem;color:#64748b;margin:0;padding-top:4px}.ie-mapping-unmatched svg{flex-shrink:0;margin-top:1px}.ie-mapping-unmatched em{font-style:normal;color:#475569}.ie-mapping-table{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.ie-mapping-header{display:grid;grid-template-columns:1fr 1fr 1fr;padding:8px 12px;background:#f8fafc;border-bottom:1px solid #e2e8f0;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase}.ie-mapping-row{display:grid;grid-template-columns:1fr 1fr 1fr;align-items:start;padding:8px 12px;border-bottom:1px solid #f1f5f9;gap:8px}.ie-mapping-row:last-child{border-bottom:none}.ie-mapping-row.ie-mapping-row--required-missing{background:#fff7ed}.ie-mapping-row.ie-mapping-row--required-missing .ie-field-label{color:#c2410c}.ie-match-icon{color:#16a34a;margin-right:4px;vertical-align:-1px}.ie-field-label{display:flex;align-items:center;font-size:.875rem;color:#1e293b;font-weight:500}.ie-required{color:#dc2626;margin-left:2px}.ie-sample{font-size:.8125rem;color:#64748b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ie-preview{display:flex;flex-direction:column;gap:12px}.ie-preview-scroll{overflow-x:auto;border:1px solid #e2e8f0;border-radius:8px}.ie-preview-scroll:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.ie-result:focus,.ie-source-step:focus,.ie-upload-area:focus,.ie-mapping:focus,.ie-preview:focus{outline:none}.ie-result-list{list-style:none;margin:0;padding:0}.ie-preview-table{width:100%;border-collapse:collapse;font-size:.8125rem}.ie-preview-table th{background:#f8fafc;padding:8px 12px;text-align:left;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;border-bottom:1px solid #e2e8f0;white-space:nowrap}.ie-preview-table td{padding:7px 12px;color:#1e293b;border-bottom:1px solid #f1f5f9;max-width:160px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ie-preview-table tr:last-child td{border-bottom:none}.ie-result{display:flex;flex-direction:column;gap:16px}.ie-result-summary{display:flex;flex-direction:column;gap:8px}.ie-result-stat{display:flex;align-items:center;gap:10px;padding:12px 16px;border-radius:8px;font-size:.9375rem}.ie-result-stat.success{background:#f0fdf4;color:#15803d}.ie-result-stat.success svg{stroke:#22c55e}.ie-result-stat.error{background:#fef2f2;color:#b91c1c}.ie-result-stat.error svg{stroke:#ef4444}.ie-result-stat.warning{background:#fffbeb;color:#b45309}.ie-result-stat.warning svg{stroke:#f59e0b}.ie-progress{margin-top:14px}.ie-progress-track{height:6px;border-radius:999px;background:#e2e8f0;overflow:hidden;position:relative}.ie-progress-bar{position:absolute;inset:0 auto 0 0;width:35%;border-radius:999px;background:#2563eb;animation:ie-progress-slide 1.2s ease-in-out infinite}.ie-progress-text{margin:8px 0 0;font-size:.8125rem;color:#475569}@keyframes ie-progress-slide{0%{left:-35%}to{left:100%}}@media(prefers-reduced-motion:reduce){.ie-progress-bar{animation:none;width:100%;opacity:.5}}.ie-errors-list{border:1px solid #fecaca;border-radius:8px;overflow:hidden}.ie-errors-title{font-size:.8125rem;font-weight:600;color:#b91c1c;padding:8px 12px;background:#fef2f2;margin:0;border-bottom:1px solid #fecaca}.ie-error-row{display:flex;gap:12px;padding:7px 12px;border-bottom:1px solid #fff1f2;font-size:.8125rem;color:#374151}.ie-error-row:last-child{border-bottom:none}.ie-error-row-num{font-weight:600;color:#b91c1c;flex-shrink:0}.ie-warnings-list{border:1px solid #fde68a;border-radius:8px;overflow:hidden}.ie-warnings-title{font-size:.8125rem;font-weight:600;color:#b45309;padding:8px 12px;background:#fffbeb;margin:0;border-bottom:1px solid #fde68a}.ie-warning-row{display:flex;gap:12px;padding:7px 12px;border-bottom:1px solid #fef3c7;font-size:.8125rem;color:#374151}.ie-warning-row:last-child{border-bottom:none}.ie-warning-row-num{font-weight:600;color:#b45309;flex-shrink:0}.ie-error{font-size:.875rem;color:#dc2626;margin:0}.ie-footer-right{display:flex;gap:8px;align-items:center}@media(max-width:600px){.ie-step-label{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}.ie-dropzone{padding:24px 16px}.ie-mapping-header{grid-template-columns:1fr 1fr}.ie-mapping-header span:last-child{display:none}.ie-mapping-row{grid-template-columns:1fr 1fr}.ie-mapping-row .ie-sample{display:none}}\n"],
10763
+ styles: [".ie-actions{display:flex;gap:8px}.ie-steps{display:flex;align-items:center;margin-bottom:24px;gap:0;list-style:none;padding:0}.ie-step{display:flex;align-items:center;gap:6px;flex-shrink:0}.ie-step-num{width:24px;height:24px;border-radius:50%;background:#e2e8f0;color:#64748b;font-size:.75rem;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0}.ie-step-label{font-size:.8125rem;color:#64748b;font-weight:500}.ie-step.active .ie-step-num{background:#3b82f6;color:#fff}.ie-step.active .ie-step-label{color:#1e293b;font-weight:600}.ie-step.done .ie-step-num{background:#22c55e;color:#fff}.ie-step.done .ie-step-label{color:#64748b}.ie-step:not(:last-child){flex:1 1 auto}.ie-step:not(:last-child):after{content:\"\";flex:1;height:1px;background:#e2e8f0;margin:0 8px;min-width:16px}.ie-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}.ie-source-step{display:flex;flex-direction:column;gap:16px}.ie-upload-area{display:flex;flex-direction:column;gap:12px}.ie-template-hint{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:.875rem;color:#64748b;background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:10px 14px}.ie-file-hidden{position:absolute;inset:0;width:100%;height:100%;margin:0;padding:0;opacity:0;overflow:hidden;cursor:pointer}.ie-dropzone{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:40px 24px;border:2px dashed #7c8ba1;border-radius:10px;cursor:pointer;transition:border-color .18s ease,background .18s ease}.ie-dropzone:hover,.ie-dropzone:focus-within{border-color:#3b82f6;background:#f0f7ff}.ie-dropzone:focus-within{outline:2px solid #3b82f6;outline-offset:2px}.ie-dropzone.has-error{border-color:#ef4444}.ie-dropzone-text{font-size:.9375rem;font-weight:600;color:#1e293b}.ie-dropzone-sub{font-size:.8125rem;color:#64748b}.ie-mapping{display:flex;flex-direction:column;gap:12px}.ie-mapping-hint{font-size:.875rem;color:#64748b;margin:0}.ie-mapping-success{display:flex;align-items:flex-start;gap:8px;padding:10px 14px;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:8px;font-size:.875rem;color:#15803d}.ie-mapping-success svg{flex-shrink:0;margin-top:1px;color:#16a34a}.ie-mapping-unmatched{display:flex;align-items:flex-start;gap:6px;font-size:.8125rem;color:#64748b;margin:0;padding-top:4px}.ie-mapping-unmatched svg{flex-shrink:0;margin-top:1px}.ie-mapping-unmatched em{font-style:normal;color:#475569}.ie-mapping-table{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.ie-mapping-header{display:grid;grid-template-columns:1fr 1fr 1fr;padding:8px 12px;background:#f8fafc;border-bottom:1px solid #e2e8f0;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase}.ie-mapping-row{display:grid;grid-template-columns:1fr 1fr 1fr;align-items:start;padding:8px 12px;border-bottom:1px solid #f1f5f9;gap:8px}.ie-mapping-row:last-child{border-bottom:none}.ie-mapping-row.ie-mapping-row--required-missing{background:#fff7ed}.ie-mapping-row.ie-mapping-row--required-missing .ie-field-label{color:#c2410c}.ie-match-icon{color:#16a34a;margin-right:4px;vertical-align:-1px}.ie-field-label{display:flex;flex-wrap:wrap;align-items:center;font-size:.875rem;color:#1e293b;font-weight:500}.ie-field-example{flex-basis:100%;font-weight:400}.ie-required{color:#dc2626;margin-left:2px}.ie-sample{font-size:.8125rem;color:#64748b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ie-preview{display:flex;flex-direction:column;gap:12px}.ie-preview-scroll{overflow-x:auto;border:1px solid #e2e8f0;border-radius:8px}.ie-preview-scroll:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.ie-result:focus,.ie-source-step:focus,.ie-upload-area:focus,.ie-mapping:focus,.ie-preview:focus{outline:none}.ie-result-list{list-style:none;margin:0;padding:0}.ie-preview-table{width:100%;border-collapse:collapse;font-size:.8125rem}.ie-preview-table th{background:#f8fafc;padding:8px 12px;text-align:left;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;border-bottom:1px solid #e2e8f0;white-space:nowrap}.ie-preview-table td{padding:7px 12px;color:#1e293b;border-bottom:1px solid #f1f5f9;max-width:160px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ie-preview-table tr:last-child td{border-bottom:none}.ie-result{display:flex;flex-direction:column;gap:16px}.ie-result-summary{display:flex;flex-direction:column;gap:8px}.ie-result-stat{display:flex;align-items:center;gap:10px;padding:12px 16px;border-radius:8px;font-size:.9375rem}.ie-result-stat.success{background:#f0fdf4;color:#15803d}.ie-result-stat.success svg{stroke:#22c55e}.ie-result-stat.error{background:#fef2f2;color:#b91c1c}.ie-result-stat.error svg{stroke:#ef4444}.ie-result-stat.warning{background:#fffbeb;color:#b45309}.ie-result-stat.warning svg{stroke:#f59e0b}.ie-progress{margin-top:14px}.ie-progress-track{height:6px;border-radius:999px;background:#e2e8f0;overflow:hidden;position:relative}.ie-progress-bar{position:absolute;inset:0 auto 0 0;width:35%;border-radius:999px;background:#2563eb;animation:ie-progress-slide 1.2s ease-in-out infinite}.ie-progress-text{margin:8px 0 0;font-size:.8125rem;color:#475569}@keyframes ie-progress-slide{0%{left:-35%}to{left:100%}}@media(prefers-reduced-motion:reduce){.ie-progress-bar{animation:none;width:100%;opacity:.5}}.ie-errors-list{border:1px solid #fecaca;border-radius:8px;overflow:hidden}.ie-errors-title{font-size:.8125rem;font-weight:600;color:#b91c1c;padding:8px 12px;background:#fef2f2;margin:0;border-bottom:1px solid #fecaca}.ie-error-row{display:flex;gap:12px;padding:7px 12px;border-bottom:1px solid #fff1f2;font-size:.8125rem;color:#374151}.ie-error-row:last-child{border-bottom:none}.ie-error-row-num{font-weight:600;color:#b91c1c;flex-shrink:0}.ie-warnings-list{border:1px solid #fde68a;border-radius:8px;overflow:hidden}.ie-warnings-title{font-size:.8125rem;font-weight:600;color:#b45309;padding:8px 12px;background:#fffbeb;margin:0;border-bottom:1px solid #fde68a}.ie-warning-row{display:flex;gap:12px;padding:7px 12px;border-bottom:1px solid #fef3c7;font-size:.8125rem;color:#374151}.ie-warning-row:last-child{border-bottom:none}.ie-warning-row-num{font-weight:600;color:#b45309;flex-shrink:0}.ie-error{font-size:.875rem;color:#dc2626;margin:0}.ie-footer-right{display:flex;gap:8px;align-items:center}@media(max-width:600px){.ie-step-label{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}.ie-dropzone{padding:24px 16px}.ie-mapping-header{grid-template-columns:1fr 1fr}.ie-mapping-header span:last-child{display:none}.ie-mapping-row{grid-template-columns:1fr 1fr}.ie-mapping-row .ie-sample{display:none}}\n"],
10657
10764
  dependencies: [
10658
10765
  {
10659
10766
  kind: "ngmodule",
@@ -10764,6 +10871,11 @@ var ImportExportComponent = class ImportExportComponent {
10764
10871
  "ariaLabel"
10765
10872
  ],
10766
10873
  outputs: ["sourceSelect"]
10874
+ },
10875
+ {
10876
+ kind: "component",
10877
+ type: HintComponent,
10878
+ selector: "ui-hint"
10767
10879
  }
10768
10880
  ],
10769
10881
  changeDetection: i0.ChangeDetectionStrategy.OnPush
@@ -10786,7 +10898,8 @@ i0.ɵɵngDeclareClassMetadata({
10786
10898
  ModalComponent,
10787
10899
  ButtonComponent,
10788
10900
  SelectComponent,
10789
- ImportSourceGridComponent
10901
+ ImportSourceGridComponent,
10902
+ HintComponent
10790
10903
  ],
10791
10904
  template: `
10792
10905
  <!-- Trigger buttons -->
@@ -10872,10 +10985,12 @@ i0.ɵɵngDeclareClassMetadata({
10872
10985
  }
10873
10986
  {{ field.label }}
10874
10987
  @if (field.required) { <span class="ie-required" aria-hidden="true">*</span> }
10988
+ @if (field.example) { <ui-hint class="ie-field-example" [attr.id]="exampleId(field)">e.g. {{ field.example }}</ui-hint> }
10875
10989
  </span>
10876
10990
  <div role="cell">
10877
10991
  <ui-select
10878
10992
  [ariaLabel]="field.label + ' column' + (field.required ? ', required' : '')"
10993
+ [ariaDescribedBy]="field.example ? exampleId(field) : ''"
10879
10994
  [options]="csvHeaderOptions"
10880
10995
  [(ngModel)]="columnMapping[field.key]"
10881
10996
  [error]="field.required && !columnMapping[field.key] ? 'Required' : ''" />
@@ -11028,7 +11143,7 @@ i0.ɵɵngDeclareClassMetadata({
11028
11143
 
11029
11144
  </ui-modal>
11030
11145
  `,
11031
- styles: [".ie-actions{display:flex;gap:8px}.ie-steps{display:flex;align-items:center;margin-bottom:24px;gap:0;list-style:none;padding:0}.ie-step{display:flex;align-items:center;gap:6px;flex-shrink:0}.ie-step-num{width:24px;height:24px;border-radius:50%;background:#e2e8f0;color:#64748b;font-size:.75rem;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0}.ie-step-label{font-size:.8125rem;color:#64748b;font-weight:500}.ie-step.active .ie-step-num{background:#3b82f6;color:#fff}.ie-step.active .ie-step-label{color:#1e293b;font-weight:600}.ie-step.done .ie-step-num{background:#22c55e;color:#fff}.ie-step.done .ie-step-label{color:#64748b}.ie-step:not(:last-child){flex:1 1 auto}.ie-step:not(:last-child):after{content:\"\";flex:1;height:1px;background:#e2e8f0;margin:0 8px;min-width:16px}.ie-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}.ie-source-step{display:flex;flex-direction:column;gap:16px}.ie-upload-area{display:flex;flex-direction:column;gap:12px}.ie-template-hint{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:.875rem;color:#64748b;background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:10px 14px}.ie-file-hidden{position:absolute;inset:0;width:100%;height:100%;margin:0;padding:0;opacity:0;overflow:hidden;cursor:pointer}.ie-dropzone{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:40px 24px;border:2px dashed #7c8ba1;border-radius:10px;cursor:pointer;transition:border-color .18s ease,background .18s ease}.ie-dropzone:hover,.ie-dropzone:focus-within{border-color:#3b82f6;background:#f0f7ff}.ie-dropzone:focus-within{outline:2px solid #3b82f6;outline-offset:2px}.ie-dropzone.has-error{border-color:#ef4444}.ie-dropzone-text{font-size:.9375rem;font-weight:600;color:#1e293b}.ie-dropzone-sub{font-size:.8125rem;color:#64748b}.ie-mapping{display:flex;flex-direction:column;gap:12px}.ie-mapping-hint{font-size:.875rem;color:#64748b;margin:0}.ie-mapping-success{display:flex;align-items:flex-start;gap:8px;padding:10px 14px;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:8px;font-size:.875rem;color:#15803d}.ie-mapping-success svg{flex-shrink:0;margin-top:1px;color:#16a34a}.ie-mapping-unmatched{display:flex;align-items:flex-start;gap:6px;font-size:.8125rem;color:#64748b;margin:0;padding-top:4px}.ie-mapping-unmatched svg{flex-shrink:0;margin-top:1px}.ie-mapping-unmatched em{font-style:normal;color:#475569}.ie-mapping-table{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.ie-mapping-header{display:grid;grid-template-columns:1fr 1fr 1fr;padding:8px 12px;background:#f8fafc;border-bottom:1px solid #e2e8f0;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase}.ie-mapping-row{display:grid;grid-template-columns:1fr 1fr 1fr;align-items:start;padding:8px 12px;border-bottom:1px solid #f1f5f9;gap:8px}.ie-mapping-row:last-child{border-bottom:none}.ie-mapping-row.ie-mapping-row--required-missing{background:#fff7ed}.ie-mapping-row.ie-mapping-row--required-missing .ie-field-label{color:#c2410c}.ie-match-icon{color:#16a34a;margin-right:4px;vertical-align:-1px}.ie-field-label{display:flex;align-items:center;font-size:.875rem;color:#1e293b;font-weight:500}.ie-required{color:#dc2626;margin-left:2px}.ie-sample{font-size:.8125rem;color:#64748b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ie-preview{display:flex;flex-direction:column;gap:12px}.ie-preview-scroll{overflow-x:auto;border:1px solid #e2e8f0;border-radius:8px}.ie-preview-scroll:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.ie-result:focus,.ie-source-step:focus,.ie-upload-area:focus,.ie-mapping:focus,.ie-preview:focus{outline:none}.ie-result-list{list-style:none;margin:0;padding:0}.ie-preview-table{width:100%;border-collapse:collapse;font-size:.8125rem}.ie-preview-table th{background:#f8fafc;padding:8px 12px;text-align:left;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;border-bottom:1px solid #e2e8f0;white-space:nowrap}.ie-preview-table td{padding:7px 12px;color:#1e293b;border-bottom:1px solid #f1f5f9;max-width:160px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ie-preview-table tr:last-child td{border-bottom:none}.ie-result{display:flex;flex-direction:column;gap:16px}.ie-result-summary{display:flex;flex-direction:column;gap:8px}.ie-result-stat{display:flex;align-items:center;gap:10px;padding:12px 16px;border-radius:8px;font-size:.9375rem}.ie-result-stat.success{background:#f0fdf4;color:#15803d}.ie-result-stat.success svg{stroke:#22c55e}.ie-result-stat.error{background:#fef2f2;color:#b91c1c}.ie-result-stat.error svg{stroke:#ef4444}.ie-result-stat.warning{background:#fffbeb;color:#b45309}.ie-result-stat.warning svg{stroke:#f59e0b}.ie-progress{margin-top:14px}.ie-progress-track{height:6px;border-radius:999px;background:#e2e8f0;overflow:hidden;position:relative}.ie-progress-bar{position:absolute;inset:0 auto 0 0;width:35%;border-radius:999px;background:#2563eb;animation:ie-progress-slide 1.2s ease-in-out infinite}.ie-progress-text{margin:8px 0 0;font-size:.8125rem;color:#475569}@keyframes ie-progress-slide{0%{left:-35%}to{left:100%}}@media(prefers-reduced-motion:reduce){.ie-progress-bar{animation:none;width:100%;opacity:.5}}.ie-errors-list{border:1px solid #fecaca;border-radius:8px;overflow:hidden}.ie-errors-title{font-size:.8125rem;font-weight:600;color:#b91c1c;padding:8px 12px;background:#fef2f2;margin:0;border-bottom:1px solid #fecaca}.ie-error-row{display:flex;gap:12px;padding:7px 12px;border-bottom:1px solid #fff1f2;font-size:.8125rem;color:#374151}.ie-error-row:last-child{border-bottom:none}.ie-error-row-num{font-weight:600;color:#b91c1c;flex-shrink:0}.ie-warnings-list{border:1px solid #fde68a;border-radius:8px;overflow:hidden}.ie-warnings-title{font-size:.8125rem;font-weight:600;color:#b45309;padding:8px 12px;background:#fffbeb;margin:0;border-bottom:1px solid #fde68a}.ie-warning-row{display:flex;gap:12px;padding:7px 12px;border-bottom:1px solid #fef3c7;font-size:.8125rem;color:#374151}.ie-warning-row:last-child{border-bottom:none}.ie-warning-row-num{font-weight:600;color:#b45309;flex-shrink:0}.ie-error{font-size:.875rem;color:#dc2626;margin:0}.ie-footer-right{display:flex;gap:8px;align-items:center}@media(max-width:600px){.ie-step-label{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}.ie-dropzone{padding:24px 16px}.ie-mapping-header{grid-template-columns:1fr 1fr}.ie-mapping-header span:last-child{display:none}.ie-mapping-row{grid-template-columns:1fr 1fr}.ie-mapping-row .ie-sample{display:none}}\n"]
11146
+ styles: [".ie-actions{display:flex;gap:8px}.ie-steps{display:flex;align-items:center;margin-bottom:24px;gap:0;list-style:none;padding:0}.ie-step{display:flex;align-items:center;gap:6px;flex-shrink:0}.ie-step-num{width:24px;height:24px;border-radius:50%;background:#e2e8f0;color:#64748b;font-size:.75rem;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0}.ie-step-label{font-size:.8125rem;color:#64748b;font-weight:500}.ie-step.active .ie-step-num{background:#3b82f6;color:#fff}.ie-step.active .ie-step-label{color:#1e293b;font-weight:600}.ie-step.done .ie-step-num{background:#22c55e;color:#fff}.ie-step.done .ie-step-label{color:#64748b}.ie-step:not(:last-child){flex:1 1 auto}.ie-step:not(:last-child):after{content:\"\";flex:1;height:1px;background:#e2e8f0;margin:0 8px;min-width:16px}.ie-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}.ie-source-step{display:flex;flex-direction:column;gap:16px}.ie-upload-area{display:flex;flex-direction:column;gap:12px}.ie-template-hint{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:.875rem;color:#64748b;background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:10px 14px}.ie-file-hidden{position:absolute;inset:0;width:100%;height:100%;margin:0;padding:0;opacity:0;overflow:hidden;cursor:pointer}.ie-dropzone{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:40px 24px;border:2px dashed #7c8ba1;border-radius:10px;cursor:pointer;transition:border-color .18s ease,background .18s ease}.ie-dropzone:hover,.ie-dropzone:focus-within{border-color:#3b82f6;background:#f0f7ff}.ie-dropzone:focus-within{outline:2px solid #3b82f6;outline-offset:2px}.ie-dropzone.has-error{border-color:#ef4444}.ie-dropzone-text{font-size:.9375rem;font-weight:600;color:#1e293b}.ie-dropzone-sub{font-size:.8125rem;color:#64748b}.ie-mapping{display:flex;flex-direction:column;gap:12px}.ie-mapping-hint{font-size:.875rem;color:#64748b;margin:0}.ie-mapping-success{display:flex;align-items:flex-start;gap:8px;padding:10px 14px;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:8px;font-size:.875rem;color:#15803d}.ie-mapping-success svg{flex-shrink:0;margin-top:1px;color:#16a34a}.ie-mapping-unmatched{display:flex;align-items:flex-start;gap:6px;font-size:.8125rem;color:#64748b;margin:0;padding-top:4px}.ie-mapping-unmatched svg{flex-shrink:0;margin-top:1px}.ie-mapping-unmatched em{font-style:normal;color:#475569}.ie-mapping-table{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.ie-mapping-header{display:grid;grid-template-columns:1fr 1fr 1fr;padding:8px 12px;background:#f8fafc;border-bottom:1px solid #e2e8f0;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase}.ie-mapping-row{display:grid;grid-template-columns:1fr 1fr 1fr;align-items:start;padding:8px 12px;border-bottom:1px solid #f1f5f9;gap:8px}.ie-mapping-row:last-child{border-bottom:none}.ie-mapping-row.ie-mapping-row--required-missing{background:#fff7ed}.ie-mapping-row.ie-mapping-row--required-missing .ie-field-label{color:#c2410c}.ie-match-icon{color:#16a34a;margin-right:4px;vertical-align:-1px}.ie-field-label{display:flex;flex-wrap:wrap;align-items:center;font-size:.875rem;color:#1e293b;font-weight:500}.ie-field-example{flex-basis:100%;font-weight:400}.ie-required{color:#dc2626;margin-left:2px}.ie-sample{font-size:.8125rem;color:#64748b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ie-preview{display:flex;flex-direction:column;gap:12px}.ie-preview-scroll{overflow-x:auto;border:1px solid #e2e8f0;border-radius:8px}.ie-preview-scroll:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.ie-result:focus,.ie-source-step:focus,.ie-upload-area:focus,.ie-mapping:focus,.ie-preview:focus{outline:none}.ie-result-list{list-style:none;margin:0;padding:0}.ie-preview-table{width:100%;border-collapse:collapse;font-size:.8125rem}.ie-preview-table th{background:#f8fafc;padding:8px 12px;text-align:left;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;border-bottom:1px solid #e2e8f0;white-space:nowrap}.ie-preview-table td{padding:7px 12px;color:#1e293b;border-bottom:1px solid #f1f5f9;max-width:160px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ie-preview-table tr:last-child td{border-bottom:none}.ie-result{display:flex;flex-direction:column;gap:16px}.ie-result-summary{display:flex;flex-direction:column;gap:8px}.ie-result-stat{display:flex;align-items:center;gap:10px;padding:12px 16px;border-radius:8px;font-size:.9375rem}.ie-result-stat.success{background:#f0fdf4;color:#15803d}.ie-result-stat.success svg{stroke:#22c55e}.ie-result-stat.error{background:#fef2f2;color:#b91c1c}.ie-result-stat.error svg{stroke:#ef4444}.ie-result-stat.warning{background:#fffbeb;color:#b45309}.ie-result-stat.warning svg{stroke:#f59e0b}.ie-progress{margin-top:14px}.ie-progress-track{height:6px;border-radius:999px;background:#e2e8f0;overflow:hidden;position:relative}.ie-progress-bar{position:absolute;inset:0 auto 0 0;width:35%;border-radius:999px;background:#2563eb;animation:ie-progress-slide 1.2s ease-in-out infinite}.ie-progress-text{margin:8px 0 0;font-size:.8125rem;color:#475569}@keyframes ie-progress-slide{0%{left:-35%}to{left:100%}}@media(prefers-reduced-motion:reduce){.ie-progress-bar{animation:none;width:100%;opacity:.5}}.ie-errors-list{border:1px solid #fecaca;border-radius:8px;overflow:hidden}.ie-errors-title{font-size:.8125rem;font-weight:600;color:#b91c1c;padding:8px 12px;background:#fef2f2;margin:0;border-bottom:1px solid #fecaca}.ie-error-row{display:flex;gap:12px;padding:7px 12px;border-bottom:1px solid #fff1f2;font-size:.8125rem;color:#374151}.ie-error-row:last-child{border-bottom:none}.ie-error-row-num{font-weight:600;color:#b91c1c;flex-shrink:0}.ie-warnings-list{border:1px solid #fde68a;border-radius:8px;overflow:hidden}.ie-warnings-title{font-size:.8125rem;font-weight:600;color:#b45309;padding:8px 12px;background:#fffbeb;margin:0;border-bottom:1px solid #fde68a}.ie-warning-row{display:flex;gap:12px;padding:7px 12px;border-bottom:1px solid #fef3c7;font-size:.8125rem;color:#374151}.ie-warning-row:last-child{border-bottom:none}.ie-warning-row-num{font-weight:600;color:#b45309;flex-shrink:0}.ie-error{font-size:.875rem;color:#dc2626;margin:0}.ie-footer-right{display:flex;gap:8px;align-items:center}@media(max-width:600px){.ie-step-label{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}.ie-dropzone{padding:24px 16px}.ie-mapping-header{grid-template-columns:1fr 1fr}.ie-mapping-header span:last-child{display:none}.ie-mapping-row{grid-template-columns:1fr 1fr}.ie-mapping-row .ie-sample{display:none}}\n"]
11032
11147
  }]
11033
11148
  }],
11034
11149
  ctorParameters: () => [],
@@ -13991,7 +14106,8 @@ var DataTableComponent = class DataTableComponent {
13991
14106
  <span class="dt-tags">
13992
14107
  <ui-badge
13993
14108
  [label]="tags[0].name"
13994
- [variant]="tags[0].variant ?? null" />
14109
+ [variant]="tags[0].variant ?? null"
14110
+ [color]="tags[0].color ?? null" />
13995
14111
  @if (tags.length > 1) {
13996
14112
  <span
13997
14113
  class="dt-tags-more"
@@ -14304,7 +14420,7 @@ var DataTableComponent = class DataTableComponent {
14304
14420
  [style.left.px]="_tagTooltip()!.x"
14305
14421
  [style.top.px]="_tagTooltip()!.y">
14306
14422
  @for (tag of _tagTooltip()!.tags; track tag.name) {
14307
- <ui-badge [label]="tag.name" [variant]="tag.variant ?? 'gray'" />
14423
+ <ui-badge [label]="tag.name" [variant]="tag.variant ?? 'gray'" [color]="tag.color ?? null" />
14308
14424
  }
14309
14425
  </div>
14310
14426
  }
@@ -14440,7 +14556,11 @@ var DataTableComponent = class DataTableComponent {
14440
14556
  kind: "component",
14441
14557
  type: BadgeComponent,
14442
14558
  selector: "ui-badge",
14443
- inputs: ["label", "variant"]
14559
+ inputs: [
14560
+ "label",
14561
+ "variant",
14562
+ "color"
14563
+ ]
14444
14564
  },
14445
14565
  {
14446
14566
  kind: "component",
@@ -15081,7 +15201,8 @@ i0.ɵɵngDeclareClassMetadata({
15081
15201
  <span class="dt-tags">
15082
15202
  <ui-badge
15083
15203
  [label]="tags[0].name"
15084
- [variant]="tags[0].variant ?? null" />
15204
+ [variant]="tags[0].variant ?? null"
15205
+ [color]="tags[0].color ?? null" />
15085
15206
  @if (tags.length > 1) {
15086
15207
  <span
15087
15208
  class="dt-tags-more"
@@ -15394,7 +15515,7 @@ i0.ɵɵngDeclareClassMetadata({
15394
15515
  [style.left.px]="_tagTooltip()!.x"
15395
15516
  [style.top.px]="_tagTooltip()!.y">
15396
15517
  @for (tag of _tagTooltip()!.tags; track tag.name) {
15397
- <ui-badge [label]="tag.name" [variant]="tag.variant ?? 'gray'" />
15518
+ <ui-badge [label]="tag.name" [variant]="tag.variant ?? 'gray'" [color]="tag.color ?? null" />
15398
15519
  }
15399
15520
  </div>
15400
15521
  }
@@ -16002,8 +16123,8 @@ var SidePanelComponent = class SidePanelComponent {
16002
16123
  <!-- Header -->
16003
16124
  <div class="sp-header">
16004
16125
  <div class="sp-header-text">
16005
- <h2 class="sp-title" [id]="titleId">{{ title() }}</h2>
16006
- @if (subtitle()) { <p class="sp-subtitle">{{ subtitle() }}</p> }
16126
+ <h2 class="sp-title" data-testid="side-panel-title" [id]="titleId">{{ title() }}</h2>
16127
+ @if (subtitle()) { <p class="sp-subtitle" data-testid="side-panel-subtitle">{{ subtitle() }}</p> }
16007
16128
  </div>
16008
16129
  <button class="sp-close" type="button" (click)="closed.emit()" aria-label="Dismiss panel">
16009
16130
  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
@@ -16094,8 +16215,8 @@ i0.ɵɵngDeclareClassMetadata({
16094
16215
  <!-- Header -->
16095
16216
  <div class="sp-header">
16096
16217
  <div class="sp-header-text">
16097
- <h2 class="sp-title" [id]="titleId">{{ title() }}</h2>
16098
- @if (subtitle()) { <p class="sp-subtitle">{{ subtitle() }}</p> }
16218
+ <h2 class="sp-title" data-testid="side-panel-title" [id]="titleId">{{ title() }}</h2>
16219
+ @if (subtitle()) { <p class="sp-subtitle" data-testid="side-panel-subtitle">{{ subtitle() }}</p> }
16099
16220
  </div>
16100
16221
  <button class="sp-close" type="button" (click)="closed.emit()" aria-label="Dismiss panel">
16101
16222
  <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
@@ -20098,7 +20219,11 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
20098
20219
  kind: "component",
20099
20220
  type: BadgeComponent,
20100
20221
  selector: "ui-badge",
20101
- inputs: ["label", "variant"]
20222
+ inputs: [
20223
+ "label",
20224
+ "variant",
20225
+ "color"
20226
+ ]
20102
20227
  },
20103
20228
  {
20104
20229
  kind: "component",
@@ -20503,6 +20628,12 @@ function pillTabId(name, key) {
20503
20628
  function pillTabPanelId(name, key) {
20504
20629
  return `${name}-panel-${key}`;
20505
20630
  }
20631
+ function pillTabTitleId(name) {
20632
+ return `${name}--title`;
20633
+ }
20634
+ function pillTabDescriptionId(name) {
20635
+ return `${name}--description`;
20636
+ }
20506
20637
  var PillTabPanelDirective = class PillTabPanelDirective {
20507
20638
  constructor() {
20508
20639
  this.key = input.required({
@@ -20512,6 +20643,10 @@ var PillTabPanelDirective = class PillTabPanelDirective {
20512
20643
  this.tabsName = input.required(...ngDevMode ? [{ debugName: "tabsName" }] : /* istanbul ignore next */ []);
20513
20644
  this.activeKey = input(null, ...ngDevMode ? [{ debugName: "activeKey" }] : /* istanbul ignore next */ []);
20514
20645
  this.tabbable = input(false, ...ngDevMode ? [{ debugName: "tabbable" }] : /* istanbul ignore next */ []);
20646
+ this.describedByHeader = input(false, ...ngDevMode ? [{ debugName: "describedByHeader" }] : /* istanbul ignore next */ []);
20647
+ }
20648
+ describedId() {
20649
+ return this.describedByHeader() && !this.isHidden() ? pillTabDescriptionId(this.tabsName()) : null;
20515
20650
  }
20516
20651
  panelId() {
20517
20652
  return pillTabPanelId(this.tabsName(), this.key());
@@ -20568,6 +20703,13 @@ var PillTabPanelDirective = class PillTabPanelDirective {
20568
20703
  isSignal: true,
20569
20704
  isRequired: false,
20570
20705
  transformFunction: null
20706
+ },
20707
+ describedByHeader: {
20708
+ classPropertyName: "describedByHeader",
20709
+ publicName: "describedByHeader",
20710
+ isSignal: true,
20711
+ isRequired: false,
20712
+ transformFunction: null
20571
20713
  }
20572
20714
  },
20573
20715
  host: {
@@ -20576,6 +20718,7 @@ var PillTabPanelDirective = class PillTabPanelDirective {
20576
20718
  "id": "panelId()",
20577
20719
  "attr.aria-labelledby": "tabId()",
20578
20720
  "attr.hidden": "isHidden() ? '' : null",
20721
+ "attr.aria-describedby": "describedId()",
20579
20722
  "attr.tabindex": "tabbable() ? 0 : null"
20580
20723
  }
20581
20724
  },
@@ -20598,6 +20741,7 @@ i0.ɵɵngDeclareClassMetadata({
20598
20741
  "[id]": "panelId()",
20599
20742
  "[attr.aria-labelledby]": "tabId()",
20600
20743
  "[attr.hidden]": "isHidden() ? '' : null",
20744
+ "[attr.aria-describedby]": "describedId()",
20601
20745
  "[attr.tabindex]": "tabbable() ? 0 : null"
20602
20746
  }
20603
20747
  }]
@@ -20634,10 +20778,24 @@ i0.ɵɵngDeclareClassMetadata({
20634
20778
  alias: "tabbable",
20635
20779
  required: false
20636
20780
  }]
20781
+ }],
20782
+ describedByHeader: [{
20783
+ type: i0.Input,
20784
+ args: [{
20785
+ isSignal: true,
20786
+ alias: "describedByHeader",
20787
+ required: false
20788
+ }]
20637
20789
  }]
20638
20790
  }
20639
20791
  });
20640
20792
  var PillTabsComponent = class PillTabsComponent {
20793
+ titleId() {
20794
+ return pillTabTitleId(this.name());
20795
+ }
20796
+ descriptionId() {
20797
+ return pillTabDescriptionId(this.name());
20798
+ }
20641
20799
  constructor() {
20642
20800
  this.host = inject(ElementRef);
20643
20801
  this.tabs = input([], ...ngDevMode ? [{ debugName: "tabs" }] : /* istanbul ignore next */ []);
@@ -20648,7 +20806,10 @@ var PillTabsComponent = class PillTabsComponent {
20648
20806
  this.orientation = input("horizontal", ...ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []);
20649
20807
  this.vertical = () => this.orientation() === "vertical";
20650
20808
  this.controlsPanels = input(false, ...ngDevMode ? [{ debugName: "controlsPanels" }] : /* istanbul ignore next */ []);
20809
+ this.showDescription = input(false, ...ngDevMode ? [{ debugName: "showDescription" }] : /* istanbul ignore next */ []);
20810
+ this.headingLevel = input(2, ...ngDevMode ? [{ debugName: "headingLevel" }] : /* istanbul ignore next */ []);
20651
20811
  this.tabChange = output();
20812
+ this.activeTab = computed(() => this.tabs().find((t) => t.key === this.activeKey()) ?? null, ...ngDevMode ? [{ debugName: "activeTab" }] : /* istanbul ignore next */ []);
20652
20813
  this.canScrollStart = signal(false, ...ngDevMode ? [{ debugName: "canScrollStart" }] : /* istanbul ignore next */ []);
20653
20814
  this.canScrollEnd = signal(false, ...ngDevMode ? [{ debugName: "canScrollEnd" }] : /* istanbul ignore next */ []);
20654
20815
  const destroyRef = inject(DestroyRef);
@@ -20782,6 +20943,20 @@ var PillTabsComponent = class PillTabsComponent {
20782
20943
  isSignal: true,
20783
20944
  isRequired: false,
20784
20945
  transformFunction: null
20946
+ },
20947
+ showDescription: {
20948
+ classPropertyName: "showDescription",
20949
+ publicName: "showDescription",
20950
+ isSignal: true,
20951
+ isRequired: false,
20952
+ transformFunction: null
20953
+ },
20954
+ headingLevel: {
20955
+ classPropertyName: "headingLevel",
20956
+ publicName: "headingLevel",
20957
+ isSignal: true,
20958
+ isRequired: false,
20959
+ transformFunction: null
20785
20960
  }
20786
20961
  },
20787
20962
  outputs: { tabChange: "tabChange" },
@@ -20816,9 +20991,23 @@ var PillTabsComponent = class PillTabsComponent {
20816
20991
  <span class="pill-fade pill-fade--start" [class.visible]="canScrollStart()" aria-hidden="true" data-testid="pill-fade-start"></span>
20817
20992
  <span class="pill-fade pill-fade--end" [class.visible]="canScrollEnd()" aria-hidden="true" data-testid="pill-fade-end"></span>
20818
20993
  </div>
20994
+ @if (showDescription() && (activeTab()?.title || activeTab()?.description)) {
20995
+ <div class="pill-header" data-testid="pill-header">
20996
+ @if (activeTab()?.title) {
20997
+ @if (headingLevel() === 3) {
20998
+ <h3 class="pill-header-title" [id]="titleId()" data-testid="pill-header-title">{{ activeTab()!.title }}</h3>
20999
+ } @else {
21000
+ <h2 class="pill-header-title" [id]="titleId()" data-testid="pill-header-title">{{ activeTab()!.title }}</h2>
21001
+ }
21002
+ }
21003
+ @if (activeTab()?.description) {
21004
+ <p class="pill-header-description" [id]="descriptionId()" data-testid="pill-header-description">{{ activeTab()!.description }}</p>
21005
+ }
21006
+ </div>
21007
+ }
20819
21008
  `,
20820
21009
  isInline: true,
20821
- styles: [".pill-wrap{position:relative}.pill-fade{position:absolute;top:0;bottom:0;width:28px;pointer-events:none;opacity:0;transition:opacity .15s}.pill-fade.visible{opacity:1}.pill-fade--start{left:0;background:linear-gradient(to right,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-fade--end{right:0;background:linear-gradient(to left,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-tabs{display:flex;gap:8px;flex-wrap:wrap}@media(max-width:768px){.pill-tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:2px;scrollbar-width:none}.pill-tabs::-webkit-scrollbar{display:none}}.pill-tabs--nowrap .pill-tab{flex:0 0 auto;white-space:nowrap}.pill-tab{position:relative;display:inline-flex;align-items:center;gap:6px;padding:7px 16px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;transition:all .15s;font-family:inherit}.pill-tab:hover:not(.disabled):not(.active){background:#f8fafc;border-color:#94a3b8}.pill-tab:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pill-tab .pill-count{background:#e2e8f0;color:#475569;font-size:.7rem;font-weight:600;padding:1px 6px;border-radius:999px;line-height:1.4}.pill-tab.active{background:#1e293b;color:#fff;border-color:#1e293b}.pill-tab.active .pill-count{background:#fff3;color:#fff}.pill-tab.active:hover{background:#1e293b;color:#fff}.pill-tab.disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.pill-tab .pill-info-icon{flex-shrink:0;opacity:.7}.pill-tab:hover .pill-info-icon,.pill-tab:focus-visible .pill-info-icon{opacity:1}.pill-tab .pill-info-tip{position:absolute;left:0;top:calc(100% + 8px);z-index:20;width:max-content;max-width:280px;padding:8px 12px;border-radius:8px;background:#1e293b;color:#fff;font-size:.75rem;font-weight:400;line-height:1.45;text-align:left;white-space:normal;box-shadow:0 4px 12px #0f172a40;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .12s,visibility .12s}.pill-tab:hover .pill-info-tip,.pill-tab:focus-visible .pill-info-tip{opacity:1;visibility:visible}.pill-tab:last-child .pill-info-tip{left:auto;right:0}.pill-wrap--vertical .pill-fade{display:none}.pill-tabs.pill-tabs--vertical{flex-direction:column;flex-wrap:nowrap;overflow:visible;gap:4px;padding-bottom:0}.pill-tabs--vertical .pill-tab{width:100%;justify-content:flex-start;border-radius:10px;text-align:left}.pill-tabs--vertical .pill-tab .pill-count{margin-left:auto}.pill-tabs--vertical .pill-tab .pill-info-tip{left:calc(100% + 8px);top:50%;transform:translateY(-50%)}.pill-tabs--vertical .pill-tab:last-child .pill-info-tip{left:calc(100% + 8px);right:auto}@media(pointer:coarse),(max-width:480px){.pill-tab{min-height:44px}}\n"],
21010
+ styles: [".pill-header{margin-top:16px;min-width:0}.pill-header-title{margin:0;font-size:1.125rem;font-weight:600;line-height:1.3;color:var(--ui-text, #1e293b);overflow-wrap:anywhere}.pill-header-description{margin:4px 0 0;font-size:.875rem;line-height:1.5;color:var(--ui-text-muted, #475569);overflow-wrap:anywhere}.pill-wrap{position:relative}.pill-fade{position:absolute;top:0;bottom:0;width:28px;pointer-events:none;opacity:0;transition:opacity .15s}.pill-fade.visible{opacity:1}.pill-fade--start{left:0;background:linear-gradient(to right,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-fade--end{right:0;background:linear-gradient(to left,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-tabs{display:flex;gap:8px;flex-wrap:wrap}@media(max-width:768px){.pill-tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:2px;scrollbar-width:none}.pill-tabs::-webkit-scrollbar{display:none}}.pill-tabs--nowrap .pill-tab{flex:0 0 auto;white-space:nowrap}.pill-tab{position:relative;display:inline-flex;align-items:center;gap:6px;padding:7px 16px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;transition:all .15s;font-family:inherit}.pill-tab:hover:not(.disabled):not(.active){background:#f8fafc;border-color:#94a3b8}.pill-tab:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pill-tab .pill-count{background:#e2e8f0;color:#475569;font-size:.7rem;font-weight:600;padding:1px 6px;border-radius:999px;line-height:1.4}.pill-tab.active{background:#1e293b;color:#fff;border-color:#1e293b}.pill-tab.active .pill-count{background:#fff3;color:#fff}.pill-tab.active:hover{background:#1e293b;color:#fff}.pill-tab.disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.pill-tab .pill-info-icon{flex-shrink:0;opacity:.7}.pill-tab:hover .pill-info-icon,.pill-tab:focus-visible .pill-info-icon{opacity:1}.pill-tab .pill-info-tip{position:absolute;left:0;top:calc(100% + 8px);z-index:20;width:max-content;max-width:280px;padding:8px 12px;border-radius:8px;background:#1e293b;color:#fff;font-size:.75rem;font-weight:400;line-height:1.45;text-align:left;white-space:normal;box-shadow:0 4px 12px #0f172a40;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .12s,visibility .12s}.pill-tab:hover .pill-info-tip,.pill-tab:focus-visible .pill-info-tip{opacity:1;visibility:visible}.pill-tab:last-child .pill-info-tip{left:auto;right:0}.pill-wrap--vertical .pill-fade{display:none}.pill-tabs.pill-tabs--vertical{flex-direction:column;flex-wrap:nowrap;overflow:visible;gap:4px;padding-bottom:0}.pill-tabs--vertical .pill-tab{width:100%;justify-content:flex-start;border-radius:10px;text-align:left}.pill-tabs--vertical .pill-tab .pill-count{margin-left:auto}.pill-tabs--vertical .pill-tab .pill-info-tip{left:calc(100% + 8px);top:50%;transform:translateY(-50%)}.pill-tabs--vertical .pill-tab:last-child .pill-info-tip{left:calc(100% + 8px);right:auto}@media(pointer:coarse),(max-width:480px){.pill-tab{min-height:44px}}\n"],
20822
21011
  changeDetection: i0.ChangeDetectionStrategy.OnPush
20823
21012
  });
20824
21013
  }
@@ -20864,8 +21053,22 @@ i0.ɵɵngDeclareClassMetadata({
20864
21053
  <span class="pill-fade pill-fade--start" [class.visible]="canScrollStart()" aria-hidden="true" data-testid="pill-fade-start"></span>
20865
21054
  <span class="pill-fade pill-fade--end" [class.visible]="canScrollEnd()" aria-hidden="true" data-testid="pill-fade-end"></span>
20866
21055
  </div>
21056
+ @if (showDescription() && (activeTab()?.title || activeTab()?.description)) {
21057
+ <div class="pill-header" data-testid="pill-header">
21058
+ @if (activeTab()?.title) {
21059
+ @if (headingLevel() === 3) {
21060
+ <h3 class="pill-header-title" [id]="titleId()" data-testid="pill-header-title">{{ activeTab()!.title }}</h3>
21061
+ } @else {
21062
+ <h2 class="pill-header-title" [id]="titleId()" data-testid="pill-header-title">{{ activeTab()!.title }}</h2>
21063
+ }
21064
+ }
21065
+ @if (activeTab()?.description) {
21066
+ <p class="pill-header-description" [id]="descriptionId()" data-testid="pill-header-description">{{ activeTab()!.description }}</p>
21067
+ }
21068
+ </div>
21069
+ }
20867
21070
  `,
20868
- styles: [".pill-wrap{position:relative}.pill-fade{position:absolute;top:0;bottom:0;width:28px;pointer-events:none;opacity:0;transition:opacity .15s}.pill-fade.visible{opacity:1}.pill-fade--start{left:0;background:linear-gradient(to right,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-fade--end{right:0;background:linear-gradient(to left,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-tabs{display:flex;gap:8px;flex-wrap:wrap}@media(max-width:768px){.pill-tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:2px;scrollbar-width:none}.pill-tabs::-webkit-scrollbar{display:none}}.pill-tabs--nowrap .pill-tab{flex:0 0 auto;white-space:nowrap}.pill-tab{position:relative;display:inline-flex;align-items:center;gap:6px;padding:7px 16px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;transition:all .15s;font-family:inherit}.pill-tab:hover:not(.disabled):not(.active){background:#f8fafc;border-color:#94a3b8}.pill-tab:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pill-tab .pill-count{background:#e2e8f0;color:#475569;font-size:.7rem;font-weight:600;padding:1px 6px;border-radius:999px;line-height:1.4}.pill-tab.active{background:#1e293b;color:#fff;border-color:#1e293b}.pill-tab.active .pill-count{background:#fff3;color:#fff}.pill-tab.active:hover{background:#1e293b;color:#fff}.pill-tab.disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.pill-tab .pill-info-icon{flex-shrink:0;opacity:.7}.pill-tab:hover .pill-info-icon,.pill-tab:focus-visible .pill-info-icon{opacity:1}.pill-tab .pill-info-tip{position:absolute;left:0;top:calc(100% + 8px);z-index:20;width:max-content;max-width:280px;padding:8px 12px;border-radius:8px;background:#1e293b;color:#fff;font-size:.75rem;font-weight:400;line-height:1.45;text-align:left;white-space:normal;box-shadow:0 4px 12px #0f172a40;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .12s,visibility .12s}.pill-tab:hover .pill-info-tip,.pill-tab:focus-visible .pill-info-tip{opacity:1;visibility:visible}.pill-tab:last-child .pill-info-tip{left:auto;right:0}.pill-wrap--vertical .pill-fade{display:none}.pill-tabs.pill-tabs--vertical{flex-direction:column;flex-wrap:nowrap;overflow:visible;gap:4px;padding-bottom:0}.pill-tabs--vertical .pill-tab{width:100%;justify-content:flex-start;border-radius:10px;text-align:left}.pill-tabs--vertical .pill-tab .pill-count{margin-left:auto}.pill-tabs--vertical .pill-tab .pill-info-tip{left:calc(100% + 8px);top:50%;transform:translateY(-50%)}.pill-tabs--vertical .pill-tab:last-child .pill-info-tip{left:calc(100% + 8px);right:auto}@media(pointer:coarse),(max-width:480px){.pill-tab{min-height:44px}}\n"]
21071
+ styles: [".pill-header{margin-top:16px;min-width:0}.pill-header-title{margin:0;font-size:1.125rem;font-weight:600;line-height:1.3;color:var(--ui-text, #1e293b);overflow-wrap:anywhere}.pill-header-description{margin:4px 0 0;font-size:.875rem;line-height:1.5;color:var(--ui-text-muted, #475569);overflow-wrap:anywhere}.pill-wrap{position:relative}.pill-fade{position:absolute;top:0;bottom:0;width:28px;pointer-events:none;opacity:0;transition:opacity .15s}.pill-fade.visible{opacity:1}.pill-fade--start{left:0;background:linear-gradient(to right,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-fade--end{right:0;background:linear-gradient(to left,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-tabs{display:flex;gap:8px;flex-wrap:wrap}@media(max-width:768px){.pill-tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:2px;scrollbar-width:none}.pill-tabs::-webkit-scrollbar{display:none}}.pill-tabs--nowrap .pill-tab{flex:0 0 auto;white-space:nowrap}.pill-tab{position:relative;display:inline-flex;align-items:center;gap:6px;padding:7px 16px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;transition:all .15s;font-family:inherit}.pill-tab:hover:not(.disabled):not(.active){background:#f8fafc;border-color:#94a3b8}.pill-tab:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pill-tab .pill-count{background:#e2e8f0;color:#475569;font-size:.7rem;font-weight:600;padding:1px 6px;border-radius:999px;line-height:1.4}.pill-tab.active{background:#1e293b;color:#fff;border-color:#1e293b}.pill-tab.active .pill-count{background:#fff3;color:#fff}.pill-tab.active:hover{background:#1e293b;color:#fff}.pill-tab.disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.pill-tab .pill-info-icon{flex-shrink:0;opacity:.7}.pill-tab:hover .pill-info-icon,.pill-tab:focus-visible .pill-info-icon{opacity:1}.pill-tab .pill-info-tip{position:absolute;left:0;top:calc(100% + 8px);z-index:20;width:max-content;max-width:280px;padding:8px 12px;border-radius:8px;background:#1e293b;color:#fff;font-size:.75rem;font-weight:400;line-height:1.45;text-align:left;white-space:normal;box-shadow:0 4px 12px #0f172a40;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .12s,visibility .12s}.pill-tab:hover .pill-info-tip,.pill-tab:focus-visible .pill-info-tip{opacity:1;visibility:visible}.pill-tab:last-child .pill-info-tip{left:auto;right:0}.pill-wrap--vertical .pill-fade{display:none}.pill-tabs.pill-tabs--vertical{flex-direction:column;flex-wrap:nowrap;overflow:visible;gap:4px;padding-bottom:0}.pill-tabs--vertical .pill-tab{width:100%;justify-content:flex-start;border-radius:10px;text-align:left}.pill-tabs--vertical .pill-tab .pill-count{margin-left:auto}.pill-tabs--vertical .pill-tab .pill-info-tip{left:calc(100% + 8px);top:50%;transform:translateY(-50%)}.pill-tabs--vertical .pill-tab:last-child .pill-info-tip{left:calc(100% + 8px);right:auto}@media(pointer:coarse),(max-width:480px){.pill-tab{min-height:44px}}\n"]
20869
21072
  }]
20870
21073
  }],
20871
21074
  ctorParameters: () => [],
@@ -20926,6 +21129,22 @@ i0.ɵɵngDeclareClassMetadata({
20926
21129
  required: false
20927
21130
  }]
20928
21131
  }],
21132
+ showDescription: [{
21133
+ type: i0.Input,
21134
+ args: [{
21135
+ isSignal: true,
21136
+ alias: "showDescription",
21137
+ required: false
21138
+ }]
21139
+ }],
21140
+ headingLevel: [{
21141
+ type: i0.Input,
21142
+ args: [{
21143
+ isSignal: true,
21144
+ alias: "headingLevel",
21145
+ required: false
21146
+ }]
21147
+ }],
20929
21148
  tabChange: [{
20930
21149
  type: i0.Output,
20931
21150
  args: ["tabChange"]
@@ -25893,6 +26112,7 @@ var TimeInputComponent = class TimeInputComponent {
25893
26112
  [id]="_inputId"
25894
26113
  [value]="_value()"
25895
26114
  [disabled]="disabled()"
26115
+ [attr.aria-disabled]="disabled() ? 'true' : null"
25896
26116
  [attr.min]="min() || null"
25897
26117
  [attr.max]="max() || null"
25898
26118
  [attr.required]="required() || null"
@@ -25957,6 +26177,7 @@ i0.ɵɵngDeclareClassMetadata({
25957
26177
  [id]="_inputId"
25958
26178
  [value]="_value()"
25959
26179
  [disabled]="disabled()"
26180
+ [attr.aria-disabled]="disabled() ? 'true' : null"
25960
26181
  [attr.min]="min() || null"
25961
26182
  [attr.max]="max() || null"
25962
26183
  [attr.required]="required() || null"
@@ -26142,6 +26363,14 @@ var ComboboxComponent = class ComboboxComponent {
26142
26363
  effect(() => {
26143
26364
  this.invalidChange.emit(this.invalid());
26144
26365
  });
26366
+ effect(() => {
26367
+ if (this.disabled()) untracked(() => {
26368
+ this._cancelTimer();
26369
+ this._open.set(false);
26370
+ this._editing.set(false);
26371
+ this._text.set("");
26372
+ });
26373
+ });
26145
26374
  this._destroyRef.onDestroy(() => this._cancelTimer());
26146
26375
  }
26147
26376
  ngOnChanges() {
@@ -26218,6 +26447,7 @@ var ComboboxComponent = class ComboboxComponent {
26218
26447
  }, { injector: this._injector });
26219
26448
  }
26220
26449
  onInput(event) {
26450
+ if (this.disabled()) return;
26221
26451
  this._text.set(event.target.value);
26222
26452
  this._editing.set(true);
26223
26453
  this._open.set(true);
@@ -26297,6 +26527,7 @@ var ComboboxComponent = class ComboboxComponent {
26297
26527
  if (!o.disabled && i !== this._activeIndex()) this._activeIndex.set(i);
26298
26528
  }
26299
26529
  choose(o) {
26530
+ if (this.disabled()) return;
26300
26531
  const sel = {
26301
26532
  value: o.value,
26302
26533
  label: o.label
@@ -26308,6 +26539,7 @@ var ComboboxComponent = class ComboboxComponent {
26308
26539
  this.valueChange.emit(o);
26309
26540
  }
26310
26541
  clear() {
26542
+ if (this.disabled()) return;
26311
26543
  this._selected.set(null);
26312
26544
  this._revert();
26313
26545
  this._open.set(false);
@@ -26499,6 +26731,7 @@ var ComboboxComponent = class ComboboxComponent {
26499
26731
  [placeholder]="placeholder()"
26500
26732
  [value]="_inputText()"
26501
26733
  [disabled]="disabled()"
26734
+ [attr.aria-disabled]="disabled() ? 'true' : null"
26502
26735
  [attr.aria-label]="ariaLabel() || null"
26503
26736
  [attr.aria-expanded]="_open() ? 'true' : 'false'"
26504
26737
  [attr.aria-controls]="_open() ? _listId : null"
@@ -26603,6 +26836,7 @@ i0.ɵɵngDeclareClassMetadata({
26603
26836
  [placeholder]="placeholder()"
26604
26837
  [value]="_inputText()"
26605
26838
  [disabled]="disabled()"
26839
+ [attr.aria-disabled]="disabled() ? 'true' : null"
26606
26840
  [attr.aria-label]="ariaLabel() || null"
26607
26841
  [attr.aria-expanded]="_open() ? 'true' : 'false'"
26608
26842
  [attr.aria-controls]="_open() ? _listId : null"
@@ -29063,7 +29297,7 @@ var ListItemComponent = class ListItemComponent {
29063
29297
  </ng-template>
29064
29298
  <ng-template #content>
29065
29299
  <div class="li-title-row">
29066
- <span class="li-title">{{ title() }}</span>
29300
+ <span class="li-title" data-testid="list-item-title">{{ title() }}</span>
29067
29301
  @if (badge() && (checked() || alwaysShowBadge())) {
29068
29302
  <ui-badge [label]="badge()!" [variant]="badgeVariant()" />
29069
29303
  }
@@ -29075,7 +29309,7 @@ var ListItemComponent = class ListItemComponent {
29075
29309
  @if (detail.d) {
29076
29310
  <svg class="li-detail-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path [attr.d]="detail.d" /></svg>
29077
29311
  }
29078
- <span class="li-detail-text">{{ detail.text }}</span>
29312
+ <span class="li-detail-text" data-testid="list-item-detail">{{ detail.text }}</span>
29079
29313
  </span>
29080
29314
  }
29081
29315
  </div>
@@ -29139,7 +29373,11 @@ var ListItemComponent = class ListItemComponent {
29139
29373
  kind: "component",
29140
29374
  type: BadgeComponent,
29141
29375
  selector: "ui-badge",
29142
- inputs: ["label", "variant"]
29376
+ inputs: [
29377
+ "label",
29378
+ "variant",
29379
+ "color"
29380
+ ]
29143
29381
  }, {
29144
29382
  kind: "directive",
29145
29383
  type: NgTemplateOutlet,
@@ -29178,7 +29416,7 @@ i0.ɵɵngDeclareClassMetadata({
29178
29416
  </ng-template>
29179
29417
  <ng-template #content>
29180
29418
  <div class="li-title-row">
29181
- <span class="li-title">{{ title() }}</span>
29419
+ <span class="li-title" data-testid="list-item-title">{{ title() }}</span>
29182
29420
  @if (badge() && (checked() || alwaysShowBadge())) {
29183
29421
  <ui-badge [label]="badge()!" [variant]="badgeVariant()" />
29184
29422
  }
@@ -29190,7 +29428,7 @@ i0.ɵɵngDeclareClassMetadata({
29190
29428
  @if (detail.d) {
29191
29429
  <svg class="li-detail-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path [attr.d]="detail.d" /></svg>
29192
29430
  }
29193
- <span class="li-detail-text">{{ detail.text }}</span>
29431
+ <span class="li-detail-text" data-testid="list-item-detail">{{ detail.text }}</span>
29194
29432
  </span>
29195
29433
  }
29196
29434
  </div>
@@ -29685,7 +29923,11 @@ var CardListItemComponent = class CardListItemComponent {
29685
29923
  kind: "component",
29686
29924
  type: BadgeComponent,
29687
29925
  selector: "ui-badge",
29688
- inputs: ["label", "variant"]
29926
+ inputs: [
29927
+ "label",
29928
+ "variant",
29929
+ "color"
29930
+ ]
29689
29931
  }, {
29690
29932
  kind: "directive",
29691
29933
  type: TooltipDirective,
@@ -31580,12 +31822,12 @@ var BarRowComponent = class BarRowComponent {
31580
31822
  ngImport: i0,
31581
31823
  template: `
31582
31824
  <div class="br">
31583
- <span class="br-label" [attr.id]="labelId">{{ label() }}</span>
31825
+ <span class="br-label" data-testid="bar-row-label" [attr.id]="labelId">{{ label() }}</span>
31584
31826
  <ui-progress-bar class="br-bar" [value]="barValue()" [max]="barMax()" [variant]="variant()"
31585
31827
  [ariaLabelledby]="label() ? labelId : ''" [valueText]="effectiveValueText()" />
31586
31828
  <span class="br-value">
31587
- <span class="br-count">{{ countText() }}</span>
31588
- @if (share()) { <span class="br-share">{{ share() }}</span> }
31829
+ <span class="br-count" data-testid="bar-row-count">{{ countText() }}</span>
31830
+ @if (share()) { <span class="br-share" data-testid="bar-row-share">{{ share() }}</span> }
31589
31831
  </span>
31590
31832
  </div>
31591
31833
  `,
@@ -31625,12 +31867,12 @@ i0.ɵɵngDeclareClassMetadata({
31625
31867
  changeDetection: ChangeDetectionStrategy.OnPush,
31626
31868
  template: `
31627
31869
  <div class="br">
31628
- <span class="br-label" [attr.id]="labelId">{{ label() }}</span>
31870
+ <span class="br-label" data-testid="bar-row-label" [attr.id]="labelId">{{ label() }}</span>
31629
31871
  <ui-progress-bar class="br-bar" [value]="barValue()" [max]="barMax()" [variant]="variant()"
31630
31872
  [ariaLabelledby]="label() ? labelId : ''" [valueText]="effectiveValueText()" />
31631
31873
  <span class="br-value">
31632
- <span class="br-count">{{ countText() }}</span>
31633
- @if (share()) { <span class="br-share">{{ share() }}</span> }
31874
+ <span class="br-count" data-testid="bar-row-count">{{ countText() }}</span>
31875
+ @if (share()) { <span class="br-share" data-testid="bar-row-share">{{ share() }}</span> }
31634
31876
  </span>
31635
31877
  </div>
31636
31878
  `,
@@ -32812,7 +33054,11 @@ var PanelInfoListComponent = class PanelInfoListComponent {
32812
33054
  kind: "component",
32813
33055
  type: BadgeComponent,
32814
33056
  selector: "ui-badge",
32815
- inputs: ["label", "variant"]
33057
+ inputs: [
33058
+ "label",
33059
+ "variant",
33060
+ "color"
33061
+ ]
32816
33062
  },
32817
33063
  {
32818
33064
  kind: "component",
@@ -34977,48 +35223,6 @@ i0.ɵɵngDeclareClassMetadata({
34977
35223
  }]
34978
35224
  }
34979
35225
  });
34980
- var HintComponent = class HintComponent {
34981
- static {
34982
- this.ɵfac = i0.ɵɵngDeclareFactory({
34983
- minVersion: "12.0.0",
34984
- version: "22.2.2",
34985
- ngImport: i0,
34986
- type: HintComponent,
34987
- deps: [],
34988
- target: i0.ɵɵFactoryTarget.Component
34989
- });
34990
- }
34991
- static {
34992
- this.ɵcmp = i0.ɵɵngDeclareComponent({
34993
- minVersion: "14.0.0",
34994
- version: "22.2.2",
34995
- type: HintComponent,
34996
- isStandalone: true,
34997
- selector: "ui-hint",
34998
- ngImport: i0,
34999
- template: `<p class="hint"><ng-content /></p>`,
35000
- isInline: true,
35001
- styles: [":host{display:block}.hint{font-size:.75rem;line-height:1.4;color:#64748b;margin:0}\n"],
35002
- changeDetection: i0.ChangeDetectionStrategy.OnPush
35003
- });
35004
- }
35005
- };
35006
- i0.ɵɵngDeclareClassMetadata({
35007
- minVersion: "12.0.0",
35008
- version: "22.2.2",
35009
- ngImport: i0,
35010
- type: HintComponent,
35011
- decorators: [{
35012
- type: Component,
35013
- args: [{
35014
- selector: "ui-hint",
35015
- standalone: true,
35016
- changeDetection: ChangeDetectionStrategy.OnPush,
35017
- template: `<p class="hint"><ng-content /></p>`,
35018
- styles: [":host{display:block}.hint{font-size:.75rem;line-height:1.4;color:#64748b;margin:0}\n"]
35019
- }]
35020
- }]
35021
- });
35022
35226
  var TimelineComponent = class TimelineComponent {
35023
35227
  constructor() {
35024
35228
  this.items = input([], ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
@@ -35275,7 +35479,11 @@ var TimelineComponent = class TimelineComponent {
35275
35479
  kind: "component",
35276
35480
  type: BadgeComponent,
35277
35481
  selector: "ui-badge",
35278
- inputs: ["label", "variant"]
35482
+ inputs: [
35483
+ "label",
35484
+ "variant",
35485
+ "color"
35486
+ ]
35279
35487
  },
35280
35488
  {
35281
35489
  kind: "component",
@@ -37777,12 +37985,12 @@ var KpiCardComponent = class KpiCardComponent {
37777
37985
  }
37778
37986
  @if (hasProgress()) {
37779
37987
  <div class="kpi-top">
37780
- <span class="kpi-label">{{ label() }}</span>
37988
+ <span class="kpi-label" data-testid="kpi-label">{{ label() }}</span>
37781
37989
  <ui-progress-ring class="kpi-ring" [attr.aria-hidden]="loading() ? 'true' : null" [value]="progress()!" [max]="progressMax()" [size]="progressSize()" [strokeWidth]="progressStrokeWidth()"
37782
37990
  [variant]="progressVariant()" [ariaLabel]="progressAriaLabel() || (label() + ' progress')" [valueText]="progressValueText()" />
37783
37991
  </div>
37784
37992
  } @else {
37785
- <span class="kpi-label">{{ label() }}</span>
37993
+ <span class="kpi-label" data-testid="kpi-label">{{ label() }}</span>
37786
37994
  }
37787
37995
  @if (loading()) {
37788
37996
  <span class="kpi-value kpi-value--loading" aria-hidden="true" data-testid="kpi-value-placeholder"><span class="kpi-bar"></span></span>
@@ -37791,7 +37999,7 @@ var KpiCardComponent = class KpiCardComponent {
37791
37999
  <span class="kpi-subtitle kpi-subtitle--loading" aria-hidden="true" data-testid="kpi-subtitle-placeholder">{{ subtitle() }}</span>
37792
38000
  }
37793
38001
  } @else {
37794
- <span class="kpi-value"
38002
+ <span class="kpi-value" data-testid="kpi-value"
37795
38003
  [class.green-value]="highlight() || valueColor() === 'green'"
37796
38004
  [class.blue-value]="valueColor() === 'blue'"
37797
38005
  [class.red-value]="valueColor() === 'red'">{{ value() }}</span>
@@ -37854,12 +38062,12 @@ i0.ɵɵngDeclareClassMetadata({
37854
38062
  }
37855
38063
  @if (hasProgress()) {
37856
38064
  <div class="kpi-top">
37857
- <span class="kpi-label">{{ label() }}</span>
38065
+ <span class="kpi-label" data-testid="kpi-label">{{ label() }}</span>
37858
38066
  <ui-progress-ring class="kpi-ring" [attr.aria-hidden]="loading() ? 'true' : null" [value]="progress()!" [max]="progressMax()" [size]="progressSize()" [strokeWidth]="progressStrokeWidth()"
37859
38067
  [variant]="progressVariant()" [ariaLabel]="progressAriaLabel() || (label() + ' progress')" [valueText]="progressValueText()" />
37860
38068
  </div>
37861
38069
  } @else {
37862
- <span class="kpi-label">{{ label() }}</span>
38070
+ <span class="kpi-label" data-testid="kpi-label">{{ label() }}</span>
37863
38071
  }
37864
38072
  @if (loading()) {
37865
38073
  <span class="kpi-value kpi-value--loading" aria-hidden="true" data-testid="kpi-value-placeholder"><span class="kpi-bar"></span></span>
@@ -37868,7 +38076,7 @@ i0.ɵɵngDeclareClassMetadata({
37868
38076
  <span class="kpi-subtitle kpi-subtitle--loading" aria-hidden="true" data-testid="kpi-subtitle-placeholder">{{ subtitle() }}</span>
37869
38077
  }
37870
38078
  } @else {
37871
- <span class="kpi-value"
38079
+ <span class="kpi-value" data-testid="kpi-value"
37872
38080
  [class.green-value]="highlight() || valueColor() === 'green'"
37873
38081
  [class.blue-value]="valueColor() === 'blue'"
37874
38082
  [class.red-value]="valueColor() === 'red'">{{ value() }}</span>
@@ -38278,7 +38486,9 @@ var DateRangePickerComponent = class DateRangePickerComponent {
38278
38486
  "name",
38279
38487
  "noWrap",
38280
38488
  "orientation",
38281
- "controlsPanels"
38489
+ "controlsPanels",
38490
+ "showDescription",
38491
+ "headingLevel"
38282
38492
  ],
38283
38493
  outputs: ["tabChange"]
38284
38494
  },
@@ -39982,19 +40192,19 @@ i0.ɵɵngDeclareClassMetadata({
39982
40192
  }]
39983
40193
  }
39984
40194
  });
39985
- var RadioMatrixComponent = class RadioMatrixComponent {
40195
+ var SwatchPickerComponent = class SwatchPickerComponent {
39986
40196
  get _name() {
39987
40197
  return this.name() || this._generatedName;
39988
40198
  }
39989
40199
  constructor() {
40200
+ this._el = inject(ElementRef);
39990
40201
  this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
39991
- this.rowHeader = input("", ...ngDevMode ? [{ debugName: "rowHeader" }] : /* istanbul ignore next */ []);
39992
- this.rows = input([], ...ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []);
39993
- this.columns = input([], ...ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []);
40202
+ this.options = input([], ...ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []);
39994
40203
  this.required = input(false, ...ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []);
39995
40204
  this.hint = input("", ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
39996
40205
  this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
39997
40206
  this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
40207
+ this.columns = input(0, ...ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []);
39998
40208
  this.name = input("", ...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
39999
40209
  this._disabledInput = input(false, {
40000
40210
  ...ngDevMode ? { debugName: "_disabledInput" } : /* istanbul ignore next */ {},
@@ -40002,14 +40212,15 @@ var RadioMatrixComponent = class RadioMatrixComponent {
40002
40212
  });
40003
40213
  this._cvaDisabled = signal(false, ...ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []);
40004
40214
  this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
40005
- this._generatedName = `rm-${Math.random().toString(36).slice(2, 8)}`;
40215
+ this._generatedName = `sp-${Math.random().toString(36).slice(2, 8)}`;
40006
40216
  this._descId = `${this._generatedName}-desc`;
40007
- this._value = signal({}, ...ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []);
40217
+ this._value = signal("", ...ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []);
40008
40218
  this._reveal = createFieldReveal(this.showErrors);
40009
40219
  this._issue = computed(() => this._check(this._value()), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
40010
40220
  this.invalid = computed(() => !!this.error() || !!this._issue(), ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
40011
40221
  this.errorMessage = computed(() => this._issue()?.message ?? "", ...ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []);
40012
40222
  this.invalidChange = output();
40223
+ this.valueChange = output();
40013
40224
  this._activeError = computed(() => this.error() || (this._reveal.revealed() ? this.errorMessage() : ""), ...ngDevMode ? [{ debugName: "_activeError" }] : /* istanbul ignore next */ []);
40014
40225
  this._onValidatorChange = () => {};
40015
40226
  this._onChange = (_) => {};
@@ -40022,13 +40233,14 @@ var RadioMatrixComponent = class RadioMatrixComponent {
40022
40233
  this._onValidatorChange();
40023
40234
  }
40024
40235
  validate(control) {
40025
- return issueToErrors(this._check(this._toRecord(control.value)));
40236
+ const v = control.value;
40237
+ return issueToErrors(this._check(v == null ? "" : String(v)));
40026
40238
  }
40027
40239
  registerOnValidatorChange(fn) {
40028
40240
  this._onValidatorChange = fn;
40029
40241
  }
40030
40242
  writeValue(val) {
40031
- this._value.set(this._toRecord(val));
40243
+ this._value.set(val ?? "");
40032
40244
  }
40033
40245
  registerOnChange(fn) {
40034
40246
  this._onChange = fn;
@@ -40039,18 +40251,21 @@ var RadioMatrixComponent = class RadioMatrixComponent {
40039
40251
  setDisabledState(d) {
40040
40252
  this._cvaDisabled.set(d);
40041
40253
  }
40042
- onSelect(row, column) {
40043
- const next = {
40044
- ...this._value(),
40045
- [row]: column
40046
- };
40047
- this._value.set(next);
40048
- this._onChange(next);
40254
+ onSelect(value) {
40255
+ if (this.disabled()) return;
40256
+ this._value.set(value);
40257
+ this._onChange(value);
40258
+ this.valueChange.emit(value);
40049
40259
  }
40050
- _rowInvalid(row) {
40051
- if (this.disabled() || row.disabled || !this._reveal.revealed()) return false;
40052
- const v = this._value()[row.value] ?? "";
40053
- return v ? !this.columns().some((c) => c.value === v) : this.required();
40260
+ onKeydown(e) {
40261
+ if (e.key !== "Home" && e.key !== "End" || this.disabled()) return;
40262
+ const opts = this.options();
40263
+ const enabled = opts.filter((o) => !o.disabled);
40264
+ if (!enabled.length) return;
40265
+ e.preventDefault();
40266
+ const target = e.key === "Home" ? enabled[0] : enabled[enabled.length - 1];
40267
+ this.onSelect(target.value);
40268
+ this._el.nativeElement.querySelectorAll("input[type=radio]")[opts.indexOf(target)]?.focus();
40054
40269
  }
40055
40270
  onFocusOut(event) {
40056
40271
  const next = event.relatedTarget;
@@ -40058,24 +40273,14 @@ var RadioMatrixComponent = class RadioMatrixComponent {
40058
40273
  this._onTouched();
40059
40274
  this._reveal.touched.set(true);
40060
40275
  }
40061
- _toRecord(val) {
40062
- return val && typeof val === "object" ? { ...val } : {};
40063
- }
40064
40276
  _check(value) {
40065
40277
  if (this.disabled()) return null;
40066
- const cols = this.columns();
40067
- const rows = this.rows().filter((r) => !r.disabled);
40068
- if (cols.length > 0 && rows.some((r) => value[r.value] && !cols.some((c) => c.value === value[r.value]))) return {
40278
+ if (!value) return this.required() ? requiredIssue(this.label()) : null;
40279
+ const opts = this.options();
40280
+ if (opts.length > 0 && !opts.some((o) => o.value === value)) return {
40069
40281
  key: "option",
40070
40282
  message: "Select a valid option."
40071
40283
  };
40072
- if (this.required() && rows.some((r) => !value[r.value])) {
40073
- const label = this.label().trim();
40074
- return {
40075
- key: "required",
40076
- message: label ? `${label}: choose an option in every row.` : "Choose an option in every row."
40077
- };
40078
- }
40079
40284
  return null;
40080
40285
  }
40081
40286
  static {
@@ -40083,7 +40288,7 @@ var RadioMatrixComponent = class RadioMatrixComponent {
40083
40288
  minVersion: "12.0.0",
40084
40289
  version: "22.2.2",
40085
40290
  ngImport: i0,
40086
- type: RadioMatrixComponent,
40291
+ type: SwatchPickerComponent,
40087
40292
  deps: [],
40088
40293
  target: i0.ɵɵFactoryTarget.Component
40089
40294
  });
@@ -40092,9 +40297,9 @@ var RadioMatrixComponent = class RadioMatrixComponent {
40092
40297
  this.ɵcmp = i0.ɵɵngDeclareComponent({
40093
40298
  minVersion: "17.0.0",
40094
40299
  version: "22.2.2",
40095
- type: RadioMatrixComponent,
40300
+ type: SwatchPickerComponent,
40096
40301
  isStandalone: true,
40097
- selector: "ui-radio-matrix",
40302
+ selector: "ui-swatch-picker",
40098
40303
  inputs: {
40099
40304
  label: {
40100
40305
  classPropertyName: "label",
@@ -40103,23 +40308,853 @@ var RadioMatrixComponent = class RadioMatrixComponent {
40103
40308
  isRequired: false,
40104
40309
  transformFunction: null
40105
40310
  },
40106
- rowHeader: {
40107
- classPropertyName: "rowHeader",
40108
- publicName: "rowHeader",
40109
- isSignal: true,
40110
- isRequired: false,
40111
- transformFunction: null
40112
- },
40113
- rows: {
40114
- classPropertyName: "rows",
40115
- publicName: "rows",
40116
- isSignal: true,
40117
- isRequired: false,
40118
- transformFunction: null
40119
- },
40120
- columns: {
40121
- classPropertyName: "columns",
40122
- publicName: "columns",
40311
+ options: {
40312
+ classPropertyName: "options",
40313
+ publicName: "options",
40314
+ isSignal: true,
40315
+ isRequired: false,
40316
+ transformFunction: null
40317
+ },
40318
+ required: {
40319
+ classPropertyName: "required",
40320
+ publicName: "required",
40321
+ isSignal: true,
40322
+ isRequired: false,
40323
+ transformFunction: null
40324
+ },
40325
+ hint: {
40326
+ classPropertyName: "hint",
40327
+ publicName: "hint",
40328
+ isSignal: true,
40329
+ isRequired: false,
40330
+ transformFunction: null
40331
+ },
40332
+ error: {
40333
+ classPropertyName: "error",
40334
+ publicName: "error",
40335
+ isSignal: true,
40336
+ isRequired: false,
40337
+ transformFunction: null
40338
+ },
40339
+ showErrors: {
40340
+ classPropertyName: "showErrors",
40341
+ publicName: "showErrors",
40342
+ isSignal: true,
40343
+ isRequired: false,
40344
+ transformFunction: null
40345
+ },
40346
+ columns: {
40347
+ classPropertyName: "columns",
40348
+ publicName: "columns",
40349
+ isSignal: true,
40350
+ isRequired: false,
40351
+ transformFunction: null
40352
+ },
40353
+ name: {
40354
+ classPropertyName: "name",
40355
+ publicName: "name",
40356
+ isSignal: true,
40357
+ isRequired: false,
40358
+ transformFunction: null
40359
+ },
40360
+ _disabledInput: {
40361
+ classPropertyName: "_disabledInput",
40362
+ publicName: "disabled",
40363
+ isSignal: true,
40364
+ isRequired: false,
40365
+ transformFunction: null
40366
+ }
40367
+ },
40368
+ outputs: {
40369
+ invalidChange: "invalidChange",
40370
+ valueChange: "valueChange"
40371
+ },
40372
+ providers: [
40373
+ {
40374
+ provide: NG_VALUE_ACCESSOR,
40375
+ useExisting: forwardRef(() => SwatchPickerComponent),
40376
+ multi: true
40377
+ },
40378
+ {
40379
+ provide: NG_VALIDATORS,
40380
+ useExisting: forwardRef(() => SwatchPickerComponent),
40381
+ multi: true
40382
+ },
40383
+ {
40384
+ provide: UiFieldValidity,
40385
+ useExisting: forwardRef(() => SwatchPickerComponent)
40386
+ }
40387
+ ],
40388
+ usesOnChanges: true,
40389
+ ngImport: i0,
40390
+ template: `
40391
+ <fieldset
40392
+ class="sp-field"
40393
+ role="radiogroup"
40394
+ [class.sp-error]="_activeError()"
40395
+ [class.sp-disabled]="disabled()"
40396
+ [disabled]="disabled()"
40397
+ [attr.aria-required]="required() ? 'true' : null"
40398
+ [attr.aria-invalid]="_activeError() ? 'true' : null"
40399
+ [attr.aria-describedby]="(_activeError() || hint()) ? _descId : null"
40400
+ (focusout)="onFocusOut($event)"
40401
+ (keydown)="onKeydown($event)">
40402
+ @if (label()) {
40403
+ <legend class="sp-label">
40404
+ {{ label() }}
40405
+ @if (required()) { <span class="sp-required" aria-hidden="true">*</span> }
40406
+ </legend>
40407
+ }
40408
+ <div class="sp-options" [class.sp-grid]="columns() > 0" [style.--sp-cols]="columns() > 0 ? columns() : null">
40409
+ @for (opt of options(); track opt.value) {
40410
+ <label class="sp-option" [class.sp-selected]="_value() === opt.value" [class.sp-option-disabled]="disabled() || !!opt.disabled" [attr.title]="opt.label">
40411
+ <input class="sp-input" type="radio"
40412
+ [name]="_name"
40413
+ [value]="opt.value"
40414
+ [checked]="_value() === opt.value"
40415
+ [disabled]="disabled() || !!opt.disabled"
40416
+ [attr.aria-label]="opt.label"
40417
+ [attr.data-testid]="opt.testId || null"
40418
+ (change)="onSelect(opt.value)" />
40419
+ <span class="sp-swatch" [style.background-color]="opt.color" aria-hidden="true">
40420
+ @if (_value() === opt.value) {
40421
+ <svg class="sp-check" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
40422
+ <path d="M5 12.5l4.5 4.5L19 7.5" class="sp-check-outline" stroke-width="5"/>
40423
+ <path d="M5 12.5l4.5 4.5L19 7.5" class="sp-check-mark" stroke-width="3"/>
40424
+ </svg>
40425
+ }
40426
+ </span>
40427
+ </label>
40428
+ }
40429
+ </div>
40430
+ @if (_activeError()) {
40431
+ <p class="sp-desc sp-desc-error" [id]="_descId" role="alert">{{ _activeError() }}</p>
40432
+ } @else if (hint()) {
40433
+ <p class="sp-desc" [id]="_descId">{{ hint() }}</p>
40434
+ }
40435
+ </fieldset>
40436
+ `,
40437
+ isInline: true,
40438
+ styles: [":host{display:block}.sp-field{display:flex;flex-direction:column;gap:6px;border:0;margin:0;padding:0;min-width:0}.sp-label{padding:0;margin-bottom:6px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.sp-required{color:#dc2626;margin-left:2px}.sp-options{display:flex;flex-wrap:wrap;gap:8px;min-width:0}.sp-options.sp-grid{display:grid;grid-template-columns:repeat(var(--sp-cols),max-content)}.sp-option{position:relative;display:inline-flex;cursor:pointer}.sp-input{position:absolute;inset:0;width:100%;height:100%;margin:0;opacity:0;cursor:inherit}.sp-swatch{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;box-sizing:border-box;border:2px solid #fff;box-shadow:0 0 0 1px #94a3b8;transition:box-shadow .12s}.sp-option:hover .sp-swatch{box-shadow:0 0 0 2px #64748b}.sp-option.sp-selected .sp-swatch{box-shadow:0 0 0 3px #1e293b}.sp-input:focus-visible+.sp-swatch{outline:2px solid #3b82f6;outline-offset:3px}.sp-check-outline{stroke:#0f172abf}.sp-check-mark{stroke:#fff}.sp-option-disabled{cursor:not-allowed;opacity:.45}.sp-error .sp-option .sp-swatch{box-shadow:0 0 0 1px #dc2626}.sp-error .sp-option.sp-selected .sp-swatch{box-shadow:0 0 0 3px #dc2626}.sp-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b;overflow-wrap:anywhere}.sp-desc-error{color:#dc2626}@media(pointer:coarse),(max-width:480px){.sp-options{gap:4px}.sp-option{min-width:44px;min-height:44px;align-items:center;justify-content:center}.sp-options.sp-grid{grid-template-columns:repeat(auto-fill,44px)}}\n"],
40439
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
40440
+ });
40441
+ }
40442
+ };
40443
+ i0.ɵɵngDeclareClassMetadata({
40444
+ minVersion: "12.0.0",
40445
+ version: "22.2.2",
40446
+ ngImport: i0,
40447
+ type: SwatchPickerComponent,
40448
+ decorators: [{
40449
+ type: Component,
40450
+ args: [{
40451
+ selector: "ui-swatch-picker",
40452
+ standalone: true,
40453
+ changeDetection: ChangeDetectionStrategy.OnPush,
40454
+ providers: [
40455
+ {
40456
+ provide: NG_VALUE_ACCESSOR,
40457
+ useExisting: forwardRef(() => SwatchPickerComponent),
40458
+ multi: true
40459
+ },
40460
+ {
40461
+ provide: NG_VALIDATORS,
40462
+ useExisting: forwardRef(() => SwatchPickerComponent),
40463
+ multi: true
40464
+ },
40465
+ {
40466
+ provide: UiFieldValidity,
40467
+ useExisting: forwardRef(() => SwatchPickerComponent)
40468
+ }
40469
+ ],
40470
+ template: `
40471
+ <fieldset
40472
+ class="sp-field"
40473
+ role="radiogroup"
40474
+ [class.sp-error]="_activeError()"
40475
+ [class.sp-disabled]="disabled()"
40476
+ [disabled]="disabled()"
40477
+ [attr.aria-required]="required() ? 'true' : null"
40478
+ [attr.aria-invalid]="_activeError() ? 'true' : null"
40479
+ [attr.aria-describedby]="(_activeError() || hint()) ? _descId : null"
40480
+ (focusout)="onFocusOut($event)"
40481
+ (keydown)="onKeydown($event)">
40482
+ @if (label()) {
40483
+ <legend class="sp-label">
40484
+ {{ label() }}
40485
+ @if (required()) { <span class="sp-required" aria-hidden="true">*</span> }
40486
+ </legend>
40487
+ }
40488
+ <div class="sp-options" [class.sp-grid]="columns() > 0" [style.--sp-cols]="columns() > 0 ? columns() : null">
40489
+ @for (opt of options(); track opt.value) {
40490
+ <label class="sp-option" [class.sp-selected]="_value() === opt.value" [class.sp-option-disabled]="disabled() || !!opt.disabled" [attr.title]="opt.label">
40491
+ <input class="sp-input" type="radio"
40492
+ [name]="_name"
40493
+ [value]="opt.value"
40494
+ [checked]="_value() === opt.value"
40495
+ [disabled]="disabled() || !!opt.disabled"
40496
+ [attr.aria-label]="opt.label"
40497
+ [attr.data-testid]="opt.testId || null"
40498
+ (change)="onSelect(opt.value)" />
40499
+ <span class="sp-swatch" [style.background-color]="opt.color" aria-hidden="true">
40500
+ @if (_value() === opt.value) {
40501
+ <svg class="sp-check" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
40502
+ <path d="M5 12.5l4.5 4.5L19 7.5" class="sp-check-outline" stroke-width="5"/>
40503
+ <path d="M5 12.5l4.5 4.5L19 7.5" class="sp-check-mark" stroke-width="3"/>
40504
+ </svg>
40505
+ }
40506
+ </span>
40507
+ </label>
40508
+ }
40509
+ </div>
40510
+ @if (_activeError()) {
40511
+ <p class="sp-desc sp-desc-error" [id]="_descId" role="alert">{{ _activeError() }}</p>
40512
+ } @else if (hint()) {
40513
+ <p class="sp-desc" [id]="_descId">{{ hint() }}</p>
40514
+ }
40515
+ </fieldset>
40516
+ `,
40517
+ styles: [":host{display:block}.sp-field{display:flex;flex-direction:column;gap:6px;border:0;margin:0;padding:0;min-width:0}.sp-label{padding:0;margin-bottom:6px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.sp-required{color:#dc2626;margin-left:2px}.sp-options{display:flex;flex-wrap:wrap;gap:8px;min-width:0}.sp-options.sp-grid{display:grid;grid-template-columns:repeat(var(--sp-cols),max-content)}.sp-option{position:relative;display:inline-flex;cursor:pointer}.sp-input{position:absolute;inset:0;width:100%;height:100%;margin:0;opacity:0;cursor:inherit}.sp-swatch{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;box-sizing:border-box;border:2px solid #fff;box-shadow:0 0 0 1px #94a3b8;transition:box-shadow .12s}.sp-option:hover .sp-swatch{box-shadow:0 0 0 2px #64748b}.sp-option.sp-selected .sp-swatch{box-shadow:0 0 0 3px #1e293b}.sp-input:focus-visible+.sp-swatch{outline:2px solid #3b82f6;outline-offset:3px}.sp-check-outline{stroke:#0f172abf}.sp-check-mark{stroke:#fff}.sp-option-disabled{cursor:not-allowed;opacity:.45}.sp-error .sp-option .sp-swatch{box-shadow:0 0 0 1px #dc2626}.sp-error .sp-option.sp-selected .sp-swatch{box-shadow:0 0 0 3px #dc2626}.sp-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b;overflow-wrap:anywhere}.sp-desc-error{color:#dc2626}@media(pointer:coarse),(max-width:480px){.sp-options{gap:4px}.sp-option{min-width:44px;min-height:44px;align-items:center;justify-content:center}.sp-options.sp-grid{grid-template-columns:repeat(auto-fill,44px)}}\n"]
40518
+ }]
40519
+ }],
40520
+ ctorParameters: () => [],
40521
+ propDecorators: {
40522
+ label: [{
40523
+ type: i0.Input,
40524
+ args: [{
40525
+ isSignal: true,
40526
+ alias: "label",
40527
+ required: false
40528
+ }]
40529
+ }],
40530
+ options: [{
40531
+ type: i0.Input,
40532
+ args: [{
40533
+ isSignal: true,
40534
+ alias: "options",
40535
+ required: false
40536
+ }]
40537
+ }],
40538
+ required: [{
40539
+ type: i0.Input,
40540
+ args: [{
40541
+ isSignal: true,
40542
+ alias: "required",
40543
+ required: false
40544
+ }]
40545
+ }],
40546
+ hint: [{
40547
+ type: i0.Input,
40548
+ args: [{
40549
+ isSignal: true,
40550
+ alias: "hint",
40551
+ required: false
40552
+ }]
40553
+ }],
40554
+ error: [{
40555
+ type: i0.Input,
40556
+ args: [{
40557
+ isSignal: true,
40558
+ alias: "error",
40559
+ required: false
40560
+ }]
40561
+ }],
40562
+ showErrors: [{
40563
+ type: i0.Input,
40564
+ args: [{
40565
+ isSignal: true,
40566
+ alias: "showErrors",
40567
+ required: false
40568
+ }]
40569
+ }],
40570
+ columns: [{
40571
+ type: i0.Input,
40572
+ args: [{
40573
+ isSignal: true,
40574
+ alias: "columns",
40575
+ required: false
40576
+ }]
40577
+ }],
40578
+ name: [{
40579
+ type: i0.Input,
40580
+ args: [{
40581
+ isSignal: true,
40582
+ alias: "name",
40583
+ required: false
40584
+ }]
40585
+ }],
40586
+ _disabledInput: [{
40587
+ type: i0.Input,
40588
+ args: [{
40589
+ isSignal: true,
40590
+ alias: "disabled",
40591
+ required: false
40592
+ }]
40593
+ }],
40594
+ invalidChange: [{
40595
+ type: i0.Output,
40596
+ args: ["invalidChange"]
40597
+ }],
40598
+ valueChange: [{
40599
+ type: i0.Output,
40600
+ args: ["valueChange"]
40601
+ }]
40602
+ }
40603
+ });
40604
+ var IconPickerComponent = class IconPickerComponent {
40605
+ _path(o) {
40606
+ return o.path || iconPath(o.iconKey || o.value) || "";
40607
+ }
40608
+ get _name() {
40609
+ return this.name() || this._generatedName;
40610
+ }
40611
+ constructor() {
40612
+ this._el = inject(ElementRef);
40613
+ this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
40614
+ this.options = input([], ...ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []);
40615
+ this.required = input(false, ...ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []);
40616
+ this.hint = input("", ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
40617
+ this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
40618
+ this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
40619
+ this.columns = input(0, ...ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []);
40620
+ this.name = input("", ...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
40621
+ this._disabledInput = input(false, {
40622
+ ...ngDevMode ? { debugName: "_disabledInput" } : /* istanbul ignore next */ {},
40623
+ alias: "disabled"
40624
+ });
40625
+ this._cvaDisabled = signal(false, ...ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []);
40626
+ this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
40627
+ this._generatedName = `ip-${Math.random().toString(36).slice(2, 8)}`;
40628
+ this._descId = `${this._generatedName}-desc`;
40629
+ this._value = signal("", ...ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []);
40630
+ this._reveal = createFieldReveal(this.showErrors);
40631
+ this._issue = computed(() => this._check(this._value()), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
40632
+ this.invalid = computed(() => !!this.error() || !!this._issue(), ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
40633
+ this.errorMessage = computed(() => this._issue()?.message ?? "", ...ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []);
40634
+ this.invalidChange = output();
40635
+ this.valueChange = output();
40636
+ this._activeError = computed(() => this.error() || (this._reveal.revealed() ? this.errorMessage() : ""), ...ngDevMode ? [{ debugName: "_activeError" }] : /* istanbul ignore next */ []);
40637
+ this._onValidatorChange = () => {};
40638
+ this._onChange = (_) => {};
40639
+ this._onTouched = () => {};
40640
+ effect(() => {
40641
+ this.invalidChange.emit(this.invalid());
40642
+ });
40643
+ }
40644
+ ngOnChanges() {
40645
+ this._onValidatorChange();
40646
+ }
40647
+ validate(control) {
40648
+ const v = control.value;
40649
+ return issueToErrors(this._check(v == null ? "" : String(v)));
40650
+ }
40651
+ registerOnValidatorChange(fn) {
40652
+ this._onValidatorChange = fn;
40653
+ }
40654
+ writeValue(val) {
40655
+ this._value.set(val ?? "");
40656
+ }
40657
+ registerOnChange(fn) {
40658
+ this._onChange = fn;
40659
+ }
40660
+ registerOnTouched(fn) {
40661
+ this._onTouched = fn;
40662
+ }
40663
+ setDisabledState(d) {
40664
+ this._cvaDisabled.set(d);
40665
+ }
40666
+ onSelect(value) {
40667
+ if (this.disabled()) return;
40668
+ this._value.set(value);
40669
+ this._onChange(value);
40670
+ this.valueChange.emit(value);
40671
+ }
40672
+ onKeydown(e) {
40673
+ if (e.key !== "Home" && e.key !== "End" || this.disabled()) return;
40674
+ const opts = this.options();
40675
+ const enabled = opts.filter((o) => !o.disabled);
40676
+ if (!enabled.length) return;
40677
+ e.preventDefault();
40678
+ const target = e.key === "Home" ? enabled[0] : enabled[enabled.length - 1];
40679
+ this.onSelect(target.value);
40680
+ this._el.nativeElement.querySelectorAll("input[type=radio]")[opts.indexOf(target)]?.focus();
40681
+ }
40682
+ onFocusOut(event) {
40683
+ const next = event.relatedTarget;
40684
+ if (next && event.currentTarget.contains(next)) return;
40685
+ this._onTouched();
40686
+ this._reveal.touched.set(true);
40687
+ }
40688
+ _check(value) {
40689
+ if (this.disabled()) return null;
40690
+ if (!value) return this.required() ? requiredIssue(this.label()) : null;
40691
+ const opts = this.options();
40692
+ if (opts.length > 0 && !opts.some((o) => o.value === value)) return {
40693
+ key: "option",
40694
+ message: "Select a valid option."
40695
+ };
40696
+ return null;
40697
+ }
40698
+ static {
40699
+ this.ɵfac = i0.ɵɵngDeclareFactory({
40700
+ minVersion: "12.0.0",
40701
+ version: "22.2.2",
40702
+ ngImport: i0,
40703
+ type: IconPickerComponent,
40704
+ deps: [],
40705
+ target: i0.ɵɵFactoryTarget.Component
40706
+ });
40707
+ }
40708
+ static {
40709
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
40710
+ minVersion: "17.0.0",
40711
+ version: "22.2.2",
40712
+ type: IconPickerComponent,
40713
+ isStandalone: true,
40714
+ selector: "ui-icon-picker",
40715
+ inputs: {
40716
+ label: {
40717
+ classPropertyName: "label",
40718
+ publicName: "label",
40719
+ isSignal: true,
40720
+ isRequired: false,
40721
+ transformFunction: null
40722
+ },
40723
+ options: {
40724
+ classPropertyName: "options",
40725
+ publicName: "options",
40726
+ isSignal: true,
40727
+ isRequired: false,
40728
+ transformFunction: null
40729
+ },
40730
+ required: {
40731
+ classPropertyName: "required",
40732
+ publicName: "required",
40733
+ isSignal: true,
40734
+ isRequired: false,
40735
+ transformFunction: null
40736
+ },
40737
+ hint: {
40738
+ classPropertyName: "hint",
40739
+ publicName: "hint",
40740
+ isSignal: true,
40741
+ isRequired: false,
40742
+ transformFunction: null
40743
+ },
40744
+ error: {
40745
+ classPropertyName: "error",
40746
+ publicName: "error",
40747
+ isSignal: true,
40748
+ isRequired: false,
40749
+ transformFunction: null
40750
+ },
40751
+ showErrors: {
40752
+ classPropertyName: "showErrors",
40753
+ publicName: "showErrors",
40754
+ isSignal: true,
40755
+ isRequired: false,
40756
+ transformFunction: null
40757
+ },
40758
+ columns: {
40759
+ classPropertyName: "columns",
40760
+ publicName: "columns",
40761
+ isSignal: true,
40762
+ isRequired: false,
40763
+ transformFunction: null
40764
+ },
40765
+ name: {
40766
+ classPropertyName: "name",
40767
+ publicName: "name",
40768
+ isSignal: true,
40769
+ isRequired: false,
40770
+ transformFunction: null
40771
+ },
40772
+ _disabledInput: {
40773
+ classPropertyName: "_disabledInput",
40774
+ publicName: "disabled",
40775
+ isSignal: true,
40776
+ isRequired: false,
40777
+ transformFunction: null
40778
+ }
40779
+ },
40780
+ outputs: {
40781
+ invalidChange: "invalidChange",
40782
+ valueChange: "valueChange"
40783
+ },
40784
+ providers: [
40785
+ {
40786
+ provide: NG_VALUE_ACCESSOR,
40787
+ useExisting: forwardRef(() => IconPickerComponent),
40788
+ multi: true
40789
+ },
40790
+ {
40791
+ provide: NG_VALIDATORS,
40792
+ useExisting: forwardRef(() => IconPickerComponent),
40793
+ multi: true
40794
+ },
40795
+ {
40796
+ provide: UiFieldValidity,
40797
+ useExisting: forwardRef(() => IconPickerComponent)
40798
+ }
40799
+ ],
40800
+ usesOnChanges: true,
40801
+ ngImport: i0,
40802
+ template: `
40803
+ <fieldset
40804
+ class="ip-field"
40805
+ role="radiogroup"
40806
+ [class.ip-error]="_activeError()"
40807
+ [class.ip-disabled]="disabled()"
40808
+ [disabled]="disabled()"
40809
+ [attr.aria-required]="required() ? 'true' : null"
40810
+ [attr.aria-invalid]="_activeError() ? 'true' : null"
40811
+ [attr.aria-describedby]="(_activeError() || hint()) ? _descId : null"
40812
+ (focusout)="onFocusOut($event)"
40813
+ (keydown)="onKeydown($event)">
40814
+ @if (label()) {
40815
+ <legend class="ip-label">
40816
+ {{ label() }}
40817
+ @if (required()) { <span class="ip-required" aria-hidden="true">*</span> }
40818
+ </legend>
40819
+ }
40820
+ <div class="ip-options" [class.ip-grid]="columns() > 0" [style.--ip-cols]="columns() > 0 ? columns() : null">
40821
+ @for (opt of options(); track opt.value) {
40822
+ <label class="ip-option" [class.ip-selected]="_value() === opt.value" [class.ip-option-disabled]="disabled() || !!opt.disabled" [attr.title]="opt.label">
40823
+ <input class="ip-input" type="radio"
40824
+ [name]="_name"
40825
+ [value]="opt.value"
40826
+ [checked]="_value() === opt.value"
40827
+ [disabled]="disabled() || !!opt.disabled"
40828
+ [attr.aria-label]="opt.label"
40829
+ [attr.data-testid]="opt.testId || null"
40830
+ (change)="onSelect(opt.value)" />
40831
+ <span class="ip-swatch" aria-hidden="true">
40832
+ <svg class="ip-glyph" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
40833
+ <path [attr.d]="_path(opt)"/>
40834
+ </svg>
40835
+ @if (_value() === opt.value) {
40836
+ <svg class="ip-check" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
40837
+ <path d="M5 12.5l4.5 4.5L19 7.5"/>
40838
+ </svg>
40839
+ }
40840
+ </span>
40841
+ </label>
40842
+ }
40843
+ </div>
40844
+ @if (_activeError()) {
40845
+ <p class="ip-desc ip-desc-error" [id]="_descId" role="alert">{{ _activeError() }}</p>
40846
+ } @else if (hint()) {
40847
+ <p class="ip-desc" [id]="_descId">{{ hint() }}</p>
40848
+ }
40849
+ </fieldset>
40850
+ `,
40851
+ isInline: true,
40852
+ styles: [":host{display:block}.ip-field{display:flex;flex-direction:column;gap:6px;border:0;margin:0;padding:0;min-width:0}.ip-label{padding:0;margin-bottom:6px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ip-required{color:#dc2626;margin-left:2px}.ip-options{display:flex;flex-wrap:wrap;gap:8px;min-width:0}.ip-options.ip-grid{display:grid;grid-template-columns:repeat(var(--ip-cols),max-content)}.ip-option{position:relative;display:inline-flex;cursor:pointer}.ip-input{position:absolute;inset:0;width:100%;height:100%;margin:0;opacity:0;cursor:inherit}.ip-swatch{display:inline-flex;align-items:center;justify-content:center;position:relative;width:36px;height:36px;border-radius:8px;box-sizing:border-box;background:#fff;color:#334155;border:1px solid #cbd5e1;box-shadow:0 0 0 0 transparent;transition:box-shadow .12s}.ip-option:hover .ip-swatch{border-color:#64748b}.ip-input:focus-visible+.ip-swatch{outline:2px solid #3b82f6;outline-offset:3px}.ip-option.ip-selected .ip-swatch{background:#1e293b;color:#fff;border-color:#1e293b}.ip-check{position:absolute;right:2px;bottom:2px;padding:1px;border-radius:50%;background:#fff;color:#1e293b;border:1px solid #1e293b;box-sizing:content-box}.ip-option-disabled{cursor:not-allowed;opacity:.45}.ip-error .ip-option .ip-swatch{border-color:#dc2626}.ip-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b;overflow-wrap:anywhere}.ip-desc-error{color:#dc2626}@media(pointer:coarse),(max-width:480px){.ip-options{gap:4px}.ip-option{min-width:44px;min-height:44px;align-items:center;justify-content:center}.ip-options.ip-grid{grid-template-columns:repeat(auto-fill,44px)}}\n"],
40853
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
40854
+ });
40855
+ }
40856
+ };
40857
+ i0.ɵɵngDeclareClassMetadata({
40858
+ minVersion: "12.0.0",
40859
+ version: "22.2.2",
40860
+ ngImport: i0,
40861
+ type: IconPickerComponent,
40862
+ decorators: [{
40863
+ type: Component,
40864
+ args: [{
40865
+ selector: "ui-icon-picker",
40866
+ standalone: true,
40867
+ changeDetection: ChangeDetectionStrategy.OnPush,
40868
+ providers: [
40869
+ {
40870
+ provide: NG_VALUE_ACCESSOR,
40871
+ useExisting: forwardRef(() => IconPickerComponent),
40872
+ multi: true
40873
+ },
40874
+ {
40875
+ provide: NG_VALIDATORS,
40876
+ useExisting: forwardRef(() => IconPickerComponent),
40877
+ multi: true
40878
+ },
40879
+ {
40880
+ provide: UiFieldValidity,
40881
+ useExisting: forwardRef(() => IconPickerComponent)
40882
+ }
40883
+ ],
40884
+ template: `
40885
+ <fieldset
40886
+ class="ip-field"
40887
+ role="radiogroup"
40888
+ [class.ip-error]="_activeError()"
40889
+ [class.ip-disabled]="disabled()"
40890
+ [disabled]="disabled()"
40891
+ [attr.aria-required]="required() ? 'true' : null"
40892
+ [attr.aria-invalid]="_activeError() ? 'true' : null"
40893
+ [attr.aria-describedby]="(_activeError() || hint()) ? _descId : null"
40894
+ (focusout)="onFocusOut($event)"
40895
+ (keydown)="onKeydown($event)">
40896
+ @if (label()) {
40897
+ <legend class="ip-label">
40898
+ {{ label() }}
40899
+ @if (required()) { <span class="ip-required" aria-hidden="true">*</span> }
40900
+ </legend>
40901
+ }
40902
+ <div class="ip-options" [class.ip-grid]="columns() > 0" [style.--ip-cols]="columns() > 0 ? columns() : null">
40903
+ @for (opt of options(); track opt.value) {
40904
+ <label class="ip-option" [class.ip-selected]="_value() === opt.value" [class.ip-option-disabled]="disabled() || !!opt.disabled" [attr.title]="opt.label">
40905
+ <input class="ip-input" type="radio"
40906
+ [name]="_name"
40907
+ [value]="opt.value"
40908
+ [checked]="_value() === opt.value"
40909
+ [disabled]="disabled() || !!opt.disabled"
40910
+ [attr.aria-label]="opt.label"
40911
+ [attr.data-testid]="opt.testId || null"
40912
+ (change)="onSelect(opt.value)" />
40913
+ <span class="ip-swatch" aria-hidden="true">
40914
+ <svg class="ip-glyph" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
40915
+ <path [attr.d]="_path(opt)"/>
40916
+ </svg>
40917
+ @if (_value() === opt.value) {
40918
+ <svg class="ip-check" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
40919
+ <path d="M5 12.5l4.5 4.5L19 7.5"/>
40920
+ </svg>
40921
+ }
40922
+ </span>
40923
+ </label>
40924
+ }
40925
+ </div>
40926
+ @if (_activeError()) {
40927
+ <p class="ip-desc ip-desc-error" [id]="_descId" role="alert">{{ _activeError() }}</p>
40928
+ } @else if (hint()) {
40929
+ <p class="ip-desc" [id]="_descId">{{ hint() }}</p>
40930
+ }
40931
+ </fieldset>
40932
+ `,
40933
+ styles: [":host{display:block}.ip-field{display:flex;flex-direction:column;gap:6px;border:0;margin:0;padding:0;min-width:0}.ip-label{padding:0;margin-bottom:6px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ip-required{color:#dc2626;margin-left:2px}.ip-options{display:flex;flex-wrap:wrap;gap:8px;min-width:0}.ip-options.ip-grid{display:grid;grid-template-columns:repeat(var(--ip-cols),max-content)}.ip-option{position:relative;display:inline-flex;cursor:pointer}.ip-input{position:absolute;inset:0;width:100%;height:100%;margin:0;opacity:0;cursor:inherit}.ip-swatch{display:inline-flex;align-items:center;justify-content:center;position:relative;width:36px;height:36px;border-radius:8px;box-sizing:border-box;background:#fff;color:#334155;border:1px solid #cbd5e1;box-shadow:0 0 0 0 transparent;transition:box-shadow .12s}.ip-option:hover .ip-swatch{border-color:#64748b}.ip-input:focus-visible+.ip-swatch{outline:2px solid #3b82f6;outline-offset:3px}.ip-option.ip-selected .ip-swatch{background:#1e293b;color:#fff;border-color:#1e293b}.ip-check{position:absolute;right:2px;bottom:2px;padding:1px;border-radius:50%;background:#fff;color:#1e293b;border:1px solid #1e293b;box-sizing:content-box}.ip-option-disabled{cursor:not-allowed;opacity:.45}.ip-error .ip-option .ip-swatch{border-color:#dc2626}.ip-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b;overflow-wrap:anywhere}.ip-desc-error{color:#dc2626}@media(pointer:coarse),(max-width:480px){.ip-options{gap:4px}.ip-option{min-width:44px;min-height:44px;align-items:center;justify-content:center}.ip-options.ip-grid{grid-template-columns:repeat(auto-fill,44px)}}\n"]
40934
+ }]
40935
+ }],
40936
+ ctorParameters: () => [],
40937
+ propDecorators: {
40938
+ label: [{
40939
+ type: i0.Input,
40940
+ args: [{
40941
+ isSignal: true,
40942
+ alias: "label",
40943
+ required: false
40944
+ }]
40945
+ }],
40946
+ options: [{
40947
+ type: i0.Input,
40948
+ args: [{
40949
+ isSignal: true,
40950
+ alias: "options",
40951
+ required: false
40952
+ }]
40953
+ }],
40954
+ required: [{
40955
+ type: i0.Input,
40956
+ args: [{
40957
+ isSignal: true,
40958
+ alias: "required",
40959
+ required: false
40960
+ }]
40961
+ }],
40962
+ hint: [{
40963
+ type: i0.Input,
40964
+ args: [{
40965
+ isSignal: true,
40966
+ alias: "hint",
40967
+ required: false
40968
+ }]
40969
+ }],
40970
+ error: [{
40971
+ type: i0.Input,
40972
+ args: [{
40973
+ isSignal: true,
40974
+ alias: "error",
40975
+ required: false
40976
+ }]
40977
+ }],
40978
+ showErrors: [{
40979
+ type: i0.Input,
40980
+ args: [{
40981
+ isSignal: true,
40982
+ alias: "showErrors",
40983
+ required: false
40984
+ }]
40985
+ }],
40986
+ columns: [{
40987
+ type: i0.Input,
40988
+ args: [{
40989
+ isSignal: true,
40990
+ alias: "columns",
40991
+ required: false
40992
+ }]
40993
+ }],
40994
+ name: [{
40995
+ type: i0.Input,
40996
+ args: [{
40997
+ isSignal: true,
40998
+ alias: "name",
40999
+ required: false
41000
+ }]
41001
+ }],
41002
+ _disabledInput: [{
41003
+ type: i0.Input,
41004
+ args: [{
41005
+ isSignal: true,
41006
+ alias: "disabled",
41007
+ required: false
41008
+ }]
41009
+ }],
41010
+ invalidChange: [{
41011
+ type: i0.Output,
41012
+ args: ["invalidChange"]
41013
+ }],
41014
+ valueChange: [{
41015
+ type: i0.Output,
41016
+ args: ["valueChange"]
41017
+ }]
41018
+ }
41019
+ });
41020
+ var RadioMatrixComponent = class RadioMatrixComponent {
41021
+ get _name() {
41022
+ return this.name() || this._generatedName;
41023
+ }
41024
+ constructor() {
41025
+ this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
41026
+ this.rowHeader = input("", ...ngDevMode ? [{ debugName: "rowHeader" }] : /* istanbul ignore next */ []);
41027
+ this.rows = input([], ...ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []);
41028
+ this.columns = input([], ...ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []);
41029
+ this.required = input(false, ...ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []);
41030
+ this.hint = input("", ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
41031
+ this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
41032
+ this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
41033
+ this.name = input("", ...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
41034
+ this._disabledInput = input(false, {
41035
+ ...ngDevMode ? { debugName: "_disabledInput" } : /* istanbul ignore next */ {},
41036
+ alias: "disabled"
41037
+ });
41038
+ this._cvaDisabled = signal(false, ...ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []);
41039
+ this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
41040
+ this._generatedName = `rm-${Math.random().toString(36).slice(2, 8)}`;
41041
+ this._descId = `${this._generatedName}-desc`;
41042
+ this._value = signal({}, ...ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []);
41043
+ this._reveal = createFieldReveal(this.showErrors);
41044
+ this._issue = computed(() => this._check(this._value()), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
41045
+ this.invalid = computed(() => !!this.error() || !!this._issue(), ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
41046
+ this.errorMessage = computed(() => this._issue()?.message ?? "", ...ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []);
41047
+ this.invalidChange = output();
41048
+ this._activeError = computed(() => this.error() || (this._reveal.revealed() ? this.errorMessage() : ""), ...ngDevMode ? [{ debugName: "_activeError" }] : /* istanbul ignore next */ []);
41049
+ this._onValidatorChange = () => {};
41050
+ this._onChange = (_) => {};
41051
+ this._onTouched = () => {};
41052
+ effect(() => {
41053
+ this.invalidChange.emit(this.invalid());
41054
+ });
41055
+ }
41056
+ ngOnChanges() {
41057
+ this._onValidatorChange();
41058
+ }
41059
+ validate(control) {
41060
+ return issueToErrors(this._check(this._toRecord(control.value)));
41061
+ }
41062
+ registerOnValidatorChange(fn) {
41063
+ this._onValidatorChange = fn;
41064
+ }
41065
+ writeValue(val) {
41066
+ this._value.set(this._toRecord(val));
41067
+ }
41068
+ registerOnChange(fn) {
41069
+ this._onChange = fn;
41070
+ }
41071
+ registerOnTouched(fn) {
41072
+ this._onTouched = fn;
41073
+ }
41074
+ setDisabledState(d) {
41075
+ this._cvaDisabled.set(d);
41076
+ }
41077
+ onSelect(row, column) {
41078
+ const next = {
41079
+ ...this._value(),
41080
+ [row]: column
41081
+ };
41082
+ this._value.set(next);
41083
+ this._onChange(next);
41084
+ }
41085
+ _rowInvalid(row) {
41086
+ if (this.disabled() || row.disabled || !this._reveal.revealed()) return false;
41087
+ const v = this._value()[row.value] ?? "";
41088
+ return v ? !this.columns().some((c) => c.value === v) : this.required();
41089
+ }
41090
+ onFocusOut(event) {
41091
+ const next = event.relatedTarget;
41092
+ if (next && event.currentTarget.contains(next)) return;
41093
+ this._onTouched();
41094
+ this._reveal.touched.set(true);
41095
+ }
41096
+ _toRecord(val) {
41097
+ return val && typeof val === "object" ? { ...val } : {};
41098
+ }
41099
+ _check(value) {
41100
+ if (this.disabled()) return null;
41101
+ const cols = this.columns();
41102
+ const rows = this.rows().filter((r) => !r.disabled);
41103
+ if (cols.length > 0 && rows.some((r) => value[r.value] && !cols.some((c) => c.value === value[r.value]))) return {
41104
+ key: "option",
41105
+ message: "Select a valid option."
41106
+ };
41107
+ if (this.required() && rows.some((r) => !value[r.value])) {
41108
+ const label = this.label().trim();
41109
+ return {
41110
+ key: "required",
41111
+ message: label ? `${label}: choose an option in every row.` : "Choose an option in every row."
41112
+ };
41113
+ }
41114
+ return null;
41115
+ }
41116
+ static {
41117
+ this.ɵfac = i0.ɵɵngDeclareFactory({
41118
+ minVersion: "12.0.0",
41119
+ version: "22.2.2",
41120
+ ngImport: i0,
41121
+ type: RadioMatrixComponent,
41122
+ deps: [],
41123
+ target: i0.ɵɵFactoryTarget.Component
41124
+ });
41125
+ }
41126
+ static {
41127
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
41128
+ minVersion: "17.0.0",
41129
+ version: "22.2.2",
41130
+ type: RadioMatrixComponent,
41131
+ isStandalone: true,
41132
+ selector: "ui-radio-matrix",
41133
+ inputs: {
41134
+ label: {
41135
+ classPropertyName: "label",
41136
+ publicName: "label",
41137
+ isSignal: true,
41138
+ isRequired: false,
41139
+ transformFunction: null
41140
+ },
41141
+ rowHeader: {
41142
+ classPropertyName: "rowHeader",
41143
+ publicName: "rowHeader",
41144
+ isSignal: true,
41145
+ isRequired: false,
41146
+ transformFunction: null
41147
+ },
41148
+ rows: {
41149
+ classPropertyName: "rows",
41150
+ publicName: "rows",
41151
+ isSignal: true,
41152
+ isRequired: false,
41153
+ transformFunction: null
41154
+ },
41155
+ columns: {
41156
+ classPropertyName: "columns",
41157
+ publicName: "columns",
40123
41158
  isSignal: true,
40124
41159
  isRequired: false,
40125
41160
  transformFunction: null
@@ -45769,7 +46804,11 @@ var CalendarComponent = class CalendarComponent {
45769
46804
  kind: "component",
45770
46805
  type: BadgeComponent,
45771
46806
  selector: "ui-badge",
45772
- inputs: ["label", "variant"]
46807
+ inputs: [
46808
+ "label",
46809
+ "variant",
46810
+ "color"
46811
+ ]
45773
46812
  },
45774
46813
  {
45775
46814
  kind: "component",
@@ -45802,7 +46841,9 @@ var CalendarComponent = class CalendarComponent {
45802
46841
  "name",
45803
46842
  "noWrap",
45804
46843
  "orientation",
45805
- "controlsPanels"
46844
+ "controlsPanels",
46845
+ "showDescription",
46846
+ "headingLevel"
45806
46847
  ],
45807
46848
  outputs: ["tabChange"]
45808
46849
  },
@@ -49983,7 +51024,11 @@ var SetupWizardComponent = class SetupWizardComponent {
49983
51024
  kind: "component",
49984
51025
  type: BadgeComponent,
49985
51026
  selector: "ui-badge",
49986
- inputs: ["label", "variant"]
51027
+ inputs: [
51028
+ "label",
51029
+ "variant",
51030
+ "color"
51031
+ ]
49987
51032
  },
49988
51033
  {
49989
51034
  kind: "component",
@@ -50110,7 +51155,9 @@ var SetupWizardComponent = class SetupWizardComponent {
50110
51155
  "name",
50111
51156
  "noWrap",
50112
51157
  "orientation",
50113
- "controlsPanels"
51158
+ "controlsPanels",
51159
+ "showDescription",
51160
+ "headingLevel"
50114
51161
  ],
50115
51162
  outputs: ["tabChange"]
50116
51163
  },
@@ -52312,7 +53359,9 @@ var EmailTemplateEditorComponent = class EmailTemplateEditorComponent {
52312
53359
  "name",
52313
53360
  "noWrap",
52314
53361
  "orientation",
52315
- "controlsPanels"
53362
+ "controlsPanels",
53363
+ "showDescription",
53364
+ "headingLevel"
52316
53365
  ],
52317
53366
  outputs: ["tabChange"]
52318
53367
  },
@@ -54092,7 +55141,11 @@ var ReminderAlertsComponent = class ReminderAlertsComponent {
54092
55141
  kind: "component",
54093
55142
  type: BadgeComponent,
54094
55143
  selector: "ui-badge",
54095
- inputs: ["label", "variant"]
55144
+ inputs: [
55145
+ "label",
55146
+ "variant",
55147
+ "color"
55148
+ ]
54096
55149
  },
54097
55150
  {
54098
55151
  kind: "component",
@@ -55783,7 +56836,11 @@ var ConversationsComponent = class ConversationsComponent {
55783
56836
  kind: "component",
55784
56837
  type: BadgeComponent,
55785
56838
  selector: "ui-badge",
55786
- inputs: ["label", "variant"]
56839
+ inputs: [
56840
+ "label",
56841
+ "variant",
56842
+ "color"
56843
+ ]
55787
56844
  },
55788
56845
  {
55789
56846
  kind: "component",
@@ -59417,6 +60474,6 @@ i0.ɵɵngDeclareClassMetadata({
59417
60474
  }]
59418
60475
  }
59419
60476
  });
59420
- export { ALLOCATION_CUSTOM, ASCII_SPECIAL_PASSWORD_RULES, ActionBarComponent, AddressInputComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BankAccountFormComponent, BarRowComponent, BoardCardDirective, BoardComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, COMMON_DETAIL_GROUP_STYLES, CalendarComponent, CardListItemComponent, CheckboxComponent, CheckboxTrailingDirective, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, ConversationRichBodyComponent, ConversationsComponent, DEFAULT_ALLOCATION_MODES, DEFAULT_BANK_ACCOUNT_TYPE_OPTIONS, DEFAULT_BANK_HOLDER_TYPE_OPTIONS, DEFAULT_BANK_MANDATE_TEXT, DEFAULT_EMAIL_TEMPLATE_BLOCK_GROUPS, DEFAULT_EMAIL_TEMPLATE_VARIABLE_GROUPS, DEFAULT_PASSWORD_RULES, DEFAULT_PAYMENT_METHODS, DETAIL_CARD_HEADER_BG, DETAIL_GROUP_HEADER_BG, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DropdownComponent, EMAIL_BLOCK_DRAG_TYPE, EMAIL_TEMPLATE_MAX_BODY, EMAIL_TEMPLATE_MAX_TEXT, EMAIL_TEMPLATE_START_TEXT, EmailTemplateEditorComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FadeComponent, FileInputComponent, FillViewportDirective, FixedFooterComponent, FormColSpanDirective, FormComponent, FormRowComponent, FormSectionComponent, HintComponent, ICON_NAMES, IDX_BEHAVIOR_SIGNALS, INTEGRATION_CATALOG, INTEGRATION_FIELD_DEFS, INTEGRATION_GROUP_ORDER, INTEGRATION_OPTION_DEFS, IconComponent, ImageComponent, ImageGalleryComponent, ImageGalleryDialogComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, ImportSourceGridComponent, KeypadComponent, KpiCardComponent, LAYOUT_GAP_PX, LISTED_SPECIAL_PASSWORD_RULES, ListComponent, ListItemComponent, LiveRegionComponent, MAX_EMAIL_ADDRESS_LENGTH, MAX_PAYMENT_AMOUNT, MIN_PAYMENT_AMOUNT, ModalComponent, MoreMenuComponent, MultiSelectComponent, NOTES_MAX_LENGTH, NotesComponent, OfflineBannerComponent, OptionCardComponent, PASSWORD_MAX_LENGTH, PAYMENT_METHOD, PAYMENT_METHOD_PLUGIN, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PageComponent, PaginationComponent, PanelInfoListComponent, PasswordRequirementsComponent, PaymentCustomMethodComponent, PaymentMethodPlugin, PaymentSidePanelComponent, PdfHotspotComponent, PhoneNumberPickerComponent, PillTabPanelDirective, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, RadioOptionContentDirective, ReadonlyFieldsetComponent, ReminderAlertsComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SETUP_DONE_KEY, SETUP_INTEGRATIONS, SearchInputComponent, SectionHeaderComponent, SelectComponent, SetupWizardComponent, SetupWizardStepDirective, SetupWizardStepHeaderDirective, ShareMenuComponent, ShowComponent, SidePanelComponent, SidebarLayoutComponent, SignaturePadComponent, SkeletonComponent, SnackbarComponent, SnackbarService, StackComponent, StarComponent, StepperComponent, TableToolbarComponent, TextComponent, TextInputComponent, TextTemplatePickerComponent, TextareaInputComponent, TimeInputComponent, TimelineComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_LOCATIONS, US_STATES, US_STATE_OPTIONS, US_ZIP_PATTERN, UiFieldValidity, acceptLabel, appShellGroupsStorageKey, autoVariant, blockHasContent, buildDefaultSchedule, buildPreviewDocument, buildVideoBlockHtml, builtInActionIcon, businessTimeOptions, callHost, conversationDateLabel, conversationHtmlToText, conversationInitial, conversationMessageStatusLabel, conversationMessageStatusMark, createFieldReveal, createPasswordPolicyValidator, decodeFilterValues, digitsOnly, downloadBlob, emailShareUrl, emptyAddress, encodeFilterValue, encodeFilterValues, errorContextInterceptor, escapeHtml, facebookShareUrl, fileMatchesAccept, fileNameFromContentDisposition, formatAddress, formatAddressValue, formatAddressValueOneLine, formatCategoryLabel, formatConversationPhone, formatConversationTime, formatCurrency, formatDuration, formatFileSize, formatIsoDate, formatIsoDateTime, formatMessageTime, formatPhone, formatPhoneDisplay, formatShortDate, formatTime, formatVideoDuration, getEligibleIds, getEligibleOptions, getErrorMessage, getInitials, gmailShareUrl, groupMessagesByDay, hostErrorMessage, humanReadableMessage, iconPath, insideEditorBlock, integrationPlainText, integrationsForApp, integrationsOnlyFor, isBlockDrag, isEmptyAddress, isValidAmount, isValidEmailAddress, isValidZip, isWebUrl, isoKey, issueToErrors, last4Error, linkedInShareUrl, maxLengthIssue, mergeDescribedBy, normalizeAddress, normalizeHexColor, outlookShareUrl, parseAddressOneLine, parseAddressValue, parseBizHours, parseIso, parseTime, passwordMeetsRules, periodGroup, pillTabId, pillTabPanelId, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, serializeBizHours, serializedTextLength, setupIntegrations, splitIntro, terminalTimeoutText, terminalVerdict, todayInTimezone, truncateConversationText, xShareUrl };
60477
+ export { ALLOCATION_CUSTOM, ASCII_SPECIAL_PASSWORD_RULES, ActionBarComponent, AddressInputComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BankAccountFormComponent, BarRowComponent, BoardCardDirective, BoardComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, COMMON_DETAIL_GROUP_STYLES, CalendarComponent, CardListItemComponent, CheckboxComponent, CheckboxTrailingDirective, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, ConversationRichBodyComponent, ConversationsComponent, DEFAULT_ALLOCATION_MODES, DEFAULT_BANK_ACCOUNT_TYPE_OPTIONS, DEFAULT_BANK_HOLDER_TYPE_OPTIONS, DEFAULT_BANK_MANDATE_TEXT, DEFAULT_EMAIL_TEMPLATE_BLOCK_GROUPS, DEFAULT_EMAIL_TEMPLATE_VARIABLE_GROUPS, DEFAULT_PASSWORD_RULES, DEFAULT_PAYMENT_METHODS, DETAIL_CARD_HEADER_BG, DETAIL_GROUP_HEADER_BG, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DropdownComponent, EMAIL_BLOCK_DRAG_TYPE, EMAIL_TEMPLATE_MAX_BODY, EMAIL_TEMPLATE_MAX_TEXT, EMAIL_TEMPLATE_START_TEXT, EmailTemplateEditorComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FadeComponent, FileInputComponent, FillViewportDirective, FixedFooterComponent, FormColSpanDirective, FormComponent, FormRowComponent, FormSectionComponent, HintComponent, ICON_NAMES, IDX_BEHAVIOR_SIGNALS, INTEGRATION_CATALOG, INTEGRATION_FIELD_DEFS, INTEGRATION_GROUP_ORDER, INTEGRATION_OPTION_DEFS, IconComponent, IconPickerComponent, ImageComponent, ImageGalleryComponent, ImageGalleryDialogComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, ImportSourceGridComponent, KeypadComponent, KpiCardComponent, LAYOUT_GAP_PX, LISTED_SPECIAL_PASSWORD_RULES, ListComponent, ListItemComponent, LiveRegionComponent, MAX_EMAIL_ADDRESS_LENGTH, MAX_PAYMENT_AMOUNT, MIN_PAYMENT_AMOUNT, ModalComponent, MoreMenuComponent, MultiSelectComponent, NOTES_MAX_LENGTH, NotesComponent, OfflineBannerComponent, OptionCardComponent, PASSWORD_MAX_LENGTH, PAYMENT_METHOD, PAYMENT_METHOD_PLUGIN, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PageComponent, PaginationComponent, PanelInfoListComponent, PasswordRequirementsComponent, PaymentCustomMethodComponent, PaymentMethodPlugin, PaymentSidePanelComponent, PdfHotspotComponent, PhoneNumberPickerComponent, PillTabPanelDirective, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, RadioOptionContentDirective, ReadonlyFieldsetComponent, ReminderAlertsComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SETUP_DONE_KEY, SETUP_INTEGRATIONS, SearchInputComponent, SectionHeaderComponent, SelectComponent, SetupWizardComponent, SetupWizardStepDirective, SetupWizardStepHeaderDirective, ShareMenuComponent, ShowComponent, SidePanelComponent, SidebarLayoutComponent, SignaturePadComponent, SkeletonComponent, SnackbarComponent, SnackbarService, StackComponent, StarComponent, StepperComponent, SwatchPickerComponent, TableToolbarComponent, TextComponent, TextInputComponent, TextTemplatePickerComponent, TextareaInputComponent, TimeInputComponent, TimelineComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_LOCATIONS, US_STATES, US_STATE_OPTIONS, US_ZIP_PATTERN, UiFieldValidity, acceptLabel, appShellGroupsStorageKey, autoVariant, blockHasContent, buildDefaultSchedule, buildPreviewDocument, buildVideoBlockHtml, builtInActionIcon, businessTimeOptions, callHost, conversationDateLabel, conversationHtmlToText, conversationInitial, conversationMessageStatusLabel, conversationMessageStatusMark, createFieldReveal, createPasswordPolicyValidator, decodeFilterValues, digitsOnly, downloadBlob, emailShareUrl, emptyAddress, encodeFilterValue, encodeFilterValues, errorContextInterceptor, escapeHtml, facebookShareUrl, fileMatchesAccept, fileNameFromContentDisposition, formatAddress, formatAddressValue, formatAddressValueOneLine, formatCategoryLabel, formatConversationPhone, formatConversationTime, formatCurrency, formatDuration, formatFileSize, formatIsoDate, formatIsoDateTime, formatMessageTime, formatPhone, formatPhoneDisplay, formatShortDate, formatTime, formatVideoDuration, getEligibleIds, getEligibleOptions, getErrorMessage, getInitials, gmailShareUrl, groupMessagesByDay, hostErrorMessage, humanReadableMessage, iconPath, insideEditorBlock, integrationPlainText, integrationsForApp, integrationsOnlyFor, isBlockDrag, isEmptyAddress, isValidAmount, isValidEmailAddress, isValidZip, isWebUrl, isoKey, issueToErrors, last4Error, linkedInShareUrl, maxLengthIssue, mergeDescribedBy, normalizeAddress, normalizeHexColor, outlookShareUrl, parseAddressOneLine, parseAddressValue, parseBizHours, parseIso, parseTime, passwordMeetsRules, periodGroup, pillTabDescriptionId, pillTabId, pillTabPanelId, pillTabTitleId, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, serializeBizHours, serializedTextLength, setupIntegrations, splitIntro, terminalTimeoutText, terminalVerdict, todayInTimezone, truncateConversationText, xShareUrl };
59421
60478
 
59422
60479
  //# sourceMappingURL=forgeroute-ui.mjs.map