@forgeroute/ui 0.4.72 → 0.4.73

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.
@@ -3827,6 +3827,9 @@ i0.ɵɵngDeclareClassMetadata({
3827
3827
  }
3828
3828
  });
3829
3829
  var ButtonComponent = class ButtonComponent {
3830
+ focus(options) {
3831
+ this._hostEl.nativeElement.querySelector("button.btn, a.btn")?.focus(options);
3832
+ }
3830
3833
  constructor() {
3831
3834
  this.variant = input("primary", ...ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []);
3832
3835
  this.routerLink = input(null, ...ngDevMode ? [{ debugName: "routerLink" }] : /* istanbul ignore next */ []);
@@ -3878,6 +3881,7 @@ var ButtonComponent = class ButtonComponent {
3878
3881
  this.ariaExpanded = input(void 0, ...ngDevMode ? [{ debugName: "ariaExpanded" }] : /* istanbul ignore next */ []);
3879
3882
  this.ariaPressed = input(void 0, ...ngDevMode ? [{ debugName: "ariaPressed" }] : /* istanbul ignore next */ []);
3880
3883
  this.ariaDescribedBy = input(void 0, ...ngDevMode ? [{ debugName: "ariaDescribedBy" }] : /* istanbul ignore next */ []);
3884
+ this._hostEl = inject(ElementRef);
3881
3885
  effect((onCleanup) => {
3882
3886
  const below = this.shortBelow();
3883
3887
  if (!this.shortLabel() || typeof below !== "number" || !Number.isFinite(below) || typeof window === "undefined" || typeof window.matchMedia !== "function") {
@@ -4640,8 +4644,12 @@ const EXTRA_ICONS = {
4640
4644
  "bank": "M3 21h18 M3 10h18 M5 6l7-3 7 3 M4 10v11 M20 10v11 M8 14v3 M12 14v3 M16 14v3",
4641
4645
  "unlink": "M18.84 12.25l1.72-1.71a5 5 0 0 0-7.07-7.07l-1.72 1.71 M5.17 11.75l-1.72 1.71a5 5 0 0 0 7.07 7.07l1.71-1.71 M3 3l18 18",
4642
4646
  "send": "M22 2L11 13 M22 2l-7 20-4-9-9-4 20-7z",
4643
- "refresh": "M23 4v6h-6 M1 20v-6h6 M3.51 9a9 9 0 0 1 14.85-3.36L23 10 M1 14l4.64 4.36A9 9 0 0 0 20.49 15"
4647
+ "refresh": "M23 4v6h-6 M1 20v-6h6 M3.51 9a9 9 0 0 1 14.85-3.36L23 10 M1 14l4.64 4.36A9 9 0 0 0 20.49 15",
4648
+ "search": "M11 3a8 8 0 1 0 0 16 8 8 0 0 0 0-16z M21 21l-4.35-4.35",
4649
+ "cup": "M18 8h1a4 4 0 0 1 0 8h-1 M2 8h16v9a4 4 0 0 1-4 4H6a4 4 0 0 1-4-4V8z M6 1v3 M10 1v3 M14 1v3",
4650
+ "wrench": "M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"
4644
4651
  };
4652
+ const ICON_NAMES = Object.freeze(Object.keys(EXTRA_ICONS));
4645
4653
  function iconPath(name) {
4646
4654
  return Object.prototype.hasOwnProperty.call(EXTRA_ICONS, name) ? EXTRA_ICONS[name] : builtInActionIcon(name);
4647
4655
  }
@@ -5063,6 +5071,9 @@ var TextInputComponent = class TextInputComponent {
5063
5071
  static {
5064
5072
  this._EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
5065
5073
  }
5074
+ focus(options) {
5075
+ this._fieldEl()?.nativeElement.focus(options);
5076
+ }
5066
5077
  constructor() {
5067
5078
  this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
5068
5079
  this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
@@ -5070,6 +5081,7 @@ var TextInputComponent = class TextInputComponent {
5070
5081
  this.inputName = input("", ...ngDevMode ? [{ debugName: "inputName" }] : /* istanbul ignore next */ []);
5071
5082
  this.placeholder = input("", ...ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []);
5072
5083
  this.prefix = input("", ...ngDevMode ? [{ debugName: "prefix" }] : /* istanbul ignore next */ []);
5084
+ this.leadingIcon = input("", ...ngDevMode ? [{ debugName: "leadingIcon" }] : /* istanbul ignore next */ []);
5073
5085
  this.revealable = input(false, ...ngDevMode ? [{ debugName: "revealable" }] : /* istanbul ignore next */ []);
5074
5086
  this.passwordRequirements = input(false, ...ngDevMode ? [{ debugName: "passwordRequirements" }] : /* istanbul ignore next */ []);
5075
5087
  this.passwordRules = input(void 0, ...ngDevMode ? [{ debugName: "passwordRules" }] : /* istanbul ignore next */ []);
@@ -5103,7 +5115,16 @@ var TextInputComponent = class TextInputComponent {
5103
5115
  this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
5104
5116
  this._value = signal("", ...ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []);
5105
5117
  this._reveal = createFieldReveal(this.showErrors);
5106
- this._prefixPadding = computed(() => this.prefix() ? `calc(12px + ${this.prefix().length}ch + 6px)` : null, ...ngDevMode ? [{ debugName: "_prefixPadding" }] : /* istanbul ignore next */ []);
5118
+ this._leadingD = computed(() => {
5119
+ const key = this.leadingIcon().trim();
5120
+ return key ? iconPath(key) ?? null : null;
5121
+ }, ...ngDevMode ? [{ debugName: "_leadingD" }] : /* istanbul ignore next */ []);
5122
+ this._prefixPadding = computed(() => {
5123
+ const icon = !!this._leadingD();
5124
+ if (this.prefix()) return icon ? `calc(36px + ${this.prefix().length}ch + 6px)` : `calc(12px + ${this.prefix().length}ch + 6px)`;
5125
+ return icon ? "36px" : null;
5126
+ }, ...ngDevMode ? [{ debugName: "_prefixPadding" }] : /* istanbul ignore next */ []);
5127
+ this._fieldEl = viewChild("field", ...ngDevMode ? [{ debugName: "_fieldEl" }] : /* istanbul ignore next */ []);
5107
5128
  this._numeric = computed(() => this.valueType() === "number" && this.type() === "number", ...ngDevMode ? [{ debugName: "_numeric" }] : /* istanbul ignore next */ []);
5108
5129
  this._stepAttr = computed(() => {
5109
5130
  const step = this.step();
@@ -5348,6 +5369,13 @@ var TextInputComponent = class TextInputComponent {
5348
5369
  isRequired: false,
5349
5370
  transformFunction: null
5350
5371
  },
5372
+ leadingIcon: {
5373
+ classPropertyName: "leadingIcon",
5374
+ publicName: "leadingIcon",
5375
+ isSignal: true,
5376
+ isRequired: false,
5377
+ transformFunction: null
5378
+ },
5351
5379
  revealable: {
5352
5380
  classPropertyName: "revealable",
5353
5381
  publicName: "revealable",
@@ -5525,11 +5553,18 @@ var TextInputComponent = class TextInputComponent {
5525
5553
  useExisting: forwardRef(() => TextInputComponent)
5526
5554
  }
5527
5555
  ],
5556
+ viewQueries: [{
5557
+ propertyName: "_fieldEl",
5558
+ first: true,
5559
+ predicate: ["field"],
5560
+ descendants: true,
5561
+ isSignal: true
5562
+ }],
5528
5563
  usesOnChanges: true,
5529
5564
  ngImport: i0,
5530
5565
  template: `
5531
5566
  <div class="ti-field" [class.ti-error]="_activeError()" [class.ti-disabled]="disabled()"
5532
- [class.ti-prefixed]="!!prefix() || _revealable()" [style.--ti-input-row]="(prefix() || _revealable()) ? (label() ? 2 : 1) : null">
5567
+ [class.ti-prefixed]="!!prefix() || _revealable() || !!_leadingD()" [style.--ti-input-row]="(prefix() || _revealable() || _leadingD()) ? (label() ? 2 : 1) : null">
5533
5568
  @if (label()) {
5534
5569
  <div class="ti-label-row">
5535
5570
  <label class="ti-label" [for]="_inputId">
@@ -5540,6 +5575,7 @@ var TextInputComponent = class TextInputComponent {
5540
5575
  </div>
5541
5576
  }
5542
5577
  <input
5578
+ #field
5543
5579
  class="ti-input"
5544
5580
  [style.padding-left]="_prefixPadding()"
5545
5581
  [style.padding-right]="_revealable() ? '44px' : null"
@@ -5563,9 +5599,13 @@ var TextInputComponent = class TextInputComponent {
5563
5599
  (focus)="onFocus()"
5564
5600
  (blur)="onBlur()"
5565
5601
  />
5602
+ @if (_leadingD(); as d) {
5603
+ <!-- Optional leading icon (library source 2026-11-04): decorative, laid over the input's left padding by the same grid as the prefix. -->
5604
+ <svg class="ti-leading-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path [attr.d]="d" /></svg>
5605
+ }
5566
5606
  @if (prefix()) {
5567
5607
  <!-- Optional leading mark ("$"): a sibling after the input, laid over it by the grid of .ti-prefixed, so toggling it never recreates the input (focus and caret stay). -->
5568
- <span class="ti-prefix" aria-hidden="true">{{ prefix() }}</span>
5608
+ <span class="ti-prefix" aria-hidden="true" [style.margin-left]="_leadingD() ? '36px' : null">{{ prefix() }}</span>
5569
5609
  }
5570
5610
  @if (_revealable()) {
5571
5611
  <!-- Show / hide toggle laid over the end of the input by the grid of .ti-prefixed. The name stays "Show password"; aria-pressed carries the state. -->
@@ -5587,7 +5627,7 @@ var TextInputComponent = class TextInputComponent {
5587
5627
  </div>
5588
5628
  `,
5589
5629
  isInline: true,
5590
- styles: [":host{display:block}.ti-field{display:flex;flex-direction:column;gap:6px}.ti-label-row{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.ti-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ti-required{color:#dc2626;margin-left:2px}.ti-prefixed{display:grid;grid-template-columns:minmax(0,1fr)}.ti-prefixed .ti-input{grid-row:var(--ti-input-row);grid-column:1}.ti-prefix{grid-row:var(--ti-input-row);grid-column:1;justify-self:start;align-self:center;margin-left:12px;font-size:.875rem;line-height:1;color:#64748b;pointer-events:none}@media(pointer:coarse),(max-width:480px){.ti-prefix{font-size:1rem}}.ti-disabled .ti-prefix{opacity:.5}.ti-reveal{grid-row:var(--ti-input-row);grid-column:1;justify-self:end;align-self:center;margin-right:6px;position:relative;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:0;border-radius:6px;background:transparent;color:#64748b;cursor:pointer}.ti-reveal:hover:not(:disabled){color:#1e293b;background:#f1f5f9}.ti-reveal:focus-visible{outline:2px solid #3b82f6;outline-offset:0}.ti-reveal:disabled{opacity:.5;cursor:not-allowed}@media(pointer:coarse),(max-width:480px){.ti-reveal{width:44px;height:44px;margin-right:0}}.ti-input{width:100%;box-sizing:border-box;padding:9px 12px;font-size:.875rem;font-family:inherit;color:#1e293b;background:#fff;border:1px solid #7c8ba1;border-radius:8px;outline:none;transition:border-color .15s,box-shadow .15s}.ti-input::placeholder{color:#64748b;opacity:1}.ti-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ti-input:read-only{background:#f8fafc;cursor:default}.ti-error .ti-input{border-color:#ef4444}.ti-error .ti-input:focus{box-shadow:0 0 0 3px #ef44441f}.ti-disabled .ti-input{opacity:.5;cursor:not-allowed}.ti-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ti-desc-error{color:#dc2626}@media(pointer:coarse),(max-width:480px){.ti-input{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.ti-input{min-height:44px}}\n"],
5630
+ styles: [":host{display:block}.ti-field{display:flex;flex-direction:column;gap:6px}.ti-label-row{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.ti-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ti-required{color:#dc2626;margin-left:2px}.ti-prefixed{display:grid;grid-template-columns:minmax(0,1fr)}.ti-prefixed .ti-input{grid-row:var(--ti-input-row);grid-column:1}.ti-prefix{grid-row:var(--ti-input-row);grid-column:1;justify-self:start;align-self:center;margin-left:12px;font-size:.875rem;line-height:1;color:#64748b;pointer-events:none}@media(pointer:coarse),(max-width:480px){.ti-prefix{font-size:1rem}}.ti-disabled .ti-prefix{opacity:.5}.ti-leading-icon{grid-row:var(--ti-input-row);grid-column:1;justify-self:start;align-self:center;margin-left:12px;color:#64748b;pointer-events:none}.ti-disabled .ti-leading-icon{opacity:.5}.ti-reveal{grid-row:var(--ti-input-row);grid-column:1;justify-self:end;align-self:center;margin-right:6px;position:relative;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:0;border-radius:6px;background:transparent;color:#64748b;cursor:pointer}.ti-reveal:hover:not(:disabled){color:#1e293b;background:#f1f5f9}.ti-reveal:focus-visible{outline:2px solid #3b82f6;outline-offset:0}.ti-reveal:disabled{opacity:.5;cursor:not-allowed}@media(pointer:coarse),(max-width:480px){.ti-reveal{width:44px;height:44px;margin-right:0}}.ti-input{width:100%;box-sizing:border-box;padding:9px 12px;font-size:.875rem;font-family:inherit;color:#1e293b;background:#fff;border:1px solid #7c8ba1;border-radius:8px;outline:none;transition:border-color .15s,box-shadow .15s}.ti-input::placeholder{color:#64748b;opacity:1}.ti-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ti-input:read-only{background:#f8fafc;cursor:default}.ti-error .ti-input{border-color:#ef4444}.ti-error .ti-input:focus{box-shadow:0 0 0 3px #ef44441f}.ti-disabled .ti-input{opacity:.5;cursor:not-allowed}.ti-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ti-desc-error{color:#dc2626}@media(pointer:coarse),(max-width:480px){.ti-input{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.ti-input{min-height:44px}}\n"],
5591
5631
  dependencies: [{
5592
5632
  kind: "component",
5593
5633
  type: PasswordRequirementsComponent,
@@ -5632,7 +5672,7 @@ i0.ɵɵngDeclareClassMetadata({
5632
5672
  ],
5633
5673
  template: `
5634
5674
  <div class="ti-field" [class.ti-error]="_activeError()" [class.ti-disabled]="disabled()"
5635
- [class.ti-prefixed]="!!prefix() || _revealable()" [style.--ti-input-row]="(prefix() || _revealable()) ? (label() ? 2 : 1) : null">
5675
+ [class.ti-prefixed]="!!prefix() || _revealable() || !!_leadingD()" [style.--ti-input-row]="(prefix() || _revealable() || _leadingD()) ? (label() ? 2 : 1) : null">
5636
5676
  @if (label()) {
5637
5677
  <div class="ti-label-row">
5638
5678
  <label class="ti-label" [for]="_inputId">
@@ -5643,6 +5683,7 @@ i0.ɵɵngDeclareClassMetadata({
5643
5683
  </div>
5644
5684
  }
5645
5685
  <input
5686
+ #field
5646
5687
  class="ti-input"
5647
5688
  [style.padding-left]="_prefixPadding()"
5648
5689
  [style.padding-right]="_revealable() ? '44px' : null"
@@ -5666,9 +5707,13 @@ i0.ɵɵngDeclareClassMetadata({
5666
5707
  (focus)="onFocus()"
5667
5708
  (blur)="onBlur()"
5668
5709
  />
5710
+ @if (_leadingD(); as d) {
5711
+ <!-- Optional leading icon (library source 2026-11-04): decorative, laid over the input's left padding by the same grid as the prefix. -->
5712
+ <svg class="ti-leading-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path [attr.d]="d" /></svg>
5713
+ }
5669
5714
  @if (prefix()) {
5670
5715
  <!-- Optional leading mark ("$"): a sibling after the input, laid over it by the grid of .ti-prefixed, so toggling it never recreates the input (focus and caret stay). -->
5671
- <span class="ti-prefix" aria-hidden="true">{{ prefix() }}</span>
5716
+ <span class="ti-prefix" aria-hidden="true" [style.margin-left]="_leadingD() ? '36px' : null">{{ prefix() }}</span>
5672
5717
  }
5673
5718
  @if (_revealable()) {
5674
5719
  <!-- Show / hide toggle laid over the end of the input by the grid of .ti-prefixed. The name stays "Show password"; aria-pressed carries the state. -->
@@ -5689,7 +5734,7 @@ i0.ɵɵngDeclareClassMetadata({
5689
5734
  }
5690
5735
  </div>
5691
5736
  `,
5692
- styles: [":host{display:block}.ti-field{display:flex;flex-direction:column;gap:6px}.ti-label-row{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.ti-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ti-required{color:#dc2626;margin-left:2px}.ti-prefixed{display:grid;grid-template-columns:minmax(0,1fr)}.ti-prefixed .ti-input{grid-row:var(--ti-input-row);grid-column:1}.ti-prefix{grid-row:var(--ti-input-row);grid-column:1;justify-self:start;align-self:center;margin-left:12px;font-size:.875rem;line-height:1;color:#64748b;pointer-events:none}@media(pointer:coarse),(max-width:480px){.ti-prefix{font-size:1rem}}.ti-disabled .ti-prefix{opacity:.5}.ti-reveal{grid-row:var(--ti-input-row);grid-column:1;justify-self:end;align-self:center;margin-right:6px;position:relative;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:0;border-radius:6px;background:transparent;color:#64748b;cursor:pointer}.ti-reveal:hover:not(:disabled){color:#1e293b;background:#f1f5f9}.ti-reveal:focus-visible{outline:2px solid #3b82f6;outline-offset:0}.ti-reveal:disabled{opacity:.5;cursor:not-allowed}@media(pointer:coarse),(max-width:480px){.ti-reveal{width:44px;height:44px;margin-right:0}}.ti-input{width:100%;box-sizing:border-box;padding:9px 12px;font-size:.875rem;font-family:inherit;color:#1e293b;background:#fff;border:1px solid #7c8ba1;border-radius:8px;outline:none;transition:border-color .15s,box-shadow .15s}.ti-input::placeholder{color:#64748b;opacity:1}.ti-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ti-input:read-only{background:#f8fafc;cursor:default}.ti-error .ti-input{border-color:#ef4444}.ti-error .ti-input:focus{box-shadow:0 0 0 3px #ef44441f}.ti-disabled .ti-input{opacity:.5;cursor:not-allowed}.ti-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ti-desc-error{color:#dc2626}@media(pointer:coarse),(max-width:480px){.ti-input{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.ti-input{min-height:44px}}\n"]
5737
+ styles: [":host{display:block}.ti-field{display:flex;flex-direction:column;gap:6px}.ti-label-row{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.ti-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ti-required{color:#dc2626;margin-left:2px}.ti-prefixed{display:grid;grid-template-columns:minmax(0,1fr)}.ti-prefixed .ti-input{grid-row:var(--ti-input-row);grid-column:1}.ti-prefix{grid-row:var(--ti-input-row);grid-column:1;justify-self:start;align-self:center;margin-left:12px;font-size:.875rem;line-height:1;color:#64748b;pointer-events:none}@media(pointer:coarse),(max-width:480px){.ti-prefix{font-size:1rem}}.ti-disabled .ti-prefix{opacity:.5}.ti-leading-icon{grid-row:var(--ti-input-row);grid-column:1;justify-self:start;align-self:center;margin-left:12px;color:#64748b;pointer-events:none}.ti-disabled .ti-leading-icon{opacity:.5}.ti-reveal{grid-row:var(--ti-input-row);grid-column:1;justify-self:end;align-self:center;margin-right:6px;position:relative;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:0;border-radius:6px;background:transparent;color:#64748b;cursor:pointer}.ti-reveal:hover:not(:disabled){color:#1e293b;background:#f1f5f9}.ti-reveal:focus-visible{outline:2px solid #3b82f6;outline-offset:0}.ti-reveal:disabled{opacity:.5;cursor:not-allowed}@media(pointer:coarse),(max-width:480px){.ti-reveal{width:44px;height:44px;margin-right:0}}.ti-input{width:100%;box-sizing:border-box;padding:9px 12px;font-size:.875rem;font-family:inherit;color:#1e293b;background:#fff;border:1px solid #7c8ba1;border-radius:8px;outline:none;transition:border-color .15s,box-shadow .15s}.ti-input::placeholder{color:#64748b;opacity:1}.ti-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ti-input:read-only{background:#f8fafc;cursor:default}.ti-error .ti-input{border-color:#ef4444}.ti-error .ti-input:focus{box-shadow:0 0 0 3px #ef44441f}.ti-disabled .ti-input{opacity:.5;cursor:not-allowed}.ti-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ti-desc-error{color:#dc2626}@media(pointer:coarse),(max-width:480px){.ti-input{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.ti-input{min-height:44px}}\n"]
5693
5738
  }]
5694
5739
  }],
5695
5740
  ctorParameters: () => [],
@@ -5742,6 +5787,14 @@ i0.ɵɵngDeclareClassMetadata({
5742
5787
  required: false
5743
5788
  }]
5744
5789
  }],
5790
+ leadingIcon: [{
5791
+ type: i0.Input,
5792
+ args: [{
5793
+ isSignal: true,
5794
+ alias: "leadingIcon",
5795
+ required: false
5796
+ }]
5797
+ }],
5745
5798
  revealable: [{
5746
5799
  type: i0.Input,
5747
5800
  args: [{
@@ -5933,6 +5986,10 @@ i0.ɵɵngDeclareClassMetadata({
5933
5986
  alias: "disabled",
5934
5987
  required: false
5935
5988
  }]
5989
+ }],
5990
+ _fieldEl: [{
5991
+ type: i0.ViewChild,
5992
+ args: ["field", { isSignal: true }]
5936
5993
  }]
5937
5994
  }
5938
5995
  });
@@ -6274,7 +6331,7 @@ var TableToolbarComponent = class TableToolbarComponent {
6274
6331
  </ui-modal>
6275
6332
  `,
6276
6333
  isInline: true,
6277
- styles: [":host{display:inline-flex;max-width:100%}.toolbar{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.toolbar-item{position:relative}.toolbar-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:6px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#334155;cursor:pointer;font-family:inherit;white-space:nowrap;transition:background .1s,border-color .1s}.toolbar-btn:hover{background:#f8fafc}.toolbar-btn.toolbar-btn-active{border-color:#1e293b;background:#f8fafc}.toolbar-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}.toolbar-badge{display:inline-flex;align-items:center;justify-content:center;background:#1e293b;color:#fff;border-radius:999px;font-size:.625rem;font-weight:700;min-width:16px;height:16px;padding:0 4px}.toolbar-primary-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:6px;border:none;background:#2563eb;color:#fff;font-size:.8125rem;font-weight:600;cursor:pointer;font-family:inherit;white-space:nowrap;transition:background .1s}.toolbar-primary-btn:hover{background:#1d4ed8}.toolbar-primary-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}.more-dropdown{position:absolute;top:calc(100% + 6px);right:0;z-index:200;background:#fff;border:1px solid #e2e8f0;border-radius:10px;box-shadow:0 4px 6px #0000000a,0 12px 28px #0000001a;min-width:200px;overflow:hidden}.more-option{display:flex;align-items:center;gap:10px;width:100%;padding:10px 14px;background:none;border:none;border-bottom:1px solid #f1f5f9;font-size:.875rem;color:#1e293b;font-family:inherit;text-align:left;cursor:pointer;transition:background .1s}.more-option:last-child{border-bottom:none}.more-option:hover{background:#f8fafc}.more-option:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.more-badge{margin-left:auto;display:inline-flex;align-items:center;justify-content:center;background:#1e293b;color:#fff;border-radius:999px;font-size:.625rem;font-weight:700;min-width:16px;height:16px;padding:0 4px}.more-divider{height:1px;background:#f1f5f9;margin:2px 0}.more-view-name{font-size:.75rem;color:#64748b;max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-list{display:grid;grid-template-columns:1fr 1fr;max-height:340px;overflow-y:auto}@media(max-width:480px){.col-list{grid-template-columns:1fr}}@media(max-width:1024px){.toolbar-btn{padding:8px 12px}.toolbar-primary-btn{padding:8px 14px}}@media(pointer:coarse){.toolbar-btn,.toolbar-primary-btn{min-height:44px}}@media(max-width:640px){:host{display:flex;width:100%}.toolbar{width:100%;justify-content:flex-end}.toolbar-btn{padding:10px 12px;font-size:.8125rem;min-height:44px}.toolbar-primary-btn{padding:10px 14px;font-size:.8125rem;min-height:44px}.more-dropdown{max-height:calc(100vh - 140px);overflow-y:auto}.more-option{padding:12px 16px;font-size:.9375rem}}.col-option{display:flex;padding:9px 4px;border-bottom:1px solid #f1f5f9;transition:background .1s;border-radius:6px}.col-option:hover{background:#f8fafc}.col-option:nth-last-child(-n+2){border-bottom:none}.view-list{max-height:360px;overflow-y:auto;margin:0 -24px}.view-empty{padding:16px 24px;font-size:.9rem;color:#94a3b8;margin:0}.view-option{display:flex;align-items:center;padding-right:16px;border-bottom:1px solid #f1f5f9;transition:background .1s}.view-option:last-child{border-bottom:none}.view-option:hover{background:#f8fafc}.view-option.view-active{background:#eff6ff}.view-select-btn{flex:1;padding:12px 8px 12px 24px;background:none;border:none;font-size:.9rem;color:#334155;cursor:pointer;font-family:inherit;text-align:left}.view-delete-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:5px;background:none;border:none;cursor:pointer;color:#94a3b8}.view-delete-btn:hover{color:#dc2626;background:#fef2f2}\n"],
6334
+ styles: [":host{display:inline-flex;max-width:100%}.toolbar{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.toolbar-item{position:relative}.toolbar-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:6px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#334155;cursor:pointer;font-family:inherit;white-space:nowrap;transition:background .1s,border-color .1s}.toolbar-btn:hover{background:#f8fafc}.toolbar-btn.toolbar-btn-active{border-color:#1e293b;background:#f8fafc}.toolbar-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}.toolbar-badge{display:inline-flex;align-items:center;justify-content:center;background:#1e293b;color:#fff;border-radius:999px;font-size:.625rem;font-weight:700;min-width:16px;height:16px;padding:0 4px}.toolbar-primary-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:6px;border:none;background:#2563eb;color:#fff;font-size:.8125rem;font-weight:600;cursor:pointer;font-family:inherit;white-space:nowrap;transition:background .1s}.toolbar-primary-btn:hover{background:#1d4ed8}.toolbar-primary-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}.more-dropdown{position:absolute;top:calc(100% + 6px);right:0;z-index:200;background:#fff;border:1px solid #e2e8f0;border-radius:10px;box-shadow:0 4px 6px #0000000a,0 12px 28px #0000001a;min-width:200px;overflow:hidden}.more-option{display:flex;align-items:center;gap:10px;width:100%;padding:10px 14px;background:none;border:none;border-bottom:1px solid #f1f5f9;font-size:.875rem;color:#1e293b;font-family:inherit;text-align:left;cursor:pointer;transition:background .1s}.more-option:last-child{border-bottom:none}.more-option:hover{background:#f8fafc}.more-option:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.more-badge{margin-left:auto;display:inline-flex;align-items:center;justify-content:center;background:#1e293b;color:#fff;border-radius:999px;font-size:.625rem;font-weight:700;min-width:16px;height:16px;padding:0 4px}.more-divider{height:1px;background:#f1f5f9;margin:2px 0}.more-view-name{font-size:.75rem;color:#64748b;max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-list{display:grid;grid-template-columns:1fr 1fr;max-height:340px;overflow-y:auto}@media(max-width:480px){.col-list{grid-template-columns:1fr}}@media(max-width:1024px){.toolbar-btn{padding:8px 12px}.toolbar-primary-btn{padding:8px 14px}}@media(pointer:coarse){.toolbar-btn,.toolbar-primary-btn{min-height:44px}}@media(max-width:640px){:host{display:flex;width:100%;min-width:0}.toolbar{width:100%;min-width:0;justify-content:flex-end;flex-wrap:wrap}.toolbar-btn{padding:10px 12px;font-size:.8125rem;min-height:44px}.toolbar-primary-btn{padding:10px 14px;font-size:.8125rem;min-height:44px}.toolbar-btn,.toolbar-primary-btn{max-width:100%;white-space:normal;text-align:center;justify-content:center;line-height:1.25;overflow-wrap:anywhere}.toolbar-item{min-width:0;max-width:100%;display:flex}.more-dropdown{max-height:calc(100vh - 140px);overflow-y:auto}.more-option{padding:12px 16px;font-size:.9375rem}}.col-option{display:flex;padding:9px 4px;border-bottom:1px solid #f1f5f9;transition:background .1s;border-radius:6px}.col-option:hover{background:#f8fafc}.col-option:nth-last-child(-n+2){border-bottom:none}.view-list{max-height:360px;overflow-y:auto;margin:0 -24px}.view-empty{padding:16px 24px;font-size:.9rem;color:#94a3b8;margin:0}.view-option{display:flex;align-items:center;padding-right:16px;border-bottom:1px solid #f1f5f9;transition:background .1s}.view-option:last-child{border-bottom:none}.view-option:hover{background:#f8fafc}.view-option.view-active{background:#eff6ff}.view-select-btn{flex:1;padding:12px 8px 12px 24px;background:none;border:none;font-size:.9rem;color:#334155;cursor:pointer;font-family:inherit;text-align:left}.view-delete-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:5px;background:none;border:none;cursor:pointer;color:#94a3b8}.view-delete-btn:hover{color:#dc2626;background:#fef2f2}\n"],
6278
6335
  dependencies: [
6279
6336
  {
6280
6337
  kind: "ngmodule",
@@ -6398,6 +6455,7 @@ var TableToolbarComponent = class TableToolbarComponent {
6398
6455
  "inputName",
6399
6456
  "placeholder",
6400
6457
  "prefix",
6458
+ "leadingIcon",
6401
6459
  "revealable",
6402
6460
  "passwordRequirements",
6403
6461
  "passwordRules",
@@ -6594,7 +6652,7 @@ i0.ɵɵngDeclareClassMetadata({
6594
6652
  <ui-button modal-footer-right variant="primary" size="sm" [disabled]="!_saveViewName.trim()" (click)="confirmSaveName()"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg> Save</ui-button>
6595
6653
  </ui-modal>
6596
6654
  `,
6597
- styles: [":host{display:inline-flex;max-width:100%}.toolbar{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.toolbar-item{position:relative}.toolbar-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:6px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#334155;cursor:pointer;font-family:inherit;white-space:nowrap;transition:background .1s,border-color .1s}.toolbar-btn:hover{background:#f8fafc}.toolbar-btn.toolbar-btn-active{border-color:#1e293b;background:#f8fafc}.toolbar-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}.toolbar-badge{display:inline-flex;align-items:center;justify-content:center;background:#1e293b;color:#fff;border-radius:999px;font-size:.625rem;font-weight:700;min-width:16px;height:16px;padding:0 4px}.toolbar-primary-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:6px;border:none;background:#2563eb;color:#fff;font-size:.8125rem;font-weight:600;cursor:pointer;font-family:inherit;white-space:nowrap;transition:background .1s}.toolbar-primary-btn:hover{background:#1d4ed8}.toolbar-primary-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}.more-dropdown{position:absolute;top:calc(100% + 6px);right:0;z-index:200;background:#fff;border:1px solid #e2e8f0;border-radius:10px;box-shadow:0 4px 6px #0000000a,0 12px 28px #0000001a;min-width:200px;overflow:hidden}.more-option{display:flex;align-items:center;gap:10px;width:100%;padding:10px 14px;background:none;border:none;border-bottom:1px solid #f1f5f9;font-size:.875rem;color:#1e293b;font-family:inherit;text-align:left;cursor:pointer;transition:background .1s}.more-option:last-child{border-bottom:none}.more-option:hover{background:#f8fafc}.more-option:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.more-badge{margin-left:auto;display:inline-flex;align-items:center;justify-content:center;background:#1e293b;color:#fff;border-radius:999px;font-size:.625rem;font-weight:700;min-width:16px;height:16px;padding:0 4px}.more-divider{height:1px;background:#f1f5f9;margin:2px 0}.more-view-name{font-size:.75rem;color:#64748b;max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-list{display:grid;grid-template-columns:1fr 1fr;max-height:340px;overflow-y:auto}@media(max-width:480px){.col-list{grid-template-columns:1fr}}@media(max-width:1024px){.toolbar-btn{padding:8px 12px}.toolbar-primary-btn{padding:8px 14px}}@media(pointer:coarse){.toolbar-btn,.toolbar-primary-btn{min-height:44px}}@media(max-width:640px){:host{display:flex;width:100%}.toolbar{width:100%;justify-content:flex-end}.toolbar-btn{padding:10px 12px;font-size:.8125rem;min-height:44px}.toolbar-primary-btn{padding:10px 14px;font-size:.8125rem;min-height:44px}.more-dropdown{max-height:calc(100vh - 140px);overflow-y:auto}.more-option{padding:12px 16px;font-size:.9375rem}}.col-option{display:flex;padding:9px 4px;border-bottom:1px solid #f1f5f9;transition:background .1s;border-radius:6px}.col-option:hover{background:#f8fafc}.col-option:nth-last-child(-n+2){border-bottom:none}.view-list{max-height:360px;overflow-y:auto;margin:0 -24px}.view-empty{padding:16px 24px;font-size:.9rem;color:#94a3b8;margin:0}.view-option{display:flex;align-items:center;padding-right:16px;border-bottom:1px solid #f1f5f9;transition:background .1s}.view-option:last-child{border-bottom:none}.view-option:hover{background:#f8fafc}.view-option.view-active{background:#eff6ff}.view-select-btn{flex:1;padding:12px 8px 12px 24px;background:none;border:none;font-size:.9rem;color:#334155;cursor:pointer;font-family:inherit;text-align:left}.view-delete-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:5px;background:none;border:none;cursor:pointer;color:#94a3b8}.view-delete-btn:hover{color:#dc2626;background:#fef2f2}\n"]
6655
+ styles: [":host{display:inline-flex;max-width:100%}.toolbar{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.toolbar-item{position:relative}.toolbar-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:6px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#334155;cursor:pointer;font-family:inherit;white-space:nowrap;transition:background .1s,border-color .1s}.toolbar-btn:hover{background:#f8fafc}.toolbar-btn.toolbar-btn-active{border-color:#1e293b;background:#f8fafc}.toolbar-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}.toolbar-badge{display:inline-flex;align-items:center;justify-content:center;background:#1e293b;color:#fff;border-radius:999px;font-size:.625rem;font-weight:700;min-width:16px;height:16px;padding:0 4px}.toolbar-primary-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:6px;border:none;background:#2563eb;color:#fff;font-size:.8125rem;font-weight:600;cursor:pointer;font-family:inherit;white-space:nowrap;transition:background .1s}.toolbar-primary-btn:hover{background:#1d4ed8}.toolbar-primary-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}.more-dropdown{position:absolute;top:calc(100% + 6px);right:0;z-index:200;background:#fff;border:1px solid #e2e8f0;border-radius:10px;box-shadow:0 4px 6px #0000000a,0 12px 28px #0000001a;min-width:200px;overflow:hidden}.more-option{display:flex;align-items:center;gap:10px;width:100%;padding:10px 14px;background:none;border:none;border-bottom:1px solid #f1f5f9;font-size:.875rem;color:#1e293b;font-family:inherit;text-align:left;cursor:pointer;transition:background .1s}.more-option:last-child{border-bottom:none}.more-option:hover{background:#f8fafc}.more-option:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.more-badge{margin-left:auto;display:inline-flex;align-items:center;justify-content:center;background:#1e293b;color:#fff;border-radius:999px;font-size:.625rem;font-weight:700;min-width:16px;height:16px;padding:0 4px}.more-divider{height:1px;background:#f1f5f9;margin:2px 0}.more-view-name{font-size:.75rem;color:#64748b;max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-list{display:grid;grid-template-columns:1fr 1fr;max-height:340px;overflow-y:auto}@media(max-width:480px){.col-list{grid-template-columns:1fr}}@media(max-width:1024px){.toolbar-btn{padding:8px 12px}.toolbar-primary-btn{padding:8px 14px}}@media(pointer:coarse){.toolbar-btn,.toolbar-primary-btn{min-height:44px}}@media(max-width:640px){:host{display:flex;width:100%;min-width:0}.toolbar{width:100%;min-width:0;justify-content:flex-end;flex-wrap:wrap}.toolbar-btn{padding:10px 12px;font-size:.8125rem;min-height:44px}.toolbar-primary-btn{padding:10px 14px;font-size:.8125rem;min-height:44px}.toolbar-btn,.toolbar-primary-btn{max-width:100%;white-space:normal;text-align:center;justify-content:center;line-height:1.25;overflow-wrap:anywhere}.toolbar-item{min-width:0;max-width:100%;display:flex}.more-dropdown{max-height:calc(100vh - 140px);overflow-y:auto}.more-option{padding:12px 16px;font-size:.9375rem}}.col-option{display:flex;padding:9px 4px;border-bottom:1px solid #f1f5f9;transition:background .1s;border-radius:6px}.col-option:hover{background:#f8fafc}.col-option:nth-last-child(-n+2){border-bottom:none}.view-list{max-height:360px;overflow-y:auto;margin:0 -24px}.view-empty{padding:16px 24px;font-size:.9rem;color:#94a3b8;margin:0}.view-option{display:flex;align-items:center;padding-right:16px;border-bottom:1px solid #f1f5f9;transition:background .1s}.view-option:last-child{border-bottom:none}.view-option:hover{background:#f8fafc}.view-option.view-active{background:#eff6ff}.view-select-btn{flex:1;padding:12px 8px 12px 24px;background:none;border:none;font-size:.9rem;color:#334155;cursor:pointer;font-family:inherit;text-align:left}.view-delete-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:5px;background:none;border:none;cursor:pointer;color:#94a3b8}.view-delete-btn:hover{color:#dc2626;background:#fef2f2}\n"]
6598
6656
  }]
6599
6657
  }],
6600
6658
  propDecorators: {
@@ -7475,6 +7533,7 @@ var SelectComponent = class SelectComponent {
7475
7533
  constructor() {
7476
7534
  this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
7477
7535
  this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
7536
+ this.labelHidden = input(false, ...ngDevMode ? [{ debugName: "labelHidden" }] : /* istanbul ignore next */ []);
7478
7537
  this.inputName = input("", ...ngDevMode ? [{ debugName: "inputName" }] : /* istanbul ignore next */ []);
7479
7538
  this.placeholder = input("", ...ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []);
7480
7539
  this.options = input([], ...ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []);
@@ -7507,6 +7566,7 @@ var SelectComponent = class SelectComponent {
7507
7566
  this._activeError = computed(() => this.error() || (this._reveal.revealed() ? this.errorMessage() : ""), ...ngDevMode ? [{ debugName: "_activeError" }] : /* istanbul ignore next */ []);
7508
7567
  this._onValidatorChange = () => {};
7509
7568
  this._selectId = `sl-${Math.random().toString(36).slice(2, 8)}`;
7569
+ this._hostEl = inject(ElementRef);
7510
7570
  this._onChange = (_) => {};
7511
7571
  this._warned = false;
7512
7572
  this._onTouched = () => {};
@@ -7523,6 +7583,9 @@ var SelectComponent = class SelectComponent {
7523
7583
  registerOnValidatorChange(fn) {
7524
7584
  this._onValidatorChange = fn;
7525
7585
  }
7586
+ focus(options) {
7587
+ this._hostEl.nativeElement.querySelector("select")?.focus(options);
7588
+ }
7526
7589
  _norm(key) {
7527
7590
  if (this.valueType() !== "number") return key;
7528
7591
  const t = key.trim();
@@ -7611,6 +7674,13 @@ var SelectComponent = class SelectComponent {
7611
7674
  isRequired: false,
7612
7675
  transformFunction: null
7613
7676
  },
7677
+ labelHidden: {
7678
+ classPropertyName: "labelHidden",
7679
+ publicName: "labelHidden",
7680
+ isSignal: true,
7681
+ isRequired: false,
7682
+ transformFunction: null
7683
+ },
7614
7684
  inputName: {
7615
7685
  classPropertyName: "inputName",
7616
7686
  publicName: "inputName",
@@ -7713,7 +7783,7 @@ var SelectComponent = class SelectComponent {
7713
7783
  ngImport: i0,
7714
7784
  template: `
7715
7785
  <div class="sl-field" [class.sl-error]="_activeError()" [class.sl-disabled]="disabled()">
7716
- @if (label()) {
7786
+ @if (label() && !labelHidden()) {
7717
7787
  <label class="sl-label" [for]="_selectId">
7718
7788
  {{ label() }}
7719
7789
  @if (required()) { <span class="sl-required" aria-hidden="true">*</span> }
@@ -7726,7 +7796,7 @@ var SelectComponent = class SelectComponent {
7726
7796
  [attr.name]="inputName() || null"
7727
7797
  [disabled]="disabled()"
7728
7798
  [attr.required]="required() || null"
7729
- [attr.aria-label]="ariaLabel() || null"
7799
+ [attr.aria-label]="ariaLabel() || (labelHidden() ? label() : '') || null"
7730
7800
  [attr.aria-invalid]="_activeError() ? 'true' : null"
7731
7801
  [attr.aria-describedby]="_describedBy() || null"
7732
7802
  (change)="onChange($event)"
@@ -7785,7 +7855,7 @@ i0.ɵɵngDeclareClassMetadata({
7785
7855
  ],
7786
7856
  template: `
7787
7857
  <div class="sl-field" [class.sl-error]="_activeError()" [class.sl-disabled]="disabled()">
7788
- @if (label()) {
7858
+ @if (label() && !labelHidden()) {
7789
7859
  <label class="sl-label" [for]="_selectId">
7790
7860
  {{ label() }}
7791
7861
  @if (required()) { <span class="sl-required" aria-hidden="true">*</span> }
@@ -7798,7 +7868,7 @@ i0.ɵɵngDeclareClassMetadata({
7798
7868
  [attr.name]="inputName() || null"
7799
7869
  [disabled]="disabled()"
7800
7870
  [attr.required]="required() || null"
7801
- [attr.aria-label]="ariaLabel() || null"
7871
+ [attr.aria-label]="ariaLabel() || (labelHidden() ? label() : '') || null"
7802
7872
  [attr.aria-invalid]="_activeError() ? 'true' : null"
7803
7873
  [attr.aria-describedby]="_describedBy() || null"
7804
7874
  (change)="onChange($event)"
@@ -7843,6 +7913,14 @@ i0.ɵɵngDeclareClassMetadata({
7843
7913
  required: false
7844
7914
  }]
7845
7915
  }],
7916
+ labelHidden: [{
7917
+ type: i0.Input,
7918
+ args: [{
7919
+ isSignal: true,
7920
+ alias: "labelHidden",
7921
+ required: false
7922
+ }]
7923
+ }],
7846
7924
  inputName: [{
7847
7925
  type: i0.Input,
7848
7926
  args: [{
@@ -7952,6 +8030,7 @@ var ToastService = class ToastService {
7952
8030
  this.dismissible = signal(false, ...ngDevMode ? [{ debugName: "dismissible" }] : /* istanbul ignore next */ []);
7953
8031
  this.persistentLiveRegion = signal(false, ...ngDevMode ? [{ debugName: "persistentLiveRegion" }] : /* istanbul ignore next */ []);
7954
8032
  this.details = signal(null, ...ngDevMode ? [{ debugName: "details" }] : /* istanbul ignore next */ []);
8033
+ this.repeatTick = signal(0, ...ngDevMode ? [{ debugName: "repeatTick" }] : /* istanbul ignore next */ []);
7955
8034
  this.queuedCount = signal(0, ...ngDevMode ? [{ debugName: "queuedCount" }] : /* istanbul ignore next */ []);
7956
8035
  this.queueDefault = signal(false, ...ngDevMode ? [{ debugName: "queueDefault" }] : /* istanbul ignore next */ []);
7957
8036
  this.countdownDefault = signal(false, ...ngDevMode ? [{ debugName: "countdownDefault" }] : /* istanbul ignore next */ []);
@@ -8069,6 +8148,12 @@ var ToastService = class ToastService {
8069
8148
  duration: options.duration ?? defaultDuration,
8070
8149
  details
8071
8150
  };
8151
+ if (options.repeat && this.message() === msg && this.type() === type) {
8152
+ this._clearAdvance();
8153
+ this.repeatTick.update((n) => n + 1);
8154
+ this._present(pending);
8155
+ return;
8156
+ }
8072
8157
  const queue = options.queue ?? this.queueDefault();
8073
8158
  const busy = this.message() !== null || this._advanceTimer !== null;
8074
8159
  if (queue && busy) {
@@ -8202,6 +8287,7 @@ var ToastComponent = class ToastComponent {
8202
8287
  this.countdownLabel = input("Dismissing in {n}s", ...ngDevMode ? [{ debugName: "countdownLabel" }] : /* istanbul ignore next */ []);
8203
8288
  this.queueLabel = input("+{n} more", ...ngDevMode ? [{ debugName: "queueLabel" }] : /* istanbul ignore next */ []);
8204
8289
  this.action = output();
8290
+ this.repeatKeys = computed(() => [this.toast.repeatTick()], ...ngDevMode ? [{ debugName: "repeatKeys" }] : /* istanbul ignore next */ []);
8205
8291
  this.isRich = computed(() => {
8206
8292
  const d = this.toast.details();
8207
8293
  return !!d && (!!d.title || d.actions.length > 0 || d.countdown);
@@ -8217,6 +8303,7 @@ var ToastComponent = class ToastComponent {
8217
8303
  const m = this._adoptedMessage();
8218
8304
  return m !== null && m === this.toast.message();
8219
8305
  }, ...ngDevMode ? [{ debugName: "adopted" }] : /* istanbul ignore next */ []);
8306
+ this._lastRepeatTick = this.toast.repeatTick();
8220
8307
  this._wasWaiting = false;
8221
8308
  this._hover = false;
8222
8309
  this._focus = false;
@@ -8237,7 +8324,13 @@ var ToastComponent = class ToastComponent {
8237
8324
  effect(() => {
8238
8325
  const host = this.isHost();
8239
8326
  const msg = this.toast.message();
8327
+ const tick = this.toast.repeatTick();
8240
8328
  untracked(() => {
8329
+ if (tick !== this._lastRepeatTick) {
8330
+ this._lastRepeatTick = tick;
8331
+ if (host) this._adoptedMessage.set(null);
8332
+ this._focus = false;
8333
+ }
8241
8334
  if (msg === null) {
8242
8335
  this._hover = false;
8243
8336
  this._focus = false;
@@ -8337,6 +8430,7 @@ var ToastComponent = class ToastComponent {
8337
8430
  }
8338
8431
 
8339
8432
  <ng-template #card>
8433
+ @for (k of repeatKeys(); track k) {
8340
8434
  <div
8341
8435
  class="t-toast"
8342
8436
  [class.t-rich]="isRich()"
@@ -8397,6 +8491,7 @@ var ToastComponent = class ToastComponent {
8397
8491
  }
8398
8492
  }
8399
8493
  </div>
8494
+ }
8400
8495
  </ng-template>
8401
8496
  `,
8402
8497
  isInline: true,
@@ -8441,6 +8536,7 @@ i0.ɵɵngDeclareClassMetadata({
8441
8536
  }
8442
8537
 
8443
8538
  <ng-template #card>
8539
+ @for (k of repeatKeys(); track k) {
8444
8540
  <div
8445
8541
  class="t-toast"
8446
8542
  [class.t-rich]="isRich()"
@@ -8501,6 +8597,7 @@ i0.ɵɵngDeclareClassMetadata({
8501
8597
  }
8502
8598
  }
8503
8599
  </div>
8600
+ }
8504
8601
  </ng-template>
8505
8602
  `,
8506
8603
  styles: [".t-live{position:absolute;width:0;height:0;margin:0;padding:0;overflow:visible}.t-toast{position:fixed;bottom:max(24px,env(safe-area-inset-bottom,0px));left:50%;transform:translate(-50%);background:#047857;color:#fff;padding:11px 20px;border-radius:12px;font-size:.875rem;font-weight:500;z-index:9999;box-shadow:0 4px 16px #0000002e;animation:t-in .28s cubic-bezier(.16,1,.3,1);display:flex;align-items:center;gap:8px;max-width:calc(100vw - 32px - env(safe-area-inset-left,0px) - env(safe-area-inset-right,0px));overflow-wrap:anywhere;word-break:break-word}.t-error{background:#dc2626}.t-info{background:#2563eb}.t-adopted{animation:none}.t-text{min-width:0}.t-close{position:relative;flex:none;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;margin:-4px -10px -4px 0;padding:0;border:0;border-radius:50%;background:transparent;color:inherit;cursor:pointer}.t-close:after{content:\"\";position:absolute;inset:-8px}.t-close:hover{background:#fff3}.t-close:focus-visible{outline:2px solid #fff;outline-offset:1px}.t-rich{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:start;column-gap:8px;row-gap:10px;min-width:min(320px,calc(100vw - 32px))}.t-rich>svg:first-child{margin-top:2px}.t-content{display:flex;flex-direction:column;gap:2px;min-width:0}.t-title{font-weight:700}.t-queue{grid-column:1 / -1;justify-self:end;font-size:.75rem;font-weight:600;padding:1px 8px;border-radius:999px;background:#ffffff38}.t-actions{grid-column:1 / -1;display:flex;flex-wrap:wrap;gap:8px}.t-action{min-height:32px;padding:6px 14px;border-radius:8px;font:inherit;font-size:.8125rem;font-weight:600;cursor:pointer;color:#fff;background:#ffffff2e;border:1px solid rgba(255,255,255,.6)}.t-action:hover:not(:disabled){background:#ffffff4d}.t-action:focus-visible{outline:2px solid #fff;outline-offset:2px}.t-action:disabled{opacity:.5;cursor:not-allowed}.t-action-primary{background:#fff;color:#0f172a;border-color:#fff}.t-action-primary:hover:not(:disabled){background:#f1f5f9}.t-action-danger{background:#7f1d1d;border-color:#ffffffb3}.t-action-danger:hover:not(:disabled){background:#991b1b}.t-countdown{grid-column:1 / -1;display:flex;flex-direction:column;gap:4px}.t-countdown-bar{height:4px;border-radius:2px;background:#ffffff47;overflow:hidden}.t-countdown-fill{height:100%;background:#fff;transition:width .2s linear}.t-countdown-label{font-size:.75rem;opacity:.85;font-variant-numeric:tabular-nums}@media(prefers-reduced-motion:reduce){.t-countdown-fill{transition:none}}@media(pointer:coarse),(max-width:480px){.t-action{min-height:44px}}@keyframes t-in{0%{opacity:0;transform:translate(-50%) translateY(10px)}to{opacity:1;transform:translate(-50%) translateY(0)}}@media(prefers-reduced-motion:reduce){.t-toast{animation:none}}@media(max-width:480px){.t-toast{bottom:max(16px,env(safe-area-inset-bottom,16px));font-size:.8125rem;padding:10px 16px}}\n"]
@@ -8636,6 +8733,7 @@ var DetailCardComponent = class DetailCardComponent {
8636
8733
  this.background = input("", ...ngDevMode ? [{ debugName: "background" }] : /* istanbul ignore next */ []);
8637
8734
  this.headerBackground = input("", ...ngDevMode ? [{ debugName: "headerBackground" }] : /* istanbul ignore next */ []);
8638
8735
  this.footerBackground = input("", ...ngDevMode ? [{ debugName: "footerBackground" }] : /* istanbul ignore next */ []);
8736
+ this.footerAlign = input("start", ...ngDevMode ? [{ debugName: "footerAlign" }] : /* istanbul ignore next */ []);
8639
8737
  this.textColor = input("", ...ngDevMode ? [{ debugName: "textColor" }] : /* istanbul ignore next */ []);
8640
8738
  this.showHeader = input(true, ...ngDevMode ? [{ debugName: "showHeader" }] : /* istanbul ignore next */ []);
8641
8739
  this.collapsible = input(true, ...ngDevMode ? [{ debugName: "collapsible" }] : /* istanbul ignore next */ []);
@@ -8760,6 +8858,13 @@ var DetailCardComponent = class DetailCardComponent {
8760
8858
  isRequired: false,
8761
8859
  transformFunction: null
8762
8860
  },
8861
+ footerAlign: {
8862
+ classPropertyName: "footerAlign",
8863
+ publicName: "footerAlign",
8864
+ isSignal: true,
8865
+ isRequired: false,
8866
+ transformFunction: null
8867
+ },
8763
8868
  textColor: {
8764
8869
  classPropertyName: "textColor",
8765
8870
  publicName: "textColor",
@@ -8924,11 +9029,11 @@ var DetailCardComponent = class DetailCardComponent {
8924
9029
  <ng-content />
8925
9030
  </div>
8926
9031
  </div>
8927
- <div class="dc-footer" [class.dc-footer--hidden]="!isOpen()" [style.background]="footerBackground() || null"><ng-content select="[card-footer]" /></div>
9032
+ <div class="dc-footer" [class.dc-footer--hidden]="!isOpen()" [class.dc-footer--end]="footerAlign() === 'end'" [style.background]="footerBackground() || null"><ng-content select="[card-footer]" /></div>
8928
9033
  </div>
8929
9034
  `,
8930
9035
  isInline: true,
8931
- 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.dc-fill .dc-body{display:flex;flex-direction:column}.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-has-bg .dc-header.open{border-bottom-color:#94a3b859}.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:.8125rem;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-action{display:inline-flex;align-items:center;justify-content:center;gap:5px;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;cursor:pointer;white-space:nowrap;transition:background-color .15s ease,color .15s ease}.dc-edit-action:hover{background:#f1f5f9;color:#1e293b}.dc-edit-action:focus-visible{outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}@media(pointer:coarse),(max-width:480px){.dc-edit-action{min-height:44px}}.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{box-sizing:border-box;padding:16px 18px;min-height:0;overflow-x:hidden;overflow-y:auto;max-height:var(--dc-body-max-height, none)}.dc-footer{padding:10px 18px;border-top:1px solid #f1f5f9}.dc-footer:empty,.dc-footer.dc-footer--hidden{display:none}.dc-has-bg .dc-footer{border-top-color:#94a3b859}@media(max-width:480px){.dc-footer{padding:10px 14px}.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"],
9036
+ 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.dc-fill .dc-body{display:flex;flex-direction:column}.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-has-bg .dc-header.open{border-bottom-color:#94a3b859}.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:.8125rem;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-action{display:inline-flex;align-items:center;justify-content:center;gap:5px;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;cursor:pointer;white-space:nowrap;transition:background-color .15s ease,color .15s ease}.dc-edit-action:hover{background:#f1f5f9;color:#1e293b}.dc-edit-action:focus-visible{outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}@media(pointer:coarse),(max-width:480px){.dc-edit-action{min-height:44px}}.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{box-sizing:border-box;padding:16px 18px;min-height:0;overflow-x:hidden;overflow-y:auto;max-height:var(--dc-body-max-height, none)}.dc-footer{padding:10px 18px;border-top:1px solid #f1f5f9}.dc-footer:empty,.dc-footer.dc-footer--hidden{display:none}.dc-footer.dc-footer--end:not(:empty):not(.dc-footer--hidden){display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:8px}.dc-has-bg .dc-footer{border-top-color:#94a3b859}@media(max-width:480px){.dc-footer{padding:10px 14px}.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"],
8932
9037
  dependencies: [{
8933
9038
  kind: "component",
8934
9039
  type: ButtonComponent,
@@ -9025,10 +9130,10 @@ i0.ɵɵngDeclareClassMetadata({
9025
9130
  <ng-content />
9026
9131
  </div>
9027
9132
  </div>
9028
- <div class="dc-footer" [class.dc-footer--hidden]="!isOpen()" [style.background]="footerBackground() || null"><ng-content select="[card-footer]" /></div>
9133
+ <div class="dc-footer" [class.dc-footer--hidden]="!isOpen()" [class.dc-footer--end]="footerAlign() === 'end'" [style.background]="footerBackground() || null"><ng-content select="[card-footer]" /></div>
9029
9134
  </div>
9030
9135
  `,
9031
- 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.dc-fill .dc-body{display:flex;flex-direction:column}.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-has-bg .dc-header.open{border-bottom-color:#94a3b859}.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:.8125rem;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-action{display:inline-flex;align-items:center;justify-content:center;gap:5px;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;cursor:pointer;white-space:nowrap;transition:background-color .15s ease,color .15s ease}.dc-edit-action:hover{background:#f1f5f9;color:#1e293b}.dc-edit-action:focus-visible{outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}@media(pointer:coarse),(max-width:480px){.dc-edit-action{min-height:44px}}.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{box-sizing:border-box;padding:16px 18px;min-height:0;overflow-x:hidden;overflow-y:auto;max-height:var(--dc-body-max-height, none)}.dc-footer{padding:10px 18px;border-top:1px solid #f1f5f9}.dc-footer:empty,.dc-footer.dc-footer--hidden{display:none}.dc-has-bg .dc-footer{border-top-color:#94a3b859}@media(max-width:480px){.dc-footer{padding:10px 14px}.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"]
9136
+ 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.dc-fill .dc-body{display:flex;flex-direction:column}.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-has-bg .dc-header.open{border-bottom-color:#94a3b859}.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:.8125rem;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-action{display:inline-flex;align-items:center;justify-content:center;gap:5px;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;cursor:pointer;white-space:nowrap;transition:background-color .15s ease,color .15s ease}.dc-edit-action:hover{background:#f1f5f9;color:#1e293b}.dc-edit-action:focus-visible{outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}@media(pointer:coarse),(max-width:480px){.dc-edit-action{min-height:44px}}.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{box-sizing:border-box;padding:16px 18px;min-height:0;overflow-x:hidden;overflow-y:auto;max-height:var(--dc-body-max-height, none)}.dc-footer{padding:10px 18px;border-top:1px solid #f1f5f9}.dc-footer:empty,.dc-footer.dc-footer--hidden{display:none}.dc-footer.dc-footer--end:not(:empty):not(.dc-footer--hidden){display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:8px}.dc-has-bg .dc-footer{border-top-color:#94a3b859}@media(max-width:480px){.dc-footer{padding:10px 14px}.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"]
9032
9137
  }]
9033
9138
  }],
9034
9139
  propDecorators: {
@@ -9104,6 +9209,14 @@ i0.ɵɵngDeclareClassMetadata({
9104
9209
  required: false
9105
9210
  }]
9106
9211
  }],
9212
+ footerAlign: [{
9213
+ type: i0.Input,
9214
+ args: [{
9215
+ isSignal: true,
9216
+ alias: "footerAlign",
9217
+ required: false
9218
+ }]
9219
+ }],
9107
9220
  textColor: [{
9108
9221
  type: i0.Input,
9109
9222
  args: [{
@@ -9415,6 +9528,7 @@ var OptionCardComponent = class OptionCardComponent {
9415
9528
  "background",
9416
9529
  "headerBackground",
9417
9530
  "footerBackground",
9531
+ "footerAlign",
9418
9532
  "textColor",
9419
9533
  "showHeader",
9420
9534
  "collapsible",
@@ -10622,6 +10736,7 @@ var ImportExportComponent = class ImportExportComponent {
10622
10736
  inputs: [
10623
10737
  "label",
10624
10738
  "ariaLabel",
10739
+ "labelHidden",
10625
10740
  "inputName",
10626
10741
  "placeholder",
10627
10742
  "options",
@@ -10984,73 +11099,6 @@ i0.ɵɵngDeclareClassMetadata({
10984
11099
  }]
10985
11100
  }
10986
11101
  });
10987
- var ConfirmService = class ConfirmService {
10988
- constructor() {
10989
- this._open = signal(false, ...ngDevMode ? [{ debugName: "_open" }] : /* istanbul ignore next */ []);
10990
- this._active = signal(null, ...ngDevMode ? [{ debugName: "_active" }] : /* istanbul ignore next */ []);
10991
- this._resolve = null;
10992
- this.open = this._open.asReadonly();
10993
- this.active = this._active.asReadonly();
10994
- this._outlets = signal([], ...ngDevMode ? [{ debugName: "_outlets" }] : /* istanbul ignore next */ []);
10995
- this.primaryOutlet = computed(() => this._outlets()[0] ?? null, ...ngDevMode ? [{ debugName: "primaryOutlet" }] : /* istanbul ignore next */ []);
10996
- }
10997
- registerOutlet(outlet) {
10998
- this._outlets.update((list) => [...list, outlet]);
10999
- }
11000
- unregisterOutlet(outlet) {
11001
- this._outlets.update((list) => list.filter((o) => o !== outlet));
11002
- }
11003
- confirm(config) {
11004
- return new Promise((resolve) => {
11005
- this._resolve = resolve;
11006
- this._active.set({
11007
- title: config.title,
11008
- message: config.message,
11009
- confirmLabel: config.confirmLabel ?? "Confirm",
11010
- cancelLabel: config.cancelLabel ?? "Cancel",
11011
- variant: config.variant ?? "danger",
11012
- details: config.details ?? []
11013
- });
11014
- this._open.set(true);
11015
- });
11016
- }
11017
- dismiss(confirmed) {
11018
- this._open.set(false);
11019
- const res = this._resolve;
11020
- this._resolve = null;
11021
- this._active.set(null);
11022
- res?.(confirmed);
11023
- }
11024
- static {
11025
- this.ɵfac = i0.ɵɵngDeclareFactory({
11026
- minVersion: "12.0.0",
11027
- version: "22.2.2",
11028
- ngImport: i0,
11029
- type: ConfirmService,
11030
- deps: [],
11031
- target: i0.ɵɵFactoryTarget.Injectable
11032
- });
11033
- }
11034
- static {
11035
- this.ɵprov = i0.ɵɵngDeclareInjectable({
11036
- minVersion: "12.0.0",
11037
- version: "22.2.2",
11038
- ngImport: i0,
11039
- type: ConfirmService,
11040
- providedIn: "root"
11041
- });
11042
- }
11043
- };
11044
- i0.ɵɵngDeclareClassMetadata({
11045
- minVersion: "12.0.0",
11046
- version: "22.2.2",
11047
- ngImport: i0,
11048
- type: ConfirmService,
11049
- decorators: [{
11050
- type: Injectable,
11051
- args: [{ providedIn: "root" }]
11052
- }]
11053
- });
11054
11102
  var ConfirmOutletComponent = class ConfirmOutletComponent {
11055
11103
  constructor() {
11056
11104
  this.svc = inject(ConfirmService);
@@ -11088,6 +11136,7 @@ var ConfirmOutletComponent = class ConfirmOutletComponent {
11088
11136
  @if (_isPrimary() && svc.active()) {
11089
11137
  <ui-modal
11090
11138
  data-testid="confirm-modal"
11139
+ dialogTestId="confirm-dialog"
11091
11140
  [open]="svc.open()"
11092
11141
  [title]="svc.active()!.title"
11093
11142
  maxWidth="420px"
@@ -11186,6 +11235,7 @@ i0.ɵɵngDeclareClassMetadata({
11186
11235
  @if (_isPrimary() && svc.active()) {
11187
11236
  <ui-modal
11188
11237
  data-testid="confirm-modal"
11238
+ dialogTestId="confirm-dialog"
11189
11239
  [open]="svc.open()"
11190
11240
  [title]="svc.active()!.title"
11191
11241
  maxWidth="420px"
@@ -11215,6 +11265,107 @@ i0.ɵɵngDeclareClassMetadata({
11215
11265
  }]
11216
11266
  }]
11217
11267
  });
11268
+ var ConfirmService = class ConfirmService {
11269
+ constructor() {
11270
+ this._appRef = inject(ApplicationRef);
11271
+ this._envInjector = inject(EnvironmentInjector);
11272
+ this._doc = inject(DOCUMENT);
11273
+ this._browser = isPlatformBrowser(inject(PLATFORM_ID));
11274
+ this._open = signal(false, ...ngDevMode ? [{ debugName: "_open" }] : /* istanbul ignore next */ []);
11275
+ this._active = signal(null, ...ngDevMode ? [{ debugName: "_active" }] : /* istanbul ignore next */ []);
11276
+ this._resolve = null;
11277
+ this.open = this._open.asReadonly();
11278
+ this.active = this._active.asReadonly();
11279
+ this._outlets = signal([], ...ngDevMode ? [{ debugName: "_outlets" }] : /* istanbul ignore next */ []);
11280
+ this.primaryOutlet = computed(() => this._outlets()[0] ?? null, ...ngDevMode ? [{ debugName: "primaryOutlet" }] : /* istanbul ignore next */ []);
11281
+ this._auto = null;
11282
+ this._retireAutoOnDismiss = false;
11283
+ }
11284
+ registerOutlet(outlet) {
11285
+ this._outlets.update((list) => [...list, outlet]);
11286
+ if (this._auto && outlet !== this._auto.instance) {
11287
+ if (this._open()) this._retireAutoOnDismiss = true;
11288
+ else this._destroyAuto();
11289
+ }
11290
+ }
11291
+ unregisterOutlet(outlet) {
11292
+ this._outlets.update((list) => list.filter((o) => o !== outlet));
11293
+ }
11294
+ ngOnDestroy() {
11295
+ this._destroyAuto();
11296
+ }
11297
+ _ensureOutlet() {
11298
+ if (this._outlets().length > 0) return;
11299
+ if (!this._browser) return;
11300
+ const body = this._doc.body;
11301
+ const ref = createComponent(ConfirmOutletComponent, { environmentInjector: this._envInjector });
11302
+ this._appRef.attachView(ref.hostView);
11303
+ body.appendChild(ref.location.nativeElement);
11304
+ this._auto = ref;
11305
+ ref.changeDetectorRef.detectChanges();
11306
+ }
11307
+ _destroyAuto() {
11308
+ const ref = this._auto;
11309
+ if (!ref) return;
11310
+ this._auto = null;
11311
+ this._retireAutoOnDismiss = false;
11312
+ const el = ref.location.nativeElement;
11313
+ ref.destroy();
11314
+ el.remove();
11315
+ }
11316
+ confirm(config) {
11317
+ return new Promise((resolve) => {
11318
+ this._resolve = resolve;
11319
+ this._active.set({
11320
+ title: config.title,
11321
+ message: config.message,
11322
+ confirmLabel: config.confirmLabel ?? "Confirm",
11323
+ cancelLabel: config.cancelLabel ?? "Cancel",
11324
+ variant: config.variant ?? "danger",
11325
+ details: config.details ?? []
11326
+ });
11327
+ this._open.set(true);
11328
+ this._ensureOutlet();
11329
+ });
11330
+ }
11331
+ dismiss(confirmed) {
11332
+ this._open.set(false);
11333
+ const res = this._resolve;
11334
+ this._resolve = null;
11335
+ this._active.set(null);
11336
+ res?.(confirmed);
11337
+ if (this._retireAutoOnDismiss) this._destroyAuto();
11338
+ }
11339
+ static {
11340
+ this.ɵfac = i0.ɵɵngDeclareFactory({
11341
+ minVersion: "12.0.0",
11342
+ version: "22.2.2",
11343
+ ngImport: i0,
11344
+ type: ConfirmService,
11345
+ deps: [],
11346
+ target: i0.ɵɵFactoryTarget.Injectable
11347
+ });
11348
+ }
11349
+ static {
11350
+ this.ɵprov = i0.ɵɵngDeclareInjectable({
11351
+ minVersion: "12.0.0",
11352
+ version: "22.2.2",
11353
+ ngImport: i0,
11354
+ type: ConfirmService,
11355
+ providedIn: "root"
11356
+ });
11357
+ }
11358
+ };
11359
+ i0.ɵɵngDeclareClassMetadata({
11360
+ minVersion: "12.0.0",
11361
+ version: "22.2.2",
11362
+ ngImport: i0,
11363
+ type: ConfirmService,
11364
+ decorators: [{
11365
+ type: Injectable,
11366
+ args: [{ providedIn: "root" }]
11367
+ }]
11368
+ });
11218
11369
  var EmptyStateComponent = class EmptyStateComponent {
11219
11370
  constructor() {
11220
11371
  this.message = input("", ...ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []);
@@ -11443,6 +11594,7 @@ i0.ɵɵngDeclareClassMetadata({
11443
11594
  });
11444
11595
  var ErrorStateComponent = class ErrorStateComponent {
11445
11596
  constructor() {
11597
+ this.title = input("", ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
11446
11598
  this.message = input("", ...ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []);
11447
11599
  this.retryLabel = input("Try again", ...ngDevMode ? [{ debugName: "retryLabel" }] : /* istanbul ignore next */ []);
11448
11600
  this.retrying = input(false, ...ngDevMode ? [{ debugName: "retrying" }] : /* istanbul ignore next */ []);
@@ -11466,6 +11618,13 @@ var ErrorStateComponent = class ErrorStateComponent {
11466
11618
  isStandalone: true,
11467
11619
  selector: "ui-error-state",
11468
11620
  inputs: {
11621
+ title: {
11622
+ classPropertyName: "title",
11623
+ publicName: "title",
11624
+ isSignal: true,
11625
+ isRequired: false,
11626
+ transformFunction: null
11627
+ },
11469
11628
  message: {
11470
11629
  classPropertyName: "message",
11471
11630
  publicName: "message",
@@ -11499,6 +11658,9 @@ var ErrorStateComponent = class ErrorStateComponent {
11499
11658
  <line x1="12" y1="16" x2="12.01" y2="16" stroke-width="2.5"/>
11500
11659
  </svg>
11501
11660
  </div>
11661
+ @if (title()) {
11662
+ <p class="es-title">{{ title() }}</p>
11663
+ }
11502
11664
  <p class="es-message">{{ message() || 'Something went wrong. Please try again.' }}</p>
11503
11665
  @if (retryLabel()) {
11504
11666
  <ui-button variant="secondary" size="sm" [loading]="retrying()" (click)="retry.emit()">
@@ -11508,7 +11670,7 @@ var ErrorStateComponent = class ErrorStateComponent {
11508
11670
  </div>
11509
11671
  `,
11510
11672
  isInline: true,
11511
- styles: [":host{display:flex;flex:1}.es-wrap{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:48px 24px;text-align:center;flex:1;min-height:160px}.es-icon{width:56px;height:56px;border-radius:50%;background:#fee2e2;color:#ef4444;display:flex;align-items:center;justify-content:center;flex-shrink:0}.es-message{margin:0;font-size:.875rem;color:#64748b;max-width:360px;line-height:1.5}\n"],
11673
+ styles: [":host{display:flex;flex:1}.es-wrap{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:48px 24px;text-align:center;flex:1;min-height:160px}.es-icon{width:56px;height:56px;border-radius:50%;background:#fee2e2;color:#ef4444;display:flex;align-items:center;justify-content:center;flex-shrink:0}.es-title{margin:0;font-size:1rem;font-weight:600;color:#1e293b;line-height:1.4}.es-message{margin:0;font-size:.875rem;color:#64748b;max-width:360px;line-height:1.5}\n"],
11512
11674
  dependencies: [{
11513
11675
  kind: "component",
11514
11676
  type: ButtonComponent,
@@ -11564,6 +11726,9 @@ i0.ɵɵngDeclareClassMetadata({
11564
11726
  <line x1="12" y1="16" x2="12.01" y2="16" stroke-width="2.5"/>
11565
11727
  </svg>
11566
11728
  </div>
11729
+ @if (title()) {
11730
+ <p class="es-title">{{ title() }}</p>
11731
+ }
11567
11732
  <p class="es-message">{{ message() || 'Something went wrong. Please try again.' }}</p>
11568
11733
  @if (retryLabel()) {
11569
11734
  <ui-button variant="secondary" size="sm" [loading]="retrying()" (click)="retry.emit()">
@@ -11572,10 +11737,18 @@ i0.ɵɵngDeclareClassMetadata({
11572
11737
  }
11573
11738
  </div>
11574
11739
  `,
11575
- styles: [":host{display:flex;flex:1}.es-wrap{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:48px 24px;text-align:center;flex:1;min-height:160px}.es-icon{width:56px;height:56px;border-radius:50%;background:#fee2e2;color:#ef4444;display:flex;align-items:center;justify-content:center;flex-shrink:0}.es-message{margin:0;font-size:.875rem;color:#64748b;max-width:360px;line-height:1.5}\n"]
11740
+ styles: [":host{display:flex;flex:1}.es-wrap{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:48px 24px;text-align:center;flex:1;min-height:160px}.es-icon{width:56px;height:56px;border-radius:50%;background:#fee2e2;color:#ef4444;display:flex;align-items:center;justify-content:center;flex-shrink:0}.es-title{margin:0;font-size:1rem;font-weight:600;color:#1e293b;line-height:1.4}.es-message{margin:0;font-size:.875rem;color:#64748b;max-width:360px;line-height:1.5}\n"]
11576
11741
  }]
11577
11742
  }],
11578
11743
  propDecorators: {
11744
+ title: [{
11745
+ type: i0.Input,
11746
+ args: [{
11747
+ isSignal: true,
11748
+ alias: "title",
11749
+ required: false
11750
+ }]
11751
+ }],
11579
11752
  message: [{
11580
11753
  type: i0.Input,
11581
11754
  args: [{
@@ -12284,6 +12457,7 @@ var DataTableComponent = class DataTableComponent {
12284
12457
  this.tabChange = output();
12285
12458
  this.bulkAction = output();
12286
12459
  this.bulkPanelClick = output();
12460
+ this.loaded = output();
12287
12461
  this.rowDeleted = output();
12288
12462
  this.reorderable = input(false, ...ngDevMode ? [{ debugName: "reorderable" }] : /* istanbul ignore next */ []);
12289
12463
  this.rowReorder = output();
@@ -12312,7 +12486,7 @@ var DataTableComponent = class DataTableComponent {
12312
12486
  const active = this._activeTab();
12313
12487
  const keys = Object.keys(counts).length > 0 && active && !present.includes(active) ? [...present, active] : present;
12314
12488
  if (!keys.length) return [];
12315
- const toLabel = (s) => this._columnBadgeLabel(s) ?? (/[a-z]/.test(s) ? s : s.toLowerCase()).replace(/([a-z])([A-Z])/g, "$1 $2").replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
12489
+ const toLabel = (s) => this._columnBadgeLabel(s) ?? (/[a-z]/.test(s) ? s : s.toLowerCase()).replace(/([a-z])([A-Z])/g, "$1 $2").replace(/-/g, " ").replace(/(^|\s)\p{L}/gu, (c) => c.toUpperCase());
12316
12490
  const singleValue = keys.length === 1;
12317
12491
  return [{
12318
12492
  value: "",
@@ -12653,6 +12827,10 @@ var DataTableComponent = class DataTableComponent {
12653
12827
  }
12654
12828
  this._loading.set(false);
12655
12829
  this._searchLoading.set(false);
12830
+ this.loaded.emit({
12831
+ ok: response !== null,
12832
+ total: this._total()
12833
+ });
12656
12834
  });
12657
12835
  }
12658
12836
  _countParams() {
@@ -13431,6 +13609,7 @@ var DataTableComponent = class DataTableComponent {
13431
13609
  tabChange: "tabChange",
13432
13610
  bulkAction: "bulkAction",
13433
13611
  bulkPanelClick: "bulkPanelClick",
13612
+ loaded: "loaded",
13434
13613
  rowDeleted: "rowDeleted",
13435
13614
  rowReorder: "rowReorder"
13436
13615
  },
@@ -14393,6 +14572,7 @@ var DataTableComponent = class DataTableComponent {
14393
14572
  inputs: [
14394
14573
  "label",
14395
14574
  "ariaLabel",
14575
+ "labelHidden",
14396
14576
  "inputName",
14397
14577
  "placeholder",
14398
14578
  "options",
@@ -14478,6 +14658,7 @@ var DataTableComponent = class DataTableComponent {
14478
14658
  type: ErrorStateComponent,
14479
14659
  selector: "ui-error-state",
14480
14660
  inputs: [
14661
+ "title",
14481
14662
  "message",
14482
14663
  "retryLabel",
14483
14664
  "retrying"
@@ -15512,6 +15693,10 @@ i0.ɵɵngDeclareClassMetadata({
15512
15693
  type: i0.Output,
15513
15694
  args: ["bulkPanelClick"]
15514
15695
  }],
15696
+ loaded: [{
15697
+ type: i0.Output,
15698
+ args: ["loaded"]
15699
+ }],
15515
15700
  rowDeleted: [{
15516
15701
  type: i0.Output,
15517
15702
  args: ["rowDeleted"]
@@ -15552,6 +15737,9 @@ var SidePanelComponent = class SidePanelComponent {
15552
15737
  this.closed = output();
15553
15738
  this.primaryClick = output();
15554
15739
  this.titleId = `sp-title-${Math.random().toString(36).slice(2, 8)}`;
15740
+ this.bodyScrollable = signal(false, ...ngDevMode ? [{ debugName: "bodyScrollable" }] : /* istanbul ignore next */ []);
15741
+ this._bodyRef = viewChild("spBody", ...ngDevMode ? [{ debugName: "_bodyRef" }] : /* istanbul ignore next */ []);
15742
+ this._bodyObservers = null;
15555
15743
  this._el = inject(ElementRef);
15556
15744
  this._doc = inject(DOCUMENT);
15557
15745
  this._overlays = inject(OverlayStack);
@@ -15561,6 +15749,10 @@ var SidePanelComponent = class SidePanelComponent {
15561
15749
  this._stopIframeKeys = null;
15562
15750
  this._interaction = inject(LastInteraction);
15563
15751
  this._interaction.acquire(this._doc);
15752
+ effect(() => {
15753
+ const body = this._bodyRef()?.nativeElement ?? null;
15754
+ untracked(() => this._watchBody(body));
15755
+ });
15564
15756
  effect(() => {
15565
15757
  if (this.open()) {
15566
15758
  this._overlays.push(this);
@@ -15588,6 +15780,41 @@ var SidePanelComponent = class SidePanelComponent {
15588
15780
  }
15589
15781
  });
15590
15782
  }
15783
+ refreshScrollable() {
15784
+ const el = this._bodyRef()?.nativeElement;
15785
+ this.bodyScrollable.set(!!el && el.scrollHeight - el.clientHeight > 1);
15786
+ }
15787
+ _watchBody(body) {
15788
+ this._stopWatchingBody();
15789
+ if (!body) {
15790
+ this.bodyScrollable.set(false);
15791
+ return;
15792
+ }
15793
+ this.refreshScrollable();
15794
+ const ro = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(() => this.refreshScrollable());
15795
+ const mo = typeof MutationObserver === "undefined" ? null : new MutationObserver(() => {
15796
+ if (ro) for (const child of Array.from(body.children)) ro.observe(child);
15797
+ this.refreshScrollable();
15798
+ });
15799
+ if (ro) {
15800
+ ro.observe(body);
15801
+ for (const child of Array.from(body.children)) ro.observe(child);
15802
+ }
15803
+ mo?.observe(body, {
15804
+ childList: true,
15805
+ subtree: true,
15806
+ characterData: true
15807
+ });
15808
+ this._bodyObservers = {
15809
+ ro,
15810
+ mo
15811
+ };
15812
+ }
15813
+ _stopWatchingBody() {
15814
+ this._bodyObservers?.ro?.disconnect();
15815
+ this._bodyObservers?.mo?.disconnect();
15816
+ this._bodyObservers = null;
15817
+ }
15591
15818
  onKeydown(event) {
15592
15819
  if (!this.open() || !this._overlays.isTop(this)) return;
15593
15820
  if (event.key === "Escape") {
@@ -15627,6 +15854,7 @@ var SidePanelComponent = class SidePanelComponent {
15627
15854
  return tabbables(this._el.nativeElement);
15628
15855
  }
15629
15856
  ngOnDestroy() {
15857
+ this._stopWatchingBody();
15630
15858
  this._interaction.release();
15631
15859
  this._stopIframeKeys?.();
15632
15860
  this._stopIframeKeys = null;
@@ -15750,6 +15978,13 @@ var SidePanelComponent = class SidePanelComponent {
15750
15978
  primaryClick: "primaryClick"
15751
15979
  },
15752
15980
  host: { listeners: { "document:keydown": "onKeydown($event)" } },
15981
+ viewQueries: [{
15982
+ propertyName: "_bodyRef",
15983
+ first: true,
15984
+ predicate: ["spBody"],
15985
+ descendants: true,
15986
+ isSignal: true
15987
+ }],
15753
15988
  ngImport: i0,
15754
15989
  template: `
15755
15990
  @if (open()) {
@@ -15778,7 +16013,12 @@ var SidePanelComponent = class SidePanelComponent {
15778
16013
  </div>
15779
16014
 
15780
16015
  <!-- Body -->
15781
- <div class="sp-body">
16016
+ <div
16017
+ class="sp-body"
16018
+ #spBody
16019
+ [attr.tabindex]="bodyScrollable() ? 0 : null"
16020
+ [attr.role]="bodyScrollable() ? 'group' : null"
16021
+ [attr.aria-labelledby]="bodyScrollable() ? titleId : null">
15782
16022
  <ng-content />
15783
16023
  </div>
15784
16024
 
@@ -15821,7 +16061,7 @@ var SidePanelComponent = class SidePanelComponent {
15821
16061
  }
15822
16062
  `,
15823
16063
  isInline: true,
15824
- styles: [".sp-backdrop{position:fixed;inset:0;background:#0000004d;z-index:90;animation:sp-fade .2s ease}.sp-panel{position:fixed;top:0;right:0;bottom:var(--ui-kb, 0px);width:480px;max-width:100vw;max-height:100vh;max-height:var(--ui-vvh, 100dvh);background:#fff;z-index:100;box-shadow:-4px 0 20px #0000001a;display:flex;flex-direction:column;animation:sp-slide .25s ease}.sp-panel:focus{outline:none}.sp-focus-guard{position:absolute;width:1px;height:1px;padding:0;margin:-1px;border:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;outline:none}.sp-wide{width:620px}.sp-extra-wide{width:760px}.sp-header{display:flex;justify-content:space-between;align-items:center;padding:24px 24px 20px;gap:12px;flex-shrink:0;background:linear-gradient(135deg,#1e293b,#334155)}.sp-header-text{flex:1;min-width:0}.sp-title{font-size:1.125rem;font-weight:700;color:#fff;margin:0}.sp-subtitle{font-size:.8125rem;color:#94a3b8;margin:4px 0 0}.sp-close{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:36px;height:36px;border-radius:8px;border:1px solid rgba(255,255,255,.2);background:#ffffff1a;cursor:pointer;color:#cbd5e1;transition:background .15s,border-color .15s}.sp-close:hover{background:#fff3;border-color:#ffffff4d;color:#fff}.sp-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-body{padding:20px 24px 24px;flex:1;overflow-y:auto;overflow-x:hidden}.sp-footer{display:flex;align-items:center;justify-content:space-between;flex-shrink:0;padding:14px 24px calc(14px + env(safe-area-inset-bottom,0px));border-top:1px solid #e2e8f0;background:#f8fafc}.sp-footer-extra{display:flex;align-items:center;justify-content:center;gap:8px;flex:1 1 auto;margin:0 8px;min-width:0}.sp-footer-extra:empty{display:none}.sp-btn{display:inline-flex;align-items:center;gap:7px;padding:8px 18px;border-radius:7px;font-size:.875rem;font-weight:500;font-family:inherit;cursor:pointer;white-space:nowrap;transition:background .1s,border-color .1s,opacity .1s}.sp-btn:disabled{opacity:.5;cursor:default}.sp-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-btn-cancel{background:#fff;border:1px solid #e2e8f0;color:#475569}.sp-btn-cancel:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.sp-btn-primary{background:var(--ui-accent, #2563eb);border:1px solid var(--ui-accent, #2563eb);color:var(--ui-on-accent, #fff)}.sp-btn-primary:hover:not(:disabled){background:var(--ui-accent-hover, #1d4ed8);border-color:var(--ui-accent-hover, #1d4ed8)}.sp-btn-danger{background:#dc2626;border:1px solid #dc2626;color:#fff}.sp-btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.sp-btn-warning{background:#d97706;border:1px solid #d97706;color:#fff}.sp-btn-warning:hover:not(:disabled){background:#b45309;border-color:#b45309}.sp-spinner{display:inline-block;width:13px;height:13px;border-radius:50%;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;animation:sp-spin .55s linear infinite;flex-shrink:0}@media(max-width:768px){.sp-panel,.sp-wide,.sp-extra-wide{width:100vw}}@media(max-width:480px){.sp-panel,.sp-wide,.sp-extra-wide{inset:auto 0 0;width:100vw;max-height:90vh;max-height:min(90dvh,var(--ui-vvh, 100dvh));border-radius:16px 16px 0 0;box-shadow:0 -4px 24px #00000026;animation:sp-up .25s ease}.sp-header{padding:16px 16px 14px}.sp-body{padding:16px}.sp-footer{padding:12px 16px calc(12px + env(safe-area-inset-bottom,0px))}}@media(pointer:coarse),(max-width:480px){.sp-close{position:relative}.sp-close:after{content:\"\";position:absolute;inset:-5px}.sp-btn{min-height:44px;justify-content:center}}@keyframes sp-slide{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes sp-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes sp-fade{0%{opacity:0}to{opacity:1}}@keyframes sp-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.sp-backdrop,.sp-panel,.sp-wide,.sp-extra-wide{animation:none}.sp-spinner{animation-duration:2s}}\n"],
16064
+ styles: [".sp-backdrop{position:fixed;inset:0;background:#0000004d;z-index:90;animation:sp-fade .2s ease}.sp-panel{position:fixed;top:0;right:0;bottom:var(--ui-kb, 0px);width:480px;max-width:100vw;max-height:100vh;max-height:var(--ui-vvh, 100dvh);background:#fff;z-index:100;box-shadow:-4px 0 20px #0000001a;display:flex;flex-direction:column;animation:sp-slide .25s ease}.sp-panel:focus{outline:none}.sp-focus-guard{position:absolute;width:1px;height:1px;padding:0;margin:-1px;border:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;outline:none}.sp-wide{width:620px}.sp-extra-wide{width:760px}.sp-header{display:flex;justify-content:space-between;align-items:center;padding:24px 24px 20px;gap:12px;flex-shrink:0;background:linear-gradient(135deg,#1e293b,#334155)}.sp-header-text{flex:1;min-width:0}.sp-title{font-size:1.125rem;font-weight:700;color:#fff;margin:0}.sp-subtitle{font-size:.8125rem;color:#94a3b8;margin:4px 0 0}.sp-close{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:36px;height:36px;border-radius:8px;border:1px solid rgba(255,255,255,.2);background:#ffffff1a;cursor:pointer;color:#cbd5e1;transition:background .15s,border-color .15s}.sp-close:hover{background:#fff3;border-color:#ffffff4d;color:#fff}.sp-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-body{padding:20px 24px 24px;flex:1;overflow-y:auto;overflow-x:hidden}.sp-body:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.sp-footer{display:flex;align-items:center;justify-content:space-between;flex-shrink:0;padding:14px 24px calc(14px + env(safe-area-inset-bottom,0px));border-top:1px solid #e2e8f0;background:#f8fafc}.sp-footer-extra{display:flex;align-items:center;justify-content:center;gap:8px;flex:1 1 auto;margin:0 8px;min-width:0}.sp-footer-extra:empty{display:none}.sp-btn{display:inline-flex;align-items:center;gap:7px;padding:8px 18px;border-radius:7px;font-size:.875rem;font-weight:500;font-family:inherit;cursor:pointer;white-space:nowrap;transition:background .1s,border-color .1s,opacity .1s}.sp-btn:disabled{opacity:.5;cursor:default}.sp-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-btn-cancel{background:#fff;border:1px solid #e2e8f0;color:#475569}.sp-btn-cancel:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.sp-btn-primary{background:var(--ui-accent, #2563eb);border:1px solid var(--ui-accent, #2563eb);color:var(--ui-on-accent, #fff)}.sp-btn-primary:hover:not(:disabled){background:var(--ui-accent-hover, #1d4ed8);border-color:var(--ui-accent-hover, #1d4ed8)}.sp-btn-danger{background:#dc2626;border:1px solid #dc2626;color:#fff}.sp-btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.sp-btn-warning{background:#d97706;border:1px solid #d97706;color:#fff}.sp-btn-warning:hover:not(:disabled){background:#b45309;border-color:#b45309}.sp-spinner{display:inline-block;width:13px;height:13px;border-radius:50%;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;animation:sp-spin .55s linear infinite;flex-shrink:0}@media(max-width:768px){.sp-panel,.sp-wide,.sp-extra-wide{width:100vw}}@media(max-width:480px){.sp-panel,.sp-wide,.sp-extra-wide{inset:auto 0 0;width:100vw;max-height:90vh;max-height:min(90dvh,var(--ui-vvh, 100dvh));border-radius:16px 16px 0 0;box-shadow:0 -4px 24px #00000026;animation:sp-up .25s ease}.sp-header{padding:16px 16px 14px}.sp-body{padding:16px}.sp-footer{padding:12px 16px calc(12px + env(safe-area-inset-bottom,0px))}}@media(pointer:coarse),(max-width:480px){.sp-close{position:relative}.sp-close:after{content:\"\";position:absolute;inset:-5px}.sp-btn{min-height:44px;justify-content:center}}@keyframes sp-slide{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes sp-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes sp-fade{0%{opacity:0}to{opacity:1}}@keyframes sp-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.sp-backdrop,.sp-panel,.sp-wide,.sp-extra-wide{animation:none}.sp-spinner{animation-duration:2s}}\n"],
15825
16065
  changeDetection: i0.ChangeDetectionStrategy.OnPush
15826
16066
  });
15827
16067
  }
@@ -15865,7 +16105,12 @@ i0.ɵɵngDeclareClassMetadata({
15865
16105
  </div>
15866
16106
 
15867
16107
  <!-- Body -->
15868
- <div class="sp-body">
16108
+ <div
16109
+ class="sp-body"
16110
+ #spBody
16111
+ [attr.tabindex]="bodyScrollable() ? 0 : null"
16112
+ [attr.role]="bodyScrollable() ? 'group' : null"
16113
+ [attr.aria-labelledby]="bodyScrollable() ? titleId : null">
15869
16114
  <ng-content />
15870
16115
  </div>
15871
16116
 
@@ -15907,7 +16152,7 @@ i0.ɵɵngDeclareClassMetadata({
15907
16152
  </div>
15908
16153
  }
15909
16154
  `,
15910
- styles: [".sp-backdrop{position:fixed;inset:0;background:#0000004d;z-index:90;animation:sp-fade .2s ease}.sp-panel{position:fixed;top:0;right:0;bottom:var(--ui-kb, 0px);width:480px;max-width:100vw;max-height:100vh;max-height:var(--ui-vvh, 100dvh);background:#fff;z-index:100;box-shadow:-4px 0 20px #0000001a;display:flex;flex-direction:column;animation:sp-slide .25s ease}.sp-panel:focus{outline:none}.sp-focus-guard{position:absolute;width:1px;height:1px;padding:0;margin:-1px;border:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;outline:none}.sp-wide{width:620px}.sp-extra-wide{width:760px}.sp-header{display:flex;justify-content:space-between;align-items:center;padding:24px 24px 20px;gap:12px;flex-shrink:0;background:linear-gradient(135deg,#1e293b,#334155)}.sp-header-text{flex:1;min-width:0}.sp-title{font-size:1.125rem;font-weight:700;color:#fff;margin:0}.sp-subtitle{font-size:.8125rem;color:#94a3b8;margin:4px 0 0}.sp-close{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:36px;height:36px;border-radius:8px;border:1px solid rgba(255,255,255,.2);background:#ffffff1a;cursor:pointer;color:#cbd5e1;transition:background .15s,border-color .15s}.sp-close:hover{background:#fff3;border-color:#ffffff4d;color:#fff}.sp-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-body{padding:20px 24px 24px;flex:1;overflow-y:auto;overflow-x:hidden}.sp-footer{display:flex;align-items:center;justify-content:space-between;flex-shrink:0;padding:14px 24px calc(14px + env(safe-area-inset-bottom,0px));border-top:1px solid #e2e8f0;background:#f8fafc}.sp-footer-extra{display:flex;align-items:center;justify-content:center;gap:8px;flex:1 1 auto;margin:0 8px;min-width:0}.sp-footer-extra:empty{display:none}.sp-btn{display:inline-flex;align-items:center;gap:7px;padding:8px 18px;border-radius:7px;font-size:.875rem;font-weight:500;font-family:inherit;cursor:pointer;white-space:nowrap;transition:background .1s,border-color .1s,opacity .1s}.sp-btn:disabled{opacity:.5;cursor:default}.sp-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-btn-cancel{background:#fff;border:1px solid #e2e8f0;color:#475569}.sp-btn-cancel:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.sp-btn-primary{background:var(--ui-accent, #2563eb);border:1px solid var(--ui-accent, #2563eb);color:var(--ui-on-accent, #fff)}.sp-btn-primary:hover:not(:disabled){background:var(--ui-accent-hover, #1d4ed8);border-color:var(--ui-accent-hover, #1d4ed8)}.sp-btn-danger{background:#dc2626;border:1px solid #dc2626;color:#fff}.sp-btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.sp-btn-warning{background:#d97706;border:1px solid #d97706;color:#fff}.sp-btn-warning:hover:not(:disabled){background:#b45309;border-color:#b45309}.sp-spinner{display:inline-block;width:13px;height:13px;border-radius:50%;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;animation:sp-spin .55s linear infinite;flex-shrink:0}@media(max-width:768px){.sp-panel,.sp-wide,.sp-extra-wide{width:100vw}}@media(max-width:480px){.sp-panel,.sp-wide,.sp-extra-wide{inset:auto 0 0;width:100vw;max-height:90vh;max-height:min(90dvh,var(--ui-vvh, 100dvh));border-radius:16px 16px 0 0;box-shadow:0 -4px 24px #00000026;animation:sp-up .25s ease}.sp-header{padding:16px 16px 14px}.sp-body{padding:16px}.sp-footer{padding:12px 16px calc(12px + env(safe-area-inset-bottom,0px))}}@media(pointer:coarse),(max-width:480px){.sp-close{position:relative}.sp-close:after{content:\"\";position:absolute;inset:-5px}.sp-btn{min-height:44px;justify-content:center}}@keyframes sp-slide{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes sp-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes sp-fade{0%{opacity:0}to{opacity:1}}@keyframes sp-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.sp-backdrop,.sp-panel,.sp-wide,.sp-extra-wide{animation:none}.sp-spinner{animation-duration:2s}}\n"]
16155
+ styles: [".sp-backdrop{position:fixed;inset:0;background:#0000004d;z-index:90;animation:sp-fade .2s ease}.sp-panel{position:fixed;top:0;right:0;bottom:var(--ui-kb, 0px);width:480px;max-width:100vw;max-height:100vh;max-height:var(--ui-vvh, 100dvh);background:#fff;z-index:100;box-shadow:-4px 0 20px #0000001a;display:flex;flex-direction:column;animation:sp-slide .25s ease}.sp-panel:focus{outline:none}.sp-focus-guard{position:absolute;width:1px;height:1px;padding:0;margin:-1px;border:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;outline:none}.sp-wide{width:620px}.sp-extra-wide{width:760px}.sp-header{display:flex;justify-content:space-between;align-items:center;padding:24px 24px 20px;gap:12px;flex-shrink:0;background:linear-gradient(135deg,#1e293b,#334155)}.sp-header-text{flex:1;min-width:0}.sp-title{font-size:1.125rem;font-weight:700;color:#fff;margin:0}.sp-subtitle{font-size:.8125rem;color:#94a3b8;margin:4px 0 0}.sp-close{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:36px;height:36px;border-radius:8px;border:1px solid rgba(255,255,255,.2);background:#ffffff1a;cursor:pointer;color:#cbd5e1;transition:background .15s,border-color .15s}.sp-close:hover{background:#fff3;border-color:#ffffff4d;color:#fff}.sp-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-body{padding:20px 24px 24px;flex:1;overflow-y:auto;overflow-x:hidden}.sp-body:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.sp-footer{display:flex;align-items:center;justify-content:space-between;flex-shrink:0;padding:14px 24px calc(14px + env(safe-area-inset-bottom,0px));border-top:1px solid #e2e8f0;background:#f8fafc}.sp-footer-extra{display:flex;align-items:center;justify-content:center;gap:8px;flex:1 1 auto;margin:0 8px;min-width:0}.sp-footer-extra:empty{display:none}.sp-btn{display:inline-flex;align-items:center;gap:7px;padding:8px 18px;border-radius:7px;font-size:.875rem;font-weight:500;font-family:inherit;cursor:pointer;white-space:nowrap;transition:background .1s,border-color .1s,opacity .1s}.sp-btn:disabled{opacity:.5;cursor:default}.sp-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-btn-cancel{background:#fff;border:1px solid #e2e8f0;color:#475569}.sp-btn-cancel:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.sp-btn-primary{background:var(--ui-accent, #2563eb);border:1px solid var(--ui-accent, #2563eb);color:var(--ui-on-accent, #fff)}.sp-btn-primary:hover:not(:disabled){background:var(--ui-accent-hover, #1d4ed8);border-color:var(--ui-accent-hover, #1d4ed8)}.sp-btn-danger{background:#dc2626;border:1px solid #dc2626;color:#fff}.sp-btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.sp-btn-warning{background:#d97706;border:1px solid #d97706;color:#fff}.sp-btn-warning:hover:not(:disabled){background:#b45309;border-color:#b45309}.sp-spinner{display:inline-block;width:13px;height:13px;border-radius:50%;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;animation:sp-spin .55s linear infinite;flex-shrink:0}@media(max-width:768px){.sp-panel,.sp-wide,.sp-extra-wide{width:100vw}}@media(max-width:480px){.sp-panel,.sp-wide,.sp-extra-wide{inset:auto 0 0;width:100vw;max-height:90vh;max-height:min(90dvh,var(--ui-vvh, 100dvh));border-radius:16px 16px 0 0;box-shadow:0 -4px 24px #00000026;animation:sp-up .25s ease}.sp-header{padding:16px 16px 14px}.sp-body{padding:16px}.sp-footer{padding:12px 16px calc(12px + env(safe-area-inset-bottom,0px))}}@media(pointer:coarse),(max-width:480px){.sp-close{position:relative}.sp-close:after{content:\"\";position:absolute;inset:-5px}.sp-btn{min-height:44px;justify-content:center}}@keyframes sp-slide{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes sp-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes sp-fade{0%{opacity:0}to{opacity:1}}@keyframes sp-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.sp-backdrop,.sp-panel,.sp-wide,.sp-extra-wide{animation:none}.sp-spinner{animation-duration:2s}}\n"]
15911
16156
  }]
15912
16157
  }],
15913
16158
  ctorParameters: () => [],
@@ -16023,6 +16268,10 @@ i0.ɵɵngDeclareClassMetadata({
16023
16268
  primaryClick: [{
16024
16269
  type: i0.Output,
16025
16270
  args: ["primaryClick"]
16271
+ }],
16272
+ _bodyRef: [{
16273
+ type: i0.ViewChild,
16274
+ args: ["spBody", { isSignal: true }]
16026
16275
  }]
16027
16276
  }
16028
16277
  });
@@ -16680,6 +16929,7 @@ var ToggleComponent = class ToggleComponent {
16680
16929
  this.hint = input("", ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
16681
16930
  this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
16682
16931
  this.ariaDescribedBy = input("", ...ngDevMode ? [{ debugName: "ariaDescribedBy" }] : /* istanbul ignore next */ []);
16932
+ this.inputTestId = input("", ...ngDevMode ? [{ debugName: "inputTestId" }] : /* istanbul ignore next */ []);
16683
16933
  this.checked = model(false, ...ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []);
16684
16934
  this._disabledInput = input(false, {
16685
16935
  ...ngDevMode ? { debugName: "_disabledInput" } : /* istanbul ignore next */ {},
@@ -16769,6 +17019,13 @@ var ToggleComponent = class ToggleComponent {
16769
17019
  isRequired: false,
16770
17020
  transformFunction: null
16771
17021
  },
17022
+ inputTestId: {
17023
+ classPropertyName: "inputTestId",
17024
+ publicName: "inputTestId",
17025
+ isSignal: true,
17026
+ isRequired: false,
17027
+ transformFunction: null
17028
+ },
16772
17029
  checked: {
16773
17030
  classPropertyName: "checked",
16774
17031
  publicName: "checked",
@@ -16805,6 +17062,7 @@ var ToggleComponent = class ToggleComponent {
16805
17062
  role="switch"
16806
17063
  class="tg-input"
16807
17064
  [id]="_inputId"
17065
+ [attr.data-testid]="inputTestId() || null"
16808
17066
  [checked]="checked()"
16809
17067
  [disabled]="disabled()"
16810
17068
  [attr.aria-checked]="checked() ? 'true' : 'false'"
@@ -16853,6 +17111,7 @@ i0.ɵɵngDeclareClassMetadata({
16853
17111
  role="switch"
16854
17112
  class="tg-input"
16855
17113
  [id]="_inputId"
17114
+ [attr.data-testid]="inputTestId() || null"
16856
17115
  [checked]="checked()"
16857
17116
  [disabled]="disabled()"
16858
17117
  [attr.aria-checked]="checked() ? 'true' : 'false'"
@@ -16901,6 +17160,14 @@ i0.ɵɵngDeclareClassMetadata({
16901
17160
  required: false
16902
17161
  }]
16903
17162
  }],
17163
+ inputTestId: [{
17164
+ type: i0.Input,
17165
+ args: [{
17166
+ isSignal: true,
17167
+ alias: "inputTestId",
17168
+ required: false
17169
+ }]
17170
+ }],
16904
17171
  checked: [{
16905
17172
  type: i0.Input,
16906
17173
  args: [{
@@ -18006,6 +18273,7 @@ var BusinessHoursComponent = class BusinessHoursComponent {
18006
18273
  inputs: [
18007
18274
  "label",
18008
18275
  "ariaLabel",
18276
+ "labelHidden",
18009
18277
  "inputName",
18010
18278
  "placeholder",
18011
18279
  "options",
@@ -18208,6 +18476,7 @@ var RadioComponent = class RadioComponent {
18208
18476
  constructor() {
18209
18477
  this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
18210
18478
  this.description = input("", ...ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []);
18479
+ this.icon = input("", ...ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []);
18211
18480
  this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
18212
18481
  this.testId = input("", ...ngDevMode ? [{ debugName: "testId" }] : /* istanbul ignore next */ []);
18213
18482
  this.value = input("", ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
@@ -18221,6 +18490,11 @@ var RadioComponent = class RadioComponent {
18221
18490
  alias: "disabled"
18222
18491
  });
18223
18492
  this.disabled = this._disabledInput;
18493
+ this._iconD = computed(() => {
18494
+ const v = this.icon().trim();
18495
+ if (!v) return null;
18496
+ return iconPath(v) ?? (/^[Mm][\d\s.,\-MmLlHhVvCcSsQqTtAaZz]+$/.test(v) ? v : null);
18497
+ }, ...ngDevMode ? [{ debugName: "_iconD" }] : /* istanbul ignore next */ []);
18224
18498
  this.labelId = input("", ...ngDevMode ? [{ debugName: "labelId" }] : /* istanbul ignore next */ []);
18225
18499
  this._generatedLabelId = `rd-${Math.random().toString(36).slice(2, 8)}-label`;
18226
18500
  this._labelId = computed(() => this.labelId() || this._generatedLabelId, ...ngDevMode ? [{ debugName: "_labelId" }] : /* istanbul ignore next */ []);
@@ -18266,6 +18540,13 @@ var RadioComponent = class RadioComponent {
18266
18540
  isRequired: false,
18267
18541
  transformFunction: null
18268
18542
  },
18543
+ icon: {
18544
+ classPropertyName: "icon",
18545
+ publicName: "icon",
18546
+ isSignal: true,
18547
+ isRequired: false,
18548
+ transformFunction: null
18549
+ },
18269
18550
  ariaLabel: {
18270
18551
  classPropertyName: "ariaLabel",
18271
18552
  publicName: "ariaLabel",
@@ -18359,6 +18640,10 @@ var RadioComponent = class RadioComponent {
18359
18640
  [attr.aria-controls]="controls() || null"
18360
18641
  (change)="onChange($event)"
18361
18642
  />
18643
+ @if (_iconD(); as d) {
18644
+ <!-- Optional icon in front of the label (library source 2026-11-04): decorative, so the radio's accessible name is unchanged. -->
18645
+ <svg class="rd-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path [attr.d]="d" /></svg>
18646
+ }
18362
18647
  <span class="rd-text">
18363
18648
  @if (label()) { <span class="rd-label" [id]="_labelId()">{{ label() }}</span> }
18364
18649
  @if (description()) { <span class="rd-description" [id]="_descriptionId">{{ description() }}</span> }
@@ -18367,7 +18652,7 @@ var RadioComponent = class RadioComponent {
18367
18652
  </label>
18368
18653
  `,
18369
18654
  isInline: true,
18370
- styles: [":host{display:block}.rd-wrap{position:relative;display:inline-flex;align-items:flex-start;gap:9px;vertical-align:top;cursor:pointer;-webkit-user-select:none;user-select:none}.rd-wrap.rd-disabled{cursor:not-allowed;opacity:.5}.rd-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rd-wrap:has(.rd-hidden:focus-visible) .rd-dot{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.rd-wrap{position:relative}.rd-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:-2px;opacity:0;cursor:pointer;z-index:1}.rd-wrap.rd-disabled .rd-hidden{cursor:not-allowed}}.rd-dot{flex-shrink:0;width:20px;height:20px;box-sizing:border-box;border:2px solid #7c8ba1;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.rd-dot.rd-checked{background:#3b82f6;border-color:#3b82f6}.rd-dot.rd-invalid:not(.rd-checked){border-color:#ef4444}.rd-wrap:hover .rd-dot:not(.rd-checked):not(.rd-disabled){border-color:#3b82f6}.rd-core{width:8px;height:8px;border-radius:50%;background:#fff}@media(max-width:640px),(pointer:coarse){.rd-dot{position:relative}.rd-dot:after{content:\"\";position:absolute;inset:-12px}}.rd-text{display:flex;flex-direction:column;gap:2px}.rd-label{font-size:.875rem;color:#334155;line-height:1.4}.rd-description{font-size:.75rem;color:#64748b;line-height:1.4}\n"],
18655
+ styles: [":host{display:block}.rd-wrap{position:relative;display:inline-flex;align-items:flex-start;gap:9px;vertical-align:top;cursor:pointer;-webkit-user-select:none;user-select:none}.rd-wrap.rd-disabled{cursor:not-allowed;opacity:.5}.rd-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rd-wrap:has(.rd-hidden:focus-visible) .rd-dot{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.rd-wrap{position:relative}.rd-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:-2px;opacity:0;cursor:pointer;z-index:1}.rd-wrap.rd-disabled .rd-hidden{cursor:not-allowed}}.rd-dot{flex-shrink:0;width:20px;height:20px;box-sizing:border-box;border:2px solid #7c8ba1;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.rd-dot.rd-checked{background:#3b82f6;border-color:#3b82f6}.rd-dot.rd-invalid:not(.rd-checked){border-color:#ef4444}.rd-wrap:hover .rd-dot:not(.rd-checked):not(.rd-disabled){border-color:#3b82f6}.rd-core{width:8px;height:8px;border-radius:50%;background:#fff}@media(max-width:640px),(pointer:coarse){.rd-dot{position:relative}.rd-dot:after{content:\"\";position:absolute;inset:-12px}}.rd-icon{flex-shrink:0;margin-top:1px;color:#64748b}.rd-text{display:flex;flex-direction:column;gap:2px}.rd-label{font-size:.875rem;color:#334155;line-height:1.4}.rd-description{font-size:.75rem;color:#64748b;line-height:1.4}\n"],
18371
18656
  changeDetection: i0.ChangeDetectionStrategy.OnPush
18372
18657
  });
18373
18658
  }
@@ -18403,6 +18688,10 @@ i0.ɵɵngDeclareClassMetadata({
18403
18688
  [attr.aria-controls]="controls() || null"
18404
18689
  (change)="onChange($event)"
18405
18690
  />
18691
+ @if (_iconD(); as d) {
18692
+ <!-- Optional icon in front of the label (library source 2026-11-04): decorative, so the radio's accessible name is unchanged. -->
18693
+ <svg class="rd-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path [attr.d]="d" /></svg>
18694
+ }
18406
18695
  <span class="rd-text">
18407
18696
  @if (label()) { <span class="rd-label" [id]="_labelId()">{{ label() }}</span> }
18408
18697
  @if (description()) { <span class="rd-description" [id]="_descriptionId">{{ description() }}</span> }
@@ -18410,7 +18699,7 @@ i0.ɵɵngDeclareClassMetadata({
18410
18699
  </span>
18411
18700
  </label>
18412
18701
  `,
18413
- styles: [":host{display:block}.rd-wrap{position:relative;display:inline-flex;align-items:flex-start;gap:9px;vertical-align:top;cursor:pointer;-webkit-user-select:none;user-select:none}.rd-wrap.rd-disabled{cursor:not-allowed;opacity:.5}.rd-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rd-wrap:has(.rd-hidden:focus-visible) .rd-dot{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.rd-wrap{position:relative}.rd-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:-2px;opacity:0;cursor:pointer;z-index:1}.rd-wrap.rd-disabled .rd-hidden{cursor:not-allowed}}.rd-dot{flex-shrink:0;width:20px;height:20px;box-sizing:border-box;border:2px solid #7c8ba1;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.rd-dot.rd-checked{background:#3b82f6;border-color:#3b82f6}.rd-dot.rd-invalid:not(.rd-checked){border-color:#ef4444}.rd-wrap:hover .rd-dot:not(.rd-checked):not(.rd-disabled){border-color:#3b82f6}.rd-core{width:8px;height:8px;border-radius:50%;background:#fff}@media(max-width:640px),(pointer:coarse){.rd-dot{position:relative}.rd-dot:after{content:\"\";position:absolute;inset:-12px}}.rd-text{display:flex;flex-direction:column;gap:2px}.rd-label{font-size:.875rem;color:#334155;line-height:1.4}.rd-description{font-size:.75rem;color:#64748b;line-height:1.4}\n"]
18702
+ styles: [":host{display:block}.rd-wrap{position:relative;display:inline-flex;align-items:flex-start;gap:9px;vertical-align:top;cursor:pointer;-webkit-user-select:none;user-select:none}.rd-wrap.rd-disabled{cursor:not-allowed;opacity:.5}.rd-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rd-wrap:has(.rd-hidden:focus-visible) .rd-dot{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.rd-wrap{position:relative}.rd-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:-2px;opacity:0;cursor:pointer;z-index:1}.rd-wrap.rd-disabled .rd-hidden{cursor:not-allowed}}.rd-dot{flex-shrink:0;width:20px;height:20px;box-sizing:border-box;border:2px solid #7c8ba1;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.rd-dot.rd-checked{background:#3b82f6;border-color:#3b82f6}.rd-dot.rd-invalid:not(.rd-checked){border-color:#ef4444}.rd-wrap:hover .rd-dot:not(.rd-checked):not(.rd-disabled){border-color:#3b82f6}.rd-core{width:8px;height:8px;border-radius:50%;background:#fff}@media(max-width:640px),(pointer:coarse){.rd-dot{position:relative}.rd-dot:after{content:\"\";position:absolute;inset:-12px}}.rd-icon{flex-shrink:0;margin-top:1px;color:#64748b}.rd-text{display:flex;flex-direction:column;gap:2px}.rd-label{font-size:.875rem;color:#334155;line-height:1.4}.rd-description{font-size:.75rem;color:#64748b;line-height:1.4}\n"]
18414
18703
  }]
18415
18704
  }],
18416
18705
  propDecorators: {
@@ -18430,6 +18719,14 @@ i0.ɵɵngDeclareClassMetadata({
18430
18719
  required: false
18431
18720
  }]
18432
18721
  }],
18722
+ icon: [{
18723
+ type: i0.Input,
18724
+ args: [{
18725
+ isSignal: true,
18726
+ alias: "icon",
18727
+ required: false
18728
+ }]
18729
+ }],
18433
18730
  ariaLabel: [{
18434
18731
  type: i0.Input,
18435
18732
  args: [{
@@ -18790,6 +19087,7 @@ var RadioGroupComponent = class RadioGroupComponent {
18790
19087
  [value]="opt.value"
18791
19088
  [label]="opt.label"
18792
19089
  [description]="opt.description ?? ''"
19090
+ [icon]="opt.icon ?? ''"
18793
19091
  [checked]="_value() === opt.value"
18794
19092
  [disabled]="disabled() || !!opt.disabled"
18795
19093
  [invalid]="!!_activeError()"
@@ -18819,6 +19117,7 @@ var RadioGroupComponent = class RadioGroupComponent {
18819
19117
  inputs: [
18820
19118
  "label",
18821
19119
  "description",
19120
+ "icon",
18822
19121
  "ariaLabel",
18823
19122
  "testId",
18824
19123
  "value",
@@ -18897,6 +19196,7 @@ i0.ɵɵngDeclareClassMetadata({
18897
19196
  [value]="opt.value"
18898
19197
  [label]="opt.label"
18899
19198
  [description]="opt.description ?? ''"
19199
+ [icon]="opt.icon ?? ''"
18900
19200
  [checked]="_value() === opt.value"
18901
19201
  [disabled]="disabled() || !!opt.disabled"
18902
19202
  [invalid]="!!_activeError()"
@@ -19700,6 +20000,7 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
19700
20000
  "inputName",
19701
20001
  "placeholder",
19702
20002
  "prefix",
20003
+ "leadingIcon",
19703
20004
  "revealable",
19704
20005
  "passwordRequirements",
19705
20006
  "passwordRules",
@@ -20196,6 +20497,146 @@ i0.ɵɵngDeclareClassMetadata({
20196
20497
  }]
20197
20498
  }
20198
20499
  });
20500
+ function pillTabId(name, key) {
20501
+ return `${name}-${key}`;
20502
+ }
20503
+ function pillTabPanelId(name, key) {
20504
+ return `${name}-panel-${key}`;
20505
+ }
20506
+ var PillTabPanelDirective = class PillTabPanelDirective {
20507
+ constructor() {
20508
+ this.key = input.required({
20509
+ ...ngDevMode ? { debugName: "key" } : /* istanbul ignore next */ {},
20510
+ alias: "uiTabPanel"
20511
+ });
20512
+ this.tabsName = input.required(...ngDevMode ? [{ debugName: "tabsName" }] : /* istanbul ignore next */ []);
20513
+ this.activeKey = input(null, ...ngDevMode ? [{ debugName: "activeKey" }] : /* istanbul ignore next */ []);
20514
+ this.tabbable = input(false, ...ngDevMode ? [{ debugName: "tabbable" }] : /* istanbul ignore next */ []);
20515
+ }
20516
+ panelId() {
20517
+ return pillTabPanelId(this.tabsName(), this.key());
20518
+ }
20519
+ tabId() {
20520
+ return pillTabId(this.tabsName(), this.key());
20521
+ }
20522
+ isHidden() {
20523
+ const a = this.activeKey();
20524
+ return a !== null && a !== this.key();
20525
+ }
20526
+ static {
20527
+ this.ɵfac = i0.ɵɵngDeclareFactory({
20528
+ minVersion: "12.0.0",
20529
+ version: "22.2.2",
20530
+ ngImport: i0,
20531
+ type: PillTabPanelDirective,
20532
+ deps: [],
20533
+ target: i0.ɵɵFactoryTarget.Directive
20534
+ });
20535
+ }
20536
+ static {
20537
+ this.ɵdir = i0.ɵɵngDeclareDirective({
20538
+ minVersion: "17.1.0",
20539
+ version: "22.2.2",
20540
+ type: PillTabPanelDirective,
20541
+ isStandalone: true,
20542
+ selector: "[uiTabPanel]",
20543
+ inputs: {
20544
+ key: {
20545
+ classPropertyName: "key",
20546
+ publicName: "uiTabPanel",
20547
+ isSignal: true,
20548
+ isRequired: true,
20549
+ transformFunction: null
20550
+ },
20551
+ tabsName: {
20552
+ classPropertyName: "tabsName",
20553
+ publicName: "tabsName",
20554
+ isSignal: true,
20555
+ isRequired: true,
20556
+ transformFunction: null
20557
+ },
20558
+ activeKey: {
20559
+ classPropertyName: "activeKey",
20560
+ publicName: "activeKey",
20561
+ isSignal: true,
20562
+ isRequired: false,
20563
+ transformFunction: null
20564
+ },
20565
+ tabbable: {
20566
+ classPropertyName: "tabbable",
20567
+ publicName: "tabbable",
20568
+ isSignal: true,
20569
+ isRequired: false,
20570
+ transformFunction: null
20571
+ }
20572
+ },
20573
+ host: {
20574
+ attributes: { "role": "tabpanel" },
20575
+ properties: {
20576
+ "id": "panelId()",
20577
+ "attr.aria-labelledby": "tabId()",
20578
+ "attr.hidden": "isHidden() ? '' : null",
20579
+ "attr.tabindex": "tabbable() ? 0 : null"
20580
+ }
20581
+ },
20582
+ ngImport: i0
20583
+ });
20584
+ }
20585
+ };
20586
+ i0.ɵɵngDeclareClassMetadata({
20587
+ minVersion: "12.0.0",
20588
+ version: "22.2.2",
20589
+ ngImport: i0,
20590
+ type: PillTabPanelDirective,
20591
+ decorators: [{
20592
+ type: Directive,
20593
+ args: [{
20594
+ selector: "[uiTabPanel]",
20595
+ standalone: true,
20596
+ host: {
20597
+ role: "tabpanel",
20598
+ "[id]": "panelId()",
20599
+ "[attr.aria-labelledby]": "tabId()",
20600
+ "[attr.hidden]": "isHidden() ? '' : null",
20601
+ "[attr.tabindex]": "tabbable() ? 0 : null"
20602
+ }
20603
+ }]
20604
+ }],
20605
+ propDecorators: {
20606
+ key: [{
20607
+ type: i0.Input,
20608
+ args: [{
20609
+ isSignal: true,
20610
+ alias: "uiTabPanel",
20611
+ required: true
20612
+ }]
20613
+ }],
20614
+ tabsName: [{
20615
+ type: i0.Input,
20616
+ args: [{
20617
+ isSignal: true,
20618
+ alias: "tabsName",
20619
+ required: true
20620
+ }]
20621
+ }],
20622
+ activeKey: [{
20623
+ type: i0.Input,
20624
+ args: [{
20625
+ isSignal: true,
20626
+ alias: "activeKey",
20627
+ required: false
20628
+ }]
20629
+ }],
20630
+ tabbable: [{
20631
+ type: i0.Input,
20632
+ args: [{
20633
+ isSignal: true,
20634
+ alias: "tabbable",
20635
+ required: false
20636
+ }]
20637
+ }]
20638
+ }
20639
+ });
20199
20640
  var PillTabsComponent = class PillTabsComponent {
20200
20641
  constructor() {
20201
20642
  this.host = inject(ElementRef);
@@ -20206,10 +20647,23 @@ var PillTabsComponent = class PillTabsComponent {
20206
20647
  this.noWrap = input(false, ...ngDevMode ? [{ debugName: "noWrap" }] : /* istanbul ignore next */ []);
20207
20648
  this.orientation = input("horizontal", ...ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []);
20208
20649
  this.vertical = () => this.orientation() === "vertical";
20650
+ this.controlsPanels = input(false, ...ngDevMode ? [{ debugName: "controlsPanels" }] : /* istanbul ignore next */ []);
20209
20651
  this.tabChange = output();
20210
20652
  this.canScrollStart = signal(false, ...ngDevMode ? [{ debugName: "canScrollStart" }] : /* istanbul ignore next */ []);
20211
20653
  this.canScrollEnd = signal(false, ...ngDevMode ? [{ debugName: "canScrollEnd" }] : /* istanbul ignore next */ []);
20212
20654
  const destroyRef = inject(DestroyRef);
20655
+ const warned = /* @__PURE__ */ new Set();
20656
+ effect(() => {
20657
+ const on = this.controlsPanels(), tabs = this.tabs(), name = this.name();
20658
+ if (!on || !isDevMode()) return;
20659
+ untracked(() => {
20660
+ for (const t of tabs) {
20661
+ if (!t.key.startsWith("panel-") || warned.has(name + "|" + t.key)) continue;
20662
+ warned.add(name + "|" + t.key);
20663
+ console.warn(`ui-pill-tabs "${name}": the tab key "${t.key}" starts with "panel-", so its id "${pillTabId(name, t.key)}" can equal the panel id of the key "${t.key.slice(6)}" (${pillTabPanelId(name, t.key.slice(6))}) when controlsPanels is on. Rename the key.`);
20664
+ }
20665
+ });
20666
+ });
20213
20667
  effect(() => {
20214
20668
  this.tabs();
20215
20669
  queueMicrotask(() => this.updateOverflow());
@@ -20224,6 +20678,12 @@ var PillTabsComponent = class PillTabsComponent {
20224
20678
  }
20225
20679
  });
20226
20680
  }
20681
+ tabId(key) {
20682
+ return pillTabId(this.name(), key);
20683
+ }
20684
+ panelId(key) {
20685
+ return pillTabPanelId(this.name(), key);
20686
+ }
20227
20687
  updateOverflow() {
20228
20688
  const el = this.host.nativeElement.querySelector(".pill-tabs");
20229
20689
  if (!el) return;
@@ -20254,7 +20714,7 @@ var PillTabsComponent = class PillTabsComponent {
20254
20714
  e.preventDefault();
20255
20715
  const key = enabled[next].key;
20256
20716
  this.select(key);
20257
- this.host.nativeElement.querySelector(`#${CSS.escape(this.name() + "-" + key)}`)?.focus();
20717
+ this.host.nativeElement.querySelector(`#${CSS.escape(this.tabId(key))}`)?.focus();
20258
20718
  }
20259
20719
  static {
20260
20720
  this.ɵfac = i0.ɵɵngDeclareFactory({
@@ -20315,6 +20775,13 @@ var PillTabsComponent = class PillTabsComponent {
20315
20775
  isSignal: true,
20316
20776
  isRequired: false,
20317
20777
  transformFunction: null
20778
+ },
20779
+ controlsPanels: {
20780
+ classPropertyName: "controlsPanels",
20781
+ publicName: "controlsPanels",
20782
+ isSignal: true,
20783
+ isRequired: false,
20784
+ transformFunction: null
20318
20785
  }
20319
20786
  },
20320
20787
  outputs: { tabChange: "tabChange" },
@@ -20324,13 +20791,14 @@ var PillTabsComponent = class PillTabsComponent {
20324
20791
  <div class="pill-tabs" [class.pill-tabs--nowrap]="noWrap()" [class.pill-tabs--vertical]="vertical()" role="tablist" [attr.aria-label]="ariaLabel()" [attr.aria-orientation]="vertical() ? 'vertical' : null" (keydown)="onKeydown($event)" (scroll)="updateOverflow()">
20325
20792
  @for (tab of tabs(); track tab.key) {
20326
20793
  <button type="button" class="pill-tab" role="tab"
20327
- [id]="name() + '-' + tab.key"
20794
+ [id]="tabId(tab.key)"
20328
20795
  [class.active]="activeKey() === tab.key"
20329
20796
  [class.disabled]="tab.disabled"
20330
20797
  [disabled]="tab.disabled ?? false"
20331
20798
  [attr.aria-selected]="activeKey() === tab.key"
20332
20799
  [attr.tabindex]="tabIndexFor(tab)"
20333
- [attr.aria-describedby]="tab.info ? name() + '-' + tab.key + '-info' : null"
20800
+ [attr.aria-describedby]="tab.info ? tabId(tab.key) + '-info' : null"
20801
+ [attr.aria-controls]="controlsPanels() ? panelId(tab.key) : null"
20334
20802
  (click)="select(tab.key)">
20335
20803
  <span>{{ tab.label }}</span>
20336
20804
  @if (tab.count !== undefined) {
@@ -20340,7 +20808,7 @@ var PillTabsComponent = class PillTabsComponent {
20340
20808
  <svg class="pill-info-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-testid="pill-info-icon">
20341
20809
  <circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/>
20342
20810
  </svg>
20343
- <span class="pill-info-tip" role="tooltip" aria-hidden="true" [id]="name() + '-' + tab.key + '-info'" data-testid="pill-info-tip">{{ tab.info }}</span>
20811
+ <span class="pill-info-tip" role="tooltip" aria-hidden="true" [id]="tabId(tab.key) + '-info'" data-testid="pill-info-tip">{{ tab.info }}</span>
20344
20812
  }
20345
20813
  </button>
20346
20814
  }
@@ -20371,13 +20839,14 @@ i0.ɵɵngDeclareClassMetadata({
20371
20839
  <div class="pill-tabs" [class.pill-tabs--nowrap]="noWrap()" [class.pill-tabs--vertical]="vertical()" role="tablist" [attr.aria-label]="ariaLabel()" [attr.aria-orientation]="vertical() ? 'vertical' : null" (keydown)="onKeydown($event)" (scroll)="updateOverflow()">
20372
20840
  @for (tab of tabs(); track tab.key) {
20373
20841
  <button type="button" class="pill-tab" role="tab"
20374
- [id]="name() + '-' + tab.key"
20842
+ [id]="tabId(tab.key)"
20375
20843
  [class.active]="activeKey() === tab.key"
20376
20844
  [class.disabled]="tab.disabled"
20377
20845
  [disabled]="tab.disabled ?? false"
20378
20846
  [attr.aria-selected]="activeKey() === tab.key"
20379
20847
  [attr.tabindex]="tabIndexFor(tab)"
20380
- [attr.aria-describedby]="tab.info ? name() + '-' + tab.key + '-info' : null"
20848
+ [attr.aria-describedby]="tab.info ? tabId(tab.key) + '-info' : null"
20849
+ [attr.aria-controls]="controlsPanels() ? panelId(tab.key) : null"
20381
20850
  (click)="select(tab.key)">
20382
20851
  <span>{{ tab.label }}</span>
20383
20852
  @if (tab.count !== undefined) {
@@ -20387,7 +20856,7 @@ i0.ɵɵngDeclareClassMetadata({
20387
20856
  <svg class="pill-info-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-testid="pill-info-icon">
20388
20857
  <circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/>
20389
20858
  </svg>
20390
- <span class="pill-info-tip" role="tooltip" aria-hidden="true" [id]="name() + '-' + tab.key + '-info'" data-testid="pill-info-tip">{{ tab.info }}</span>
20859
+ <span class="pill-info-tip" role="tooltip" aria-hidden="true" [id]="tabId(tab.key) + '-info'" data-testid="pill-info-tip">{{ tab.info }}</span>
20391
20860
  }
20392
20861
  </button>
20393
20862
  }
@@ -20449,6 +20918,14 @@ i0.ɵɵngDeclareClassMetadata({
20449
20918
  required: false
20450
20919
  }]
20451
20920
  }],
20921
+ controlsPanels: [{
20922
+ type: i0.Input,
20923
+ args: [{
20924
+ isSignal: true,
20925
+ alias: "controlsPanels",
20926
+ required: false
20927
+ }]
20928
+ }],
20452
20929
  tabChange: [{
20453
20930
  type: i0.Output,
20454
20931
  args: ["tabChange"]
@@ -21338,6 +21815,7 @@ var TextareaInputComponent = class TextareaInputComponent {
21338
21815
  this._activeError = computed(() => this.error() || (this._reveal.revealed() ? this.errorMessage() : ""), ...ngDevMode ? [{ debugName: "_activeError" }] : /* istanbul ignore next */ []);
21339
21816
  this._onValidatorChange = () => {};
21340
21817
  this._inputId = `ta-${Math.random().toString(36).slice(2, 8)}`;
21818
+ this._hostEl = inject(ElementRef);
21341
21819
  this._onChange = (_) => {};
21342
21820
  this._onTouched = () => {};
21343
21821
  effect(() => {
@@ -21354,6 +21832,9 @@ var TextareaInputComponent = class TextareaInputComponent {
21354
21832
  registerOnValidatorChange(fn) {
21355
21833
  this._onValidatorChange = fn;
21356
21834
  }
21835
+ focus(options) {
21836
+ this._hostEl.nativeElement.querySelector("textarea")?.focus(options);
21837
+ }
21357
21838
  writeValue(val) {
21358
21839
  this._value.set(val ?? "");
21359
21840
  }
@@ -21984,6 +22465,7 @@ var BulkMessagePanelComponent = class BulkMessagePanelComponent {
21984
22465
  "inputName",
21985
22466
  "placeholder",
21986
22467
  "prefix",
22468
+ "leadingIcon",
21987
22469
  "revealable",
21988
22470
  "passwordRequirements",
21989
22471
  "passwordRules",
@@ -22630,6 +23112,7 @@ var BankAccountFormComponent = class BankAccountFormComponent {
22630
23112
  inputs: [
22631
23113
  "label",
22632
23114
  "ariaLabel",
23115
+ "labelHidden",
22633
23116
  "inputName",
22634
23117
  "placeholder",
22635
23118
  "options",
@@ -22655,6 +23138,7 @@ var BankAccountFormComponent = class BankAccountFormComponent {
22655
23138
  "inputName",
22656
23139
  "placeholder",
22657
23140
  "prefix",
23141
+ "leadingIcon",
22658
23142
  "revealable",
22659
23143
  "passwordRequirements",
22660
23144
  "passwordRules",
@@ -28351,6 +28835,7 @@ i0.ɵɵngDeclareClassMetadata({
28351
28835
  });
28352
28836
  var ListItemComponent = class ListItemComponent {
28353
28837
  constructor() {
28838
+ this.host = inject(ElementRef);
28354
28839
  this.leading = input("none", ...ngDevMode ? [{ debugName: "leading" }] : /* istanbul ignore next */ []);
28355
28840
  this.inputName = input("", ...ngDevMode ? [{ debugName: "inputName" }] : /* istanbul ignore next */ []);
28356
28841
  this.inputId = input("", ...ngDevMode ? [{ debugName: "inputId" }] : /* istanbul ignore next */ []);
@@ -28360,6 +28845,8 @@ var ListItemComponent = class ListItemComponent {
28360
28845
  this.interactive = input(true, ...ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []);
28361
28846
  this.alwaysShowBadge = input(false, ...ngDevMode ? [{ debugName: "alwaysShowBadge" }] : /* istanbul ignore next */ []);
28362
28847
  this.wrapText = input(false, ...ngDevMode ? [{ debugName: "wrapText" }] : /* istanbul ignore next */ []);
28848
+ this.disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
28849
+ this.busy = input(false, ...ngDevMode ? [{ debugName: "busy" }] : /* istanbul ignore next */ []);
28363
28850
  this.title = input("", ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
28364
28851
  this.badge = input(null, ...ngDevMode ? [{ debugName: "badge" }] : /* istanbul ignore next */ []);
28365
28852
  this.badgeVariant = input("green", ...ngDevMode ? [{ debugName: "badgeVariant" }] : /* istanbul ignore next */ []);
@@ -28369,6 +28856,7 @@ var ListItemComponent = class ListItemComponent {
28369
28856
  this.iconD = () => this.icon() ? iconPath(this.icon()) ?? null : null;
28370
28857
  this.select = output();
28371
28858
  this.pressable = () => this.interactive() && this.leading() === "none";
28859
+ this.hasImage = signal(false, ...ngDevMode ? [{ debugName: "hasImage" }] : /* istanbul ignore next */ []);
28372
28860
  this.visibleDetails = () => this.details().map((d) => typeof d === "string" ? {
28373
28861
  text: d,
28374
28862
  d: null,
@@ -28382,14 +28870,43 @@ var ListItemComponent = class ListItemComponent {
28382
28870
  get _borderedClass() {
28383
28871
  return this.bordered();
28384
28872
  }
28873
+ get _disabledClass() {
28874
+ return this.disabled();
28875
+ }
28876
+ ngAfterContentChecked() {
28877
+ const kids = this.host.nativeElement.firstElementChild?.children;
28878
+ let has = false;
28879
+ if (kids) {
28880
+ for (let i = 0; i < kids.length; i++) if (kids[i].hasAttribute("list-item-image")) {
28881
+ has = true;
28882
+ break;
28883
+ }
28884
+ }
28885
+ if (has !== this.hasImage()) this.hasImage.set(has);
28886
+ }
28887
+ onInputClick(e) {
28888
+ if (this.disabled() || this.busy()) e.preventDefault();
28889
+ }
28890
+ onInputKey(e) {
28891
+ if ((this.disabled() || this.busy()) && (e.key === "ArrowUp" || e.key === "ArrowDown" || e.key === "ArrowLeft" || e.key === "ArrowRight")) e.preventDefault();
28892
+ }
28893
+ onInputChange(e) {
28894
+ const input = e.target;
28895
+ if (this.disabled() || this.busy()) {
28896
+ input.checked = this.checked();
28897
+ return;
28898
+ }
28899
+ this.select.emit();
28900
+ }
28385
28901
  onRowClick(e) {
28386
- if (!this.pressable()) return;
28902
+ if (!this.pressable() || this.disabled() || this.busy()) return;
28387
28903
  if (e.target.closest("[list-item-action], [li-action]")) return;
28388
28904
  this.select.emit();
28389
28905
  }
28390
28906
  onRowKey(e) {
28391
28907
  if (!this.pressable() || e.target !== e.currentTarget) return;
28392
28908
  e.preventDefault();
28909
+ if (this.disabled() || this.busy()) return;
28393
28910
  this.select.emit();
28394
28911
  }
28395
28912
  static {
@@ -28473,6 +28990,20 @@ var ListItemComponent = class ListItemComponent {
28473
28990
  isRequired: false,
28474
28991
  transformFunction: null
28475
28992
  },
28993
+ disabled: {
28994
+ classPropertyName: "disabled",
28995
+ publicName: "disabled",
28996
+ isSignal: true,
28997
+ isRequired: false,
28998
+ transformFunction: null
28999
+ },
29000
+ busy: {
29001
+ classPropertyName: "busy",
29002
+ publicName: "busy",
29003
+ isSignal: true,
29004
+ isRequired: false,
29005
+ transformFunction: null
29006
+ },
28476
29007
  title: {
28477
29008
  classPropertyName: "title",
28478
29009
  publicName: "title",
@@ -28517,7 +29048,10 @@ var ListItemComponent = class ListItemComponent {
28517
29048
  }
28518
29049
  },
28519
29050
  outputs: { select: "select" },
28520
- host: { properties: { "class.li-bordered": "this._borderedClass" } },
29051
+ host: { properties: {
29052
+ "class.li-bordered": "this._borderedClass",
29053
+ "class.li-disabled": "this._disabledClass"
29054
+ } },
28521
29055
  ngImport: i0,
28522
29056
  template: `
28523
29057
  <ng-template #tile>
@@ -28549,46 +29083,58 @@ var ListItemComponent = class ListItemComponent {
28549
29083
  </ng-template>
28550
29084
 
28551
29085
  <div class="li-row" [class.li-row--highlighted]="highlighted()" [class.li-row--pressable]="pressable()"
28552
- [attr.role]="pressable() ? 'button' : null" [attr.tabindex]="pressable() ? 0 : null"
29086
+ [class.li-row--disabled]="disabled()" [class.li-row--busy]="busy()"
29087
+ [attr.role]="pressable() ? 'button' : null" [attr.tabindex]="pressable() && !disabled() ? 0 : null"
29088
+ [attr.aria-disabled]="disabled() && pressable() ? 'true' : null" [attr.aria-busy]="busy() ? 'true' : null"
28553
29089
  (click)="onRowClick($event)" (keydown.enter)="onRowKey($event)" (keydown.space)="onRowKey($event)" [class.li-row--static]="!interactive()" [class.li-row--wrap]="wrapText() || !interactive()">
28554
29090
 
28555
- @if (!interactive()) {
28556
- <ng-container [ngTemplateOutlet]="tile" />
28557
- <div class="li-body li-body--static">
28558
- <ng-container [ngTemplateOutlet]="content" />
28559
- </div>
28560
- } @else {
28561
- @if (leading() === 'radio') {
29091
+ @if (interactive() && leading() === 'radio') {
28562
29092
  <input
28563
29093
  type="radio"
28564
29094
  class="li-input"
28565
29095
  [id]="inputId()"
28566
29096
  [name]="inputName()"
28567
29097
  [checked]="checked()"
28568
- (change)="select.emit()"
29098
+ [disabled]="disabled()"
29099
+ (click)="onInputClick($event)"
29100
+ (keydown)="onInputKey($event)"
29101
+ (change)="onInputChange($event)"
28569
29102
  />
28570
- } @else if (leading() === 'checkbox') {
29103
+ } @else if (interactive() && leading() === 'checkbox') {
28571
29104
  <input
28572
29105
  type="checkbox"
28573
29106
  class="li-input"
28574
29107
  [id]="inputId()"
28575
29108
  [checked]="checked()"
28576
- (change)="select.emit()"
29109
+ [disabled]="disabled()"
29110
+ (click)="onInputClick($event)"
29111
+ (keydown)="onInputKey($event)"
29112
+ (change)="onInputChange($event)"
28577
29113
  />
28578
29114
  }
28579
29115
 
28580
- <ng-container [ngTemplateOutlet]="tile" />
28581
- <label class="li-body" [attr.for]="inputId() || null">
28582
- <ng-container [ngTemplateOutlet]="content" />
28583
- </label>
29116
+ <!-- Leading image slot (library source 2026-11-04): a product photo in front of the text. Replaces the icon tile. -->
29117
+ <ng-content select="[list-item-image]" />
29118
+ @if (!hasImage()) { <ng-container [ngTemplateOutlet]="tile" /> }
29119
+ @if (!interactive()) {
29120
+ <div class="li-body li-body--static">
29121
+ <ng-container [ngTemplateOutlet]="content" />
29122
+ </div>
29123
+ } @else {
29124
+ <label class="li-body" [attr.for]="inputId() || null">
29125
+ <ng-container [ngTemplateOutlet]="content" />
29126
+ </label>
28584
29127
  }
28585
29128
 
29129
+ @if (busy()) {
29130
+ <span class="li-spinner" aria-hidden="true"></span>
29131
+ }
28586
29132
  <ng-content select="[list-item-action], [li-action]" />
28587
29133
 
28588
29134
  </div>
28589
29135
  `,
28590
29136
  isInline: true,
28591
- styles: ["ui-list-item{display:block}ui-list-item.li-bordered{border:1px solid var(--border, #e2e8f0);border-radius:12px;overflow:hidden;background:var(--surface, #fff);box-shadow:0 1px 2px #0f172a0a;margin-bottom:8px;transition:border-color .15s ease,box-shadow .15s ease}ui-list-item.li-bordered:last-child{margin-bottom:0}ui-list-item.li-bordered:hover{border-color:#cbd5e1;box-shadow:0 2px 6px #0f172a12}@media(prefers-reduced-motion:reduce){ui-list-item.li-bordered{transition:none}}.li-row{display:flex;align-items:flex-start;gap:14px;padding:12px 16px;border-bottom:1px solid var(--border, #e2e8f0);transition:background .12s}.li-row:last-child{border-bottom:none}.li-row:hover{background:var(--surface-hover, #f8fafc)}ui-list-item.li-bordered .li-row{border-bottom:none;padding:14px 16px}.li-row.li-row--highlighted{background:#f0fdf4}.li-row.li-row--highlighted:hover{background:#dcfce7}.li-row.li-row--static:hover{background:transparent}.li-row.li-row--static.li-row--highlighted,.li-row.li-row--static.li-row--highlighted:hover{background:#f0fdf4}.li-row.li-row--pressable{cursor:pointer}.li-row.li-row--pressable:focus-visible{outline:2px solid var(--primary, #2563eb);outline-offset:-2px}.li-body.li-body--static{cursor:default}.li-row [list-item-action],.li-row [li-action]{flex-shrink:0;align-self:center}.li-input{margin-top:3px;flex-shrink:0;accent-color:#16a34a;width:1rem;height:1rem;cursor:pointer}.li-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:12px}.li-icon--slate{background:#f1f5f9;color:#475569}.li-icon--amber{background:#fef3c7;color:#b45309}.li-icon--orange{background:#ffedd5;color:#c2410c}.li-icon--red{background:#fee2e2;color:#b91c1c}.li-icon--blue{background:#dbeafe;color:#1d4ed8}.li-icon--green{background:#dcfce7;color:#15803d}.li-icon--purple{background:#f3e8ff;color:#7e22ce}.li-icon--teal{background:#ccfbf1;color:#0f766e}.li-body{flex:1;min-width:0;cursor:pointer;display:flex;flex-direction:column;gap:6px}.li-title-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.li-title{font-size:.9375rem;font-weight:600;line-height:1.4;letter-spacing:-.005em;color:var(--text-primary, #0f172a)}.li-row--wrap .li-title{min-width:0;word-break:break-word;overflow-wrap:anywhere}.li-details{display:flex;flex-direction:column;gap:3px;font-size:.8125rem;line-height:1.4;color:var(--text-secondary, #64748b)}.li-detail{display:flex;align-items:center;gap:6px;min-width:0}.li-detail-icon{flex:0 0 auto;color:#94a3b8}.li-detail--warning,.li-detail--warning .li-detail-icon{color:#b45309}.li-detail--danger,.li-detail--danger .li-detail-icon{color:#b91c1c}.li-row--wrap .li-detail-text{min-width:0;word-break:break-word;overflow-wrap:anywhere}\n"],
29137
+ styles: ["ui-list-item{display:block}ui-list-item.li-bordered{border:1px solid var(--border, #e2e8f0);border-radius:12px;overflow:hidden;background:var(--surface, #fff);box-shadow:0 1px 2px #0f172a0a;margin-bottom:8px;transition:border-color .15s ease,box-shadow .15s ease}ui-list-item.li-bordered:last-child{margin-bottom:0}ui-list-item.li-bordered:hover{border-color:#cbd5e1;box-shadow:0 2px 6px #0f172a12}@media(prefers-reduced-motion:reduce){ui-list-item.li-bordered{transition:none}}.li-row{display:flex;align-items:flex-start;gap:14px;padding:12px 16px;border-bottom:1px solid var(--border, #e2e8f0);transition:background .12s}.li-row:last-child{border-bottom:none}.li-row:hover{background:var(--surface-hover, #f8fafc)}ui-list-item.li-bordered .li-row{border-bottom:none;padding:14px 16px}.li-row.li-row--highlighted{background:#f0fdf4}.li-row.li-row--highlighted:hover{background:#dcfce7}.li-row.li-row--static:hover{background:transparent}.li-row.li-row--static.li-row--highlighted,.li-row.li-row--static.li-row--highlighted:hover{background:#f0fdf4}.li-row.li-row--pressable{cursor:pointer}.li-row.li-row--pressable:focus-visible{outline:2px solid var(--primary, #2563eb);outline-offset:-2px}.li-body.li-body--static{cursor:default}.li-row [list-item-action],.li-row [li-action]{flex-shrink:0;align-self:center}.li-row>[list-item-image]{flex:0 0 auto;align-self:center}.li-row.li-row--disabled,.li-row.li-row--disabled:hover{opacity:.72;cursor:not-allowed;background-color:var(--surface-muted, #f8fafc);background-image:repeating-linear-gradient(135deg,transparent 0,transparent 6px,rgba(100,116,139,.1) 6px,rgba(100,116,139,.1) 12px)}.li-row.li-row--disabled .li-body,.li-row.li-row--disabled .li-input,.li-row.li-row--disabled.li-row--pressable{cursor:not-allowed}ui-list-item.li-disabled.li-bordered,ui-list-item.li-disabled.li-bordered:hover{border-style:dashed;box-shadow:none}.li-row.li-row--busy,.li-row.li-row--busy .li-body{cursor:progress}.li-spinner{flex:0 0 auto;align-self:center;box-sizing:border-box;width:16px;height:16px;border:2px solid rgba(100,116,139,.3);border-top-color:var(--text-secondary, #475569);border-radius:50%;animation:li-spin .6s linear infinite}@keyframes li-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.li-spinner{animation-duration:2s}}.li-input{margin-top:3px;flex-shrink:0;accent-color:#16a34a;width:1rem;height:1rem;cursor:pointer}.li-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:12px}.li-icon--slate{background:#f1f5f9;color:#475569}.li-icon--amber{background:#fef3c7;color:#b45309}.li-icon--orange{background:#ffedd5;color:#c2410c}.li-icon--red{background:#fee2e2;color:#b91c1c}.li-icon--blue{background:#dbeafe;color:#1d4ed8}.li-icon--green{background:#dcfce7;color:#15803d}.li-icon--purple{background:#f3e8ff;color:#7e22ce}.li-icon--teal{background:#ccfbf1;color:#0f766e}.li-body{flex:1;min-width:0;cursor:pointer;display:flex;flex-direction:column;gap:6px}.li-title-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.li-title{font-size:.9375rem;font-weight:600;line-height:1.4;letter-spacing:-.005em;color:var(--text-primary, #0f172a)}.li-row--wrap .li-title{min-width:0;word-break:break-word;overflow-wrap:anywhere}.li-details{display:flex;flex-direction:column;gap:3px;font-size:.8125rem;line-height:1.4;color:var(--text-secondary, #64748b)}.li-detail{display:flex;align-items:center;gap:6px;min-width:0}.li-detail-icon{flex:0 0 auto;color:#94a3b8}.li-detail--warning,.li-detail--warning .li-detail-icon{color:#b45309}.li-detail--danger,.li-detail--danger .li-detail-icon{color:#b91c1c}.li-row--wrap .li-detail-text{min-width:0;word-break:break-word;overflow-wrap:anywhere}\n"],
28592
29138
  dependencies: [{
28593
29139
  kind: "component",
28594
29140
  type: BadgeComponent,
@@ -28652,45 +29198,57 @@ i0.ɵɵngDeclareClassMetadata({
28652
29198
  </ng-template>
28653
29199
 
28654
29200
  <div class="li-row" [class.li-row--highlighted]="highlighted()" [class.li-row--pressable]="pressable()"
28655
- [attr.role]="pressable() ? 'button' : null" [attr.tabindex]="pressable() ? 0 : null"
29201
+ [class.li-row--disabled]="disabled()" [class.li-row--busy]="busy()"
29202
+ [attr.role]="pressable() ? 'button' : null" [attr.tabindex]="pressable() && !disabled() ? 0 : null"
29203
+ [attr.aria-disabled]="disabled() && pressable() ? 'true' : null" [attr.aria-busy]="busy() ? 'true' : null"
28656
29204
  (click)="onRowClick($event)" (keydown.enter)="onRowKey($event)" (keydown.space)="onRowKey($event)" [class.li-row--static]="!interactive()" [class.li-row--wrap]="wrapText() || !interactive()">
28657
29205
 
28658
- @if (!interactive()) {
28659
- <ng-container [ngTemplateOutlet]="tile" />
28660
- <div class="li-body li-body--static">
28661
- <ng-container [ngTemplateOutlet]="content" />
28662
- </div>
28663
- } @else {
28664
- @if (leading() === 'radio') {
29206
+ @if (interactive() && leading() === 'radio') {
28665
29207
  <input
28666
29208
  type="radio"
28667
29209
  class="li-input"
28668
29210
  [id]="inputId()"
28669
29211
  [name]="inputName()"
28670
29212
  [checked]="checked()"
28671
- (change)="select.emit()"
29213
+ [disabled]="disabled()"
29214
+ (click)="onInputClick($event)"
29215
+ (keydown)="onInputKey($event)"
29216
+ (change)="onInputChange($event)"
28672
29217
  />
28673
- } @else if (leading() === 'checkbox') {
29218
+ } @else if (interactive() && leading() === 'checkbox') {
28674
29219
  <input
28675
29220
  type="checkbox"
28676
29221
  class="li-input"
28677
29222
  [id]="inputId()"
28678
29223
  [checked]="checked()"
28679
- (change)="select.emit()"
29224
+ [disabled]="disabled()"
29225
+ (click)="onInputClick($event)"
29226
+ (keydown)="onInputKey($event)"
29227
+ (change)="onInputChange($event)"
28680
29228
  />
28681
29229
  }
28682
29230
 
28683
- <ng-container [ngTemplateOutlet]="tile" />
28684
- <label class="li-body" [attr.for]="inputId() || null">
28685
- <ng-container [ngTemplateOutlet]="content" />
28686
- </label>
29231
+ <!-- Leading image slot (library source 2026-11-04): a product photo in front of the text. Replaces the icon tile. -->
29232
+ <ng-content select="[list-item-image]" />
29233
+ @if (!hasImage()) { <ng-container [ngTemplateOutlet]="tile" /> }
29234
+ @if (!interactive()) {
29235
+ <div class="li-body li-body--static">
29236
+ <ng-container [ngTemplateOutlet]="content" />
29237
+ </div>
29238
+ } @else {
29239
+ <label class="li-body" [attr.for]="inputId() || null">
29240
+ <ng-container [ngTemplateOutlet]="content" />
29241
+ </label>
28687
29242
  }
28688
29243
 
29244
+ @if (busy()) {
29245
+ <span class="li-spinner" aria-hidden="true"></span>
29246
+ }
28689
29247
  <ng-content select="[list-item-action], [li-action]" />
28690
29248
 
28691
29249
  </div>
28692
29250
  `,
28693
- styles: ["ui-list-item{display:block}ui-list-item.li-bordered{border:1px solid var(--border, #e2e8f0);border-radius:12px;overflow:hidden;background:var(--surface, #fff);box-shadow:0 1px 2px #0f172a0a;margin-bottom:8px;transition:border-color .15s ease,box-shadow .15s ease}ui-list-item.li-bordered:last-child{margin-bottom:0}ui-list-item.li-bordered:hover{border-color:#cbd5e1;box-shadow:0 2px 6px #0f172a12}@media(prefers-reduced-motion:reduce){ui-list-item.li-bordered{transition:none}}.li-row{display:flex;align-items:flex-start;gap:14px;padding:12px 16px;border-bottom:1px solid var(--border, #e2e8f0);transition:background .12s}.li-row:last-child{border-bottom:none}.li-row:hover{background:var(--surface-hover, #f8fafc)}ui-list-item.li-bordered .li-row{border-bottom:none;padding:14px 16px}.li-row.li-row--highlighted{background:#f0fdf4}.li-row.li-row--highlighted:hover{background:#dcfce7}.li-row.li-row--static:hover{background:transparent}.li-row.li-row--static.li-row--highlighted,.li-row.li-row--static.li-row--highlighted:hover{background:#f0fdf4}.li-row.li-row--pressable{cursor:pointer}.li-row.li-row--pressable:focus-visible{outline:2px solid var(--primary, #2563eb);outline-offset:-2px}.li-body.li-body--static{cursor:default}.li-row [list-item-action],.li-row [li-action]{flex-shrink:0;align-self:center}.li-input{margin-top:3px;flex-shrink:0;accent-color:#16a34a;width:1rem;height:1rem;cursor:pointer}.li-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:12px}.li-icon--slate{background:#f1f5f9;color:#475569}.li-icon--amber{background:#fef3c7;color:#b45309}.li-icon--orange{background:#ffedd5;color:#c2410c}.li-icon--red{background:#fee2e2;color:#b91c1c}.li-icon--blue{background:#dbeafe;color:#1d4ed8}.li-icon--green{background:#dcfce7;color:#15803d}.li-icon--purple{background:#f3e8ff;color:#7e22ce}.li-icon--teal{background:#ccfbf1;color:#0f766e}.li-body{flex:1;min-width:0;cursor:pointer;display:flex;flex-direction:column;gap:6px}.li-title-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.li-title{font-size:.9375rem;font-weight:600;line-height:1.4;letter-spacing:-.005em;color:var(--text-primary, #0f172a)}.li-row--wrap .li-title{min-width:0;word-break:break-word;overflow-wrap:anywhere}.li-details{display:flex;flex-direction:column;gap:3px;font-size:.8125rem;line-height:1.4;color:var(--text-secondary, #64748b)}.li-detail{display:flex;align-items:center;gap:6px;min-width:0}.li-detail-icon{flex:0 0 auto;color:#94a3b8}.li-detail--warning,.li-detail--warning .li-detail-icon{color:#b45309}.li-detail--danger,.li-detail--danger .li-detail-icon{color:#b91c1c}.li-row--wrap .li-detail-text{min-width:0;word-break:break-word;overflow-wrap:anywhere}\n"]
29251
+ styles: ["ui-list-item{display:block}ui-list-item.li-bordered{border:1px solid var(--border, #e2e8f0);border-radius:12px;overflow:hidden;background:var(--surface, #fff);box-shadow:0 1px 2px #0f172a0a;margin-bottom:8px;transition:border-color .15s ease,box-shadow .15s ease}ui-list-item.li-bordered:last-child{margin-bottom:0}ui-list-item.li-bordered:hover{border-color:#cbd5e1;box-shadow:0 2px 6px #0f172a12}@media(prefers-reduced-motion:reduce){ui-list-item.li-bordered{transition:none}}.li-row{display:flex;align-items:flex-start;gap:14px;padding:12px 16px;border-bottom:1px solid var(--border, #e2e8f0);transition:background .12s}.li-row:last-child{border-bottom:none}.li-row:hover{background:var(--surface-hover, #f8fafc)}ui-list-item.li-bordered .li-row{border-bottom:none;padding:14px 16px}.li-row.li-row--highlighted{background:#f0fdf4}.li-row.li-row--highlighted:hover{background:#dcfce7}.li-row.li-row--static:hover{background:transparent}.li-row.li-row--static.li-row--highlighted,.li-row.li-row--static.li-row--highlighted:hover{background:#f0fdf4}.li-row.li-row--pressable{cursor:pointer}.li-row.li-row--pressable:focus-visible{outline:2px solid var(--primary, #2563eb);outline-offset:-2px}.li-body.li-body--static{cursor:default}.li-row [list-item-action],.li-row [li-action]{flex-shrink:0;align-self:center}.li-row>[list-item-image]{flex:0 0 auto;align-self:center}.li-row.li-row--disabled,.li-row.li-row--disabled:hover{opacity:.72;cursor:not-allowed;background-color:var(--surface-muted, #f8fafc);background-image:repeating-linear-gradient(135deg,transparent 0,transparent 6px,rgba(100,116,139,.1) 6px,rgba(100,116,139,.1) 12px)}.li-row.li-row--disabled .li-body,.li-row.li-row--disabled .li-input,.li-row.li-row--disabled.li-row--pressable{cursor:not-allowed}ui-list-item.li-disabled.li-bordered,ui-list-item.li-disabled.li-bordered:hover{border-style:dashed;box-shadow:none}.li-row.li-row--busy,.li-row.li-row--busy .li-body{cursor:progress}.li-spinner{flex:0 0 auto;align-self:center;box-sizing:border-box;width:16px;height:16px;border:2px solid rgba(100,116,139,.3);border-top-color:var(--text-secondary, #475569);border-radius:50%;animation:li-spin .6s linear infinite}@keyframes li-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.li-spinner{animation-duration:2s}}.li-input{margin-top:3px;flex-shrink:0;accent-color:#16a34a;width:1rem;height:1rem;cursor:pointer}.li-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:12px}.li-icon--slate{background:#f1f5f9;color:#475569}.li-icon--amber{background:#fef3c7;color:#b45309}.li-icon--orange{background:#ffedd5;color:#c2410c}.li-icon--red{background:#fee2e2;color:#b91c1c}.li-icon--blue{background:#dbeafe;color:#1d4ed8}.li-icon--green{background:#dcfce7;color:#15803d}.li-icon--purple{background:#f3e8ff;color:#7e22ce}.li-icon--teal{background:#ccfbf1;color:#0f766e}.li-body{flex:1;min-width:0;cursor:pointer;display:flex;flex-direction:column;gap:6px}.li-title-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.li-title{font-size:.9375rem;font-weight:600;line-height:1.4;letter-spacing:-.005em;color:var(--text-primary, #0f172a)}.li-row--wrap .li-title{min-width:0;word-break:break-word;overflow-wrap:anywhere}.li-details{display:flex;flex-direction:column;gap:3px;font-size:.8125rem;line-height:1.4;color:var(--text-secondary, #64748b)}.li-detail{display:flex;align-items:center;gap:6px;min-width:0}.li-detail-icon{flex:0 0 auto;color:#94a3b8}.li-detail--warning,.li-detail--warning .li-detail-icon{color:#b45309}.li-detail--danger,.li-detail--danger .li-detail-icon{color:#b91c1c}.li-row--wrap .li-detail-text{min-width:0;word-break:break-word;overflow-wrap:anywhere}\n"]
28694
29252
  }]
28695
29253
  }],
28696
29254
  propDecorators: {
@@ -28766,10 +29324,30 @@ i0.ɵɵngDeclareClassMetadata({
28766
29324
  required: false
28767
29325
  }]
28768
29326
  }],
29327
+ disabled: [{
29328
+ type: i0.Input,
29329
+ args: [{
29330
+ isSignal: true,
29331
+ alias: "disabled",
29332
+ required: false
29333
+ }]
29334
+ }],
29335
+ busy: [{
29336
+ type: i0.Input,
29337
+ args: [{
29338
+ isSignal: true,
29339
+ alias: "busy",
29340
+ required: false
29341
+ }]
29342
+ }],
28769
29343
  _borderedClass: [{
28770
29344
  type: HostBinding,
28771
29345
  args: ["class.li-bordered"]
28772
29346
  }],
29347
+ _disabledClass: [{
29348
+ type: HostBinding,
29349
+ args: ["class.li-disabled"]
29350
+ }],
28773
29351
  title: [{
28774
29352
  type: i0.Input,
28775
29353
  args: [{
@@ -30066,6 +30644,7 @@ var ListComponent = class ListComponent {
30066
30644
  this.injector = inject(Injector);
30067
30645
  this.items = input([], ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
30068
30646
  this.ordered = input(false, ...ngDevMode ? [{ debugName: "ordered" }] : /* istanbul ignore next */ []);
30647
+ this.bulleted = input(false, ...ngDevMode ? [{ debugName: "bulleted" }] : /* istanbul ignore next */ []);
30069
30648
  this.layout = input("list", ...ngDevMode ? [{ debugName: "layout" }] : /* istanbul ignore next */ []);
30070
30649
  this.gridMin = input(130, ...ngDevMode ? [{ debugName: "gridMin" }] : /* istanbul ignore next */ []);
30071
30650
  this.gap = input(void 0, ...ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []);
@@ -30361,6 +30940,13 @@ var ListComponent = class ListComponent {
30361
30940
  isRequired: false,
30362
30941
  transformFunction: null
30363
30942
  },
30943
+ bulleted: {
30944
+ classPropertyName: "bulleted",
30945
+ publicName: "bulleted",
30946
+ isSignal: true,
30947
+ isRequired: false,
30948
+ transformFunction: null
30949
+ },
30364
30950
  layout: {
30365
30951
  classPropertyName: "layout",
30366
30952
  publicName: "layout",
@@ -30545,7 +31131,7 @@ var ListComponent = class ListComponent {
30545
31131
  <ng-container [ngTemplateOutlet]="rowsTpl" />
30546
31132
  </ol>
30547
31133
  } @else {
30548
- <ul class="ul-list ul-list--unordered" role="list" [class.ul-list--grid]="isGrid()"
31134
+ <ul class="ul-list ul-list--unordered" role="list" [class.ul-list--grid]="isGrid()" [class.ul-list--bulleted]="bulleted() && !isGrid()"
30549
31135
  [style.--ul-gap]="gapCss()" [style.--ul-min.px]="isGrid() ? gridMin() : null"
30550
31136
  [attr.aria-label]="ariaLabel() || null" [attr.aria-labelledby]="ariaLabelledby() || null"
30551
31137
  (keydown)="onKeydown($event)" (click)="onClick($event)" (focusout)="onFocusOut($event)"
@@ -30565,7 +31151,7 @@ var ListComponent = class ListComponent {
30565
31151
  }
30566
31152
  `,
30567
31153
  isInline: true,
30568
- styles: ["ui-list{display:block;min-width:0}.ul-list{margin:0;padding:0;min-width:0}.ul-list--unordered{list-style:none}.ul-list--ordered{list-style:decimal;-webkit-padding-start:1.75rem;padding-inline-start:1.75rem}.ul-list--ordered>.ul-item::marker{color:var(--text-secondary, #64748b);font-size:.875rem}.ul-item{min-width:0;transition:background-color .4s ease}.ul-item.ul-item--moved{background-color:var(--surface-hover, #f1f5f9)}.ul-list:not(.ul-list--grid)>.ul-item+.ul-item{margin-top:var(--ul-gap, 0px)}.ul-list:not(.ul-list--grid)>.ul-item:not(:last-child)>.ul-row>.ul-content>ui-list-item:not(.li-bordered) .li-row{border-bottom:1px solid var(--border, #e2e8f0)}.ul-row{display:flex;align-items:center;gap:8px;min-width:0}.ul-content{flex:1 1 auto;min-width:0;word-break:break-word;overflow-wrap:anywhere}.ul-controls{display:flex;flex:0 0 auto;align-items:center;gap:2px}.ul-item--nav{cursor:pointer;border-radius:10px;transition:background-color .12s ease}.ul-item--nav:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.ul-item--nav:hover{background:var(--surface-hover, #f8fafc)}.ul-item--nav:hover:has(>.ul-row>.ul-content>ui-list-item.li-bordered){background:transparent}.ul-item--nav>.ul-row{padding-inline-end:8px}.ul-item--nav:hover .ul-chevron{color:#0f172a;transform:translate(2px)}.ul-chevron{flex:0 0 auto;color:#94a3b8;transition:color .15s ease,transform .15s ease}@media(prefers-reduced-motion:reduce){.ul-chevron{transition:none;transform:none!important}}.ul-item--nav:has(>.ul-row>.ul-content>ui-list-item.li-bordered)>.ul-row{position:relative;padding-inline-end:0}.ul-item--nav:has(>.ul-row>.ul-content>ui-list-item.li-bordered)>.ul-row>.ul-chevron{position:absolute;inset-inline-end:12px;top:50%;margin-top:-10px;pointer-events:none}.ul-item--nav>.ul-row>.ul-content>ui-list-item.li-bordered .li-row{padding-inline-end:40px}.ul-list.ul-list--grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--ul-min, 130px),100%),1fr));gap:var(--ul-gap, 12px);list-style:none;-webkit-padding-start:0;padding-inline-start:0}.ul-list--grid>.ul-item>.ul-row{flex-direction:column;align-items:stretch;gap:6px}.ul-list--grid>.ul-item>.ul-row>.ul-controls{align-self:center}@media(pointer:coarse),(max-width:480px){.ul-controls{gap:16px}}.ul-item--draggable{-webkit-user-select:none;user-select:none;-webkit-user-drag:element}@media(hover:hover)and (pointer:fine){.ul-item--draggable{cursor:grab}.ul-item--draggable:active{cursor:grabbing}}.ul-item--draggable:focus{outline:2px solid #3b82f6;outline-offset:2px;border-radius:6px}.ul-item--draggable:focus:not(:focus-visible){outline:none}ui-list .ul-item--draggable img,ui-list .ul-item--draggable ui-image-preview{pointer-events:none;-webkit-user-drag:none}.ul-item--dragging{opacity:.5}.ul-item--over{outline:2px dashed #3b82f6;outline-offset:2px;border-radius:6px}@media(prefers-reduced-motion:reduce){.ul-item{transition:none}}@media(forced-colors:active){.ul-item.ul-item--moved{outline:2px solid Highlight;outline-offset:-2px}}@media(forced-colors:active){.ul-item.ul-item--dragging{outline:2px dotted Highlight;outline-offset:2px}.ul-item.ul-item--over{outline:2px dashed Highlight;outline-offset:2px}.ul-item--draggable:focus{outline:2px solid Highlight;outline-offset:2px}}.ul-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"],
31154
+ styles: ["ui-list{display:block;min-width:0}.ul-list{margin:0;padding:0;min-width:0}.ul-list--unordered{list-style:none}.ul-list--unordered.ul-list--bulleted{list-style:disc;-webkit-padding-start:1.25rem;padding-inline-start:1.25rem}.ul-list--bulleted>.ul-item::marker{color:var(--text-secondary, #64748b)}.ul-list--ordered{list-style:decimal;-webkit-padding-start:1.75rem;padding-inline-start:1.75rem}.ul-list--ordered>.ul-item::marker{color:var(--text-secondary, #64748b);font-size:.875rem}.ul-item{min-width:0;transition:background-color .4s ease}.ul-item.ul-item--moved{background-color:var(--surface-hover, #f1f5f9)}.ul-list:not(.ul-list--grid)>.ul-item+.ul-item{margin-top:var(--ul-gap, 0px)}.ul-list:not(.ul-list--grid)>.ul-item:not(:last-child)>.ul-row>.ul-content>ui-list-item:not(.li-bordered) .li-row{border-bottom:1px solid var(--border, #e2e8f0)}.ul-row{display:flex;align-items:center;gap:8px;min-width:0}.ul-content{flex:1 1 auto;min-width:0;word-break:break-word;overflow-wrap:anywhere}.ul-controls{display:flex;flex:0 0 auto;align-items:center;gap:2px}.ul-item--nav{cursor:pointer;border-radius:10px;transition:background-color .12s ease}.ul-item--nav:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.ul-item--nav:hover{background:var(--surface-hover, #f8fafc)}.ul-item--nav:hover:has(>.ul-row>.ul-content>ui-list-item.li-bordered){background:transparent}.ul-item--nav>.ul-row{padding-inline-end:8px}.ul-item--nav:hover .ul-chevron{color:#0f172a;transform:translate(2px)}.ul-chevron{flex:0 0 auto;color:#94a3b8;transition:color .15s ease,transform .15s ease}@media(prefers-reduced-motion:reduce){.ul-chevron{transition:none;transform:none!important}}.ul-item--nav:has(>.ul-row>.ul-content>ui-list-item.li-bordered)>.ul-row{position:relative;padding-inline-end:0}.ul-item--nav:has(>.ul-row>.ul-content>ui-list-item.li-bordered)>.ul-row>.ul-chevron{position:absolute;inset-inline-end:12px;top:50%;margin-top:-10px;pointer-events:none}.ul-item--nav>.ul-row>.ul-content>ui-list-item.li-bordered .li-row{padding-inline-end:40px}.ul-list.ul-list--grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--ul-min, 130px),100%),1fr));gap:var(--ul-gap, 12px);list-style:none;-webkit-padding-start:0;padding-inline-start:0}.ul-list--grid>.ul-item>.ul-row{flex-direction:column;align-items:stretch;gap:6px}.ul-list--grid>.ul-item>.ul-row>.ul-controls{align-self:center}@media(pointer:coarse),(max-width:480px){.ul-controls{gap:16px}}.ul-item--draggable{-webkit-user-select:none;user-select:none;-webkit-user-drag:element}@media(hover:hover)and (pointer:fine){.ul-item--draggable{cursor:grab}.ul-item--draggable:active{cursor:grabbing}}.ul-item--draggable:focus{outline:2px solid #3b82f6;outline-offset:2px;border-radius:6px}.ul-item--draggable:focus:not(:focus-visible){outline:none}ui-list .ul-item--draggable img,ui-list .ul-item--draggable ui-image-preview{pointer-events:none;-webkit-user-drag:none}.ul-item--dragging{opacity:.5}.ul-item--over{outline:2px dashed #3b82f6;outline-offset:2px;border-radius:6px}@media(prefers-reduced-motion:reduce){.ul-item{transition:none}}@media(forced-colors:active){.ul-item.ul-item--moved{outline:2px solid Highlight;outline-offset:-2px}}@media(forced-colors:active){.ul-item.ul-item--dragging{outline:2px dotted Highlight;outline-offset:2px}.ul-item.ul-item--over{outline:2px dashed Highlight;outline-offset:2px}.ul-item--draggable:focus{outline:2px solid Highlight;outline-offset:2px}}.ul-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"],
30569
31155
  dependencies: [{
30570
31156
  kind: "directive",
30571
31157
  type: NgTemplateOutlet,
@@ -30674,7 +31260,7 @@ i0.ɵɵngDeclareClassMetadata({
30674
31260
  <ng-container [ngTemplateOutlet]="rowsTpl" />
30675
31261
  </ol>
30676
31262
  } @else {
30677
- <ul class="ul-list ul-list--unordered" role="list" [class.ul-list--grid]="isGrid()"
31263
+ <ul class="ul-list ul-list--unordered" role="list" [class.ul-list--grid]="isGrid()" [class.ul-list--bulleted]="bulleted() && !isGrid()"
30678
31264
  [style.--ul-gap]="gapCss()" [style.--ul-min.px]="isGrid() ? gridMin() : null"
30679
31265
  [attr.aria-label]="ariaLabel() || null" [attr.aria-labelledby]="ariaLabelledby() || null"
30680
31266
  (keydown)="onKeydown($event)" (click)="onClick($event)" (focusout)="onFocusOut($event)"
@@ -30693,7 +31279,7 @@ i0.ɵɵngDeclareClassMetadata({
30693
31279
  <div class="ul-sr" role="status" aria-live="polite" aria-atomic="true">{{ announcement() }}</div>
30694
31280
  }
30695
31281
  `,
30696
- styles: ["ui-list{display:block;min-width:0}.ul-list{margin:0;padding:0;min-width:0}.ul-list--unordered{list-style:none}.ul-list--ordered{list-style:decimal;-webkit-padding-start:1.75rem;padding-inline-start:1.75rem}.ul-list--ordered>.ul-item::marker{color:var(--text-secondary, #64748b);font-size:.875rem}.ul-item{min-width:0;transition:background-color .4s ease}.ul-item.ul-item--moved{background-color:var(--surface-hover, #f1f5f9)}.ul-list:not(.ul-list--grid)>.ul-item+.ul-item{margin-top:var(--ul-gap, 0px)}.ul-list:not(.ul-list--grid)>.ul-item:not(:last-child)>.ul-row>.ul-content>ui-list-item:not(.li-bordered) .li-row{border-bottom:1px solid var(--border, #e2e8f0)}.ul-row{display:flex;align-items:center;gap:8px;min-width:0}.ul-content{flex:1 1 auto;min-width:0;word-break:break-word;overflow-wrap:anywhere}.ul-controls{display:flex;flex:0 0 auto;align-items:center;gap:2px}.ul-item--nav{cursor:pointer;border-radius:10px;transition:background-color .12s ease}.ul-item--nav:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.ul-item--nav:hover{background:var(--surface-hover, #f8fafc)}.ul-item--nav:hover:has(>.ul-row>.ul-content>ui-list-item.li-bordered){background:transparent}.ul-item--nav>.ul-row{padding-inline-end:8px}.ul-item--nav:hover .ul-chevron{color:#0f172a;transform:translate(2px)}.ul-chevron{flex:0 0 auto;color:#94a3b8;transition:color .15s ease,transform .15s ease}@media(prefers-reduced-motion:reduce){.ul-chevron{transition:none;transform:none!important}}.ul-item--nav:has(>.ul-row>.ul-content>ui-list-item.li-bordered)>.ul-row{position:relative;padding-inline-end:0}.ul-item--nav:has(>.ul-row>.ul-content>ui-list-item.li-bordered)>.ul-row>.ul-chevron{position:absolute;inset-inline-end:12px;top:50%;margin-top:-10px;pointer-events:none}.ul-item--nav>.ul-row>.ul-content>ui-list-item.li-bordered .li-row{padding-inline-end:40px}.ul-list.ul-list--grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--ul-min, 130px),100%),1fr));gap:var(--ul-gap, 12px);list-style:none;-webkit-padding-start:0;padding-inline-start:0}.ul-list--grid>.ul-item>.ul-row{flex-direction:column;align-items:stretch;gap:6px}.ul-list--grid>.ul-item>.ul-row>.ul-controls{align-self:center}@media(pointer:coarse),(max-width:480px){.ul-controls{gap:16px}}.ul-item--draggable{-webkit-user-select:none;user-select:none;-webkit-user-drag:element}@media(hover:hover)and (pointer:fine){.ul-item--draggable{cursor:grab}.ul-item--draggable:active{cursor:grabbing}}.ul-item--draggable:focus{outline:2px solid #3b82f6;outline-offset:2px;border-radius:6px}.ul-item--draggable:focus:not(:focus-visible){outline:none}ui-list .ul-item--draggable img,ui-list .ul-item--draggable ui-image-preview{pointer-events:none;-webkit-user-drag:none}.ul-item--dragging{opacity:.5}.ul-item--over{outline:2px dashed #3b82f6;outline-offset:2px;border-radius:6px}@media(prefers-reduced-motion:reduce){.ul-item{transition:none}}@media(forced-colors:active){.ul-item.ul-item--moved{outline:2px solid Highlight;outline-offset:-2px}}@media(forced-colors:active){.ul-item.ul-item--dragging{outline:2px dotted Highlight;outline-offset:2px}.ul-item.ul-item--over{outline:2px dashed Highlight;outline-offset:2px}.ul-item--draggable:focus{outline:2px solid Highlight;outline-offset:2px}}.ul-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"]
31282
+ styles: ["ui-list{display:block;min-width:0}.ul-list{margin:0;padding:0;min-width:0}.ul-list--unordered{list-style:none}.ul-list--unordered.ul-list--bulleted{list-style:disc;-webkit-padding-start:1.25rem;padding-inline-start:1.25rem}.ul-list--bulleted>.ul-item::marker{color:var(--text-secondary, #64748b)}.ul-list--ordered{list-style:decimal;-webkit-padding-start:1.75rem;padding-inline-start:1.75rem}.ul-list--ordered>.ul-item::marker{color:var(--text-secondary, #64748b);font-size:.875rem}.ul-item{min-width:0;transition:background-color .4s ease}.ul-item.ul-item--moved{background-color:var(--surface-hover, #f1f5f9)}.ul-list:not(.ul-list--grid)>.ul-item+.ul-item{margin-top:var(--ul-gap, 0px)}.ul-list:not(.ul-list--grid)>.ul-item:not(:last-child)>.ul-row>.ul-content>ui-list-item:not(.li-bordered) .li-row{border-bottom:1px solid var(--border, #e2e8f0)}.ul-row{display:flex;align-items:center;gap:8px;min-width:0}.ul-content{flex:1 1 auto;min-width:0;word-break:break-word;overflow-wrap:anywhere}.ul-controls{display:flex;flex:0 0 auto;align-items:center;gap:2px}.ul-item--nav{cursor:pointer;border-radius:10px;transition:background-color .12s ease}.ul-item--nav:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.ul-item--nav:hover{background:var(--surface-hover, #f8fafc)}.ul-item--nav:hover:has(>.ul-row>.ul-content>ui-list-item.li-bordered){background:transparent}.ul-item--nav>.ul-row{padding-inline-end:8px}.ul-item--nav:hover .ul-chevron{color:#0f172a;transform:translate(2px)}.ul-chevron{flex:0 0 auto;color:#94a3b8;transition:color .15s ease,transform .15s ease}@media(prefers-reduced-motion:reduce){.ul-chevron{transition:none;transform:none!important}}.ul-item--nav:has(>.ul-row>.ul-content>ui-list-item.li-bordered)>.ul-row{position:relative;padding-inline-end:0}.ul-item--nav:has(>.ul-row>.ul-content>ui-list-item.li-bordered)>.ul-row>.ul-chevron{position:absolute;inset-inline-end:12px;top:50%;margin-top:-10px;pointer-events:none}.ul-item--nav>.ul-row>.ul-content>ui-list-item.li-bordered .li-row{padding-inline-end:40px}.ul-list.ul-list--grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--ul-min, 130px),100%),1fr));gap:var(--ul-gap, 12px);list-style:none;-webkit-padding-start:0;padding-inline-start:0}.ul-list--grid>.ul-item>.ul-row{flex-direction:column;align-items:stretch;gap:6px}.ul-list--grid>.ul-item>.ul-row>.ul-controls{align-self:center}@media(pointer:coarse),(max-width:480px){.ul-controls{gap:16px}}.ul-item--draggable{-webkit-user-select:none;user-select:none;-webkit-user-drag:element}@media(hover:hover)and (pointer:fine){.ul-item--draggable{cursor:grab}.ul-item--draggable:active{cursor:grabbing}}.ul-item--draggable:focus{outline:2px solid #3b82f6;outline-offset:2px;border-radius:6px}.ul-item--draggable:focus:not(:focus-visible){outline:none}ui-list .ul-item--draggable img,ui-list .ul-item--draggable ui-image-preview{pointer-events:none;-webkit-user-drag:none}.ul-item--dragging{opacity:.5}.ul-item--over{outline:2px dashed #3b82f6;outline-offset:2px;border-radius:6px}@media(prefers-reduced-motion:reduce){.ul-item{transition:none}}@media(forced-colors:active){.ul-item.ul-item--moved{outline:2px solid Highlight;outline-offset:-2px}}@media(forced-colors:active){.ul-item.ul-item--dragging{outline:2px dotted Highlight;outline-offset:2px}.ul-item.ul-item--over{outline:2px dashed Highlight;outline-offset:2px}.ul-item--draggable:focus{outline:2px solid Highlight;outline-offset:2px}}.ul-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"]
30697
31283
  }]
30698
31284
  }],
30699
31285
  propDecorators: {
@@ -30713,6 +31299,14 @@ i0.ɵɵngDeclareClassMetadata({
30713
31299
  required: false
30714
31300
  }]
30715
31301
  }],
31302
+ bulleted: [{
31303
+ type: i0.Input,
31304
+ args: [{
31305
+ isSignal: true,
31306
+ alias: "bulleted",
31307
+ required: false
31308
+ }]
31309
+ }],
30716
31310
  layout: [{
30717
31311
  type: i0.Input,
30718
31312
  args: [{
@@ -35645,6 +36239,7 @@ var AddressInputComponent = class AddressInputComponent {
35645
36239
  "inputName",
35646
36240
  "placeholder",
35647
36241
  "prefix",
36242
+ "leadingIcon",
35648
36243
  "revealable",
35649
36244
  "passwordRequirements",
35650
36245
  "passwordRules",
@@ -35682,6 +36277,7 @@ var AddressInputComponent = class AddressInputComponent {
35682
36277
  inputs: [
35683
36278
  "label",
35684
36279
  "ariaLabel",
36280
+ "labelHidden",
35685
36281
  "inputName",
35686
36282
  "placeholder",
35687
36283
  "options",
@@ -36093,8 +36689,10 @@ var ImageComponent = class ImageComponent {
36093
36689
  this.placeholder = input(true, ...ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []);
36094
36690
  this.priority = input(false, ...ngDevMode ? [{ debugName: "priority" }] : /* istanbul ignore next */ []);
36095
36691
  this.retryKey = input(null, ...ngDevMode ? [{ debugName: "retryKey" }] : /* istanbul ignore next */ []);
36692
+ this.interactive = input(false, ...ngDevMode ? [{ debugName: "interactive" }] : /* istanbul ignore next */ []);
36096
36693
  this.loaded = output();
36097
36694
  this.failed = output();
36695
+ this.activate = output();
36098
36696
  this._failed = signal(false, ...ngDevMode ? [{ debugName: "_failed" }] : /* istanbul ignore next */ []);
36099
36697
  this._url = computed(() => this.src()?.trim() || null, ...ngDevMode ? [{ debugName: "_url" }] : /* istanbul ignore next */ []);
36100
36698
  this.radiusCss = computed(() => RADIUS_PX[this.radius()] ?? "0", ...ngDevMode ? [{ debugName: "radiusCss" }] : /* istanbul ignore next */ []);
@@ -36113,6 +36711,14 @@ var ImageComponent = class ImageComponent {
36113
36711
  this._failed.set(true);
36114
36712
  this.failed.emit();
36115
36713
  }
36714
+ onActivate() {
36715
+ if (this.interactive()) this.activate.emit();
36716
+ }
36717
+ onKey(event) {
36718
+ if (!this.interactive()) return;
36719
+ event.preventDefault();
36720
+ this.activate.emit();
36721
+ }
36116
36722
  static {
36117
36723
  this.ɵfac = i0.ɵɵngDeclareFactory({
36118
36724
  minVersion: "12.0.0",
@@ -36235,16 +36841,35 @@ var ImageComponent = class ImageComponent {
36235
36841
  isSignal: true,
36236
36842
  isRequired: false,
36237
36843
  transformFunction: null
36844
+ },
36845
+ interactive: {
36846
+ classPropertyName: "interactive",
36847
+ publicName: "interactive",
36848
+ isSignal: true,
36849
+ isRequired: false,
36850
+ transformFunction: null
36238
36851
  }
36239
36852
  },
36240
36853
  outputs: {
36241
36854
  loaded: "loaded",
36242
- failed: "failed"
36855
+ failed: "failed",
36856
+ activate: "activate"
36857
+ },
36858
+ host: {
36859
+ listeners: {
36860
+ "click": "onActivate()",
36861
+ "keydown.enter": "onKey($event)",
36862
+ "keydown.space": "onKey($event)"
36863
+ },
36864
+ properties: {
36865
+ "style.text-align": "align()",
36866
+ "class.im-block": "isBlock()",
36867
+ "class.im-interactive": "interactive()",
36868
+ "attr.role": "interactive() ? 'button' : null",
36869
+ "attr.tabindex": "interactive() ? 0 : null",
36870
+ "attr.aria-label": "interactive() ? (alt() || null) : null"
36871
+ }
36243
36872
  },
36244
- host: { properties: {
36245
- "style.text-align": "align()",
36246
- "class.im-block": "isBlock()"
36247
- } },
36248
36873
  ngImport: i0,
36249
36874
  template: `
36250
36875
  @if (_url() && !_failed()) {
@@ -36262,7 +36887,7 @@ var ImageComponent = class ImageComponent {
36262
36887
  }
36263
36888
  `,
36264
36889
  isInline: true,
36265
- styles: [":host{display:inline-block;max-width:100%;line-height:0}:host(.im-block){display:block}.im-img{display:inline-block;max-width:100%;height:auto;vertical-align:top}.im-bordered{border:1px solid #e2e8f0;box-sizing:border-box}.im-ph{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:48px;min-height:48px;background:#f1f5f9;color:#94a3b8;vertical-align:top}.im-ph svg{width:32px;height:32px;max-width:55%;max-height:55%}\n"],
36890
+ styles: [":host{display:inline-block;max-width:100%;line-height:0}:host(.im-block){display:block}:host(.im-interactive){cursor:pointer}:host(.im-interactive:focus-visible){outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}.im-img{display:inline-block;max-width:100%;height:auto;vertical-align:top}.im-bordered{border:1px solid #e2e8f0;box-sizing:border-box}.im-ph{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:48px;min-height:48px;background:#f1f5f9;color:#94a3b8;vertical-align:top}.im-ph svg{width:32px;height:32px;max-width:55%;max-height:55%}\n"],
36266
36891
  changeDetection: i0.ChangeDetectionStrategy.OnPush
36267
36892
  });
36268
36893
  }
@@ -36280,7 +36905,14 @@ i0.ɵɵngDeclareClassMetadata({
36280
36905
  changeDetection: ChangeDetectionStrategy.OnPush,
36281
36906
  host: {
36282
36907
  "[style.text-align]": "align()",
36283
- "[class.im-block]": "isBlock()"
36908
+ "[class.im-block]": "isBlock()",
36909
+ "[class.im-interactive]": "interactive()",
36910
+ "[attr.role]": "interactive() ? 'button' : null",
36911
+ "[attr.tabindex]": "interactive() ? 0 : null",
36912
+ "[attr.aria-label]": "interactive() ? (alt() || null) : null",
36913
+ "(click)": "onActivate()",
36914
+ "(keydown.enter)": "onKey($event)",
36915
+ "(keydown.space)": "onKey($event)"
36284
36916
  },
36285
36917
  template: `
36286
36918
  @if (_url() && !_failed()) {
@@ -36297,7 +36929,7 @@ i0.ɵɵngDeclareClassMetadata({
36297
36929
  </span>
36298
36930
  }
36299
36931
  `,
36300
- styles: [":host{display:inline-block;max-width:100%;line-height:0}:host(.im-block){display:block}.im-img{display:inline-block;max-width:100%;height:auto;vertical-align:top}.im-bordered{border:1px solid #e2e8f0;box-sizing:border-box}.im-ph{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:48px;min-height:48px;background:#f1f5f9;color:#94a3b8;vertical-align:top}.im-ph svg{width:32px;height:32px;max-width:55%;max-height:55%}\n"]
36932
+ styles: [":host{display:inline-block;max-width:100%;line-height:0}:host(.im-block){display:block}:host(.im-interactive){cursor:pointer}:host(.im-interactive:focus-visible){outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}.im-img{display:inline-block;max-width:100%;height:auto;vertical-align:top}.im-bordered{border:1px solid #e2e8f0;box-sizing:border-box}.im-ph{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:48px;min-height:48px;background:#f1f5f9;color:#94a3b8;vertical-align:top}.im-ph svg{width:32px;height:32px;max-width:55%;max-height:55%}\n"]
36301
36933
  }]
36302
36934
  }],
36303
36935
  ctorParameters: () => [],
@@ -36422,6 +37054,14 @@ i0.ɵɵngDeclareClassMetadata({
36422
37054
  required: false
36423
37055
  }]
36424
37056
  }],
37057
+ interactive: [{
37058
+ type: i0.Input,
37059
+ args: [{
37060
+ isSignal: true,
37061
+ alias: "interactive",
37062
+ required: false
37063
+ }]
37064
+ }],
36425
37065
  loaded: [{
36426
37066
  type: i0.Output,
36427
37067
  args: ["loaded"]
@@ -36429,6 +37069,10 @@ i0.ɵɵngDeclareClassMetadata({
36429
37069
  failed: [{
36430
37070
  type: i0.Output,
36431
37071
  args: ["failed"]
37072
+ }],
37073
+ activate: [{
37074
+ type: i0.Output,
37075
+ args: ["activate"]
36432
37076
  }]
36433
37077
  }
36434
37078
  });
@@ -36773,9 +37417,14 @@ var ImageGalleryComponent = class ImageGalleryComponent {
36773
37417
  "align",
36774
37418
  "placeholder",
36775
37419
  "priority",
36776
- "retryKey"
37420
+ "retryKey",
37421
+ "interactive"
36777
37422
  ],
36778
- outputs: ["loaded", "failed"]
37423
+ outputs: [
37424
+ "loaded",
37425
+ "failed",
37426
+ "activate"
37427
+ ]
36779
37428
  },
36780
37429
  {
36781
37430
  kind: "component",
@@ -36943,6 +37592,8 @@ var KpiCardComponent = class KpiCardComponent {
36943
37592
  this.highlight = input(false, ...ngDevMode ? [{ debugName: "highlight" }] : /* istanbul ignore next */ []);
36944
37593
  this.clickable = input(false, ...ngDevMode ? [{ debugName: "clickable" }] : /* istanbul ignore next */ []);
36945
37594
  this.valueColor = input("default", ...ngDevMode ? [{ debugName: "valueColor" }] : /* istanbul ignore next */ []);
37595
+ this.loading = input(false, ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
37596
+ this.loadingLabel = input("Loading", ...ngDevMode ? [{ debugName: "loadingLabel" }] : /* istanbul ignore next */ []);
36946
37597
  this.background = input("", ...ngDevMode ? [{ debugName: "background" }] : /* istanbul ignore next */ []);
36947
37598
  this.progress = input(null, ...ngDevMode ? [{ debugName: "progress" }] : /* istanbul ignore next */ []);
36948
37599
  this.progressMax = input(100, ...ngDevMode ? [{ debugName: "progressMax" }] : /* istanbul ignore next */ []);
@@ -37036,6 +37687,20 @@ var KpiCardComponent = class KpiCardComponent {
37036
37687
  isRequired: false,
37037
37688
  transformFunction: null
37038
37689
  },
37690
+ loading: {
37691
+ classPropertyName: "loading",
37692
+ publicName: "loading",
37693
+ isSignal: true,
37694
+ isRequired: false,
37695
+ transformFunction: null
37696
+ },
37697
+ loadingLabel: {
37698
+ classPropertyName: "loadingLabel",
37699
+ publicName: "loadingLabel",
37700
+ isSignal: true,
37701
+ isRequired: false,
37702
+ transformFunction: null
37703
+ },
37039
37704
  background: {
37040
37705
  classPropertyName: "background",
37041
37706
  publicName: "background",
@@ -37100,6 +37765,7 @@ var KpiCardComponent = class KpiCardComponent {
37100
37765
  },
37101
37766
  properties: {
37102
37767
  "attr.role": "clickable() ? \"button\" : null",
37768
+ "attr.aria-busy": "loading() ? \"true\" : null",
37103
37769
  "attr.tabindex": "clickable() ? 0 : null"
37104
37770
  }
37105
37771
  },
@@ -37112,18 +37778,26 @@ var KpiCardComponent = class KpiCardComponent {
37112
37778
  @if (hasProgress()) {
37113
37779
  <div class="kpi-top">
37114
37780
  <span class="kpi-label">{{ label() }}</span>
37115
- <ui-progress-ring class="kpi-ring" [value]="progress()!" [max]="progressMax()" [size]="progressSize()" [strokeWidth]="progressStrokeWidth()"
37781
+ <ui-progress-ring class="kpi-ring" [attr.aria-hidden]="loading() ? 'true' : null" [value]="progress()!" [max]="progressMax()" [size]="progressSize()" [strokeWidth]="progressStrokeWidth()"
37116
37782
  [variant]="progressVariant()" [ariaLabel]="progressAriaLabel() || (label() + ' progress')" [valueText]="progressValueText()" />
37117
37783
  </div>
37118
37784
  } @else {
37119
37785
  <span class="kpi-label">{{ label() }}</span>
37120
37786
  }
37121
- <span class="kpi-value"
37122
- [class.green-value]="highlight() || valueColor() === 'green'"
37123
- [class.blue-value]="valueColor() === 'blue'"
37124
- [class.red-value]="valueColor() === 'red'">{{ value() }}</span>
37125
- @if (subtitle()) {
37126
- <span class="kpi-subtitle">{{ subtitle() }}</span>
37787
+ @if (loading()) {
37788
+ <span class="kpi-value kpi-value--loading" aria-hidden="true" data-testid="kpi-value-placeholder"><span class="kpi-bar"></span></span>
37789
+ <span class="kpi-loading-text">{{ loadingLabel() }}</span>
37790
+ @if (subtitle()) {
37791
+ <span class="kpi-subtitle kpi-subtitle--loading" aria-hidden="true" data-testid="kpi-subtitle-placeholder">{{ subtitle() }}</span>
37792
+ }
37793
+ } @else {
37794
+ <span class="kpi-value"
37795
+ [class.green-value]="highlight() || valueColor() === 'green'"
37796
+ [class.blue-value]="valueColor() === 'blue'"
37797
+ [class.red-value]="valueColor() === 'red'">{{ value() }}</span>
37798
+ @if (subtitle()) {
37799
+ <span class="kpi-subtitle">{{ subtitle() }}</span>
37800
+ }
37127
37801
  }
37128
37802
  <ng-content select="[kpi-footer]" />
37129
37803
  @if (clickable()) {
@@ -37132,7 +37806,7 @@ var KpiCardComponent = class KpiCardComponent {
37132
37806
  </div>
37133
37807
  `,
37134
37808
  isInline: true,
37135
- styles: [":host{display:block;height:100%}.kpi-card{position:relative;background:#fff;border:1px solid #e2e8f0;border-radius:10px;padding:16px;display:flex;flex-direction:column;gap:4px;min-width:0;height:100%;box-sizing:border-box;transition:border-color .15s ease,box-shadow .15s ease}:host(:focus){outline:none}:host(:focus-visible) .kpi-card{outline:2px solid #3b82f6;outline-offset:2px}.kpi-card.clickable{cursor:pointer}.kpi-card.clickable:hover{border-color:#93c5fd;box-shadow:0 2px 8px #3b82f614}.kpi-card.clickable:hover .kpi-arrow{color:#3b82f6;transform:translate(2px)}.kpi-arrow{position:absolute;bottom:14px;right:14px;color:#94a3b8;transition:color .15s ease,transform .15s ease}.kpi-icon{flex-shrink:0;width:36px;height:36px;border-radius:8px;display:flex;align-items:center;justify-content:center;margin-bottom:8px}.green-icon{background:#dcfce7;color:#16a34a}.blue-icon{background:#dbeafe;color:#2563eb}.amber-icon{background:#fef3c7;color:#d97706}.orange-icon{background:#ffedd5;color:#c2410c}.red-icon{background:#fee2e2;color:#dc2626}.slate-icon{background:#f1f5f9;color:#475569}.kpi-label{font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em}.kpi-top{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;min-height:36px;margin-bottom:4px}.kpi-ring{flex-shrink:0}.kpi-card.ring-corner .kpi-top{display:contents}.kpi-card.ring-corner .kpi-ring{position:absolute;top:12px;right:12px}.kpi-value{font-size:1.5rem;font-weight:700;color:#111827;line-height:1.1}.kpi-value.green-value{color:#16a34a}.kpi-value.blue-value{color:#3b82f6}.kpi-value.red-value{color:#dc2626}.kpi-subtitle{font-size:.75rem;color:#64748b;margin-top:2px}\n"],
37809
+ styles: [":host{display:block;height:100%}.kpi-card{position:relative;background:#fff;border:1px solid #e2e8f0;border-radius:10px;padding:16px;display:flex;flex-direction:column;gap:4px;min-width:0;height:100%;box-sizing:border-box;transition:border-color .15s ease,box-shadow .15s ease}:host(:focus){outline:none}:host(:focus-visible) .kpi-card{outline:2px solid #3b82f6;outline-offset:2px}.kpi-card.clickable{cursor:pointer}.kpi-card.clickable:hover{border-color:#93c5fd;box-shadow:0 2px 8px #3b82f614}.kpi-card.clickable:hover .kpi-arrow{color:#3b82f6;transform:translate(2px)}.kpi-arrow{position:absolute;bottom:14px;right:14px;color:#94a3b8;transition:color .15s ease,transform .15s ease}.kpi-icon{flex-shrink:0;width:36px;height:36px;border-radius:8px;display:flex;align-items:center;justify-content:center;margin-bottom:8px}.green-icon{background:#dcfce7;color:#16a34a}.blue-icon{background:#dbeafe;color:#2563eb}.amber-icon{background:#fef3c7;color:#d97706}.orange-icon{background:#ffedd5;color:#c2410c}.red-icon{background:#fee2e2;color:#dc2626}.slate-icon{background:#f1f5f9;color:#475569}.kpi-label{font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em}.kpi-top{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;min-height:36px;margin-bottom:4px}.kpi-ring{flex-shrink:0}.kpi-card.ring-corner .kpi-top{display:contents}.kpi-card.ring-corner .kpi-ring{position:absolute;top:12px;right:12px}.kpi-value{font-size:1.5rem;font-weight:700;color:#111827;line-height:1.1}.kpi-value.green-value{color:#16a34a}.kpi-value.blue-value{color:#3b82f6}.kpi-value.red-value{color:#dc2626}.kpi-subtitle{font-size:.75rem;color:#64748b;margin-top:2px}.kpi-value--loading{display:flex;align-items:center;height:1.65rem}.kpi-bar{display:block;width:60%;max-width:8rem;height:1.1rem;border-radius:6px;background:#e2e8f0;animation:kpi-pulse 1.4s ease-in-out infinite}.kpi-subtitle--loading{align-self:flex-start;max-width:100%;border-radius:4px;background:#e2e8f0;color:transparent;-webkit-user-select:none;user-select:none;animation:kpi-pulse 1.4s ease-in-out infinite}.kpi-loading-text{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@keyframes kpi-pulse{50%{opacity:.55}}@media(prefers-reduced-motion:reduce){.kpi-bar,.kpi-subtitle--loading{animation:none}}\n"],
37136
37810
  dependencies: [{
37137
37811
  kind: "component",
37138
37812
  type: ProgressRingComponent,
@@ -37168,6 +37842,7 @@ i0.ɵɵngDeclareClassMetadata({
37168
37842
  changeDetection: ChangeDetectionStrategy.OnPush,
37169
37843
  host: {
37170
37844
  "[attr.role]": "clickable() ? \"button\" : null",
37845
+ "[attr.aria-busy]": "loading() ? \"true\" : null",
37171
37846
  "[attr.tabindex]": "clickable() ? 0 : null",
37172
37847
  "(keydown.enter)": "onActivateKey($event)",
37173
37848
  "(keydown.space)": "onActivateKey($event)"
@@ -37180,18 +37855,26 @@ i0.ɵɵngDeclareClassMetadata({
37180
37855
  @if (hasProgress()) {
37181
37856
  <div class="kpi-top">
37182
37857
  <span class="kpi-label">{{ label() }}</span>
37183
- <ui-progress-ring class="kpi-ring" [value]="progress()!" [max]="progressMax()" [size]="progressSize()" [strokeWidth]="progressStrokeWidth()"
37858
+ <ui-progress-ring class="kpi-ring" [attr.aria-hidden]="loading() ? 'true' : null" [value]="progress()!" [max]="progressMax()" [size]="progressSize()" [strokeWidth]="progressStrokeWidth()"
37184
37859
  [variant]="progressVariant()" [ariaLabel]="progressAriaLabel() || (label() + ' progress')" [valueText]="progressValueText()" />
37185
37860
  </div>
37186
37861
  } @else {
37187
37862
  <span class="kpi-label">{{ label() }}</span>
37188
37863
  }
37189
- <span class="kpi-value"
37190
- [class.green-value]="highlight() || valueColor() === 'green'"
37191
- [class.blue-value]="valueColor() === 'blue'"
37192
- [class.red-value]="valueColor() === 'red'">{{ value() }}</span>
37193
- @if (subtitle()) {
37194
- <span class="kpi-subtitle">{{ subtitle() }}</span>
37864
+ @if (loading()) {
37865
+ <span class="kpi-value kpi-value--loading" aria-hidden="true" data-testid="kpi-value-placeholder"><span class="kpi-bar"></span></span>
37866
+ <span class="kpi-loading-text">{{ loadingLabel() }}</span>
37867
+ @if (subtitle()) {
37868
+ <span class="kpi-subtitle kpi-subtitle--loading" aria-hidden="true" data-testid="kpi-subtitle-placeholder">{{ subtitle() }}</span>
37869
+ }
37870
+ } @else {
37871
+ <span class="kpi-value"
37872
+ [class.green-value]="highlight() || valueColor() === 'green'"
37873
+ [class.blue-value]="valueColor() === 'blue'"
37874
+ [class.red-value]="valueColor() === 'red'">{{ value() }}</span>
37875
+ @if (subtitle()) {
37876
+ <span class="kpi-subtitle">{{ subtitle() }}</span>
37877
+ }
37195
37878
  }
37196
37879
  <ng-content select="[kpi-footer]" />
37197
37880
  @if (clickable()) {
@@ -37199,7 +37882,7 @@ i0.ɵɵngDeclareClassMetadata({
37199
37882
  }
37200
37883
  </div>
37201
37884
  `,
37202
- styles: [":host{display:block;height:100%}.kpi-card{position:relative;background:#fff;border:1px solid #e2e8f0;border-radius:10px;padding:16px;display:flex;flex-direction:column;gap:4px;min-width:0;height:100%;box-sizing:border-box;transition:border-color .15s ease,box-shadow .15s ease}:host(:focus){outline:none}:host(:focus-visible) .kpi-card{outline:2px solid #3b82f6;outline-offset:2px}.kpi-card.clickable{cursor:pointer}.kpi-card.clickable:hover{border-color:#93c5fd;box-shadow:0 2px 8px #3b82f614}.kpi-card.clickable:hover .kpi-arrow{color:#3b82f6;transform:translate(2px)}.kpi-arrow{position:absolute;bottom:14px;right:14px;color:#94a3b8;transition:color .15s ease,transform .15s ease}.kpi-icon{flex-shrink:0;width:36px;height:36px;border-radius:8px;display:flex;align-items:center;justify-content:center;margin-bottom:8px}.green-icon{background:#dcfce7;color:#16a34a}.blue-icon{background:#dbeafe;color:#2563eb}.amber-icon{background:#fef3c7;color:#d97706}.orange-icon{background:#ffedd5;color:#c2410c}.red-icon{background:#fee2e2;color:#dc2626}.slate-icon{background:#f1f5f9;color:#475569}.kpi-label{font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em}.kpi-top{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;min-height:36px;margin-bottom:4px}.kpi-ring{flex-shrink:0}.kpi-card.ring-corner .kpi-top{display:contents}.kpi-card.ring-corner .kpi-ring{position:absolute;top:12px;right:12px}.kpi-value{font-size:1.5rem;font-weight:700;color:#111827;line-height:1.1}.kpi-value.green-value{color:#16a34a}.kpi-value.blue-value{color:#3b82f6}.kpi-value.red-value{color:#dc2626}.kpi-subtitle{font-size:.75rem;color:#64748b;margin-top:2px}\n"]
37885
+ styles: [":host{display:block;height:100%}.kpi-card{position:relative;background:#fff;border:1px solid #e2e8f0;border-radius:10px;padding:16px;display:flex;flex-direction:column;gap:4px;min-width:0;height:100%;box-sizing:border-box;transition:border-color .15s ease,box-shadow .15s ease}:host(:focus){outline:none}:host(:focus-visible) .kpi-card{outline:2px solid #3b82f6;outline-offset:2px}.kpi-card.clickable{cursor:pointer}.kpi-card.clickable:hover{border-color:#93c5fd;box-shadow:0 2px 8px #3b82f614}.kpi-card.clickable:hover .kpi-arrow{color:#3b82f6;transform:translate(2px)}.kpi-arrow{position:absolute;bottom:14px;right:14px;color:#94a3b8;transition:color .15s ease,transform .15s ease}.kpi-icon{flex-shrink:0;width:36px;height:36px;border-radius:8px;display:flex;align-items:center;justify-content:center;margin-bottom:8px}.green-icon{background:#dcfce7;color:#16a34a}.blue-icon{background:#dbeafe;color:#2563eb}.amber-icon{background:#fef3c7;color:#d97706}.orange-icon{background:#ffedd5;color:#c2410c}.red-icon{background:#fee2e2;color:#dc2626}.slate-icon{background:#f1f5f9;color:#475569}.kpi-label{font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em}.kpi-top{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;min-height:36px;margin-bottom:4px}.kpi-ring{flex-shrink:0}.kpi-card.ring-corner .kpi-top{display:contents}.kpi-card.ring-corner .kpi-ring{position:absolute;top:12px;right:12px}.kpi-value{font-size:1.5rem;font-weight:700;color:#111827;line-height:1.1}.kpi-value.green-value{color:#16a34a}.kpi-value.blue-value{color:#3b82f6}.kpi-value.red-value{color:#dc2626}.kpi-subtitle{font-size:.75rem;color:#64748b;margin-top:2px}.kpi-value--loading{display:flex;align-items:center;height:1.65rem}.kpi-bar{display:block;width:60%;max-width:8rem;height:1.1rem;border-radius:6px;background:#e2e8f0;animation:kpi-pulse 1.4s ease-in-out infinite}.kpi-subtitle--loading{align-self:flex-start;max-width:100%;border-radius:4px;background:#e2e8f0;color:transparent;-webkit-user-select:none;user-select:none;animation:kpi-pulse 1.4s ease-in-out infinite}.kpi-loading-text{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@keyframes kpi-pulse{50%{opacity:.55}}@media(prefers-reduced-motion:reduce){.kpi-bar,.kpi-subtitle--loading{animation:none}}\n"]
37203
37886
  }]
37204
37887
  }],
37205
37888
  propDecorators: {
@@ -37267,6 +37950,22 @@ i0.ɵɵngDeclareClassMetadata({
37267
37950
  required: false
37268
37951
  }]
37269
37952
  }],
37953
+ loading: [{
37954
+ type: i0.Input,
37955
+ args: [{
37956
+ isSignal: true,
37957
+ alias: "loading",
37958
+ required: false
37959
+ }]
37960
+ }],
37961
+ loadingLabel: [{
37962
+ type: i0.Input,
37963
+ args: [{
37964
+ isSignal: true,
37965
+ alias: "loadingLabel",
37966
+ required: false
37967
+ }]
37968
+ }],
37270
37969
  background: [{
37271
37970
  type: i0.Input,
37272
37971
  args: [{
@@ -37578,7 +38277,8 @@ var DateRangePickerComponent = class DateRangePickerComponent {
37578
38277
  "ariaLabel",
37579
38278
  "name",
37580
38279
  "noWrap",
37581
- "orientation"
38280
+ "orientation",
38281
+ "controlsPanels"
37582
38282
  ],
37583
38283
  outputs: ["tabChange"]
37584
38284
  },
@@ -39550,6 +40250,7 @@ var RadioMatrixComponent = class RadioMatrixComponent {
39550
40250
  inputs: [
39551
40251
  "label",
39552
40252
  "description",
40253
+ "icon",
39553
40254
  "ariaLabel",
39554
40255
  "testId",
39555
40256
  "value",
@@ -45100,7 +45801,8 @@ var CalendarComponent = class CalendarComponent {
45100
45801
  "ariaLabel",
45101
45802
  "name",
45102
45803
  "noWrap",
45103
- "orientation"
45804
+ "orientation",
45805
+ "controlsPanels"
45104
45806
  ],
45105
45807
  outputs: ["tabChange"]
45106
45808
  },
@@ -49341,6 +50043,7 @@ var SetupWizardComponent = class SetupWizardComponent {
49341
50043
  "background",
49342
50044
  "headerBackground",
49343
50045
  "footerBackground",
50046
+ "footerAlign",
49344
50047
  "textColor",
49345
50048
  "showHeader",
49346
50049
  "collapsible",
@@ -49406,7 +50109,8 @@ var SetupWizardComponent = class SetupWizardComponent {
49406
50109
  "ariaLabel",
49407
50110
  "name",
49408
50111
  "noWrap",
49409
- "orientation"
50112
+ "orientation",
50113
+ "controlsPanels"
49410
50114
  ],
49411
50115
  outputs: ["tabChange"]
49412
50116
  },
@@ -49493,6 +50197,7 @@ var SetupWizardComponent = class SetupWizardComponent {
49493
50197
  "inputName",
49494
50198
  "placeholder",
49495
50199
  "prefix",
50200
+ "leadingIcon",
49496
50201
  "revealable",
49497
50202
  "passwordRequirements",
49498
50203
  "passwordRules",
@@ -51606,7 +52311,8 @@ var EmailTemplateEditorComponent = class EmailTemplateEditorComponent {
51606
52311
  "ariaLabel",
51607
52312
  "name",
51608
52313
  "noWrap",
51609
- "orientation"
52314
+ "orientation",
52315
+ "controlsPanels"
51610
52316
  ],
51611
52317
  outputs: ["tabChange"]
51612
52318
  },
@@ -51652,6 +52358,7 @@ var EmailTemplateEditorComponent = class EmailTemplateEditorComponent {
51652
52358
  inputs: [
51653
52359
  "label",
51654
52360
  "ariaLabel",
52361
+ "labelHidden",
51655
52362
  "inputName",
51656
52363
  "placeholder",
51657
52364
  "options",
@@ -51710,6 +52417,7 @@ var EmailTemplateEditorComponent = class EmailTemplateEditorComponent {
51710
52417
  "inputName",
51711
52418
  "placeholder",
51712
52419
  "prefix",
52420
+ "leadingIcon",
51713
52421
  "revealable",
51714
52422
  "passwordRequirements",
51715
52423
  "passwordRules",
@@ -55165,6 +55873,7 @@ var ConversationsComponent = class ConversationsComponent {
55165
55873
  inputs: [
55166
55874
  "items",
55167
55875
  "ordered",
55876
+ "bulleted",
55168
55877
  "layout",
55169
55878
  "gridMin",
55170
55879
  "gap",
@@ -58136,6 +58845,8 @@ var PaymentSidePanelComponent = class PaymentSidePanelComponent {
58136
58845
  "highlight",
58137
58846
  "clickable",
58138
58847
  "valueColor",
58848
+ "loading",
58849
+ "loadingLabel",
58139
58850
  "background",
58140
58851
  "progress",
58141
58852
  "progressMax",
@@ -58159,6 +58870,7 @@ var PaymentSidePanelComponent = class PaymentSidePanelComponent {
58159
58870
  inputs: [
58160
58871
  "label",
58161
58872
  "ariaLabel",
58873
+ "labelHidden",
58162
58874
  "inputName",
58163
58875
  "placeholder",
58164
58876
  "options",
@@ -58205,6 +58917,7 @@ var PaymentSidePanelComponent = class PaymentSidePanelComponent {
58205
58917
  "inputName",
58206
58918
  "placeholder",
58207
58919
  "prefix",
58920
+ "leadingIcon",
58208
58921
  "revealable",
58209
58922
  "passwordRequirements",
58210
58923
  "passwordRules",
@@ -58704,6 +59417,6 @@ i0.ɵɵngDeclareClassMetadata({
58704
59417
  }]
58705
59418
  }
58706
59419
  });
58707
- export { ALLOCATION_CUSTOM, ASCII_SPECIAL_PASSWORD_RULES, ActionBarComponent, AddressInputComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BankAccountFormComponent, BarRowComponent, BoardCardDirective, BoardComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, COMMON_DETAIL_GROUP_STYLES, CalendarComponent, CardListItemComponent, CheckboxComponent, CheckboxTrailingDirective, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, ConversationRichBodyComponent, ConversationsComponent, DEFAULT_ALLOCATION_MODES, DEFAULT_BANK_ACCOUNT_TYPE_OPTIONS, DEFAULT_BANK_HOLDER_TYPE_OPTIONS, DEFAULT_BANK_MANDATE_TEXT, DEFAULT_EMAIL_TEMPLATE_BLOCK_GROUPS, DEFAULT_EMAIL_TEMPLATE_VARIABLE_GROUPS, DEFAULT_PASSWORD_RULES, DEFAULT_PAYMENT_METHODS, DETAIL_CARD_HEADER_BG, DETAIL_GROUP_HEADER_BG, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DropdownComponent, EMAIL_BLOCK_DRAG_TYPE, EMAIL_TEMPLATE_MAX_BODY, EMAIL_TEMPLATE_MAX_TEXT, EMAIL_TEMPLATE_START_TEXT, EmailTemplateEditorComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FadeComponent, FileInputComponent, FillViewportDirective, FixedFooterComponent, FormColSpanDirective, FormComponent, FormRowComponent, FormSectionComponent, HintComponent, IDX_BEHAVIOR_SIGNALS, INTEGRATION_CATALOG, INTEGRATION_FIELD_DEFS, INTEGRATION_GROUP_ORDER, INTEGRATION_OPTION_DEFS, IconComponent, ImageComponent, ImageGalleryComponent, ImageGalleryDialogComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, ImportSourceGridComponent, KeypadComponent, KpiCardComponent, LAYOUT_GAP_PX, LISTED_SPECIAL_PASSWORD_RULES, ListComponent, ListItemComponent, LiveRegionComponent, MAX_EMAIL_ADDRESS_LENGTH, MAX_PAYMENT_AMOUNT, MIN_PAYMENT_AMOUNT, ModalComponent, MoreMenuComponent, MultiSelectComponent, NOTES_MAX_LENGTH, NotesComponent, OfflineBannerComponent, OptionCardComponent, PASSWORD_MAX_LENGTH, PAYMENT_METHOD, PAYMENT_METHOD_PLUGIN, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PageComponent, PaginationComponent, PanelInfoListComponent, PasswordRequirementsComponent, PaymentCustomMethodComponent, PaymentMethodPlugin, PaymentSidePanelComponent, PdfHotspotComponent, PhoneNumberPickerComponent, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, RadioOptionContentDirective, ReadonlyFieldsetComponent, ReminderAlertsComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SETUP_DONE_KEY, SETUP_INTEGRATIONS, SearchInputComponent, SectionHeaderComponent, SelectComponent, SetupWizardComponent, SetupWizardStepDirective, SetupWizardStepHeaderDirective, ShareMenuComponent, ShowComponent, SidePanelComponent, SidebarLayoutComponent, SignaturePadComponent, SkeletonComponent, SnackbarComponent, SnackbarService, StackComponent, StarComponent, StepperComponent, TableToolbarComponent, TextComponent, TextInputComponent, TextTemplatePickerComponent, TextareaInputComponent, TimeInputComponent, TimelineComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_LOCATIONS, US_STATES, US_STATE_OPTIONS, US_ZIP_PATTERN, UiFieldValidity, acceptLabel, appShellGroupsStorageKey, autoVariant, blockHasContent, buildDefaultSchedule, buildPreviewDocument, buildVideoBlockHtml, builtInActionIcon, businessTimeOptions, callHost, conversationDateLabel, conversationHtmlToText, conversationInitial, conversationMessageStatusLabel, conversationMessageStatusMark, createFieldReveal, createPasswordPolicyValidator, decodeFilterValues, digitsOnly, downloadBlob, emailShareUrl, emptyAddress, encodeFilterValue, encodeFilterValues, errorContextInterceptor, escapeHtml, facebookShareUrl, fileMatchesAccept, fileNameFromContentDisposition, formatAddress, formatAddressValue, formatAddressValueOneLine, formatCategoryLabel, formatConversationPhone, formatConversationTime, formatCurrency, formatDuration, formatFileSize, formatIsoDate, formatIsoDateTime, formatMessageTime, formatPhone, formatPhoneDisplay, formatShortDate, formatTime, formatVideoDuration, getEligibleIds, getEligibleOptions, getErrorMessage, getInitials, gmailShareUrl, groupMessagesByDay, hostErrorMessage, humanReadableMessage, iconPath, insideEditorBlock, integrationPlainText, integrationsForApp, integrationsOnlyFor, isBlockDrag, isEmptyAddress, isValidAmount, isValidEmailAddress, isValidZip, isWebUrl, isoKey, issueToErrors, last4Error, linkedInShareUrl, maxLengthIssue, mergeDescribedBy, normalizeAddress, normalizeHexColor, outlookShareUrl, parseAddressOneLine, parseAddressValue, parseBizHours, parseIso, parseTime, passwordMeetsRules, periodGroup, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, serializeBizHours, serializedTextLength, setupIntegrations, splitIntro, terminalTimeoutText, terminalVerdict, todayInTimezone, truncateConversationText, xShareUrl };
59420
+ export { ALLOCATION_CUSTOM, ASCII_SPECIAL_PASSWORD_RULES, ActionBarComponent, AddressInputComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BankAccountFormComponent, BarRowComponent, BoardCardDirective, BoardComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, COMMON_DETAIL_GROUP_STYLES, CalendarComponent, CardListItemComponent, CheckboxComponent, CheckboxTrailingDirective, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, ConversationRichBodyComponent, ConversationsComponent, DEFAULT_ALLOCATION_MODES, DEFAULT_BANK_ACCOUNT_TYPE_OPTIONS, DEFAULT_BANK_HOLDER_TYPE_OPTIONS, DEFAULT_BANK_MANDATE_TEXT, DEFAULT_EMAIL_TEMPLATE_BLOCK_GROUPS, DEFAULT_EMAIL_TEMPLATE_VARIABLE_GROUPS, DEFAULT_PASSWORD_RULES, DEFAULT_PAYMENT_METHODS, DETAIL_CARD_HEADER_BG, DETAIL_GROUP_HEADER_BG, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DropdownComponent, EMAIL_BLOCK_DRAG_TYPE, EMAIL_TEMPLATE_MAX_BODY, EMAIL_TEMPLATE_MAX_TEXT, EMAIL_TEMPLATE_START_TEXT, EmailTemplateEditorComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FadeComponent, FileInputComponent, FillViewportDirective, FixedFooterComponent, FormColSpanDirective, FormComponent, FormRowComponent, FormSectionComponent, HintComponent, ICON_NAMES, IDX_BEHAVIOR_SIGNALS, INTEGRATION_CATALOG, INTEGRATION_FIELD_DEFS, INTEGRATION_GROUP_ORDER, INTEGRATION_OPTION_DEFS, IconComponent, ImageComponent, ImageGalleryComponent, ImageGalleryDialogComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, ImportSourceGridComponent, KeypadComponent, KpiCardComponent, LAYOUT_GAP_PX, LISTED_SPECIAL_PASSWORD_RULES, ListComponent, ListItemComponent, LiveRegionComponent, MAX_EMAIL_ADDRESS_LENGTH, MAX_PAYMENT_AMOUNT, MIN_PAYMENT_AMOUNT, ModalComponent, MoreMenuComponent, MultiSelectComponent, NOTES_MAX_LENGTH, NotesComponent, OfflineBannerComponent, OptionCardComponent, PASSWORD_MAX_LENGTH, PAYMENT_METHOD, PAYMENT_METHOD_PLUGIN, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PageComponent, PaginationComponent, PanelInfoListComponent, PasswordRequirementsComponent, PaymentCustomMethodComponent, PaymentMethodPlugin, PaymentSidePanelComponent, PdfHotspotComponent, PhoneNumberPickerComponent, PillTabPanelDirective, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, RadioOptionContentDirective, ReadonlyFieldsetComponent, ReminderAlertsComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SETUP_DONE_KEY, SETUP_INTEGRATIONS, SearchInputComponent, SectionHeaderComponent, SelectComponent, SetupWizardComponent, SetupWizardStepDirective, SetupWizardStepHeaderDirective, ShareMenuComponent, ShowComponent, SidePanelComponent, SidebarLayoutComponent, SignaturePadComponent, SkeletonComponent, SnackbarComponent, SnackbarService, StackComponent, StarComponent, StepperComponent, TableToolbarComponent, TextComponent, TextInputComponent, TextTemplatePickerComponent, TextareaInputComponent, TimeInputComponent, TimelineComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_LOCATIONS, US_STATES, US_STATE_OPTIONS, US_ZIP_PATTERN, UiFieldValidity, acceptLabel, appShellGroupsStorageKey, autoVariant, blockHasContent, buildDefaultSchedule, buildPreviewDocument, buildVideoBlockHtml, builtInActionIcon, businessTimeOptions, callHost, conversationDateLabel, conversationHtmlToText, conversationInitial, conversationMessageStatusLabel, conversationMessageStatusMark, createFieldReveal, createPasswordPolicyValidator, decodeFilterValues, digitsOnly, downloadBlob, emailShareUrl, emptyAddress, encodeFilterValue, encodeFilterValues, errorContextInterceptor, escapeHtml, facebookShareUrl, fileMatchesAccept, fileNameFromContentDisposition, formatAddress, formatAddressValue, formatAddressValueOneLine, formatCategoryLabel, formatConversationPhone, formatConversationTime, formatCurrency, formatDuration, formatFileSize, formatIsoDate, formatIsoDateTime, formatMessageTime, formatPhone, formatPhoneDisplay, formatShortDate, formatTime, formatVideoDuration, getEligibleIds, getEligibleOptions, getErrorMessage, getInitials, gmailShareUrl, groupMessagesByDay, hostErrorMessage, humanReadableMessage, iconPath, insideEditorBlock, integrationPlainText, integrationsForApp, integrationsOnlyFor, isBlockDrag, isEmptyAddress, isValidAmount, isValidEmailAddress, isValidZip, isWebUrl, isoKey, issueToErrors, last4Error, linkedInShareUrl, maxLengthIssue, mergeDescribedBy, normalizeAddress, normalizeHexColor, outlookShareUrl, parseAddressOneLine, parseAddressValue, parseBizHours, parseIso, parseTime, passwordMeetsRules, periodGroup, pillTabId, pillTabPanelId, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, serializeBizHours, serializedTextLength, setupIntegrations, splitIntro, terminalTimeoutText, terminalVerdict, todayInTimezone, truncateConversationText, xShareUrl };
58708
59421
 
58709
59422
  //# sourceMappingURL=forgeroute-ui.mjs.map