@forgeroute/ui 0.4.8 → 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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from "@angular/core";
2
- import { ApplicationRef, ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, Directive, ElementRef, EnvironmentInjector, HostBinding, HostListener, Injectable, InjectionToken, Injector, Input, PLATFORM_ID, Renderer2, TemplateRef, afterNextRender, computed, contentChild, contentChildren, createComponent, effect, forwardRef, inject, input, isDevMode, linkedSignal, makeEnvironmentProviders, model, output, provideEnvironmentInitializer, signal, untracked, viewChild } from "@angular/core";
2
+ import { ApplicationRef, ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, Directive, ElementRef, EnvironmentInjector, HostBinding, HostListener, Injectable, InjectionToken, Injector, Input, NgZone, PLATFORM_ID, Renderer2, TemplateRef, afterNextRender, computed, contentChild, contentChildren, createComponent, effect, forwardRef, inject, input, isDevMode, linkedSignal, makeEnvironmentProviders, model, output, provideEnvironmentInitializer, signal, untracked, viewChild } from "@angular/core";
3
3
  import { HttpClient, HttpErrorResponse, HttpParams } from "@angular/common/http";
4
4
  import { takeUntilDestroyed, toObservable } from "@angular/core/rxjs-interop";
5
5
  import { catchError, debounceTime, distinctUntilChanged, skip, switchMap } from "rxjs/operators";
@@ -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
  } },
@@ -1902,7 +1911,7 @@ var MoreMenuComponent = class MoreMenuComponent {
1902
1911
  </div>
1903
1912
  `,
1904
1913
  isInline: true,
1905
- styles: [":host{display:inline-block;position:relative}.mm-wrapper{position:relative}.mm-trigger{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;border:none;background:transparent;color:#94a3b8;cursor:pointer;transition:background .1s,color .1s}.mm-trigger:hover{background:#f1f5f9;color:#334155}.mm-trigger:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.mm-dropdown{position:absolute;right:0;top:calc(100% + 4px);z-index:200;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;min-width:160px;overflow-x:hidden;overflow-y:auto;padding:4px;max-width:calc(100vw - 16px);overscroll-behavior:contain;background:linear-gradient(#fff 30%,#fff0) center top / 100% 16px no-repeat local,linear-gradient(#fff0,#fff 70%) center bottom / 100% 16px no-repeat local,radial-gradient(farthest-side at 50% 0,#0f172a38,#0f172a00) center top / 100% 8px no-repeat scroll,radial-gradient(farthest-side at 50% 100%,#0f172a38,#0f172a00) center bottom / 100% 8px no-repeat scroll,#fff}.mm-dropdown.mm-up{top:auto;bottom:calc(100% + 4px)}.mm-dropdown.mm-fixed{position:fixed;left:auto}.mm-item{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;background:none;border:none;cursor:pointer;font-size:.875rem;color:#334155;font-family:inherit;text-align:left;border-radius:5px;transition:background .1s;min-height:40px}.mm-item:hover:not(:disabled){background:#f8fafc}.mm-item:disabled{opacity:.4;cursor:default}.mm-item.mm-danger{color:#dc2626}.mm-item.mm-danger:hover:not(:disabled){background:#fef2f2}.mm-item:focus-visible{outline:2px solid #60a5fa;outline-offset:-2px}.mm-icon{flex-shrink:0}@media(max-width:1024px){.mm-trigger{width:36px;height:36px}.mm-item{padding:11px 14px;min-height:40px}}@media(pointer:coarse){.mm-trigger{width:44px;height:44px}}@media(max-width:640px){.mm-trigger{width:44px;height:44px}.mm-item{padding:12px 14px;font-size:.9375rem;min-height:44px}.mm-dropdown{max-height:60vh;overflow-y:auto}}\n"],
1914
+ styles: [":host{display:inline-block;position:relative}.mm-wrapper{position:relative}.mm-trigger{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;border:none;background:transparent;color:#64748b;cursor:pointer;transition:background .1s,color .1s}.mm-trigger:hover{background:#f1f5f9;color:#334155}.mm-trigger:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.mm-dropdown{position:absolute;right:0;top:calc(100% + 4px);z-index:200;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;min-width:160px;overflow-x:hidden;overflow-y:auto;padding:4px;max-width:calc(100vw - 16px);overscroll-behavior:contain;background:linear-gradient(#fff 30%,#fff0) center top / 100% 16px no-repeat local,linear-gradient(#fff0,#fff 70%) center bottom / 100% 16px no-repeat local,radial-gradient(farthest-side at 50% 0,#0f172a38,#0f172a00) center top / 100% 8px no-repeat scroll,radial-gradient(farthest-side at 50% 100%,#0f172a38,#0f172a00) center bottom / 100% 8px no-repeat scroll,#fff}.mm-dropdown.mm-up{top:auto;bottom:calc(100% + 4px)}.mm-dropdown.mm-fixed{position:fixed;left:auto}.mm-item{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;background:none;border:none;cursor:pointer;font-size:.875rem;color:#334155;font-family:inherit;text-align:left;border-radius:5px;transition:background .1s;min-height:40px}.mm-item:hover:not(:disabled){background:#f8fafc}.mm-item:disabled{opacity:.4;cursor:default}.mm-item.mm-danger{color:#dc2626}.mm-item.mm-danger:hover:not(:disabled){background:#fef2f2}.mm-item:focus-visible{outline:2px solid #60a5fa;outline-offset:-2px}.mm-icon{flex-shrink:0}@media(max-width:1024px){.mm-trigger{width:36px;height:36px}.mm-item{padding:11px 14px;min-height:40px}}@media(pointer:coarse){.mm-trigger{width:44px;height:44px}}@media(max-width:640px){.mm-trigger{width:44px;height:44px}.mm-item{padding:12px 14px;font-size:.9375rem;min-height:44px}.mm-dropdown{max-height:60vh;overflow-y:auto}}\n"],
1906
1915
  changeDetection: i0.ChangeDetectionStrategy.OnPush
1907
1916
  });
1908
1917
  }
@@ -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
  },
@@ -1958,7 +1966,7 @@ i0.ɵɵngDeclareClassMetadata({
1958
1966
  }
1959
1967
  </div>
1960
1968
  `,
1961
- styles: [":host{display:inline-block;position:relative}.mm-wrapper{position:relative}.mm-trigger{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;border:none;background:transparent;color:#94a3b8;cursor:pointer;transition:background .1s,color .1s}.mm-trigger:hover{background:#f1f5f9;color:#334155}.mm-trigger:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.mm-dropdown{position:absolute;right:0;top:calc(100% + 4px);z-index:200;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;min-width:160px;overflow-x:hidden;overflow-y:auto;padding:4px;max-width:calc(100vw - 16px);overscroll-behavior:contain;background:linear-gradient(#fff 30%,#fff0) center top / 100% 16px no-repeat local,linear-gradient(#fff0,#fff 70%) center bottom / 100% 16px no-repeat local,radial-gradient(farthest-side at 50% 0,#0f172a38,#0f172a00) center top / 100% 8px no-repeat scroll,radial-gradient(farthest-side at 50% 100%,#0f172a38,#0f172a00) center bottom / 100% 8px no-repeat scroll,#fff}.mm-dropdown.mm-up{top:auto;bottom:calc(100% + 4px)}.mm-dropdown.mm-fixed{position:fixed;left:auto}.mm-item{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;background:none;border:none;cursor:pointer;font-size:.875rem;color:#334155;font-family:inherit;text-align:left;border-radius:5px;transition:background .1s;min-height:40px}.mm-item:hover:not(:disabled){background:#f8fafc}.mm-item:disabled{opacity:.4;cursor:default}.mm-item.mm-danger{color:#dc2626}.mm-item.mm-danger:hover:not(:disabled){background:#fef2f2}.mm-item:focus-visible{outline:2px solid #60a5fa;outline-offset:-2px}.mm-icon{flex-shrink:0}@media(max-width:1024px){.mm-trigger{width:36px;height:36px}.mm-item{padding:11px 14px;min-height:40px}}@media(pointer:coarse){.mm-trigger{width:44px;height:44px}}@media(max-width:640px){.mm-trigger{width:44px;height:44px}.mm-item{padding:12px 14px;font-size:.9375rem;min-height:44px}.mm-dropdown{max-height:60vh;overflow-y:auto}}\n"]
1969
+ styles: [":host{display:inline-block;position:relative}.mm-wrapper{position:relative}.mm-trigger{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;border:none;background:transparent;color:#64748b;cursor:pointer;transition:background .1s,color .1s}.mm-trigger:hover{background:#f1f5f9;color:#334155}.mm-trigger:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.mm-dropdown{position:absolute;right:0;top:calc(100% + 4px);z-index:200;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;min-width:160px;overflow-x:hidden;overflow-y:auto;padding:4px;max-width:calc(100vw - 16px);overscroll-behavior:contain;background:linear-gradient(#fff 30%,#fff0) center top / 100% 16px no-repeat local,linear-gradient(#fff0,#fff 70%) center bottom / 100% 16px no-repeat local,radial-gradient(farthest-side at 50% 0,#0f172a38,#0f172a00) center top / 100% 8px no-repeat scroll,radial-gradient(farthest-side at 50% 100%,#0f172a38,#0f172a00) center bottom / 100% 8px no-repeat scroll,#fff}.mm-dropdown.mm-up{top:auto;bottom:calc(100% + 4px)}.mm-dropdown.mm-fixed{position:fixed;left:auto}.mm-item{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;background:none;border:none;cursor:pointer;font-size:.875rem;color:#334155;font-family:inherit;text-align:left;border-radius:5px;transition:background .1s;min-height:40px}.mm-item:hover:not(:disabled){background:#f8fafc}.mm-item:disabled{opacity:.4;cursor:default}.mm-item.mm-danger{color:#dc2626}.mm-item.mm-danger:hover:not(:disabled){background:#fef2f2}.mm-item:focus-visible{outline:2px solid #60a5fa;outline-offset:-2px}.mm-icon{flex-shrink:0}@media(max-width:1024px){.mm-trigger{width:36px;height:36px}.mm-item{padding:11px 14px;min-height:40px}}@media(pointer:coarse){.mm-trigger{width:44px;height:44px}}@media(max-width:640px){.mm-trigger{width:44px;height:44px}.mm-item{padding:12px 14px;font-size:.9375rem;min-height:44px}.mm-dropdown{max-height:60vh;overflow-y:auto}}\n"]
1962
1970
  }]
1963
1971
  }],
1964
1972
  ctorParameters: () => [],
