@forgeroute/ui 0.4.9 → 0.4.10

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.
@@ -997,7 +997,12 @@ var ColumnFilterComponent = class ColumnFilterComponent {
997
997
  const reposition = () => this._reposition();
998
998
  window.addEventListener("resize", reposition);
999
999
  document.addEventListener("scroll", reposition, true);
1000
+ const onKeydown = (event) => {
1001
+ if (event.key === "Escape") this.onEscape(event);
1002
+ };
1003
+ document.addEventListener("keydown", onKeydown, true);
1000
1004
  onCleanup(() => {
1005
+ document.removeEventListener("keydown", onKeydown, true);
1001
1006
  window.removeEventListener("resize", reposition);
1002
1007
  document.removeEventListener("scroll", reposition, true);
1003
1008
  });
@@ -1036,11 +1041,12 @@ var ColumnFilterComponent = class ColumnFilterComponent {
1036
1041
  onDocumentClick(_event) {
1037
1042
  if (this.open()) this.open.set(false);
1038
1043
  }
1039
- onEscape() {
1040
- if (this.open()) {
1041
- this.open.set(false);
1042
- this._trigger()?.focus();
1043
- }
1044
+ onEscape(event) {
1045
+ if (!this.open()) return;
1046
+ event?.stopPropagation();
1047
+ event?.preventDefault();
1048
+ this.open.set(false);
1049
+ this._trigger()?.focus();
1044
1050
  }
1045
1051
  onArrow(event, dir) {
1046
1052
  if (!this.open()) return;
@@ -1126,7 +1132,6 @@ var ColumnFilterComponent = class ColumnFilterComponent {
1126
1132
  outputs: { filterChange: "filterChange" },
1127
1133
  host: { listeners: {
1128
1134
  "document:click": "onDocumentClick($event)",
1129
- "document:keydown.escape": "onEscape()",
1130
1135
  "keydown.arrowdown": "onArrow($event, 1)",
1131
1136
  "keydown.arrowup": "onArrow($event, -1)"
1132
1137
  } },
@@ -1218,7 +1223,6 @@ i0.ɵɵngDeclareClassMetadata({
1218
1223
  changeDetection: ChangeDetectionStrategy.OnPush,
1219
1224
  host: {
1220
1225
  "(document:click)": "onDocumentClick($event)",
1221
- "(document:keydown.escape)": "onEscape()",
1222
1226
  "(keydown.arrowdown)": "onArrow($event, 1)",
1223
1227
  "(keydown.arrowup)": "onArrow($event, -1)"
1224
1228
  },
@@ -1643,6 +1647,10 @@ var MoreMenuComponent = class MoreMenuComponent {
1643
1647
  if (!this.open()) return;
1644
1648
  const onPointerDown = (event) => this.onDocumentPointerDown(event);
1645
1649
  document.addEventListener("pointerdown", onPointerDown, true);
1650
+ const onKeydown = (event) => {
1651
+ if (event.key === "Escape") this.onEscape(event);
1652
+ };
1653
+ document.addEventListener("keydown", onKeydown, true);
1646
1654
  const fixed = this.placement() !== null;
1647
1655
  const onScroll = (event) => {
1648
1656
  if (!(event.target instanceof Node && this._dropdownEl()?.contains(event.target))) this.open.set(false);
@@ -1656,6 +1664,7 @@ var MoreMenuComponent = class MoreMenuComponent {
1656
1664
  }
1657
1665
  onCleanup(() => {
1658
1666
  document.removeEventListener("pointerdown", onPointerDown, true);
1667
+ document.removeEventListener("keydown", onKeydown, true);
1659
1668
  if (fixed) {
1660
1669
  document.removeEventListener("scroll", onScroll, true);
1661
1670
  window.removeEventListener("resize", onResize);
@@ -1774,11 +1783,12 @@ var MoreMenuComponent = class MoreMenuComponent {
1774
1783
  if (target instanceof Node && this._el.nativeElement.contains(target)) return;
1775
1784
  this.open.set(false);
1776
1785
  }
1777
- onEscape() {
1778
- if (this.open()) {
1779
- this.open.set(false);
1780
- this._trigger()?.focus();
1781
- }
1786
+ onEscape(event) {
1787
+ if (!this.open()) return;
1788
+ event?.stopPropagation();
1789
+ event?.preventDefault();
1790
+ this.open.set(false);
1791
+ this._trigger()?.focus();
1782
1792
  }
1783
1793
  onArrow(event, dir) {
1784
1794
  if (!this.open()) return;
@@ -1862,7 +1872,6 @@ var MoreMenuComponent = class MoreMenuComponent {
1862
1872
  outputs: { actionClick: "actionClick" },
1863
1873
  host: { listeners: {
1864
1874
  "document:click": "onDocumentClick()",
1865
- "document:keydown.escape": "onEscape()",
1866
1875
  "keydown.arrowdown": "onArrow($event, 1)",
1867
1876
  "keydown.arrowup": "onArrow($event, -1)"
1868
1877
  } },
@@ -1920,7 +1929,6 @@ i0.ɵɵngDeclareClassMetadata({
1920
1929
  changeDetection: ChangeDetectionStrategy.OnPush,
1921
1930
  host: {
1922
1931
  "(document:click)": "onDocumentClick()",
1923
- "(document:keydown.escape)": "onEscape()",
1924
1932
  "(keydown.arrowdown)": "onArrow($event, 1)",
1925
1933
  "(keydown.arrowup)": "onArrow($event, -1)"
1926
1934
  },
@@ -3275,6 +3283,7 @@ var ButtonComponent = class ButtonComponent {
3275
3283
  this.routerLink = input(null, ...ngDevMode ? [{ debugName: "routerLink" }] : /* istanbul ignore next */ []);
3276
3284
  this.queryParams = input(null, ...ngDevMode ? [{ debugName: "queryParams" }] : /* istanbul ignore next */ []);
3277
3285
  this.fragment = input(null, ...ngDevMode ? [{ debugName: "fragment" }] : /* istanbul ignore next */ []);
3286
+ this.state = input(null, ...ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []);
3278
3287
  this.href = input(null, ...ngDevMode ? [{ debugName: "href" }] : /* istanbul ignore next */ []);
3279
3288
  this.target = input(null, ...ngDevMode ? [{ debugName: "target" }] : /* istanbul ignore next */ []);
3280
3289
  this.rel = input(null, ...ngDevMode ? [{ debugName: "rel" }] : /* istanbul ignore next */ []);
@@ -3301,6 +3310,14 @@ var ButtonComponent = class ButtonComponent {
3301
3310
  parts.add("noreferrer");
3302
3311
  return [...parts].join(" ");
3303
3312
  }, ...ngDevMode ? [{ debugName: "_rel" }] : /* istanbul ignore next */ []);
3313
+ this.shortLabel = input("", ...ngDevMode ? [{ debugName: "shortLabel" }] : /* istanbul ignore next */ []);
3314
+ this.shortBelow = input("md", ...ngDevMode ? [{ debugName: "shortBelow" }] : /* istanbul ignore next */ []);
3315
+ this._slClass = computed(() => {
3316
+ const below = this.shortBelow();
3317
+ if (typeof below === "number") return this._narrow() ? "btn-sl-num btn-sl-narrow" : "btn-sl-num";
3318
+ return "btn-sl-" + (below === "sm" || below === "lg" ? below : "md");
3319
+ }, ...ngDevMode ? [{ debugName: "_slClass" }] : /* istanbul ignore next */ []);
3320
+ this._narrow = signal(false, ...ngDevMode ? [{ debugName: "_narrow" }] : /* istanbul ignore next */ []);
3304
3321
  this.color = input(void 0, ...ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []);
3305
3322
  this.active = input(false, ...ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []);
3306
3323
  this.size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
@@ -3312,6 +3329,18 @@ var ButtonComponent = class ButtonComponent {
3312
3329
  this.ariaExpanded = input(void 0, ...ngDevMode ? [{ debugName: "ariaExpanded" }] : /* istanbul ignore next */ []);
3313
3330
  this.ariaPressed = input(void 0, ...ngDevMode ? [{ debugName: "ariaPressed" }] : /* istanbul ignore next */ []);
3314
3331
  this.ariaDescribedBy = input(void 0, ...ngDevMode ? [{ debugName: "ariaDescribedBy" }] : /* istanbul ignore next */ []);
3332
+ effect((onCleanup) => {
3333
+ const below = this.shortBelow();
3334
+ if (!this.shortLabel() || typeof below !== "number" || !Number.isFinite(below) || typeof window === "undefined" || typeof window.matchMedia !== "function") {
3335
+ this._narrow.set(false);
3336
+ return;
3337
+ }
3338
+ const mq = window.matchMedia(`(max-width: ${below - .02}px)`);
3339
+ const update = () => this._narrow.set(mq.matches);
3340
+ update();
3341
+ mq.addEventListener("change", update);
3342
+ onCleanup(() => mq.removeEventListener("change", update));
3343
+ });
3315
3344
  }
3316
3345
  static {
3317
3346
  this.ɵfac = i0.ɵɵngDeclareFactory({
@@ -3359,6 +3388,13 @@ var ButtonComponent = class ButtonComponent {
3359
3388
  isRequired: false,
3360
3389
  transformFunction: null
3361
3390
  },
3391
+ state: {
3392
+ classPropertyName: "state",
3393
+ publicName: "state",
3394
+ isSignal: true,
3395
+ isRequired: false,
3396
+ transformFunction: null
3397
+ },
3362
3398
  href: {
3363
3399
  classPropertyName: "href",
3364
3400
  publicName: "href",
@@ -3380,6 +3416,20 @@ var ButtonComponent = class ButtonComponent {
3380
3416
  isRequired: false,
3381
3417
  transformFunction: null
3382
3418
  },
3419
+ shortLabel: {
3420
+ classPropertyName: "shortLabel",
3421
+ publicName: "shortLabel",
3422
+ isSignal: true,
3423
+ isRequired: false,
3424
+ transformFunction: null
3425
+ },
3426
+ shortBelow: {
3427
+ classPropertyName: "shortBelow",
3428
+ publicName: "shortBelow",
3429
+ isSignal: true,
3430
+ isRequired: false,
3431
+ transformFunction: null
3432
+ },
3383
3433
  color: {
3384
3434
  classPropertyName: "color",
3385
3435
  publicName: "color",
@@ -3479,8 +3529,15 @@ var ButtonComponent = class ButtonComponent {
3479
3529
  @if (loading()) {
3480
3530
  <span class="spinner"></span>
3481
3531
  }
3482
- <ng-content />
3532
+ @if (shortLabel()) {
3533
+ <!-- shortLabel: the projected (long) text stays in the DOM, visually hidden while the short one shows, so the accessible name is always the long text; the short text is aria-hidden (never read twice). -->
3534
+ <span [class]="'btn-sl-long ' + _slClass()"><ng-container [ngTemplateOutlet]="projected" /></span>
3535
+ <span [class]="'btn-sl-short ' + _slClass()" aria-hidden="true">{{ shortLabel() }}</span>
3536
+ } @else {
3537
+ <ng-container [ngTemplateOutlet]="projected" />
3538
+ }
3483
3539
  </ng-template>
3540
+ <ng-template #projected><ng-content /></ng-template>
3484
3541
  @if (routerLink() !== null) {
3485
3542
  <!-- A real link (middle-click, open in new tab, screen readers say "link"): same look as the button of this variant, underlined. -->
3486
3543
  @if (disabled() || loading()) {
@@ -3498,6 +3555,7 @@ var ButtonComponent = class ButtonComponent {
3498
3555
  [routerLink]="routerLink()"
3499
3556
  [queryParams]="queryParams()"
3500
3557
  [fragment]="fragment() ?? undefined"
3558
+ [state]="state() ?? undefined"
3501
3559
  [class]="'btn btn-anchor btn-' + variant() + ' btn-' + size()"
3502
3560
  [class.btn-full]="fullWidth()"
3503
3561
  [attr.aria-label]="ariaLabel()"
@@ -3546,7 +3604,7 @@ var ButtonComponent = class ButtonComponent {
3546
3604
  }
3547
3605
  `,
3548
3606
  isInline: true,
3549
- styles: [":host{display:inline-flex}:host(.ui-btn-block){display:flex;width:100%}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:none;border-radius:8px;font-weight:600;cursor:pointer;font-family:inherit;transition:all .15s ease;white-space:nowrap}.btn:disabled{opacity:.5;cursor:not-allowed}.btn:focus-visible{outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}.btn-full{width:100%}.btn-primary{background:var(--ui-accent, #2563EB);color:var(--ui-on-accent, #fff);border:1px solid var(--ui-accent, #2563EB)}.btn-primary:hover:not(:disabled){background:var(--ui-accent-hover, #1D4ED8);border-color:var(--ui-accent-hover, #1D4ED8)}.btn-secondary{background:#fff;color:#334155;border:1px solid #e2e8f0}.btn-secondary:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.btn-ghost{background:transparent;color:#64748b;border:1px solid transparent}.btn-ghost:hover:not(:disabled){background:#f8fafc;color:#334155}.btn-ghost-start{display:flex;width:100%;justify-content:flex-start;text-align:start;white-space:normal;background:transparent;color:#334155;border:1px solid transparent}.btn-ghost-start:hover:not(:disabled){background:#f1f5f9;color:#1e293b}.btn-danger{background:#dc2626;color:#fff;border:1px solid #dc2626}.btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.btn-link{background:none;color:var(--ui-link, var(--ui-accent, #2563eb));border:none;padding:0;font-weight:500}.btn-link:hover:not(:disabled){color:var(--ui-link-hover, var(--ui-accent-hover, #1d4ed8))}.btn-link.btn-xs,.btn-link.btn-sm,.btn-link.btn-md,.btn-link.btn-lg{padding:0}.btn-anchor{text-decoration:none}.btn[aria-disabled=true]{opacity:.5;cursor:not-allowed;pointer-events:none}.btn-anchor.btn-link{text-decoration:underline;text-underline-offset:2px}.btn-warning{background:#f97316;color:#fff;border:1px solid #f97316}.btn-warning:hover:not(:disabled){background:#ea6c0a;border-color:#ea6c0a}.btn-tab{background:none;color:#64748b;border:none;border-bottom:2px solid transparent;border-radius:0;font-weight:600;font-size:.875rem;transition:all .15s}.btn-tab:hover:not(:disabled){background:none;color:#1e293b}.btn-tab.active{color:var(--ui-accent, #2563eb);border-bottom-color:var(--ui-accent, #2563eb)}.btn-tab.btn-xs,.btn-tab.btn-sm,.btn-tab.btn-md,.btn-tab.btn-lg{padding:10px 20px;border-radius:0}.btn-icon{width:28px;height:28px;padding:0;border-radius:6px;background:transparent;border:none;color:#64748b}.btn-icon:hover:not(:disabled){background:#f1f5f9;color:#334155}.btn-icon-danger{width:28px;height:28px;padding:0;border-radius:6px;background:transparent;border:none;color:#64748b}.btn-icon-danger:hover:not(:disabled){background:#fee2e2;color:#dc2626}.btn-xs{padding:3px 8px;font-size:.75rem;border-radius:5px;gap:4px}.btn-sm{padding:6px 12px;font-size:.8125rem;border-radius:6px}.btn-md{padding:10px 16px;font-size:.875rem}.btn-lg{padding:14px 20px;font-size:1rem}@media(pointer:coarse),(max-width:480px){.btn-xs,.btn-sm,.btn-md,.btn-lg,.btn-tab{min-height:44px}.btn-link.btn-xs,.btn-link.btn-sm,.btn-link.btn-md,.btn-link.btn-lg{min-height:0}.btn-icon,.btn-icon-danger{position:relative}.btn-icon:after,.btn-icon-danger:after{content:\"\";position:absolute;inset:-8px}}.spinner{width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top-color:currentColor;border-radius:50%;animation:spin .6s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"],
3607
+ styles: [":host{display:inline-flex}:host(.ui-btn-block){display:flex;width:100%}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:none;border-radius:8px;font-weight:600;cursor:pointer;font-family:inherit;transition:all .15s ease;white-space:nowrap}.btn:disabled{opacity:.5;cursor:not-allowed}.btn:focus-visible{outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}.btn-full{width:100%}.btn-primary{background:var(--ui-accent, #2563EB);color:var(--ui-on-accent, #fff);border:1px solid var(--ui-accent, #2563EB)}.btn-primary:hover:not(:disabled){background:var(--ui-accent-hover, #1D4ED8);border-color:var(--ui-accent-hover, #1D4ED8)}.btn-secondary{background:#fff;color:#334155;border:1px solid #e2e8f0}.btn-secondary:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.btn-ghost{background:transparent;color:#64748b;border:1px solid transparent}.btn-ghost:hover:not(:disabled){background:#f8fafc;color:#334155}.btn-ghost-start{display:flex;width:100%;justify-content:flex-start;text-align:start;white-space:normal;background:transparent;color:#334155;border:1px solid transparent}.btn-ghost-start:hover:not(:disabled){background:#f1f5f9;color:#1e293b}.btn-danger{background:#dc2626;color:#fff;border:1px solid #dc2626}.btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.btn-link{background:none;color:var(--ui-link, var(--ui-accent, #2563eb));border:none;padding:0;font-weight:500}.btn-link:hover:not(:disabled){color:var(--ui-link-hover, var(--ui-accent-hover, #1d4ed8))}.btn-link.btn-xs,.btn-link.btn-sm,.btn-link.btn-md,.btn-link.btn-lg{padding:0}.btn-anchor{text-decoration:none}.btn[aria-disabled=true]{opacity:.5;cursor:not-allowed;pointer-events:none}.btn-anchor.btn-link{text-decoration:underline;text-underline-offset:2px}.btn-warning{background:#f97316;color:#fff;border:1px solid #f97316}.btn-warning:hover:not(:disabled){background:#ea6c0a;border-color:#ea6c0a}.btn-tab{background:none;color:#64748b;border:none;border-bottom:2px solid transparent;border-radius:0;font-weight:600;font-size:.875rem;transition:all .15s}.btn-tab:hover:not(:disabled){background:none;color:#1e293b}.btn-tab.active{color:var(--ui-accent, #2563eb);border-bottom-color:var(--ui-accent, #2563eb)}.btn-tab.btn-xs,.btn-tab.btn-sm,.btn-tab.btn-md,.btn-tab.btn-lg{padding:10px 20px;border-radius:0}.btn-icon{width:28px;height:28px;padding:0;border-radius:6px;background:transparent;border:none;color:#64748b}.btn-icon:hover:not(:disabled){background:#f1f5f9;color:#334155}.btn-icon-danger{width:28px;height:28px;padding:0;border-radius:6px;background:transparent;border:none;color:#64748b}.btn-icon-danger:hover:not(:disabled){background:#fee2e2;color:#dc2626}.btn-xs{padding:3px 8px;font-size:.75rem;border-radius:5px;gap:4px}.btn-sm{padding:6px 12px;font-size:.8125rem;border-radius:6px}.btn-md{padding:10px 16px;font-size:.875rem}.btn-lg{padding:14px 20px;font-size:1rem}@media(pointer:coarse),(max-width:480px){.btn-xs,.btn-sm,.btn-md,.btn-lg,.btn-tab{min-height:44px}.btn-link.btn-xs,.btn-link.btn-sm,.btn-link.btn-md,.btn-link.btn-lg{min-height:0}.btn-icon,.btn-icon-danger{position:relative}.btn-icon:after,.btn-icon-danger:after{content:\"\";position:absolute;inset:-8px}}.btn-sl-short{display:none}@media(max-width:479.98px){.btn-sl-sm.btn-sl-long{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0}.btn-sl-sm.btn-sl-short{display:inline}}@media(max-width:767.98px){.btn-sl-md.btn-sl-long{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0}.btn-sl-md.btn-sl-short{display:inline}}@media(max-width:1023.98px){.btn-sl-lg.btn-sl-long{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0}.btn-sl-lg.btn-sl-short{display:inline}}.btn-sl-long.btn-sl-narrow{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0}.btn-sl-short.btn-sl-narrow{display:inline}.spinner{width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top-color:currentColor;border-radius:50%;animation:spin .6s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"],
3550
3608
  dependencies: [{
3551
3609
  kind: "directive",
3552
3610
  type: NgTemplateOutlet,
@@ -3597,8 +3655,15 @@ i0.ɵɵngDeclareClassMetadata({
3597
3655
  @if (loading()) {
3598
3656
  <span class="spinner"></span>
3599
3657
  }
3600
- <ng-content />
3658
+ @if (shortLabel()) {
3659
+ <!-- shortLabel: the projected (long) text stays in the DOM, visually hidden while the short one shows, so the accessible name is always the long text; the short text is aria-hidden (never read twice). -->
3660
+ <span [class]="'btn-sl-long ' + _slClass()"><ng-container [ngTemplateOutlet]="projected" /></span>
3661
+ <span [class]="'btn-sl-short ' + _slClass()" aria-hidden="true">{{ shortLabel() }}</span>
3662
+ } @else {
3663
+ <ng-container [ngTemplateOutlet]="projected" />
3664
+ }
3601
3665
  </ng-template>
3666
+ <ng-template #projected><ng-content /></ng-template>
3602
3667
  @if (routerLink() !== null) {
3603
3668
  <!-- A real link (middle-click, open in new tab, screen readers say "link"): same look as the button of this variant, underlined. -->
3604
3669
  @if (disabled() || loading()) {
@@ -3616,6 +3681,7 @@ i0.ɵɵngDeclareClassMetadata({
3616
3681
  [routerLink]="routerLink()"
3617
3682
  [queryParams]="queryParams()"
3618
3683
  [fragment]="fragment() ?? undefined"
3684
+ [state]="state() ?? undefined"
3619
3685
  [class]="'btn btn-anchor btn-' + variant() + ' btn-' + size()"
3620
3686
  [class.btn-full]="fullWidth()"
3621
3687
  [attr.aria-label]="ariaLabel()"
@@ -3663,9 +3729,10 @@ i0.ɵɵngDeclareClassMetadata({
3663
3729
  ><ng-container [ngTemplateOutlet]="content" /></button>
3664
3730
  }
3665
3731
  `,
3666
- styles: [":host{display:inline-flex}:host(.ui-btn-block){display:flex;width:100%}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:none;border-radius:8px;font-weight:600;cursor:pointer;font-family:inherit;transition:all .15s ease;white-space:nowrap}.btn:disabled{opacity:.5;cursor:not-allowed}.btn:focus-visible{outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}.btn-full{width:100%}.btn-primary{background:var(--ui-accent, #2563EB);color:var(--ui-on-accent, #fff);border:1px solid var(--ui-accent, #2563EB)}.btn-primary:hover:not(:disabled){background:var(--ui-accent-hover, #1D4ED8);border-color:var(--ui-accent-hover, #1D4ED8)}.btn-secondary{background:#fff;color:#334155;border:1px solid #e2e8f0}.btn-secondary:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.btn-ghost{background:transparent;color:#64748b;border:1px solid transparent}.btn-ghost:hover:not(:disabled){background:#f8fafc;color:#334155}.btn-ghost-start{display:flex;width:100%;justify-content:flex-start;text-align:start;white-space:normal;background:transparent;color:#334155;border:1px solid transparent}.btn-ghost-start:hover:not(:disabled){background:#f1f5f9;color:#1e293b}.btn-danger{background:#dc2626;color:#fff;border:1px solid #dc2626}.btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.btn-link{background:none;color:var(--ui-link, var(--ui-accent, #2563eb));border:none;padding:0;font-weight:500}.btn-link:hover:not(:disabled){color:var(--ui-link-hover, var(--ui-accent-hover, #1d4ed8))}.btn-link.btn-xs,.btn-link.btn-sm,.btn-link.btn-md,.btn-link.btn-lg{padding:0}.btn-anchor{text-decoration:none}.btn[aria-disabled=true]{opacity:.5;cursor:not-allowed;pointer-events:none}.btn-anchor.btn-link{text-decoration:underline;text-underline-offset:2px}.btn-warning{background:#f97316;color:#fff;border:1px solid #f97316}.btn-warning:hover:not(:disabled){background:#ea6c0a;border-color:#ea6c0a}.btn-tab{background:none;color:#64748b;border:none;border-bottom:2px solid transparent;border-radius:0;font-weight:600;font-size:.875rem;transition:all .15s}.btn-tab:hover:not(:disabled){background:none;color:#1e293b}.btn-tab.active{color:var(--ui-accent, #2563eb);border-bottom-color:var(--ui-accent, #2563eb)}.btn-tab.btn-xs,.btn-tab.btn-sm,.btn-tab.btn-md,.btn-tab.btn-lg{padding:10px 20px;border-radius:0}.btn-icon{width:28px;height:28px;padding:0;border-radius:6px;background:transparent;border:none;color:#64748b}.btn-icon:hover:not(:disabled){background:#f1f5f9;color:#334155}.btn-icon-danger{width:28px;height:28px;padding:0;border-radius:6px;background:transparent;border:none;color:#64748b}.btn-icon-danger:hover:not(:disabled){background:#fee2e2;color:#dc2626}.btn-xs{padding:3px 8px;font-size:.75rem;border-radius:5px;gap:4px}.btn-sm{padding:6px 12px;font-size:.8125rem;border-radius:6px}.btn-md{padding:10px 16px;font-size:.875rem}.btn-lg{padding:14px 20px;font-size:1rem}@media(pointer:coarse),(max-width:480px){.btn-xs,.btn-sm,.btn-md,.btn-lg,.btn-tab{min-height:44px}.btn-link.btn-xs,.btn-link.btn-sm,.btn-link.btn-md,.btn-link.btn-lg{min-height:0}.btn-icon,.btn-icon-danger{position:relative}.btn-icon:after,.btn-icon-danger:after{content:\"\";position:absolute;inset:-8px}}.spinner{width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top-color:currentColor;border-radius:50%;animation:spin .6s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"]
3732
+ styles: [":host{display:inline-flex}:host(.ui-btn-block){display:flex;width:100%}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:none;border-radius:8px;font-weight:600;cursor:pointer;font-family:inherit;transition:all .15s ease;white-space:nowrap}.btn:disabled{opacity:.5;cursor:not-allowed}.btn:focus-visible{outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}.btn-full{width:100%}.btn-primary{background:var(--ui-accent, #2563EB);color:var(--ui-on-accent, #fff);border:1px solid var(--ui-accent, #2563EB)}.btn-primary:hover:not(:disabled){background:var(--ui-accent-hover, #1D4ED8);border-color:var(--ui-accent-hover, #1D4ED8)}.btn-secondary{background:#fff;color:#334155;border:1px solid #e2e8f0}.btn-secondary:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.btn-ghost{background:transparent;color:#64748b;border:1px solid transparent}.btn-ghost:hover:not(:disabled){background:#f8fafc;color:#334155}.btn-ghost-start{display:flex;width:100%;justify-content:flex-start;text-align:start;white-space:normal;background:transparent;color:#334155;border:1px solid transparent}.btn-ghost-start:hover:not(:disabled){background:#f1f5f9;color:#1e293b}.btn-danger{background:#dc2626;color:#fff;border:1px solid #dc2626}.btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.btn-link{background:none;color:var(--ui-link, var(--ui-accent, #2563eb));border:none;padding:0;font-weight:500}.btn-link:hover:not(:disabled){color:var(--ui-link-hover, var(--ui-accent-hover, #1d4ed8))}.btn-link.btn-xs,.btn-link.btn-sm,.btn-link.btn-md,.btn-link.btn-lg{padding:0}.btn-anchor{text-decoration:none}.btn[aria-disabled=true]{opacity:.5;cursor:not-allowed;pointer-events:none}.btn-anchor.btn-link{text-decoration:underline;text-underline-offset:2px}.btn-warning{background:#f97316;color:#fff;border:1px solid #f97316}.btn-warning:hover:not(:disabled){background:#ea6c0a;border-color:#ea6c0a}.btn-tab{background:none;color:#64748b;border:none;border-bottom:2px solid transparent;border-radius:0;font-weight:600;font-size:.875rem;transition:all .15s}.btn-tab:hover:not(:disabled){background:none;color:#1e293b}.btn-tab.active{color:var(--ui-accent, #2563eb);border-bottom-color:var(--ui-accent, #2563eb)}.btn-tab.btn-xs,.btn-tab.btn-sm,.btn-tab.btn-md,.btn-tab.btn-lg{padding:10px 20px;border-radius:0}.btn-icon{width:28px;height:28px;padding:0;border-radius:6px;background:transparent;border:none;color:#64748b}.btn-icon:hover:not(:disabled){background:#f1f5f9;color:#334155}.btn-icon-danger{width:28px;height:28px;padding:0;border-radius:6px;background:transparent;border:none;color:#64748b}.btn-icon-danger:hover:not(:disabled){background:#fee2e2;color:#dc2626}.btn-xs{padding:3px 8px;font-size:.75rem;border-radius:5px;gap:4px}.btn-sm{padding:6px 12px;font-size:.8125rem;border-radius:6px}.btn-md{padding:10px 16px;font-size:.875rem}.btn-lg{padding:14px 20px;font-size:1rem}@media(pointer:coarse),(max-width:480px){.btn-xs,.btn-sm,.btn-md,.btn-lg,.btn-tab{min-height:44px}.btn-link.btn-xs,.btn-link.btn-sm,.btn-link.btn-md,.btn-link.btn-lg{min-height:0}.btn-icon,.btn-icon-danger{position:relative}.btn-icon:after,.btn-icon-danger:after{content:\"\";position:absolute;inset:-8px}}.btn-sl-short{display:none}@media(max-width:479.98px){.btn-sl-sm.btn-sl-long{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0}.btn-sl-sm.btn-sl-short{display:inline}}@media(max-width:767.98px){.btn-sl-md.btn-sl-long{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0}.btn-sl-md.btn-sl-short{display:inline}}@media(max-width:1023.98px){.btn-sl-lg.btn-sl-long{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0}.btn-sl-lg.btn-sl-short{display:inline}}.btn-sl-long.btn-sl-narrow{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0}.btn-sl-short.btn-sl-narrow{display:inline}.spinner{width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top-color:currentColor;border-radius:50%;animation:spin .6s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"]
3667
3733
  }]
3668
3734
  }],
3735
+ ctorParameters: () => [],
3669
3736
  propDecorators: {
3670
3737
  variant: [{
3671
3738
  type: i0.Input,
@@ -3699,6 +3766,14 @@ i0.ɵɵngDeclareClassMetadata({
3699
3766
  required: false
3700
3767
  }]
3701
3768
  }],
3769
+ state: [{
3770
+ type: i0.Input,
3771
+ args: [{
3772
+ isSignal: true,
3773
+ alias: "state",
3774
+ required: false
3775
+ }]
3776
+ }],
3702
3777
  href: [{
3703
3778
  type: i0.Input,
3704
3779
  args: [{
@@ -3723,6 +3798,22 @@ i0.ɵɵngDeclareClassMetadata({
3723
3798
  required: false
3724
3799
  }]
3725
3800
  }],
3801
+ shortLabel: [{
3802
+ type: i0.Input,
3803
+ args: [{
3804
+ isSignal: true,
3805
+ alias: "shortLabel",
3806
+ required: false
3807
+ }]
3808
+ }],
3809
+ shortBelow: [{
3810
+ type: i0.Input,
3811
+ args: [{
3812
+ isSignal: true,
3813
+ alias: "shortBelow",
3814
+ required: false
3815
+ }]
3816
+ }],
3726
3817
  color: [{
3727
3818
  type: i0.Input,
3728
3819
  args: [{
@@ -3845,6 +3936,7 @@ var TextInputComponent = class TextInputComponent {
3845
3936
  this.step = input(void 0, ...ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []);
3846
3937
  this.valueType = input("string", ...ngDevMode ? [{ debugName: "valueType" }] : /* istanbul ignore next */ []);
3847
3938
  this.formatter = input(void 0, ...ngDevMode ? [{ debugName: "formatter" }] : /* istanbul ignore next */ []);
3939
+ this.integer = input(false, ...ngDevMode ? [{ debugName: "integer" }] : /* istanbul ignore next */ []);
3848
3940
  this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
3849
3941
  this.valueChange = output();
3850
3942
  this.focused = output();
@@ -3862,7 +3954,8 @@ var TextInputComponent = class TextInputComponent {
3862
3954
  this._numeric = computed(() => this.valueType() === "number" && this.type() === "number", ...ngDevMode ? [{ debugName: "_numeric" }] : /* istanbul ignore next */ []);
3863
3955
  this._stepAttr = computed(() => {
3864
3956
  const step = this.step();
3865
- return this.type() === "number" && typeof step === "number" && Number.isFinite(step) && step > 0 ? String(step) : null;
3957
+ if (this.type() === "number" && typeof step === "number" && Number.isFinite(step) && step > 0) return String(step);
3958
+ return this.type() === "number" && this.integer() ? "1" : null;
3866
3959
  }, ...ngDevMode ? [{ debugName: "_stepAttr" }] : /* istanbul ignore next */ []);
3867
3960
  this._warned = false;
3868
3961
  this._formatting = computed(() => this.phoneFormat() || this.type() === "tel", ...ngDevMode ? [{ debugName: "_formatting" }] : /* istanbul ignore next */ []);
@@ -3916,6 +4009,7 @@ var TextInputComponent = class TextInputComponent {
3916
4009
  const input = event.target;
3917
4010
  const raw = input.value;
3918
4011
  let val = this._formatting() ? TextInputComponent._formatPhone(raw) : raw;
4012
+ if (this.integer()) val = val.replace(/[.eE].*$/, "");
3919
4013
  const format = this.formatter();
3920
4014
  if (format) val = format(val);
3921
4015
  this._value.set(val);
@@ -3969,7 +4063,7 @@ var TextInputComponent = class TextInputComponent {
3969
4063
  key: "number",
3970
4064
  message: "Please enter a valid number."
3971
4065
  };
3972
- const min = this.min(), max = this.max(), decimals = this.maxDecimals();
4066
+ const min = this.min(), max = this.max(), decimals = this.maxDecimals() ?? (this.integer() ? 0 : void 0);
3973
4067
  if (min != null && n < min) return {
3974
4068
  key: "min",
3975
4069
  message: `Must be at least ${min}`,
@@ -4158,6 +4252,13 @@ var TextInputComponent = class TextInputComponent {
4158
4252
  isRequired: false,
4159
4253
  transformFunction: null
4160
4254
  },
4255
+ integer: {
4256
+ classPropertyName: "integer",
4257
+ publicName: "integer",
4258
+ isSignal: true,
4259
+ isRequired: false,
4260
+ transformFunction: null
4261
+ },
4161
4262
  showErrors: {
4162
4263
  classPropertyName: "showErrors",
4163
4264
  publicName: "showErrors",
@@ -4211,7 +4312,7 @@ var TextInputComponent = class TextInputComponent {
4211
4312
  [style.padding-left]="_prefixPadding()"
4212
4313
  [id]="_inputId"
4213
4314
  [type]="type()"
4214
- [attr.inputmode]="inputmode() || (type() === 'tel' ? 'tel' : null)"
4315
+ [attr.inputmode]="inputmode() || (type() === 'tel' ? 'tel' : integer() ? 'numeric' : null)"
4215
4316
  [placeholder]="placeholder()"
4216
4317
  [value]="_value()"
4217
4318
  [disabled]="disabled()"
@@ -4285,7 +4386,7 @@ i0.ɵɵngDeclareClassMetadata({
4285
4386
  [style.padding-left]="_prefixPadding()"
4286
4387
  [id]="_inputId"
4287
4388
  [type]="type()"
4288
- [attr.inputmode]="inputmode() || (type() === 'tel' ? 'tel' : null)"
4389
+ [attr.inputmode]="inputmode() || (type() === 'tel' ? 'tel' : integer() ? 'numeric' : null)"
4289
4390
  [placeholder]="placeholder()"
4290
4391
  [value]="_value()"
4291
4392
  [disabled]="disabled()"
@@ -4469,6 +4570,14 @@ i0.ɵɵngDeclareClassMetadata({
4469
4570
  required: false
4470
4571
  }]
4471
4572
  }],
4573
+ integer: [{
4574
+ type: i0.Input,
4575
+ args: [{
4576
+ isSignal: true,
4577
+ alias: "integer",
4578
+ required: false
4579
+ }]
4580
+ }],
4472
4581
  showErrors: [{
4473
4582
  type: i0.Input,
4474
4583
  args: [{
@@ -4927,9 +5036,12 @@ var TableToolbarComponent = class TableToolbarComponent {
4927
5036
  "routerLink",
4928
5037
  "queryParams",
4929
5038
  "fragment",
5039
+ "state",
4930
5040
  "href",
4931
5041
  "target",
4932
5042
  "rel",
5043
+ "shortLabel",
5044
+ "shortBelow",
4933
5045
  "color",
4934
5046
  "active",
4935
5047
  "size",
@@ -4969,6 +5081,7 @@ var TableToolbarComponent = class TableToolbarComponent {
4969
5081
  "step",
4970
5082
  "valueType",
4971
5083
  "formatter",
5084
+ "integer",
4972
5085
  "showErrors",
4973
5086
  "disabled"
4974
5087
  ],
@@ -7576,9 +7689,12 @@ var ImportExportComponent = class ImportExportComponent {
7576
7689
  "routerLink",
7577
7690
  "queryParams",
7578
7691
  "fragment",
7692
+ "state",
7579
7693
  "href",
7580
7694
  "target",
7581
7695
  "rel",
7696
+ "shortLabel",
7697
+ "shortBelow",
7582
7698
  "color",
7583
7699
  "active",
7584
7700
  "size",
@@ -8073,9 +8189,12 @@ var ConfirmOutletComponent = class ConfirmOutletComponent {
8073
8189
  "routerLink",
8074
8190
  "queryParams",
8075
8191
  "fragment",
8192
+ "state",
8076
8193
  "href",
8077
8194
  "target",
8078
8195
  "rel",
8196
+ "shortLabel",
8197
+ "shortBelow",
8079
8198
  "color",
8080
8199
  "active",
8081
8200
  "size",
@@ -8424,9 +8543,12 @@ var ErrorStateComponent = class ErrorStateComponent {
8424
8543
  "routerLink",
8425
8544
  "queryParams",
8426
8545
  "fragment",
8546
+ "state",
8427
8547
  "href",
8428
8548
  "target",
8429
8549
  "rel",
8550
+ "shortLabel",
8551
+ "shortBelow",
8430
8552
  "color",
8431
8553
  "active",
8432
8554
  "size",
@@ -10764,9 +10886,12 @@ var DataTableComponent = class DataTableComponent {
10764
10886
  "routerLink",
10765
10887
  "queryParams",
10766
10888
  "fragment",
10889
+ "state",
10767
10890
  "href",
10768
10891
  "target",
10769
10892
  "rel",
10893
+ "shortLabel",
10894
+ "shortBelow",
10770
10895
  "color",
10771
10896
  "active",
10772
10897
  "size",
@@ -11863,6 +11988,7 @@ var SidePanelComponent = class SidePanelComponent {
11863
11988
  onKeydown(event) {
11864
11989
  if (!this.open() || !this._overlays.isTop(this)) return;
11865
11990
  if (event.key === "Escape") {
11991
+ if (event.defaultPrevented) return;
11866
11992
  event.preventDefault();
11867
11993
  this.closed.emit();
11868
11994
  return;
@@ -13161,8 +13287,31 @@ var StepperComponent = class StepperComponent {
13161
13287
  this.accentLabels = input(false, ...ngDevMode ? [{ debugName: "accentLabels" }] : /* istanbul ignore next */ []);
13162
13288
  this.ariaLabel = input("Progress", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
13163
13289
  this.labelsOnSmallScreens = input("current", ...ngDevMode ? [{ debugName: "labelsOnSmallScreens" }] : /* istanbul ignore next */ []);
13290
+ this.minStepWidth = input("", ...ngDevMode ? [{ debugName: "minStepWidth" }] : /* istanbul ignore next */ []);
13291
+ this.scrollable = input(false, ...ngDevMode ? [{ debugName: "scrollable" }] : /* istanbul ignore next */ []);
13292
+ this.leadingWidth = input("", ...ngDevMode ? [{ debugName: "leadingWidth" }] : /* istanbul ignore next */ []);
13293
+ this.compact = input(null, ...ngDevMode ? [{ debugName: "compact" }] : /* istanbul ignore next */ []);
13164
13294
  this.stepClick = output();
13295
+ this._win = inject(DOCUMENT).defaultView;
13296
+ this._narrow = signal(false, ...ngDevMode ? [{ debugName: "_narrow" }] : /* istanbul ignore next */ []);
13297
+ this.compactPx = computed(() => typeof this.compact() === "number" && this._narrow(), ...ngDevMode ? [{ debugName: "compactPx" }] : /* istanbul ignore next */ []);
13165
13298
  this._id = `ui-st-${++nextStepperId}`;
13299
+ this.olMinWidth = computed(() => {
13300
+ const w = this.minStepWidth().trim();
13301
+ return w && this.orientation() === "horizontal" ? `calc(${this.steps().length} * ${w})` : null;
13302
+ }, ...ngDevMode ? [{ debugName: "olMinWidth" }] : /* istanbul ignore next */ []);
13303
+ this.summary = computed(() => {
13304
+ const steps = this.steps();
13305
+ const i = steps.findIndex((s) => s.key === this.current());
13306
+ const n = i + 1;
13307
+ const label = i >= 0 ? steps[i].label : "";
13308
+ return {
13309
+ n,
13310
+ m: steps.length,
13311
+ label,
13312
+ aria: `Step ${n} of ${steps.length}: ${label}`
13313
+ };
13314
+ }, ...ngDevMode ? [{ debugName: "summary" }] : /* istanbul ignore next */ []);
13166
13315
  this.rows = computed(() => {
13167
13316
  const steps = this.steps();
13168
13317
  const cur = steps.findIndex((s) => s.key === this.current());
@@ -13188,6 +13337,16 @@ var StepperComponent = class StepperComponent {
13188
13337
  };
13189
13338
  });
13190
13339
  }, ...ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []);
13340
+ effect((onCleanup) => {
13341
+ const c = this.compact();
13342
+ this._narrow.set(false);
13343
+ if (typeof c !== "number" || !Number.isFinite(c) || typeof this._win?.matchMedia !== "function") return;
13344
+ const mq = this._win.matchMedia(`(max-width: ${c - .02}px)`);
13345
+ this._narrow.set(mq.matches);
13346
+ const on = (e) => this._narrow.set(e.matches);
13347
+ mq.addEventListener("change", on);
13348
+ onCleanup(() => mq.removeEventListener("change", on));
13349
+ });
13191
13350
  }
13192
13351
  activate(r) {
13193
13352
  if (!r.selectable || r.state === "current") return;
@@ -13288,6 +13447,34 @@ var StepperComponent = class StepperComponent {
13288
13447
  isSignal: true,
13289
13448
  isRequired: false,
13290
13449
  transformFunction: null
13450
+ },
13451
+ minStepWidth: {
13452
+ classPropertyName: "minStepWidth",
13453
+ publicName: "minStepWidth",
13454
+ isSignal: true,
13455
+ isRequired: false,
13456
+ transformFunction: null
13457
+ },
13458
+ scrollable: {
13459
+ classPropertyName: "scrollable",
13460
+ publicName: "scrollable",
13461
+ isSignal: true,
13462
+ isRequired: false,
13463
+ transformFunction: null
13464
+ },
13465
+ leadingWidth: {
13466
+ classPropertyName: "leadingWidth",
13467
+ publicName: "leadingWidth",
13468
+ isSignal: true,
13469
+ isRequired: false,
13470
+ transformFunction: null
13471
+ },
13472
+ compact: {
13473
+ classPropertyName: "compact",
13474
+ publicName: "compact",
13475
+ isSignal: true,
13476
+ isRequired: false,
13477
+ transformFunction: null
13291
13478
  }
13292
13479
  },
13293
13480
  outputs: {
@@ -13300,7 +13487,12 @@ var StepperComponent = class StepperComponent {
13300
13487
  } },
13301
13488
  ngImport: i0,
13302
13489
  template: `
13490
+ <div class="st-root" [class.st-c-sm]="compact() === 'sm'" [class.st-c-md]="compact() === 'md'" [class.st-c-lg]="compact() === 'lg'" [class.st-c-on]="compactPx()"
13491
+ [class.st-has-leading]="!!leadingWidth() && orientation() === 'horizontal'" [style.--st-leading-w]="leadingWidth() || null">
13492
+ <div class="st-leading"><ng-content select="[stepper-leading]" /></div>
13493
+ <div class="st-scroll" [class.st-scrollable]="scrollable()">
13303
13494
  <ol class="st"
13495
+ [style.min-width]="olMinWidth()"
13304
13496
  [class.st-horizontal]="orientation() === 'horizontal'"
13305
13497
  [class.st-vertical]="orientation() === 'vertical'"
13306
13498
  [class.st-sm]="size() === 'sm'"
@@ -13333,6 +13525,17 @@ var StepperComponent = class StepperComponent {
13333
13525
  </li>
13334
13526
  }
13335
13527
  </ol>
13528
+ </div>
13529
+ @if (compact() !== null) {
13530
+ <div class="st-compact" data-testid="stepper-compact">
13531
+ <div class="st-compact-row">
13532
+ <span class="st-compact-label" data-testid="stepper-compact-label">{{ summary().label }}</span>
13533
+ <span class="st-compact-count" data-testid="stepper-compact-count">{{ summary().n }} / {{ summary().m }}</span>
13534
+ </div>
13535
+ <ui-progress-bar data-testid="stepper-compact-progress" [value]="summary().n" [max]="summary().m" [color]="accentColor()" [ariaLabel]="summary().aria" />
13536
+ </div>
13537
+ }
13538
+ </div>
13336
13539
 
13337
13540
  <ng-template #body let-r>
13338
13541
  <span class="st-ind" aria-hidden="true">
@@ -13347,7 +13550,7 @@ var StepperComponent = class StepperComponent {
13347
13550
  </ng-template>
13348
13551
  `,
13349
13552
  isInline: true,
13350
- styles: [":host{display:block}.st{list-style:none;margin:0;padding:0;display:flex;--st-ind: 28px}.st-sm{--st-ind: 22px}.st-horizontal{flex-direction:row;align-items:flex-start}.st-vertical{flex-direction:column}.st-step{position:relative;display:flex;min-width:0}.st-horizontal .st-step{flex:1 1 0;align-items:flex-start}.st-horizontal .st-step:last-child{flex:0 1 auto}.st-vertical .st-step{flex-direction:column;padding-bottom:20px}.st-vertical .st-step:last-child{padding-bottom:0}.st-item{display:flex;flex-direction:column;min-width:0;gap:2px}.st-horizontal .st-item{flex:0 1 auto}.st-btn{display:inline-flex;align-items:flex-start;gap:8px;min-width:0;margin:0;padding:2px 4px;border:0;border-radius:8px;background:none;font:inherit;color:inherit;text-align:left;-webkit-appearance:none;appearance:none}button.st-btn{cursor:pointer}.st-btn:focus{outline:2px solid #3b82f6;outline-offset:2px}.st-btn:focus:not(:focus-visible){outline:none}@media(hover:hover){button.st-btn:hover .st-label{text-decoration:underline}}.st-ind{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:var(--st-ind);height:var(--st-ind);border-radius:50%;font-size:.8125rem;font-weight:600;line-height:1;background:#fff;border:2px solid #cbd5e1;color:#64748b}.st-sm .st-ind{font-size:.6875rem}.st-sm .st-check{width:11px;height:11px}.st-step[data-state=complete] .st-ind{background:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));border-color:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));color:#fff}.st-step[data-state=current] .st-ind{background:var(--st-accent, var(--ui-accent, #1d4ed8));border-color:var(--st-accent, var(--ui-accent, #1d4ed8));color:#fff;box-shadow:0 0 0 3px var(--ui-accent-soft, #bfdbfe)}@supports (color: color-mix(in srgb,red 30%,white)){.st-themed .st-step[data-state=current]:not([data-error=true]) .st-ind{box-shadow:0 0 0 3px color-mix(in srgb,var(--st-accent) 30%,white)}}.st-step[data-error=true] .st-ind{background:#dc2626;border-color:#dc2626;color:#fff;box-shadow:none}.st-label{font-size:.875rem;font-weight:500;line-height:var(--st-ind);color:#64748b;min-width:0;overflow-wrap:anywhere}.st-sm .st-label{font-size:.8125rem}.st-step[data-state=complete] .st-label{color:#1e293b}.st-step[data-state=current] .st-label{color:#0f172a;font-weight:600}.st-step[data-error=true] .st-label{color:#b91c1c}.st-accent-labels .st-step[data-state=current]:not([data-error=true]) .st-label{color:var(--st-accent, var(--ui-accent, #1d4ed8))}.st-opt{font-size:.75rem;line-height:var(--st-ind);color:#64748b;white-space:nowrap}.st-desc{font-size:.8125rem;line-height:1.4;color:#64748b;padding-left:calc(var(--st-ind) + 12px);overflow-wrap:anywhere}.st-errmsg{font-size:.8125rem;line-height:1.4;color:#b91c1c;padding-left:calc(var(--st-ind) + 12px);overflow-wrap:anywhere}.st-step[data-disabled=true] .st-item{opacity:.5}.st-sr,.st-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.st-conn{position:relative;display:block;background:#e2e8f0;border-radius:1px}.st-conn:after{content:\"\";position:absolute;inset:0;background:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));border-radius:1px;transform-origin:top left;transform:scale(0);transition:transform .3s ease}.st-step[data-state=complete] .st-conn:after{transform:scale(1)}.st-horizontal .st-conn{flex:1 1 12px;min-width:12px;height:2px;margin:calc(var(--st-ind) / 2 + 1px) 8px 0}.st-vertical .st-conn{position:absolute;left:calc(var(--st-ind) / 2 + 3px);top:calc(var(--st-ind) + 8px);bottom:4px;width:2px}@media(pointer:coarse),(max-width:480px){.st-btn{min-height:44px;align-items:center}button.st-btn{min-width:44px}.st-horizontal .st-conn{margin-top:21px}.st-vertical .st-conn{top:calc(26px + var(--st-ind) / 2)}}@media(max-width:480px){.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-label,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-opt,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-desc,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-errmsg{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.st-horizontal .st-conn{margin-left:4px;margin-right:4px;min-width:8px;flex-basis:8px}}@media(prefers-reduced-motion:reduce){.st-conn:after{transition:none}}\n"],
13553
+ styles: [":host{display:block}.st-root{position:relative}.st-leading{display:none}.st-has-leading .st-leading{display:block;position:absolute;top:50%;left:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.st-has-leading .st-scroll{margin-inline-start:calc(var(--st-leading-w) + 1rem)}.st-scrollable{overflow-x:auto;padding-top:4px;padding-bottom:4px}.st-compact{display:none}.st-compact-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.st-compact-label{min-width:0;font-size:1.125rem;font-weight:600;line-height:1.3;color:var(--st-accent, #0f172a);overflow-wrap:anywhere}.st-compact-count{flex-shrink:0;font-size:.8125rem;color:#64748b}.st-c-on .st-scroll,.st-c-on .st-leading{display:none}.st-c-on .st-compact{display:block}@media(max-width:479.98px){.st-c-sm .st-scroll,.st-c-sm .st-leading{display:none}.st-c-sm .st-compact{display:block}}@media(max-width:767.98px){.st-c-md .st-scroll,.st-c-md .st-leading{display:none}.st-c-md .st-compact{display:block}}@media(max-width:1023.98px){.st-c-lg .st-scroll,.st-c-lg .st-leading{display:none}.st-c-lg .st-compact{display:block}}.st{list-style:none;margin:0;padding:0;display:flex;--st-ind: 28px}.st-sm{--st-ind: 22px}.st-horizontal{flex-direction:row;align-items:flex-start}.st-vertical{flex-direction:column}.st-step{position:relative;display:flex;min-width:0}.st-horizontal .st-step{flex:1 1 0;align-items:flex-start}.st-horizontal .st-step:last-child{flex:0 1 auto}.st-vertical .st-step{flex-direction:column;padding-bottom:20px}.st-vertical .st-step:last-child{padding-bottom:0}.st-item{display:flex;flex-direction:column;min-width:0;gap:2px}.st-horizontal .st-item{flex:0 1 auto}.st-btn{display:inline-flex;align-items:flex-start;gap:8px;min-width:0;margin:0;padding:2px 4px;border:0;border-radius:8px;background:none;font:inherit;color:inherit;text-align:left;-webkit-appearance:none;appearance:none}button.st-btn{cursor:pointer}.st-btn:focus{outline:2px solid #3b82f6;outline-offset:2px}.st-btn:focus:not(:focus-visible){outline:none}@media(hover:hover){button.st-btn:hover .st-label{text-decoration:underline}}.st-ind{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:var(--st-ind);height:var(--st-ind);border-radius:50%;font-size:.8125rem;font-weight:600;line-height:1;background:#fff;border:2px solid #cbd5e1;color:#64748b}.st-sm .st-ind{font-size:.6875rem}.st-sm .st-check{width:11px;height:11px}.st-step[data-state=complete] .st-ind{background:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));border-color:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));color:#fff}.st-step[data-state=current] .st-ind{background:var(--st-accent, var(--ui-accent, #1d4ed8));border-color:var(--st-accent, var(--ui-accent, #1d4ed8));color:#fff;box-shadow:0 0 0 3px var(--ui-accent-soft, #bfdbfe)}@supports (color: color-mix(in srgb,red 30%,white)){.st-themed .st-step[data-state=current]:not([data-error=true]) .st-ind{box-shadow:0 0 0 3px color-mix(in srgb,var(--st-accent) 30%,white)}}.st-step[data-error=true] .st-ind{background:#dc2626;border-color:#dc2626;color:#fff;box-shadow:none}.st-label{font-size:.875rem;font-weight:500;line-height:var(--st-ind);color:#64748b;min-width:0;overflow-wrap:anywhere}.st-sm .st-label{font-size:.8125rem}.st-step[data-state=complete] .st-label{color:#1e293b}.st-step[data-state=current] .st-label{color:#0f172a;font-weight:600}.st-step[data-error=true] .st-label{color:#b91c1c}.st-accent-labels .st-step[data-state=current]:not([data-error=true]) .st-label{color:var(--st-accent, var(--ui-accent, #1d4ed8))}.st-opt{font-size:.75rem;line-height:var(--st-ind);color:#64748b;white-space:nowrap}.st-desc{font-size:.8125rem;line-height:1.4;color:#64748b;padding-left:calc(var(--st-ind) + 12px);overflow-wrap:anywhere}.st-errmsg{font-size:.8125rem;line-height:1.4;color:#b91c1c;padding-left:calc(var(--st-ind) + 12px);overflow-wrap:anywhere}.st-step[data-disabled=true] .st-item{opacity:.5}.st-sr,.st-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.st-conn{position:relative;display:block;background:#e2e8f0;border-radius:1px}.st-conn:after{content:\"\";position:absolute;inset:0;background:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));border-radius:1px;transform-origin:top left;transform:scale(0);transition:transform .3s ease}.st-step[data-state=complete] .st-conn:after{transform:scale(1)}.st-horizontal .st-conn{flex:1 1 12px;min-width:12px;height:2px;margin:calc(var(--st-ind) / 2 + 1px) 8px 0}.st-vertical .st-conn{position:absolute;left:calc(var(--st-ind) / 2 + 3px);top:calc(var(--st-ind) + 8px);bottom:4px;width:2px}@media(pointer:coarse),(max-width:480px){.st-btn{min-height:44px;align-items:center}button.st-btn{min-width:44px}.st-horizontal .st-conn{margin-top:21px}.st-vertical .st-conn{top:calc(26px + var(--st-ind) / 2)}}@media(max-width:480px){.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-label,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-opt,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-desc,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-errmsg{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.st-horizontal .st-conn{margin-left:4px;margin-right:4px;min-width:8px;flex-basis:8px}}@media(prefers-reduced-motion:reduce){.st-conn:after{transition:none}}\n"],
13351
13554
  dependencies: [{
13352
13555
  kind: "directive",
13353
13556
  type: NgTemplateOutlet,
@@ -13357,6 +13560,21 @@ var StepperComponent = class StepperComponent {
13357
13560
  "ngTemplateOutlet",
13358
13561
  "ngTemplateOutletInjector"
13359
13562
  ]
13563
+ }, {
13564
+ kind: "component",
13565
+ type: ProgressBarComponent,
13566
+ selector: "ui-progress-bar",
13567
+ inputs: [
13568
+ "value",
13569
+ "max",
13570
+ "label",
13571
+ "variant",
13572
+ "color",
13573
+ "tooltip",
13574
+ "ariaLabel",
13575
+ "ariaLabelledby",
13576
+ "valueText"
13577
+ ]
13360
13578
  }],
13361
13579
  changeDetection: i0.ChangeDetectionStrategy.OnPush
13362
13580
  });
@@ -13372,14 +13590,19 @@ i0.ɵɵngDeclareClassMetadata({
13372
13590
  args: [{
13373
13591
  selector: "ui-stepper",
13374
13592
  standalone: true,
13375
- imports: [NgTemplateOutlet],
13593
+ imports: [NgTemplateOutlet, ProgressBarComponent],
13376
13594
  changeDetection: ChangeDetectionStrategy.OnPush,
13377
13595
  host: {
13378
13596
  "[style.--st-accent]": "accentColor() || null",
13379
13597
  "[style.--st-complete]": "completeColor() || null"
13380
13598
  },
13381
13599
  template: `
13600
+ <div class="st-root" [class.st-c-sm]="compact() === 'sm'" [class.st-c-md]="compact() === 'md'" [class.st-c-lg]="compact() === 'lg'" [class.st-c-on]="compactPx()"
13601
+ [class.st-has-leading]="!!leadingWidth() && orientation() === 'horizontal'" [style.--st-leading-w]="leadingWidth() || null">
13602
+ <div class="st-leading"><ng-content select="[stepper-leading]" /></div>
13603
+ <div class="st-scroll" [class.st-scrollable]="scrollable()">
13382
13604
  <ol class="st"
13605
+ [style.min-width]="olMinWidth()"
13383
13606
  [class.st-horizontal]="orientation() === 'horizontal'"
13384
13607
  [class.st-vertical]="orientation() === 'vertical'"
13385
13608
  [class.st-sm]="size() === 'sm'"
@@ -13412,6 +13635,17 @@ i0.ɵɵngDeclareClassMetadata({
13412
13635
  </li>
13413
13636
  }
13414
13637
  </ol>
13638
+ </div>
13639
+ @if (compact() !== null) {
13640
+ <div class="st-compact" data-testid="stepper-compact">
13641
+ <div class="st-compact-row">
13642
+ <span class="st-compact-label" data-testid="stepper-compact-label">{{ summary().label }}</span>
13643
+ <span class="st-compact-count" data-testid="stepper-compact-count">{{ summary().n }} / {{ summary().m }}</span>
13644
+ </div>
13645
+ <ui-progress-bar data-testid="stepper-compact-progress" [value]="summary().n" [max]="summary().m" [color]="accentColor()" [ariaLabel]="summary().aria" />
13646
+ </div>
13647
+ }
13648
+ </div>
13415
13649
 
13416
13650
  <ng-template #body let-r>
13417
13651
  <span class="st-ind" aria-hidden="true">
@@ -13425,9 +13659,10 @@ i0.ɵɵngDeclareClassMetadata({
13425
13659
  <span class="st-sr">{{ r.srText }}</span>
13426
13660
  </ng-template>
13427
13661
  `,
13428
- styles: [":host{display:block}.st{list-style:none;margin:0;padding:0;display:flex;--st-ind: 28px}.st-sm{--st-ind: 22px}.st-horizontal{flex-direction:row;align-items:flex-start}.st-vertical{flex-direction:column}.st-step{position:relative;display:flex;min-width:0}.st-horizontal .st-step{flex:1 1 0;align-items:flex-start}.st-horizontal .st-step:last-child{flex:0 1 auto}.st-vertical .st-step{flex-direction:column;padding-bottom:20px}.st-vertical .st-step:last-child{padding-bottom:0}.st-item{display:flex;flex-direction:column;min-width:0;gap:2px}.st-horizontal .st-item{flex:0 1 auto}.st-btn{display:inline-flex;align-items:flex-start;gap:8px;min-width:0;margin:0;padding:2px 4px;border:0;border-radius:8px;background:none;font:inherit;color:inherit;text-align:left;-webkit-appearance:none;appearance:none}button.st-btn{cursor:pointer}.st-btn:focus{outline:2px solid #3b82f6;outline-offset:2px}.st-btn:focus:not(:focus-visible){outline:none}@media(hover:hover){button.st-btn:hover .st-label{text-decoration:underline}}.st-ind{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:var(--st-ind);height:var(--st-ind);border-radius:50%;font-size:.8125rem;font-weight:600;line-height:1;background:#fff;border:2px solid #cbd5e1;color:#64748b}.st-sm .st-ind{font-size:.6875rem}.st-sm .st-check{width:11px;height:11px}.st-step[data-state=complete] .st-ind{background:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));border-color:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));color:#fff}.st-step[data-state=current] .st-ind{background:var(--st-accent, var(--ui-accent, #1d4ed8));border-color:var(--st-accent, var(--ui-accent, #1d4ed8));color:#fff;box-shadow:0 0 0 3px var(--ui-accent-soft, #bfdbfe)}@supports (color: color-mix(in srgb,red 30%,white)){.st-themed .st-step[data-state=current]:not([data-error=true]) .st-ind{box-shadow:0 0 0 3px color-mix(in srgb,var(--st-accent) 30%,white)}}.st-step[data-error=true] .st-ind{background:#dc2626;border-color:#dc2626;color:#fff;box-shadow:none}.st-label{font-size:.875rem;font-weight:500;line-height:var(--st-ind);color:#64748b;min-width:0;overflow-wrap:anywhere}.st-sm .st-label{font-size:.8125rem}.st-step[data-state=complete] .st-label{color:#1e293b}.st-step[data-state=current] .st-label{color:#0f172a;font-weight:600}.st-step[data-error=true] .st-label{color:#b91c1c}.st-accent-labels .st-step[data-state=current]:not([data-error=true]) .st-label{color:var(--st-accent, var(--ui-accent, #1d4ed8))}.st-opt{font-size:.75rem;line-height:var(--st-ind);color:#64748b;white-space:nowrap}.st-desc{font-size:.8125rem;line-height:1.4;color:#64748b;padding-left:calc(var(--st-ind) + 12px);overflow-wrap:anywhere}.st-errmsg{font-size:.8125rem;line-height:1.4;color:#b91c1c;padding-left:calc(var(--st-ind) + 12px);overflow-wrap:anywhere}.st-step[data-disabled=true] .st-item{opacity:.5}.st-sr,.st-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.st-conn{position:relative;display:block;background:#e2e8f0;border-radius:1px}.st-conn:after{content:\"\";position:absolute;inset:0;background:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));border-radius:1px;transform-origin:top left;transform:scale(0);transition:transform .3s ease}.st-step[data-state=complete] .st-conn:after{transform:scale(1)}.st-horizontal .st-conn{flex:1 1 12px;min-width:12px;height:2px;margin:calc(var(--st-ind) / 2 + 1px) 8px 0}.st-vertical .st-conn{position:absolute;left:calc(var(--st-ind) / 2 + 3px);top:calc(var(--st-ind) + 8px);bottom:4px;width:2px}@media(pointer:coarse),(max-width:480px){.st-btn{min-height:44px;align-items:center}button.st-btn{min-width:44px}.st-horizontal .st-conn{margin-top:21px}.st-vertical .st-conn{top:calc(26px + var(--st-ind) / 2)}}@media(max-width:480px){.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-label,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-opt,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-desc,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-errmsg{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.st-horizontal .st-conn{margin-left:4px;margin-right:4px;min-width:8px;flex-basis:8px}}@media(prefers-reduced-motion:reduce){.st-conn:after{transition:none}}\n"]
13662
+ styles: [":host{display:block}.st-root{position:relative}.st-leading{display:none}.st-has-leading .st-leading{display:block;position:absolute;top:50%;left:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.st-has-leading .st-scroll{margin-inline-start:calc(var(--st-leading-w) + 1rem)}.st-scrollable{overflow-x:auto;padding-top:4px;padding-bottom:4px}.st-compact{display:none}.st-compact-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.st-compact-label{min-width:0;font-size:1.125rem;font-weight:600;line-height:1.3;color:var(--st-accent, #0f172a);overflow-wrap:anywhere}.st-compact-count{flex-shrink:0;font-size:.8125rem;color:#64748b}.st-c-on .st-scroll,.st-c-on .st-leading{display:none}.st-c-on .st-compact{display:block}@media(max-width:479.98px){.st-c-sm .st-scroll,.st-c-sm .st-leading{display:none}.st-c-sm .st-compact{display:block}}@media(max-width:767.98px){.st-c-md .st-scroll,.st-c-md .st-leading{display:none}.st-c-md .st-compact{display:block}}@media(max-width:1023.98px){.st-c-lg .st-scroll,.st-c-lg .st-leading{display:none}.st-c-lg .st-compact{display:block}}.st{list-style:none;margin:0;padding:0;display:flex;--st-ind: 28px}.st-sm{--st-ind: 22px}.st-horizontal{flex-direction:row;align-items:flex-start}.st-vertical{flex-direction:column}.st-step{position:relative;display:flex;min-width:0}.st-horizontal .st-step{flex:1 1 0;align-items:flex-start}.st-horizontal .st-step:last-child{flex:0 1 auto}.st-vertical .st-step{flex-direction:column;padding-bottom:20px}.st-vertical .st-step:last-child{padding-bottom:0}.st-item{display:flex;flex-direction:column;min-width:0;gap:2px}.st-horizontal .st-item{flex:0 1 auto}.st-btn{display:inline-flex;align-items:flex-start;gap:8px;min-width:0;margin:0;padding:2px 4px;border:0;border-radius:8px;background:none;font:inherit;color:inherit;text-align:left;-webkit-appearance:none;appearance:none}button.st-btn{cursor:pointer}.st-btn:focus{outline:2px solid #3b82f6;outline-offset:2px}.st-btn:focus:not(:focus-visible){outline:none}@media(hover:hover){button.st-btn:hover .st-label{text-decoration:underline}}.st-ind{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:var(--st-ind);height:var(--st-ind);border-radius:50%;font-size:.8125rem;font-weight:600;line-height:1;background:#fff;border:2px solid #cbd5e1;color:#64748b}.st-sm .st-ind{font-size:.6875rem}.st-sm .st-check{width:11px;height:11px}.st-step[data-state=complete] .st-ind{background:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));border-color:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));color:#fff}.st-step[data-state=current] .st-ind{background:var(--st-accent, var(--ui-accent, #1d4ed8));border-color:var(--st-accent, var(--ui-accent, #1d4ed8));color:#fff;box-shadow:0 0 0 3px var(--ui-accent-soft, #bfdbfe)}@supports (color: color-mix(in srgb,red 30%,white)){.st-themed .st-step[data-state=current]:not([data-error=true]) .st-ind{box-shadow:0 0 0 3px color-mix(in srgb,var(--st-accent) 30%,white)}}.st-step[data-error=true] .st-ind{background:#dc2626;border-color:#dc2626;color:#fff;box-shadow:none}.st-label{font-size:.875rem;font-weight:500;line-height:var(--st-ind);color:#64748b;min-width:0;overflow-wrap:anywhere}.st-sm .st-label{font-size:.8125rem}.st-step[data-state=complete] .st-label{color:#1e293b}.st-step[data-state=current] .st-label{color:#0f172a;font-weight:600}.st-step[data-error=true] .st-label{color:#b91c1c}.st-accent-labels .st-step[data-state=current]:not([data-error=true]) .st-label{color:var(--st-accent, var(--ui-accent, #1d4ed8))}.st-opt{font-size:.75rem;line-height:var(--st-ind);color:#64748b;white-space:nowrap}.st-desc{font-size:.8125rem;line-height:1.4;color:#64748b;padding-left:calc(var(--st-ind) + 12px);overflow-wrap:anywhere}.st-errmsg{font-size:.8125rem;line-height:1.4;color:#b91c1c;padding-left:calc(var(--st-ind) + 12px);overflow-wrap:anywhere}.st-step[data-disabled=true] .st-item{opacity:.5}.st-sr,.st-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.st-conn{position:relative;display:block;background:#e2e8f0;border-radius:1px}.st-conn:after{content:\"\";position:absolute;inset:0;background:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));border-radius:1px;transform-origin:top left;transform:scale(0);transition:transform .3s ease}.st-step[data-state=complete] .st-conn:after{transform:scale(1)}.st-horizontal .st-conn{flex:1 1 12px;min-width:12px;height:2px;margin:calc(var(--st-ind) / 2 + 1px) 8px 0}.st-vertical .st-conn{position:absolute;left:calc(var(--st-ind) / 2 + 3px);top:calc(var(--st-ind) + 8px);bottom:4px;width:2px}@media(pointer:coarse),(max-width:480px){.st-btn{min-height:44px;align-items:center}button.st-btn{min-width:44px}.st-horizontal .st-conn{margin-top:21px}.st-vertical .st-conn{top:calc(26px + var(--st-ind) / 2)}}@media(max-width:480px){.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-label,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-opt,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-desc,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-errmsg{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.st-horizontal .st-conn{margin-left:4px;margin-right:4px;min-width:8px;flex-basis:8px}}@media(prefers-reduced-motion:reduce){.st-conn:after{transition:none}}\n"]
13429
13663
  }]
13430
13664
  }],
13665
+ ctorParameters: () => [],
13431
13666
  propDecorators: {
13432
13667
  steps: [{
13433
13668
  type: i0.Input,
@@ -13520,6 +13755,38 @@ i0.ɵɵngDeclareClassMetadata({
13520
13755
  required: false
13521
13756
  }]
13522
13757
  }],
13758
+ minStepWidth: [{
13759
+ type: i0.Input,
13760
+ args: [{
13761
+ isSignal: true,
13762
+ alias: "minStepWidth",
13763
+ required: false
13764
+ }]
13765
+ }],
13766
+ scrollable: [{
13767
+ type: i0.Input,
13768
+ args: [{
13769
+ isSignal: true,
13770
+ alias: "scrollable",
13771
+ required: false
13772
+ }]
13773
+ }],
13774
+ leadingWidth: [{
13775
+ type: i0.Input,
13776
+ args: [{
13777
+ isSignal: true,
13778
+ alias: "leadingWidth",
13779
+ required: false
13780
+ }]
13781
+ }],
13782
+ compact: [{
13783
+ type: i0.Input,
13784
+ args: [{
13785
+ isSignal: true,
13786
+ alias: "compact",
13787
+ required: false
13788
+ }]
13789
+ }],
13523
13790
  stepClick: [{
13524
13791
  type: i0.Output,
13525
13792
  args: ["stepClick"]
@@ -13985,9 +14252,12 @@ var BusinessHoursComponent = class BusinessHoursComponent {
13985
14252
  "routerLink",
13986
14253
  "queryParams",
13987
14254
  "fragment",
14255
+ "state",
13988
14256
  "href",
13989
14257
  "target",
13990
14258
  "rel",
14259
+ "shortLabel",
14260
+ "shortBelow",
13991
14261
  "color",
13992
14262
  "active",
13993
14263
  "size",
@@ -15708,6 +15978,7 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
15708
15978
  "step",
15709
15979
  "valueType",
15710
15980
  "formatter",
15981
+ "integer",
15711
15982
  "showErrors",
15712
15983
  "disabled"
15713
15984
  ],
@@ -15744,9 +16015,12 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
15744
16015
  "routerLink",
15745
16016
  "queryParams",
15746
16017
  "fragment",
16018
+ "state",
15747
16019
  "href",
15748
16020
  "target",
15749
16021
  "rel",
16022
+ "shortLabel",
16023
+ "shortBelow",
15750
16024
  "color",
15751
16025
  "active",
15752
16026
  "size",
@@ -17844,6 +18118,7 @@ var BulkMessagePanelComponent = class BulkMessagePanelComponent {
17844
18118
  "step",
17845
18119
  "valueType",
17846
18120
  "formatter",
18121
+ "integer",
17847
18122
  "showErrors",
17848
18123
  "disabled"
17849
18124
  ],
@@ -22468,12 +22743,37 @@ i0.ɵɵngDeclareClassMetadata({
22468
22743
  }]
22469
22744
  }
22470
22745
  });
22746
+ const FOCUSABLE = "input:not([type=\"hidden\"]), select, textarea, button, [tabindex]:not([tabindex=\"-1\"]), [contenteditable=\"true\"]";
22471
22747
  var FormComponent = class FormComponent {
22472
22748
  constructor() {
22473
22749
  this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
22474
22750
  this.ariaLabelledby = input("", ...ngDevMode ? [{ debugName: "ariaLabelledby" }] : /* istanbul ignore next */ []);
22475
22751
  this.autocomplete = input("", ...ngDevMode ? [{ debugName: "autocomplete" }] : /* istanbul ignore next */ []);
22476
22752
  this.submitted = output();
22753
+ this._host = inject(ElementRef);
22754
+ }
22755
+ static _usable(el) {
22756
+ if (el.matches(":disabled")) return false;
22757
+ if (el.getClientRects().length === 0) return false;
22758
+ const style = typeof getComputedStyle === "function" ? getComputedStyle(el) : null;
22759
+ return !style || style.visibility !== "hidden" && style.display !== "none";
22760
+ }
22761
+ invalidFields() {
22762
+ const found = [];
22763
+ for (const marked of Array.from(this._host.nativeElement.querySelectorAll("[aria-invalid=\"true\"]"))) {
22764
+ let target;
22765
+ if (marked.matches(FOCUSABLE)) target = FormComponent._usable(marked) ? marked : void 0;
22766
+ else target = Array.from(marked.querySelectorAll(FOCUSABLE)).find((c) => FormComponent._usable(c));
22767
+ if (target && !found.includes(target)) found.push(target);
22768
+ }
22769
+ return found;
22770
+ }
22771
+ focusFirstInvalid(options = {}) {
22772
+ const first = this.invalidFields()[0];
22773
+ if (!first) return false;
22774
+ if (options.scroll !== false && typeof first.scrollIntoView === "function") first.scrollIntoView({ block: "center" });
22775
+ first.focus({ preventScroll: true });
22776
+ return first.ownerDocument.activeElement === first;
22477
22777
  }
22478
22778
  onSubmit(event) {
22479
22779
  event.preventDefault();
@@ -23722,9 +24022,12 @@ var ListComponent = class ListComponent {
23722
24022
  "routerLink",
23723
24023
  "queryParams",
23724
24024
  "fragment",
24025
+ "state",
23725
24026
  "href",
23726
24027
  "target",
23727
24028
  "rel",
24029
+ "shortLabel",
24030
+ "shortBelow",
23728
24031
  "color",
23729
24032
  "active",
23730
24033
  "size",
@@ -25027,9 +25330,12 @@ var QrCodeComponent = class QrCodeComponent {
25027
25330
  "routerLink",
25028
25331
  "queryParams",
25029
25332
  "fragment",
25333
+ "state",
25030
25334
  "href",
25031
25335
  "target",
25032
25336
  "rel",
25337
+ "shortLabel",
25338
+ "shortBelow",
25033
25339
  "color",
25034
25340
  "active",
25035
25341
  "size",
@@ -25335,9 +25641,12 @@ var PanelInfoListComponent = class PanelInfoListComponent {
25335
25641
  "routerLink",
25336
25642
  "queryParams",
25337
25643
  "fragment",
25644
+ "state",
25338
25645
  "href",
25339
25646
  "target",
25340
25647
  "rel",
25648
+ "shortLabel",
25649
+ "shortBelow",
25341
25650
  "color",
25342
25651
  "active",
25343
25652
  "size",
@@ -27870,9 +28179,12 @@ var ImageGalleryComponent = class ImageGalleryComponent {
27870
28179
  "routerLink",
27871
28180
  "queryParams",
27872
28181
  "fragment",
28182
+ "state",
27873
28183
  "href",
27874
28184
  "target",
27875
28185
  "rel",
28186
+ "shortLabel",
28187
+ "shortBelow",
27876
28188
  "color",
27877
28189
  "active",
27878
28190
  "size",
@@ -28756,9 +29068,12 @@ var DateRangePickerComponent = class DateRangePickerComponent {
28756
29068
  "routerLink",
28757
29069
  "queryParams",
28758
29070
  "fragment",
29071
+ "state",
28759
29072
  "href",
28760
29073
  "target",
28761
29074
  "rel",
29075
+ "shortLabel",
29076
+ "shortBelow",
28762
29077
  "color",
28763
29078
  "active",
28764
29079
  "size",
@@ -31238,9 +31553,12 @@ var SignaturePadComponent = class SignaturePadComponent {
31238
31553
  "routerLink",
31239
31554
  "queryParams",
31240
31555
  "fragment",
31556
+ "state",
31241
31557
  "href",
31242
31558
  "target",
31243
31559
  "rel",
31560
+ "shortLabel",
31561
+ "shortBelow",
31244
31562
  "color",
31245
31563
  "active",
31246
31564
  "size",
@@ -31734,6 +32052,7 @@ i0.ɵɵngDeclareClassMetadata({
31734
32052
  }]
31735
32053
  }
31736
32054
  });
32055
+ const SELECT_IGNORE = "button, a[href], input, select, textarea, label, [role=button], [role=link], [data-no-select]";
31737
32056
  var DetailCardComponent = class DetailCardComponent {
31738
32057
  constructor() {
31739
32058
  this.title = input("", ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
@@ -31743,6 +32062,7 @@ var DetailCardComponent = class DetailCardComponent {
31743
32062
  this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
31744
32063
  this.subtitle = input("", ...ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []);
31745
32064
  this.background = input("", ...ngDevMode ? [{ debugName: "background" }] : /* istanbul ignore next */ []);
32065
+ this.headerBackground = input("", ...ngDevMode ? [{ debugName: "headerBackground" }] : /* istanbul ignore next */ []);
31746
32066
  this.textColor = input("", ...ngDevMode ? [{ debugName: "textColor" }] : /* istanbul ignore next */ []);
31747
32067
  this.showHeader = input(true, ...ngDevMode ? [{ debugName: "showHeader" }] : /* istanbul ignore next */ []);
31748
32068
  this.collapsible = input(true, ...ngDevMode ? [{ debugName: "collapsible" }] : /* istanbul ignore next */ []);
@@ -31754,6 +32074,10 @@ var DetailCardComponent = class DetailCardComponent {
31754
32074
  this.editIcon = input(true, ...ngDevMode ? [{ debugName: "editIcon" }] : /* istanbul ignore next */ []);
31755
32075
  this.editAriaLabel = input("", ...ngDevMode ? [{ debugName: "editAriaLabel" }] : /* istanbul ignore next */ []);
31756
32076
  this.fill = input(false, ...ngDevMode ? [{ debugName: "fill" }] : /* istanbul ignore next */ []);
32077
+ this.selectable = input(false, ...ngDevMode ? [{ debugName: "selectable" }] : /* istanbul ignore next */ []);
32078
+ this.selected = model(false, ...ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []);
32079
+ this.selectedColor = input("#3b82f6", ...ngDevMode ? [{ debugName: "selectedColor" }] : /* istanbul ignore next */ []);
32080
+ this.selectedBackground = input("", ...ngDevMode ? [{ debugName: "selectedBackground" }] : /* istanbul ignore next */ []);
31757
32081
  }
31758
32082
  groupLabel() {
31759
32083
  if (this.showHeader() && this.title()) return this.titleId() ? null : this.title();
@@ -31762,6 +32086,17 @@ var DetailCardComponent = class DetailCardComponent {
31762
32086
  isOpen() {
31763
32087
  return !(this.showHeader() && this.collapsible()) || this.expanded();
31764
32088
  }
32089
+ onCardClick(event) {
32090
+ if (!this.selectable()) return;
32091
+ const card = event.currentTarget;
32092
+ const target = event.target;
32093
+ if (!card || !target || typeof target.closest !== "function") return;
32094
+ const control = target.closest(SELECT_IGNORE);
32095
+ if (control && card.contains(control)) return;
32096
+ const sel = card.ownerDocument.defaultView?.getSelection?.();
32097
+ if (sel && !sel.isCollapsed && sel.toString() !== "" && (card.contains(sel.anchorNode) || card.contains(sel.focusNode))) return;
32098
+ this.selected.set(!this.selected());
32099
+ }
31765
32100
  toggle() {
31766
32101
  this.expanded.set(!this.expanded());
31767
32102
  }
@@ -31837,6 +32172,13 @@ var DetailCardComponent = class DetailCardComponent {
31837
32172
  isRequired: false,
31838
32173
  transformFunction: null
31839
32174
  },
32175
+ headerBackground: {
32176
+ classPropertyName: "headerBackground",
32177
+ publicName: "headerBackground",
32178
+ isSignal: true,
32179
+ isRequired: false,
32180
+ transformFunction: null
32181
+ },
31840
32182
  textColor: {
31841
32183
  classPropertyName: "textColor",
31842
32184
  publicName: "textColor",
@@ -31906,25 +32248,58 @@ var DetailCardComponent = class DetailCardComponent {
31906
32248
  isSignal: true,
31907
32249
  isRequired: false,
31908
32250
  transformFunction: null
32251
+ },
32252
+ selectable: {
32253
+ classPropertyName: "selectable",
32254
+ publicName: "selectable",
32255
+ isSignal: true,
32256
+ isRequired: false,
32257
+ transformFunction: null
32258
+ },
32259
+ selected: {
32260
+ classPropertyName: "selected",
32261
+ publicName: "selected",
32262
+ isSignal: true,
32263
+ isRequired: false,
32264
+ transformFunction: null
32265
+ },
32266
+ selectedColor: {
32267
+ classPropertyName: "selectedColor",
32268
+ publicName: "selectedColor",
32269
+ isSignal: true,
32270
+ isRequired: false,
32271
+ transformFunction: null
32272
+ },
32273
+ selectedBackground: {
32274
+ classPropertyName: "selectedBackground",
32275
+ publicName: "selectedBackground",
32276
+ isSignal: true,
32277
+ isRequired: false,
32278
+ transformFunction: null
31909
32279
  }
31910
32280
  },
31911
32281
  outputs: {
31912
32282
  expanded: "expandedChange",
31913
- editClick: "editClick"
32283
+ editClick: "editClick",
32284
+ selected: "selectedChange"
31914
32285
  },
31915
32286
  host: {
31916
32287
  attributes: { "role": "group" },
31917
32288
  properties: {
31918
32289
  "class.dc-fill-host": "fill()",
32290
+ "attr.data-selected": "selectable() && selected() ? \"true\" : null",
31919
32291
  "attr.aria-labelledby": "showHeader() && title() && titleId() ? titleId() : null",
31920
32292
  "attr.aria-label": "groupLabel()"
31921
32293
  }
31922
32294
  },
31923
32295
  ngImport: i0,
31924
32296
  template: `
31925
- <div class="dc" [class.dc-fill]="fill()" [class.dc-has-text-color]="!!textColor()" [style.background]="background() || null" [style.color]="textColor() || null" [style.--dc-text]="textColor() || null">
32297
+ <div class="dc" [class.dc-fill]="fill()" [class.dc-has-text-color]="!!textColor()" [class.dc-selectable]="selectable()" [class.dc-selected]="selectable() && selected()"
32298
+ [style.outline-color]="selectable() && selected() ? selectedColor() : null"
32299
+ [style.background]="(selectable() && selected() && selectedBackground()) || background() || null" (click)="onCardClick($event)"
32300
+ [style.color]="textColor() || null" [style.--dc-text]="textColor() || null">
31926
32301
  @if (showHeader()) {
31927
- <div class="dc-header" [class.collapsible]="collapsible()" [class.open]="isOpen()" (click)="onHeaderClick($event)">
32302
+ <div class="dc-header" [class.collapsible]="collapsible()" [class.open]="isOpen()" [style.background]="headerBackground() || null" (click)="onHeaderClick($event)">
31928
32303
  @if (collapsible()) {
31929
32304
  <ui-button class="dc-chevron" variant="icon" size="sm"
31930
32305
  [ariaLabel]="title() || 'Toggle section'"
@@ -31964,7 +32339,7 @@ var DetailCardComponent = class DetailCardComponent {
31964
32339
  </div>
31965
32340
  `,
31966
32341
  isInline: true,
31967
- styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom:0}:host(.dc-fill-host){height:100%;margin-bottom:0}.dc.dc-fill{height:100%;box-sizing:border-box;display:flex;flex-direction:column}.dc.dc-fill .dc-body-wrap{flex:1 1 auto;min-height:0}.dc{background:#fff;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dc-header{display:flex;align-items:center;flex-wrap:wrap;gap:8px 10px;padding:14px 18px}.dc-header.open{border-bottom:1px solid #f1f5f9}.dc-header.collapsible{cursor:pointer;-webkit-user-select:none;user-select:none}@media(hover:hover){.dc-header.collapsible:hover{background:#f8fafc}}.dc-chevron{flex-shrink:0;color:var(--dc-text, #64748b)}.dc-chevron svg{transition:transform .2s}.dc-chevron svg.rotated{transform:rotate(-90deg)}.dc-header-text{display:flex;flex-direction:column;gap:2px;flex:1 1 160px;min-width:0;word-break:break-word;overflow-wrap:anywhere}.dc-title{font-size:.8125rem;font-weight:800;letter-spacing:.07em;color:var(--dc-text, #1e293b);line-height:1.3;text-transform:uppercase}.dc-title--as-written{text-transform:none}.dc-subtitle{font-size:.75rem;color:var(--dc-text, #475569)}.dc-has-text-color .dc-subtitle{opacity:.8}.dc-has-text-color .dc-header.open{border-bottom-color:#94a3b859}.dc-edit{flex-shrink:0;margin-left:auto}.dc-edit ::ng-deep button{font-size:.8rem;font-weight:500;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;gap:5px}.dc-edit ::ng-deep button:hover{background:#f1f5f9;color:#1e293b}.dc-body-wrap{display:grid;grid-template-rows:1fr;transition:grid-template-rows .25s ease}.dc-body-wrap.collapsed{grid-template-rows:0fr}.dc-body{padding:16px 18px;min-height:0;overflow:hidden}@media(max-width:480px){.dc-header{padding:12px 14px}.dc-body{padding:14px}.dc-edit{margin-left:0}}@media(prefers-reduced-motion:reduce){.dc-body-wrap,.dc-chevron svg{transition:none}}\n"],
32342
+ styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom:0}:host(.dc-fill-host){height:100%;margin-bottom:0}.dc.dc-fill{height:100%;box-sizing:border-box;display:flex;flex-direction:column}.dc.dc-fill .dc-body-wrap{flex:1 1 auto;min-height:0}.dc-selectable{cursor:pointer}.dc-selected{outline:2px solid #3b82f6;outline-offset:-1px}.dc{background:#fff;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dc-header{display:flex;align-items:center;flex-wrap:wrap;gap:8px 10px;padding:14px 18px}.dc-header.open{border-bottom:1px solid #f1f5f9}.dc-header.collapsible{cursor:pointer;-webkit-user-select:none;user-select:none}@media(hover:hover){.dc-header.collapsible:hover{background:#f8fafc}}.dc-chevron{flex-shrink:0;color:var(--dc-text, #64748b)}.dc-chevron svg{transition:transform .2s}.dc-chevron svg.rotated{transform:rotate(-90deg)}.dc-header-text{display:flex;flex-direction:column;gap:2px;flex:1 1 160px;min-width:0;word-break:break-word;overflow-wrap:anywhere}.dc-title{font-size:.8125rem;font-weight:800;letter-spacing:.07em;color:var(--dc-text, #1e293b);line-height:1.3;text-transform:uppercase}.dc-title--as-written{text-transform:none}.dc-subtitle{font-size:.75rem;color:var(--dc-text, #475569)}.dc-has-text-color .dc-subtitle{opacity:.8}.dc-has-text-color .dc-header.open{border-bottom-color:#94a3b859}.dc-edit{flex-shrink:0;margin-left:auto}.dc-edit ::ng-deep button{font-size:.8rem;font-weight:500;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;gap:5px}.dc-edit ::ng-deep button:hover{background:#f1f5f9;color:#1e293b}.dc-body-wrap{display:grid;grid-template-rows:1fr;transition:grid-template-rows .25s ease}.dc-body-wrap.collapsed{grid-template-rows:0fr}.dc-body{padding:16px 18px;min-height:0;overflow:hidden}@media(max-width:480px){.dc-header{padding:12px 14px}.dc-body{padding:14px}.dc-edit{margin-left:0}}@media(prefers-reduced-motion:reduce){.dc-body-wrap,.dc-chevron svg{transition:none}}\n"],
31968
32343
  dependencies: [{
31969
32344
  kind: "component",
31970
32345
  type: ButtonComponent,
@@ -31974,9 +32349,12 @@ var DetailCardComponent = class DetailCardComponent {
31974
32349
  "routerLink",
31975
32350
  "queryParams",
31976
32351
  "fragment",
32352
+ "state",
31977
32353
  "href",
31978
32354
  "target",
31979
32355
  "rel",
32356
+ "shortLabel",
32357
+ "shortBelow",
31980
32358
  "color",
31981
32359
  "active",
31982
32360
  "size",
@@ -32011,13 +32389,17 @@ i0.ɵɵngDeclareClassMetadata({
32011
32389
  host: {
32012
32390
  "role": "group",
32013
32391
  "[class.dc-fill-host]": "fill()",
32392
+ "[attr.data-selected]": "selectable() && selected() ? \"true\" : null",
32014
32393
  "[attr.aria-labelledby]": "showHeader() && title() && titleId() ? titleId() : null",
32015
32394
  "[attr.aria-label]": "groupLabel()"
32016
32395
  },
32017
32396
  template: `
32018
- <div class="dc" [class.dc-fill]="fill()" [class.dc-has-text-color]="!!textColor()" [style.background]="background() || null" [style.color]="textColor() || null" [style.--dc-text]="textColor() || null">
32397
+ <div class="dc" [class.dc-fill]="fill()" [class.dc-has-text-color]="!!textColor()" [class.dc-selectable]="selectable()" [class.dc-selected]="selectable() && selected()"
32398
+ [style.outline-color]="selectable() && selected() ? selectedColor() : null"
32399
+ [style.background]="(selectable() && selected() && selectedBackground()) || background() || null" (click)="onCardClick($event)"
32400
+ [style.color]="textColor() || null" [style.--dc-text]="textColor() || null">
32019
32401
  @if (showHeader()) {
32020
- <div class="dc-header" [class.collapsible]="collapsible()" [class.open]="isOpen()" (click)="onHeaderClick($event)">
32402
+ <div class="dc-header" [class.collapsible]="collapsible()" [class.open]="isOpen()" [style.background]="headerBackground() || null" (click)="onHeaderClick($event)">
32021
32403
  @if (collapsible()) {
32022
32404
  <ui-button class="dc-chevron" variant="icon" size="sm"
32023
32405
  [ariaLabel]="title() || 'Toggle section'"
@@ -32056,7 +32438,7 @@ i0.ɵɵngDeclareClassMetadata({
32056
32438
  </div>
32057
32439
  </div>
32058
32440
  `,
32059
- styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom:0}:host(.dc-fill-host){height:100%;margin-bottom:0}.dc.dc-fill{height:100%;box-sizing:border-box;display:flex;flex-direction:column}.dc.dc-fill .dc-body-wrap{flex:1 1 auto;min-height:0}.dc{background:#fff;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dc-header{display:flex;align-items:center;flex-wrap:wrap;gap:8px 10px;padding:14px 18px}.dc-header.open{border-bottom:1px solid #f1f5f9}.dc-header.collapsible{cursor:pointer;-webkit-user-select:none;user-select:none}@media(hover:hover){.dc-header.collapsible:hover{background:#f8fafc}}.dc-chevron{flex-shrink:0;color:var(--dc-text, #64748b)}.dc-chevron svg{transition:transform .2s}.dc-chevron svg.rotated{transform:rotate(-90deg)}.dc-header-text{display:flex;flex-direction:column;gap:2px;flex:1 1 160px;min-width:0;word-break:break-word;overflow-wrap:anywhere}.dc-title{font-size:.8125rem;font-weight:800;letter-spacing:.07em;color:var(--dc-text, #1e293b);line-height:1.3;text-transform:uppercase}.dc-title--as-written{text-transform:none}.dc-subtitle{font-size:.75rem;color:var(--dc-text, #475569)}.dc-has-text-color .dc-subtitle{opacity:.8}.dc-has-text-color .dc-header.open{border-bottom-color:#94a3b859}.dc-edit{flex-shrink:0;margin-left:auto}.dc-edit ::ng-deep button{font-size:.8rem;font-weight:500;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;gap:5px}.dc-edit ::ng-deep button:hover{background:#f1f5f9;color:#1e293b}.dc-body-wrap{display:grid;grid-template-rows:1fr;transition:grid-template-rows .25s ease}.dc-body-wrap.collapsed{grid-template-rows:0fr}.dc-body{padding:16px 18px;min-height:0;overflow:hidden}@media(max-width:480px){.dc-header{padding:12px 14px}.dc-body{padding:14px}.dc-edit{margin-left:0}}@media(prefers-reduced-motion:reduce){.dc-body-wrap,.dc-chevron svg{transition:none}}\n"]
32441
+ styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom:0}:host(.dc-fill-host){height:100%;margin-bottom:0}.dc.dc-fill{height:100%;box-sizing:border-box;display:flex;flex-direction:column}.dc.dc-fill .dc-body-wrap{flex:1 1 auto;min-height:0}.dc-selectable{cursor:pointer}.dc-selected{outline:2px solid #3b82f6;outline-offset:-1px}.dc{background:#fff;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dc-header{display:flex;align-items:center;flex-wrap:wrap;gap:8px 10px;padding:14px 18px}.dc-header.open{border-bottom:1px solid #f1f5f9}.dc-header.collapsible{cursor:pointer;-webkit-user-select:none;user-select:none}@media(hover:hover){.dc-header.collapsible:hover{background:#f8fafc}}.dc-chevron{flex-shrink:0;color:var(--dc-text, #64748b)}.dc-chevron svg{transition:transform .2s}.dc-chevron svg.rotated{transform:rotate(-90deg)}.dc-header-text{display:flex;flex-direction:column;gap:2px;flex:1 1 160px;min-width:0;word-break:break-word;overflow-wrap:anywhere}.dc-title{font-size:.8125rem;font-weight:800;letter-spacing:.07em;color:var(--dc-text, #1e293b);line-height:1.3;text-transform:uppercase}.dc-title--as-written{text-transform:none}.dc-subtitle{font-size:.75rem;color:var(--dc-text, #475569)}.dc-has-text-color .dc-subtitle{opacity:.8}.dc-has-text-color .dc-header.open{border-bottom-color:#94a3b859}.dc-edit{flex-shrink:0;margin-left:auto}.dc-edit ::ng-deep button{font-size:.8rem;font-weight:500;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;gap:5px}.dc-edit ::ng-deep button:hover{background:#f1f5f9;color:#1e293b}.dc-body-wrap{display:grid;grid-template-rows:1fr;transition:grid-template-rows .25s ease}.dc-body-wrap.collapsed{grid-template-rows:0fr}.dc-body{padding:16px 18px;min-height:0;overflow:hidden}@media(max-width:480px){.dc-header{padding:12px 14px}.dc-body{padding:14px}.dc-edit{margin-left:0}}@media(prefers-reduced-motion:reduce){.dc-body-wrap,.dc-chevron svg{transition:none}}\n"]
32060
32442
  }]
32061
32443
  }],
32062
32444
  propDecorators: {
@@ -32116,6 +32498,14 @@ i0.ɵɵngDeclareClassMetadata({
32116
32498
  required: false
32117
32499
  }]
32118
32500
  }],
32501
+ headerBackground: [{
32502
+ type: i0.Input,
32503
+ args: [{
32504
+ isSignal: true,
32505
+ alias: "headerBackground",
32506
+ required: false
32507
+ }]
32508
+ }],
32119
32509
  textColor: [{
32120
32510
  type: i0.Input,
32121
32511
  args: [{
@@ -32202,6 +32592,41 @@ i0.ɵɵngDeclareClassMetadata({
32202
32592
  alias: "fill",
32203
32593
  required: false
32204
32594
  }]
32595
+ }],
32596
+ selectable: [{
32597
+ type: i0.Input,
32598
+ args: [{
32599
+ isSignal: true,
32600
+ alias: "selectable",
32601
+ required: false
32602
+ }]
32603
+ }],
32604
+ selected: [{
32605
+ type: i0.Input,
32606
+ args: [{
32607
+ isSignal: true,
32608
+ alias: "selected",
32609
+ required: false
32610
+ }]
32611
+ }, {
32612
+ type: i0.Output,
32613
+ args: ["selectedChange"]
32614
+ }],
32615
+ selectedColor: [{
32616
+ type: i0.Input,
32617
+ args: [{
32618
+ isSignal: true,
32619
+ alias: "selectedColor",
32620
+ required: false
32621
+ }]
32622
+ }],
32623
+ selectedBackground: [{
32624
+ type: i0.Input,
32625
+ args: [{
32626
+ isSignal: true,
32627
+ alias: "selectedBackground",
32628
+ required: false
32629
+ }]
32205
32630
  }]
32206
32631
  }
32207
32632
  });
@@ -33445,6 +33870,9 @@ var StackComponent = class StackComponent {
33445
33870
  this.wrap = input(false, ...ngDevMode ? [{ debugName: "wrap" }] : /* istanbul ignore next */ []);
33446
33871
  this.minHeight = input("", ...ngDevMode ? [{ debugName: "minHeight" }] : /* istanbul ignore next */ []);
33447
33872
  this.width = input("", ...ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []);
33873
+ this.maxWidth = input("", ...ngDevMode ? [{ debugName: "maxWidth" }] : /* istanbul ignore next */ []);
33874
+ this.padding = input("", ...ngDevMode ? [{ debugName: "padding" }] : /* istanbul ignore next */ []);
33875
+ this.centered = input(false, ...ngDevMode ? [{ debugName: "centered" }] : /* istanbul ignore next */ []);
33448
33876
  this.gapCss = computed(() => resolveLayoutGap(this.gap(), "md"), ...ngDevMode ? [{ debugName: "gapCss" }] : /* istanbul ignore next */ []);
33449
33877
  this.alignCss = computed(() => ALIGN[this.align()] ?? "stretch", ...ngDevMode ? [{ debugName: "alignCss" }] : /* istanbul ignore next */ []);
33450
33878
  this.justifyCss = computed(() => JUSTIFY$1[this.justify()] ?? "flex-start", ...ngDevMode ? [{ debugName: "justifyCss" }] : /* istanbul ignore next */ []);
@@ -33515,11 +33943,32 @@ var StackComponent = class StackComponent {
33515
33943
  isSignal: true,
33516
33944
  isRequired: false,
33517
33945
  transformFunction: null
33946
+ },
33947
+ maxWidth: {
33948
+ classPropertyName: "maxWidth",
33949
+ publicName: "maxWidth",
33950
+ isSignal: true,
33951
+ isRequired: false,
33952
+ transformFunction: null
33953
+ },
33954
+ padding: {
33955
+ classPropertyName: "padding",
33956
+ publicName: "padding",
33957
+ isSignal: true,
33958
+ isRequired: false,
33959
+ transformFunction: null
33960
+ },
33961
+ centered: {
33962
+ classPropertyName: "centered",
33963
+ publicName: "centered",
33964
+ isSignal: true,
33965
+ isRequired: false,
33966
+ transformFunction: null
33518
33967
  }
33519
33968
  },
33520
33969
  ngImport: i0,
33521
33970
  template: `<div class="st" [class.st-h]="direction() === 'horizontal'" [style.flex-direction]="direction() === 'horizontal' ? 'row' : 'column'"
33522
- [style.gap]="gapCss()" [style.align-items]="alignCss()" [style.justify-content]="justifyCss()" [style.flex-wrap]="wrap() ? 'wrap' : 'nowrap'" [style.min-height]="minHeight() || null" [style.width]="width() || null"><ng-content /></div>`,
33971
+ [style.gap]="gapCss()" [style.align-items]="alignCss()" [style.justify-content]="justifyCss()" [style.flex-wrap]="wrap() ? 'wrap' : 'nowrap'" [style.min-height]="minHeight() || null" [style.width]="width() || null" [style.max-width]="maxWidth() || null" [style.padding]="padding() || null" [style.box-sizing]="padding() ? 'border-box' : null" [style.margin-inline]="centered() ? 'auto' : null"><ng-content /></div>`,
33523
33972
  isInline: true,
33524
33973
  styles: [":host{display:block}.st{display:flex}.st>::ng-deep *{margin:0!important}.st.st-h>::ng-deep *{min-width:0}\n"],
33525
33974
  changeDetection: i0.ChangeDetectionStrategy.OnPush
@@ -33538,7 +33987,7 @@ i0.ɵɵngDeclareClassMetadata({
33538
33987
  standalone: true,
33539
33988
  changeDetection: ChangeDetectionStrategy.OnPush,
33540
33989
  template: `<div class="st" [class.st-h]="direction() === 'horizontal'" [style.flex-direction]="direction() === 'horizontal' ? 'row' : 'column'"
33541
- [style.gap]="gapCss()" [style.align-items]="alignCss()" [style.justify-content]="justifyCss()" [style.flex-wrap]="wrap() ? 'wrap' : 'nowrap'" [style.min-height]="minHeight() || null" [style.width]="width() || null"><ng-content /></div>`,
33990
+ [style.gap]="gapCss()" [style.align-items]="alignCss()" [style.justify-content]="justifyCss()" [style.flex-wrap]="wrap() ? 'wrap' : 'nowrap'" [style.min-height]="minHeight() || null" [style.width]="width() || null" [style.max-width]="maxWidth() || null" [style.padding]="padding() || null" [style.box-sizing]="padding() ? 'border-box' : null" [style.margin-inline]="centered() ? 'auto' : null"><ng-content /></div>`,
33542
33991
  styles: [":host{display:block}.st{display:flex}.st>::ng-deep *{margin:0!important}.st.st-h>::ng-deep *{min-width:0}\n"]
33543
33992
  }]
33544
33993
  }],
@@ -33598,6 +34047,30 @@ i0.ɵɵngDeclareClassMetadata({
33598
34047
  alias: "width",
33599
34048
  required: false
33600
34049
  }]
34050
+ }],
34051
+ maxWidth: [{
34052
+ type: i0.Input,
34053
+ args: [{
34054
+ isSignal: true,
34055
+ alias: "maxWidth",
34056
+ required: false
34057
+ }]
34058
+ }],
34059
+ padding: [{
34060
+ type: i0.Input,
34061
+ args: [{
34062
+ isSignal: true,
34063
+ alias: "padding",
34064
+ required: false
34065
+ }]
34066
+ }],
34067
+ centered: [{
34068
+ type: i0.Input,
34069
+ args: [{
34070
+ isSignal: true,
34071
+ alias: "centered",
34072
+ required: false
34073
+ }]
33601
34074
  }]
33602
34075
  }
33603
34076
  });
@@ -35081,6 +35554,881 @@ i0.ɵɵngDeclareClassMetadata({
35081
35554
  }]
35082
35555
  }
35083
35556
  });
35084
- export { ActionBarComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BarRowComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, CalendarComponent, CheckboxComponent, CheckboxTrailingDirective, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DropdownComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FileInputComponent, FormColSpanDirective, FormComponent, FormRowComponent, FormSectionComponent, HintComponent, IconComponent, ImageComponent, ImageGalleryComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, KpiCardComponent, LAYOUT_GAP_PX, ListComponent, ListItemComponent, LiveRegionComponent, ModalComponent, MoreMenuComponent, MultiSelectComponent, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PaginationComponent, PanelInfoListComponent, PdfHotspotComponent, PhoneNumberPickerComponent, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, RadioOptionContentDirective, ReadonlyFieldsetComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SearchInputComponent, SectionHeaderComponent, SelectComponent, SidePanelComponent, SignaturePadComponent, SkeletonComponent, StackComponent, StarComponent, StepperComponent, TableToolbarComponent, TextComponent, TextInputComponent, TextareaInputComponent, TimeInputComponent, TimelineComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_STATES, UiFieldValidity, acceptLabel, appShellGroupsStorageKey, autoVariant, buildDefaultSchedule, builtInActionIcon, businessTimeOptions, createFieldReveal, decodeFilterValues, digitsOnly, encodeFilterValue, encodeFilterValues, errorContextInterceptor, fileMatchesAccept, formatFileSize, formatIsoDate, formatIsoDateTime, formatTime, getEligibleIds, getEligibleOptions, getErrorMessage, humanReadableMessage, iconPath, isoKey, issueToErrors, maxLengthIssue, normalizeHexColor, parseBizHours, parseIso, parseTime, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, serializeBizHours };
35557
+ var PageComponent = class PageComponent {
35558
+ constructor() {
35559
+ this.maxWidth = input("", ...ngDevMode ? [{ debugName: "maxWidth" }] : /* istanbul ignore next */ []);
35560
+ this.padding = input("", ...ngDevMode ? [{ debugName: "padding" }] : /* istanbul ignore next */ []);
35561
+ this.centered = input(true, ...ngDevMode ? [{ debugName: "centered" }] : /* istanbul ignore next */ []);
35562
+ this.background = input("", ...ngDevMode ? [{ debugName: "background" }] : /* istanbul ignore next */ []);
35563
+ this.fillViewport = input(false, ...ngDevMode ? [{ debugName: "fillViewport" }] : /* istanbul ignore next */ []);
35564
+ this.stickyHeader = input(false, ...ngDevMode ? [{ debugName: "stickyHeader" }] : /* istanbul ignore next */ []);
35565
+ this.stickyFooter = input(false, ...ngDevMode ? [{ debugName: "stickyFooter" }] : /* istanbul ignore next */ []);
35566
+ this.transparent = input(false, ...ngDevMode ? [{ debugName: "transparent" }] : /* istanbul ignore next */ []);
35567
+ this.ownScroll = input(false, ...ngDevMode ? [{ debugName: "ownScroll" }] : /* istanbul ignore next */ []);
35568
+ this.focusKey = input(void 0, ...ngDevMode ? [{ debugName: "focusKey" }] : /* istanbul ignore next */ []);
35569
+ this.anchor = viewChild("anchor", ...ngDevMode ? [{ debugName: "anchor" }] : /* istanbul ignore next */ []);
35570
+ this.doc = inject(DOCUMENT);
35571
+ this.injector = inject(Injector);
35572
+ this.browser = isPlatformBrowser(inject(PLATFORM_ID));
35573
+ this.backgroundCss = computed(() => this.transparent() ? "transparent" : this.background() || null, ...ngDevMode ? [{ debugName: "backgroundCss" }] : /* istanbul ignore next */ []);
35574
+ this.maxWidthCss = computed(() => this.transparent() ? null : this.maxWidth() || null, ...ngDevMode ? [{ debugName: "maxWidthCss" }] : /* istanbul ignore next */ []);
35575
+ this.paddingCss = computed(() => {
35576
+ const p = this.padding();
35577
+ if (!p || p === "responsive") return null;
35578
+ return this.transparent() ? "8px 0 16px" : p;
35579
+ }, ...ngDevMode ? [{ debugName: "paddingCss" }] : /* istanbul ignore next */ []);
35580
+ this.scrollSaved = [];
35581
+ this.bgSaved = [];
35582
+ this.focusInitialised = false;
35583
+ effect(() => {
35584
+ const own = this.ownScroll();
35585
+ const transparent = this.transparent();
35586
+ if (!this.browser) return;
35587
+ untracked(() => {
35588
+ if (own) this.applyScroll();
35589
+ else this.releaseScroll();
35590
+ if (own && transparent) this.applyBackground();
35591
+ else this.releaseBackground();
35592
+ });
35593
+ });
35594
+ effect(() => {
35595
+ const key = this.focusKey();
35596
+ untracked(() => {
35597
+ if (!this.focusInitialised) {
35598
+ this.focusInitialised = true;
35599
+ this.lastFocusKey = key;
35600
+ return;
35601
+ }
35602
+ if (Object.is(key, this.lastFocusKey)) return;
35603
+ this.lastFocusKey = key;
35604
+ afterNextRender(() => this.focusTop(), { injector: this.injector });
35605
+ });
35606
+ });
35607
+ inject(DestroyRef).onDestroy(() => {
35608
+ this.releaseScroll();
35609
+ this.releaseBackground();
35610
+ });
35611
+ }
35612
+ focusTop() {
35613
+ const el = this.anchor()?.nativeElement;
35614
+ if (!el) return;
35615
+ const reduce = !!this.doc.defaultView?.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
35616
+ el.scrollIntoView(reduce ? {
35617
+ block: "start",
35618
+ behavior: "instant"
35619
+ } : { block: "start" });
35620
+ el.focus({ preventScroll: true });
35621
+ }
35622
+ save(list, el, prop, value) {
35623
+ if (!el) return;
35624
+ if (!list.some((e) => e.el === el)) list.push({
35625
+ el,
35626
+ prop,
35627
+ prev: el.style[prop]
35628
+ });
35629
+ el.style[prop] = value;
35630
+ }
35631
+ applyScroll() {
35632
+ const root = this.doc.querySelector("app-root");
35633
+ this.save(this.scrollSaved, this.doc.documentElement, "overflow", "auto");
35634
+ this.save(this.scrollSaved, this.doc.body, "overflow", "visible");
35635
+ this.save(this.scrollSaved, root, "overflow", "visible");
35636
+ }
35637
+ releaseScroll() {
35638
+ for (const e of this.scrollSaved) e.el.style[e.prop] = e.prev;
35639
+ this.scrollSaved = [];
35640
+ }
35641
+ applyBackground() {
35642
+ this.save(this.bgSaved, this.doc.documentElement, "background", "transparent");
35643
+ this.save(this.bgSaved, this.doc.body, "background", "transparent");
35644
+ }
35645
+ releaseBackground() {
35646
+ for (const e of this.bgSaved) e.el.style[e.prop] = e.prev;
35647
+ this.bgSaved = [];
35648
+ }
35649
+ static {
35650
+ this.ɵfac = i0.ɵɵngDeclareFactory({
35651
+ minVersion: "12.0.0",
35652
+ version: "22.2.2",
35653
+ ngImport: i0,
35654
+ type: PageComponent,
35655
+ deps: [],
35656
+ target: i0.ɵɵFactoryTarget.Component
35657
+ });
35658
+ }
35659
+ static {
35660
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
35661
+ minVersion: "17.2.0",
35662
+ version: "22.2.2",
35663
+ type: PageComponent,
35664
+ isStandalone: true,
35665
+ selector: "ui-page",
35666
+ inputs: {
35667
+ maxWidth: {
35668
+ classPropertyName: "maxWidth",
35669
+ publicName: "maxWidth",
35670
+ isSignal: true,
35671
+ isRequired: false,
35672
+ transformFunction: null
35673
+ },
35674
+ padding: {
35675
+ classPropertyName: "padding",
35676
+ publicName: "padding",
35677
+ isSignal: true,
35678
+ isRequired: false,
35679
+ transformFunction: null
35680
+ },
35681
+ centered: {
35682
+ classPropertyName: "centered",
35683
+ publicName: "centered",
35684
+ isSignal: true,
35685
+ isRequired: false,
35686
+ transformFunction: null
35687
+ },
35688
+ background: {
35689
+ classPropertyName: "background",
35690
+ publicName: "background",
35691
+ isSignal: true,
35692
+ isRequired: false,
35693
+ transformFunction: null
35694
+ },
35695
+ fillViewport: {
35696
+ classPropertyName: "fillViewport",
35697
+ publicName: "fillViewport",
35698
+ isSignal: true,
35699
+ isRequired: false,
35700
+ transformFunction: null
35701
+ },
35702
+ stickyHeader: {
35703
+ classPropertyName: "stickyHeader",
35704
+ publicName: "stickyHeader",
35705
+ isSignal: true,
35706
+ isRequired: false,
35707
+ transformFunction: null
35708
+ },
35709
+ stickyFooter: {
35710
+ classPropertyName: "stickyFooter",
35711
+ publicName: "stickyFooter",
35712
+ isSignal: true,
35713
+ isRequired: false,
35714
+ transformFunction: null
35715
+ },
35716
+ transparent: {
35717
+ classPropertyName: "transparent",
35718
+ publicName: "transparent",
35719
+ isSignal: true,
35720
+ isRequired: false,
35721
+ transformFunction: null
35722
+ },
35723
+ ownScroll: {
35724
+ classPropertyName: "ownScroll",
35725
+ publicName: "ownScroll",
35726
+ isSignal: true,
35727
+ isRequired: false,
35728
+ transformFunction: null
35729
+ },
35730
+ focusKey: {
35731
+ classPropertyName: "focusKey",
35732
+ publicName: "focusKey",
35733
+ isSignal: true,
35734
+ isRequired: false,
35735
+ transformFunction: null
35736
+ }
35737
+ },
35738
+ viewQueries: [{
35739
+ propertyName: "anchor",
35740
+ first: true,
35741
+ predicate: ["anchor"],
35742
+ descendants: true,
35743
+ isSignal: true
35744
+ }],
35745
+ ngImport: i0,
35746
+ template: `<div class="pg" [class.pg-fill]="fillViewport()" [class.pg-transparent]="transparent()" [style.background]="backgroundCss()">
35747
+ <div class="pg-anchor" tabindex="-1" #anchor></div>
35748
+ <div class="pg-header" [class.pg-sticky-h]="stickyHeader() && !transparent()"><ng-content select="[page-header]" /></div>
35749
+ <main class="pg-main" [class.pg-pad-resp]="padding() === 'responsive'" [class.pg-centered]="centered()"
35750
+ [style.max-width]="maxWidthCss()" [style.padding]="paddingCss()"><ng-content /></main>
35751
+ <div class="pg-footer" [class.pg-sticky-f]="stickyFooter() && !transparent()"><ng-content select="[page-footer]" /></div>
35752
+ </div>`,
35753
+ isInline: true,
35754
+ styles: [":host{display:block}.pg{box-sizing:border-box;display:flex;flex-direction:column}.pg.pg-fill{min-height:100vh;min-height:100dvh}.pg.pg-fill.pg-transparent{min-height:0}.pg.pg-transparent{background:transparent}.pg-anchor{height:0;outline:none}.pg-header:empty,.pg-footer:empty{display:none}.pg-header.pg-sticky-h{position:-webkit-sticky;position:sticky;top:0;z-index:20}.pg-footer.pg-sticky-f{position:-webkit-sticky;position:sticky;bottom:0;z-index:20}.pg-main{box-sizing:border-box;flex:1 0 auto;width:100%}.pg-main.pg-centered{margin-left:auto;margin-right:auto}.pg-main.pg-pad-resp{padding:32px 16px 16px}.pg-transparent .pg-main{max-width:none}.pg-transparent .pg-main.pg-pad-resp{padding:8px 0 16px}@media(min-width:640px){.pg-main.pg-pad-resp{padding:32px 24px 16px}.pg-transparent .pg-main.pg-pad-resp{padding:8px 0 16px}}@media(min-width:1024px){.pg-main.pg-pad-resp{padding:32px 0 16px}.pg-transparent .pg-main.pg-pad-resp{padding:8px 0 16px}}\n"],
35755
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
35756
+ });
35757
+ }
35758
+ };
35759
+ i0.ɵɵngDeclareClassMetadata({
35760
+ minVersion: "12.0.0",
35761
+ version: "22.2.2",
35762
+ ngImport: i0,
35763
+ type: PageComponent,
35764
+ decorators: [{
35765
+ type: Component,
35766
+ args: [{
35767
+ selector: "ui-page",
35768
+ standalone: true,
35769
+ changeDetection: ChangeDetectionStrategy.OnPush,
35770
+ template: `<div class="pg" [class.pg-fill]="fillViewport()" [class.pg-transparent]="transparent()" [style.background]="backgroundCss()">
35771
+ <div class="pg-anchor" tabindex="-1" #anchor></div>
35772
+ <div class="pg-header" [class.pg-sticky-h]="stickyHeader() && !transparent()"><ng-content select="[page-header]" /></div>
35773
+ <main class="pg-main" [class.pg-pad-resp]="padding() === 'responsive'" [class.pg-centered]="centered()"
35774
+ [style.max-width]="maxWidthCss()" [style.padding]="paddingCss()"><ng-content /></main>
35775
+ <div class="pg-footer" [class.pg-sticky-f]="stickyFooter() && !transparent()"><ng-content select="[page-footer]" /></div>
35776
+ </div>`,
35777
+ styles: [":host{display:block}.pg{box-sizing:border-box;display:flex;flex-direction:column}.pg.pg-fill{min-height:100vh;min-height:100dvh}.pg.pg-fill.pg-transparent{min-height:0}.pg.pg-transparent{background:transparent}.pg-anchor{height:0;outline:none}.pg-header:empty,.pg-footer:empty{display:none}.pg-header.pg-sticky-h{position:-webkit-sticky;position:sticky;top:0;z-index:20}.pg-footer.pg-sticky-f{position:-webkit-sticky;position:sticky;bottom:0;z-index:20}.pg-main{box-sizing:border-box;flex:1 0 auto;width:100%}.pg-main.pg-centered{margin-left:auto;margin-right:auto}.pg-main.pg-pad-resp{padding:32px 16px 16px}.pg-transparent .pg-main{max-width:none}.pg-transparent .pg-main.pg-pad-resp{padding:8px 0 16px}@media(min-width:640px){.pg-main.pg-pad-resp{padding:32px 24px 16px}.pg-transparent .pg-main.pg-pad-resp{padding:8px 0 16px}}@media(min-width:1024px){.pg-main.pg-pad-resp{padding:32px 0 16px}.pg-transparent .pg-main.pg-pad-resp{padding:8px 0 16px}}\n"]
35778
+ }]
35779
+ }],
35780
+ ctorParameters: () => [],
35781
+ propDecorators: {
35782
+ maxWidth: [{
35783
+ type: i0.Input,
35784
+ args: [{
35785
+ isSignal: true,
35786
+ alias: "maxWidth",
35787
+ required: false
35788
+ }]
35789
+ }],
35790
+ padding: [{
35791
+ type: i0.Input,
35792
+ args: [{
35793
+ isSignal: true,
35794
+ alias: "padding",
35795
+ required: false
35796
+ }]
35797
+ }],
35798
+ centered: [{
35799
+ type: i0.Input,
35800
+ args: [{
35801
+ isSignal: true,
35802
+ alias: "centered",
35803
+ required: false
35804
+ }]
35805
+ }],
35806
+ background: [{
35807
+ type: i0.Input,
35808
+ args: [{
35809
+ isSignal: true,
35810
+ alias: "background",
35811
+ required: false
35812
+ }]
35813
+ }],
35814
+ fillViewport: [{
35815
+ type: i0.Input,
35816
+ args: [{
35817
+ isSignal: true,
35818
+ alias: "fillViewport",
35819
+ required: false
35820
+ }]
35821
+ }],
35822
+ stickyHeader: [{
35823
+ type: i0.Input,
35824
+ args: [{
35825
+ isSignal: true,
35826
+ alias: "stickyHeader",
35827
+ required: false
35828
+ }]
35829
+ }],
35830
+ stickyFooter: [{
35831
+ type: i0.Input,
35832
+ args: [{
35833
+ isSignal: true,
35834
+ alias: "stickyFooter",
35835
+ required: false
35836
+ }]
35837
+ }],
35838
+ transparent: [{
35839
+ type: i0.Input,
35840
+ args: [{
35841
+ isSignal: true,
35842
+ alias: "transparent",
35843
+ required: false
35844
+ }]
35845
+ }],
35846
+ ownScroll: [{
35847
+ type: i0.Input,
35848
+ args: [{
35849
+ isSignal: true,
35850
+ alias: "ownScroll",
35851
+ required: false
35852
+ }]
35853
+ }],
35854
+ focusKey: [{
35855
+ type: i0.Input,
35856
+ args: [{
35857
+ isSignal: true,
35858
+ alias: "focusKey",
35859
+ required: false
35860
+ }]
35861
+ }],
35862
+ anchor: [{
35863
+ type: i0.ViewChild,
35864
+ args: ["anchor", { isSignal: true }]
35865
+ }]
35866
+ }
35867
+ });
35868
+ var FadeComponent = class FadeComponent {
35869
+ constructor() {
35870
+ this.key = input(void 0, ...ngDevMode ? [{ debugName: "key" }] : /* istanbul ignore next */ []);
35871
+ this.duration = input(300, ...ngDevMode ? [{ debugName: "duration" }] : /* istanbul ignore next */ []);
35872
+ this.disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
35873
+ this.odd = signal(false, ...ngDevMode ? [{ debugName: "odd" }] : /* istanbul ignore next */ []);
35874
+ this.first = true;
35875
+ effect(() => {
35876
+ const k = this.key();
35877
+ untracked(() => {
35878
+ if (this.first) {
35879
+ this.first = false;
35880
+ this.last = k;
35881
+ return;
35882
+ }
35883
+ if (Object.is(k, this.last)) return;
35884
+ this.last = k;
35885
+ this.odd.update((v) => !v);
35886
+ });
35887
+ });
35888
+ }
35889
+ static {
35890
+ this.ɵfac = i0.ɵɵngDeclareFactory({
35891
+ minVersion: "12.0.0",
35892
+ version: "22.2.2",
35893
+ ngImport: i0,
35894
+ type: FadeComponent,
35895
+ deps: [],
35896
+ target: i0.ɵɵFactoryTarget.Component
35897
+ });
35898
+ }
35899
+ static {
35900
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
35901
+ minVersion: "17.1.0",
35902
+ version: "22.2.2",
35903
+ type: FadeComponent,
35904
+ isStandalone: true,
35905
+ selector: "ui-fade",
35906
+ inputs: {
35907
+ key: {
35908
+ classPropertyName: "key",
35909
+ publicName: "key",
35910
+ isSignal: true,
35911
+ isRequired: false,
35912
+ transformFunction: null
35913
+ },
35914
+ duration: {
35915
+ classPropertyName: "duration",
35916
+ publicName: "duration",
35917
+ isSignal: true,
35918
+ isRequired: false,
35919
+ transformFunction: null
35920
+ },
35921
+ disabled: {
35922
+ classPropertyName: "disabled",
35923
+ publicName: "disabled",
35924
+ isSignal: true,
35925
+ isRequired: false,
35926
+ transformFunction: null
35927
+ }
35928
+ },
35929
+ ngImport: i0,
35930
+ template: `<div class="fd" [class.fd-a]="!disabled() && !odd()" [class.fd-b]="!disabled() && odd()" [style.animation-duration.ms]="duration()"><ng-content /></div>`,
35931
+ isInline: true,
35932
+ styles: [":host{display:block}.fd.fd-a{animation:ui-fade-a .3s ease both}.fd.fd-b{animation:ui-fade-b .3s ease both}@keyframes ui-fade-a{0%{opacity:0}to{opacity:1}}@keyframes ui-fade-b{0%{opacity:0}to{opacity:1}}@media(prefers-reduced-motion:reduce){.fd.fd-a,.fd.fd-b{animation:none}}\n"],
35933
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
35934
+ });
35935
+ }
35936
+ };
35937
+ i0.ɵɵngDeclareClassMetadata({
35938
+ minVersion: "12.0.0",
35939
+ version: "22.2.2",
35940
+ ngImport: i0,
35941
+ type: FadeComponent,
35942
+ decorators: [{
35943
+ type: Component,
35944
+ args: [{
35945
+ selector: "ui-fade",
35946
+ standalone: true,
35947
+ changeDetection: ChangeDetectionStrategy.OnPush,
35948
+ template: `<div class="fd" [class.fd-a]="!disabled() && !odd()" [class.fd-b]="!disabled() && odd()" [style.animation-duration.ms]="duration()"><ng-content /></div>`,
35949
+ styles: [":host{display:block}.fd.fd-a{animation:ui-fade-a .3s ease both}.fd.fd-b{animation:ui-fade-b .3s ease both}@keyframes ui-fade-a{0%{opacity:0}to{opacity:1}}@keyframes ui-fade-b{0%{opacity:0}to{opacity:1}}@media(prefers-reduced-motion:reduce){.fd.fd-a,.fd.fd-b{animation:none}}\n"]
35950
+ }]
35951
+ }],
35952
+ ctorParameters: () => [],
35953
+ propDecorators: {
35954
+ key: [{
35955
+ type: i0.Input,
35956
+ args: [{
35957
+ isSignal: true,
35958
+ alias: "key",
35959
+ required: false
35960
+ }]
35961
+ }],
35962
+ duration: [{
35963
+ type: i0.Input,
35964
+ args: [{
35965
+ isSignal: true,
35966
+ alias: "duration",
35967
+ required: false
35968
+ }]
35969
+ }],
35970
+ disabled: [{
35971
+ type: i0.Input,
35972
+ args: [{
35973
+ isSignal: true,
35974
+ alias: "disabled",
35975
+ required: false
35976
+ }]
35977
+ }]
35978
+ }
35979
+ });
35980
+ const TOKEN_PX = {
35981
+ sm: 480,
35982
+ md: 768,
35983
+ lg: 1024
35984
+ };
35985
+ var ShowComponent = class ShowComponent {
35986
+ constructor() {
35987
+ this.from = input(null, ...ngDevMode ? [{ debugName: "from" }] : /* istanbul ignore next */ []);
35988
+ this.below = input(null, ...ngDevMode ? [{ debugName: "below" }] : /* istanbul ignore next */ []);
35989
+ this.win = inject(DOCUMENT).defaultView;
35990
+ this.fromToken = computed(() => {
35991
+ const f = this.from();
35992
+ return typeof f === "string" && f in TOKEN_PX ? f : null;
35993
+ }, ...ngDevMode ? [{ debugName: "fromToken" }] : /* istanbul ignore next */ []);
35994
+ this.belowToken = computed(() => {
35995
+ const b = this.below();
35996
+ return typeof b === "string" && b in TOKEN_PX ? b : null;
35997
+ }, ...ngDevMode ? [{ debugName: "belowToken" }] : /* istanbul ignore next */ []);
35998
+ this.fromMatch = signal(true, ...ngDevMode ? [{ debugName: "fromMatch" }] : /* istanbul ignore next */ []);
35999
+ this.belowMatch = signal(true, ...ngDevMode ? [{ debugName: "belowMatch" }] : /* istanbul ignore next */ []);
36000
+ this.watch(() => {
36001
+ const f = this.from();
36002
+ return typeof f === "number" ? `(min-width: ${f}px)` : null;
36003
+ }, this.fromMatch);
36004
+ this.watch(() => {
36005
+ const b = this.below();
36006
+ return typeof b === "number" ? `(max-width: ${b - .02}px)` : null;
36007
+ }, this.belowMatch);
36008
+ }
36009
+ watch(query, target) {
36010
+ effect((onCleanup) => {
36011
+ const q = query();
36012
+ if (q === null || !this.win?.matchMedia) {
36013
+ target.set(true);
36014
+ return;
36015
+ }
36016
+ const mql = this.win.matchMedia(q);
36017
+ target.set(mql.matches);
36018
+ const handler = (e) => target.set(e.matches);
36019
+ mql.addEventListener("change", handler);
36020
+ onCleanup(() => mql.removeEventListener("change", handler));
36021
+ });
36022
+ }
36023
+ static {
36024
+ this.ɵfac = i0.ɵɵngDeclareFactory({
36025
+ minVersion: "12.0.0",
36026
+ version: "22.2.2",
36027
+ ngImport: i0,
36028
+ type: ShowComponent,
36029
+ deps: [],
36030
+ target: i0.ɵɵFactoryTarget.Component
36031
+ });
36032
+ }
36033
+ static {
36034
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
36035
+ minVersion: "17.1.0",
36036
+ version: "22.2.2",
36037
+ type: ShowComponent,
36038
+ isStandalone: true,
36039
+ selector: "ui-show",
36040
+ inputs: {
36041
+ from: {
36042
+ classPropertyName: "from",
36043
+ publicName: "from",
36044
+ isSignal: true,
36045
+ isRequired: false,
36046
+ transformFunction: null
36047
+ },
36048
+ below: {
36049
+ classPropertyName: "below",
36050
+ publicName: "below",
36051
+ isSignal: true,
36052
+ isRequired: false,
36053
+ transformFunction: null
36054
+ }
36055
+ },
36056
+ ngImport: i0,
36057
+ template: `<div class="sh" [class.sh-from-sm]="fromToken() === 'sm'" [class.sh-from-md]="fromToken() === 'md'" [class.sh-from-lg]="fromToken() === 'lg'"
36058
+ [class.sh-below-sm]="belowToken() === 'sm'" [class.sh-below-md]="belowToken() === 'md'" [class.sh-below-lg]="belowToken() === 'lg'"
36059
+ [class.sh-off]="!fromMatch() || !belowMatch()"><ng-content /></div>`,
36060
+ isInline: true,
36061
+ styles: [":host{display:block}.sh{display:block}.sh.sh-off{display:none}@media(max-width:479.98px){.sh.sh-from-sm{display:none}}@media(max-width:767.98px){.sh.sh-from-md{display:none}}@media(max-width:1023.98px){.sh.sh-from-lg{display:none}}@media(min-width:480px){.sh.sh-below-sm{display:none}}@media(min-width:768px){.sh.sh-below-md{display:none}}@media(min-width:1024px){.sh.sh-below-lg{display:none}}\n"],
36062
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
36063
+ });
36064
+ }
36065
+ };
36066
+ i0.ɵɵngDeclareClassMetadata({
36067
+ minVersion: "12.0.0",
36068
+ version: "22.2.2",
36069
+ ngImport: i0,
36070
+ type: ShowComponent,
36071
+ decorators: [{
36072
+ type: Component,
36073
+ args: [{
36074
+ selector: "ui-show",
36075
+ standalone: true,
36076
+ changeDetection: ChangeDetectionStrategy.OnPush,
36077
+ template: `<div class="sh" [class.sh-from-sm]="fromToken() === 'sm'" [class.sh-from-md]="fromToken() === 'md'" [class.sh-from-lg]="fromToken() === 'lg'"
36078
+ [class.sh-below-sm]="belowToken() === 'sm'" [class.sh-below-md]="belowToken() === 'md'" [class.sh-below-lg]="belowToken() === 'lg'"
36079
+ [class.sh-off]="!fromMatch() || !belowMatch()"><ng-content /></div>`,
36080
+ styles: [":host{display:block}.sh{display:block}.sh.sh-off{display:none}@media(max-width:479.98px){.sh.sh-from-sm{display:none}}@media(max-width:767.98px){.sh.sh-from-md{display:none}}@media(max-width:1023.98px){.sh.sh-from-lg{display:none}}@media(min-width:480px){.sh.sh-below-sm{display:none}}@media(min-width:768px){.sh.sh-below-md{display:none}}@media(min-width:1024px){.sh.sh-below-lg{display:none}}\n"]
36081
+ }]
36082
+ }],
36083
+ ctorParameters: () => [],
36084
+ propDecorators: {
36085
+ from: [{
36086
+ type: i0.Input,
36087
+ args: [{
36088
+ isSignal: true,
36089
+ alias: "from",
36090
+ required: false
36091
+ }]
36092
+ }],
36093
+ below: [{
36094
+ type: i0.Input,
36095
+ args: [{
36096
+ isSignal: true,
36097
+ alias: "below",
36098
+ required: false
36099
+ }]
36100
+ }]
36101
+ }
36102
+ });
36103
+ function formatCurrency(value, options = {}) {
36104
+ const { currency = "USD", locale = "en-US", grouping = true, decimals = 2 } = options;
36105
+ let n = typeof value === "string" ? parseFloat(value) : value ?? 0;
36106
+ if (typeof n !== "number" || !Number.isFinite(n)) n = 0;
36107
+ const formatter = new Intl.NumberFormat(locale, {
36108
+ style: "currency",
36109
+ currency,
36110
+ useGrouping: grouping,
36111
+ minimumFractionDigits: decimals,
36112
+ maximumFractionDigits: decimals
36113
+ });
36114
+ n = Number(n.toFixed(Math.max(0, Math.min(100, decimals)))) + 0;
36115
+ if (n === 0) n = 0;
36116
+ return formatter.format(n);
36117
+ }
36118
+ const clean = (v) => (v ?? "").trim();
36119
+ function formatAddress(parts, options = {}) {
36120
+ const separator = options.separator ?? ", ";
36121
+ const street = clean(parts.street), apt = clean(parts.apt), city = clean(parts.city), state = clean(parts.state), zip = clean(parts.zip);
36122
+ if (options.style === "usa") return [street ? street + (apt ? separator + "Apt " + apt : "") : "", ([city, state].filter(Boolean).join(separator) + (zip ? " " + zip : "")).trim()].filter(Boolean).join(separator);
36123
+ return [
36124
+ street,
36125
+ apt,
36126
+ city,
36127
+ state,
36128
+ zip
36129
+ ].filter(Boolean).join(separator);
36130
+ }
36131
+ function downloadBlob(blob, fileName) {
36132
+ if (typeof document === "undefined" || typeof URL === "undefined" || typeof URL.createObjectURL !== "function") return;
36133
+ const url = URL.createObjectURL(blob);
36134
+ const link = document.createElement("a");
36135
+ link.href = url;
36136
+ link.download = fileName;
36137
+ link.style.display = "none";
36138
+ document.body.appendChild(link);
36139
+ link.click();
36140
+ link.remove();
36141
+ setTimeout(() => URL.revokeObjectURL(url), 1e3);
36142
+ }
36143
+ var ImageGalleryDialogComponent = class ImageGalleryDialogComponent {
36144
+ constructor() {
36145
+ this.open = model(false, ...ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []);
36146
+ this.images = input([], ...ngDevMode ? [{ debugName: "images" }] : /* istanbul ignore next */ []);
36147
+ this.index = model(0, ...ngDevMode ? [{ debugName: "index" }] : /* istanbul ignore next */ []);
36148
+ this.title = input("", ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
36149
+ this.dialogTestId = input("", ...ngDevMode ? [{ debugName: "dialogTestId" }] : /* istanbul ignore next */ []);
36150
+ this.closeLabel = input("Close", ...ngDevMode ? [{ debugName: "closeLabel" }] : /* istanbul ignore next */ []);
36151
+ this.closeTestId = input("", ...ngDevMode ? [{ debugName: "closeTestId" }] : /* istanbul ignore next */ []);
36152
+ this.maxWidth = input("56rem", ...ngDevMode ? [{ debugName: "maxWidth" }] : /* istanbul ignore next */ []);
36153
+ this.galleryLabel = input("Image gallery", ...ngDevMode ? [{ debugName: "galleryLabel" }] : /* istanbul ignore next */ []);
36154
+ effect(() => {
36155
+ if (this.open()) this.index.set(0);
36156
+ });
36157
+ }
36158
+ static {
36159
+ this.ɵfac = i0.ɵɵngDeclareFactory({
36160
+ minVersion: "12.0.0",
36161
+ version: "22.2.2",
36162
+ ngImport: i0,
36163
+ type: ImageGalleryDialogComponent,
36164
+ deps: [],
36165
+ target: i0.ɵɵFactoryTarget.Component
36166
+ });
36167
+ }
36168
+ static {
36169
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
36170
+ minVersion: "17.0.0",
36171
+ version: "22.2.2",
36172
+ type: ImageGalleryDialogComponent,
36173
+ isStandalone: true,
36174
+ selector: "ui-image-gallery-dialog",
36175
+ inputs: {
36176
+ open: {
36177
+ classPropertyName: "open",
36178
+ publicName: "open",
36179
+ isSignal: true,
36180
+ isRequired: false,
36181
+ transformFunction: null
36182
+ },
36183
+ images: {
36184
+ classPropertyName: "images",
36185
+ publicName: "images",
36186
+ isSignal: true,
36187
+ isRequired: false,
36188
+ transformFunction: null
36189
+ },
36190
+ index: {
36191
+ classPropertyName: "index",
36192
+ publicName: "index",
36193
+ isSignal: true,
36194
+ isRequired: false,
36195
+ transformFunction: null
36196
+ },
36197
+ title: {
36198
+ classPropertyName: "title",
36199
+ publicName: "title",
36200
+ isSignal: true,
36201
+ isRequired: false,
36202
+ transformFunction: null
36203
+ },
36204
+ dialogTestId: {
36205
+ classPropertyName: "dialogTestId",
36206
+ publicName: "dialogTestId",
36207
+ isSignal: true,
36208
+ isRequired: false,
36209
+ transformFunction: null
36210
+ },
36211
+ closeLabel: {
36212
+ classPropertyName: "closeLabel",
36213
+ publicName: "closeLabel",
36214
+ isSignal: true,
36215
+ isRequired: false,
36216
+ transformFunction: null
36217
+ },
36218
+ closeTestId: {
36219
+ classPropertyName: "closeTestId",
36220
+ publicName: "closeTestId",
36221
+ isSignal: true,
36222
+ isRequired: false,
36223
+ transformFunction: null
36224
+ },
36225
+ maxWidth: {
36226
+ classPropertyName: "maxWidth",
36227
+ publicName: "maxWidth",
36228
+ isSignal: true,
36229
+ isRequired: false,
36230
+ transformFunction: null
36231
+ },
36232
+ galleryLabel: {
36233
+ classPropertyName: "galleryLabel",
36234
+ publicName: "galleryLabel",
36235
+ isSignal: true,
36236
+ isRequired: false,
36237
+ transformFunction: null
36238
+ }
36239
+ },
36240
+ outputs: {
36241
+ open: "openChange",
36242
+ index: "indexChange"
36243
+ },
36244
+ ngImport: i0,
36245
+ template: `
36246
+ <ui-modal [open]="open()" [title]="title()" [maxWidth]="maxWidth()" [dialogTestId]="dialogTestId()" [hideClose]="true" (close)="open.set(false)">
36247
+ @if (open()) {
36248
+ <ui-image-gallery [images]="images()" [(index)]="index" [ariaLabel]="galleryLabel()" [autofocus]="true" />
36249
+ }
36250
+ <ui-button modal-footer-right variant="secondary" size="sm" [attr.data-testid]="closeTestId() || null" (click)="open.set(false)">{{ closeLabel() }}</ui-button>
36251
+ </ui-modal>
36252
+ `,
36253
+ isInline: true,
36254
+ dependencies: [
36255
+ {
36256
+ kind: "component",
36257
+ type: ModalComponent,
36258
+ selector: "ui-modal",
36259
+ inputs: [
36260
+ "open",
36261
+ "title",
36262
+ "description",
36263
+ "maxWidth",
36264
+ "bodyOverflow",
36265
+ "dialogTestId",
36266
+ "hideClose",
36267
+ "closable"
36268
+ ],
36269
+ outputs: ["close"]
36270
+ },
36271
+ {
36272
+ kind: "component",
36273
+ type: ImageGalleryComponent,
36274
+ selector: "ui-image-gallery",
36275
+ inputs: [
36276
+ "images",
36277
+ "index",
36278
+ "loop",
36279
+ "showDots",
36280
+ "showCounter",
36281
+ "aspectRatio",
36282
+ "maxHeight",
36283
+ "fit",
36284
+ "ariaLabel",
36285
+ "autofocus"
36286
+ ],
36287
+ outputs: ["indexChange"]
36288
+ },
36289
+ {
36290
+ kind: "component",
36291
+ type: ButtonComponent,
36292
+ selector: "ui-button",
36293
+ inputs: [
36294
+ "variant",
36295
+ "routerLink",
36296
+ "queryParams",
36297
+ "fragment",
36298
+ "state",
36299
+ "href",
36300
+ "target",
36301
+ "rel",
36302
+ "shortLabel",
36303
+ "shortBelow",
36304
+ "color",
36305
+ "active",
36306
+ "size",
36307
+ "type",
36308
+ "disabled",
36309
+ "loading",
36310
+ "fullWidth",
36311
+ "ariaLabel",
36312
+ "ariaExpanded",
36313
+ "ariaPressed",
36314
+ "ariaDescribedBy",
36315
+ "modal-footer-left",
36316
+ "modal-footer-right"
36317
+ ]
36318
+ }
36319
+ ],
36320
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
36321
+ });
36322
+ }
36323
+ };
36324
+ i0.ɵɵngDeclareClassMetadata({
36325
+ minVersion: "12.0.0",
36326
+ version: "22.2.2",
36327
+ ngImport: i0,
36328
+ type: ImageGalleryDialogComponent,
36329
+ decorators: [{
36330
+ type: Component,
36331
+ args: [{
36332
+ selector: "ui-image-gallery-dialog",
36333
+ standalone: true,
36334
+ changeDetection: ChangeDetectionStrategy.OnPush,
36335
+ imports: [
36336
+ ModalComponent,
36337
+ ImageGalleryComponent,
36338
+ ButtonComponent
36339
+ ],
36340
+ template: `
36341
+ <ui-modal [open]="open()" [title]="title()" [maxWidth]="maxWidth()" [dialogTestId]="dialogTestId()" [hideClose]="true" (close)="open.set(false)">
36342
+ @if (open()) {
36343
+ <ui-image-gallery [images]="images()" [(index)]="index" [ariaLabel]="galleryLabel()" [autofocus]="true" />
36344
+ }
36345
+ <ui-button modal-footer-right variant="secondary" size="sm" [attr.data-testid]="closeTestId() || null" (click)="open.set(false)">{{ closeLabel() }}</ui-button>
36346
+ </ui-modal>
36347
+ `
36348
+ }]
36349
+ }],
36350
+ ctorParameters: () => [],
36351
+ propDecorators: {
36352
+ open: [{
36353
+ type: i0.Input,
36354
+ args: [{
36355
+ isSignal: true,
36356
+ alias: "open",
36357
+ required: false
36358
+ }]
36359
+ }, {
36360
+ type: i0.Output,
36361
+ args: ["openChange"]
36362
+ }],
36363
+ images: [{
36364
+ type: i0.Input,
36365
+ args: [{
36366
+ isSignal: true,
36367
+ alias: "images",
36368
+ required: false
36369
+ }]
36370
+ }],
36371
+ index: [{
36372
+ type: i0.Input,
36373
+ args: [{
36374
+ isSignal: true,
36375
+ alias: "index",
36376
+ required: false
36377
+ }]
36378
+ }, {
36379
+ type: i0.Output,
36380
+ args: ["indexChange"]
36381
+ }],
36382
+ title: [{
36383
+ type: i0.Input,
36384
+ args: [{
36385
+ isSignal: true,
36386
+ alias: "title",
36387
+ required: false
36388
+ }]
36389
+ }],
36390
+ dialogTestId: [{
36391
+ type: i0.Input,
36392
+ args: [{
36393
+ isSignal: true,
36394
+ alias: "dialogTestId",
36395
+ required: false
36396
+ }]
36397
+ }],
36398
+ closeLabel: [{
36399
+ type: i0.Input,
36400
+ args: [{
36401
+ isSignal: true,
36402
+ alias: "closeLabel",
36403
+ required: false
36404
+ }]
36405
+ }],
36406
+ closeTestId: [{
36407
+ type: i0.Input,
36408
+ args: [{
36409
+ isSignal: true,
36410
+ alias: "closeTestId",
36411
+ required: false
36412
+ }]
36413
+ }],
36414
+ maxWidth: [{
36415
+ type: i0.Input,
36416
+ args: [{
36417
+ isSignal: true,
36418
+ alias: "maxWidth",
36419
+ required: false
36420
+ }]
36421
+ }],
36422
+ galleryLabel: [{
36423
+ type: i0.Input,
36424
+ args: [{
36425
+ isSignal: true,
36426
+ alias: "galleryLabel",
36427
+ required: false
36428
+ }]
36429
+ }]
36430
+ }
36431
+ });
36432
+ export { ActionBarComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BarRowComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, CalendarComponent, CheckboxComponent, CheckboxTrailingDirective, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DropdownComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FadeComponent, FileInputComponent, FormColSpanDirective, FormComponent, FormRowComponent, FormSectionComponent, HintComponent, IconComponent, ImageComponent, ImageGalleryComponent, ImageGalleryDialogComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, KpiCardComponent, LAYOUT_GAP_PX, ListComponent, ListItemComponent, LiveRegionComponent, ModalComponent, MoreMenuComponent, MultiSelectComponent, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PageComponent, PaginationComponent, PanelInfoListComponent, PdfHotspotComponent, PhoneNumberPickerComponent, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, RadioOptionContentDirective, ReadonlyFieldsetComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SearchInputComponent, SectionHeaderComponent, SelectComponent, ShowComponent, SidePanelComponent, SignaturePadComponent, SkeletonComponent, StackComponent, StarComponent, StepperComponent, TableToolbarComponent, TextComponent, TextInputComponent, TextareaInputComponent, TimeInputComponent, TimelineComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_STATES, UiFieldValidity, acceptLabel, appShellGroupsStorageKey, autoVariant, buildDefaultSchedule, builtInActionIcon, businessTimeOptions, createFieldReveal, decodeFilterValues, digitsOnly, downloadBlob, encodeFilterValue, encodeFilterValues, errorContextInterceptor, fileMatchesAccept, formatAddress, formatCurrency, formatFileSize, formatIsoDate, formatIsoDateTime, formatTime, getEligibleIds, getEligibleOptions, getErrorMessage, humanReadableMessage, iconPath, isoKey, issueToErrors, maxLengthIssue, normalizeHexColor, parseBizHours, parseIso, parseTime, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, serializeBizHours };
35085
36433
 
35086
36434
  //# sourceMappingURL=forgeroute-ui.mjs.map