@@ -2553,6 +2561,7 @@ var CheckboxComponent = class CheckboxComponent {
2553
2561
  this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
2554
2562
  this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
2555
2563
  this.testId = input("", ...ngDevMode ? [{ debugName: "testId" }] : /* istanbul ignore next */ []);
2564
+ this.labelTestId = input("", ...ngDevMode ? [{ debugName: "labelTestId" }] : /* istanbul ignore next */ []);
2556
2565
  this.headingLevel = input(null, ...ngDevMode ? [{ debugName: "headingLevel" }] : /* istanbul ignore next */ []);
2557
2566
  this.indeterminate = input(false, ...ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []);
2558
2567
  this.checked = model(false, ...ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []);
@@ -2716,6 +2725,13 @@ var CheckboxComponent = class CheckboxComponent {
2716
2725
  isRequired: false,
2717
2726
  transformFunction: null
2718
2727
  },
2728
+ labelTestId: {
2729
+ classPropertyName: "labelTestId",
2730
+ publicName: "labelTestId",
2731
+ isSignal: true,
2732
+ isRequired: false,
2733
+ transformFunction: null
2734
+ },
2719
2735
  headingLevel: {
2720
2736
  classPropertyName: "headingLevel",
2721
2737
  publicName: "headingLevel",
@@ -2881,7 +2897,7 @@ var CheckboxComponent = class CheckboxComponent {
2881
2897
  [attr.aria-describedby]="opt.description ? _descId + '-' + i : null"
2882
2898
  (change)="onToggleOption(opt.value, $event)"
2883
2899
  />
2884
- <span class="cb-label">{{ opt.label }}</span>
2900
+ <span class="cb-label" [attr.data-testid]="opt.labelTestId || null">{{ opt.label }}</span>
2885
2901
  </label>
2886
2902
  @if (opt.description) {
2887
2903
  <p class="cb-desc" [id]="_descId + '-' + i">{{ opt.description }}</p>
@@ -2924,7 +2940,7 @@ var CheckboxComponent = class CheckboxComponent {
2924
2940
  (change)="onToggle($event)"
2925
2941
  />
2926
2942
  @if (label()) {
2927
- <span class="cb-label" [attr.role]="headingLevel() ? 'heading' : null" [attr.aria-level]="headingLevel() || null">{{ label() }}</span>
2943
+ <span class="cb-label" [attr.data-testid]="labelTestId() || null" [attr.role]="headingLevel() ? 'heading' : null" [attr.aria-level]="headingLevel() || null">{{ label() }}</span>
2928
2944
  }
2929
2945
  <ng-content />
2930
2946
  </label>
@@ -3021,7 +3037,7 @@ i0.ɵɵngDeclareClassMetadata({
3021
3037
  [attr.aria-describedby]="opt.description ? _descId + '-' + i : null"
3022
3038
  (change)="onToggleOption(opt.value, $event)"
3023
3039
  />
3024
- <span class="cb-label">{{ opt.label }}</span>
3040
+ <span class="cb-label" [attr.data-testid]="opt.labelTestId || null">{{ opt.label }}</span>
3025
3041
  </label>
3026
3042
  @if (opt.description) {
3027
3043
  <p class="cb-desc" [id]="_descId + '-' + i">{{ opt.description }}</p>
@@ -3064,7 +3080,7 @@ i0.ɵɵngDeclareClassMetadata({
3064
3080
  (change)="onToggle($event)"
3065
3081
  />
3066
3082
  @if (label()) {
3067
- <span class="cb-label" [attr.role]="headingLevel() ? 'heading' : null" [attr.aria-level]="headingLevel() || null">{{ label() }}</span>
3083
+ <span class="cb-label" [attr.data-testid]="labelTestId() || null" [attr.role]="headingLevel() ? 'heading' : null" [attr.aria-level]="headingLevel() || null">{{ label() }}</span>
3068
3084
  }
3069
3085
  <ng-content />
3070
3086
  </label>
@@ -3117,6 +3133,14 @@ i0.ɵɵngDeclareClassMetadata({
3117
3133
  required: false
3118
3134
  }]
3119
3135
  }],
3136
+ labelTestId: [{
3137
+ type: i0.Input,
3138
+ args: [{
3139
+ isSignal: true,
3140
+ alias: "labelTestId",
3141
+ required: false
3142
+ }]
3143
+ }],
3120
3144
  headingLevel: [{
3121
3145
  type: i0.Input,
3122
3146
  args: [{
@@ -3259,6 +3283,7 @@ var ButtonComponent = class ButtonComponent {
3259
3283
  this.routerLink = input(null, ...ngDevMode ? [{ debugName: "routerLink" }] : /* istanbul ignore next */ []);
3260
3284
  this.queryParams = input(null, ...ngDevMode ? [{ debugName: "queryParams" }] : /* istanbul ignore next */ []);
3261
3285
  this.fragment = input(null, ...ngDevMode ? [{ debugName: "fragment" }] : /* istanbul ignore next */ []);
3286
+ this.state = input(null, ...ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []);
3262
3287
  this.href = input(null, ...ngDevMode ? [{ debugName: "href" }] : /* istanbul ignore next */ []);
3263
3288
  this.target = input(null, ...ngDevMode ? [{ debugName: "target" }] : /* istanbul ignore next */ []);
3264
3289
  this.rel = input(null, ...ngDevMode ? [{ debugName: "rel" }] : /* istanbul ignore next */ []);
@@ -3285,6 +3310,14 @@ var ButtonComponent = class ButtonComponent {
3285
3310
  parts.add("noreferrer");
3286
3311
  return [...parts].join(" ");
3287
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 */ []);
3288
3321
  this.color = input(void 0, ...ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []);
3289
3322
  this.active = input(false, ...ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []);
3290
3323
  this.size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
@@ -3296,6 +3329,18 @@ var ButtonComponent = class ButtonComponent {
3296
3329
  this.ariaExpanded = input(void 0, ...ngDevMode ? [{ debugName: "ariaExpanded" }] : /* istanbul ignore next */ []);
3297
3330
  this.ariaPressed = input(void 0, ...ngDevMode ? [{ debugName: "ariaPressed" }] : /* istanbul ignore next */ []);
3298
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
+ });
3299
3344
  }
3300
3345
  static {
3301
3346
  this.ɵfac = i0.ɵɵngDeclareFactory({
@@ -3343,6 +3388,13 @@ var ButtonComponent = class ButtonComponent {
3343
3388
  isRequired: false,
3344
3389
  transformFunction: null
3345
3390
  },
3391
+ state: {
3392
+ classPropertyName: "state",
3393
+ publicName: "state",
3394
+ isSignal: true,
3395
+ isRequired: false,
3396
+ transformFunction: null
3397
+ },
3346
3398
  href: {
3347
3399
  classPropertyName: "href",
3348
3400
  publicName: "href",
@@ -3364,6 +3416,20 @@ var ButtonComponent = class ButtonComponent {
3364
3416
  isRequired: false,
3365
3417
  transformFunction: null
3366
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
+ },
3367
3433
  color: {
3368
3434
  classPropertyName: "color",
3369
3435
  publicName: "color",
@@ -3463,8 +3529,15 @@ var ButtonComponent = class ButtonComponent {
3463
3529
  @if (loading()) {
3464
3530
  <span class="spinner"></span>
3465
3531
  }
3466
- <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
+ }
3467
3539
  </ng-template>
3540
+ <ng-template #projected><ng-content /></ng-template>
3468
3541
  @if (routerLink() !== null) {
3469
3542
  <!-- A real link (middle-click, open in new tab, screen readers say "link"): same look as the button of this variant, underlined. -->
3470
3543
  @if (disabled() || loading()) {
@@ -3482,6 +3555,7 @@ var ButtonComponent = class ButtonComponent {
3482
3555
  [routerLink]="routerLink()"
3483
3556
  [queryParams]="queryParams()"
3484
3557
  [fragment]="fragment() ?? undefined"
3558
+ [state]="state() ?? undefined"
3485
3559
  [class]="'btn btn-anchor btn-' + variant() + ' btn-' + size()"
3486
3560
  [class.btn-full]="fullWidth()"
3487
3561
  [attr.aria-label]="ariaLabel()"
@@ -3530,7 +3604,7 @@ var ButtonComponent = class ButtonComponent {
3530
3604
  }
3531
3605
  `,
3532
3606
  isInline: true,
3533
- 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, #3B82F6);color:var(--ui-on-accent, #fff);border:1px solid var(--ui-accent, #3B82F6)}.btn-primary:hover:not(:disabled){background:var(--ui-accent-hover, #2563EB);border-color:var(--ui-accent-hover, #2563EB)}.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-accent, #3b82f6);border:none;padding:0;font-weight:500}.btn-link:hover:not(:disabled){color:var(--ui-accent-hover, #60a5fa)}.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, #3b82f6);border-bottom-color:var(--ui-accent, #3b82f6)}.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:#94a3b8}.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:#94a3b8}.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"],
3534
3608
  dependencies: [{
3535
3609
  kind: "directive",
3536
3610
  type: NgTemplateOutlet,
@@ -3581,8 +3655,15 @@ i0.ɵɵngDeclareClassMetadata({
3581
3655
  @if (loading()) {
3582
3656
  <span class="spinner"></span>
3583
3657
  }
3584
- <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
+ }
3585
3665
  </ng-template>
3666
+ <ng-template #projected><ng-content /></ng-template>
3586
3667
  @if (routerLink() !== null) {
3587
3668
  <!-- A real link (middle-click, open in new tab, screen readers say "link"): same look as the button of this variant, underlined. -->
3588
3669
  @if (disabled() || loading()) {
@@ -3600,6 +3681,7 @@ i0.ɵɵngDeclareClassMetadata({
3600
3681
  [routerLink]="routerLink()"
3601
3682
  [queryParams]="queryParams()"
3602
3683
  [fragment]="fragment() ?? undefined"
3684
+ [state]="state() ?? undefined"
3603
3685
  [class]="'btn btn-anchor btn-' + variant() + ' btn-' + size()"
3604
3686
  [class.btn-full]="fullWidth()"
3605
3687
  [attr.aria-label]="ariaLabel()"
@@ -3647,9 +3729,10 @@ i0.ɵɵngDeclareClassMetadata({
3647
3729
  ><ng-container [ngTemplateOutlet]="content" /></button>
3648
3730
  }
3649
3731
  `,
3650
- 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, #3B82F6);color:var(--ui-on-accent, #fff);border:1px solid var(--ui-accent, #3B82F6)}.btn-primary:hover:not(:disabled){background:var(--ui-accent-hover, #2563EB);border-color:var(--ui-accent-hover, #2563EB)}.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-accent, #3b82f6);border:none;padding:0;font-weight:500}.btn-link:hover:not(:disabled){color:var(--ui-accent-hover, #60a5fa)}.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, #3b82f6);border-bottom-color:var(--ui-accent, #3b82f6)}.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:#94a3b8}.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:#94a3b8}.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"]
3651
3733
  }]
3652
3734
  }],
3735
+ ctorParameters: () => [],
3653
3736
  propDecorators: {
3654
3737
  variant: [{
3655
3738
  type: i0.Input,
@@ -3683,6 +3766,14 @@ i0.ɵɵngDeclareClassMetadata({
3683
3766
  required: false
3684
3767
  }]
3685
3768
  }],
3769
+ state: [{
3770
+ type: i0.Input,
3771
+ args: [{
3772
+ isSignal: true,
3773
+ alias: "state",
3774
+ required: false
3775
+ }]
3776
+ }],
3686
3777
  href: [{
3687
3778
  type: i0.Input,
3688
3779
  args: [{
@@ -3707,6 +3798,22 @@ i0.ɵɵngDeclareClassMetadata({
3707
3798
  required: false
3708
3799
  }]
3709
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
+ }],
3710
3817
  color: [{
3711
3818
  type: i0.Input,
3712
3819
  args: [{
@@ -3829,6 +3936,7 @@ var TextInputComponent = class TextInputComponent {
3829
3936
  this.step = input(void 0, ...ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []);
3830
3937
  this.valueType = input("string", ...ngDevMode ? [{ debugName: "valueType" }] : /* istanbul ignore next */ []);
3831
3938
  this.formatter = input(void 0, ...ngDevMode ? [{ debugName: "formatter" }] : /* istanbul ignore next */ []);
3939
+ this.integer = input(false, ...ngDevMode ? [{ debugName: "integer" }] : /* istanbul ignore next */ []);
3832
3940
  this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
3833
3941
  this.valueChange = output();
3834
3942
  this.focused = output();
@@ -3846,7 +3954,8 @@ var TextInputComponent = class TextInputComponent {
3846
3954
  this._numeric = computed(() => this.valueType() === "number" && this.type() === "number", ...ngDevMode ? [{ debugName: "_numeric" }] : /* istanbul ignore next */ []);
3847
3955
  this._stepAttr = computed(() => {
3848
3956
  const step = this.step();
3849
- 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;
3850
3959
  }, ...ngDevMode ? [{ debugName: "_stepAttr" }] : /* istanbul ignore next */ []);
3851
3960
  this._warned = false;
3852
3961
  this._formatting = computed(() => this.phoneFormat() || this.type() === "tel", ...ngDevMode ? [{ debugName: "_formatting" }] : /* istanbul ignore next */ []);
@@ -3900,6 +4009,7 @@ var TextInputComponent = class TextInputComponent {
3900
4009
  const input = event.target;
3901
4010
  const raw = input.value;
3902
4011
  let val = this._formatting() ? TextInputComponent._formatPhone(raw) : raw;
4012
+ if (this.integer()) val = val.replace(/[.eE].*$/, "");
3903
4013
  const format = this.formatter();
3904
4014
  if (format) val = format(val);
3905
4015
  this._value.set(val);
@@ -3953,7 +4063,7 @@ var TextInputComponent = class TextInputComponent {
3953
4063
  key: "number",
3954
4064
  message: "Please enter a valid number."
3955
4065
  };
3956
- 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);
3957
4067
  if (min != null && n < min) return {
3958
4068
  key: "min",
3959
4069
  message: `Must be at least ${min}`,
@@ -4142,6 +4252,13 @@ var TextInputComponent = class TextInputComponent {
4142
4252
  isRequired: false,
4143
4253
  transformFunction: null
4144
4254
  },
4255
+ integer: {
4256
+ classPropertyName: "integer",
4257
+ publicName: "integer",
4258
+ isSignal: true,
4259
+ isRequired: false,
4260
+ transformFunction: null
4261
+ },
4145
4262
  showErrors: {
4146
4263
  classPropertyName: "showErrors",
4147
4264
  publicName: "showErrors",
@@ -4195,7 +4312,7 @@ var TextInputComponent = class TextInputComponent {
4195
4312
  [style.padding-left]="_prefixPadding()"
4196
4313
  [id]="_inputId"
4197
4314
  [type]="type()"
4198
- [attr.inputmode]="inputmode() || (type() === 'tel' ? 'tel' : null)"
4315
+ [attr.inputmode]="inputmode() || (type() === 'tel' ? 'tel' : integer() ? 'numeric' : null)"
4199
4316
  [placeholder]="placeholder()"
4200
4317
  [value]="_value()"
4201
4318
  [disabled]="disabled()"
@@ -4269,7 +4386,7 @@ i0.ɵɵngDeclareClassMetadata({
4269
4386
  [style.padding-left]="_prefixPadding()"
4270
4387
  [id]="_inputId"
4271
4388
  [type]="type()"
4272
- [attr.inputmode]="inputmode() || (type() === 'tel' ? 'tel' : null)"
4389
+ [attr.inputmode]="inputmode() || (type() === 'tel' ? 'tel' : integer() ? 'numeric' : null)"
4273
4390
  [placeholder]="placeholder()"
4274
4391
  [value]="_value()"
4275
4392
  [disabled]="disabled()"
@@ -4453,6 +4570,14 @@ i0.ɵɵngDeclareClassMetadata({
4453
4570
  required: false
4454
4571
  }]
4455
4572
  }],
4573
+ integer: [{
4574
+ type: i0.Input,
4575
+ args: [{
4576
+ isSignal: true,
4577
+ alias: "integer",
4578
+ required: false
4579
+ }]
4580
+ }],
4456
4581
  showErrors: [{
4457
4582
  type: i0.Input,
4458
4583
  args: [{
@@ -4879,6 +5004,7 @@ var TableToolbarComponent = class TableToolbarComponent {
4879
5004
  "label",
4880
5005
  "ariaLabel",
4881
5006
  "testId",
5007
+ "labelTestId",
4882
5008
  "headingLevel",
4883
5009
  "indeterminate",
4884
5010
  "checked",
@@ -4910,9 +5036,12 @@ var TableToolbarComponent = class TableToolbarComponent {
4910
5036
  "routerLink",
4911
5037
  "queryParams",
4912
5038
  "fragment",
5039
+ "state",
4913
5040
  "href",
4914
5041
  "target",
4915
5042
  "rel",
5043
+ "shortLabel",
5044
+ "shortBelow",
4916
5045
  "color",
4917
5046
  "active",
4918
5047
  "size",
@@ -4952,6 +5081,7 @@ var TableToolbarComponent = class TableToolbarComponent {
4952
5081
  "step",
4953
5082
  "valueType",
4954
5083
  "formatter",
5084
+ "integer",
4955
5085
  "showErrors",
4956
5086
  "disabled"
4957
5087
  ],
@@ -7559,9 +7689,12 @@ var ImportExportComponent = class ImportExportComponent {
7559
7689
  "routerLink",
7560
7690
  "queryParams",
7561
7691
  "fragment",
7692
+ "state",
7562
7693
  "href",
7563
7694
  "target",
7564
7695
  "rel",
7696
+ "shortLabel",
7697
+ "shortBelow",
7565
7698
  "color",
7566
7699
  "active",
7567
7700
  "size",
@@ -8056,9 +8189,12 @@ var ConfirmOutletComponent = class ConfirmOutletComponent {
8056
8189
  "routerLink",
8057
8190
  "queryParams",
8058
8191
  "fragment",
8192
+ "state",
8059
8193
  "href",
8060
8194
  "target",
8061
8195
  "rel",
8196
+ "shortLabel",
8197
+ "shortBelow",
8062
8198
  "color",
8063
8199
  "active",
8064
8200
  "size",
@@ -8407,9 +8543,12 @@ var ErrorStateComponent = class ErrorStateComponent {
8407
8543
  "routerLink",
8408
8544
  "queryParams",
8409
8545
  "fragment",
8546
+ "state",
8410
8547
  "href",
8411
8548
  "target",
8412
8549
  "rel",
8550
+ "shortLabel",
8551
+ "shortBelow",
8413
8552
  "color",
8414
8553
  "active",
8415
8554
  "size",
@@ -10747,9 +10886,12 @@ var DataTableComponent = class DataTableComponent {
10747
10886
  "routerLink",
10748
10887
  "queryParams",
10749
10888
  "fragment",
10889
+ "state",
10750
10890
  "href",
10751
10891
  "target",
10752
10892
  "rel",
10893
+ "shortLabel",
10894
+ "shortBelow",
10753
10895
  "color",
10754
10896
  "active",
10755
10897
  "size",
@@ -10773,6 +10915,7 @@ var DataTableComponent = class DataTableComponent {
10773
10915
  "label",
10774
10916
  "ariaLabel",
10775
10917
  "testId",
10918
+ "labelTestId",
10776
10919
  "headingLevel",
10777
10920
  "indeterminate",
10778
10921
  "checked",
@@ -11845,6 +11988,7 @@ var SidePanelComponent = class SidePanelComponent {
11845
11988
  onKeydown(event) {
11846
11989
  if (!this.open() || !this._overlays.isTop(this)) return;
11847
11990
  if (event.key === "Escape") {
11991
+ if (event.defaultPrevented) return;
11848
11992
  event.preventDefault();
11849
11993
  this.closed.emit();
11850
11994
  return;
@@ -13140,10 +13284,34 @@ var StepperComponent = class StepperComponent {
13140
13284
  this.size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
13141
13285
  this.accentColor = input("", ...ngDevMode ? [{ debugName: "accentColor" }] : /* istanbul ignore next */ []);
13142
13286
  this.completeColor = input("", ...ngDevMode ? [{ debugName: "completeColor" }] : /* istanbul ignore next */ []);
13287
+ this.accentLabels = input(false, ...ngDevMode ? [{ debugName: "accentLabels" }] : /* istanbul ignore next */ []);
13143
13288
  this.ariaLabel = input("Progress", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
13144
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 */ []);
13145
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 */ []);
13146
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 */ []);
13147
13315
  this.rows = computed(() => {
13148
13316
  const steps = this.steps();
13149
13317
  const cur = steps.findIndex((s) => s.key === this.current());
@@ -13154,7 +13322,7 @@ var StepperComponent = class StepperComponent {
13154
13322
  const state = i === cur ? "current" : step.complete === void 0 ? derived : step.complete ? "complete" : "upcoming";
13155
13323
  const errorMessage = typeof step.error === "string" ? step.error : "";
13156
13324
  const error = step.error === true || errorMessage !== "";
13157
- const selectable = clickable && !step.disabled && state !== "current" && (linear ? state === "complete" : true);
13325
+ const selectable = clickable && !step.disabled && step.selectable !== false && state !== "current" && (linear ? state === "complete" : true);
13158
13326
  const status = state === "complete" ? "completed" : state === "current" ? "current step" : "not started";
13159
13327
  return {
13160
13328
  step,
@@ -13169,6 +13337,16 @@ var StepperComponent = class StepperComponent {
13169
13337
  };
13170
13338
  });
13171
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
+ });
13172
13350
  }
13173
13351
  activate(r) {
13174
13352
  if (!r.selectable || r.state === "current") return;
@@ -13249,6 +13427,13 @@ var StepperComponent = class StepperComponent {
13249
13427
  isRequired: false,
13250
13428
  transformFunction: null
13251
13429
  },
13430
+ accentLabels: {
13431
+ classPropertyName: "accentLabels",
13432
+ publicName: "accentLabels",
13433
+ isSignal: true,
13434
+ isRequired: false,
13435
+ transformFunction: null
13436
+ },
13252
13437
  ariaLabel: {
13253
13438
  classPropertyName: "ariaLabel",
13254
13439
  publicName: "ariaLabel",
@@ -13262,6 +13447,34 @@ var StepperComponent = class StepperComponent {
13262
13447
  isSignal: true,
13263
13448
  isRequired: false,
13264
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
13265
13478
  }
13266
13479
  },
13267
13480
  outputs: {
@@ -13274,12 +13487,18 @@ var StepperComponent = class StepperComponent {
13274
13487
  } },
13275
13488
  ngImport: i0,
13276
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()">
13277
13494
  <ol class="st"
13495
+ [style.min-width]="olMinWidth()"
13278
13496
  [class.st-horizontal]="orientation() === 'horizontal'"
13279
13497
  [class.st-vertical]="orientation() === 'vertical'"
13280
13498
  [class.st-sm]="size() === 'sm'"
13281
13499
  [class.st-labels-current]="labelsOnSmallScreens() === 'current'"
13282
13500
  [class.st-themed]="!!accentColor()"
13501
+ [class.st-accent-labels]="accentLabels()"
13283
13502
  [attr.aria-label]="ariaLabel() || null">
13284
13503
  @for (r of rows(); track r.step.key) {
13285
13504
  <li class="st-step"
@@ -13306,6 +13525,17 @@ var StepperComponent = class StepperComponent {
13306
13525
  </li>
13307
13526
  }
13308
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>
13309
13539
 
13310
13540
  <ng-template #body let-r>
13311
13541
  <span class="st-ind" aria-hidden="true">
@@ -13320,7 +13550,7 @@ var StepperComponent = class StepperComponent {
13320
13550
  </ng-template>
13321
13551
  `,
13322
13552
  isInline: true,
13323
- 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] .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-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"],
13324
13554
  dependencies: [{
13325
13555
  kind: "directive",
13326
13556
  type: NgTemplateOutlet,
@@ -13330,6 +13560,21 @@ var StepperComponent = class StepperComponent {
13330
13560
  "ngTemplateOutlet",
13331
13561
  "ngTemplateOutletInjector"
13332
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
+ ]
13333
13578
  }],
13334
13579
  changeDetection: i0.ChangeDetectionStrategy.OnPush
13335
13580
  });
@@ -13345,19 +13590,25 @@ i0.ɵɵngDeclareClassMetadata({
13345
13590
  args: [{
13346
13591
  selector: "ui-stepper",
13347
13592
  standalone: true,
13348
- imports: [NgTemplateOutlet],
13593
+ imports: [NgTemplateOutlet, ProgressBarComponent],
13349
13594
  changeDetection: ChangeDetectionStrategy.OnPush,
13350
13595
  host: {
13351
13596
  "[style.--st-accent]": "accentColor() || null",
13352
13597
  "[style.--st-complete]": "completeColor() || null"
13353
13598
  },
13354
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()">
13355
13604
  <ol class="st"
13605
+ [style.min-width]="olMinWidth()"
13356
13606
  [class.st-horizontal]="orientation() === 'horizontal'"
13357
13607
  [class.st-vertical]="orientation() === 'vertical'"
13358
13608
  [class.st-sm]="size() === 'sm'"
13359
13609
  [class.st-labels-current]="labelsOnSmallScreens() === 'current'"
13360
13610
  [class.st-themed]="!!accentColor()"
13611
+ [class.st-accent-labels]="accentLabels()"
13361
13612
  [attr.aria-label]="ariaLabel() || null">
13362
13613
  @for (r of rows(); track r.step.key) {
13363
13614
  <li class="st-step"
@@ -13384,6 +13635,17 @@ i0.ɵɵngDeclareClassMetadata({
13384
13635
  </li>
13385
13636
  }
13386
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>
13387
13649
 
13388
13650
  <ng-template #body let-r>
13389
13651
  <span class="st-ind" aria-hidden="true">
@@ -13397,9 +13659,10 @@ i0.ɵɵngDeclareClassMetadata({
13397
13659
  <span class="st-sr">{{ r.srText }}</span>
13398
13660
  </ng-template>
13399
13661
  `,
13400
- 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] .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-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"]
13401
13663
  }]
13402
13664
  }],
13665
+ ctorParameters: () => [],
13403
13666
  propDecorators: {
13404
13667
  steps: [{
13405
13668
  type: i0.Input,
@@ -13468,6 +13731,14 @@ i0.ɵɵngDeclareClassMetadata({
13468
13731
  required: false
13469
13732
  }]
13470
13733
  }],
13734
+ accentLabels: [{
13735
+ type: i0.Input,
13736
+ args: [{
13737
+ isSignal: true,
13738
+ alias: "accentLabels",
13739
+ required: false
13740
+ }]
13741
+ }],
13471
13742
  ariaLabel: [{
13472
13743
  type: i0.Input,
13473
13744
  args: [{
@@ -13484,6 +13755,38 @@ i0.ɵɵngDeclareClassMetadata({
13484
13755
  required: false
13485
13756
  }]
13486
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
+ }],
13487
13790
  stepClick: [{
13488
13791
  type: i0.Output,
13489
13792
  args: ["stepClick"]
@@ -13949,9 +14252,12 @@ var BusinessHoursComponent = class BusinessHoursComponent {
13949
14252
  "routerLink",
13950
14253
  "queryParams",
13951
14254
  "fragment",
14255
+ "state",
13952
14256
  "href",
13953
14257
  "target",
13954
14258
  "rel",
14259
+ "shortLabel",
14260
+ "shortBelow",
13955
14261
  "color",
13956
14262
  "active",
13957
14263
  "size",
@@ -13975,6 +14281,7 @@ var BusinessHoursComponent = class BusinessHoursComponent {
13975
14281
  "label",
13976
14282
  "ariaLabel",
13977
14283
  "testId",
14284
+ "labelTestId",
13978
14285
  "headingLevel",
13979
14286
  "indeterminate",
13980
14287
  "checked",
@@ -15671,6 +15978,7 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
15671
15978
  "step",
15672
15979
  "valueType",
15673
15980
  "formatter",
15981
+ "integer",
15674
15982
  "showErrors",
15675
15983
  "disabled"
15676
15984
  ],
@@ -15707,9 +16015,12 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
15707
16015
  "routerLink",
15708
16016
  "queryParams",
15709
16017
  "fragment",
16018
+ "state",
15710
16019
  "href",
15711
16020
  "target",
15712
16021
  "rel",
16022
+ "shortLabel",
16023
+ "shortBelow",
15713
16024
  "color",
15714
16025
  "active",
15715
16026
  "size",
@@ -16827,6 +17138,7 @@ var ContactPickerComponent = class ContactPickerComponent {
16827
17138
  "label",
16828
17139
  "ariaLabel",
16829
17140
  "testId",
17141
+ "labelTestId",
16830
17142
  "headingLevel",
16831
17143
  "indeterminate",
16832
17144
  "checked",
@@ -17806,6 +18118,7 @@ var BulkMessagePanelComponent = class BulkMessagePanelComponent {
17806
18118
  "step",
17807
18119
  "valueType",
17808
18120
  "formatter",
18121
+ "integer",
17809
18122
  "showErrors",
17810
18123
  "disabled"
17811
18124
  ],
@@ -17964,6 +18277,7 @@ var TextComponent = class TextComponent {
17964
18277
  this.text = input("", ...ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []);
17965
18278
  this.size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
17966
18279
  this.tone = input("default", ...ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []);
18280
+ this.color = input("", ...ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []);
17967
18281
  this.strong = input(null, ...ngDevMode ? [{ debugName: "strong" }] : /* istanbul ignore next */ []);
17968
18282
  this.segments = computed(() => {
17969
18283
  const text = this.text() ?? "";
@@ -18041,6 +18355,13 @@ var TextComponent = class TextComponent {
18041
18355
  isRequired: false,
18042
18356
  transformFunction: null
18043
18357
  },
18358
+ color: {
18359
+ classPropertyName: "color",
18360
+ publicName: "color",
18361
+ isSignal: true,
18362
+ isRequired: false,
18363
+ transformFunction: null
18364
+ },
18044
18365
  strong: {
18045
18366
  classPropertyName: "strong",
18046
18367
  publicName: "strong",
@@ -18057,9 +18378,9 @@ var TextComponent = class TextComponent {
18057
18378
  }
18058
18379
  },
18059
18380
  ngImport: i0,
18060
- template: `<div class="tx" [class.tx-muted]="tone() === 'muted'" [style.font-size]="fontSize()" [style.font-weight]="fontWeight()">{{ segments().length ? '' : text() }}@for (s of segments(); track $index) {@if (s.strong) {<strong>{{ s.text }}</strong>} @else {<ng-container>{{ s.text }}</ng-container>}}</div>`,
18381
+ template: `<div class="tx" [class.tx-muted]="tone() === 'muted'" [class.tx-accent]="tone() === 'accent'" [style.color]="color() || null" [style.font-size]="fontSize()" [style.font-weight]="fontWeight()">{{ segments().length ? '' : text() }}@for (s of segments(); track $index) {@if (s.strong) {<strong>{{ s.text }}</strong>} @else {<ng-container>{{ s.text }}</ng-container>}}</div>`,
18061
18382
  isInline: true,
18062
- styles: [":host{display:block;min-width:0}.tx{margin:0;line-height:1.5;color:#1f2937;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;-webkit-user-select:text;user-select:text}.tx-muted{color:#64748b}.tx strong{font-weight:700}\n"],
18383
+ styles: [":host{display:block;min-width:0}.tx{margin:0;line-height:1.5;color:#1f2937;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;-webkit-user-select:text;user-select:text}.tx-muted{color:#64748b}.tx-accent{color:var(--ui-accent, #2563eb)}.tx strong{font-weight:700}\n"],
18063
18384
  changeDetection: i0.ChangeDetectionStrategy.OnPush
18064
18385
  });
18065
18386
  }
@@ -18075,8 +18396,8 @@ i0.ɵɵngDeclareClassMetadata({
18075
18396
  selector: "ui-text",
18076
18397
  standalone: true,
18077
18398
  changeDetection: ChangeDetectionStrategy.OnPush,
18078
- template: `<div class="tx" [class.tx-muted]="tone() === 'muted'" [style.font-size]="fontSize()" [style.font-weight]="fontWeight()">{{ segments().length ? '' : text() }}@for (s of segments(); track $index) {@if (s.strong) {<strong>{{ s.text }}</strong>} @else {<ng-container>{{ s.text }}</ng-container>}}</div>`,
18079
- styles: [":host{display:block;min-width:0}.tx{margin:0;line-height:1.5;color:#1f2937;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;-webkit-user-select:text;user-select:text}.tx-muted{color:#64748b}.tx strong{font-weight:700}\n"]
18399
+ template: `<div class="tx" [class.tx-muted]="tone() === 'muted'" [class.tx-accent]="tone() === 'accent'" [style.color]="color() || null" [style.font-size]="fontSize()" [style.font-weight]="fontWeight()">{{ segments().length ? '' : text() }}@for (s of segments(); track $index) {@if (s.strong) {<strong>{{ s.text }}</strong>} @else {<ng-container>{{ s.text }}</ng-container>}}</div>`,
18400
+ styles: [":host{display:block;min-width:0}.tx{margin:0;line-height:1.5;color:#1f2937;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;-webkit-user-select:text;user-select:text}.tx-muted{color:#64748b}.tx-accent{color:var(--ui-accent, #2563eb)}.tx strong{font-weight:700}\n"]
18080
18401
  }]
18081
18402
  }],
18082
18403
  propDecorators: {
@@ -18104,6 +18425,14 @@ i0.ɵɵngDeclareClassMetadata({
18104
18425
  required: false
18105
18426
  }]
18106
18427
  }],
18428
+ color: [{
18429
+ type: i0.Input,
18430
+ args: [{
18431
+ isSignal: true,
18432
+ alias: "color",
18433
+ required: false
18434
+ }]
18435
+ }],
18107
18436
  strong: [{
18108
18437
  type: i0.Input,
18109
18438
  args: [{
@@ -21555,6 +21884,7 @@ var MultiSelectComponent = class MultiSelectComponent {
21555
21884
  "label",
21556
21885
  "ariaLabel",
21557
21886
  "testId",
21887
+ "labelTestId",
21558
21888
  "headingLevel",
21559
21889
  "indeterminate",
21560
21890
  "checked",
@@ -21883,6 +22213,7 @@ var DiscountSelectorComponent = class DiscountSelectorComponent {
21883
22213
  "label",
21884
22214
  "ariaLabel",
21885
22215
  "testId",
22216
+ "labelTestId",
21886
22217
  "headingLevel",
21887
22218
  "indeterminate",
21888
22219
  "checked",
@@ -22412,12 +22743,37 @@ i0.ɵɵngDeclareClassMetadata({
22412
22743
  }]
22413
22744
  }
22414
22745
  });
22746
+ const FOCUSABLE = "input:not([type=\"hidden\"]), select, textarea, button, [tabindex]:not([tabindex=\"-1\"]), [contenteditable=\"true\"]";
22415
22747
  var FormComponent = class FormComponent {
22416
22748
  constructor() {
22417
22749
  this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
22418
22750
  this.ariaLabelledby = input("", ...ngDevMode ? [{ debugName: "ariaLabelledby" }] : /* istanbul ignore next */ []);
22419
22751
  this.autocomplete = input("", ...ngDevMode ? [{ debugName: "autocomplete" }] : /* istanbul ignore next */ []);
22420
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;
22421
22777
  }
22422
22778
  onSubmit(event) {
22423
22779
  event.preventDefault();
@@ -23666,9 +24022,12 @@ var ListComponent = class ListComponent {
23666
24022
  "routerLink",
23667
24023
  "queryParams",
23668
24024
  "fragment",
24025
+ "state",
23669
24026
  "href",
23670
24027
  "target",
23671
24028
  "rel",
24029
+ "shortLabel",
24030
+ "shortBelow",
23672
24031
  "color",
23673
24032
  "active",
23674
24033
  "size",
@@ -24971,9 +25330,12 @@ var QrCodeComponent = class QrCodeComponent {
24971
25330
  "routerLink",
24972
25331
  "queryParams",
24973
25332
  "fragment",
25333
+ "state",
24974
25334
  "href",
24975
25335
  "target",
24976
25336
  "rel",
25337
+ "shortLabel",
25338
+ "shortBelow",
24977
25339
  "color",
24978
25340
  "active",
24979
25341
  "size",
@@ -25279,9 +25641,12 @@ var PanelInfoListComponent = class PanelInfoListComponent {
25279
25641
  "routerLink",
25280
25642
  "queryParams",
25281
25643
  "fragment",
25644
+ "state",
25282
25645
  "href",
25283
25646
  "target",
25284
25647
  "rel",
25648
+ "shortLabel",
25649
+ "shortBelow",
25285
25650
  "color",
25286
25651
  "active",
25287
25652
  "size",
@@ -27166,6 +27531,7 @@ var ImageComponent = class ImageComponent {
27166
27531
  this.height = input("", ...ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []);
27167
27532
  this.maxWidth = input("100%", ...ngDevMode ? [{ debugName: "maxWidth" }] : /* istanbul ignore next */ []);
27168
27533
  this.maxHeight = input("", ...ngDevMode ? [{ debugName: "maxHeight" }] : /* istanbul ignore next */ []);
27534
+ this.minHeight = input("", ...ngDevMode ? [{ debugName: "minHeight" }] : /* istanbul ignore next */ []);
27169
27535
  this.aspectRatio = input("", ...ngDevMode ? [{ debugName: "aspectRatio" }] : /* istanbul ignore next */ []);
27170
27536
  this.radius = input("none", ...ngDevMode ? [{ debugName: "radius" }] : /* istanbul ignore next */ []);
27171
27537
  this.bordered = input(false, ...ngDevMode ? [{ debugName: "bordered" }] : /* istanbul ignore next */ []);
@@ -27260,6 +27626,13 @@ var ImageComponent = class ImageComponent {
27260
27626
  isRequired: false,
27261
27627
  transformFunction: null
27262
27628
  },
27629
+ minHeight: {
27630
+ classPropertyName: "minHeight",
27631
+ publicName: "minHeight",
27632
+ isSignal: true,
27633
+ isRequired: false,
27634
+ transformFunction: null
27635
+ },
27263
27636
  aspectRatio: {
27264
27637
  classPropertyName: "aspectRatio",
27265
27638
  publicName: "aspectRatio",
@@ -27323,12 +27696,12 @@ var ImageComponent = class ImageComponent {
27323
27696
  @if (_url() && !_failed()) {
27324
27697
  <img class="im-img" [src]="_url()" [attr.alt]="alt()" [attr.loading]="priority() ? 'eager' : 'lazy'"
27325
27698
  [attr.fetchpriority]="priority() ? 'high' : null" decoding="async"
27326
- [style.width]="imgWidth()" [style.height]="imgHeight()" [style.max-width]="maxWidth()" [style.max-height]="maxHeight() || null"
27699
+ [style.width]="imgWidth()" [style.height]="imgHeight()" [style.max-width]="maxWidth()" [style.max-height]="maxHeight() || null" [style.min-height]="minHeight() || null"
27327
27700
  [style.aspect-ratio]="aspectRatio() || null" [style.object-fit]="fit()" [style.border-radius]="radiusCss()"
27328
27701
  [class.im-bordered]="bordered()" (load)="loaded.emit()" (error)="_onError()" />
27329
27702
  } @else if (placeholder()) {
27330
27703
  <span class="im-ph" [class.im-bordered]="bordered()" [attr.role]="alt() ? 'img' : null" [attr.aria-label]="alt() || null" [attr.aria-hidden]="alt() ? null : 'true'"
27331
- [style.width]="boxWidth()" [style.height]="boxHeight()" [style.max-width]="maxWidth()" [style.max-height]="maxHeight() || null"
27704
+ [style.width]="boxWidth()" [style.height]="boxHeight()" [style.max-width]="maxWidth()" [style.max-height]="maxHeight() || null" [style.min-height]="minHeight() || null"
27332
27705
  [style.aspect-ratio]="aspectRatio() || null" [style.border-radius]="radiusCss()">
27333
27706
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="9" cy="10" r="1.8"/><path d="M21 16l-5-5-8 9"/></svg>
27334
27707
  </span>
@@ -27359,12 +27732,12 @@ i0.ɵɵngDeclareClassMetadata({
27359
27732
  @if (_url() && !_failed()) {
27360
27733
  <img class="im-img" [src]="_url()" [attr.alt]="alt()" [attr.loading]="priority() ? 'eager' : 'lazy'"
27361
27734
  [attr.fetchpriority]="priority() ? 'high' : null" decoding="async"
27362
- [style.width]="imgWidth()" [style.height]="imgHeight()" [style.max-width]="maxWidth()" [style.max-height]="maxHeight() || null"
27735
+ [style.width]="imgWidth()" [style.height]="imgHeight()" [style.max-width]="maxWidth()" [style.max-height]="maxHeight() || null" [style.min-height]="minHeight() || null"
27363
27736
  [style.aspect-ratio]="aspectRatio() || null" [style.object-fit]="fit()" [style.border-radius]="radiusCss()"
27364
27737
  [class.im-bordered]="bordered()" (load)="loaded.emit()" (error)="_onError()" />
27365
27738
  } @else if (placeholder()) {
27366
27739
  <span class="im-ph" [class.im-bordered]="bordered()" [attr.role]="alt() ? 'img' : null" [attr.aria-label]="alt() || null" [attr.aria-hidden]="alt() ? null : 'true'"
27367
- [style.width]="boxWidth()" [style.height]="boxHeight()" [style.max-width]="maxWidth()" [style.max-height]="maxHeight() || null"
27740
+ [style.width]="boxWidth()" [style.height]="boxHeight()" [style.max-width]="maxWidth()" [style.max-height]="maxHeight() || null" [style.min-height]="minHeight() || null"
27368
27741
  [style.aspect-ratio]="aspectRatio() || null" [style.border-radius]="radiusCss()">
27369
27742
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="9" cy="10" r="1.8"/><path d="M21 16l-5-5-8 9"/></svg>
27370
27743
  </span>
@@ -27431,6 +27804,14 @@ i0.ɵɵngDeclareClassMetadata({
27431
27804
  required: false
27432
27805
  }]
27433
27806
  }],
27807
+ minHeight: [{
27808
+ type: i0.Input,
27809
+ args: [{
27810
+ isSignal: true,
27811
+ alias: "minHeight",
27812
+ required: false
27813
+ }]
27814
+ }],
27434
27815
  aspectRatio: [{
27435
27816
  type: i0.Input,
27436
27817
  args: [{
@@ -27621,6 +28002,7 @@ var ImageGalleryComponent = class ImageGalleryComponent {
27621
28002
  this.maxHeight = input("70vh", ...ngDevMode ? [{ debugName: "maxHeight" }] : /* istanbul ignore next */ []);
27622
28003
  this.fit = input("contain", ...ngDevMode ? [{ debugName: "fit" }] : /* istanbul ignore next */ []);
27623
28004
  this.ariaLabel = input("Image gallery", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
28005
+ this.autofocus = input(false, ...ngDevMode ? [{ debugName: "autofocus" }] : /* istanbul ignore next */ []);
27624
28006
  this.count = computed(() => this.images().length, ...ngDevMode ? [{ debugName: "count" }] : /* istanbul ignore next */ []);
27625
28007
  this.position = computed(() => {
27626
28008
  const n = this.count();
@@ -27629,6 +28011,8 @@ var ImageGalleryComponent = class ImageGalleryComponent {
27629
28011
  }, ...ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []);
27630
28012
  this.current = computed(() => this.images()[this.position()] ?? { src: "" }, ...ngDevMode ? [{ debugName: "current" }] : /* istanbul ignore next */ []);
27631
28013
  this.currentAlt = computed(() => this.current().alt ?? `Image ${this.position() + 1} of ${this.count()}`, ...ngDevMode ? [{ debugName: "currentAlt" }] : /* istanbul ignore next */ []);
28014
+ this.autofocusNext = computed(() => this.autofocus() && this.canNext(), ...ngDevMode ? [{ debugName: "autofocusNext" }] : /* istanbul ignore next */ []);
28015
+ this.autofocusPrev = computed(() => this.autofocus() && !this.canNext() && this.canPrev(), ...ngDevMode ? [{ debugName: "autofocusPrev" }] : /* istanbul ignore next */ []);
27632
28016
  this.canPrev = computed(() => this.count() > 1 && (this.loop() || this.position() > 0), ...ngDevMode ? [{ debugName: "canPrev" }] : /* istanbul ignore next */ []);
27633
28017
  this.canNext = computed(() => this.count() > 1 && (this.loop() || this.position() < this.count() - 1), ...ngDevMode ? [{ debugName: "canNext" }] : /* istanbul ignore next */ []);
27634
28018
  this.announcement = computed(() => this.count() > 1 ? `Image ${this.position() + 1} of ${this.count()}${this.current().alt ? ": " + this.current().alt : ""}` : "", ...ngDevMode ? [{ debugName: "announcement" }] : /* istanbul ignore next */ []);
@@ -27739,6 +28123,13 @@ var ImageGalleryComponent = class ImageGalleryComponent {
27739
28123
  isSignal: true,
27740
28124
  isRequired: false,
27741
28125
  transformFunction: null
28126
+ },
28127
+ autofocus: {
28128
+ classPropertyName: "autofocus",
28129
+ publicName: "autofocus",
28130
+ isSignal: true,
28131
+ isRequired: false,
28132
+ transformFunction: null
27742
28133
  }
27743
28134
  },
27744
28135
  outputs: { index: "indexChange" },
@@ -27748,13 +28139,13 @@ var ImageGalleryComponent = class ImageGalleryComponent {
27748
28139
  <div class="ig" role="group" aria-roledescription="carousel" [attr.aria-label]="ariaLabel()" (keydown)="onKey($event)">
27749
28140
  <div class="ig-stage">
27750
28141
  @if (count() > 1) {
27751
- <ui-button class="ig-nav ig-prev" variant="secondary" size="sm" ariaLabel="Previous image" [disabled]="!canPrev()" (click)="prev()" data-testid="gallery-prev">
28142
+ <ui-button class="ig-nav ig-prev" variant="secondary" size="sm" ariaLabel="Previous image" [disabled]="!canPrev()" [attr.data-autofocus]="autofocusPrev() ? '' : null" (click)="prev()" data-testid="gallery-prev">
27752
28143
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 18l-6-6 6-6"/></svg>
27753
28144
  </ui-button>
27754
28145
  }
27755
28146
  <ui-image class="ig-img" [src]="current().src" [alt]="currentAlt()" [fit]="fit()" width="100%" [maxHeight]="maxHeight()" [aspectRatio]="aspectRatio()" data-testid="gallery-image" />
27756
28147
  @if (count() > 1) {
27757
- <ui-button class="ig-nav ig-next" variant="secondary" size="sm" ariaLabel="Next image" [disabled]="!canNext()" (click)="next()" data-testid="gallery-next">
28148
+ <ui-button class="ig-nav ig-next" variant="secondary" size="sm" ariaLabel="Next image" [disabled]="!canNext()" [attr.data-autofocus]="autofocusNext() ? '' : null" (click)="next()" data-testid="gallery-next">
27758
28149
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 18l6-6-6-6"/></svg>
27759
28150
  </ui-button>
27760
28151
  }
@@ -27788,9 +28179,12 @@ var ImageGalleryComponent = class ImageGalleryComponent {
27788
28179
  "routerLink",
27789
28180
  "queryParams",
27790
28181
  "fragment",
28182
+ "state",
27791
28183
  "href",
27792
28184
  "target",
27793
28185
  "rel",
28186
+ "shortLabel",
28187
+ "shortBelow",
27794
28188
  "color",
27795
28189
  "active",
27796
28190
  "size",
@@ -27818,6 +28212,7 @@ var ImageGalleryComponent = class ImageGalleryComponent {
27818
28212
  "height",
27819
28213
  "maxWidth",
27820
28214
  "maxHeight",
28215
+ "minHeight",
27821
28216
  "aspectRatio",
27822
28217
  "radius",
27823
28218
  "bordered",
@@ -27865,13 +28260,13 @@ i0.ɵɵngDeclareClassMetadata({
27865
28260
  <div class="ig" role="group" aria-roledescription="carousel" [attr.aria-label]="ariaLabel()" (keydown)="onKey($event)">
27866
28261
  <div class="ig-stage">
27867
28262
  @if (count() > 1) {
27868
- <ui-button class="ig-nav ig-prev" variant="secondary" size="sm" ariaLabel="Previous image" [disabled]="!canPrev()" (click)="prev()" data-testid="gallery-prev">
28263
+ <ui-button class="ig-nav ig-prev" variant="secondary" size="sm" ariaLabel="Previous image" [disabled]="!canPrev()" [attr.data-autofocus]="autofocusPrev() ? '' : null" (click)="prev()" data-testid="gallery-prev">
27869
28264
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 18l-6-6 6-6"/></svg>
27870
28265
  </ui-button>
27871
28266
  }
27872
28267
  <ui-image class="ig-img" [src]="current().src" [alt]="currentAlt()" [fit]="fit()" width="100%" [maxHeight]="maxHeight()" [aspectRatio]="aspectRatio()" data-testid="gallery-image" />
27873
28268
  @if (count() > 1) {
27874
- <ui-button class="ig-nav ig-next" variant="secondary" size="sm" ariaLabel="Next image" [disabled]="!canNext()" (click)="next()" data-testid="gallery-next">
28269
+ <ui-button class="ig-nav ig-next" variant="secondary" size="sm" ariaLabel="Next image" [disabled]="!canNext()" [attr.data-autofocus]="autofocusNext() ? '' : null" (click)="next()" data-testid="gallery-next">
27875
28270
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 18l6-6-6-6"/></svg>
27876
28271
  </ui-button>
27877
28272
  }
@@ -27971,6 +28366,14 @@ i0.ɵɵngDeclareClassMetadata({
27971
28366
  alias: "ariaLabel",
27972
28367
  required: false
27973
28368
  }]
28369
+ }],
28370
+ autofocus: [{
28371
+ type: i0.Input,
28372
+ args: [{
28373
+ isSignal: true,
28374
+ alias: "autofocus",
28375
+ required: false
28376
+ }]
27974
28377
  }]
27975
28378
  }
27976
28379
  });
@@ -28665,9 +29068,12 @@ var DateRangePickerComponent = class DateRangePickerComponent {
28665
29068
  "routerLink",
28666
29069
  "queryParams",
28667
29070
  "fragment",
29071
+ "state",
28668
29072
  "href",
28669
29073
  "target",
28670
29074
  "rel",
29075
+ "shortLabel",
29076
+ "shortBelow",
28671
29077
  "color",
28672
29078
  "active",
28673
29079
  "size",
@@ -31147,9 +31553,12 @@ var SignaturePadComponent = class SignaturePadComponent {
31147
31553
  "routerLink",
31148
31554
  "queryParams",
31149
31555
  "fragment",
31556
+ "state",
31150
31557
  "href",
31151
31558
  "target",
31152
31559
  "rel",
31560
+ "shortLabel",
31561
+ "shortBelow",
31153
31562
  "color",
31154
31563
  "active",
31155
31564
  "size",
@@ -31643,6 +32052,7 @@ i0.ɵɵngDeclareClassMetadata({
31643
32052
  }]
31644
32053
  }
31645
32054
  });
32055
+ const SELECT_IGNORE = "button, a[href], input, select, textarea, label, [role=button], [role=link], [data-no-select]";
31646
32056
  var DetailCardComponent = class DetailCardComponent {
31647
32057
  constructor() {
31648
32058
  this.title = input("", ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
@@ -31652,6 +32062,7 @@ var DetailCardComponent = class DetailCardComponent {
31652
32062
  this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
31653
32063
  this.subtitle = input("", ...ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []);
31654
32064
  this.background = input("", ...ngDevMode ? [{ debugName: "background" }] : /* istanbul ignore next */ []);
32065
+ this.headerBackground = input("", ...ngDevMode ? [{ debugName: "headerBackground" }] : /* istanbul ignore next */ []);
31655
32066
  this.textColor = input("", ...ngDevMode ? [{ debugName: "textColor" }] : /* istanbul ignore next */ []);
31656
32067
  this.showHeader = input(true, ...ngDevMode ? [{ debugName: "showHeader" }] : /* istanbul ignore next */ []);
31657
32068
  this.collapsible = input(true, ...ngDevMode ? [{ debugName: "collapsible" }] : /* istanbul ignore next */ []);
@@ -31659,8 +32070,14 @@ var DetailCardComponent = class DetailCardComponent {
31659
32070
  this.showEdit = input(false, ...ngDevMode ? [{ debugName: "showEdit" }] : /* istanbul ignore next */ []);
31660
32071
  this.editLabel = input("Edit", ...ngDevMode ? [{ debugName: "editLabel" }] : /* istanbul ignore next */ []);
31661
32072
  this.editClick = output();
32073
+ this.editTestId = input("", ...ngDevMode ? [{ debugName: "editTestId" }] : /* istanbul ignore next */ []);
32074
+ this.editIcon = input(true, ...ngDevMode ? [{ debugName: "editIcon" }] : /* istanbul ignore next */ []);
31662
32075
  this.editAriaLabel = input("", ...ngDevMode ? [{ debugName: "editAriaLabel" }] : /* istanbul ignore next */ []);
31663
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 */ []);
31664
32081
  }
31665
32082
  groupLabel() {
31666
32083
  if (this.showHeader() && this.title()) return this.titleId() ? null : this.title();
@@ -31669,6 +32086,17 @@ var DetailCardComponent = class DetailCardComponent {
31669
32086
  isOpen() {
31670
32087
  return !(this.showHeader() && this.collapsible()) || this.expanded();
31671
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
+ }
31672
32100
  toggle() {
31673
32101
  this.expanded.set(!this.expanded());
31674
32102
  }
@@ -31744,6 +32172,13 @@ var DetailCardComponent = class DetailCardComponent {
31744
32172
  isRequired: false,
31745
32173
  transformFunction: null
31746
32174
  },
32175
+ headerBackground: {
32176
+ classPropertyName: "headerBackground",
32177
+ publicName: "headerBackground",
32178
+ isSignal: true,
32179
+ isRequired: false,
32180
+ transformFunction: null
32181
+ },
31747
32182
  textColor: {
31748
32183
  classPropertyName: "textColor",
31749
32184
  publicName: "textColor",
@@ -31786,6 +32221,20 @@ var DetailCardComponent = class DetailCardComponent {
31786
32221
  isRequired: false,
31787
32222
  transformFunction: null
31788
32223
  },
32224
+ editTestId: {
32225
+ classPropertyName: "editTestId",
32226
+ publicName: "editTestId",
32227
+ isSignal: true,
32228
+ isRequired: false,
32229
+ transformFunction: null
32230
+ },
32231
+ editIcon: {
32232
+ classPropertyName: "editIcon",
32233
+ publicName: "editIcon",
32234
+ isSignal: true,
32235
+ isRequired: false,
32236
+ transformFunction: null
32237
+ },
31789
32238
  editAriaLabel: {
31790
32239
  classPropertyName: "editAriaLabel",
31791
32240
  publicName: "editAriaLabel",
@@ -31799,25 +32248,58 @@ var DetailCardComponent = class DetailCardComponent {
31799
32248
  isSignal: true,
31800
32249
  isRequired: false,
31801
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
31802
32279
  }
31803
32280
  },
31804
32281
  outputs: {
31805
32282
  expanded: "expandedChange",
31806
- editClick: "editClick"
32283
+ editClick: "editClick",
32284
+ selected: "selectedChange"
31807
32285
  },
31808
32286
  host: {
31809
32287
  attributes: { "role": "group" },
31810
32288
  properties: {
31811
32289
  "class.dc-fill-host": "fill()",
32290
+ "attr.data-selected": "selectable() && selected() ? \"true\" : null",
31812
32291
  "attr.aria-labelledby": "showHeader() && title() && titleId() ? titleId() : null",
31813
32292
  "attr.aria-label": "groupLabel()"
31814
32293
  }
31815
32294
  },
31816
32295
  ngImport: i0,
31817
32296
  template: `
31818
- <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">
31819
32301
  @if (showHeader()) {
31820
- <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)">
31821
32303
  @if (collapsible()) {
31822
32304
  <ui-button class="dc-chevron" variant="icon" size="sm"
31823
32305
  [ariaLabel]="title() || 'Toggle section'"
@@ -31836,11 +32318,13 @@ var DetailCardComponent = class DetailCardComponent {
31836
32318
  <ng-content select="[card-header]" />
31837
32319
  </div>
31838
32320
  @if (showEdit()) {
31839
- <ui-button class="dc-edit" variant="secondary" size="xs" [ariaLabel]="editAriaLabel() || undefined" (click)="$event.stopPropagation(); editClick.emit()">
32321
+ <ui-button class="dc-edit" variant="secondary" size="xs" [ariaLabel]="editAriaLabel() || undefined" [attr.data-testid]="editTestId() || null" (click)="$event.stopPropagation(); editClick.emit()">
32322
+ @if (editIcon()) {
31840
32323
  <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
31841
32324
  <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/>
31842
32325
  <path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/>
31843
32326
  </svg>
32327
+ }
31844
32328
  {{ editLabel() }}
31845
32329
  </ui-button>
31846
32330
  }
@@ -31855,7 +32339,7 @@ var DetailCardComponent = class DetailCardComponent {
31855
32339
  </div>
31856
32340
  `,
31857
32341
  isInline: true,
31858
- styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom:0}:host(.dc-fill-host){height:100%}.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, #94a3b8)}.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, #94a3b8)}.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"],
31859
32343
  dependencies: [{
31860
32344
  kind: "component",
31861
32345
  type: ButtonComponent,
@@ -31865,9 +32349,12 @@ var DetailCardComponent = class DetailCardComponent {
31865
32349
  "routerLink",
31866
32350
  "queryParams",
31867
32351
  "fragment",
32352
+ "state",
31868
32353
  "href",
31869
32354
  "target",
31870
32355
  "rel",
32356
+ "shortLabel",
32357
+ "shortBelow",
31871
32358
  "color",
31872
32359
  "active",
31873
32360
  "size",
@@ -31902,13 +32389,17 @@ i0.ɵɵngDeclareClassMetadata({
31902
32389
  host: {
31903
32390
  "role": "group",
31904
32391
  "[class.dc-fill-host]": "fill()",
32392
+ "[attr.data-selected]": "selectable() && selected() ? \"true\" : null",
31905
32393
  "[attr.aria-labelledby]": "showHeader() && title() && titleId() ? titleId() : null",
31906
32394
  "[attr.aria-label]": "groupLabel()"
31907
32395
  },
31908
32396
  template: `
31909
- <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">
31910
32401
  @if (showHeader()) {
31911
- <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)">
31912
32403
  @if (collapsible()) {
31913
32404
  <ui-button class="dc-chevron" variant="icon" size="sm"
31914
32405
  [ariaLabel]="title() || 'Toggle section'"
@@ -31927,11 +32418,13 @@ i0.ɵɵngDeclareClassMetadata({
31927
32418
  <ng-content select="[card-header]" />
31928
32419
  </div>
31929
32420
  @if (showEdit()) {
31930
- <ui-button class="dc-edit" variant="secondary" size="xs" [ariaLabel]="editAriaLabel() || undefined" (click)="$event.stopPropagation(); editClick.emit()">
32421
+ <ui-button class="dc-edit" variant="secondary" size="xs" [ariaLabel]="editAriaLabel() || undefined" [attr.data-testid]="editTestId() || null" (click)="$event.stopPropagation(); editClick.emit()">
32422
+ @if (editIcon()) {
31931
32423
  <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
31932
32424
  <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/>
31933
32425
  <path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/>
31934
32426
  </svg>
32427
+ }
31935
32428
  {{ editLabel() }}
31936
32429
  </ui-button>
31937
32430
  }
@@ -31945,7 +32438,7 @@ i0.ɵɵngDeclareClassMetadata({
31945
32438
  </div>
31946
32439
  </div>
31947
32440
  `,
31948
- styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom:0}:host(.dc-fill-host){height:100%}.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, #94a3b8)}.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, #94a3b8)}.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"]
31949
32442
  }]
31950
32443
  }],
31951
32444
  propDecorators: {
@@ -32005,6 +32498,14 @@ i0.ɵɵngDeclareClassMetadata({
32005
32498
  required: false
32006
32499
  }]
32007
32500
  }],
32501
+ headerBackground: [{
32502
+ type: i0.Input,
32503
+ args: [{
32504
+ isSignal: true,
32505
+ alias: "headerBackground",
32506
+ required: false
32507
+ }]
32508
+ }],
32008
32509
  textColor: [{
32009
32510
  type: i0.Input,
32010
32511
  args: [{
@@ -32060,6 +32561,22 @@ i0.ɵɵngDeclareClassMetadata({
32060
32561
  type: i0.Output,
32061
32562
  args: ["editClick"]
32062
32563
  }],
32564
+ editTestId: [{
32565
+ type: i0.Input,
32566
+ args: [{
32567
+ isSignal: true,
32568
+ alias: "editTestId",
32569
+ required: false
32570
+ }]
32571
+ }],
32572
+ editIcon: [{
32573
+ type: i0.Input,
32574
+ args: [{
32575
+ isSignal: true,
32576
+ alias: "editIcon",
32577
+ required: false
32578
+ }]
32579
+ }],
32063
32580
  editAriaLabel: [{
32064
32581
  type: i0.Input,
32065
32582
  args: [{
@@ -32075,6 +32592,41 @@ i0.ɵɵngDeclareClassMetadata({
32075
32592
  alias: "fill",
32076
32593
  required: false
32077
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
+ }]
32078
32630
  }]
32079
32631
  }
32080
32632
  });
@@ -33056,6 +33608,10 @@ var ColumnsComponent = class ColumnsComponent {
33056
33608
  this.countBelowLg = input(null, ...ngDevMode ? [{ debugName: "countBelowLg" }] : /* istanbul ignore next */ []);
33057
33609
  this.countBelowMd = input(null, ...ngDevMode ? [{ debugName: "countBelowMd" }] : /* istanbul ignore next */ []);
33058
33610
  this.countBelowSm = input(null, ...ngDevMode ? [{ debugName: "countBelowSm" }] : /* istanbul ignore next */ []);
33611
+ this.countBase = input(1, ...ngDevMode ? [{ debugName: "countBase" }] : /* istanbul ignore next */ []);
33612
+ this.countFromSm = input(null, ...ngDevMode ? [{ debugName: "countFromSm" }] : /* istanbul ignore next */ []);
33613
+ this.countFromMd = input(null, ...ngDevMode ? [{ debugName: "countFromMd" }] : /* istanbul ignore next */ []);
33614
+ this.countFromLg = input(null, ...ngDevMode ? [{ debugName: "countFromLg" }] : /* istanbul ignore next */ []);
33059
33615
  this.cols = computed(() => {
33060
33616
  const n = Math.trunc(Number(this.count()));
33061
33617
  if (!Number.isFinite(n)) return 2;
@@ -33064,8 +33620,14 @@ var ColumnsComponent = class ColumnsComponent {
33064
33620
  this.colsLg = computed(() => ColumnsComponent.clampTier(this.countBelowLg()), ...ngDevMode ? [{ debugName: "colsLg" }] : /* istanbul ignore next */ []);
33065
33621
  this.colsMd = computed(() => ColumnsComponent.clampTier(this.countBelowMd()), ...ngDevMode ? [{ debugName: "colsMd" }] : /* istanbul ignore next */ []);
33066
33622
  this.colsSm = computed(() => ColumnsComponent.clampTier(this.countBelowSm()), ...ngDevMode ? [{ debugName: "colsSm" }] : /* istanbul ignore next */ []);
33623
+ this.fromMode = computed(() => this.countFromSm() != null || this.countFromMd() != null || this.countFromLg() != null, ...ngDevMode ? [{ debugName: "fromMode" }] : /* istanbul ignore next */ []);
33624
+ this.base = computed(() => this.fromMode() ? ColumnsComponent.clampTier(this.countBase()) ?? 1 : null, ...ngDevMode ? [{ debugName: "base" }] : /* istanbul ignore next */ []);
33625
+ this.fromSm = computed(() => ColumnsComponent.clampTier(this.countFromSm()), ...ngDevMode ? [{ debugName: "fromSm" }] : /* istanbul ignore next */ []);
33626
+ this.fromMd = computed(() => ColumnsComponent.clampTier(this.countFromMd()), ...ngDevMode ? [{ debugName: "fromMd" }] : /* istanbul ignore next */ []);
33627
+ this.fromLg = computed(() => ColumnsComponent.clampTier(this.countFromLg()), ...ngDevMode ? [{ debugName: "fromLg" }] : /* istanbul ignore next */ []);
33067
33628
  this.gapCss = computed(() => resolveLayoutGap(this.gap(), "lg"), ...ngDevMode ? [{ debugName: "gapCss" }] : /* istanbul ignore next */ []);
33068
33629
  this.collapseClass = computed(() => {
33630
+ if (this.fromMode()) return "cl cl-from";
33069
33631
  const c = this.collapseAt();
33070
33632
  return c === "never" ? "cl" : `cl cl-${c}`;
33071
33633
  }, ...ngDevMode ? [{ debugName: "collapseClass" }] : /* istanbul ignore next */ []);
@@ -33141,13 +33703,41 @@ var ColumnsComponent = class ColumnsComponent {
33141
33703
  isSignal: true,
33142
33704
  isRequired: false,
33143
33705
  transformFunction: null
33706
+ },
33707
+ countBase: {
33708
+ classPropertyName: "countBase",
33709
+ publicName: "countBase",
33710
+ isSignal: true,
33711
+ isRequired: false,
33712
+ transformFunction: null
33713
+ },
33714
+ countFromSm: {
33715
+ classPropertyName: "countFromSm",
33716
+ publicName: "countFromSm",
33717
+ isSignal: true,
33718
+ isRequired: false,
33719
+ transformFunction: null
33720
+ },
33721
+ countFromMd: {
33722
+ classPropertyName: "countFromMd",
33723
+ publicName: "countFromMd",
33724
+ isSignal: true,
33725
+ isRequired: false,
33726
+ transformFunction: null
33727
+ },
33728
+ countFromLg: {
33729
+ classPropertyName: "countFromLg",
33730
+ publicName: "countFromLg",
33731
+ isSignal: true,
33732
+ isRequired: false,
33733
+ transformFunction: null
33144
33734
  }
33145
33735
  },
33146
33736
  host: { properties: { "attr.data-columns": "cols()" } },
33147
33737
  ngImport: i0,
33148
- template: `<div class="cl" [class]="collapseClass()" [style.--cl-cols]="cols()" [style.--cl-cols-lg]="colsLg()" [style.--cl-cols-md]="colsMd()" [style.--cl-cols-sm]="colsSm()" [style.gap]="gapCss()" [style.align-items]="align()"><ng-content /></div>`,
33738
+ template: `<div class="cl" [class]="collapseClass()" [style.--cl-cols]="cols()" [style.--cl-cols-lg]="colsLg()" [style.--cl-cols-md]="colsMd()" [style.--cl-cols-sm]="colsSm()" [style.--cl-base]="base()" [style.--cl-from-sm]="fromSm()" [style.--cl-from-md]="fromMd()" [style.--cl-from-lg]="fromLg()" [style.gap]="gapCss()" [style.align-items]="align()"><ng-content /></div>`,
33149
33739
  isInline: true,
33150
- styles: [":host{display:block}.cl{display:grid;grid-template-columns:repeat(var(--cl-cols, 2),minmax(0,1fr))}@media(max-width:1024px){.cl{grid-template-columns:repeat(var(--cl-cols-lg, var(--cl-cols, 2)),minmax(0,1fr))}}@media(max-width:768px){.cl{grid-template-columns:repeat(var(--cl-cols-md, var(--cl-cols-lg, var(--cl-cols, 2))),minmax(0,1fr))}}@media(max-width:480px){.cl{grid-template-columns:repeat(var(--cl-cols-sm, var(--cl-cols-md, var(--cl-cols-lg, var(--cl-cols, 2)))),minmax(0,1fr))}}@media(max-width:480px){.cl.cl-sm{grid-template-columns:minmax(0,1fr)}}@media(max-width:768px){.cl.cl-md{grid-template-columns:minmax(0,1fr)}}@media(max-width:1024px){.cl.cl-lg{grid-template-columns:minmax(0,1fr)}}\n"],
33740
+ styles: [":host{display:block}.cl{display:grid;grid-template-columns:repeat(var(--cl-cols, 2),minmax(0,1fr))}@media(max-width:1024px){.cl{grid-template-columns:repeat(var(--cl-cols-lg, var(--cl-cols, 2)),minmax(0,1fr))}}@media(max-width:768px){.cl{grid-template-columns:repeat(var(--cl-cols-md, var(--cl-cols-lg, var(--cl-cols, 2))),minmax(0,1fr))}}@media(max-width:480px){.cl{grid-template-columns:repeat(var(--cl-cols-sm, var(--cl-cols-md, var(--cl-cols-lg, var(--cl-cols, 2)))),minmax(0,1fr))}}.cl.cl-from{grid-template-columns:repeat(var(--cl-base, 1),minmax(0,1fr))}@media(min-width:480px){.cl.cl-from{grid-template-columns:repeat(var(--cl-from-sm, var(--cl-base, 1)),minmax(0,1fr))}}@media(min-width:768px){.cl.cl-from{grid-template-columns:repeat(var(--cl-from-md, var(--cl-from-sm, var(--cl-base, 1))),minmax(0,1fr))}}@media(min-width:1024px){.cl.cl-from{grid-template-columns:repeat(var(--cl-from-lg, var(--cl-from-md, var(--cl-from-sm, var(--cl-base, 1)))),minmax(0,1fr))}}@media(max-width:480px){.cl.cl-sm{grid-template-columns:minmax(0,1fr)}}@media(max-width:768px){.cl.cl-md{grid-template-columns:minmax(0,1fr)}}@media(max-width:1024px){.cl.cl-lg{grid-template-columns:minmax(0,1fr)}}\n"],
33151
33741
  changeDetection: i0.ChangeDetectionStrategy.OnPush
33152
33742
  });
33153
33743
  }
@@ -33164,8 +33754,8 @@ i0.ɵɵngDeclareClassMetadata({
33164
33754
  standalone: true,
33165
33755
  changeDetection: ChangeDetectionStrategy.OnPush,
33166
33756
  host: { "[attr.data-columns]": "cols()" },
33167
- template: `<div class="cl" [class]="collapseClass()" [style.--cl-cols]="cols()" [style.--cl-cols-lg]="colsLg()" [style.--cl-cols-md]="colsMd()" [style.--cl-cols-sm]="colsSm()" [style.gap]="gapCss()" [style.align-items]="align()"><ng-content /></div>`,
33168
- styles: [":host{display:block}.cl{display:grid;grid-template-columns:repeat(var(--cl-cols, 2),minmax(0,1fr))}@media(max-width:1024px){.cl{grid-template-columns:repeat(var(--cl-cols-lg, var(--cl-cols, 2)),minmax(0,1fr))}}@media(max-width:768px){.cl{grid-template-columns:repeat(var(--cl-cols-md, var(--cl-cols-lg, var(--cl-cols, 2))),minmax(0,1fr))}}@media(max-width:480px){.cl{grid-template-columns:repeat(var(--cl-cols-sm, var(--cl-cols-md, var(--cl-cols-lg, var(--cl-cols, 2)))),minmax(0,1fr))}}@media(max-width:480px){.cl.cl-sm{grid-template-columns:minmax(0,1fr)}}@media(max-width:768px){.cl.cl-md{grid-template-columns:minmax(0,1fr)}}@media(max-width:1024px){.cl.cl-lg{grid-template-columns:minmax(0,1fr)}}\n"]
33757
+ template: `<div class="cl" [class]="collapseClass()" [style.--cl-cols]="cols()" [style.--cl-cols-lg]="colsLg()" [style.--cl-cols-md]="colsMd()" [style.--cl-cols-sm]="colsSm()" [style.--cl-base]="base()" [style.--cl-from-sm]="fromSm()" [style.--cl-from-md]="fromMd()" [style.--cl-from-lg]="fromLg()" [style.gap]="gapCss()" [style.align-items]="align()"><ng-content /></div>`,
33758
+ styles: [":host{display:block}.cl{display:grid;grid-template-columns:repeat(var(--cl-cols, 2),minmax(0,1fr))}@media(max-width:1024px){.cl{grid-template-columns:repeat(var(--cl-cols-lg, var(--cl-cols, 2)),minmax(0,1fr))}}@media(max-width:768px){.cl{grid-template-columns:repeat(var(--cl-cols-md, var(--cl-cols-lg, var(--cl-cols, 2))),minmax(0,1fr))}}@media(max-width:480px){.cl{grid-template-columns:repeat(var(--cl-cols-sm, var(--cl-cols-md, var(--cl-cols-lg, var(--cl-cols, 2)))),minmax(0,1fr))}}.cl.cl-from{grid-template-columns:repeat(var(--cl-base, 1),minmax(0,1fr))}@media(min-width:480px){.cl.cl-from{grid-template-columns:repeat(var(--cl-from-sm, var(--cl-base, 1)),minmax(0,1fr))}}@media(min-width:768px){.cl.cl-from{grid-template-columns:repeat(var(--cl-from-md, var(--cl-from-sm, var(--cl-base, 1))),minmax(0,1fr))}}@media(min-width:1024px){.cl.cl-from{grid-template-columns:repeat(var(--cl-from-lg, var(--cl-from-md, var(--cl-from-sm, var(--cl-base, 1)))),minmax(0,1fr))}}@media(max-width:480px){.cl.cl-sm{grid-template-columns:minmax(0,1fr)}}@media(max-width:768px){.cl.cl-md{grid-template-columns:minmax(0,1fr)}}@media(max-width:1024px){.cl.cl-lg{grid-template-columns:minmax(0,1fr)}}\n"]
33169
33759
  }]
33170
33760
  }],
33171
33761
  propDecorators: {
@@ -33224,6 +33814,38 @@ i0.ɵɵngDeclareClassMetadata({
33224
33814
  alias: "countBelowSm",
33225
33815
  required: false
33226
33816
  }]
33817
+ }],
33818
+ countBase: [{
33819
+ type: i0.Input,
33820
+ args: [{
33821
+ isSignal: true,
33822
+ alias: "countBase",
33823
+ required: false
33824
+ }]
33825
+ }],
33826
+ countFromSm: [{
33827
+ type: i0.Input,
33828
+ args: [{
33829
+ isSignal: true,
33830
+ alias: "countFromSm",
33831
+ required: false
33832
+ }]
33833
+ }],
33834
+ countFromMd: [{
33835
+ type: i0.Input,
33836
+ args: [{
33837
+ isSignal: true,
33838
+ alias: "countFromMd",
33839
+ required: false
33840
+ }]
33841
+ }],
33842
+ countFromLg: [{
33843
+ type: i0.Input,
33844
+ args: [{
33845
+ isSignal: true,
33846
+ alias: "countFromLg",
33847
+ required: false
33848
+ }]
33227
33849
  }]
33228
33850
  }
33229
33851
  });
@@ -33246,6 +33868,11 @@ var StackComponent = class StackComponent {
33246
33868
  this.align = input("stretch", ...ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []);
33247
33869
  this.justify = input("start", ...ngDevMode ? [{ debugName: "justify" }] : /* istanbul ignore next */ []);
33248
33870
  this.wrap = input(false, ...ngDevMode ? [{ debugName: "wrap" }] : /* istanbul ignore next */ []);
33871
+ this.minHeight = input("", ...ngDevMode ? [{ debugName: "minHeight" }] : /* istanbul ignore next */ []);
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 */ []);
33249
33876
  this.gapCss = computed(() => resolveLayoutGap(this.gap(), "md"), ...ngDevMode ? [{ debugName: "gapCss" }] : /* istanbul ignore next */ []);
33250
33877
  this.alignCss = computed(() => ALIGN[this.align()] ?? "stretch", ...ngDevMode ? [{ debugName: "alignCss" }] : /* istanbul ignore next */ []);
33251
33878
  this.justifyCss = computed(() => JUSTIFY$1[this.justify()] ?? "flex-start", ...ngDevMode ? [{ debugName: "justifyCss" }] : /* istanbul ignore next */ []);
@@ -33302,11 +33929,46 @@ var StackComponent = class StackComponent {
33302
33929
  isSignal: true,
33303
33930
  isRequired: false,
33304
33931
  transformFunction: null
33932
+ },
33933
+ minHeight: {
33934
+ classPropertyName: "minHeight",
33935
+ publicName: "minHeight",
33936
+ isSignal: true,
33937
+ isRequired: false,
33938
+ transformFunction: null
33939
+ },
33940
+ width: {
33941
+ classPropertyName: "width",
33942
+ publicName: "width",
33943
+ isSignal: true,
33944
+ isRequired: false,
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
33305
33967
  }
33306
33968
  },
33307
33969
  ngImport: i0,
33308
33970
  template: `<div class="st" [class.st-h]="direction() === 'horizontal'" [style.flex-direction]="direction() === 'horizontal' ? 'row' : 'column'"
33309
- [style.gap]="gapCss()" [style.align-items]="alignCss()" [style.justify-content]="justifyCss()" [style.flex-wrap]="wrap() ? 'wrap' : 'nowrap'"><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>`,
33310
33972
  isInline: true,
33311
33973
  styles: [":host{display:block}.st{display:flex}.st>::ng-deep *{margin:0!important}.st.st-h>::ng-deep *{min-width:0}\n"],
33312
33974
  changeDetection: i0.ChangeDetectionStrategy.OnPush
@@ -33325,7 +33987,7 @@ i0.ɵɵngDeclareClassMetadata({
33325
33987
  standalone: true,
33326
33988
  changeDetection: ChangeDetectionStrategy.OnPush,
33327
33989
  template: `<div class="st" [class.st-h]="direction() === 'horizontal'" [style.flex-direction]="direction() === 'horizontal' ? 'row' : 'column'"
33328
- [style.gap]="gapCss()" [style.align-items]="alignCss()" [style.justify-content]="justifyCss()" [style.flex-wrap]="wrap() ? 'wrap' : 'nowrap'"><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>`,
33329
33991
  styles: [":host{display:block}.st{display:flex}.st>::ng-deep *{margin:0!important}.st.st-h>::ng-deep *{min-width:0}\n"]
33330
33992
  }]
33331
33993
  }],
@@ -33369,6 +34031,46 @@ i0.ɵɵngDeclareClassMetadata({
33369
34031
  alias: "wrap",
33370
34032
  required: false
33371
34033
  }]
34034
+ }],
34035
+ minHeight: [{
34036
+ type: i0.Input,
34037
+ args: [{
34038
+ isSignal: true,
34039
+ alias: "minHeight",
34040
+ required: false
34041
+ }]
34042
+ }],
34043
+ width: [{
34044
+ type: i0.Input,
34045
+ args: [{
34046
+ isSignal: true,
34047
+ alias: "width",
34048
+ required: false
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
+ }]
33372
34074
  }]
33373
34075
  }
33374
34076
  });
@@ -33556,6 +34258,2177 @@ i0.ɵɵngDeclareClassMetadata({
33556
34258
  }]
33557
34259
  }
33558
34260
  });
33559
- export { ActionBarComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BarRowComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, 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 };
34261
+ const WEEK_DAY_LABELS = [
34262
+ "Sun",
34263
+ "Mon",
34264
+ "Tue",
34265
+ "Wed",
34266
+ "Thu",
34267
+ "Fri",
34268
+ "Sat"
34269
+ ];
34270
+ function toDateStr(d) {
34271
+ return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
34272
+ }
34273
+ function fromDateStr(dateStr) {
34274
+ return /* @__PURE__ */ new Date(dateStr + "T00:00");
34275
+ }
34276
+ function buildMonthCells(anchor, todayStr) {
34277
+ const y = anchor.getFullYear();
34278
+ const m = anchor.getMonth();
34279
+ const start = new Date(y, m, 1 - new Date(y, m, 1).getDay());
34280
+ const cells = [];
34281
+ for (let i = 0; i < 42; i++) {
34282
+ const d = new Date(start.getFullYear(), start.getMonth(), start.getDate() + i);
34283
+ const ds = toDateStr(d);
34284
+ cells.push({
34285
+ dateStr: ds,
34286
+ dayNum: d.getDate(),
34287
+ isToday: ds === todayStr,
34288
+ isCurrentMonth: d.getMonth() === m,
34289
+ isWeekend: d.getDay() === 0 || d.getDay() === 6
34290
+ });
34291
+ }
34292
+ return cells;
34293
+ }
34294
+ function buildWeekDays(anchor, todayStr) {
34295
+ const start = new Date(anchor.getFullYear(), anchor.getMonth(), anchor.getDate() - anchor.getDay());
34296
+ return Array.from({ length: 7 }, (_, i) => {
34297
+ const d = new Date(start.getFullYear(), start.getMonth(), start.getDate() + i);
34298
+ const ds = toDateStr(d);
34299
+ return {
34300
+ dateStr: ds,
34301
+ dayNum: d.getDate(),
34302
+ isToday: ds === todayStr,
34303
+ isCurrentMonth: true,
34304
+ isWeekend: i === 0 || i === 6
34305
+ };
34306
+ });
34307
+ }
34308
+ function rangeFor(view, anchor, todayStr) {
34309
+ if (view === "week") {
34310
+ const days = buildWeekDays(anchor, todayStr);
34311
+ return {
34312
+ view,
34313
+ start: days[0].dateStr,
34314
+ end: days[6].dateStr,
34315
+ anchor
34316
+ };
34317
+ }
34318
+ if (view === "month") {
34319
+ const cells = buildMonthCells(anchor, todayStr);
34320
+ return {
34321
+ view,
34322
+ start: cells[0].dateStr,
34323
+ end: cells[41].dateStr,
34324
+ anchor
34325
+ };
34326
+ }
34327
+ const y = anchor.getFullYear();
34328
+ const m = anchor.getMonth();
34329
+ return {
34330
+ view,
34331
+ start: toDateStr(new Date(y, m, 1)),
34332
+ end: toDateStr(new Date(y, m + 2, 0)),
34333
+ anchor
34334
+ };
34335
+ }
34336
+ function shiftAnchor(view, anchor, direction) {
34337
+ if (view === "week") return new Date(anchor.getFullYear(), anchor.getMonth(), anchor.getDate() + 7 * direction);
34338
+ if (view === "agenda") return new Date(anchor.getFullYear(), anchor.getMonth() + 2 * direction, 1);
34339
+ const y = anchor.getFullYear();
34340
+ const m = anchor.getMonth() + direction;
34341
+ const lastDay = new Date(y, m + 1, 0).getDate();
34342
+ return new Date(y, m, Math.min(anchor.getDate(), lastDay));
34343
+ }
34344
+ const DAY_LABEL = new Intl.DateTimeFormat("en-US", {
34345
+ weekday: "long",
34346
+ month: "long",
34347
+ day: "numeric",
34348
+ year: "numeric"
34349
+ });
34350
+ function formatDayLabel(dateStr) {
34351
+ return DAY_LABEL.format(fromDateStr(dateStr));
34352
+ }
34353
+ function periodLabelFor(view, anchor, todayStr) {
34354
+ if (view === "week") {
34355
+ const days = buildWeekDays(anchor, todayStr);
34356
+ const fs = fromDateStr(days[0].dateStr);
34357
+ const ls = fromDateStr(days[6].dateStr);
34358
+ if (fs.getMonth() === ls.getMonth()) return fs.toLocaleDateString("en-US", {
34359
+ month: "long",
34360
+ year: "numeric"
34361
+ });
34362
+ return `${fs.toLocaleDateString("en-US", { month: "short" })} – ${ls.toLocaleDateString("en-US", {
34363
+ month: "short",
34364
+ year: "numeric"
34365
+ })}`;
34366
+ }
34367
+ if (view === "agenda") {
34368
+ const start = new Date(anchor.getFullYear(), anchor.getMonth(), 1);
34369
+ const end = new Date(anchor.getFullYear(), anchor.getMonth() + 1, 1);
34370
+ return `${start.toLocaleDateString("en-US", { month: "long" })} – ${end.toLocaleDateString("en-US", {
34371
+ month: "long",
34372
+ year: "numeric"
34373
+ })}`;
34374
+ }
34375
+ return anchor.toLocaleDateString("en-US", {
34376
+ month: "long",
34377
+ year: "numeric"
34378
+ });
34379
+ }
34380
+ function formatTime$1(time) {
34381
+ const [h, m] = time.split(":").map(Number);
34382
+ return `${h % 12 || 12}:${String(m).padStart(2, "0")} ${h >= 12 ? "PM" : "AM"}`;
34383
+ }
34384
+ function formatHour(h) {
34385
+ return `${h % 12 || 12} ${h >= 12 ? "PM" : "AM"}`;
34386
+ }
34387
+ const MIN_EVENT_HEIGHT = 20;
34388
+ function timedBox(startTime, endTime, startHour, endHour = 21) {
34389
+ const gridMax = (Math.max(endHour, startHour) + 1 - startHour) * 60;
34390
+ const [h, min] = (startTime ?? `${String(startHour).padStart(2, "0")}:00`).split(":").map(Number);
34391
+ const s = (h - startHour) * 60 + min;
34392
+ let e = s + 60;
34393
+ if (endTime) {
34394
+ const [eh, em] = endTime.split(":").map(Number);
34395
+ e = (eh - startHour) * 60 + em;
34396
+ }
34397
+ const top = Math.min(Math.max(0, s), gridMax - MIN_EVENT_HEIGHT);
34398
+ return {
34399
+ top,
34400
+ height: Math.max(MIN_EVENT_HEIGHT, Math.min(Math.max(e, 0), gridMax) - top)
34401
+ };
34402
+ }
34403
+ function layoutLanes(boxes) {
34404
+ const sorted = boxes.slice().sort((a, b) => a.top - b.top || b.height - a.height);
34405
+ const result = {};
34406
+ let cluster = [];
34407
+ let laneEnds = [];
34408
+ let clusterEnd = -1;
34409
+ const flush = () => {
34410
+ for (const id of cluster) result[id].lanes = laneEnds.length;
34411
+ cluster = [];
34412
+ laneEnds = [];
34413
+ };
34414
+ for (const b of sorted) {
34415
+ if (cluster.length && b.top >= clusterEnd) flush();
34416
+ let lane = laneEnds.findIndex((end) => end <= b.top);
34417
+ if (lane === -1) {
34418
+ lane = laneEnds.length;
34419
+ laneEnds.push(0);
34420
+ }
34421
+ laneEnds[lane] = b.top + b.height;
34422
+ clusterEnd = cluster.length ? Math.max(clusterEnd, b.top + b.height) : b.top + b.height;
34423
+ cluster.push(b.id);
34424
+ result[b.id] = {
34425
+ lane,
34426
+ lanes: 1
34427
+ };
34428
+ }
34429
+ flush();
34430
+ return result;
34431
+ }
34432
+ var CalendarComponent = class CalendarComponent {
34433
+ clickable(dateStr) {
34434
+ return this.canCreate() && !(this.disablePast() && dateStr < this.todayStr());
34435
+ }
34436
+ constructor() {
34437
+ this.items = input([], ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
34438
+ this.loading = input(false, ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
34439
+ this.view = model("month", ...ngDevMode ? [{ debugName: "view" }] : /* istanbul ignore next */ []);
34440
+ this.views = input([
34441
+ "week",
34442
+ "month",
34443
+ "agenda"
34444
+ ], ...ngDevMode ? [{ debugName: "views" }] : /* istanbul ignore next */ []);
34445
+ this.anchorDate = model(/* @__PURE__ */ new Date(), ...ngDevMode ? [{ debugName: "anchorDate" }] : /* istanbul ignore next */ []);
34446
+ this.filters = input([], ...ngDevMode ? [{ debugName: "filters" }] : /* istanbul ignore next */ []);
34447
+ this.filterLabel = input("", ...ngDevMode ? [{ debugName: "filterLabel" }] : /* istanbul ignore next */ []);
34448
+ this.filterMode = input("multi", ...ngDevMode ? [{ debugName: "filterMode" }] : /* istanbul ignore next */ []);
34449
+ this.activeFilters = model([], ...ngDevMode ? [{ debugName: "activeFilters" }] : /* istanbul ignore next */ []);
34450
+ this.showFilterCounts = input(false, ...ngDevMode ? [{ debugName: "showFilterCounts" }] : /* istanbul ignore next */ []);
34451
+ this.canCreate = input(false, ...ngDevMode ? [{ debugName: "canCreate" }] : /* istanbul ignore next */ []);
34452
+ this.disablePast = input(false, ...ngDevMode ? [{ debugName: "disablePast" }] : /* istanbul ignore next */ []);
34453
+ this.maxVisible = input(3, ...ngDevMode ? [{ debugName: "maxVisible" }] : /* istanbul ignore next */ []);
34454
+ this.chipLayout = input("inline", ...ngDevMode ? [{ debugName: "chipLayout" }] : /* istanbul ignore next */ []);
34455
+ this.sortByTime = input(true, ...ngDevMode ? [{ debugName: "sortByTime" }] : /* istanbul ignore next */ []);
34456
+ this.startHour = input(7, ...ngDevMode ? [{ debugName: "startHour" }] : /* istanbul ignore next */ []);
34457
+ this.endHour = input(21, ...ngDevMode ? [{ debugName: "endHour" }] : /* istanbul ignore next */ []);
34458
+ this.emptyMessage = input("No events in this period.", ...ngDevMode ? [{ debugName: "emptyMessage" }] : /* istanbul ignore next */ []);
34459
+ this.dayLabelFn = input(null, ...ngDevMode ? [{ debugName: "dayLabelFn" }] : /* istanbul ignore next */ []);
34460
+ this.rangeChange = output();
34461
+ this.itemClick = output();
34462
+ this.dateClick = output();
34463
+ this.slotClick = output();
34464
+ this.moreClick = output();
34465
+ this.host = inject(ElementRef);
34466
+ this.weekDayLabels = WEEK_DAY_LABELS;
34467
+ this.weekDayNames = [
34468
+ "Sunday",
34469
+ "Monday",
34470
+ "Tuesday",
34471
+ "Wednesday",
34472
+ "Thursday",
34473
+ "Friday",
34474
+ "Saturday"
34475
+ ];
34476
+ this.skeletonCells = Array.from({ length: 42 }, (_, i) => i);
34477
+ this.formatHour = formatHour;
34478
+ this.todayStr = signal(toDateStr(/* @__PURE__ */ new Date()), ...ngDevMode ? [{ debugName: "todayStr" }] : /* istanbul ignore next */ []);
34479
+ this.focusedDate = signal(null, ...ngDevMode ? [{ debugName: "focusedDate" }] : /* istanbul ignore next */ []);
34480
+ this.lastRangeKey = "";
34481
+ this.hours = computed(() => Array.from({ length: Math.max(1, this.endHour() - this.startHour() + 1) }, (_, i) => i + this.startHour()), ...ngDevMode ? [{ debugName: "hours" }] : /* istanbul ignore next */ []);
34482
+ this.monthCells = computed(() => buildMonthCells(this.anchorDate(), this.todayStr()), ...ngDevMode ? [{ debugName: "monthCells" }] : /* istanbul ignore next */ []);
34483
+ this.weekDays = computed(() => buildWeekDays(this.anchorDate(), this.todayStr()), ...ngDevMode ? [{ debugName: "weekDays" }] : /* istanbul ignore next */ []);
34484
+ this.periodLabel = computed(() => periodLabelFor(this.view(), this.anchorDate(), this.todayStr()), ...ngDevMode ? [{ debugName: "periodLabel" }] : /* istanbul ignore next */ []);
34485
+ this.viewTabs = computed(() => this.views().map((v) => ({
34486
+ key: v,
34487
+ label: v === "week" ? "Week" : v === "month" ? "Month" : "Agenda"
34488
+ })), ...ngDevMode ? [{ debugName: "viewTabs" }] : /* istanbul ignore next */ []);
34489
+ this.typeCounts = computed(() => {
34490
+ const counts = {};
34491
+ for (const e of this.items()) if (e.type) counts[e.type] = (counts[e.type] ?? 0) + 1;
34492
+ return counts;
34493
+ }, ...ngDevMode ? [{ debugName: "typeCounts" }] : /* istanbul ignore next */ []);
34494
+ this.byDate = computed(() => {
34495
+ const active = this.activeFilters();
34496
+ const map = {};
34497
+ if (isDevMode()) {
34498
+ const seen = /* @__PURE__ */ new Set();
34499
+ for (const e of this.items()) {
34500
+ if (seen.has(e.id)) {
34501
+ console.warn(`ui-calendar: duplicate item id "${e.id}" — ids must be unique across all items (prefix them by source).`);
34502
+ break;
34503
+ }
34504
+ seen.add(e.id);
34505
+ }
34506
+ }
34507
+ for (const e of this.items()) {
34508
+ if (active.length && !(e.type && active.includes(e.type))) continue;
34509
+ (map[e.date] ??= []).push(e);
34510
+ }
34511
+ if (this.sortByTime()) for (const k of Object.keys(map)) map[k] = map[k].slice().sort((a, b) => (a.startTime ?? "").localeCompare(b.startTime ?? ""));
34512
+ return map;
34513
+ }, ...ngDevMode ? [{ debugName: "byDate" }] : /* istanbul ignore next */ []);
34514
+ this.agendaGroups = computed(() => Object.entries(this.byDate()).sort(([a], [b]) => a.localeCompare(b)).map(([dateStr, items]) => ({
34515
+ dateStr,
34516
+ items
34517
+ })), ...ngDevMode ? [{ debugName: "agendaGroups" }] : /* istanbul ignore next */ []);
34518
+ this.monthRows = computed(() => {
34519
+ const max = this.maxVisible();
34520
+ const cells = this.monthCells().map((day) => {
34521
+ const items = this.byDate()[day.dateStr] ?? [];
34522
+ return {
34523
+ day,
34524
+ items,
34525
+ visible: items.slice(0, max),
34526
+ overflow: Math.max(0, items.length - max),
34527
+ clickable: this.clickable(day.dateStr),
34528
+ label: this.dayAriaLabel(day.dateStr, items)
34529
+ };
34530
+ });
34531
+ return Array.from({ length: 6 }, (_, r) => ({
34532
+ key: cells[r * 7].day.dateStr,
34533
+ cells: cells.slice(r * 7, r * 7 + 7)
34534
+ }));
34535
+ }, ...ngDevMode ? [{ debugName: "monthRows" }] : /* istanbul ignore next */ []);
34536
+ this.weekColumns = computed(() => {
34537
+ const startHour = this.startHour(), endHour = this.endHour();
34538
+ return this.weekDays().map((day) => {
34539
+ const items = this.byDate()[day.dateStr] ?? [];
34540
+ const boxes = items.filter((e) => !e.allDay && !!e.startTime).map((item) => ({
34541
+ item,
34542
+ ...timedBox(item.startTime, item.endTime, startHour, endHour)
34543
+ }));
34544
+ const lanes = layoutLanes(boxes.map((b) => ({
34545
+ id: b.item.id,
34546
+ top: b.top,
34547
+ height: b.height
34548
+ })));
34549
+ return {
34550
+ day,
34551
+ label: formatDayLabel(day.dateStr),
34552
+ clickable: this.clickable(day.dateStr),
34553
+ allDay: items.filter((e) => e.allDay || !e.startTime),
34554
+ timed: boxes.map((b) => ({
34555
+ ...b,
34556
+ lane: lanes[b.item.id]
34557
+ }))
34558
+ };
34559
+ });
34560
+ }, ...ngDevMode ? [{ debugName: "weekColumns" }] : /* istanbul ignore next */ []);
34561
+ this.focusDate = computed(() => {
34562
+ const cells = this.monthCells();
34563
+ const f = this.focusedDate();
34564
+ if (f && cells.some((c) => c.dateStr === f)) return f;
34565
+ return (cells.find((c) => c.isToday) ?? cells.find((c) => c.isCurrentMonth) ?? cells[0]).dateStr;
34566
+ }, ...ngDevMode ? [{ debugName: "focusDate" }] : /* istanbul ignore next */ []);
34567
+ effect(() => {
34568
+ const view = this.view();
34569
+ const views = this.views();
34570
+ if (views.length && !views.includes(view)) {
34571
+ untracked(() => this.view.set(views[0]));
34572
+ return;
34573
+ }
34574
+ const range = rangeFor(view, this.anchorDate(), this.todayStr());
34575
+ const key = `${range.view}|${range.start}|${range.end}`;
34576
+ if (key === this.lastRangeKey) return;
34577
+ this.lastRangeKey = key;
34578
+ untracked(() => this.rangeChange.emit(range));
34579
+ });
34580
+ const destroyRef = inject(DestroyRef);
34581
+ const zone = inject(NgZone);
34582
+ const doc = inject(DOCUMENT);
34583
+ let timer;
34584
+ const refreshToday = () => zone.run(() => this.todayStr.set(toDateStr(/* @__PURE__ */ new Date())));
34585
+ const schedule = () => {
34586
+ const now = /* @__PURE__ */ new Date();
34587
+ const next = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 0, 1);
34588
+ timer = setTimeout(() => {
34589
+ refreshToday();
34590
+ schedule();
34591
+ }, next.getTime() - now.getTime());
34592
+ };
34593
+ const onVisible = () => {
34594
+ if (doc.visibilityState === "visible") refreshToday();
34595
+ };
34596
+ if (!isPlatformBrowser(inject(PLATFORM_ID))) return;
34597
+ zone.runOutsideAngular(() => {
34598
+ schedule();
34599
+ doc.addEventListener("visibilitychange", onVisible);
34600
+ });
34601
+ destroyRef.onDestroy(() => {
34602
+ clearTimeout(timer);
34603
+ doc.removeEventListener("visibilitychange", onVisible);
34604
+ });
34605
+ }
34606
+ isFilterActive(value) {
34607
+ return this.activeFilters().includes(value);
34608
+ }
34609
+ toggleFilter(value) {
34610
+ const active = this.activeFilters();
34611
+ if (this.filterMode() === "single") {
34612
+ this.activeFilters.set(active.includes(value) ? [] : [value]);
34613
+ return;
34614
+ }
34615
+ this.activeFilters.set(active.includes(value) ? active.filter((v) => v !== value) : [...active, value]);
34616
+ }
34617
+ clearFilters() {
34618
+ this.activeFilters.set([]);
34619
+ }
34620
+ setView(v) {
34621
+ this.view.set(v);
34622
+ }
34623
+ navigate(direction) {
34624
+ this.focusedDate.set(null);
34625
+ this.anchorDate.set(shiftAnchor(this.view(), this.anchorDate(), direction));
34626
+ }
34627
+ goToday() {
34628
+ this.focusedDate.set(null);
34629
+ this.todayStr.set(toDateStr(/* @__PURE__ */ new Date()));
34630
+ this.anchorDate.set(/* @__PURE__ */ new Date());
34631
+ }
34632
+ dowLabel(dateStr) {
34633
+ return WEEK_DAY_LABELS[fromDateStr(dateStr).getDay()];
34634
+ }
34635
+ agendaDow(dateStr) {
34636
+ return fromDateStr(dateStr).toLocaleDateString("en-US", { weekday: "short" }).toUpperCase();
34637
+ }
34638
+ agendaDate(dateStr) {
34639
+ return fromDateStr(dateStr).toLocaleDateString("en-US", {
34640
+ month: "short",
34641
+ day: "numeric"
34642
+ });
34643
+ }
34644
+ chipTime(e) {
34645
+ if (e.timeLabel) return e.timeLabel;
34646
+ return e.startTime && !e.allDay ? formatTime$1(e.startTime) : "";
34647
+ }
34648
+ timeRange(e) {
34649
+ return e.startTime ? formatTime$1(e.startTime) + (e.endTime ? ` – ${formatTime$1(e.endTime)}` : "") : "";
34650
+ }
34651
+ itemLabel(e) {
34652
+ return e.ariaLabel || [this.chipTime(e), e.title].filter(Boolean).join(" ");
34653
+ }
34654
+ agendaMeta(e) {
34655
+ return [e.timeLabel ?? (!e.allDay && e.startTime ? this.timeRange(e) : ""), ...e.meta ?? []].filter(Boolean);
34656
+ }
34657
+ dayAriaLabel(dateStr, items) {
34658
+ const fn = this.dayLabelFn();
34659
+ if (fn) return fn(dateStr, items);
34660
+ const label = formatDayLabel(dateStr);
34661
+ return items.length ? `${label}, ${items.length} ${items.length === 1 ? "event" : "events"}` : label;
34662
+ }
34663
+ onDateClick(dateStr) {
34664
+ if (this.clickable(dateStr)) this.dateClick.emit(dateStr);
34665
+ }
34666
+ onCellKey(event, dateStr) {
34667
+ if (event.target !== event.currentTarget || event.altKey || event.ctrlKey || event.metaKey) return;
34668
+ if (event.key === "Enter" || event.key === " ") {
34669
+ event.preventDefault();
34670
+ this.onDateClick(dateStr);
34671
+ return;
34672
+ }
34673
+ const d = fromDateStr(dateStr);
34674
+ const step = {
34675
+ ArrowLeft: -1,
34676
+ ArrowRight: 1,
34677
+ ArrowUp: -7,
34678
+ ArrowDown: 7,
34679
+ Home: -d.getDay(),
34680
+ End: 6 - d.getDay()
34681
+ };
34682
+ if (!(event.key in step)) return;
34683
+ event.preventDefault();
34684
+ const target = toDateStr(new Date(d.getFullYear(), d.getMonth(), d.getDate() + step[event.key]));
34685
+ if (!this.monthCells().some((c) => c.dateStr === target)) return;
34686
+ this.focusedDate.set(target);
34687
+ this.host.nativeElement.querySelector(`.month-cell[data-date="${target}"]`)?.focus();
34688
+ }
34689
+ onAddAllDay(dateStr, event) {
34690
+ event.stopPropagation();
34691
+ this.onDateClick(dateStr);
34692
+ }
34693
+ onAddTimed(dateStr, event) {
34694
+ event.stopPropagation();
34695
+ if (this.clickable(dateStr)) this.slotClick.emit({
34696
+ date: dateStr,
34697
+ time: `${String(this.startHour()).padStart(2, "0")}:00`
34698
+ });
34699
+ }
34700
+ onSlotClick(dateStr, event) {
34701
+ if (!this.clickable(dateStr)) return;
34702
+ const rect = event.currentTarget.getBoundingClientRect();
34703
+ const hour = Math.min(this.endHour(), Math.max(this.startHour(), this.startHour() + Math.floor((event.clientY - rect.top) / 60)));
34704
+ this.slotClick.emit({
34705
+ date: dateStr,
34706
+ time: `${String(hour).padStart(2, "0")}:00`
34707
+ });
34708
+ }
34709
+ onItemClick(item, event) {
34710
+ event.stopPropagation();
34711
+ this.itemClick.emit(item);
34712
+ }
34713
+ onMoreClick(dateStr, items, event) {
34714
+ event.stopPropagation();
34715
+ this.moreClick.emit({
34716
+ date: dateStr,
34717
+ items
34718
+ });
34719
+ }
34720
+ static {
34721
+ this.ɵfac = i0.ɵɵngDeclareFactory({
34722
+ minVersion: "12.0.0",
34723
+ version: "22.2.2",
34724
+ ngImport: i0,
34725
+ type: CalendarComponent,
34726
+ deps: [],
34727
+ target: i0.ɵɵFactoryTarget.Component
34728
+ });
34729
+ }
34730
+ static {
34731
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
34732
+ minVersion: "17.0.0",
34733
+ version: "22.2.2",
34734
+ type: CalendarComponent,
34735
+ isStandalone: true,
34736
+ selector: "ui-calendar",
34737
+ inputs: {
34738
+ items: {
34739
+ classPropertyName: "items",
34740
+ publicName: "items",
34741
+ isSignal: true,
34742
+ isRequired: false,
34743
+ transformFunction: null
34744
+ },
34745
+ loading: {
34746
+ classPropertyName: "loading",
34747
+ publicName: "loading",
34748
+ isSignal: true,
34749
+ isRequired: false,
34750
+ transformFunction: null
34751
+ },
34752
+ view: {
34753
+ classPropertyName: "view",
34754
+ publicName: "view",
34755
+ isSignal: true,
34756
+ isRequired: false,
34757
+ transformFunction: null
34758
+ },
34759
+ views: {
34760
+ classPropertyName: "views",
34761
+ publicName: "views",
34762
+ isSignal: true,
34763
+ isRequired: false,
34764
+ transformFunction: null
34765
+ },
34766
+ anchorDate: {
34767
+ classPropertyName: "anchorDate",
34768
+ publicName: "anchorDate",
34769
+ isSignal: true,
34770
+ isRequired: false,
34771
+ transformFunction: null
34772
+ },
34773
+ filters: {
34774
+ classPropertyName: "filters",
34775
+ publicName: "filters",
34776
+ isSignal: true,
34777
+ isRequired: false,
34778
+ transformFunction: null
34779
+ },
34780
+ filterLabel: {
34781
+ classPropertyName: "filterLabel",
34782
+ publicName: "filterLabel",
34783
+ isSignal: true,
34784
+ isRequired: false,
34785
+ transformFunction: null
34786
+ },
34787
+ filterMode: {
34788
+ classPropertyName: "filterMode",
34789
+ publicName: "filterMode",
34790
+ isSignal: true,
34791
+ isRequired: false,
34792
+ transformFunction: null
34793
+ },
34794
+ activeFilters: {
34795
+ classPropertyName: "activeFilters",
34796
+ publicName: "activeFilters",
34797
+ isSignal: true,
34798
+ isRequired: false,
34799
+ transformFunction: null
34800
+ },
34801
+ showFilterCounts: {
34802
+ classPropertyName: "showFilterCounts",
34803
+ publicName: "showFilterCounts",
34804
+ isSignal: true,
34805
+ isRequired: false,
34806
+ transformFunction: null
34807
+ },
34808
+ canCreate: {
34809
+ classPropertyName: "canCreate",
34810
+ publicName: "canCreate",
34811
+ isSignal: true,
34812
+ isRequired: false,
34813
+ transformFunction: null
34814
+ },
34815
+ disablePast: {
34816
+ classPropertyName: "disablePast",
34817
+ publicName: "disablePast",
34818
+ isSignal: true,
34819
+ isRequired: false,
34820
+ transformFunction: null
34821
+ },
34822
+ maxVisible: {
34823
+ classPropertyName: "maxVisible",
34824
+ publicName: "maxVisible",
34825
+ isSignal: true,
34826
+ isRequired: false,
34827
+ transformFunction: null
34828
+ },
34829
+ chipLayout: {
34830
+ classPropertyName: "chipLayout",
34831
+ publicName: "chipLayout",
34832
+ isSignal: true,
34833
+ isRequired: false,
34834
+ transformFunction: null
34835
+ },
34836
+ sortByTime: {
34837
+ classPropertyName: "sortByTime",
34838
+ publicName: "sortByTime",
34839
+ isSignal: true,
34840
+ isRequired: false,
34841
+ transformFunction: null
34842
+ },
34843
+ startHour: {
34844
+ classPropertyName: "startHour",
34845
+ publicName: "startHour",
34846
+ isSignal: true,
34847
+ isRequired: false,
34848
+ transformFunction: null
34849
+ },
34850
+ endHour: {
34851
+ classPropertyName: "endHour",
34852
+ publicName: "endHour",
34853
+ isSignal: true,
34854
+ isRequired: false,
34855
+ transformFunction: null
34856
+ },
34857
+ emptyMessage: {
34858
+ classPropertyName: "emptyMessage",
34859
+ publicName: "emptyMessage",
34860
+ isSignal: true,
34861
+ isRequired: false,
34862
+ transformFunction: null
34863
+ },
34864
+ dayLabelFn: {
34865
+ classPropertyName: "dayLabelFn",
34866
+ publicName: "dayLabelFn",
34867
+ isSignal: true,
34868
+ isRequired: false,
34869
+ transformFunction: null
34870
+ }
34871
+ },
34872
+ outputs: {
34873
+ view: "viewChange",
34874
+ anchorDate: "anchorDateChange",
34875
+ activeFilters: "activeFiltersChange",
34876
+ rangeChange: "rangeChange",
34877
+ itemClick: "itemClick",
34878
+ dateClick: "dateClick",
34879
+ slotClick: "slotClick",
34880
+ moreClick: "moreClick"
34881
+ },
34882
+ ngImport: i0,
34883
+ template: `
34884
+ <div class="cal-toolbar">
34885
+ <div class="toolbar-left">
34886
+ <h2 class="period-label" aria-live="polite" aria-atomic="true">{{ periodLabel() }}</h2>
34887
+ <div class="nav-controls">
34888
+ <button type="button" class="btn-nav" (click)="navigate(-1)" aria-label="Previous">
34889
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><polyline points="15 18 9 12 15 6"/></svg>
34890
+ </button>
34891
+ <button type="button" class="btn-today" (click)="goToday()">Today</button>
34892
+ <button type="button" class="btn-nav" (click)="navigate(1)" aria-label="Next">
34893
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><polyline points="9 18 15 12 9 6"/></svg>
34894
+ </button>
34895
+ </div>
34896
+ </div>
34897
+ <div class="toolbar-center"><ng-content select="[calendar-summary]" /></div>
34898
+ <div class="toolbar-right">
34899
+ @if (viewTabs().length > 1) {
34900
+ <ui-pill-tabs ariaLabel="Calendar view" name="ui-calendar-view" [tabs]="viewTabs()" [activeKey]="view()" (tabChange)="setView($any($event))" />
34901
+ }
34902
+ <ng-content select="[calendar-actions]" />
34903
+ </div>
34904
+ </div>
34905
+
34906
+ @if (!loading()) {
34907
+ <div class="mobile-summary"><ng-content select="[calendar-summary-mobile]" /></div>
34908
+ }
34909
+
34910
+ @if (filters().length && !loading()) {
34911
+ <div class="filter-bar">
34912
+ @if (filterLabel()) { <div class="filter-bar-label">{{ filterLabel() }}</div> }
34913
+ <div class="filter-chips" role="group" [attr.aria-label]="filterLabel() || 'Filter'">
34914
+ <button type="button" class="filter-chip" [class.active-all]="!activeFilters().length" [attr.aria-pressed]="!activeFilters().length" (click)="clearFilters()">
34915
+ All
34916
+ @if (showFilterCounts()) { <span class="chip-count">{{ items().length }}</span> }
34917
+ </button>
34918
+ @for (f of filters(); track f.value) {
34919
+ <button type="button" class="filter-chip"
34920
+ [class.active-type]="isFilterActive(f.value)"
34921
+ [attr.aria-pressed]="isFilterActive(f.value)"
34922
+ [style.--chip-color]="f.color"
34923
+ [style.--chip-bg]="f.bgColor ?? null"
34924
+ (click)="toggleFilter(f.value)">
34925
+ <span class="chip-dot" [style.background]="f.color" aria-hidden="true"></span>
34926
+ {{ f.label }}
34927
+ @if (showFilterCounts()) { <span class="chip-count">{{ typeCounts()[f.value] ?? 0 }}</span> }
34928
+ </button>
34929
+ }
34930
+ </div>
34931
+ </div>
34932
+ }
34933
+
34934
+ @if (loading()) {
34935
+ <div class="cal-skeleton" aria-busy="true" aria-label="Loading calendar" role="status">
34936
+ <div class="skel-dow-row">
34937
+ @for (d of weekDayLabels; track d) { <div class="skel-dow"><ui-skeleton [height]="16" width="36px" [radius]="4" /></div> }
34938
+ </div>
34939
+ <div class="skel-month-grid">
34940
+ @for (i of skeletonCells; track i) {
34941
+ <div class="skel-cell">
34942
+ <ui-skeleton [height]="22" width="22px" [radius]="11" />
34943
+ @if (i % 3 === 0) { <ui-skeleton [height]="14" [radius]="3" /> }
34944
+ @if (i % 5 === 0) { <ui-skeleton [height]="14" width="72%" [radius]="3" /> }
34945
+ </div>
34946
+ }
34947
+ </div>
34948
+ </div>
34949
+ } @else {
34950
+ @switch (view()) {
34951
+ @case ('month') {
34952
+ <div class="month-view">
34953
+ <div class="month-grid" role="grid" [attr.aria-label]="periodLabel()">
34954
+ <div class="month-header" role="row">
34955
+ @for (d of weekDayLabels; track d; let i = $index) {
34956
+ <div class="month-dow" role="columnheader" [attr.aria-label]="weekDayNames[i]">
34957
+ <span class="dow-full" aria-hidden="true">{{ d }}</span><span class="dow-short" aria-hidden="true">{{ d.slice(0, 2) }}</span>
34958
+ </div>
34959
+ }
34960
+ </div>
34961
+ @for (row of monthRows(); track row.key) {
34962
+ <div class="month-row" role="row">
34963
+ @for (c of row.cells; track c.day.dateStr) {
34964
+ <div class="month-cell" role="gridcell"
34965
+ [attr.data-date]="c.day.dateStr"
34966
+ [class.other-month]="!c.day.isCurrentMonth" [class.today]="c.day.isToday" [class.weekend]="c.day.isWeekend"
34967
+ [class.clickable]="c.clickable"
34968
+ [attr.tabindex]="c.day.dateStr === focusDate() ? 0 : -1"
34969
+ [attr.aria-label]="c.label"
34970
+ [attr.aria-current]="c.day.isToday ? 'date' : null"
34971
+ (click)="onDateClick(c.day.dateStr)"
34972
+ (focus)="focusedDate.set(c.day.dateStr)"
34973
+ (keydown)="onCellKey($event, c.day.dateStr)">
34974
+ <span class="day-num" [class.today-badge]="c.day.isToday">{{ c.day.dayNum }}</span>
34975
+ <div class="cell-events">
34976
+ @for (e of c.visible; track e.id) {
34977
+ <button type="button" class="event-chip" [class.stacked]="chipLayout() === 'stacked'" [class.has-head]="!!(e.iconPath || chipTime(e))" [style.background]="e.bgColor" [style.borderLeftColor]="e.color"
34978
+ [attr.aria-label]="itemLabel(e)" [title]="e.title"
34979
+ (click)="onItemClick(e, $event)">
34980
+ <span class="chip-head">
34981
+ @if (e.iconPath) {
34982
+ <svg class="chip-icon" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path [attr.d]="e.iconPath"/></svg>
34983
+ }
34984
+ @if (chipTime(e); as t) { <span class="chip-time">{{ t }}</span> }
34985
+ </span>
34986
+ <span class="chip-title" [class.strike]="e.strike">{{ e.title }}</span>
34987
+ @if (e.tag) { <span class="chip-src">{{ e.tag }}</span> }
34988
+ </button>
34989
+ }
34990
+ @if (c.overflow > 0) {
34991
+ <button type="button" class="more-events" (click)="onMoreClick(c.day.dateStr, c.items, $event)">+{{ c.overflow }} more</button>
34992
+ }
34993
+ </div>
34994
+ </div>
34995
+ }
34996
+ </div>
34997
+ }
34998
+ </div>
34999
+ </div>
35000
+ }
35001
+ @case ('week') {
35002
+ <div class="week-view">
35003
+ <div class="week-header">
35004
+ <div class="time-gutter"></div>
35005
+ @for (col of weekColumns(); track col.day.dateStr) {
35006
+ <div class="week-day-hdr" [class.today]="col.day.isToday">
35007
+ <span class="wdh-dow">{{ dowLabel(col.day.dateStr) }}</span>
35008
+ <span class="wdh-num" [class.today-badge]="col.day.isToday">{{ col.day.dayNum }}</span>
35009
+ </div>
35010
+ }
35011
+ </div>
35012
+ <div class="allday-row">
35013
+ <div class="time-gutter allday-label">All day</div>
35014
+ @for (col of weekColumns(); track col.day.dateStr) {
35015
+ <div class="allday-cell" [class.clickable]="col.clickable" (click)="onDateClick(col.day.dateStr)">
35016
+ @if (col.clickable) {
35017
+ <button type="button" class="slot-add" [attr.aria-label]="'Add all-day event on ' + col.label" (click)="onAddAllDay(col.day.dateStr, $event)">+ Add</button>
35018
+ }
35019
+ @for (e of col.allDay; track e.id) {
35020
+ <button type="button" class="allday-chip" [style.background]="e.bgColor" [style.borderLeftColor]="e.color"
35021
+ [attr.aria-label]="itemLabel(e)" (click)="onItemClick(e, $event)">{{ e.title }}</button>
35022
+ }
35023
+ </div>
35024
+ }
35025
+ </div>
35026
+ <div class="week-body">
35027
+ <div class="time-col">
35028
+ @for (h of hours(); track h) { <div class="time-slot-label">{{ formatHour(h) }}</div> }
35029
+ </div>
35030
+ @for (col of weekColumns(); track col.day.dateStr) {
35031
+ <div class="day-col" [class.today]="col.day.isToday" [class.clickable]="col.clickable" (click)="onSlotClick(col.day.dateStr, $event)">
35032
+ @if (col.clickable) {
35033
+ <button type="button" class="slot-add" [attr.aria-label]="'Add event on ' + col.label" (click)="onAddTimed(col.day.dateStr, $event)">+ Add</button>
35034
+ }
35035
+ @for (h of hours(); track h) { <div class="time-slot"></div> }
35036
+ @for (t of col.timed; track t.item.id) {
35037
+ <button type="button" class="timed-event"
35038
+ [style.top.px]="t.top" [style.height.px]="t.height"
35039
+ [style.left]="'calc(' + (t.lane.lane / t.lane.lanes * 100) + '% + 2px)'"
35040
+ [style.width]="'calc(' + (100 / t.lane.lanes) + '% - 4px)'"
35041
+ [style.background]="t.item.bgColor" [style.borderLeftColor]="t.item.color"
35042
+ [attr.aria-label]="itemLabel(t.item)" (click)="onItemClick(t.item, $event)">
35043
+ <span class="te-title" [class.strike]="t.item.strike">{{ t.item.title }}</span>
35044
+ @if (t.item.startTime) { <span class="te-time">{{ t.item.timeLabel || timeRange(t.item) }}</span> }
35045
+ </button>
35046
+ }
35047
+ </div>
35048
+ }
35049
+ </div>
35050
+ </div>
35051
+ }
35052
+ @case ('agenda') {
35053
+ <div class="agenda-view">
35054
+ @if (agendaGroups().length === 0) {
35055
+ <ui-empty-state iconType="task" [message]="emptyMessage()" />
35056
+ }
35057
+ @for (group of agendaGroups(); track group.dateStr) {
35058
+ <div class="agenda-group">
35059
+ <div class="agenda-date-hdr">
35060
+ <span class="ag-dow">{{ agendaDow(group.dateStr) }}</span>
35061
+ <span class="ag-date">{{ agendaDate(group.dateStr) }}</span>
35062
+ @if (group.dateStr === todayStr()) { <ui-badge label="Today" variant="blue" /> }
35063
+ </div>
35064
+ <div class="agenda-events">
35065
+ @for (e of group.items; track e.id) {
35066
+ <button type="button" class="agenda-event" [attr.aria-label]="e.ariaLabel || null" (click)="onItemClick(e, $event)">
35067
+ <span class="ae-color-bar" [style.background]="e.color"></span>
35068
+ <span class="ae-body">
35069
+ <span class="ae-top">
35070
+ <span class="ae-title" [class.strike]="e.strike">{{ e.title }}</span>
35071
+ @for (b of e.badges ?? []; track b.label) { <ui-badge [label]="b.label" [variant]="b.variant" /> }
35072
+ </span>
35073
+ @if (agendaMeta(e).length) {
35074
+ <span class="ae-meta">
35075
+ @for (m of agendaMeta(e); track $index) { <span class="ae-meta-item">{{ m }}</span> }
35076
+ </span>
35077
+ }
35078
+ </span>
35079
+ </button>
35080
+ }
35081
+ </div>
35082
+ </div>
35083
+ }
35084
+ </div>
35085
+ }
35086
+ }
35087
+ }
35088
+ <ui-toast />
35089
+ `,
35090
+ isInline: true,
35091
+ styles: [":host{display:flex;flex-direction:column;gap:0;height:100%;min-height:0}.cal-toolbar{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;padding-bottom:16px;gap:16px;flex-shrink:0}.toolbar-left{display:flex;flex-direction:column;align-items:flex-start;gap:6px}.toolbar-center{display:flex;align-items:center;justify-content:center;gap:10px}.toolbar-right{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}.period-label{font-size:1.125rem;font-weight:700;color:#111827;margin:0}.nav-controls{display:flex;align-items:center;gap:8px}.btn-nav{width:32px;height:32px;border:1px solid #e2e8f0;background:#fff;border-radius:6px;font-family:inherit;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#475569}.btn-nav:hover{background:#f8fafc}.btn-today{padding:6px 14px;border:1px solid #e2e8f0;background:#fff;border-radius:6px;font-family:inherit;font-size:.875rem;font-weight:500;color:#374151;cursor:pointer}.btn-today:hover{background:#f8fafc}.btn-nav:focus-visible,.btn-today:focus-visible,.filter-chip:focus-visible,.event-chip:focus-visible,.more-events:focus-visible,.allday-chip:focus-visible,.timed-event:focus-visible,.agenda-event:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.month-cell:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.slot-add:focus,.slot-add:focus-visible{outline:2px solid #3b82f6;outline-offset:1px}.mobile-summary{display:none}.filter-bar{display:flex;flex-direction:column;gap:8px;padding:12px 0;border-top:1px solid #e2e8f0;flex-shrink:0}.filter-bar-label{font-size:.6875rem;font-weight:700;color:#94a3b8;text-transform:uppercase;letter-spacing:.06em}.filter-chips{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.filter-chip{display:inline-flex;align-items:center;gap:5px;padding:4px 12px;border-radius:20px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s;white-space:nowrap;font-family:inherit}.filter-chip:hover{border-color:#cbd5e1;background:#f8fafc}.filter-chip.active-all{background:#1e293b;color:#fff;border-color:#1e293b}.filter-chip.active-all .chip-count{background:#fff3;color:#fff}.filter-chip.active-type{background:var(--chip-bg, #f1f5f9);color:#1e293b;border-color:var(--chip-color);font-weight:600}.filter-chip.active-type .chip-count{background:var(--chip-color);color:#fff}.chip-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.chip-count{font-size:.6875rem;font-weight:700;background:#f1f5f9;color:#64748b;padding:1px 7px;border-radius:999px}.cal-skeleton,.month-view,.week-view,.agenda-view{flex:1;display:flex;flex-direction:column;min-height:0;background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.skel-dow-row{display:grid;grid-template-columns:repeat(7,1fr);gap:8px;padding:12px 10px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.skel-dow{display:flex;justify-content:center}.skel-month-grid{display:grid;grid-template-columns:repeat(7,1fr);grid-template-rows:repeat(6,minmax(80px,1fr));flex:1}.skel-cell{border-right:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;padding:8px 6px;display:flex;flex-direction:column;gap:6px}.skel-cell:nth-child(7n){border-right:none}.month-grid{display:flex;flex-direction:column;flex:1;min-height:0;overflow:auto}.month-header{display:grid;grid-template-columns:repeat(7,1fr);border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;position:sticky;top:0;z-index:1}.month-dow{padding:10px 8px;font-size:.75rem;font-weight:600;color:#6b7280;text-align:center;text-transform:uppercase;letter-spacing:.04em}.dow-short{display:none}.month-row{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));flex:1 0 120px}.month-cell{border-right:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;padding:6px 6px 4px;min-height:120px;transition:background .1s;min-width:0;box-sizing:border-box}.month-cell.clickable{cursor:pointer}.month-cell.clickable:hover{background:#f8fafc}.month-cell:nth-child(7n){border-right:none}.month-cell.other-month{background:#fafafa}.month-cell.other-month .day-num{color:#64748b}.month-cell.today{background:#eff6ff}.day-num{display:inline-block;width:26px;height:26px;line-height:26px;text-align:center;border-radius:50%;font-size:.8125rem;font-weight:500;color:#374151;margin-bottom:4px}.today-badge{background:#2563eb;color:#fff;font-weight:700}.cell-events{display:flex;flex-direction:column;gap:2px}.event-chip{display:flex;align-items:center;gap:3px;padding:2px 6px;width:100%;box-sizing:border-box;text-align:left;font-family:inherit;border:0;border-radius:4px;border-left:3px solid transparent;font-size:.6875rem;font-weight:500;cursor:pointer;overflow:hidden}.event-chip:hover{opacity:.85}.event-chip.stacked{flex-direction:column;align-items:flex-start;gap:0}.chip-head{display:inline-flex;align-items:center;gap:3px;flex-shrink:0}.chip-icon{flex-shrink:0}.chip-time{font-weight:700;flex-shrink:0;color:#1e293b}.chip-title{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#1e293b;min-width:0;max-width:100%}.strike{text-decoration:line-through}.chip-src{font-size:.625rem;font-weight:700;margin-left:auto;flex-shrink:0;color:#1e293b}.more-events{font-size:.6875rem;color:#2563eb;font-weight:600;cursor:pointer;padding:1px 6px;border:0;background:none;text-align:left;font-family:inherit}.more-events:hover{text-decoration:underline}.week-view{overflow:auto}.week-header{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;overflow-y:scroll}.time-gutter{border-right:1px solid #e2e8f0}.week-day-hdr{display:flex;flex-direction:column;align-items:center;padding:10px 4px;border-right:1px solid #f1f5f9}.week-day-hdr.today{background:#eff6ff}.week-day-hdr:last-child{border-right:none}.wdh-dow{font-size:.6875rem;font-weight:600;color:#6b7280;text-transform:uppercase}.wdh-num{width:28px;height:28px;line-height:28px;text-align:center;border-radius:50%;font-size:.9375rem;font-weight:600;color:#374151;margin-top:2px}.wdh-num.today-badge{background:#2563eb;color:#fff;font-weight:700}.allday-row{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:1px solid #e2e8f0;min-height:32px;flex-shrink:0;overflow-y:scroll}.allday-label{font-size:.625rem;color:#64748b;font-weight:600;text-transform:uppercase;display:flex;align-items:center;justify-content:center}.slot-add{position:absolute;top:2px;left:2px;z-index:3;width:1px;height:1px;padding:0;margin:0;overflow:hidden;clip-path:inset(50%);border:0;white-space:nowrap;font-family:inherit}.slot-add:focus,.slot-add:focus-visible{width:auto;height:auto;padding:2px 8px;clip-path:none;background:#1e293b;color:#fff;border-radius:4px;font-size:.75rem;font-weight:600}.allday-cell{position:relative;border-right:1px solid #f1f5f9;padding:3px 4px;display:flex;flex-direction:column;gap:2px;min-width:0}.allday-cell.clickable{cursor:pointer}.allday-cell:last-child{border-right:none}.allday-chip{padding:2px 6px;border:0;border-radius:4px;border-left:3px solid transparent;font-size:.6875rem;font-weight:500;color:#1e293b;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left;font-family:inherit}.allday-chip:hover{opacity:.85}.week-body{display:grid;grid-template-columns:60px repeat(7,1fr);flex:1;overflow-y:scroll}.time-col{display:flex;flex-direction:column;border-right:1px solid #e2e8f0;flex-shrink:0}.time-slot-label{height:60px;display:flex;align-items:flex-start;justify-content:flex-end;padding:4px 8px 0 0;font-size:.6875rem;color:#64748b;font-weight:500;border-bottom:1px solid #f1f5f9;flex-shrink:0;box-sizing:border-box}.day-col{position:relative;border-right:1px solid #f1f5f9;min-width:0}.day-col.clickable{cursor:pointer}.day-col:last-child{border-right:none}.day-col.today{background:#fafbff}.time-slot{height:60px;border-bottom:1px solid #f1f5f9;box-sizing:border-box}.day-col.clickable .time-slot:hover{background:#f8fafc}.timed-event{position:absolute;min-height:20px;border:0;border-radius:6px;padding:3px 6px;overflow:hidden;cursor:pointer;box-sizing:border-box;border-left:3px solid transparent;display:flex;flex-direction:column;align-items:flex-start;gap:1px;box-shadow:0 1px 3px #00000014;text-align:left;font-family:inherit}.timed-event:hover{opacity:.85}.te-title{font-size:.6875rem;font-weight:600;color:#1e293b;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.te-time{font-size:.625rem;color:#475569}.agenda-view{overflow-y:auto}.agenda-group{display:flex;border-bottom:1px solid #f1f5f9}.agenda-date-hdr{width:100px;flex-shrink:0;padding:16px 12px;display:flex;flex-direction:column;gap:4px;background:#f8fafc;border-right:2px solid #e2e8f0}.ag-dow{font-size:.6875rem;font-weight:700;color:#6b7280;text-transform:uppercase;letter-spacing:.04em}.ag-date{font-size:.8125rem;font-weight:600;color:#374151}.agenda-events{flex:1;display:flex;flex-direction:column;min-width:0}.agenda-event{display:flex;align-items:stretch;padding:10px 12px;cursor:pointer;border:0;border-bottom:1px solid #f8fafc;background:none;text-align:left;width:100%;font-family:inherit;transition:background .1s}.agenda-event:hover{background:#f8fafc}.agenda-event:last-child{border-bottom:none}.ae-color-bar{display:block;width:4px;border-radius:4px;flex-shrink:0;margin-right:12px}.ae-body{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.ae-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.ae-title{font-size:.9375rem;font-weight:600;color:#111827}.ae-meta{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.ae-meta-item{font-size:.8125rem;color:#6b7280}@media(pointer:coarse),(max-width:480px){.btn-nav,.btn-today,.filter-chip,.event-chip,.more-events,.allday-chip,.agenda-event{min-height:44px}.btn-nav{min-width:44px}}@media(max-width:768px){.cal-toolbar{grid-template-columns:1fr}.toolbar-center{display:none}.toolbar-left{flex-wrap:wrap}.toolbar-right{justify-content:flex-start}.mobile-summary{display:block;margin-bottom:4px;flex-shrink:0}.mobile-summary:empty{display:none}.filter-chips{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px;-webkit-overflow-scrolling:touch}.month-view,.cal-skeleton,.week-view{overflow-x:auto;-webkit-overflow-scrolling:touch}.month-grid,.skel-month-grid,.skel-dow-row{min-width:560px}.month-row{flex-basis:80px}.month-cell{min-height:80px}.week-header,.allday-row,.week-body{min-width:640px}.agenda-date-hdr{width:76px;padding:12px 8px}.ae-title{font-size:.875rem}}@media(max-width:640px){.event-chip.stacked.has-head .chip-title{display:none}}@media(max-width:480px){.dow-full{display:none}.dow-short{display:inline}}\n"],
35092
+ dependencies: [
35093
+ {
35094
+ kind: "component",
35095
+ type: BadgeComponent,
35096
+ selector: "ui-badge",
35097
+ inputs: ["label", "variant"]
35098
+ },
35099
+ {
35100
+ kind: "component",
35101
+ type: EmptyStateComponent,
35102
+ selector: "ui-empty-state",
35103
+ inputs: [
35104
+ "message",
35105
+ "title",
35106
+ "iconType"
35107
+ ]
35108
+ },
35109
+ {
35110
+ kind: "component",
35111
+ type: PillTabsComponent,
35112
+ selector: "ui-pill-tabs",
35113
+ inputs: [
35114
+ "tabs",
35115
+ "activeKey",
35116
+ "ariaLabel",
35117
+ "name"
35118
+ ],
35119
+ outputs: ["tabChange"]
35120
+ },
35121
+ {
35122
+ kind: "component",
35123
+ type: SkeletonComponent,
35124
+ selector: "ui-skeleton",
35125
+ inputs: [
35126
+ "height",
35127
+ "width",
35128
+ "radius",
35129
+ "mb",
35130
+ "ariaLabel"
35131
+ ]
35132
+ },
35133
+ {
35134
+ kind: "component",
35135
+ type: ToastComponent,
35136
+ selector: "ui-toast",
35137
+ inputs: ["dismissible", "persistentLiveRegion"]
35138
+ }
35139
+ ],
35140
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
35141
+ });
35142
+ }
35143
+ };
35144
+ i0.ɵɵngDeclareClassMetadata({
35145
+ minVersion: "12.0.0",
35146
+ version: "22.2.2",
35147
+ ngImport: i0,
35148
+ type: CalendarComponent,
35149
+ decorators: [{
35150
+ type: Component,
35151
+ args: [{
35152
+ selector: "ui-calendar",
35153
+ standalone: true,
35154
+ changeDetection: ChangeDetectionStrategy.OnPush,
35155
+ imports: [
35156
+ BadgeComponent,
35157
+ EmptyStateComponent,
35158
+ PillTabsComponent,
35159
+ SkeletonComponent,
35160
+ ToastComponent
35161
+ ],
35162
+ template: `
35163
+ <div class="cal-toolbar">
35164
+ <div class="toolbar-left">
35165
+ <h2 class="period-label" aria-live="polite" aria-atomic="true">{{ periodLabel() }}</h2>
35166
+ <div class="nav-controls">
35167
+ <button type="button" class="btn-nav" (click)="navigate(-1)" aria-label="Previous">
35168
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><polyline points="15 18 9 12 15 6"/></svg>
35169
+ </button>
35170
+ <button type="button" class="btn-today" (click)="goToday()">Today</button>
35171
+ <button type="button" class="btn-nav" (click)="navigate(1)" aria-label="Next">
35172
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><polyline points="9 18 15 12 9 6"/></svg>
35173
+ </button>
35174
+ </div>
35175
+ </div>
35176
+ <div class="toolbar-center"><ng-content select="[calendar-summary]" /></div>
35177
+ <div class="toolbar-right">
35178
+ @if (viewTabs().length > 1) {
35179
+ <ui-pill-tabs ariaLabel="Calendar view" name="ui-calendar-view" [tabs]="viewTabs()" [activeKey]="view()" (tabChange)="setView($any($event))" />
35180
+ }
35181
+ <ng-content select="[calendar-actions]" />
35182
+ </div>
35183
+ </div>
35184
+
35185
+ @if (!loading()) {
35186
+ <div class="mobile-summary"><ng-content select="[calendar-summary-mobile]" /></div>
35187
+ }
35188
+
35189
+ @if (filters().length && !loading()) {
35190
+ <div class="filter-bar">
35191
+ @if (filterLabel()) { <div class="filter-bar-label">{{ filterLabel() }}</div> }
35192
+ <div class="filter-chips" role="group" [attr.aria-label]="filterLabel() || 'Filter'">
35193
+ <button type="button" class="filter-chip" [class.active-all]="!activeFilters().length" [attr.aria-pressed]="!activeFilters().length" (click)="clearFilters()">
35194
+ All
35195
+ @if (showFilterCounts()) { <span class="chip-count">{{ items().length }}</span> }
35196
+ </button>
35197
+ @for (f of filters(); track f.value) {
35198
+ <button type="button" class="filter-chip"
35199
+ [class.active-type]="isFilterActive(f.value)"
35200
+ [attr.aria-pressed]="isFilterActive(f.value)"
35201
+ [style.--chip-color]="f.color"
35202
+ [style.--chip-bg]="f.bgColor ?? null"
35203
+ (click)="toggleFilter(f.value)">
35204
+ <span class="chip-dot" [style.background]="f.color" aria-hidden="true"></span>
35205
+ {{ f.label }}
35206
+ @if (showFilterCounts()) { <span class="chip-count">{{ typeCounts()[f.value] ?? 0 }}</span> }
35207
+ </button>
35208
+ }
35209
+ </div>
35210
+ </div>
35211
+ }
35212
+
35213
+ @if (loading()) {
35214
+ <div class="cal-skeleton" aria-busy="true" aria-label="Loading calendar" role="status">
35215
+ <div class="skel-dow-row">
35216
+ @for (d of weekDayLabels; track d) { <div class="skel-dow"><ui-skeleton [height]="16" width="36px" [radius]="4" /></div> }
35217
+ </div>
35218
+ <div class="skel-month-grid">
35219
+ @for (i of skeletonCells; track i) {
35220
+ <div class="skel-cell">
35221
+ <ui-skeleton [height]="22" width="22px" [radius]="11" />
35222
+ @if (i % 3 === 0) { <ui-skeleton [height]="14" [radius]="3" /> }
35223
+ @if (i % 5 === 0) { <ui-skeleton [height]="14" width="72%" [radius]="3" /> }
35224
+ </div>
35225
+ }
35226
+ </div>
35227
+ </div>
35228
+ } @else {
35229
+ @switch (view()) {
35230
+ @case ('month') {
35231
+ <div class="month-view">
35232
+ <div class="month-grid" role="grid" [attr.aria-label]="periodLabel()">
35233
+ <div class="month-header" role="row">
35234
+ @for (d of weekDayLabels; track d; let i = $index) {
35235
+ <div class="month-dow" role="columnheader" [attr.aria-label]="weekDayNames[i]">
35236
+ <span class="dow-full" aria-hidden="true">{{ d }}</span><span class="dow-short" aria-hidden="true">{{ d.slice(0, 2) }}</span>
35237
+ </div>
35238
+ }
35239
+ </div>
35240
+ @for (row of monthRows(); track row.key) {
35241
+ <div class="month-row" role="row">
35242
+ @for (c of row.cells; track c.day.dateStr) {
35243
+ <div class="month-cell" role="gridcell"
35244
+ [attr.data-date]="c.day.dateStr"
35245
+ [class.other-month]="!c.day.isCurrentMonth" [class.today]="c.day.isToday" [class.weekend]="c.day.isWeekend"
35246
+ [class.clickable]="c.clickable"
35247
+ [attr.tabindex]="c.day.dateStr === focusDate() ? 0 : -1"
35248
+ [attr.aria-label]="c.label"
35249
+ [attr.aria-current]="c.day.isToday ? 'date' : null"
35250
+ (click)="onDateClick(c.day.dateStr)"
35251
+ (focus)="focusedDate.set(c.day.dateStr)"
35252
+ (keydown)="onCellKey($event, c.day.dateStr)">
35253
+ <span class="day-num" [class.today-badge]="c.day.isToday">{{ c.day.dayNum }}</span>
35254
+ <div class="cell-events">
35255
+ @for (e of c.visible; track e.id) {
35256
+ <button type="button" class="event-chip" [class.stacked]="chipLayout() === 'stacked'" [class.has-head]="!!(e.iconPath || chipTime(e))" [style.background]="e.bgColor" [style.borderLeftColor]="e.color"
35257
+ [attr.aria-label]="itemLabel(e)" [title]="e.title"
35258
+ (click)="onItemClick(e, $event)">
35259
+ <span class="chip-head">
35260
+ @if (e.iconPath) {
35261
+ <svg class="chip-icon" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path [attr.d]="e.iconPath"/></svg>
35262
+ }
35263
+ @if (chipTime(e); as t) { <span class="chip-time">{{ t }}</span> }
35264
+ </span>
35265
+ <span class="chip-title" [class.strike]="e.strike">{{ e.title }}</span>
35266
+ @if (e.tag) { <span class="chip-src">{{ e.tag }}</span> }
35267
+ </button>
35268
+ }
35269
+ @if (c.overflow > 0) {
35270
+ <button type="button" class="more-events" (click)="onMoreClick(c.day.dateStr, c.items, $event)">+{{ c.overflow }} more</button>
35271
+ }
35272
+ </div>
35273
+ </div>
35274
+ }
35275
+ </div>
35276
+ }
35277
+ </div>
35278
+ </div>
35279
+ }
35280
+ @case ('week') {
35281
+ <div class="week-view">
35282
+ <div class="week-header">
35283
+ <div class="time-gutter"></div>
35284
+ @for (col of weekColumns(); track col.day.dateStr) {
35285
+ <div class="week-day-hdr" [class.today]="col.day.isToday">
35286
+ <span class="wdh-dow">{{ dowLabel(col.day.dateStr) }}</span>
35287
+ <span class="wdh-num" [class.today-badge]="col.day.isToday">{{ col.day.dayNum }}</span>
35288
+ </div>
35289
+ }
35290
+ </div>
35291
+ <div class="allday-row">
35292
+ <div class="time-gutter allday-label">All day</div>
35293
+ @for (col of weekColumns(); track col.day.dateStr) {
35294
+ <div class="allday-cell" [class.clickable]="col.clickable" (click)="onDateClick(col.day.dateStr)">
35295
+ @if (col.clickable) {
35296
+ <button type="button" class="slot-add" [attr.aria-label]="'Add all-day event on ' + col.label" (click)="onAddAllDay(col.day.dateStr, $event)">+ Add</button>
35297
+ }
35298
+ @for (e of col.allDay; track e.id) {
35299
+ <button type="button" class="allday-chip" [style.background]="e.bgColor" [style.borderLeftColor]="e.color"
35300
+ [attr.aria-label]="itemLabel(e)" (click)="onItemClick(e, $event)">{{ e.title }}</button>
35301
+ }
35302
+ </div>
35303
+ }
35304
+ </div>
35305
+ <div class="week-body">
35306
+ <div class="time-col">
35307
+ @for (h of hours(); track h) { <div class="time-slot-label">{{ formatHour(h) }}</div> }
35308
+ </div>
35309
+ @for (col of weekColumns(); track col.day.dateStr) {
35310
+ <div class="day-col" [class.today]="col.day.isToday" [class.clickable]="col.clickable" (click)="onSlotClick(col.day.dateStr, $event)">
35311
+ @if (col.clickable) {
35312
+ <button type="button" class="slot-add" [attr.aria-label]="'Add event on ' + col.label" (click)="onAddTimed(col.day.dateStr, $event)">+ Add</button>
35313
+ }
35314
+ @for (h of hours(); track h) { <div class="time-slot"></div> }
35315
+ @for (t of col.timed; track t.item.id) {
35316
+ <button type="button" class="timed-event"
35317
+ [style.top.px]="t.top" [style.height.px]="t.height"
35318
+ [style.left]="'calc(' + (t.lane.lane / t.lane.lanes * 100) + '% + 2px)'"
35319
+ [style.width]="'calc(' + (100 / t.lane.lanes) + '% - 4px)'"
35320
+ [style.background]="t.item.bgColor" [style.borderLeftColor]="t.item.color"
35321
+ [attr.aria-label]="itemLabel(t.item)" (click)="onItemClick(t.item, $event)">
35322
+ <span class="te-title" [class.strike]="t.item.strike">{{ t.item.title }}</span>
35323
+ @if (t.item.startTime) { <span class="te-time">{{ t.item.timeLabel || timeRange(t.item) }}</span> }
35324
+ </button>
35325
+ }
35326
+ </div>
35327
+ }
35328
+ </div>
35329
+ </div>
35330
+ }
35331
+ @case ('agenda') {
35332
+ <div class="agenda-view">
35333
+ @if (agendaGroups().length === 0) {
35334
+ <ui-empty-state iconType="task" [message]="emptyMessage()" />
35335
+ }
35336
+ @for (group of agendaGroups(); track group.dateStr) {
35337
+ <div class="agenda-group">
35338
+ <div class="agenda-date-hdr">
35339
+ <span class="ag-dow">{{ agendaDow(group.dateStr) }}</span>
35340
+ <span class="ag-date">{{ agendaDate(group.dateStr) }}</span>
35341
+ @if (group.dateStr === todayStr()) { <ui-badge label="Today" variant="blue" /> }
35342
+ </div>
35343
+ <div class="agenda-events">
35344
+ @for (e of group.items; track e.id) {
35345
+ <button type="button" class="agenda-event" [attr.aria-label]="e.ariaLabel || null" (click)="onItemClick(e, $event)">
35346
+ <span class="ae-color-bar" [style.background]="e.color"></span>
35347
+ <span class="ae-body">
35348
+ <span class="ae-top">
35349
+ <span class="ae-title" [class.strike]="e.strike">{{ e.title }}</span>
35350
+ @for (b of e.badges ?? []; track b.label) { <ui-badge [label]="b.label" [variant]="b.variant" /> }
35351
+ </span>
35352
+ @if (agendaMeta(e).length) {
35353
+ <span class="ae-meta">
35354
+ @for (m of agendaMeta(e); track $index) { <span class="ae-meta-item">{{ m }}</span> }
35355
+ </span>
35356
+ }
35357
+ </span>
35358
+ </button>
35359
+ }
35360
+ </div>
35361
+ </div>
35362
+ }
35363
+ </div>
35364
+ }
35365
+ }
35366
+ }
35367
+ <ui-toast />
35368
+ `,
35369
+ styles: [":host{display:flex;flex-direction:column;gap:0;height:100%;min-height:0}.cal-toolbar{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;padding-bottom:16px;gap:16px;flex-shrink:0}.toolbar-left{display:flex;flex-direction:column;align-items:flex-start;gap:6px}.toolbar-center{display:flex;align-items:center;justify-content:center;gap:10px}.toolbar-right{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}.period-label{font-size:1.125rem;font-weight:700;color:#111827;margin:0}.nav-controls{display:flex;align-items:center;gap:8px}.btn-nav{width:32px;height:32px;border:1px solid #e2e8f0;background:#fff;border-radius:6px;font-family:inherit;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#475569}.btn-nav:hover{background:#f8fafc}.btn-today{padding:6px 14px;border:1px solid #e2e8f0;background:#fff;border-radius:6px;font-family:inherit;font-size:.875rem;font-weight:500;color:#374151;cursor:pointer}.btn-today:hover{background:#f8fafc}.btn-nav:focus-visible,.btn-today:focus-visible,.filter-chip:focus-visible,.event-chip:focus-visible,.more-events:focus-visible,.allday-chip:focus-visible,.timed-event:focus-visible,.agenda-event:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.month-cell:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.slot-add:focus,.slot-add:focus-visible{outline:2px solid #3b82f6;outline-offset:1px}.mobile-summary{display:none}.filter-bar{display:flex;flex-direction:column;gap:8px;padding:12px 0;border-top:1px solid #e2e8f0;flex-shrink:0}.filter-bar-label{font-size:.6875rem;font-weight:700;color:#94a3b8;text-transform:uppercase;letter-spacing:.06em}.filter-chips{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.filter-chip{display:inline-flex;align-items:center;gap:5px;padding:4px 12px;border-radius:20px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s;white-space:nowrap;font-family:inherit}.filter-chip:hover{border-color:#cbd5e1;background:#f8fafc}.filter-chip.active-all{background:#1e293b;color:#fff;border-color:#1e293b}.filter-chip.active-all .chip-count{background:#fff3;color:#fff}.filter-chip.active-type{background:var(--chip-bg, #f1f5f9);color:#1e293b;border-color:var(--chip-color);font-weight:600}.filter-chip.active-type .chip-count{background:var(--chip-color);color:#fff}.chip-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.chip-count{font-size:.6875rem;font-weight:700;background:#f1f5f9;color:#64748b;padding:1px 7px;border-radius:999px}.cal-skeleton,.month-view,.week-view,.agenda-view{flex:1;display:flex;flex-direction:column;min-height:0;background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.skel-dow-row{display:grid;grid-template-columns:repeat(7,1fr);gap:8px;padding:12px 10px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.skel-dow{display:flex;justify-content:center}.skel-month-grid{display:grid;grid-template-columns:repeat(7,1fr);grid-template-rows:repeat(6,minmax(80px,1fr));flex:1}.skel-cell{border-right:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;padding:8px 6px;display:flex;flex-direction:column;gap:6px}.skel-cell:nth-child(7n){border-right:none}.month-grid{display:flex;flex-direction:column;flex:1;min-height:0;overflow:auto}.month-header{display:grid;grid-template-columns:repeat(7,1fr);border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;position:sticky;top:0;z-index:1}.month-dow{padding:10px 8px;font-size:.75rem;font-weight:600;color:#6b7280;text-align:center;text-transform:uppercase;letter-spacing:.04em}.dow-short{display:none}.month-row{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));flex:1 0 120px}.month-cell{border-right:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;padding:6px 6px 4px;min-height:120px;transition:background .1s;min-width:0;box-sizing:border-box}.month-cell.clickable{cursor:pointer}.month-cell.clickable:hover{background:#f8fafc}.month-cell:nth-child(7n){border-right:none}.month-cell.other-month{background:#fafafa}.month-cell.other-month .day-num{color:#64748b}.month-cell.today{background:#eff6ff}.day-num{display:inline-block;width:26px;height:26px;line-height:26px;text-align:center;border-radius:50%;font-size:.8125rem;font-weight:500;color:#374151;margin-bottom:4px}.today-badge{background:#2563eb;color:#fff;font-weight:700}.cell-events{display:flex;flex-direction:column;gap:2px}.event-chip{display:flex;align-items:center;gap:3px;padding:2px 6px;width:100%;box-sizing:border-box;text-align:left;font-family:inherit;border:0;border-radius:4px;border-left:3px solid transparent;font-size:.6875rem;font-weight:500;cursor:pointer;overflow:hidden}.event-chip:hover{opacity:.85}.event-chip.stacked{flex-direction:column;align-items:flex-start;gap:0}.chip-head{display:inline-flex;align-items:center;gap:3px;flex-shrink:0}.chip-icon{flex-shrink:0}.chip-time{font-weight:700;flex-shrink:0;color:#1e293b}.chip-title{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#1e293b;min-width:0;max-width:100%}.strike{text-decoration:line-through}.chip-src{font-size:.625rem;font-weight:700;margin-left:auto;flex-shrink:0;color:#1e293b}.more-events{font-size:.6875rem;color:#2563eb;font-weight:600;cursor:pointer;padding:1px 6px;border:0;background:none;text-align:left;font-family:inherit}.more-events:hover{text-decoration:underline}.week-view{overflow:auto}.week-header{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;overflow-y:scroll}.time-gutter{border-right:1px solid #e2e8f0}.week-day-hdr{display:flex;flex-direction:column;align-items:center;padding:10px 4px;border-right:1px solid #f1f5f9}.week-day-hdr.today{background:#eff6ff}.week-day-hdr:last-child{border-right:none}.wdh-dow{font-size:.6875rem;font-weight:600;color:#6b7280;text-transform:uppercase}.wdh-num{width:28px;height:28px;line-height:28px;text-align:center;border-radius:50%;font-size:.9375rem;font-weight:600;color:#374151;margin-top:2px}.wdh-num.today-badge{background:#2563eb;color:#fff;font-weight:700}.allday-row{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:1px solid #e2e8f0;min-height:32px;flex-shrink:0;overflow-y:scroll}.allday-label{font-size:.625rem;color:#64748b;font-weight:600;text-transform:uppercase;display:flex;align-items:center;justify-content:center}.slot-add{position:absolute;top:2px;left:2px;z-index:3;width:1px;height:1px;padding:0;margin:0;overflow:hidden;clip-path:inset(50%);border:0;white-space:nowrap;font-family:inherit}.slot-add:focus,.slot-add:focus-visible{width:auto;height:auto;padding:2px 8px;clip-path:none;background:#1e293b;color:#fff;border-radius:4px;font-size:.75rem;font-weight:600}.allday-cell{position:relative;border-right:1px solid #f1f5f9;padding:3px 4px;display:flex;flex-direction:column;gap:2px;min-width:0}.allday-cell.clickable{cursor:pointer}.allday-cell:last-child{border-right:none}.allday-chip{padding:2px 6px;border:0;border-radius:4px;border-left:3px solid transparent;font-size:.6875rem;font-weight:500;color:#1e293b;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left;font-family:inherit}.allday-chip:hover{opacity:.85}.week-body{display:grid;grid-template-columns:60px repeat(7,1fr);flex:1;overflow-y:scroll}.time-col{display:flex;flex-direction:column;border-right:1px solid #e2e8f0;flex-shrink:0}.time-slot-label{height:60px;display:flex;align-items:flex-start;justify-content:flex-end;padding:4px 8px 0 0;font-size:.6875rem;color:#64748b;font-weight:500;border-bottom:1px solid #f1f5f9;flex-shrink:0;box-sizing:border-box}.day-col{position:relative;border-right:1px solid #f1f5f9;min-width:0}.day-col.clickable{cursor:pointer}.day-col:last-child{border-right:none}.day-col.today{background:#fafbff}.time-slot{height:60px;border-bottom:1px solid #f1f5f9;box-sizing:border-box}.day-col.clickable .time-slot:hover{background:#f8fafc}.timed-event{position:absolute;min-height:20px;border:0;border-radius:6px;padding:3px 6px;overflow:hidden;cursor:pointer;box-sizing:border-box;border-left:3px solid transparent;display:flex;flex-direction:column;align-items:flex-start;gap:1px;box-shadow:0 1px 3px #00000014;text-align:left;font-family:inherit}.timed-event:hover{opacity:.85}.te-title{font-size:.6875rem;font-weight:600;color:#1e293b;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.te-time{font-size:.625rem;color:#475569}.agenda-view{overflow-y:auto}.agenda-group{display:flex;border-bottom:1px solid #f1f5f9}.agenda-date-hdr{width:100px;flex-shrink:0;padding:16px 12px;display:flex;flex-direction:column;gap:4px;background:#f8fafc;border-right:2px solid #e2e8f0}.ag-dow{font-size:.6875rem;font-weight:700;color:#6b7280;text-transform:uppercase;letter-spacing:.04em}.ag-date{font-size:.8125rem;font-weight:600;color:#374151}.agenda-events{flex:1;display:flex;flex-direction:column;min-width:0}.agenda-event{display:flex;align-items:stretch;padding:10px 12px;cursor:pointer;border:0;border-bottom:1px solid #f8fafc;background:none;text-align:left;width:100%;font-family:inherit;transition:background .1s}.agenda-event:hover{background:#f8fafc}.agenda-event:last-child{border-bottom:none}.ae-color-bar{display:block;width:4px;border-radius:4px;flex-shrink:0;margin-right:12px}.ae-body{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.ae-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.ae-title{font-size:.9375rem;font-weight:600;color:#111827}.ae-meta{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.ae-meta-item{font-size:.8125rem;color:#6b7280}@media(pointer:coarse),(max-width:480px){.btn-nav,.btn-today,.filter-chip,.event-chip,.more-events,.allday-chip,.agenda-event{min-height:44px}.btn-nav{min-width:44px}}@media(max-width:768px){.cal-toolbar{grid-template-columns:1fr}.toolbar-center{display:none}.toolbar-left{flex-wrap:wrap}.toolbar-right{justify-content:flex-start}.mobile-summary{display:block;margin-bottom:4px;flex-shrink:0}.mobile-summary:empty{display:none}.filter-chips{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px;-webkit-overflow-scrolling:touch}.month-view,.cal-skeleton,.week-view{overflow-x:auto;-webkit-overflow-scrolling:touch}.month-grid,.skel-month-grid,.skel-dow-row{min-width:560px}.month-row{flex-basis:80px}.month-cell{min-height:80px}.week-header,.allday-row,.week-body{min-width:640px}.agenda-date-hdr{width:76px;padding:12px 8px}.ae-title{font-size:.875rem}}@media(max-width:640px){.event-chip.stacked.has-head .chip-title{display:none}}@media(max-width:480px){.dow-full{display:none}.dow-short{display:inline}}\n"]
35370
+ }]
35371
+ }],
35372
+ ctorParameters: () => [],
35373
+ propDecorators: {
35374
+ items: [{
35375
+ type: i0.Input,
35376
+ args: [{
35377
+ isSignal: true,
35378
+ alias: "items",
35379
+ required: false
35380
+ }]
35381
+ }],
35382
+ loading: [{
35383
+ type: i0.Input,
35384
+ args: [{
35385
+ isSignal: true,
35386
+ alias: "loading",
35387
+ required: false
35388
+ }]
35389
+ }],
35390
+ view: [{
35391
+ type: i0.Input,
35392
+ args: [{
35393
+ isSignal: true,
35394
+ alias: "view",
35395
+ required: false
35396
+ }]
35397
+ }, {
35398
+ type: i0.Output,
35399
+ args: ["viewChange"]
35400
+ }],
35401
+ views: [{
35402
+ type: i0.Input,
35403
+ args: [{
35404
+ isSignal: true,
35405
+ alias: "views",
35406
+ required: false
35407
+ }]
35408
+ }],
35409
+ anchorDate: [{
35410
+ type: i0.Input,
35411
+ args: [{
35412
+ isSignal: true,
35413
+ alias: "anchorDate",
35414
+ required: false
35415
+ }]
35416
+ }, {
35417
+ type: i0.Output,
35418
+ args: ["anchorDateChange"]
35419
+ }],
35420
+ filters: [{
35421
+ type: i0.Input,
35422
+ args: [{
35423
+ isSignal: true,
35424
+ alias: "filters",
35425
+ required: false
35426
+ }]
35427
+ }],
35428
+ filterLabel: [{
35429
+ type: i0.Input,
35430
+ args: [{
35431
+ isSignal: true,
35432
+ alias: "filterLabel",
35433
+ required: false
35434
+ }]
35435
+ }],
35436
+ filterMode: [{
35437
+ type: i0.Input,
35438
+ args: [{
35439
+ isSignal: true,
35440
+ alias: "filterMode",
35441
+ required: false
35442
+ }]
35443
+ }],
35444
+ activeFilters: [{
35445
+ type: i0.Input,
35446
+ args: [{
35447
+ isSignal: true,
35448
+ alias: "activeFilters",
35449
+ required: false
35450
+ }]
35451
+ }, {
35452
+ type: i0.Output,
35453
+ args: ["activeFiltersChange"]
35454
+ }],
35455
+ showFilterCounts: [{
35456
+ type: i0.Input,
35457
+ args: [{
35458
+ isSignal: true,
35459
+ alias: "showFilterCounts",
35460
+ required: false
35461
+ }]
35462
+ }],
35463
+ canCreate: [{
35464
+ type: i0.Input,
35465
+ args: [{
35466
+ isSignal: true,
35467
+ alias: "canCreate",
35468
+ required: false
35469
+ }]
35470
+ }],
35471
+ disablePast: [{
35472
+ type: i0.Input,
35473
+ args: [{
35474
+ isSignal: true,
35475
+ alias: "disablePast",
35476
+ required: false
35477
+ }]
35478
+ }],
35479
+ maxVisible: [{
35480
+ type: i0.Input,
35481
+ args: [{
35482
+ isSignal: true,
35483
+ alias: "maxVisible",
35484
+ required: false
35485
+ }]
35486
+ }],
35487
+ chipLayout: [{
35488
+ type: i0.Input,
35489
+ args: [{
35490
+ isSignal: true,
35491
+ alias: "chipLayout",
35492
+ required: false
35493
+ }]
35494
+ }],
35495
+ sortByTime: [{
35496
+ type: i0.Input,
35497
+ args: [{
35498
+ isSignal: true,
35499
+ alias: "sortByTime",
35500
+ required: false
35501
+ }]
35502
+ }],
35503
+ startHour: [{
35504
+ type: i0.Input,
35505
+ args: [{
35506
+ isSignal: true,
35507
+ alias: "startHour",
35508
+ required: false
35509
+ }]
35510
+ }],
35511
+ endHour: [{
35512
+ type: i0.Input,
35513
+ args: [{
35514
+ isSignal: true,
35515
+ alias: "endHour",
35516
+ required: false
35517
+ }]
35518
+ }],
35519
+ emptyMessage: [{
35520
+ type: i0.Input,
35521
+ args: [{
35522
+ isSignal: true,
35523
+ alias: "emptyMessage",
35524
+ required: false
35525
+ }]
35526
+ }],
35527
+ dayLabelFn: [{
35528
+ type: i0.Input,
35529
+ args: [{
35530
+ isSignal: true,
35531
+ alias: "dayLabelFn",
35532
+ required: false
35533
+ }]
35534
+ }],
35535
+ rangeChange: [{
35536
+ type: i0.Output,
35537
+ args: ["rangeChange"]
35538
+ }],
35539
+ itemClick: [{
35540
+ type: i0.Output,
35541
+ args: ["itemClick"]
35542
+ }],
35543
+ dateClick: [{
35544
+ type: i0.Output,
35545
+ args: ["dateClick"]
35546
+ }],
35547
+ slotClick: [{
35548
+ type: i0.Output,
35549
+ args: ["slotClick"]
35550
+ }],
35551
+ moreClick: [{
35552
+ type: i0.Output,
35553
+ args: ["moreClick"]
35554
+ }]
35555
+ }
35556
+ });
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 };
33560
36433
 
33561
36434
  //# sourceMappingURL=forgeroute-ui.mjs.map