@forgeroute/ui 0.4.8 → 0.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from "@angular/core";
2
- import { ApplicationRef, ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, Directive, ElementRef, EnvironmentInjector, HostBinding, HostListener, Injectable, InjectionToken, Injector, Input, PLATFORM_ID, Renderer2, TemplateRef, afterNextRender, computed, contentChild, contentChildren, createComponent, effect, forwardRef, inject, input, isDevMode, linkedSignal, makeEnvironmentProviders, model, output, provideEnvironmentInitializer, signal, untracked, viewChild } from "@angular/core";
2
+ import { ApplicationRef, ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, Directive, ElementRef, EnvironmentInjector, HostBinding, HostListener, Injectable, InjectionToken, Injector, Input, NgZone, PLATFORM_ID, Renderer2, TemplateRef, afterNextRender, computed, contentChild, contentChildren, createComponent, effect, forwardRef, inject, input, isDevMode, linkedSignal, makeEnvironmentProviders, model, output, provideEnvironmentInitializer, signal, untracked, viewChild } from "@angular/core";
3
3
  import { HttpClient, HttpErrorResponse, HttpParams } from "@angular/common/http";
4
4
  import { takeUntilDestroyed, toObservable } from "@angular/core/rxjs-interop";
5
5
  import { catchError, debounceTime, distinctUntilChanged, skip, switchMap } from "rxjs/operators";
@@ -1902,7 +1902,7 @@ var MoreMenuComponent = class MoreMenuComponent {
1902
1902
  </div>
1903
1903
  `,
1904
1904
  isInline: true,
1905
- styles: [":host{display:inline-block;position:relative}.mm-wrapper{position:relative}.mm-trigger{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;border:none;background:transparent;color:#94a3b8;cursor:pointer;transition:background .1s,color .1s}.mm-trigger:hover{background:#f1f5f9;color:#334155}.mm-trigger:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.mm-dropdown{position:absolute;right:0;top:calc(100% + 4px);z-index:200;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;min-width:160px;overflow-x:hidden;overflow-y:auto;padding:4px;max-width:calc(100vw - 16px);overscroll-behavior:contain;background:linear-gradient(#fff 30%,#fff0) center top / 100% 16px no-repeat local,linear-gradient(#fff0,#fff 70%) center bottom / 100% 16px no-repeat local,radial-gradient(farthest-side at 50% 0,#0f172a38,#0f172a00) center top / 100% 8px no-repeat scroll,radial-gradient(farthest-side at 50% 100%,#0f172a38,#0f172a00) center bottom / 100% 8px no-repeat scroll,#fff}.mm-dropdown.mm-up{top:auto;bottom:calc(100% + 4px)}.mm-dropdown.mm-fixed{position:fixed;left:auto}.mm-item{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;background:none;border:none;cursor:pointer;font-size:.875rem;color:#334155;font-family:inherit;text-align:left;border-radius:5px;transition:background .1s;min-height:40px}.mm-item:hover:not(:disabled){background:#f8fafc}.mm-item:disabled{opacity:.4;cursor:default}.mm-item.mm-danger{color:#dc2626}.mm-item.mm-danger:hover:not(:disabled){background:#fef2f2}.mm-item:focus-visible{outline:2px solid #60a5fa;outline-offset:-2px}.mm-icon{flex-shrink:0}@media(max-width:1024px){.mm-trigger{width:36px;height:36px}.mm-item{padding:11px 14px;min-height:40px}}@media(pointer:coarse){.mm-trigger{width:44px;height:44px}}@media(max-width:640px){.mm-trigger{width:44px;height:44px}.mm-item{padding:12px 14px;font-size:.9375rem;min-height:44px}.mm-dropdown{max-height:60vh;overflow-y:auto}}\n"],
1905
+ styles: [":host{display:inline-block;position:relative}.mm-wrapper{position:relative}.mm-trigger{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;border:none;background:transparent;color:#64748b;cursor:pointer;transition:background .1s,color .1s}.mm-trigger:hover{background:#f1f5f9;color:#334155}.mm-trigger:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.mm-dropdown{position:absolute;right:0;top:calc(100% + 4px);z-index:200;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;min-width:160px;overflow-x:hidden;overflow-y:auto;padding:4px;max-width:calc(100vw - 16px);overscroll-behavior:contain;background:linear-gradient(#fff 30%,#fff0) center top / 100% 16px no-repeat local,linear-gradient(#fff0,#fff 70%) center bottom / 100% 16px no-repeat local,radial-gradient(farthest-side at 50% 0,#0f172a38,#0f172a00) center top / 100% 8px no-repeat scroll,radial-gradient(farthest-side at 50% 100%,#0f172a38,#0f172a00) center bottom / 100% 8px no-repeat scroll,#fff}.mm-dropdown.mm-up{top:auto;bottom:calc(100% + 4px)}.mm-dropdown.mm-fixed{position:fixed;left:auto}.mm-item{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;background:none;border:none;cursor:pointer;font-size:.875rem;color:#334155;font-family:inherit;text-align:left;border-radius:5px;transition:background .1s;min-height:40px}.mm-item:hover:not(:disabled){background:#f8fafc}.mm-item:disabled{opacity:.4;cursor:default}.mm-item.mm-danger{color:#dc2626}.mm-item.mm-danger:hover:not(:disabled){background:#fef2f2}.mm-item:focus-visible{outline:2px solid #60a5fa;outline-offset:-2px}.mm-icon{flex-shrink:0}@media(max-width:1024px){.mm-trigger{width:36px;height:36px}.mm-item{padding:11px 14px;min-height:40px}}@media(pointer:coarse){.mm-trigger{width:44px;height:44px}}@media(max-width:640px){.mm-trigger{width:44px;height:44px}.mm-item{padding:12px 14px;font-size:.9375rem;min-height:44px}.mm-dropdown{max-height:60vh;overflow-y:auto}}\n"],
1906
1906
  changeDetection: i0.ChangeDetectionStrategy.OnPush
1907
1907
  });
1908
1908
  }
@@ -1958,7 +1958,7 @@ i0.ɵɵngDeclareClassMetadata({
1958
1958
  }
1959
1959
  </div>
1960
1960
  `,
1961
- styles: [":host{display:inline-block;position:relative}.mm-wrapper{position:relative}.mm-trigger{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;border:none;background:transparent;color:#94a3b8;cursor:pointer;transition:background .1s,color .1s}.mm-trigger:hover{background:#f1f5f9;color:#334155}.mm-trigger:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.mm-dropdown{position:absolute;right:0;top:calc(100% + 4px);z-index:200;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;min-width:160px;overflow-x:hidden;overflow-y:auto;padding:4px;max-width:calc(100vw - 16px);overscroll-behavior:contain;background:linear-gradient(#fff 30%,#fff0) center top / 100% 16px no-repeat local,linear-gradient(#fff0,#fff 70%) center bottom / 100% 16px no-repeat local,radial-gradient(farthest-side at 50% 0,#0f172a38,#0f172a00) center top / 100% 8px no-repeat scroll,radial-gradient(farthest-side at 50% 100%,#0f172a38,#0f172a00) center bottom / 100% 8px no-repeat scroll,#fff}.mm-dropdown.mm-up{top:auto;bottom:calc(100% + 4px)}.mm-dropdown.mm-fixed{position:fixed;left:auto}.mm-item{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;background:none;border:none;cursor:pointer;font-size:.875rem;color:#334155;font-family:inherit;text-align:left;border-radius:5px;transition:background .1s;min-height:40px}.mm-item:hover:not(:disabled){background:#f8fafc}.mm-item:disabled{opacity:.4;cursor:default}.mm-item.mm-danger{color:#dc2626}.mm-item.mm-danger:hover:not(:disabled){background:#fef2f2}.mm-item:focus-visible{outline:2px solid #60a5fa;outline-offset:-2px}.mm-icon{flex-shrink:0}@media(max-width:1024px){.mm-trigger{width:36px;height:36px}.mm-item{padding:11px 14px;min-height:40px}}@media(pointer:coarse){.mm-trigger{width:44px;height:44px}}@media(max-width:640px){.mm-trigger{width:44px;height:44px}.mm-item{padding:12px 14px;font-size:.9375rem;min-height:44px}.mm-dropdown{max-height:60vh;overflow-y:auto}}\n"]
1961
+ styles: [":host{display:inline-block;position:relative}.mm-wrapper{position:relative}.mm-trigger{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:8px;border:none;background:transparent;color:#64748b;cursor:pointer;transition:background .1s,color .1s}.mm-trigger:hover{background:#f1f5f9;color:#334155}.mm-trigger:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.mm-dropdown{position:absolute;right:0;top:calc(100% + 4px);z-index:200;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;min-width:160px;overflow-x:hidden;overflow-y:auto;padding:4px;max-width:calc(100vw - 16px);overscroll-behavior:contain;background:linear-gradient(#fff 30%,#fff0) center top / 100% 16px no-repeat local,linear-gradient(#fff0,#fff 70%) center bottom / 100% 16px no-repeat local,radial-gradient(farthest-side at 50% 0,#0f172a38,#0f172a00) center top / 100% 8px no-repeat scroll,radial-gradient(farthest-side at 50% 100%,#0f172a38,#0f172a00) center bottom / 100% 8px no-repeat scroll,#fff}.mm-dropdown.mm-up{top:auto;bottom:calc(100% + 4px)}.mm-dropdown.mm-fixed{position:fixed;left:auto}.mm-item{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;background:none;border:none;cursor:pointer;font-size:.875rem;color:#334155;font-family:inherit;text-align:left;border-radius:5px;transition:background .1s;min-height:40px}.mm-item:hover:not(:disabled){background:#f8fafc}.mm-item:disabled{opacity:.4;cursor:default}.mm-item.mm-danger{color:#dc2626}.mm-item.mm-danger:hover:not(:disabled){background:#fef2f2}.mm-item:focus-visible{outline:2px solid #60a5fa;outline-offset:-2px}.mm-icon{flex-shrink:0}@media(max-width:1024px){.mm-trigger{width:36px;height:36px}.mm-item{padding:11px 14px;min-height:40px}}@media(pointer:coarse){.mm-trigger{width:44px;height:44px}}@media(max-width:640px){.mm-trigger{width:44px;height:44px}.mm-item{padding:12px 14px;font-size:.9375rem;min-height:44px}.mm-dropdown{max-height:60vh;overflow-y:auto}}\n"]
1962
1962
  }]
1963
1963
  }],
1964
1964
  ctorParameters: () => [],
@@ -2553,6 +2553,7 @@ var CheckboxComponent = class CheckboxComponent {
2553
2553
  this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
2554
2554
  this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
2555
2555
  this.testId = input("", ...ngDevMode ? [{ debugName: "testId" }] : /* istanbul ignore next */ []);
2556
+ this.labelTestId = input("", ...ngDevMode ? [{ debugName: "labelTestId" }] : /* istanbul ignore next */ []);
2556
2557
  this.headingLevel = input(null, ...ngDevMode ? [{ debugName: "headingLevel" }] : /* istanbul ignore next */ []);
2557
2558
  this.indeterminate = input(false, ...ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []);
2558
2559
  this.checked = model(false, ...ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []);
@@ -2716,6 +2717,13 @@ var CheckboxComponent = class CheckboxComponent {
2716
2717
  isRequired: false,
2717
2718
  transformFunction: null
2718
2719
  },
2720
+ labelTestId: {
2721
+ classPropertyName: "labelTestId",
2722
+ publicName: "labelTestId",
2723
+ isSignal: true,
2724
+ isRequired: false,
2725
+ transformFunction: null
2726
+ },
2719
2727
  headingLevel: {
2720
2728
  classPropertyName: "headingLevel",
2721
2729
  publicName: "headingLevel",
@@ -2881,7 +2889,7 @@ var CheckboxComponent = class CheckboxComponent {
2881
2889
  [attr.aria-describedby]="opt.description ? _descId + '-' + i : null"
2882
2890
  (change)="onToggleOption(opt.value, $event)"
2883
2891
  />
2884
- <span class="cb-label">{{ opt.label }}</span>
2892
+ <span class="cb-label" [attr.data-testid]="opt.labelTestId || null">{{ opt.label }}</span>
2885
2893
  </label>
2886
2894
  @if (opt.description) {
2887
2895
  <p class="cb-desc" [id]="_descId + '-' + i">{{ opt.description }}</p>
@@ -2924,7 +2932,7 @@ var CheckboxComponent = class CheckboxComponent {
2924
2932
  (change)="onToggle($event)"
2925
2933
  />
2926
2934
  @if (label()) {
2927
- <span class="cb-label" [attr.role]="headingLevel() ? 'heading' : null" [attr.aria-level]="headingLevel() || null">{{ label() }}</span>
2935
+ <span class="cb-label" [attr.data-testid]="labelTestId() || null" [attr.role]="headingLevel() ? 'heading' : null" [attr.aria-level]="headingLevel() || null">{{ label() }}</span>
2928
2936
  }
2929
2937
  <ng-content />
2930
2938
  </label>
@@ -3021,7 +3029,7 @@ i0.ɵɵngDeclareClassMetadata({
3021
3029
  [attr.aria-describedby]="opt.description ? _descId + '-' + i : null"
3022
3030
  (change)="onToggleOption(opt.value, $event)"
3023
3031
  />
3024
- <span class="cb-label">{{ opt.label }}</span>
3032
+ <span class="cb-label" [attr.data-testid]="opt.labelTestId || null">{{ opt.label }}</span>
3025
3033
  </label>
3026
3034
  @if (opt.description) {
3027
3035
  <p class="cb-desc" [id]="_descId + '-' + i">{{ opt.description }}</p>
@@ -3064,7 +3072,7 @@ i0.ɵɵngDeclareClassMetadata({
3064
3072
  (change)="onToggle($event)"
3065
3073
  />
3066
3074
  @if (label()) {
3067
- <span class="cb-label" [attr.role]="headingLevel() ? 'heading' : null" [attr.aria-level]="headingLevel() || null">{{ label() }}</span>
3075
+ <span class="cb-label" [attr.data-testid]="labelTestId() || null" [attr.role]="headingLevel() ? 'heading' : null" [attr.aria-level]="headingLevel() || null">{{ label() }}</span>
3068
3076
  }
3069
3077
  <ng-content />
3070
3078
  </label>
@@ -3117,6 +3125,14 @@ i0.ɵɵngDeclareClassMetadata({
3117
3125
  required: false
3118
3126
  }]
3119
3127
  }],
3128
+ labelTestId: [{
3129
+ type: i0.Input,
3130
+ args: [{
3131
+ isSignal: true,
3132
+ alias: "labelTestId",
3133
+ required: false
3134
+ }]
3135
+ }],
3120
3136
  headingLevel: [{
3121
3137
  type: i0.Input,
3122
3138
  args: [{
@@ -3530,7 +3546,7 @@ var ButtonComponent = class ButtonComponent {
3530
3546
  }
3531
3547
  `,
3532
3548
  isInline: true,
3533
- styles: [":host{display:inline-flex}:host(.ui-btn-block){display:flex;width:100%}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:none;border-radius:8px;font-weight:600;cursor:pointer;font-family:inherit;transition:all .15s ease;white-space:nowrap}.btn:disabled{opacity:.5;cursor:not-allowed}.btn:focus-visible{outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}.btn-full{width:100%}.btn-primary{background:var(--ui-accent, #3B82F6);color:var(--ui-on-accent, #fff);border:1px solid var(--ui-accent, #3B82F6)}.btn-primary:hover:not(:disabled){background:var(--ui-accent-hover, #2563EB);border-color:var(--ui-accent-hover, #2563EB)}.btn-secondary{background:#fff;color:#334155;border:1px solid #e2e8f0}.btn-secondary:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.btn-ghost{background:transparent;color:#64748b;border:1px solid transparent}.btn-ghost:hover:not(:disabled){background:#f8fafc;color:#334155}.btn-ghost-start{display:flex;width:100%;justify-content:flex-start;text-align:start;white-space:normal;background:transparent;color:#334155;border:1px solid transparent}.btn-ghost-start:hover:not(:disabled){background:#f1f5f9;color:#1e293b}.btn-danger{background:#dc2626;color:#fff;border:1px solid #dc2626}.btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.btn-link{background:none;color:var(--ui-accent, #3b82f6);border:none;padding:0;font-weight:500}.btn-link:hover:not(:disabled){color:var(--ui-accent-hover, #60a5fa)}.btn-link.btn-xs,.btn-link.btn-sm,.btn-link.btn-md,.btn-link.btn-lg{padding:0}.btn-anchor{text-decoration:none}.btn[aria-disabled=true]{opacity:.5;cursor:not-allowed;pointer-events:none}.btn-anchor.btn-link{text-decoration:underline;text-underline-offset:2px}.btn-warning{background:#f97316;color:#fff;border:1px solid #f97316}.btn-warning:hover:not(:disabled){background:#ea6c0a;border-color:#ea6c0a}.btn-tab{background:none;color:#64748b;border:none;border-bottom:2px solid transparent;border-radius:0;font-weight:600;font-size:.875rem;transition:all .15s}.btn-tab:hover:not(:disabled){background:none;color:#1e293b}.btn-tab.active{color:var(--ui-accent, #3b82f6);border-bottom-color:var(--ui-accent, #3b82f6)}.btn-tab.btn-xs,.btn-tab.btn-sm,.btn-tab.btn-md,.btn-tab.btn-lg{padding:10px 20px;border-radius:0}.btn-icon{width:28px;height:28px;padding:0;border-radius:6px;background:transparent;border:none;color:#94a3b8}.btn-icon:hover:not(:disabled){background:#f1f5f9;color:#334155}.btn-icon-danger{width:28px;height:28px;padding:0;border-radius:6px;background:transparent;border:none;color:#94a3b8}.btn-icon-danger:hover:not(:disabled){background:#fee2e2;color:#dc2626}.btn-xs{padding:3px 8px;font-size:.75rem;border-radius:5px;gap:4px}.btn-sm{padding:6px 12px;font-size:.8125rem;border-radius:6px}.btn-md{padding:10px 16px;font-size:.875rem}.btn-lg{padding:14px 20px;font-size:1rem}@media(pointer:coarse),(max-width:480px){.btn-xs,.btn-sm,.btn-md,.btn-lg,.btn-tab{min-height:44px}.btn-link.btn-xs,.btn-link.btn-sm,.btn-link.btn-md,.btn-link.btn-lg{min-height:0}.btn-icon,.btn-icon-danger{position:relative}.btn-icon:after,.btn-icon-danger:after{content:\"\";position:absolute;inset:-8px}}.spinner{width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top-color:currentColor;border-radius:50%;animation:spin .6s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"],
3549
+ styles: [":host{display:inline-flex}:host(.ui-btn-block){display:flex;width:100%}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:none;border-radius:8px;font-weight:600;cursor:pointer;font-family:inherit;transition:all .15s ease;white-space:nowrap}.btn:disabled{opacity:.5;cursor:not-allowed}.btn:focus-visible{outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}.btn-full{width:100%}.btn-primary{background:var(--ui-accent, #2563EB);color:var(--ui-on-accent, #fff);border:1px solid var(--ui-accent, #2563EB)}.btn-primary:hover:not(:disabled){background:var(--ui-accent-hover, #1D4ED8);border-color:var(--ui-accent-hover, #1D4ED8)}.btn-secondary{background:#fff;color:#334155;border:1px solid #e2e8f0}.btn-secondary:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.btn-ghost{background:transparent;color:#64748b;border:1px solid transparent}.btn-ghost:hover:not(:disabled){background:#f8fafc;color:#334155}.btn-ghost-start{display:flex;width:100%;justify-content:flex-start;text-align:start;white-space:normal;background:transparent;color:#334155;border:1px solid transparent}.btn-ghost-start:hover:not(:disabled){background:#f1f5f9;color:#1e293b}.btn-danger{background:#dc2626;color:#fff;border:1px solid #dc2626}.btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.btn-link{background:none;color:var(--ui-link, var(--ui-accent, #2563eb));border:none;padding:0;font-weight:500}.btn-link:hover:not(:disabled){color:var(--ui-link-hover, var(--ui-accent-hover, #1d4ed8))}.btn-link.btn-xs,.btn-link.btn-sm,.btn-link.btn-md,.btn-link.btn-lg{padding:0}.btn-anchor{text-decoration:none}.btn[aria-disabled=true]{opacity:.5;cursor:not-allowed;pointer-events:none}.btn-anchor.btn-link{text-decoration:underline;text-underline-offset:2px}.btn-warning{background:#f97316;color:#fff;border:1px solid #f97316}.btn-warning:hover:not(:disabled){background:#ea6c0a;border-color:#ea6c0a}.btn-tab{background:none;color:#64748b;border:none;border-bottom:2px solid transparent;border-radius:0;font-weight:600;font-size:.875rem;transition:all .15s}.btn-tab:hover:not(:disabled){background:none;color:#1e293b}.btn-tab.active{color:var(--ui-accent, #2563eb);border-bottom-color:var(--ui-accent, #2563eb)}.btn-tab.btn-xs,.btn-tab.btn-sm,.btn-tab.btn-md,.btn-tab.btn-lg{padding:10px 20px;border-radius:0}.btn-icon{width:28px;height:28px;padding:0;border-radius:6px;background:transparent;border:none;color:#64748b}.btn-icon:hover:not(:disabled){background:#f1f5f9;color:#334155}.btn-icon-danger{width:28px;height:28px;padding:0;border-radius:6px;background:transparent;border:none;color:#64748b}.btn-icon-danger:hover:not(:disabled){background:#fee2e2;color:#dc2626}.btn-xs{padding:3px 8px;font-size:.75rem;border-radius:5px;gap:4px}.btn-sm{padding:6px 12px;font-size:.8125rem;border-radius:6px}.btn-md{padding:10px 16px;font-size:.875rem}.btn-lg{padding:14px 20px;font-size:1rem}@media(pointer:coarse),(max-width:480px){.btn-xs,.btn-sm,.btn-md,.btn-lg,.btn-tab{min-height:44px}.btn-link.btn-xs,.btn-link.btn-sm,.btn-link.btn-md,.btn-link.btn-lg{min-height:0}.btn-icon,.btn-icon-danger{position:relative}.btn-icon:after,.btn-icon-danger:after{content:\"\";position:absolute;inset:-8px}}.spinner{width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top-color:currentColor;border-radius:50%;animation:spin .6s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"],
3534
3550
  dependencies: [{
3535
3551
  kind: "directive",
3536
3552
  type: NgTemplateOutlet,
@@ -3647,7 +3663,7 @@ i0.ɵɵngDeclareClassMetadata({
3647
3663
  ><ng-container [ngTemplateOutlet]="content" /></button>
3648
3664
  }
3649
3665
  `,
3650
- styles: [":host{display:inline-flex}:host(.ui-btn-block){display:flex;width:100%}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:none;border-radius:8px;font-weight:600;cursor:pointer;font-family:inherit;transition:all .15s ease;white-space:nowrap}.btn:disabled{opacity:.5;cursor:not-allowed}.btn:focus-visible{outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}.btn-full{width:100%}.btn-primary{background:var(--ui-accent, #3B82F6);color:var(--ui-on-accent, #fff);border:1px solid var(--ui-accent, #3B82F6)}.btn-primary:hover:not(:disabled){background:var(--ui-accent-hover, #2563EB);border-color:var(--ui-accent-hover, #2563EB)}.btn-secondary{background:#fff;color:#334155;border:1px solid #e2e8f0}.btn-secondary:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.btn-ghost{background:transparent;color:#64748b;border:1px solid transparent}.btn-ghost:hover:not(:disabled){background:#f8fafc;color:#334155}.btn-ghost-start{display:flex;width:100%;justify-content:flex-start;text-align:start;white-space:normal;background:transparent;color:#334155;border:1px solid transparent}.btn-ghost-start:hover:not(:disabled){background:#f1f5f9;color:#1e293b}.btn-danger{background:#dc2626;color:#fff;border:1px solid #dc2626}.btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.btn-link{background:none;color:var(--ui-accent, #3b82f6);border:none;padding:0;font-weight:500}.btn-link:hover:not(:disabled){color:var(--ui-accent-hover, #60a5fa)}.btn-link.btn-xs,.btn-link.btn-sm,.btn-link.btn-md,.btn-link.btn-lg{padding:0}.btn-anchor{text-decoration:none}.btn[aria-disabled=true]{opacity:.5;cursor:not-allowed;pointer-events:none}.btn-anchor.btn-link{text-decoration:underline;text-underline-offset:2px}.btn-warning{background:#f97316;color:#fff;border:1px solid #f97316}.btn-warning:hover:not(:disabled){background:#ea6c0a;border-color:#ea6c0a}.btn-tab{background:none;color:#64748b;border:none;border-bottom:2px solid transparent;border-radius:0;font-weight:600;font-size:.875rem;transition:all .15s}.btn-tab:hover:not(:disabled){background:none;color:#1e293b}.btn-tab.active{color:var(--ui-accent, #3b82f6);border-bottom-color:var(--ui-accent, #3b82f6)}.btn-tab.btn-xs,.btn-tab.btn-sm,.btn-tab.btn-md,.btn-tab.btn-lg{padding:10px 20px;border-radius:0}.btn-icon{width:28px;height:28px;padding:0;border-radius:6px;background:transparent;border:none;color:#94a3b8}.btn-icon:hover:not(:disabled){background:#f1f5f9;color:#334155}.btn-icon-danger{width:28px;height:28px;padding:0;border-radius:6px;background:transparent;border:none;color:#94a3b8}.btn-icon-danger:hover:not(:disabled){background:#fee2e2;color:#dc2626}.btn-xs{padding:3px 8px;font-size:.75rem;border-radius:5px;gap:4px}.btn-sm{padding:6px 12px;font-size:.8125rem;border-radius:6px}.btn-md{padding:10px 16px;font-size:.875rem}.btn-lg{padding:14px 20px;font-size:1rem}@media(pointer:coarse),(max-width:480px){.btn-xs,.btn-sm,.btn-md,.btn-lg,.btn-tab{min-height:44px}.btn-link.btn-xs,.btn-link.btn-sm,.btn-link.btn-md,.btn-link.btn-lg{min-height:0}.btn-icon,.btn-icon-danger{position:relative}.btn-icon:after,.btn-icon-danger:after{content:\"\";position:absolute;inset:-8px}}.spinner{width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top-color:currentColor;border-radius:50%;animation:spin .6s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"]
3666
+ styles: [":host{display:inline-flex}:host(.ui-btn-block){display:flex;width:100%}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:none;border-radius:8px;font-weight:600;cursor:pointer;font-family:inherit;transition:all .15s ease;white-space:nowrap}.btn:disabled{opacity:.5;cursor:not-allowed}.btn:focus-visible{outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}.btn-full{width:100%}.btn-primary{background:var(--ui-accent, #2563EB);color:var(--ui-on-accent, #fff);border:1px solid var(--ui-accent, #2563EB)}.btn-primary:hover:not(:disabled){background:var(--ui-accent-hover, #1D4ED8);border-color:var(--ui-accent-hover, #1D4ED8)}.btn-secondary{background:#fff;color:#334155;border:1px solid #e2e8f0}.btn-secondary:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.btn-ghost{background:transparent;color:#64748b;border:1px solid transparent}.btn-ghost:hover:not(:disabled){background:#f8fafc;color:#334155}.btn-ghost-start{display:flex;width:100%;justify-content:flex-start;text-align:start;white-space:normal;background:transparent;color:#334155;border:1px solid transparent}.btn-ghost-start:hover:not(:disabled){background:#f1f5f9;color:#1e293b}.btn-danger{background:#dc2626;color:#fff;border:1px solid #dc2626}.btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.btn-link{background:none;color:var(--ui-link, var(--ui-accent, #2563eb));border:none;padding:0;font-weight:500}.btn-link:hover:not(:disabled){color:var(--ui-link-hover, var(--ui-accent-hover, #1d4ed8))}.btn-link.btn-xs,.btn-link.btn-sm,.btn-link.btn-md,.btn-link.btn-lg{padding:0}.btn-anchor{text-decoration:none}.btn[aria-disabled=true]{opacity:.5;cursor:not-allowed;pointer-events:none}.btn-anchor.btn-link{text-decoration:underline;text-underline-offset:2px}.btn-warning{background:#f97316;color:#fff;border:1px solid #f97316}.btn-warning:hover:not(:disabled){background:#ea6c0a;border-color:#ea6c0a}.btn-tab{background:none;color:#64748b;border:none;border-bottom:2px solid transparent;border-radius:0;font-weight:600;font-size:.875rem;transition:all .15s}.btn-tab:hover:not(:disabled){background:none;color:#1e293b}.btn-tab.active{color:var(--ui-accent, #2563eb);border-bottom-color:var(--ui-accent, #2563eb)}.btn-tab.btn-xs,.btn-tab.btn-sm,.btn-tab.btn-md,.btn-tab.btn-lg{padding:10px 20px;border-radius:0}.btn-icon{width:28px;height:28px;padding:0;border-radius:6px;background:transparent;border:none;color:#64748b}.btn-icon:hover:not(:disabled){background:#f1f5f9;color:#334155}.btn-icon-danger{width:28px;height:28px;padding:0;border-radius:6px;background:transparent;border:none;color:#64748b}.btn-icon-danger:hover:not(:disabled){background:#fee2e2;color:#dc2626}.btn-xs{padding:3px 8px;font-size:.75rem;border-radius:5px;gap:4px}.btn-sm{padding:6px 12px;font-size:.8125rem;border-radius:6px}.btn-md{padding:10px 16px;font-size:.875rem}.btn-lg{padding:14px 20px;font-size:1rem}@media(pointer:coarse),(max-width:480px){.btn-xs,.btn-sm,.btn-md,.btn-lg,.btn-tab{min-height:44px}.btn-link.btn-xs,.btn-link.btn-sm,.btn-link.btn-md,.btn-link.btn-lg{min-height:0}.btn-icon,.btn-icon-danger{position:relative}.btn-icon:after,.btn-icon-danger:after{content:\"\";position:absolute;inset:-8px}}.spinner{width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top-color:currentColor;border-radius:50%;animation:spin .6s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"]
3651
3667
  }]
3652
3668
  }],
3653
3669
  propDecorators: {
@@ -4879,6 +4895,7 @@ var TableToolbarComponent = class TableToolbarComponent {
4879
4895
  "label",
4880
4896
  "ariaLabel",
4881
4897
  "testId",
4898
+ "labelTestId",
4882
4899
  "headingLevel",
4883
4900
  "indeterminate",
4884
4901
  "checked",
@@ -10773,6 +10790,7 @@ var DataTableComponent = class DataTableComponent {
10773
10790
  "label",
10774
10791
  "ariaLabel",
10775
10792
  "testId",
10793
+ "labelTestId",
10776
10794
  "headingLevel",
10777
10795
  "indeterminate",
10778
10796
  "checked",
@@ -13140,6 +13158,7 @@ var StepperComponent = class StepperComponent {
13140
13158
  this.size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
13141
13159
  this.accentColor = input("", ...ngDevMode ? [{ debugName: "accentColor" }] : /* istanbul ignore next */ []);
13142
13160
  this.completeColor = input("", ...ngDevMode ? [{ debugName: "completeColor" }] : /* istanbul ignore next */ []);
13161
+ this.accentLabels = input(false, ...ngDevMode ? [{ debugName: "accentLabels" }] : /* istanbul ignore next */ []);
13143
13162
  this.ariaLabel = input("Progress", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
13144
13163
  this.labelsOnSmallScreens = input("current", ...ngDevMode ? [{ debugName: "labelsOnSmallScreens" }] : /* istanbul ignore next */ []);
13145
13164
  this.stepClick = output();
@@ -13154,7 +13173,7 @@ var StepperComponent = class StepperComponent {
13154
13173
  const state = i === cur ? "current" : step.complete === void 0 ? derived : step.complete ? "complete" : "upcoming";
13155
13174
  const errorMessage = typeof step.error === "string" ? step.error : "";
13156
13175
  const error = step.error === true || errorMessage !== "";
13157
- const selectable = clickable && !step.disabled && state !== "current" && (linear ? state === "complete" : true);
13176
+ const selectable = clickable && !step.disabled && step.selectable !== false && state !== "current" && (linear ? state === "complete" : true);
13158
13177
  const status = state === "complete" ? "completed" : state === "current" ? "current step" : "not started";
13159
13178
  return {
13160
13179
  step,
@@ -13249,6 +13268,13 @@ var StepperComponent = class StepperComponent {
13249
13268
  isRequired: false,
13250
13269
  transformFunction: null
13251
13270
  },
13271
+ accentLabels: {
13272
+ classPropertyName: "accentLabels",
13273
+ publicName: "accentLabels",
13274
+ isSignal: true,
13275
+ isRequired: false,
13276
+ transformFunction: null
13277
+ },
13252
13278
  ariaLabel: {
13253
13279
  classPropertyName: "ariaLabel",
13254
13280
  publicName: "ariaLabel",
@@ -13280,6 +13306,7 @@ var StepperComponent = class StepperComponent {
13280
13306
  [class.st-sm]="size() === 'sm'"
13281
13307
  [class.st-labels-current]="labelsOnSmallScreens() === 'current'"
13282
13308
  [class.st-themed]="!!accentColor()"
13309
+ [class.st-accent-labels]="accentLabels()"
13283
13310
  [attr.aria-label]="ariaLabel() || null">
13284
13311
  @for (r of rows(); track r.step.key) {
13285
13312
  <li class="st-step"
@@ -13320,7 +13347,7 @@ var StepperComponent = class StepperComponent {
13320
13347
  </ng-template>
13321
13348
  `,
13322
13349
  isInline: true,
13323
- styles: [":host{display:block}.st{list-style:none;margin:0;padding:0;display:flex;--st-ind: 28px}.st-sm{--st-ind: 22px}.st-horizontal{flex-direction:row;align-items:flex-start}.st-vertical{flex-direction:column}.st-step{position:relative;display:flex;min-width:0}.st-horizontal .st-step{flex:1 1 0;align-items:flex-start}.st-horizontal .st-step:last-child{flex:0 1 auto}.st-vertical .st-step{flex-direction:column;padding-bottom:20px}.st-vertical .st-step:last-child{padding-bottom:0}.st-item{display:flex;flex-direction:column;min-width:0;gap:2px}.st-horizontal .st-item{flex:0 1 auto}.st-btn{display:inline-flex;align-items:flex-start;gap:8px;min-width:0;margin:0;padding:2px 4px;border:0;border-radius:8px;background:none;font:inherit;color:inherit;text-align:left;-webkit-appearance:none;appearance:none}button.st-btn{cursor:pointer}.st-btn:focus{outline:2px solid #3b82f6;outline-offset:2px}.st-btn:focus:not(:focus-visible){outline:none}@media(hover:hover){button.st-btn:hover .st-label{text-decoration:underline}}.st-ind{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:var(--st-ind);height:var(--st-ind);border-radius:50%;font-size:.8125rem;font-weight:600;line-height:1;background:#fff;border:2px solid #cbd5e1;color:#64748b}.st-sm .st-ind{font-size:.6875rem}.st-sm .st-check{width:11px;height:11px}.st-step[data-state=complete] .st-ind{background:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));border-color:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));color:#fff}.st-step[data-state=current] .st-ind{background:var(--st-accent, var(--ui-accent, #1d4ed8));border-color:var(--st-accent, var(--ui-accent, #1d4ed8));color:#fff;box-shadow:0 0 0 3px var(--ui-accent-soft, #bfdbfe)}@supports (color: color-mix(in srgb,red 30%,white)){.st-themed .st-step[data-state=current] .st-ind{box-shadow:0 0 0 3px color-mix(in srgb,var(--st-accent) 30%,white)}}.st-step[data-error=true] .st-ind{background:#dc2626;border-color:#dc2626;color:#fff;box-shadow:none}.st-label{font-size:.875rem;font-weight:500;line-height:var(--st-ind);color:#64748b;min-width:0;overflow-wrap:anywhere}.st-sm .st-label{font-size:.8125rem}.st-step[data-state=complete] .st-label{color:#1e293b}.st-step[data-state=current] .st-label{color:#0f172a;font-weight:600}.st-step[data-error=true] .st-label{color:#b91c1c}.st-opt{font-size:.75rem;line-height:var(--st-ind);color:#64748b;white-space:nowrap}.st-desc{font-size:.8125rem;line-height:1.4;color:#64748b;padding-left:calc(var(--st-ind) + 12px);overflow-wrap:anywhere}.st-errmsg{font-size:.8125rem;line-height:1.4;color:#b91c1c;padding-left:calc(var(--st-ind) + 12px);overflow-wrap:anywhere}.st-step[data-disabled=true] .st-item{opacity:.5}.st-sr,.st-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.st-conn{position:relative;display:block;background:#e2e8f0;border-radius:1px}.st-conn:after{content:\"\";position:absolute;inset:0;background:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));border-radius:1px;transform-origin:top left;transform:scale(0);transition:transform .3s ease}.st-step[data-state=complete] .st-conn:after{transform:scale(1)}.st-horizontal .st-conn{flex:1 1 12px;min-width:12px;height:2px;margin:calc(var(--st-ind) / 2 + 1px) 8px 0}.st-vertical .st-conn{position:absolute;left:calc(var(--st-ind) / 2 + 3px);top:calc(var(--st-ind) + 8px);bottom:4px;width:2px}@media(pointer:coarse),(max-width:480px){.st-btn{min-height:44px;align-items:center}button.st-btn{min-width:44px}.st-horizontal .st-conn{margin-top:21px}.st-vertical .st-conn{top:calc(26px + var(--st-ind) / 2)}}@media(max-width:480px){.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-label,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-opt,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-desc,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-errmsg{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.st-horizontal .st-conn{margin-left:4px;margin-right:4px;min-width:8px;flex-basis:8px}}@media(prefers-reduced-motion:reduce){.st-conn:after{transition:none}}\n"],
13350
+ styles: [":host{display:block}.st{list-style:none;margin:0;padding:0;display:flex;--st-ind: 28px}.st-sm{--st-ind: 22px}.st-horizontal{flex-direction:row;align-items:flex-start}.st-vertical{flex-direction:column}.st-step{position:relative;display:flex;min-width:0}.st-horizontal .st-step{flex:1 1 0;align-items:flex-start}.st-horizontal .st-step:last-child{flex:0 1 auto}.st-vertical .st-step{flex-direction:column;padding-bottom:20px}.st-vertical .st-step:last-child{padding-bottom:0}.st-item{display:flex;flex-direction:column;min-width:0;gap:2px}.st-horizontal .st-item{flex:0 1 auto}.st-btn{display:inline-flex;align-items:flex-start;gap:8px;min-width:0;margin:0;padding:2px 4px;border:0;border-radius:8px;background:none;font:inherit;color:inherit;text-align:left;-webkit-appearance:none;appearance:none}button.st-btn{cursor:pointer}.st-btn:focus{outline:2px solid #3b82f6;outline-offset:2px}.st-btn:focus:not(:focus-visible){outline:none}@media(hover:hover){button.st-btn:hover .st-label{text-decoration:underline}}.st-ind{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:var(--st-ind);height:var(--st-ind);border-radius:50%;font-size:.8125rem;font-weight:600;line-height:1;background:#fff;border:2px solid #cbd5e1;color:#64748b}.st-sm .st-ind{font-size:.6875rem}.st-sm .st-check{width:11px;height:11px}.st-step[data-state=complete] .st-ind{background:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));border-color:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));color:#fff}.st-step[data-state=current] .st-ind{background:var(--st-accent, var(--ui-accent, #1d4ed8));border-color:var(--st-accent, var(--ui-accent, #1d4ed8));color:#fff;box-shadow:0 0 0 3px var(--ui-accent-soft, #bfdbfe)}@supports (color: color-mix(in srgb,red 30%,white)){.st-themed .st-step[data-state=current]:not([data-error=true]) .st-ind{box-shadow:0 0 0 3px color-mix(in srgb,var(--st-accent) 30%,white)}}.st-step[data-error=true] .st-ind{background:#dc2626;border-color:#dc2626;color:#fff;box-shadow:none}.st-label{font-size:.875rem;font-weight:500;line-height:var(--st-ind);color:#64748b;min-width:0;overflow-wrap:anywhere}.st-sm .st-label{font-size:.8125rem}.st-step[data-state=complete] .st-label{color:#1e293b}.st-step[data-state=current] .st-label{color:#0f172a;font-weight:600}.st-step[data-error=true] .st-label{color:#b91c1c}.st-accent-labels .st-step[data-state=current]:not([data-error=true]) .st-label{color:var(--st-accent, var(--ui-accent, #1d4ed8))}.st-opt{font-size:.75rem;line-height:var(--st-ind);color:#64748b;white-space:nowrap}.st-desc{font-size:.8125rem;line-height:1.4;color:#64748b;padding-left:calc(var(--st-ind) + 12px);overflow-wrap:anywhere}.st-errmsg{font-size:.8125rem;line-height:1.4;color:#b91c1c;padding-left:calc(var(--st-ind) + 12px);overflow-wrap:anywhere}.st-step[data-disabled=true] .st-item{opacity:.5}.st-sr,.st-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.st-conn{position:relative;display:block;background:#e2e8f0;border-radius:1px}.st-conn:after{content:\"\";position:absolute;inset:0;background:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));border-radius:1px;transform-origin:top left;transform:scale(0);transition:transform .3s ease}.st-step[data-state=complete] .st-conn:after{transform:scale(1)}.st-horizontal .st-conn{flex:1 1 12px;min-width:12px;height:2px;margin:calc(var(--st-ind) / 2 + 1px) 8px 0}.st-vertical .st-conn{position:absolute;left:calc(var(--st-ind) / 2 + 3px);top:calc(var(--st-ind) + 8px);bottom:4px;width:2px}@media(pointer:coarse),(max-width:480px){.st-btn{min-height:44px;align-items:center}button.st-btn{min-width:44px}.st-horizontal .st-conn{margin-top:21px}.st-vertical .st-conn{top:calc(26px + var(--st-ind) / 2)}}@media(max-width:480px){.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-label,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-opt,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-desc,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-errmsg{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.st-horizontal .st-conn{margin-left:4px;margin-right:4px;min-width:8px;flex-basis:8px}}@media(prefers-reduced-motion:reduce){.st-conn:after{transition:none}}\n"],
13324
13351
  dependencies: [{
13325
13352
  kind: "directive",
13326
13353
  type: NgTemplateOutlet,
@@ -13358,6 +13385,7 @@ i0.ɵɵngDeclareClassMetadata({
13358
13385
  [class.st-sm]="size() === 'sm'"
13359
13386
  [class.st-labels-current]="labelsOnSmallScreens() === 'current'"
13360
13387
  [class.st-themed]="!!accentColor()"
13388
+ [class.st-accent-labels]="accentLabels()"
13361
13389
  [attr.aria-label]="ariaLabel() || null">
13362
13390
  @for (r of rows(); track r.step.key) {
13363
13391
  <li class="st-step"
@@ -13397,7 +13425,7 @@ i0.ɵɵngDeclareClassMetadata({
13397
13425
  <span class="st-sr">{{ r.srText }}</span>
13398
13426
  </ng-template>
13399
13427
  `,
13400
- styles: [":host{display:block}.st{list-style:none;margin:0;padding:0;display:flex;--st-ind: 28px}.st-sm{--st-ind: 22px}.st-horizontal{flex-direction:row;align-items:flex-start}.st-vertical{flex-direction:column}.st-step{position:relative;display:flex;min-width:0}.st-horizontal .st-step{flex:1 1 0;align-items:flex-start}.st-horizontal .st-step:last-child{flex:0 1 auto}.st-vertical .st-step{flex-direction:column;padding-bottom:20px}.st-vertical .st-step:last-child{padding-bottom:0}.st-item{display:flex;flex-direction:column;min-width:0;gap:2px}.st-horizontal .st-item{flex:0 1 auto}.st-btn{display:inline-flex;align-items:flex-start;gap:8px;min-width:0;margin:0;padding:2px 4px;border:0;border-radius:8px;background:none;font:inherit;color:inherit;text-align:left;-webkit-appearance:none;appearance:none}button.st-btn{cursor:pointer}.st-btn:focus{outline:2px solid #3b82f6;outline-offset:2px}.st-btn:focus:not(:focus-visible){outline:none}@media(hover:hover){button.st-btn:hover .st-label{text-decoration:underline}}.st-ind{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:var(--st-ind);height:var(--st-ind);border-radius:50%;font-size:.8125rem;font-weight:600;line-height:1;background:#fff;border:2px solid #cbd5e1;color:#64748b}.st-sm .st-ind{font-size:.6875rem}.st-sm .st-check{width:11px;height:11px}.st-step[data-state=complete] .st-ind{background:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));border-color:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));color:#fff}.st-step[data-state=current] .st-ind{background:var(--st-accent, var(--ui-accent, #1d4ed8));border-color:var(--st-accent, var(--ui-accent, #1d4ed8));color:#fff;box-shadow:0 0 0 3px var(--ui-accent-soft, #bfdbfe)}@supports (color: color-mix(in srgb,red 30%,white)){.st-themed .st-step[data-state=current] .st-ind{box-shadow:0 0 0 3px color-mix(in srgb,var(--st-accent) 30%,white)}}.st-step[data-error=true] .st-ind{background:#dc2626;border-color:#dc2626;color:#fff;box-shadow:none}.st-label{font-size:.875rem;font-weight:500;line-height:var(--st-ind);color:#64748b;min-width:0;overflow-wrap:anywhere}.st-sm .st-label{font-size:.8125rem}.st-step[data-state=complete] .st-label{color:#1e293b}.st-step[data-state=current] .st-label{color:#0f172a;font-weight:600}.st-step[data-error=true] .st-label{color:#b91c1c}.st-opt{font-size:.75rem;line-height:var(--st-ind);color:#64748b;white-space:nowrap}.st-desc{font-size:.8125rem;line-height:1.4;color:#64748b;padding-left:calc(var(--st-ind) + 12px);overflow-wrap:anywhere}.st-errmsg{font-size:.8125rem;line-height:1.4;color:#b91c1c;padding-left:calc(var(--st-ind) + 12px);overflow-wrap:anywhere}.st-step[data-disabled=true] .st-item{opacity:.5}.st-sr,.st-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.st-conn{position:relative;display:block;background:#e2e8f0;border-radius:1px}.st-conn:after{content:\"\";position:absolute;inset:0;background:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));border-radius:1px;transform-origin:top left;transform:scale(0);transition:transform .3s ease}.st-step[data-state=complete] .st-conn:after{transform:scale(1)}.st-horizontal .st-conn{flex:1 1 12px;min-width:12px;height:2px;margin:calc(var(--st-ind) / 2 + 1px) 8px 0}.st-vertical .st-conn{position:absolute;left:calc(var(--st-ind) / 2 + 3px);top:calc(var(--st-ind) + 8px);bottom:4px;width:2px}@media(pointer:coarse),(max-width:480px){.st-btn{min-height:44px;align-items:center}button.st-btn{min-width:44px}.st-horizontal .st-conn{margin-top:21px}.st-vertical .st-conn{top:calc(26px + var(--st-ind) / 2)}}@media(max-width:480px){.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-label,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-opt,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-desc,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-errmsg{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.st-horizontal .st-conn{margin-left:4px;margin-right:4px;min-width:8px;flex-basis:8px}}@media(prefers-reduced-motion:reduce){.st-conn:after{transition:none}}\n"]
13428
+ styles: [":host{display:block}.st{list-style:none;margin:0;padding:0;display:flex;--st-ind: 28px}.st-sm{--st-ind: 22px}.st-horizontal{flex-direction:row;align-items:flex-start}.st-vertical{flex-direction:column}.st-step{position:relative;display:flex;min-width:0}.st-horizontal .st-step{flex:1 1 0;align-items:flex-start}.st-horizontal .st-step:last-child{flex:0 1 auto}.st-vertical .st-step{flex-direction:column;padding-bottom:20px}.st-vertical .st-step:last-child{padding-bottom:0}.st-item{display:flex;flex-direction:column;min-width:0;gap:2px}.st-horizontal .st-item{flex:0 1 auto}.st-btn{display:inline-flex;align-items:flex-start;gap:8px;min-width:0;margin:0;padding:2px 4px;border:0;border-radius:8px;background:none;font:inherit;color:inherit;text-align:left;-webkit-appearance:none;appearance:none}button.st-btn{cursor:pointer}.st-btn:focus{outline:2px solid #3b82f6;outline-offset:2px}.st-btn:focus:not(:focus-visible){outline:none}@media(hover:hover){button.st-btn:hover .st-label{text-decoration:underline}}.st-ind{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:var(--st-ind);height:var(--st-ind);border-radius:50%;font-size:.8125rem;font-weight:600;line-height:1;background:#fff;border:2px solid #cbd5e1;color:#64748b}.st-sm .st-ind{font-size:.6875rem}.st-sm .st-check{width:11px;height:11px}.st-step[data-state=complete] .st-ind{background:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));border-color:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));color:#fff}.st-step[data-state=current] .st-ind{background:var(--st-accent, var(--ui-accent, #1d4ed8));border-color:var(--st-accent, var(--ui-accent, #1d4ed8));color:#fff;box-shadow:0 0 0 3px var(--ui-accent-soft, #bfdbfe)}@supports (color: color-mix(in srgb,red 30%,white)){.st-themed .st-step[data-state=current]:not([data-error=true]) .st-ind{box-shadow:0 0 0 3px color-mix(in srgb,var(--st-accent) 30%,white)}}.st-step[data-error=true] .st-ind{background:#dc2626;border-color:#dc2626;color:#fff;box-shadow:none}.st-label{font-size:.875rem;font-weight:500;line-height:var(--st-ind);color:#64748b;min-width:0;overflow-wrap:anywhere}.st-sm .st-label{font-size:.8125rem}.st-step[data-state=complete] .st-label{color:#1e293b}.st-step[data-state=current] .st-label{color:#0f172a;font-weight:600}.st-step[data-error=true] .st-label{color:#b91c1c}.st-accent-labels .st-step[data-state=current]:not([data-error=true]) .st-label{color:var(--st-accent, var(--ui-accent, #1d4ed8))}.st-opt{font-size:.75rem;line-height:var(--st-ind);color:#64748b;white-space:nowrap}.st-desc{font-size:.8125rem;line-height:1.4;color:#64748b;padding-left:calc(var(--st-ind) + 12px);overflow-wrap:anywhere}.st-errmsg{font-size:.8125rem;line-height:1.4;color:#b91c1c;padding-left:calc(var(--st-ind) + 12px);overflow-wrap:anywhere}.st-step[data-disabled=true] .st-item{opacity:.5}.st-sr,.st-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.st-conn{position:relative;display:block;background:#e2e8f0;border-radius:1px}.st-conn:after{content:\"\";position:absolute;inset:0;background:var(--st-complete, var(--st-accent, var(--ui-accent, #1d4ed8)));border-radius:1px;transform-origin:top left;transform:scale(0);transition:transform .3s ease}.st-step[data-state=complete] .st-conn:after{transform:scale(1)}.st-horizontal .st-conn{flex:1 1 12px;min-width:12px;height:2px;margin:calc(var(--st-ind) / 2 + 1px) 8px 0}.st-vertical .st-conn{position:absolute;left:calc(var(--st-ind) / 2 + 3px);top:calc(var(--st-ind) + 8px);bottom:4px;width:2px}@media(pointer:coarse),(max-width:480px){.st-btn{min-height:44px;align-items:center}button.st-btn{min-width:44px}.st-horizontal .st-conn{margin-top:21px}.st-vertical .st-conn{top:calc(26px + var(--st-ind) / 2)}}@media(max-width:480px){.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-label,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-opt,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-desc,.st-horizontal.st-labels-current .st-step:not([data-state=current]) .st-errmsg{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);white-space:nowrap}.st-horizontal .st-conn{margin-left:4px;margin-right:4px;min-width:8px;flex-basis:8px}}@media(prefers-reduced-motion:reduce){.st-conn:after{transition:none}}\n"]
13401
13429
  }]
13402
13430
  }],
13403
13431
  propDecorators: {
@@ -13468,6 +13496,14 @@ i0.ɵɵngDeclareClassMetadata({
13468
13496
  required: false
13469
13497
  }]
13470
13498
  }],
13499
+ accentLabels: [{
13500
+ type: i0.Input,
13501
+ args: [{
13502
+ isSignal: true,
13503
+ alias: "accentLabels",
13504
+ required: false
13505
+ }]
13506
+ }],
13471
13507
  ariaLabel: [{
13472
13508
  type: i0.Input,
13473
13509
  args: [{
@@ -13975,6 +14011,7 @@ var BusinessHoursComponent = class BusinessHoursComponent {
13975
14011
  "label",
13976
14012
  "ariaLabel",
13977
14013
  "testId",
14014
+ "labelTestId",
13978
14015
  "headingLevel",
13979
14016
  "indeterminate",
13980
14017
  "checked",
@@ -16827,6 +16864,7 @@ var ContactPickerComponent = class ContactPickerComponent {
16827
16864
  "label",
16828
16865
  "ariaLabel",
16829
16866
  "testId",
16867
+ "labelTestId",
16830
16868
  "headingLevel",
16831
16869
  "indeterminate",
16832
16870
  "checked",
@@ -17964,6 +18002,7 @@ var TextComponent = class TextComponent {
17964
18002
  this.text = input("", ...ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []);
17965
18003
  this.size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
17966
18004
  this.tone = input("default", ...ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []);
18005
+ this.color = input("", ...ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []);
17967
18006
  this.strong = input(null, ...ngDevMode ? [{ debugName: "strong" }] : /* istanbul ignore next */ []);
17968
18007
  this.segments = computed(() => {
17969
18008
  const text = this.text() ?? "";
@@ -18041,6 +18080,13 @@ var TextComponent = class TextComponent {
18041
18080
  isRequired: false,
18042
18081
  transformFunction: null
18043
18082
  },
18083
+ color: {
18084
+ classPropertyName: "color",
18085
+ publicName: "color",
18086
+ isSignal: true,
18087
+ isRequired: false,
18088
+ transformFunction: null
18089
+ },
18044
18090
  strong: {
18045
18091
  classPropertyName: "strong",
18046
18092
  publicName: "strong",
@@ -18057,9 +18103,9 @@ var TextComponent = class TextComponent {
18057
18103
  }
18058
18104
  },
18059
18105
  ngImport: i0,
18060
- template: `<div class="tx" [class.tx-muted]="tone() === 'muted'" [style.font-size]="fontSize()" [style.font-weight]="fontWeight()">{{ segments().length ? '' : text() }}@for (s of segments(); track $index) {@if (s.strong) {<strong>{{ s.text }}</strong>} @else {<ng-container>{{ s.text }}</ng-container>}}</div>`,
18106
+ template: `<div class="tx" [class.tx-muted]="tone() === 'muted'" [class.tx-accent]="tone() === 'accent'" [style.color]="color() || null" [style.font-size]="fontSize()" [style.font-weight]="fontWeight()">{{ segments().length ? '' : text() }}@for (s of segments(); track $index) {@if (s.strong) {<strong>{{ s.text }}</strong>} @else {<ng-container>{{ s.text }}</ng-container>}}</div>`,
18061
18107
  isInline: true,
18062
- styles: [":host{display:block;min-width:0}.tx{margin:0;line-height:1.5;color:#1f2937;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;-webkit-user-select:text;user-select:text}.tx-muted{color:#64748b}.tx strong{font-weight:700}\n"],
18108
+ styles: [":host{display:block;min-width:0}.tx{margin:0;line-height:1.5;color:#1f2937;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;-webkit-user-select:text;user-select:text}.tx-muted{color:#64748b}.tx-accent{color:var(--ui-accent, #2563eb)}.tx strong{font-weight:700}\n"],
18063
18109
  changeDetection: i0.ChangeDetectionStrategy.OnPush
18064
18110
  });
18065
18111
  }
@@ -18075,8 +18121,8 @@ i0.ɵɵngDeclareClassMetadata({
18075
18121
  selector: "ui-text",
18076
18122
  standalone: true,
18077
18123
  changeDetection: ChangeDetectionStrategy.OnPush,
18078
- template: `<div class="tx" [class.tx-muted]="tone() === 'muted'" [style.font-size]="fontSize()" [style.font-weight]="fontWeight()">{{ segments().length ? '' : text() }}@for (s of segments(); track $index) {@if (s.strong) {<strong>{{ s.text }}</strong>} @else {<ng-container>{{ s.text }}</ng-container>}}</div>`,
18079
- styles: [":host{display:block;min-width:0}.tx{margin:0;line-height:1.5;color:#1f2937;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;-webkit-user-select:text;user-select:text}.tx-muted{color:#64748b}.tx strong{font-weight:700}\n"]
18124
+ template: `<div class="tx" [class.tx-muted]="tone() === 'muted'" [class.tx-accent]="tone() === 'accent'" [style.color]="color() || null" [style.font-size]="fontSize()" [style.font-weight]="fontWeight()">{{ segments().length ? '' : text() }}@for (s of segments(); track $index) {@if (s.strong) {<strong>{{ s.text }}</strong>} @else {<ng-container>{{ s.text }}</ng-container>}}</div>`,
18125
+ styles: [":host{display:block;min-width:0}.tx{margin:0;line-height:1.5;color:#1f2937;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;-webkit-user-select:text;user-select:text}.tx-muted{color:#64748b}.tx-accent{color:var(--ui-accent, #2563eb)}.tx strong{font-weight:700}\n"]
18080
18126
  }]
18081
18127
  }],
18082
18128
  propDecorators: {
@@ -18104,6 +18150,14 @@ i0.ɵɵngDeclareClassMetadata({
18104
18150
  required: false
18105
18151
  }]
18106
18152
  }],
18153
+ color: [{
18154
+ type: i0.Input,
18155
+ args: [{
18156
+ isSignal: true,
18157
+ alias: "color",
18158
+ required: false
18159
+ }]
18160
+ }],
18107
18161
  strong: [{
18108
18162
  type: i0.Input,
18109
18163
  args: [{
@@ -21555,6 +21609,7 @@ var MultiSelectComponent = class MultiSelectComponent {
21555
21609
  "label",
21556
21610
  "ariaLabel",
21557
21611
  "testId",
21612
+ "labelTestId",
21558
21613
  "headingLevel",
21559
21614
  "indeterminate",
21560
21615
  "checked",
@@ -21883,6 +21938,7 @@ var DiscountSelectorComponent = class DiscountSelectorComponent {
21883
21938
  "label",
21884
21939
  "ariaLabel",
21885
21940
  "testId",
21941
+ "labelTestId",
21886
21942
  "headingLevel",
21887
21943
  "indeterminate",
21888
21944
  "checked",
@@ -27166,6 +27222,7 @@ var ImageComponent = class ImageComponent {
27166
27222
  this.height = input("", ...ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []);
27167
27223
  this.maxWidth = input("100%", ...ngDevMode ? [{ debugName: "maxWidth" }] : /* istanbul ignore next */ []);
27168
27224
  this.maxHeight = input("", ...ngDevMode ? [{ debugName: "maxHeight" }] : /* istanbul ignore next */ []);
27225
+ this.minHeight = input("", ...ngDevMode ? [{ debugName: "minHeight" }] : /* istanbul ignore next */ []);
27169
27226
  this.aspectRatio = input("", ...ngDevMode ? [{ debugName: "aspectRatio" }] : /* istanbul ignore next */ []);
27170
27227
  this.radius = input("none", ...ngDevMode ? [{ debugName: "radius" }] : /* istanbul ignore next */ []);
27171
27228
  this.bordered = input(false, ...ngDevMode ? [{ debugName: "bordered" }] : /* istanbul ignore next */ []);
@@ -27260,6 +27317,13 @@ var ImageComponent = class ImageComponent {
27260
27317
  isRequired: false,
27261
27318
  transformFunction: null
27262
27319
  },
27320
+ minHeight: {
27321
+ classPropertyName: "minHeight",
27322
+ publicName: "minHeight",
27323
+ isSignal: true,
27324
+ isRequired: false,
27325
+ transformFunction: null
27326
+ },
27263
27327
  aspectRatio: {
27264
27328
  classPropertyName: "aspectRatio",
27265
27329
  publicName: "aspectRatio",
@@ -27323,12 +27387,12 @@ var ImageComponent = class ImageComponent {
27323
27387
  @if (_url() && !_failed()) {
27324
27388
  <img class="im-img" [src]="_url()" [attr.alt]="alt()" [attr.loading]="priority() ? 'eager' : 'lazy'"
27325
27389
  [attr.fetchpriority]="priority() ? 'high' : null" decoding="async"
27326
- [style.width]="imgWidth()" [style.height]="imgHeight()" [style.max-width]="maxWidth()" [style.max-height]="maxHeight() || null"
27390
+ [style.width]="imgWidth()" [style.height]="imgHeight()" [style.max-width]="maxWidth()" [style.max-height]="maxHeight() || null" [style.min-height]="minHeight() || null"
27327
27391
  [style.aspect-ratio]="aspectRatio() || null" [style.object-fit]="fit()" [style.border-radius]="radiusCss()"
27328
27392
  [class.im-bordered]="bordered()" (load)="loaded.emit()" (error)="_onError()" />
27329
27393
  } @else if (placeholder()) {
27330
27394
  <span class="im-ph" [class.im-bordered]="bordered()" [attr.role]="alt() ? 'img' : null" [attr.aria-label]="alt() || null" [attr.aria-hidden]="alt() ? null : 'true'"
27331
- [style.width]="boxWidth()" [style.height]="boxHeight()" [style.max-width]="maxWidth()" [style.max-height]="maxHeight() || null"
27395
+ [style.width]="boxWidth()" [style.height]="boxHeight()" [style.max-width]="maxWidth()" [style.max-height]="maxHeight() || null" [style.min-height]="minHeight() || null"
27332
27396
  [style.aspect-ratio]="aspectRatio() || null" [style.border-radius]="radiusCss()">
27333
27397
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="9" cy="10" r="1.8"/><path d="M21 16l-5-5-8 9"/></svg>
27334
27398
  </span>
@@ -27359,12 +27423,12 @@ i0.ɵɵngDeclareClassMetadata({
27359
27423
  @if (_url() && !_failed()) {
27360
27424
  <img class="im-img" [src]="_url()" [attr.alt]="alt()" [attr.loading]="priority() ? 'eager' : 'lazy'"
27361
27425
  [attr.fetchpriority]="priority() ? 'high' : null" decoding="async"
27362
- [style.width]="imgWidth()" [style.height]="imgHeight()" [style.max-width]="maxWidth()" [style.max-height]="maxHeight() || null"
27426
+ [style.width]="imgWidth()" [style.height]="imgHeight()" [style.max-width]="maxWidth()" [style.max-height]="maxHeight() || null" [style.min-height]="minHeight() || null"
27363
27427
  [style.aspect-ratio]="aspectRatio() || null" [style.object-fit]="fit()" [style.border-radius]="radiusCss()"
27364
27428
  [class.im-bordered]="bordered()" (load)="loaded.emit()" (error)="_onError()" />
27365
27429
  } @else if (placeholder()) {
27366
27430
  <span class="im-ph" [class.im-bordered]="bordered()" [attr.role]="alt() ? 'img' : null" [attr.aria-label]="alt() || null" [attr.aria-hidden]="alt() ? null : 'true'"
27367
- [style.width]="boxWidth()" [style.height]="boxHeight()" [style.max-width]="maxWidth()" [style.max-height]="maxHeight() || null"
27431
+ [style.width]="boxWidth()" [style.height]="boxHeight()" [style.max-width]="maxWidth()" [style.max-height]="maxHeight() || null" [style.min-height]="minHeight() || null"
27368
27432
  [style.aspect-ratio]="aspectRatio() || null" [style.border-radius]="radiusCss()">
27369
27433
  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="9" cy="10" r="1.8"/><path d="M21 16l-5-5-8 9"/></svg>
27370
27434
  </span>
@@ -27431,6 +27495,14 @@ i0.ɵɵngDeclareClassMetadata({
27431
27495
  required: false
27432
27496
  }]
27433
27497
  }],
27498
+ minHeight: [{
27499
+ type: i0.Input,
27500
+ args: [{
27501
+ isSignal: true,
27502
+ alias: "minHeight",
27503
+ required: false
27504
+ }]
27505
+ }],
27434
27506
  aspectRatio: [{
27435
27507
  type: i0.Input,
27436
27508
  args: [{
@@ -27621,6 +27693,7 @@ var ImageGalleryComponent = class ImageGalleryComponent {
27621
27693
  this.maxHeight = input("70vh", ...ngDevMode ? [{ debugName: "maxHeight" }] : /* istanbul ignore next */ []);
27622
27694
  this.fit = input("contain", ...ngDevMode ? [{ debugName: "fit" }] : /* istanbul ignore next */ []);
27623
27695
  this.ariaLabel = input("Image gallery", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
27696
+ this.autofocus = input(false, ...ngDevMode ? [{ debugName: "autofocus" }] : /* istanbul ignore next */ []);
27624
27697
  this.count = computed(() => this.images().length, ...ngDevMode ? [{ debugName: "count" }] : /* istanbul ignore next */ []);
27625
27698
  this.position = computed(() => {
27626
27699
  const n = this.count();
@@ -27629,6 +27702,8 @@ var ImageGalleryComponent = class ImageGalleryComponent {
27629
27702
  }, ...ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []);
27630
27703
  this.current = computed(() => this.images()[this.position()] ?? { src: "" }, ...ngDevMode ? [{ debugName: "current" }] : /* istanbul ignore next */ []);
27631
27704
  this.currentAlt = computed(() => this.current().alt ?? `Image ${this.position() + 1} of ${this.count()}`, ...ngDevMode ? [{ debugName: "currentAlt" }] : /* istanbul ignore next */ []);
27705
+ this.autofocusNext = computed(() => this.autofocus() && this.canNext(), ...ngDevMode ? [{ debugName: "autofocusNext" }] : /* istanbul ignore next */ []);
27706
+ this.autofocusPrev = computed(() => this.autofocus() && !this.canNext() && this.canPrev(), ...ngDevMode ? [{ debugName: "autofocusPrev" }] : /* istanbul ignore next */ []);
27632
27707
  this.canPrev = computed(() => this.count() > 1 && (this.loop() || this.position() > 0), ...ngDevMode ? [{ debugName: "canPrev" }] : /* istanbul ignore next */ []);
27633
27708
  this.canNext = computed(() => this.count() > 1 && (this.loop() || this.position() < this.count() - 1), ...ngDevMode ? [{ debugName: "canNext" }] : /* istanbul ignore next */ []);
27634
27709
  this.announcement = computed(() => this.count() > 1 ? `Image ${this.position() + 1} of ${this.count()}${this.current().alt ? ": " + this.current().alt : ""}` : "", ...ngDevMode ? [{ debugName: "announcement" }] : /* istanbul ignore next */ []);
@@ -27739,6 +27814,13 @@ var ImageGalleryComponent = class ImageGalleryComponent {
27739
27814
  isSignal: true,
27740
27815
  isRequired: false,
27741
27816
  transformFunction: null
27817
+ },
27818
+ autofocus: {
27819
+ classPropertyName: "autofocus",
27820
+ publicName: "autofocus",
27821
+ isSignal: true,
27822
+ isRequired: false,
27823
+ transformFunction: null
27742
27824
  }
27743
27825
  },
27744
27826
  outputs: { index: "indexChange" },
@@ -27748,13 +27830,13 @@ var ImageGalleryComponent = class ImageGalleryComponent {
27748
27830
  <div class="ig" role="group" aria-roledescription="carousel" [attr.aria-label]="ariaLabel()" (keydown)="onKey($event)">
27749
27831
  <div class="ig-stage">
27750
27832
  @if (count() > 1) {
27751
- <ui-button class="ig-nav ig-prev" variant="secondary" size="sm" ariaLabel="Previous image" [disabled]="!canPrev()" (click)="prev()" data-testid="gallery-prev">
27833
+ <ui-button class="ig-nav ig-prev" variant="secondary" size="sm" ariaLabel="Previous image" [disabled]="!canPrev()" [attr.data-autofocus]="autofocusPrev() ? '' : null" (click)="prev()" data-testid="gallery-prev">
27752
27834
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 18l-6-6 6-6"/></svg>
27753
27835
  </ui-button>
27754
27836
  }
27755
27837
  <ui-image class="ig-img" [src]="current().src" [alt]="currentAlt()" [fit]="fit()" width="100%" [maxHeight]="maxHeight()" [aspectRatio]="aspectRatio()" data-testid="gallery-image" />
27756
27838
  @if (count() > 1) {
27757
- <ui-button class="ig-nav ig-next" variant="secondary" size="sm" ariaLabel="Next image" [disabled]="!canNext()" (click)="next()" data-testid="gallery-next">
27839
+ <ui-button class="ig-nav ig-next" variant="secondary" size="sm" ariaLabel="Next image" [disabled]="!canNext()" [attr.data-autofocus]="autofocusNext() ? '' : null" (click)="next()" data-testid="gallery-next">
27758
27840
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 18l6-6-6-6"/></svg>
27759
27841
  </ui-button>
27760
27842
  }
@@ -27818,6 +27900,7 @@ var ImageGalleryComponent = class ImageGalleryComponent {
27818
27900
  "height",
27819
27901
  "maxWidth",
27820
27902
  "maxHeight",
27903
+ "minHeight",
27821
27904
  "aspectRatio",
27822
27905
  "radius",
27823
27906
  "bordered",
@@ -27865,13 +27948,13 @@ i0.ɵɵngDeclareClassMetadata({
27865
27948
  <div class="ig" role="group" aria-roledescription="carousel" [attr.aria-label]="ariaLabel()" (keydown)="onKey($event)">
27866
27949
  <div class="ig-stage">
27867
27950
  @if (count() > 1) {
27868
- <ui-button class="ig-nav ig-prev" variant="secondary" size="sm" ariaLabel="Previous image" [disabled]="!canPrev()" (click)="prev()" data-testid="gallery-prev">
27951
+ <ui-button class="ig-nav ig-prev" variant="secondary" size="sm" ariaLabel="Previous image" [disabled]="!canPrev()" [attr.data-autofocus]="autofocusPrev() ? '' : null" (click)="prev()" data-testid="gallery-prev">
27869
27952
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M15 18l-6-6 6-6"/></svg>
27870
27953
  </ui-button>
27871
27954
  }
27872
27955
  <ui-image class="ig-img" [src]="current().src" [alt]="currentAlt()" [fit]="fit()" width="100%" [maxHeight]="maxHeight()" [aspectRatio]="aspectRatio()" data-testid="gallery-image" />
27873
27956
  @if (count() > 1) {
27874
- <ui-button class="ig-nav ig-next" variant="secondary" size="sm" ariaLabel="Next image" [disabled]="!canNext()" (click)="next()" data-testid="gallery-next">
27957
+ <ui-button class="ig-nav ig-next" variant="secondary" size="sm" ariaLabel="Next image" [disabled]="!canNext()" [attr.data-autofocus]="autofocusNext() ? '' : null" (click)="next()" data-testid="gallery-next">
27875
27958
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 18l6-6-6-6"/></svg>
27876
27959
  </ui-button>
27877
27960
  }
@@ -27971,6 +28054,14 @@ i0.ɵɵngDeclareClassMetadata({
27971
28054
  alias: "ariaLabel",
27972
28055
  required: false
27973
28056
  }]
28057
+ }],
28058
+ autofocus: [{
28059
+ type: i0.Input,
28060
+ args: [{
28061
+ isSignal: true,
28062
+ alias: "autofocus",
28063
+ required: false
28064
+ }]
27974
28065
  }]
27975
28066
  }
27976
28067
  });
@@ -31659,6 +31750,8 @@ var DetailCardComponent = class DetailCardComponent {
31659
31750
  this.showEdit = input(false, ...ngDevMode ? [{ debugName: "showEdit" }] : /* istanbul ignore next */ []);
31660
31751
  this.editLabel = input("Edit", ...ngDevMode ? [{ debugName: "editLabel" }] : /* istanbul ignore next */ []);
31661
31752
  this.editClick = output();
31753
+ this.editTestId = input("", ...ngDevMode ? [{ debugName: "editTestId" }] : /* istanbul ignore next */ []);
31754
+ this.editIcon = input(true, ...ngDevMode ? [{ debugName: "editIcon" }] : /* istanbul ignore next */ []);
31662
31755
  this.editAriaLabel = input("", ...ngDevMode ? [{ debugName: "editAriaLabel" }] : /* istanbul ignore next */ []);
31663
31756
  this.fill = input(false, ...ngDevMode ? [{ debugName: "fill" }] : /* istanbul ignore next */ []);
31664
31757
  }
@@ -31786,6 +31879,20 @@ var DetailCardComponent = class DetailCardComponent {
31786
31879
  isRequired: false,
31787
31880
  transformFunction: null
31788
31881
  },
31882
+ editTestId: {
31883
+ classPropertyName: "editTestId",
31884
+ publicName: "editTestId",
31885
+ isSignal: true,
31886
+ isRequired: false,
31887
+ transformFunction: null
31888
+ },
31889
+ editIcon: {
31890
+ classPropertyName: "editIcon",
31891
+ publicName: "editIcon",
31892
+ isSignal: true,
31893
+ isRequired: false,
31894
+ transformFunction: null
31895
+ },
31789
31896
  editAriaLabel: {
31790
31897
  classPropertyName: "editAriaLabel",
31791
31898
  publicName: "editAriaLabel",
@@ -31836,11 +31943,13 @@ var DetailCardComponent = class DetailCardComponent {
31836
31943
  <ng-content select="[card-header]" />
31837
31944
  </div>
31838
31945
  @if (showEdit()) {
31839
- <ui-button class="dc-edit" variant="secondary" size="xs" [ariaLabel]="editAriaLabel() || undefined" (click)="$event.stopPropagation(); editClick.emit()">
31946
+ <ui-button class="dc-edit" variant="secondary" size="xs" [ariaLabel]="editAriaLabel() || undefined" [attr.data-testid]="editTestId() || null" (click)="$event.stopPropagation(); editClick.emit()">
31947
+ @if (editIcon()) {
31840
31948
  <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
31841
31949
  <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/>
31842
31950
  <path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/>
31843
31951
  </svg>
31952
+ }
31844
31953
  {{ editLabel() }}
31845
31954
  </ui-button>
31846
31955
  }
@@ -31855,7 +31964,7 @@ var DetailCardComponent = class DetailCardComponent {
31855
31964
  </div>
31856
31965
  `,
31857
31966
  isInline: true,
31858
- styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom:0}:host(.dc-fill-host){height:100%}.dc.dc-fill{height:100%;box-sizing:border-box;display:flex;flex-direction:column}.dc.dc-fill .dc-body-wrap{flex:1 1 auto;min-height:0}.dc{background:#fff;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dc-header{display:flex;align-items:center;flex-wrap:wrap;gap:8px 10px;padding:14px 18px}.dc-header.open{border-bottom:1px solid #f1f5f9}.dc-header.collapsible{cursor:pointer;-webkit-user-select:none;user-select:none}@media(hover:hover){.dc-header.collapsible:hover{background:#f8fafc}}.dc-chevron{flex-shrink:0;color:var(--dc-text, #94a3b8)}.dc-chevron svg{transition:transform .2s}.dc-chevron svg.rotated{transform:rotate(-90deg)}.dc-header-text{display:flex;flex-direction:column;gap:2px;flex:1 1 160px;min-width:0;word-break:break-word;overflow-wrap:anywhere}.dc-title{font-size:.8125rem;font-weight:800;letter-spacing:.07em;color:var(--dc-text, #1e293b);line-height:1.3;text-transform:uppercase}.dc-title--as-written{text-transform:none}.dc-subtitle{font-size:.75rem;color:var(--dc-text, #94a3b8)}.dc-has-text-color .dc-subtitle{opacity:.8}.dc-has-text-color .dc-header.open{border-bottom-color:#94a3b859}.dc-edit{flex-shrink:0;margin-left:auto}.dc-edit ::ng-deep button{font-size:.8rem;font-weight:500;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;gap:5px}.dc-edit ::ng-deep button:hover{background:#f1f5f9;color:#1e293b}.dc-body-wrap{display:grid;grid-template-rows:1fr;transition:grid-template-rows .25s ease}.dc-body-wrap.collapsed{grid-template-rows:0fr}.dc-body{padding:16px 18px;min-height:0;overflow:hidden}@media(max-width:480px){.dc-header{padding:12px 14px}.dc-body{padding:14px}.dc-edit{margin-left:0}}@media(prefers-reduced-motion:reduce){.dc-body-wrap,.dc-chevron svg{transition:none}}\n"],
31967
+ styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom:0}:host(.dc-fill-host){height:100%;margin-bottom:0}.dc.dc-fill{height:100%;box-sizing:border-box;display:flex;flex-direction:column}.dc.dc-fill .dc-body-wrap{flex:1 1 auto;min-height:0}.dc{background:#fff;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dc-header{display:flex;align-items:center;flex-wrap:wrap;gap:8px 10px;padding:14px 18px}.dc-header.open{border-bottom:1px solid #f1f5f9}.dc-header.collapsible{cursor:pointer;-webkit-user-select:none;user-select:none}@media(hover:hover){.dc-header.collapsible:hover{background:#f8fafc}}.dc-chevron{flex-shrink:0;color:var(--dc-text, #64748b)}.dc-chevron svg{transition:transform .2s}.dc-chevron svg.rotated{transform:rotate(-90deg)}.dc-header-text{display:flex;flex-direction:column;gap:2px;flex:1 1 160px;min-width:0;word-break:break-word;overflow-wrap:anywhere}.dc-title{font-size:.8125rem;font-weight:800;letter-spacing:.07em;color:var(--dc-text, #1e293b);line-height:1.3;text-transform:uppercase}.dc-title--as-written{text-transform:none}.dc-subtitle{font-size:.75rem;color:var(--dc-text, #475569)}.dc-has-text-color .dc-subtitle{opacity:.8}.dc-has-text-color .dc-header.open{border-bottom-color:#94a3b859}.dc-edit{flex-shrink:0;margin-left:auto}.dc-edit ::ng-deep button{font-size:.8rem;font-weight:500;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;gap:5px}.dc-edit ::ng-deep button:hover{background:#f1f5f9;color:#1e293b}.dc-body-wrap{display:grid;grid-template-rows:1fr;transition:grid-template-rows .25s ease}.dc-body-wrap.collapsed{grid-template-rows:0fr}.dc-body{padding:16px 18px;min-height:0;overflow:hidden}@media(max-width:480px){.dc-header{padding:12px 14px}.dc-body{padding:14px}.dc-edit{margin-left:0}}@media(prefers-reduced-motion:reduce){.dc-body-wrap,.dc-chevron svg{transition:none}}\n"],
31859
31968
  dependencies: [{
31860
31969
  kind: "component",
31861
31970
  type: ButtonComponent,
@@ -31927,11 +32036,13 @@ i0.ɵɵngDeclareClassMetadata({
31927
32036
  <ng-content select="[card-header]" />
31928
32037
  </div>
31929
32038
  @if (showEdit()) {
31930
- <ui-button class="dc-edit" variant="secondary" size="xs" [ariaLabel]="editAriaLabel() || undefined" (click)="$event.stopPropagation(); editClick.emit()">
32039
+ <ui-button class="dc-edit" variant="secondary" size="xs" [ariaLabel]="editAriaLabel() || undefined" [attr.data-testid]="editTestId() || null" (click)="$event.stopPropagation(); editClick.emit()">
32040
+ @if (editIcon()) {
31931
32041
  <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
31932
32042
  <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/>
31933
32043
  <path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/>
31934
32044
  </svg>
32045
+ }
31935
32046
  {{ editLabel() }}
31936
32047
  </ui-button>
31937
32048
  }
@@ -31945,7 +32056,7 @@ i0.ɵɵngDeclareClassMetadata({
31945
32056
  </div>
31946
32057
  </div>
31947
32058
  `,
31948
- styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom:0}:host(.dc-fill-host){height:100%}.dc.dc-fill{height:100%;box-sizing:border-box;display:flex;flex-direction:column}.dc.dc-fill .dc-body-wrap{flex:1 1 auto;min-height:0}.dc{background:#fff;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dc-header{display:flex;align-items:center;flex-wrap:wrap;gap:8px 10px;padding:14px 18px}.dc-header.open{border-bottom:1px solid #f1f5f9}.dc-header.collapsible{cursor:pointer;-webkit-user-select:none;user-select:none}@media(hover:hover){.dc-header.collapsible:hover{background:#f8fafc}}.dc-chevron{flex-shrink:0;color:var(--dc-text, #94a3b8)}.dc-chevron svg{transition:transform .2s}.dc-chevron svg.rotated{transform:rotate(-90deg)}.dc-header-text{display:flex;flex-direction:column;gap:2px;flex:1 1 160px;min-width:0;word-break:break-word;overflow-wrap:anywhere}.dc-title{font-size:.8125rem;font-weight:800;letter-spacing:.07em;color:var(--dc-text, #1e293b);line-height:1.3;text-transform:uppercase}.dc-title--as-written{text-transform:none}.dc-subtitle{font-size:.75rem;color:var(--dc-text, #94a3b8)}.dc-has-text-color .dc-subtitle{opacity:.8}.dc-has-text-color .dc-header.open{border-bottom-color:#94a3b859}.dc-edit{flex-shrink:0;margin-left:auto}.dc-edit ::ng-deep button{font-size:.8rem;font-weight:500;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;gap:5px}.dc-edit ::ng-deep button:hover{background:#f1f5f9;color:#1e293b}.dc-body-wrap{display:grid;grid-template-rows:1fr;transition:grid-template-rows .25s ease}.dc-body-wrap.collapsed{grid-template-rows:0fr}.dc-body{padding:16px 18px;min-height:0;overflow:hidden}@media(max-width:480px){.dc-header{padding:12px 14px}.dc-body{padding:14px}.dc-edit{margin-left:0}}@media(prefers-reduced-motion:reduce){.dc-body-wrap,.dc-chevron svg{transition:none}}\n"]
32059
+ styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom:0}:host(.dc-fill-host){height:100%;margin-bottom:0}.dc.dc-fill{height:100%;box-sizing:border-box;display:flex;flex-direction:column}.dc.dc-fill .dc-body-wrap{flex:1 1 auto;min-height:0}.dc{background:#fff;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dc-header{display:flex;align-items:center;flex-wrap:wrap;gap:8px 10px;padding:14px 18px}.dc-header.open{border-bottom:1px solid #f1f5f9}.dc-header.collapsible{cursor:pointer;-webkit-user-select:none;user-select:none}@media(hover:hover){.dc-header.collapsible:hover{background:#f8fafc}}.dc-chevron{flex-shrink:0;color:var(--dc-text, #64748b)}.dc-chevron svg{transition:transform .2s}.dc-chevron svg.rotated{transform:rotate(-90deg)}.dc-header-text{display:flex;flex-direction:column;gap:2px;flex:1 1 160px;min-width:0;word-break:break-word;overflow-wrap:anywhere}.dc-title{font-size:.8125rem;font-weight:800;letter-spacing:.07em;color:var(--dc-text, #1e293b);line-height:1.3;text-transform:uppercase}.dc-title--as-written{text-transform:none}.dc-subtitle{font-size:.75rem;color:var(--dc-text, #475569)}.dc-has-text-color .dc-subtitle{opacity:.8}.dc-has-text-color .dc-header.open{border-bottom-color:#94a3b859}.dc-edit{flex-shrink:0;margin-left:auto}.dc-edit ::ng-deep button{font-size:.8rem;font-weight:500;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;gap:5px}.dc-edit ::ng-deep button:hover{background:#f1f5f9;color:#1e293b}.dc-body-wrap{display:grid;grid-template-rows:1fr;transition:grid-template-rows .25s ease}.dc-body-wrap.collapsed{grid-template-rows:0fr}.dc-body{padding:16px 18px;min-height:0;overflow:hidden}@media(max-width:480px){.dc-header{padding:12px 14px}.dc-body{padding:14px}.dc-edit{margin-left:0}}@media(prefers-reduced-motion:reduce){.dc-body-wrap,.dc-chevron svg{transition:none}}\n"]
31949
32060
  }]
31950
32061
  }],
31951
32062
  propDecorators: {
@@ -32060,6 +32171,22 @@ i0.ɵɵngDeclareClassMetadata({
32060
32171
  type: i0.Output,
32061
32172
  args: ["editClick"]
32062
32173
  }],
32174
+ editTestId: [{
32175
+ type: i0.Input,
32176
+ args: [{
32177
+ isSignal: true,
32178
+ alias: "editTestId",
32179
+ required: false
32180
+ }]
32181
+ }],
32182
+ editIcon: [{
32183
+ type: i0.Input,
32184
+ args: [{
32185
+ isSignal: true,
32186
+ alias: "editIcon",
32187
+ required: false
32188
+ }]
32189
+ }],
32063
32190
  editAriaLabel: [{
32064
32191
  type: i0.Input,
32065
32192
  args: [{
@@ -33056,6 +33183,10 @@ var ColumnsComponent = class ColumnsComponent {
33056
33183
  this.countBelowLg = input(null, ...ngDevMode ? [{ debugName: "countBelowLg" }] : /* istanbul ignore next */ []);
33057
33184
  this.countBelowMd = input(null, ...ngDevMode ? [{ debugName: "countBelowMd" }] : /* istanbul ignore next */ []);
33058
33185
  this.countBelowSm = input(null, ...ngDevMode ? [{ debugName: "countBelowSm" }] : /* istanbul ignore next */ []);
33186
+ this.countBase = input(1, ...ngDevMode ? [{ debugName: "countBase" }] : /* istanbul ignore next */ []);
33187
+ this.countFromSm = input(null, ...ngDevMode ? [{ debugName: "countFromSm" }] : /* istanbul ignore next */ []);
33188
+ this.countFromMd = input(null, ...ngDevMode ? [{ debugName: "countFromMd" }] : /* istanbul ignore next */ []);
33189
+ this.countFromLg = input(null, ...ngDevMode ? [{ debugName: "countFromLg" }] : /* istanbul ignore next */ []);
33059
33190
  this.cols = computed(() => {
33060
33191
  const n = Math.trunc(Number(this.count()));
33061
33192
  if (!Number.isFinite(n)) return 2;
@@ -33064,8 +33195,14 @@ var ColumnsComponent = class ColumnsComponent {
33064
33195
  this.colsLg = computed(() => ColumnsComponent.clampTier(this.countBelowLg()), ...ngDevMode ? [{ debugName: "colsLg" }] : /* istanbul ignore next */ []);
33065
33196
  this.colsMd = computed(() => ColumnsComponent.clampTier(this.countBelowMd()), ...ngDevMode ? [{ debugName: "colsMd" }] : /* istanbul ignore next */ []);
33066
33197
  this.colsSm = computed(() => ColumnsComponent.clampTier(this.countBelowSm()), ...ngDevMode ? [{ debugName: "colsSm" }] : /* istanbul ignore next */ []);
33198
+ this.fromMode = computed(() => this.countFromSm() != null || this.countFromMd() != null || this.countFromLg() != null, ...ngDevMode ? [{ debugName: "fromMode" }] : /* istanbul ignore next */ []);
33199
+ this.base = computed(() => this.fromMode() ? ColumnsComponent.clampTier(this.countBase()) ?? 1 : null, ...ngDevMode ? [{ debugName: "base" }] : /* istanbul ignore next */ []);
33200
+ this.fromSm = computed(() => ColumnsComponent.clampTier(this.countFromSm()), ...ngDevMode ? [{ debugName: "fromSm" }] : /* istanbul ignore next */ []);
33201
+ this.fromMd = computed(() => ColumnsComponent.clampTier(this.countFromMd()), ...ngDevMode ? [{ debugName: "fromMd" }] : /* istanbul ignore next */ []);
33202
+ this.fromLg = computed(() => ColumnsComponent.clampTier(this.countFromLg()), ...ngDevMode ? [{ debugName: "fromLg" }] : /* istanbul ignore next */ []);
33067
33203
  this.gapCss = computed(() => resolveLayoutGap(this.gap(), "lg"), ...ngDevMode ? [{ debugName: "gapCss" }] : /* istanbul ignore next */ []);
33068
33204
  this.collapseClass = computed(() => {
33205
+ if (this.fromMode()) return "cl cl-from";
33069
33206
  const c = this.collapseAt();
33070
33207
  return c === "never" ? "cl" : `cl cl-${c}`;
33071
33208
  }, ...ngDevMode ? [{ debugName: "collapseClass" }] : /* istanbul ignore next */ []);
@@ -33141,13 +33278,41 @@ var ColumnsComponent = class ColumnsComponent {
33141
33278
  isSignal: true,
33142
33279
  isRequired: false,
33143
33280
  transformFunction: null
33281
+ },
33282
+ countBase: {
33283
+ classPropertyName: "countBase",
33284
+ publicName: "countBase",
33285
+ isSignal: true,
33286
+ isRequired: false,
33287
+ transformFunction: null
33288
+ },
33289
+ countFromSm: {
33290
+ classPropertyName: "countFromSm",
33291
+ publicName: "countFromSm",
33292
+ isSignal: true,
33293
+ isRequired: false,
33294
+ transformFunction: null
33295
+ },
33296
+ countFromMd: {
33297
+ classPropertyName: "countFromMd",
33298
+ publicName: "countFromMd",
33299
+ isSignal: true,
33300
+ isRequired: false,
33301
+ transformFunction: null
33302
+ },
33303
+ countFromLg: {
33304
+ classPropertyName: "countFromLg",
33305
+ publicName: "countFromLg",
33306
+ isSignal: true,
33307
+ isRequired: false,
33308
+ transformFunction: null
33144
33309
  }
33145
33310
  },
33146
33311
  host: { properties: { "attr.data-columns": "cols()" } },
33147
33312
  ngImport: i0,
33148
- template: `<div class="cl" [class]="collapseClass()" [style.--cl-cols]="cols()" [style.--cl-cols-lg]="colsLg()" [style.--cl-cols-md]="colsMd()" [style.--cl-cols-sm]="colsSm()" [style.gap]="gapCss()" [style.align-items]="align()"><ng-content /></div>`,
33313
+ template: `<div class="cl" [class]="collapseClass()" [style.--cl-cols]="cols()" [style.--cl-cols-lg]="colsLg()" [style.--cl-cols-md]="colsMd()" [style.--cl-cols-sm]="colsSm()" [style.--cl-base]="base()" [style.--cl-from-sm]="fromSm()" [style.--cl-from-md]="fromMd()" [style.--cl-from-lg]="fromLg()" [style.gap]="gapCss()" [style.align-items]="align()"><ng-content /></div>`,
33149
33314
  isInline: true,
33150
- styles: [":host{display:block}.cl{display:grid;grid-template-columns:repeat(var(--cl-cols, 2),minmax(0,1fr))}@media(max-width:1024px){.cl{grid-template-columns:repeat(var(--cl-cols-lg, var(--cl-cols, 2)),minmax(0,1fr))}}@media(max-width:768px){.cl{grid-template-columns:repeat(var(--cl-cols-md, var(--cl-cols-lg, var(--cl-cols, 2))),minmax(0,1fr))}}@media(max-width:480px){.cl{grid-template-columns:repeat(var(--cl-cols-sm, var(--cl-cols-md, var(--cl-cols-lg, var(--cl-cols, 2)))),minmax(0,1fr))}}@media(max-width:480px){.cl.cl-sm{grid-template-columns:minmax(0,1fr)}}@media(max-width:768px){.cl.cl-md{grid-template-columns:minmax(0,1fr)}}@media(max-width:1024px){.cl.cl-lg{grid-template-columns:minmax(0,1fr)}}\n"],
33315
+ styles: [":host{display:block}.cl{display:grid;grid-template-columns:repeat(var(--cl-cols, 2),minmax(0,1fr))}@media(max-width:1024px){.cl{grid-template-columns:repeat(var(--cl-cols-lg, var(--cl-cols, 2)),minmax(0,1fr))}}@media(max-width:768px){.cl{grid-template-columns:repeat(var(--cl-cols-md, var(--cl-cols-lg, var(--cl-cols, 2))),minmax(0,1fr))}}@media(max-width:480px){.cl{grid-template-columns:repeat(var(--cl-cols-sm, var(--cl-cols-md, var(--cl-cols-lg, var(--cl-cols, 2)))),minmax(0,1fr))}}.cl.cl-from{grid-template-columns:repeat(var(--cl-base, 1),minmax(0,1fr))}@media(min-width:480px){.cl.cl-from{grid-template-columns:repeat(var(--cl-from-sm, var(--cl-base, 1)),minmax(0,1fr))}}@media(min-width:768px){.cl.cl-from{grid-template-columns:repeat(var(--cl-from-md, var(--cl-from-sm, var(--cl-base, 1))),minmax(0,1fr))}}@media(min-width:1024px){.cl.cl-from{grid-template-columns:repeat(var(--cl-from-lg, var(--cl-from-md, var(--cl-from-sm, var(--cl-base, 1)))),minmax(0,1fr))}}@media(max-width:480px){.cl.cl-sm{grid-template-columns:minmax(0,1fr)}}@media(max-width:768px){.cl.cl-md{grid-template-columns:minmax(0,1fr)}}@media(max-width:1024px){.cl.cl-lg{grid-template-columns:minmax(0,1fr)}}\n"],
33151
33316
  changeDetection: i0.ChangeDetectionStrategy.OnPush
33152
33317
  });
33153
33318
  }
@@ -33164,8 +33329,8 @@ i0.ɵɵngDeclareClassMetadata({
33164
33329
  standalone: true,
33165
33330
  changeDetection: ChangeDetectionStrategy.OnPush,
33166
33331
  host: { "[attr.data-columns]": "cols()" },
33167
- template: `<div class="cl" [class]="collapseClass()" [style.--cl-cols]="cols()" [style.--cl-cols-lg]="colsLg()" [style.--cl-cols-md]="colsMd()" [style.--cl-cols-sm]="colsSm()" [style.gap]="gapCss()" [style.align-items]="align()"><ng-content /></div>`,
33168
- styles: [":host{display:block}.cl{display:grid;grid-template-columns:repeat(var(--cl-cols, 2),minmax(0,1fr))}@media(max-width:1024px){.cl{grid-template-columns:repeat(var(--cl-cols-lg, var(--cl-cols, 2)),minmax(0,1fr))}}@media(max-width:768px){.cl{grid-template-columns:repeat(var(--cl-cols-md, var(--cl-cols-lg, var(--cl-cols, 2))),minmax(0,1fr))}}@media(max-width:480px){.cl{grid-template-columns:repeat(var(--cl-cols-sm, var(--cl-cols-md, var(--cl-cols-lg, var(--cl-cols, 2)))),minmax(0,1fr))}}@media(max-width:480px){.cl.cl-sm{grid-template-columns:minmax(0,1fr)}}@media(max-width:768px){.cl.cl-md{grid-template-columns:minmax(0,1fr)}}@media(max-width:1024px){.cl.cl-lg{grid-template-columns:minmax(0,1fr)}}\n"]
33332
+ template: `<div class="cl" [class]="collapseClass()" [style.--cl-cols]="cols()" [style.--cl-cols-lg]="colsLg()" [style.--cl-cols-md]="colsMd()" [style.--cl-cols-sm]="colsSm()" [style.--cl-base]="base()" [style.--cl-from-sm]="fromSm()" [style.--cl-from-md]="fromMd()" [style.--cl-from-lg]="fromLg()" [style.gap]="gapCss()" [style.align-items]="align()"><ng-content /></div>`,
33333
+ styles: [":host{display:block}.cl{display:grid;grid-template-columns:repeat(var(--cl-cols, 2),minmax(0,1fr))}@media(max-width:1024px){.cl{grid-template-columns:repeat(var(--cl-cols-lg, var(--cl-cols, 2)),minmax(0,1fr))}}@media(max-width:768px){.cl{grid-template-columns:repeat(var(--cl-cols-md, var(--cl-cols-lg, var(--cl-cols, 2))),minmax(0,1fr))}}@media(max-width:480px){.cl{grid-template-columns:repeat(var(--cl-cols-sm, var(--cl-cols-md, var(--cl-cols-lg, var(--cl-cols, 2)))),minmax(0,1fr))}}.cl.cl-from{grid-template-columns:repeat(var(--cl-base, 1),minmax(0,1fr))}@media(min-width:480px){.cl.cl-from{grid-template-columns:repeat(var(--cl-from-sm, var(--cl-base, 1)),minmax(0,1fr))}}@media(min-width:768px){.cl.cl-from{grid-template-columns:repeat(var(--cl-from-md, var(--cl-from-sm, var(--cl-base, 1))),minmax(0,1fr))}}@media(min-width:1024px){.cl.cl-from{grid-template-columns:repeat(var(--cl-from-lg, var(--cl-from-md, var(--cl-from-sm, var(--cl-base, 1)))),minmax(0,1fr))}}@media(max-width:480px){.cl.cl-sm{grid-template-columns:minmax(0,1fr)}}@media(max-width:768px){.cl.cl-md{grid-template-columns:minmax(0,1fr)}}@media(max-width:1024px){.cl.cl-lg{grid-template-columns:minmax(0,1fr)}}\n"]
33169
33334
  }]
33170
33335
  }],
33171
33336
  propDecorators: {
@@ -33224,6 +33389,38 @@ i0.ɵɵngDeclareClassMetadata({
33224
33389
  alias: "countBelowSm",
33225
33390
  required: false
33226
33391
  }]
33392
+ }],
33393
+ countBase: [{
33394
+ type: i0.Input,
33395
+ args: [{
33396
+ isSignal: true,
33397
+ alias: "countBase",
33398
+ required: false
33399
+ }]
33400
+ }],
33401
+ countFromSm: [{
33402
+ type: i0.Input,
33403
+ args: [{
33404
+ isSignal: true,
33405
+ alias: "countFromSm",
33406
+ required: false
33407
+ }]
33408
+ }],
33409
+ countFromMd: [{
33410
+ type: i0.Input,
33411
+ args: [{
33412
+ isSignal: true,
33413
+ alias: "countFromMd",
33414
+ required: false
33415
+ }]
33416
+ }],
33417
+ countFromLg: [{
33418
+ type: i0.Input,
33419
+ args: [{
33420
+ isSignal: true,
33421
+ alias: "countFromLg",
33422
+ required: false
33423
+ }]
33227
33424
  }]
33228
33425
  }
33229
33426
  });
@@ -33246,6 +33443,8 @@ var StackComponent = class StackComponent {
33246
33443
  this.align = input("stretch", ...ngDevMode ? [{ debugName: "align" }] : /* istanbul ignore next */ []);
33247
33444
  this.justify = input("start", ...ngDevMode ? [{ debugName: "justify" }] : /* istanbul ignore next */ []);
33248
33445
  this.wrap = input(false, ...ngDevMode ? [{ debugName: "wrap" }] : /* istanbul ignore next */ []);
33446
+ this.minHeight = input("", ...ngDevMode ? [{ debugName: "minHeight" }] : /* istanbul ignore next */ []);
33447
+ this.width = input("", ...ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []);
33249
33448
  this.gapCss = computed(() => resolveLayoutGap(this.gap(), "md"), ...ngDevMode ? [{ debugName: "gapCss" }] : /* istanbul ignore next */ []);
33250
33449
  this.alignCss = computed(() => ALIGN[this.align()] ?? "stretch", ...ngDevMode ? [{ debugName: "alignCss" }] : /* istanbul ignore next */ []);
33251
33450
  this.justifyCss = computed(() => JUSTIFY$1[this.justify()] ?? "flex-start", ...ngDevMode ? [{ debugName: "justifyCss" }] : /* istanbul ignore next */ []);
@@ -33302,11 +33501,25 @@ var StackComponent = class StackComponent {
33302
33501
  isSignal: true,
33303
33502
  isRequired: false,
33304
33503
  transformFunction: null
33504
+ },
33505
+ minHeight: {
33506
+ classPropertyName: "minHeight",
33507
+ publicName: "minHeight",
33508
+ isSignal: true,
33509
+ isRequired: false,
33510
+ transformFunction: null
33511
+ },
33512
+ width: {
33513
+ classPropertyName: "width",
33514
+ publicName: "width",
33515
+ isSignal: true,
33516
+ isRequired: false,
33517
+ transformFunction: null
33305
33518
  }
33306
33519
  },
33307
33520
  ngImport: i0,
33308
33521
  template: `<div class="st" [class.st-h]="direction() === 'horizontal'" [style.flex-direction]="direction() === 'horizontal' ? 'row' : 'column'"
33309
- [style.gap]="gapCss()" [style.align-items]="alignCss()" [style.justify-content]="justifyCss()" [style.flex-wrap]="wrap() ? 'wrap' : 'nowrap'"><ng-content /></div>`,
33522
+ [style.gap]="gapCss()" [style.align-items]="alignCss()" [style.justify-content]="justifyCss()" [style.flex-wrap]="wrap() ? 'wrap' : 'nowrap'" [style.min-height]="minHeight() || null" [style.width]="width() || null"><ng-content /></div>`,
33310
33523
  isInline: true,
33311
33524
  styles: [":host{display:block}.st{display:flex}.st>::ng-deep *{margin:0!important}.st.st-h>::ng-deep *{min-width:0}\n"],
33312
33525
  changeDetection: i0.ChangeDetectionStrategy.OnPush
@@ -33325,7 +33538,7 @@ i0.ɵɵngDeclareClassMetadata({
33325
33538
  standalone: true,
33326
33539
  changeDetection: ChangeDetectionStrategy.OnPush,
33327
33540
  template: `<div class="st" [class.st-h]="direction() === 'horizontal'" [style.flex-direction]="direction() === 'horizontal' ? 'row' : 'column'"
33328
- [style.gap]="gapCss()" [style.align-items]="alignCss()" [style.justify-content]="justifyCss()" [style.flex-wrap]="wrap() ? 'wrap' : 'nowrap'"><ng-content /></div>`,
33541
+ [style.gap]="gapCss()" [style.align-items]="alignCss()" [style.justify-content]="justifyCss()" [style.flex-wrap]="wrap() ? 'wrap' : 'nowrap'" [style.min-height]="minHeight() || null" [style.width]="width() || null"><ng-content /></div>`,
33329
33542
  styles: [":host{display:block}.st{display:flex}.st>::ng-deep *{margin:0!important}.st.st-h>::ng-deep *{min-width:0}\n"]
33330
33543
  }]
33331
33544
  }],
@@ -33369,6 +33582,22 @@ i0.ɵɵngDeclareClassMetadata({
33369
33582
  alias: "wrap",
33370
33583
  required: false
33371
33584
  }]
33585
+ }],
33586
+ minHeight: [{
33587
+ type: i0.Input,
33588
+ args: [{
33589
+ isSignal: true,
33590
+ alias: "minHeight",
33591
+ required: false
33592
+ }]
33593
+ }],
33594
+ width: [{
33595
+ type: i0.Input,
33596
+ args: [{
33597
+ isSignal: true,
33598
+ alias: "width",
33599
+ required: false
33600
+ }]
33372
33601
  }]
33373
33602
  }
33374
33603
  });
@@ -33556,6 +33785,1302 @@ i0.ɵɵngDeclareClassMetadata({
33556
33785
  }]
33557
33786
  }
33558
33787
  });
33559
- export { ActionBarComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BarRowComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, CheckboxComponent, CheckboxTrailingDirective, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DropdownComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FileInputComponent, FormColSpanDirective, FormComponent, FormRowComponent, FormSectionComponent, HintComponent, IconComponent, ImageComponent, ImageGalleryComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, KpiCardComponent, LAYOUT_GAP_PX, ListComponent, ListItemComponent, LiveRegionComponent, ModalComponent, MoreMenuComponent, MultiSelectComponent, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PaginationComponent, PanelInfoListComponent, PdfHotspotComponent, PhoneNumberPickerComponent, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, RadioOptionContentDirective, ReadonlyFieldsetComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SearchInputComponent, SectionHeaderComponent, SelectComponent, SidePanelComponent, SignaturePadComponent, SkeletonComponent, StackComponent, StarComponent, StepperComponent, TableToolbarComponent, TextComponent, TextInputComponent, TextareaInputComponent, TimeInputComponent, TimelineComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_STATES, UiFieldValidity, acceptLabel, appShellGroupsStorageKey, autoVariant, buildDefaultSchedule, builtInActionIcon, businessTimeOptions, createFieldReveal, decodeFilterValues, digitsOnly, encodeFilterValue, encodeFilterValues, errorContextInterceptor, fileMatchesAccept, formatFileSize, formatIsoDate, formatIsoDateTime, formatTime, getEligibleIds, getEligibleOptions, getErrorMessage, humanReadableMessage, iconPath, isoKey, issueToErrors, maxLengthIssue, normalizeHexColor, parseBizHours, parseIso, parseTime, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, serializeBizHours };
33788
+ const WEEK_DAY_LABELS = [
33789
+ "Sun",
33790
+ "Mon",
33791
+ "Tue",
33792
+ "Wed",
33793
+ "Thu",
33794
+ "Fri",
33795
+ "Sat"
33796
+ ];
33797
+ function toDateStr(d) {
33798
+ return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
33799
+ }
33800
+ function fromDateStr(dateStr) {
33801
+ return /* @__PURE__ */ new Date(dateStr + "T00:00");
33802
+ }
33803
+ function buildMonthCells(anchor, todayStr) {
33804
+ const y = anchor.getFullYear();
33805
+ const m = anchor.getMonth();
33806
+ const start = new Date(y, m, 1 - new Date(y, m, 1).getDay());
33807
+ const cells = [];
33808
+ for (let i = 0; i < 42; i++) {
33809
+ const d = new Date(start.getFullYear(), start.getMonth(), start.getDate() + i);
33810
+ const ds = toDateStr(d);
33811
+ cells.push({
33812
+ dateStr: ds,
33813
+ dayNum: d.getDate(),
33814
+ isToday: ds === todayStr,
33815
+ isCurrentMonth: d.getMonth() === m,
33816
+ isWeekend: d.getDay() === 0 || d.getDay() === 6
33817
+ });
33818
+ }
33819
+ return cells;
33820
+ }
33821
+ function buildWeekDays(anchor, todayStr) {
33822
+ const start = new Date(anchor.getFullYear(), anchor.getMonth(), anchor.getDate() - anchor.getDay());
33823
+ return Array.from({ length: 7 }, (_, i) => {
33824
+ const d = new Date(start.getFullYear(), start.getMonth(), start.getDate() + i);
33825
+ const ds = toDateStr(d);
33826
+ return {
33827
+ dateStr: ds,
33828
+ dayNum: d.getDate(),
33829
+ isToday: ds === todayStr,
33830
+ isCurrentMonth: true,
33831
+ isWeekend: i === 0 || i === 6
33832
+ };
33833
+ });
33834
+ }
33835
+ function rangeFor(view, anchor, todayStr) {
33836
+ if (view === "week") {
33837
+ const days = buildWeekDays(anchor, todayStr);
33838
+ return {
33839
+ view,
33840
+ start: days[0].dateStr,
33841
+ end: days[6].dateStr,
33842
+ anchor
33843
+ };
33844
+ }
33845
+ if (view === "month") {
33846
+ const cells = buildMonthCells(anchor, todayStr);
33847
+ return {
33848
+ view,
33849
+ start: cells[0].dateStr,
33850
+ end: cells[41].dateStr,
33851
+ anchor
33852
+ };
33853
+ }
33854
+ const y = anchor.getFullYear();
33855
+ const m = anchor.getMonth();
33856
+ return {
33857
+ view,
33858
+ start: toDateStr(new Date(y, m, 1)),
33859
+ end: toDateStr(new Date(y, m + 2, 0)),
33860
+ anchor
33861
+ };
33862
+ }
33863
+ function shiftAnchor(view, anchor, direction) {
33864
+ if (view === "week") return new Date(anchor.getFullYear(), anchor.getMonth(), anchor.getDate() + 7 * direction);
33865
+ if (view === "agenda") return new Date(anchor.getFullYear(), anchor.getMonth() + 2 * direction, 1);
33866
+ const y = anchor.getFullYear();
33867
+ const m = anchor.getMonth() + direction;
33868
+ const lastDay = new Date(y, m + 1, 0).getDate();
33869
+ return new Date(y, m, Math.min(anchor.getDate(), lastDay));
33870
+ }
33871
+ const DAY_LABEL = new Intl.DateTimeFormat("en-US", {
33872
+ weekday: "long",
33873
+ month: "long",
33874
+ day: "numeric",
33875
+ year: "numeric"
33876
+ });
33877
+ function formatDayLabel(dateStr) {
33878
+ return DAY_LABEL.format(fromDateStr(dateStr));
33879
+ }
33880
+ function periodLabelFor(view, anchor, todayStr) {
33881
+ if (view === "week") {
33882
+ const days = buildWeekDays(anchor, todayStr);
33883
+ const fs = fromDateStr(days[0].dateStr);
33884
+ const ls = fromDateStr(days[6].dateStr);
33885
+ if (fs.getMonth() === ls.getMonth()) return fs.toLocaleDateString("en-US", {
33886
+ month: "long",
33887
+ year: "numeric"
33888
+ });
33889
+ return `${fs.toLocaleDateString("en-US", { month: "short" })} – ${ls.toLocaleDateString("en-US", {
33890
+ month: "short",
33891
+ year: "numeric"
33892
+ })}`;
33893
+ }
33894
+ if (view === "agenda") {
33895
+ const start = new Date(anchor.getFullYear(), anchor.getMonth(), 1);
33896
+ const end = new Date(anchor.getFullYear(), anchor.getMonth() + 1, 1);
33897
+ return `${start.toLocaleDateString("en-US", { month: "long" })} – ${end.toLocaleDateString("en-US", {
33898
+ month: "long",
33899
+ year: "numeric"
33900
+ })}`;
33901
+ }
33902
+ return anchor.toLocaleDateString("en-US", {
33903
+ month: "long",
33904
+ year: "numeric"
33905
+ });
33906
+ }
33907
+ function formatTime$1(time) {
33908
+ const [h, m] = time.split(":").map(Number);
33909
+ return `${h % 12 || 12}:${String(m).padStart(2, "0")} ${h >= 12 ? "PM" : "AM"}`;
33910
+ }
33911
+ function formatHour(h) {
33912
+ return `${h % 12 || 12} ${h >= 12 ? "PM" : "AM"}`;
33913
+ }
33914
+ const MIN_EVENT_HEIGHT = 20;
33915
+ function timedBox(startTime, endTime, startHour, endHour = 21) {
33916
+ const gridMax = (Math.max(endHour, startHour) + 1 - startHour) * 60;
33917
+ const [h, min] = (startTime ?? `${String(startHour).padStart(2, "0")}:00`).split(":").map(Number);
33918
+ const s = (h - startHour) * 60 + min;
33919
+ let e = s + 60;
33920
+ if (endTime) {
33921
+ const [eh, em] = endTime.split(":").map(Number);
33922
+ e = (eh - startHour) * 60 + em;
33923
+ }
33924
+ const top = Math.min(Math.max(0, s), gridMax - MIN_EVENT_HEIGHT);
33925
+ return {
33926
+ top,
33927
+ height: Math.max(MIN_EVENT_HEIGHT, Math.min(Math.max(e, 0), gridMax) - top)
33928
+ };
33929
+ }
33930
+ function layoutLanes(boxes) {
33931
+ const sorted = boxes.slice().sort((a, b) => a.top - b.top || b.height - a.height);
33932
+ const result = {};
33933
+ let cluster = [];
33934
+ let laneEnds = [];
33935
+ let clusterEnd = -1;
33936
+ const flush = () => {
33937
+ for (const id of cluster) result[id].lanes = laneEnds.length;
33938
+ cluster = [];
33939
+ laneEnds = [];
33940
+ };
33941
+ for (const b of sorted) {
33942
+ if (cluster.length && b.top >= clusterEnd) flush();
33943
+ let lane = laneEnds.findIndex((end) => end <= b.top);
33944
+ if (lane === -1) {
33945
+ lane = laneEnds.length;
33946
+ laneEnds.push(0);
33947
+ }
33948
+ laneEnds[lane] = b.top + b.height;
33949
+ clusterEnd = cluster.length ? Math.max(clusterEnd, b.top + b.height) : b.top + b.height;
33950
+ cluster.push(b.id);
33951
+ result[b.id] = {
33952
+ lane,
33953
+ lanes: 1
33954
+ };
33955
+ }
33956
+ flush();
33957
+ return result;
33958
+ }
33959
+ var CalendarComponent = class CalendarComponent {
33960
+ clickable(dateStr) {
33961
+ return this.canCreate() && !(this.disablePast() && dateStr < this.todayStr());
33962
+ }
33963
+ constructor() {
33964
+ this.items = input([], ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
33965
+ this.loading = input(false, ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
33966
+ this.view = model("month", ...ngDevMode ? [{ debugName: "view" }] : /* istanbul ignore next */ []);
33967
+ this.views = input([
33968
+ "week",
33969
+ "month",
33970
+ "agenda"
33971
+ ], ...ngDevMode ? [{ debugName: "views" }] : /* istanbul ignore next */ []);
33972
+ this.anchorDate = model(/* @__PURE__ */ new Date(), ...ngDevMode ? [{ debugName: "anchorDate" }] : /* istanbul ignore next */ []);
33973
+ this.filters = input([], ...ngDevMode ? [{ debugName: "filters" }] : /* istanbul ignore next */ []);
33974
+ this.filterLabel = input("", ...ngDevMode ? [{ debugName: "filterLabel" }] : /* istanbul ignore next */ []);
33975
+ this.filterMode = input("multi", ...ngDevMode ? [{ debugName: "filterMode" }] : /* istanbul ignore next */ []);
33976
+ this.activeFilters = model([], ...ngDevMode ? [{ debugName: "activeFilters" }] : /* istanbul ignore next */ []);
33977
+ this.showFilterCounts = input(false, ...ngDevMode ? [{ debugName: "showFilterCounts" }] : /* istanbul ignore next */ []);
33978
+ this.canCreate = input(false, ...ngDevMode ? [{ debugName: "canCreate" }] : /* istanbul ignore next */ []);
33979
+ this.disablePast = input(false, ...ngDevMode ? [{ debugName: "disablePast" }] : /* istanbul ignore next */ []);
33980
+ this.maxVisible = input(3, ...ngDevMode ? [{ debugName: "maxVisible" }] : /* istanbul ignore next */ []);
33981
+ this.chipLayout = input("inline", ...ngDevMode ? [{ debugName: "chipLayout" }] : /* istanbul ignore next */ []);
33982
+ this.sortByTime = input(true, ...ngDevMode ? [{ debugName: "sortByTime" }] : /* istanbul ignore next */ []);
33983
+ this.startHour = input(7, ...ngDevMode ? [{ debugName: "startHour" }] : /* istanbul ignore next */ []);
33984
+ this.endHour = input(21, ...ngDevMode ? [{ debugName: "endHour" }] : /* istanbul ignore next */ []);
33985
+ this.emptyMessage = input("No events in this period.", ...ngDevMode ? [{ debugName: "emptyMessage" }] : /* istanbul ignore next */ []);
33986
+ this.dayLabelFn = input(null, ...ngDevMode ? [{ debugName: "dayLabelFn" }] : /* istanbul ignore next */ []);
33987
+ this.rangeChange = output();
33988
+ this.itemClick = output();
33989
+ this.dateClick = output();
33990
+ this.slotClick = output();
33991
+ this.moreClick = output();
33992
+ this.host = inject(ElementRef);
33993
+ this.weekDayLabels = WEEK_DAY_LABELS;
33994
+ this.weekDayNames = [
33995
+ "Sunday",
33996
+ "Monday",
33997
+ "Tuesday",
33998
+ "Wednesday",
33999
+ "Thursday",
34000
+ "Friday",
34001
+ "Saturday"
34002
+ ];
34003
+ this.skeletonCells = Array.from({ length: 42 }, (_, i) => i);
34004
+ this.formatHour = formatHour;
34005
+ this.todayStr = signal(toDateStr(/* @__PURE__ */ new Date()), ...ngDevMode ? [{ debugName: "todayStr" }] : /* istanbul ignore next */ []);
34006
+ this.focusedDate = signal(null, ...ngDevMode ? [{ debugName: "focusedDate" }] : /* istanbul ignore next */ []);
34007
+ this.lastRangeKey = "";
34008
+ this.hours = computed(() => Array.from({ length: Math.max(1, this.endHour() - this.startHour() + 1) }, (_, i) => i + this.startHour()), ...ngDevMode ? [{ debugName: "hours" }] : /* istanbul ignore next */ []);
34009
+ this.monthCells = computed(() => buildMonthCells(this.anchorDate(), this.todayStr()), ...ngDevMode ? [{ debugName: "monthCells" }] : /* istanbul ignore next */ []);
34010
+ this.weekDays = computed(() => buildWeekDays(this.anchorDate(), this.todayStr()), ...ngDevMode ? [{ debugName: "weekDays" }] : /* istanbul ignore next */ []);
34011
+ this.periodLabel = computed(() => periodLabelFor(this.view(), this.anchorDate(), this.todayStr()), ...ngDevMode ? [{ debugName: "periodLabel" }] : /* istanbul ignore next */ []);
34012
+ this.viewTabs = computed(() => this.views().map((v) => ({
34013
+ key: v,
34014
+ label: v === "week" ? "Week" : v === "month" ? "Month" : "Agenda"
34015
+ })), ...ngDevMode ? [{ debugName: "viewTabs" }] : /* istanbul ignore next */ []);
34016
+ this.typeCounts = computed(() => {
34017
+ const counts = {};
34018
+ for (const e of this.items()) if (e.type) counts[e.type] = (counts[e.type] ?? 0) + 1;
34019
+ return counts;
34020
+ }, ...ngDevMode ? [{ debugName: "typeCounts" }] : /* istanbul ignore next */ []);
34021
+ this.byDate = computed(() => {
34022
+ const active = this.activeFilters();
34023
+ const map = {};
34024
+ if (isDevMode()) {
34025
+ const seen = /* @__PURE__ */ new Set();
34026
+ for (const e of this.items()) {
34027
+ if (seen.has(e.id)) {
34028
+ console.warn(`ui-calendar: duplicate item id "${e.id}" — ids must be unique across all items (prefix them by source).`);
34029
+ break;
34030
+ }
34031
+ seen.add(e.id);
34032
+ }
34033
+ }
34034
+ for (const e of this.items()) {
34035
+ if (active.length && !(e.type && active.includes(e.type))) continue;
34036
+ (map[e.date] ??= []).push(e);
34037
+ }
34038
+ if (this.sortByTime()) for (const k of Object.keys(map)) map[k] = map[k].slice().sort((a, b) => (a.startTime ?? "").localeCompare(b.startTime ?? ""));
34039
+ return map;
34040
+ }, ...ngDevMode ? [{ debugName: "byDate" }] : /* istanbul ignore next */ []);
34041
+ this.agendaGroups = computed(() => Object.entries(this.byDate()).sort(([a], [b]) => a.localeCompare(b)).map(([dateStr, items]) => ({
34042
+ dateStr,
34043
+ items
34044
+ })), ...ngDevMode ? [{ debugName: "agendaGroups" }] : /* istanbul ignore next */ []);
34045
+ this.monthRows = computed(() => {
34046
+ const max = this.maxVisible();
34047
+ const cells = this.monthCells().map((day) => {
34048
+ const items = this.byDate()[day.dateStr] ?? [];
34049
+ return {
34050
+ day,
34051
+ items,
34052
+ visible: items.slice(0, max),
34053
+ overflow: Math.max(0, items.length - max),
34054
+ clickable: this.clickable(day.dateStr),
34055
+ label: this.dayAriaLabel(day.dateStr, items)
34056
+ };
34057
+ });
34058
+ return Array.from({ length: 6 }, (_, r) => ({
34059
+ key: cells[r * 7].day.dateStr,
34060
+ cells: cells.slice(r * 7, r * 7 + 7)
34061
+ }));
34062
+ }, ...ngDevMode ? [{ debugName: "monthRows" }] : /* istanbul ignore next */ []);
34063
+ this.weekColumns = computed(() => {
34064
+ const startHour = this.startHour(), endHour = this.endHour();
34065
+ return this.weekDays().map((day) => {
34066
+ const items = this.byDate()[day.dateStr] ?? [];
34067
+ const boxes = items.filter((e) => !e.allDay && !!e.startTime).map((item) => ({
34068
+ item,
34069
+ ...timedBox(item.startTime, item.endTime, startHour, endHour)
34070
+ }));
34071
+ const lanes = layoutLanes(boxes.map((b) => ({
34072
+ id: b.item.id,
34073
+ top: b.top,
34074
+ height: b.height
34075
+ })));
34076
+ return {
34077
+ day,
34078
+ label: formatDayLabel(day.dateStr),
34079
+ clickable: this.clickable(day.dateStr),
34080
+ allDay: items.filter((e) => e.allDay || !e.startTime),
34081
+ timed: boxes.map((b) => ({
34082
+ ...b,
34083
+ lane: lanes[b.item.id]
34084
+ }))
34085
+ };
34086
+ });
34087
+ }, ...ngDevMode ? [{ debugName: "weekColumns" }] : /* istanbul ignore next */ []);
34088
+ this.focusDate = computed(() => {
34089
+ const cells = this.monthCells();
34090
+ const f = this.focusedDate();
34091
+ if (f && cells.some((c) => c.dateStr === f)) return f;
34092
+ return (cells.find((c) => c.isToday) ?? cells.find((c) => c.isCurrentMonth) ?? cells[0]).dateStr;
34093
+ }, ...ngDevMode ? [{ debugName: "focusDate" }] : /* istanbul ignore next */ []);
34094
+ effect(() => {
34095
+ const view = this.view();
34096
+ const views = this.views();
34097
+ if (views.length && !views.includes(view)) {
34098
+ untracked(() => this.view.set(views[0]));
34099
+ return;
34100
+ }
34101
+ const range = rangeFor(view, this.anchorDate(), this.todayStr());
34102
+ const key = `${range.view}|${range.start}|${range.end}`;
34103
+ if (key === this.lastRangeKey) return;
34104
+ this.lastRangeKey = key;
34105
+ untracked(() => this.rangeChange.emit(range));
34106
+ });
34107
+ const destroyRef = inject(DestroyRef);
34108
+ const zone = inject(NgZone);
34109
+ const doc = inject(DOCUMENT);
34110
+ let timer;
34111
+ const refreshToday = () => zone.run(() => this.todayStr.set(toDateStr(/* @__PURE__ */ new Date())));
34112
+ const schedule = () => {
34113
+ const now = /* @__PURE__ */ new Date();
34114
+ const next = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 0, 1);
34115
+ timer = setTimeout(() => {
34116
+ refreshToday();
34117
+ schedule();
34118
+ }, next.getTime() - now.getTime());
34119
+ };
34120
+ const onVisible = () => {
34121
+ if (doc.visibilityState === "visible") refreshToday();
34122
+ };
34123
+ if (!isPlatformBrowser(inject(PLATFORM_ID))) return;
34124
+ zone.runOutsideAngular(() => {
34125
+ schedule();
34126
+ doc.addEventListener("visibilitychange", onVisible);
34127
+ });
34128
+ destroyRef.onDestroy(() => {
34129
+ clearTimeout(timer);
34130
+ doc.removeEventListener("visibilitychange", onVisible);
34131
+ });
34132
+ }
34133
+ isFilterActive(value) {
34134
+ return this.activeFilters().includes(value);
34135
+ }
34136
+ toggleFilter(value) {
34137
+ const active = this.activeFilters();
34138
+ if (this.filterMode() === "single") {
34139
+ this.activeFilters.set(active.includes(value) ? [] : [value]);
34140
+ return;
34141
+ }
34142
+ this.activeFilters.set(active.includes(value) ? active.filter((v) => v !== value) : [...active, value]);
34143
+ }
34144
+ clearFilters() {
34145
+ this.activeFilters.set([]);
34146
+ }
34147
+ setView(v) {
34148
+ this.view.set(v);
34149
+ }
34150
+ navigate(direction) {
34151
+ this.focusedDate.set(null);
34152
+ this.anchorDate.set(shiftAnchor(this.view(), this.anchorDate(), direction));
34153
+ }
34154
+ goToday() {
34155
+ this.focusedDate.set(null);
34156
+ this.todayStr.set(toDateStr(/* @__PURE__ */ new Date()));
34157
+ this.anchorDate.set(/* @__PURE__ */ new Date());
34158
+ }
34159
+ dowLabel(dateStr) {
34160
+ return WEEK_DAY_LABELS[fromDateStr(dateStr).getDay()];
34161
+ }
34162
+ agendaDow(dateStr) {
34163
+ return fromDateStr(dateStr).toLocaleDateString("en-US", { weekday: "short" }).toUpperCase();
34164
+ }
34165
+ agendaDate(dateStr) {
34166
+ return fromDateStr(dateStr).toLocaleDateString("en-US", {
34167
+ month: "short",
34168
+ day: "numeric"
34169
+ });
34170
+ }
34171
+ chipTime(e) {
34172
+ if (e.timeLabel) return e.timeLabel;
34173
+ return e.startTime && !e.allDay ? formatTime$1(e.startTime) : "";
34174
+ }
34175
+ timeRange(e) {
34176
+ return e.startTime ? formatTime$1(e.startTime) + (e.endTime ? ` – ${formatTime$1(e.endTime)}` : "") : "";
34177
+ }
34178
+ itemLabel(e) {
34179
+ return e.ariaLabel || [this.chipTime(e), e.title].filter(Boolean).join(" ");
34180
+ }
34181
+ agendaMeta(e) {
34182
+ return [e.timeLabel ?? (!e.allDay && e.startTime ? this.timeRange(e) : ""), ...e.meta ?? []].filter(Boolean);
34183
+ }
34184
+ dayAriaLabel(dateStr, items) {
34185
+ const fn = this.dayLabelFn();
34186
+ if (fn) return fn(dateStr, items);
34187
+ const label = formatDayLabel(dateStr);
34188
+ return items.length ? `${label}, ${items.length} ${items.length === 1 ? "event" : "events"}` : label;
34189
+ }
34190
+ onDateClick(dateStr) {
34191
+ if (this.clickable(dateStr)) this.dateClick.emit(dateStr);
34192
+ }
34193
+ onCellKey(event, dateStr) {
34194
+ if (event.target !== event.currentTarget || event.altKey || event.ctrlKey || event.metaKey) return;
34195
+ if (event.key === "Enter" || event.key === " ") {
34196
+ event.preventDefault();
34197
+ this.onDateClick(dateStr);
34198
+ return;
34199
+ }
34200
+ const d = fromDateStr(dateStr);
34201
+ const step = {
34202
+ ArrowLeft: -1,
34203
+ ArrowRight: 1,
34204
+ ArrowUp: -7,
34205
+ ArrowDown: 7,
34206
+ Home: -d.getDay(),
34207
+ End: 6 - d.getDay()
34208
+ };
34209
+ if (!(event.key in step)) return;
34210
+ event.preventDefault();
34211
+ const target = toDateStr(new Date(d.getFullYear(), d.getMonth(), d.getDate() + step[event.key]));
34212
+ if (!this.monthCells().some((c) => c.dateStr === target)) return;
34213
+ this.focusedDate.set(target);
34214
+ this.host.nativeElement.querySelector(`.month-cell[data-date="${target}"]`)?.focus();
34215
+ }
34216
+ onAddAllDay(dateStr, event) {
34217
+ event.stopPropagation();
34218
+ this.onDateClick(dateStr);
34219
+ }
34220
+ onAddTimed(dateStr, event) {
34221
+ event.stopPropagation();
34222
+ if (this.clickable(dateStr)) this.slotClick.emit({
34223
+ date: dateStr,
34224
+ time: `${String(this.startHour()).padStart(2, "0")}:00`
34225
+ });
34226
+ }
34227
+ onSlotClick(dateStr, event) {
34228
+ if (!this.clickable(dateStr)) return;
34229
+ const rect = event.currentTarget.getBoundingClientRect();
34230
+ const hour = Math.min(this.endHour(), Math.max(this.startHour(), this.startHour() + Math.floor((event.clientY - rect.top) / 60)));
34231
+ this.slotClick.emit({
34232
+ date: dateStr,
34233
+ time: `${String(hour).padStart(2, "0")}:00`
34234
+ });
34235
+ }
34236
+ onItemClick(item, event) {
34237
+ event.stopPropagation();
34238
+ this.itemClick.emit(item);
34239
+ }
34240
+ onMoreClick(dateStr, items, event) {
34241
+ event.stopPropagation();
34242
+ this.moreClick.emit({
34243
+ date: dateStr,
34244
+ items
34245
+ });
34246
+ }
34247
+ static {
34248
+ this.ɵfac = i0.ɵɵngDeclareFactory({
34249
+ minVersion: "12.0.0",
34250
+ version: "22.2.2",
34251
+ ngImport: i0,
34252
+ type: CalendarComponent,
34253
+ deps: [],
34254
+ target: i0.ɵɵFactoryTarget.Component
34255
+ });
34256
+ }
34257
+ static {
34258
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
34259
+ minVersion: "17.0.0",
34260
+ version: "22.2.2",
34261
+ type: CalendarComponent,
34262
+ isStandalone: true,
34263
+ selector: "ui-calendar",
34264
+ inputs: {
34265
+ items: {
34266
+ classPropertyName: "items",
34267
+ publicName: "items",
34268
+ isSignal: true,
34269
+ isRequired: false,
34270
+ transformFunction: null
34271
+ },
34272
+ loading: {
34273
+ classPropertyName: "loading",
34274
+ publicName: "loading",
34275
+ isSignal: true,
34276
+ isRequired: false,
34277
+ transformFunction: null
34278
+ },
34279
+ view: {
34280
+ classPropertyName: "view",
34281
+ publicName: "view",
34282
+ isSignal: true,
34283
+ isRequired: false,
34284
+ transformFunction: null
34285
+ },
34286
+ views: {
34287
+ classPropertyName: "views",
34288
+ publicName: "views",
34289
+ isSignal: true,
34290
+ isRequired: false,
34291
+ transformFunction: null
34292
+ },
34293
+ anchorDate: {
34294
+ classPropertyName: "anchorDate",
34295
+ publicName: "anchorDate",
34296
+ isSignal: true,
34297
+ isRequired: false,
34298
+ transformFunction: null
34299
+ },
34300
+ filters: {
34301
+ classPropertyName: "filters",
34302
+ publicName: "filters",
34303
+ isSignal: true,
34304
+ isRequired: false,
34305
+ transformFunction: null
34306
+ },
34307
+ filterLabel: {
34308
+ classPropertyName: "filterLabel",
34309
+ publicName: "filterLabel",
34310
+ isSignal: true,
34311
+ isRequired: false,
34312
+ transformFunction: null
34313
+ },
34314
+ filterMode: {
34315
+ classPropertyName: "filterMode",
34316
+ publicName: "filterMode",
34317
+ isSignal: true,
34318
+ isRequired: false,
34319
+ transformFunction: null
34320
+ },
34321
+ activeFilters: {
34322
+ classPropertyName: "activeFilters",
34323
+ publicName: "activeFilters",
34324
+ isSignal: true,
34325
+ isRequired: false,
34326
+ transformFunction: null
34327
+ },
34328
+ showFilterCounts: {
34329
+ classPropertyName: "showFilterCounts",
34330
+ publicName: "showFilterCounts",
34331
+ isSignal: true,
34332
+ isRequired: false,
34333
+ transformFunction: null
34334
+ },
34335
+ canCreate: {
34336
+ classPropertyName: "canCreate",
34337
+ publicName: "canCreate",
34338
+ isSignal: true,
34339
+ isRequired: false,
34340
+ transformFunction: null
34341
+ },
34342
+ disablePast: {
34343
+ classPropertyName: "disablePast",
34344
+ publicName: "disablePast",
34345
+ isSignal: true,
34346
+ isRequired: false,
34347
+ transformFunction: null
34348
+ },
34349
+ maxVisible: {
34350
+ classPropertyName: "maxVisible",
34351
+ publicName: "maxVisible",
34352
+ isSignal: true,
34353
+ isRequired: false,
34354
+ transformFunction: null
34355
+ },
34356
+ chipLayout: {
34357
+ classPropertyName: "chipLayout",
34358
+ publicName: "chipLayout",
34359
+ isSignal: true,
34360
+ isRequired: false,
34361
+ transformFunction: null
34362
+ },
34363
+ sortByTime: {
34364
+ classPropertyName: "sortByTime",
34365
+ publicName: "sortByTime",
34366
+ isSignal: true,
34367
+ isRequired: false,
34368
+ transformFunction: null
34369
+ },
34370
+ startHour: {
34371
+ classPropertyName: "startHour",
34372
+ publicName: "startHour",
34373
+ isSignal: true,
34374
+ isRequired: false,
34375
+ transformFunction: null
34376
+ },
34377
+ endHour: {
34378
+ classPropertyName: "endHour",
34379
+ publicName: "endHour",
34380
+ isSignal: true,
34381
+ isRequired: false,
34382
+ transformFunction: null
34383
+ },
34384
+ emptyMessage: {
34385
+ classPropertyName: "emptyMessage",
34386
+ publicName: "emptyMessage",
34387
+ isSignal: true,
34388
+ isRequired: false,
34389
+ transformFunction: null
34390
+ },
34391
+ dayLabelFn: {
34392
+ classPropertyName: "dayLabelFn",
34393
+ publicName: "dayLabelFn",
34394
+ isSignal: true,
34395
+ isRequired: false,
34396
+ transformFunction: null
34397
+ }
34398
+ },
34399
+ outputs: {
34400
+ view: "viewChange",
34401
+ anchorDate: "anchorDateChange",
34402
+ activeFilters: "activeFiltersChange",
34403
+ rangeChange: "rangeChange",
34404
+ itemClick: "itemClick",
34405
+ dateClick: "dateClick",
34406
+ slotClick: "slotClick",
34407
+ moreClick: "moreClick"
34408
+ },
34409
+ ngImport: i0,
34410
+ template: `
34411
+ <div class="cal-toolbar">
34412
+ <div class="toolbar-left">
34413
+ <h2 class="period-label" aria-live="polite" aria-atomic="true">{{ periodLabel() }}</h2>
34414
+ <div class="nav-controls">
34415
+ <button type="button" class="btn-nav" (click)="navigate(-1)" aria-label="Previous">
34416
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><polyline points="15 18 9 12 15 6"/></svg>
34417
+ </button>
34418
+ <button type="button" class="btn-today" (click)="goToday()">Today</button>
34419
+ <button type="button" class="btn-nav" (click)="navigate(1)" aria-label="Next">
34420
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><polyline points="9 18 15 12 9 6"/></svg>
34421
+ </button>
34422
+ </div>
34423
+ </div>
34424
+ <div class="toolbar-center"><ng-content select="[calendar-summary]" /></div>
34425
+ <div class="toolbar-right">
34426
+ @if (viewTabs().length > 1) {
34427
+ <ui-pill-tabs ariaLabel="Calendar view" name="ui-calendar-view" [tabs]="viewTabs()" [activeKey]="view()" (tabChange)="setView($any($event))" />
34428
+ }
34429
+ <ng-content select="[calendar-actions]" />
34430
+ </div>
34431
+ </div>
34432
+
34433
+ @if (!loading()) {
34434
+ <div class="mobile-summary"><ng-content select="[calendar-summary-mobile]" /></div>
34435
+ }
34436
+
34437
+ @if (filters().length && !loading()) {
34438
+ <div class="filter-bar">
34439
+ @if (filterLabel()) { <div class="filter-bar-label">{{ filterLabel() }}</div> }
34440
+ <div class="filter-chips" role="group" [attr.aria-label]="filterLabel() || 'Filter'">
34441
+ <button type="button" class="filter-chip" [class.active-all]="!activeFilters().length" [attr.aria-pressed]="!activeFilters().length" (click)="clearFilters()">
34442
+ All
34443
+ @if (showFilterCounts()) { <span class="chip-count">{{ items().length }}</span> }
34444
+ </button>
34445
+ @for (f of filters(); track f.value) {
34446
+ <button type="button" class="filter-chip"
34447
+ [class.active-type]="isFilterActive(f.value)"
34448
+ [attr.aria-pressed]="isFilterActive(f.value)"
34449
+ [style.--chip-color]="f.color"
34450
+ [style.--chip-bg]="f.bgColor ?? null"
34451
+ (click)="toggleFilter(f.value)">
34452
+ <span class="chip-dot" [style.background]="f.color" aria-hidden="true"></span>
34453
+ {{ f.label }}
34454
+ @if (showFilterCounts()) { <span class="chip-count">{{ typeCounts()[f.value] ?? 0 }}</span> }
34455
+ </button>
34456
+ }
34457
+ </div>
34458
+ </div>
34459
+ }
34460
+
34461
+ @if (loading()) {
34462
+ <div class="cal-skeleton" aria-busy="true" aria-label="Loading calendar" role="status">
34463
+ <div class="skel-dow-row">
34464
+ @for (d of weekDayLabels; track d) { <div class="skel-dow"><ui-skeleton [height]="16" width="36px" [radius]="4" /></div> }
34465
+ </div>
34466
+ <div class="skel-month-grid">
34467
+ @for (i of skeletonCells; track i) {
34468
+ <div class="skel-cell">
34469
+ <ui-skeleton [height]="22" width="22px" [radius]="11" />
34470
+ @if (i % 3 === 0) { <ui-skeleton [height]="14" [radius]="3" /> }
34471
+ @if (i % 5 === 0) { <ui-skeleton [height]="14" width="72%" [radius]="3" /> }
34472
+ </div>
34473
+ }
34474
+ </div>
34475
+ </div>
34476
+ } @else {
34477
+ @switch (view()) {
34478
+ @case ('month') {
34479
+ <div class="month-view">
34480
+ <div class="month-grid" role="grid" [attr.aria-label]="periodLabel()">
34481
+ <div class="month-header" role="row">
34482
+ @for (d of weekDayLabels; track d; let i = $index) {
34483
+ <div class="month-dow" role="columnheader" [attr.aria-label]="weekDayNames[i]">
34484
+ <span class="dow-full" aria-hidden="true">{{ d }}</span><span class="dow-short" aria-hidden="true">{{ d.slice(0, 2) }}</span>
34485
+ </div>
34486
+ }
34487
+ </div>
34488
+ @for (row of monthRows(); track row.key) {
34489
+ <div class="month-row" role="row">
34490
+ @for (c of row.cells; track c.day.dateStr) {
34491
+ <div class="month-cell" role="gridcell"
34492
+ [attr.data-date]="c.day.dateStr"
34493
+ [class.other-month]="!c.day.isCurrentMonth" [class.today]="c.day.isToday" [class.weekend]="c.day.isWeekend"
34494
+ [class.clickable]="c.clickable"
34495
+ [attr.tabindex]="c.day.dateStr === focusDate() ? 0 : -1"
34496
+ [attr.aria-label]="c.label"
34497
+ [attr.aria-current]="c.day.isToday ? 'date' : null"
34498
+ (click)="onDateClick(c.day.dateStr)"
34499
+ (focus)="focusedDate.set(c.day.dateStr)"
34500
+ (keydown)="onCellKey($event, c.day.dateStr)">
34501
+ <span class="day-num" [class.today-badge]="c.day.isToday">{{ c.day.dayNum }}</span>
34502
+ <div class="cell-events">
34503
+ @for (e of c.visible; track e.id) {
34504
+ <button type="button" class="event-chip" [class.stacked]="chipLayout() === 'stacked'" [class.has-head]="!!(e.iconPath || chipTime(e))" [style.background]="e.bgColor" [style.borderLeftColor]="e.color"
34505
+ [attr.aria-label]="itemLabel(e)" [title]="e.title"
34506
+ (click)="onItemClick(e, $event)">
34507
+ <span class="chip-head">
34508
+ @if (e.iconPath) {
34509
+ <svg class="chip-icon" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path [attr.d]="e.iconPath"/></svg>
34510
+ }
34511
+ @if (chipTime(e); as t) { <span class="chip-time">{{ t }}</span> }
34512
+ </span>
34513
+ <span class="chip-title" [class.strike]="e.strike">{{ e.title }}</span>
34514
+ @if (e.tag) { <span class="chip-src">{{ e.tag }}</span> }
34515
+ </button>
34516
+ }
34517
+ @if (c.overflow > 0) {
34518
+ <button type="button" class="more-events" (click)="onMoreClick(c.day.dateStr, c.items, $event)">+{{ c.overflow }} more</button>
34519
+ }
34520
+ </div>
34521
+ </div>
34522
+ }
34523
+ </div>
34524
+ }
34525
+ </div>
34526
+ </div>
34527
+ }
34528
+ @case ('week') {
34529
+ <div class="week-view">
34530
+ <div class="week-header">
34531
+ <div class="time-gutter"></div>
34532
+ @for (col of weekColumns(); track col.day.dateStr) {
34533
+ <div class="week-day-hdr" [class.today]="col.day.isToday">
34534
+ <span class="wdh-dow">{{ dowLabel(col.day.dateStr) }}</span>
34535
+ <span class="wdh-num" [class.today-badge]="col.day.isToday">{{ col.day.dayNum }}</span>
34536
+ </div>
34537
+ }
34538
+ </div>
34539
+ <div class="allday-row">
34540
+ <div class="time-gutter allday-label">All day</div>
34541
+ @for (col of weekColumns(); track col.day.dateStr) {
34542
+ <div class="allday-cell" [class.clickable]="col.clickable" (click)="onDateClick(col.day.dateStr)">
34543
+ @if (col.clickable) {
34544
+ <button type="button" class="slot-add" [attr.aria-label]="'Add all-day event on ' + col.label" (click)="onAddAllDay(col.day.dateStr, $event)">+ Add</button>
34545
+ }
34546
+ @for (e of col.allDay; track e.id) {
34547
+ <button type="button" class="allday-chip" [style.background]="e.bgColor" [style.borderLeftColor]="e.color"
34548
+ [attr.aria-label]="itemLabel(e)" (click)="onItemClick(e, $event)">{{ e.title }}</button>
34549
+ }
34550
+ </div>
34551
+ }
34552
+ </div>
34553
+ <div class="week-body">
34554
+ <div class="time-col">
34555
+ @for (h of hours(); track h) { <div class="time-slot-label">{{ formatHour(h) }}</div> }
34556
+ </div>
34557
+ @for (col of weekColumns(); track col.day.dateStr) {
34558
+ <div class="day-col" [class.today]="col.day.isToday" [class.clickable]="col.clickable" (click)="onSlotClick(col.day.dateStr, $event)">
34559
+ @if (col.clickable) {
34560
+ <button type="button" class="slot-add" [attr.aria-label]="'Add event on ' + col.label" (click)="onAddTimed(col.day.dateStr, $event)">+ Add</button>
34561
+ }
34562
+ @for (h of hours(); track h) { <div class="time-slot"></div> }
34563
+ @for (t of col.timed; track t.item.id) {
34564
+ <button type="button" class="timed-event"
34565
+ [style.top.px]="t.top" [style.height.px]="t.height"
34566
+ [style.left]="'calc(' + (t.lane.lane / t.lane.lanes * 100) + '% + 2px)'"
34567
+ [style.width]="'calc(' + (100 / t.lane.lanes) + '% - 4px)'"
34568
+ [style.background]="t.item.bgColor" [style.borderLeftColor]="t.item.color"
34569
+ [attr.aria-label]="itemLabel(t.item)" (click)="onItemClick(t.item, $event)">
34570
+ <span class="te-title" [class.strike]="t.item.strike">{{ t.item.title }}</span>
34571
+ @if (t.item.startTime) { <span class="te-time">{{ t.item.timeLabel || timeRange(t.item) }}</span> }
34572
+ </button>
34573
+ }
34574
+ </div>
34575
+ }
34576
+ </div>
34577
+ </div>
34578
+ }
34579
+ @case ('agenda') {
34580
+ <div class="agenda-view">
34581
+ @if (agendaGroups().length === 0) {
34582
+ <ui-empty-state iconType="task" [message]="emptyMessage()" />
34583
+ }
34584
+ @for (group of agendaGroups(); track group.dateStr) {
34585
+ <div class="agenda-group">
34586
+ <div class="agenda-date-hdr">
34587
+ <span class="ag-dow">{{ agendaDow(group.dateStr) }}</span>
34588
+ <span class="ag-date">{{ agendaDate(group.dateStr) }}</span>
34589
+ @if (group.dateStr === todayStr()) { <ui-badge label="Today" variant="blue" /> }
34590
+ </div>
34591
+ <div class="agenda-events">
34592
+ @for (e of group.items; track e.id) {
34593
+ <button type="button" class="agenda-event" [attr.aria-label]="e.ariaLabel || null" (click)="onItemClick(e, $event)">
34594
+ <span class="ae-color-bar" [style.background]="e.color"></span>
34595
+ <span class="ae-body">
34596
+ <span class="ae-top">
34597
+ <span class="ae-title" [class.strike]="e.strike">{{ e.title }}</span>
34598
+ @for (b of e.badges ?? []; track b.label) { <ui-badge [label]="b.label" [variant]="b.variant" /> }
34599
+ </span>
34600
+ @if (agendaMeta(e).length) {
34601
+ <span class="ae-meta">
34602
+ @for (m of agendaMeta(e); track $index) { <span class="ae-meta-item">{{ m }}</span> }
34603
+ </span>
34604
+ }
34605
+ </span>
34606
+ </button>
34607
+ }
34608
+ </div>
34609
+ </div>
34610
+ }
34611
+ </div>
34612
+ }
34613
+ }
34614
+ }
34615
+ <ui-toast />
34616
+ `,
34617
+ isInline: true,
34618
+ styles: [":host{display:flex;flex-direction:column;gap:0;height:100%;min-height:0}.cal-toolbar{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;padding-bottom:16px;gap:16px;flex-shrink:0}.toolbar-left{display:flex;flex-direction:column;align-items:flex-start;gap:6px}.toolbar-center{display:flex;align-items:center;justify-content:center;gap:10px}.toolbar-right{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}.period-label{font-size:1.125rem;font-weight:700;color:#111827;margin:0}.nav-controls{display:flex;align-items:center;gap:8px}.btn-nav{width:32px;height:32px;border:1px solid #e2e8f0;background:#fff;border-radius:6px;font-family:inherit;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#475569}.btn-nav:hover{background:#f8fafc}.btn-today{padding:6px 14px;border:1px solid #e2e8f0;background:#fff;border-radius:6px;font-family:inherit;font-size:.875rem;font-weight:500;color:#374151;cursor:pointer}.btn-today:hover{background:#f8fafc}.btn-nav:focus-visible,.btn-today:focus-visible,.filter-chip:focus-visible,.event-chip:focus-visible,.more-events:focus-visible,.allday-chip:focus-visible,.timed-event:focus-visible,.agenda-event:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.month-cell:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.slot-add:focus,.slot-add:focus-visible{outline:2px solid #3b82f6;outline-offset:1px}.mobile-summary{display:none}.filter-bar{display:flex;flex-direction:column;gap:8px;padding:12px 0;border-top:1px solid #e2e8f0;flex-shrink:0}.filter-bar-label{font-size:.6875rem;font-weight:700;color:#94a3b8;text-transform:uppercase;letter-spacing:.06em}.filter-chips{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.filter-chip{display:inline-flex;align-items:center;gap:5px;padding:4px 12px;border-radius:20px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s;white-space:nowrap;font-family:inherit}.filter-chip:hover{border-color:#cbd5e1;background:#f8fafc}.filter-chip.active-all{background:#1e293b;color:#fff;border-color:#1e293b}.filter-chip.active-all .chip-count{background:#fff3;color:#fff}.filter-chip.active-type{background:var(--chip-bg, #f1f5f9);color:#1e293b;border-color:var(--chip-color);font-weight:600}.filter-chip.active-type .chip-count{background:var(--chip-color);color:#fff}.chip-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.chip-count{font-size:.6875rem;font-weight:700;background:#f1f5f9;color:#64748b;padding:1px 7px;border-radius:999px}.cal-skeleton,.month-view,.week-view,.agenda-view{flex:1;display:flex;flex-direction:column;min-height:0;background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.skel-dow-row{display:grid;grid-template-columns:repeat(7,1fr);gap:8px;padding:12px 10px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.skel-dow{display:flex;justify-content:center}.skel-month-grid{display:grid;grid-template-columns:repeat(7,1fr);grid-template-rows:repeat(6,minmax(80px,1fr));flex:1}.skel-cell{border-right:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;padding:8px 6px;display:flex;flex-direction:column;gap:6px}.skel-cell:nth-child(7n){border-right:none}.month-grid{display:flex;flex-direction:column;flex:1;min-height:0;overflow:auto}.month-header{display:grid;grid-template-columns:repeat(7,1fr);border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;position:sticky;top:0;z-index:1}.month-dow{padding:10px 8px;font-size:.75rem;font-weight:600;color:#6b7280;text-align:center;text-transform:uppercase;letter-spacing:.04em}.dow-short{display:none}.month-row{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));flex:1 0 120px}.month-cell{border-right:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;padding:6px 6px 4px;min-height:120px;transition:background .1s;min-width:0;box-sizing:border-box}.month-cell.clickable{cursor:pointer}.month-cell.clickable:hover{background:#f8fafc}.month-cell:nth-child(7n){border-right:none}.month-cell.other-month{background:#fafafa}.month-cell.other-month .day-num{color:#64748b}.month-cell.today{background:#eff6ff}.day-num{display:inline-block;width:26px;height:26px;line-height:26px;text-align:center;border-radius:50%;font-size:.8125rem;font-weight:500;color:#374151;margin-bottom:4px}.today-badge{background:#2563eb;color:#fff;font-weight:700}.cell-events{display:flex;flex-direction:column;gap:2px}.event-chip{display:flex;align-items:center;gap:3px;padding:2px 6px;width:100%;box-sizing:border-box;text-align:left;font-family:inherit;border:0;border-radius:4px;border-left:3px solid transparent;font-size:.6875rem;font-weight:500;cursor:pointer;overflow:hidden}.event-chip:hover{opacity:.85}.event-chip.stacked{flex-direction:column;align-items:flex-start;gap:0}.chip-head{display:inline-flex;align-items:center;gap:3px;flex-shrink:0}.chip-icon{flex-shrink:0}.chip-time{font-weight:700;flex-shrink:0;color:#1e293b}.chip-title{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#1e293b;min-width:0;max-width:100%}.strike{text-decoration:line-through}.chip-src{font-size:.625rem;font-weight:700;margin-left:auto;flex-shrink:0;color:#1e293b}.more-events{font-size:.6875rem;color:#2563eb;font-weight:600;cursor:pointer;padding:1px 6px;border:0;background:none;text-align:left;font-family:inherit}.more-events:hover{text-decoration:underline}.week-view{overflow:auto}.week-header{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;overflow-y:scroll}.time-gutter{border-right:1px solid #e2e8f0}.week-day-hdr{display:flex;flex-direction:column;align-items:center;padding:10px 4px;border-right:1px solid #f1f5f9}.week-day-hdr.today{background:#eff6ff}.week-day-hdr:last-child{border-right:none}.wdh-dow{font-size:.6875rem;font-weight:600;color:#6b7280;text-transform:uppercase}.wdh-num{width:28px;height:28px;line-height:28px;text-align:center;border-radius:50%;font-size:.9375rem;font-weight:600;color:#374151;margin-top:2px}.wdh-num.today-badge{background:#2563eb;color:#fff;font-weight:700}.allday-row{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:1px solid #e2e8f0;min-height:32px;flex-shrink:0;overflow-y:scroll}.allday-label{font-size:.625rem;color:#64748b;font-weight:600;text-transform:uppercase;display:flex;align-items:center;justify-content:center}.slot-add{position:absolute;top:2px;left:2px;z-index:3;width:1px;height:1px;padding:0;margin:0;overflow:hidden;clip-path:inset(50%);border:0;white-space:nowrap;font-family:inherit}.slot-add:focus,.slot-add:focus-visible{width:auto;height:auto;padding:2px 8px;clip-path:none;background:#1e293b;color:#fff;border-radius:4px;font-size:.75rem;font-weight:600}.allday-cell{position:relative;border-right:1px solid #f1f5f9;padding:3px 4px;display:flex;flex-direction:column;gap:2px;min-width:0}.allday-cell.clickable{cursor:pointer}.allday-cell:last-child{border-right:none}.allday-chip{padding:2px 6px;border:0;border-radius:4px;border-left:3px solid transparent;font-size:.6875rem;font-weight:500;color:#1e293b;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left;font-family:inherit}.allday-chip:hover{opacity:.85}.week-body{display:grid;grid-template-columns:60px repeat(7,1fr);flex:1;overflow-y:scroll}.time-col{display:flex;flex-direction:column;border-right:1px solid #e2e8f0;flex-shrink:0}.time-slot-label{height:60px;display:flex;align-items:flex-start;justify-content:flex-end;padding:4px 8px 0 0;font-size:.6875rem;color:#64748b;font-weight:500;border-bottom:1px solid #f1f5f9;flex-shrink:0;box-sizing:border-box}.day-col{position:relative;border-right:1px solid #f1f5f9;min-width:0}.day-col.clickable{cursor:pointer}.day-col:last-child{border-right:none}.day-col.today{background:#fafbff}.time-slot{height:60px;border-bottom:1px solid #f1f5f9;box-sizing:border-box}.day-col.clickable .time-slot:hover{background:#f8fafc}.timed-event{position:absolute;min-height:20px;border:0;border-radius:6px;padding:3px 6px;overflow:hidden;cursor:pointer;box-sizing:border-box;border-left:3px solid transparent;display:flex;flex-direction:column;align-items:flex-start;gap:1px;box-shadow:0 1px 3px #00000014;text-align:left;font-family:inherit}.timed-event:hover{opacity:.85}.te-title{font-size:.6875rem;font-weight:600;color:#1e293b;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.te-time{font-size:.625rem;color:#475569}.agenda-view{overflow-y:auto}.agenda-group{display:flex;border-bottom:1px solid #f1f5f9}.agenda-date-hdr{width:100px;flex-shrink:0;padding:16px 12px;display:flex;flex-direction:column;gap:4px;background:#f8fafc;border-right:2px solid #e2e8f0}.ag-dow{font-size:.6875rem;font-weight:700;color:#6b7280;text-transform:uppercase;letter-spacing:.04em}.ag-date{font-size:.8125rem;font-weight:600;color:#374151}.agenda-events{flex:1;display:flex;flex-direction:column;min-width:0}.agenda-event{display:flex;align-items:stretch;padding:10px 12px;cursor:pointer;border:0;border-bottom:1px solid #f8fafc;background:none;text-align:left;width:100%;font-family:inherit;transition:background .1s}.agenda-event:hover{background:#f8fafc}.agenda-event:last-child{border-bottom:none}.ae-color-bar{display:block;width:4px;border-radius:4px;flex-shrink:0;margin-right:12px}.ae-body{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.ae-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.ae-title{font-size:.9375rem;font-weight:600;color:#111827}.ae-meta{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.ae-meta-item{font-size:.8125rem;color:#6b7280}@media(pointer:coarse),(max-width:480px){.btn-nav,.btn-today,.filter-chip,.event-chip,.more-events,.allday-chip,.agenda-event{min-height:44px}.btn-nav{min-width:44px}}@media(max-width:768px){.cal-toolbar{grid-template-columns:1fr}.toolbar-center{display:none}.toolbar-left{flex-wrap:wrap}.toolbar-right{justify-content:flex-start}.mobile-summary{display:block;margin-bottom:4px;flex-shrink:0}.mobile-summary:empty{display:none}.filter-chips{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px;-webkit-overflow-scrolling:touch}.month-view,.cal-skeleton,.week-view{overflow-x:auto;-webkit-overflow-scrolling:touch}.month-grid,.skel-month-grid,.skel-dow-row{min-width:560px}.month-row{flex-basis:80px}.month-cell{min-height:80px}.week-header,.allday-row,.week-body{min-width:640px}.agenda-date-hdr{width:76px;padding:12px 8px}.ae-title{font-size:.875rem}}@media(max-width:640px){.event-chip.stacked.has-head .chip-title{display:none}}@media(max-width:480px){.dow-full{display:none}.dow-short{display:inline}}\n"],
34619
+ dependencies: [
34620
+ {
34621
+ kind: "component",
34622
+ type: BadgeComponent,
34623
+ selector: "ui-badge",
34624
+ inputs: ["label", "variant"]
34625
+ },
34626
+ {
34627
+ kind: "component",
34628
+ type: EmptyStateComponent,
34629
+ selector: "ui-empty-state",
34630
+ inputs: [
34631
+ "message",
34632
+ "title",
34633
+ "iconType"
34634
+ ]
34635
+ },
34636
+ {
34637
+ kind: "component",
34638
+ type: PillTabsComponent,
34639
+ selector: "ui-pill-tabs",
34640
+ inputs: [
34641
+ "tabs",
34642
+ "activeKey",
34643
+ "ariaLabel",
34644
+ "name"
34645
+ ],
34646
+ outputs: ["tabChange"]
34647
+ },
34648
+ {
34649
+ kind: "component",
34650
+ type: SkeletonComponent,
34651
+ selector: "ui-skeleton",
34652
+ inputs: [
34653
+ "height",
34654
+ "width",
34655
+ "radius",
34656
+ "mb",
34657
+ "ariaLabel"
34658
+ ]
34659
+ },
34660
+ {
34661
+ kind: "component",
34662
+ type: ToastComponent,
34663
+ selector: "ui-toast",
34664
+ inputs: ["dismissible", "persistentLiveRegion"]
34665
+ }
34666
+ ],
34667
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
34668
+ });
34669
+ }
34670
+ };
34671
+ i0.ɵɵngDeclareClassMetadata({
34672
+ minVersion: "12.0.0",
34673
+ version: "22.2.2",
34674
+ ngImport: i0,
34675
+ type: CalendarComponent,
34676
+ decorators: [{
34677
+ type: Component,
34678
+ args: [{
34679
+ selector: "ui-calendar",
34680
+ standalone: true,
34681
+ changeDetection: ChangeDetectionStrategy.OnPush,
34682
+ imports: [
34683
+ BadgeComponent,
34684
+ EmptyStateComponent,
34685
+ PillTabsComponent,
34686
+ SkeletonComponent,
34687
+ ToastComponent
34688
+ ],
34689
+ template: `
34690
+ <div class="cal-toolbar">
34691
+ <div class="toolbar-left">
34692
+ <h2 class="period-label" aria-live="polite" aria-atomic="true">{{ periodLabel() }}</h2>
34693
+ <div class="nav-controls">
34694
+ <button type="button" class="btn-nav" (click)="navigate(-1)" aria-label="Previous">
34695
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><polyline points="15 18 9 12 15 6"/></svg>
34696
+ </button>
34697
+ <button type="button" class="btn-today" (click)="goToday()">Today</button>
34698
+ <button type="button" class="btn-nav" (click)="navigate(1)" aria-label="Next">
34699
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><polyline points="9 18 15 12 9 6"/></svg>
34700
+ </button>
34701
+ </div>
34702
+ </div>
34703
+ <div class="toolbar-center"><ng-content select="[calendar-summary]" /></div>
34704
+ <div class="toolbar-right">
34705
+ @if (viewTabs().length > 1) {
34706
+ <ui-pill-tabs ariaLabel="Calendar view" name="ui-calendar-view" [tabs]="viewTabs()" [activeKey]="view()" (tabChange)="setView($any($event))" />
34707
+ }
34708
+ <ng-content select="[calendar-actions]" />
34709
+ </div>
34710
+ </div>
34711
+
34712
+ @if (!loading()) {
34713
+ <div class="mobile-summary"><ng-content select="[calendar-summary-mobile]" /></div>
34714
+ }
34715
+
34716
+ @if (filters().length && !loading()) {
34717
+ <div class="filter-bar">
34718
+ @if (filterLabel()) { <div class="filter-bar-label">{{ filterLabel() }}</div> }
34719
+ <div class="filter-chips" role="group" [attr.aria-label]="filterLabel() || 'Filter'">
34720
+ <button type="button" class="filter-chip" [class.active-all]="!activeFilters().length" [attr.aria-pressed]="!activeFilters().length" (click)="clearFilters()">
34721
+ All
34722
+ @if (showFilterCounts()) { <span class="chip-count">{{ items().length }}</span> }
34723
+ </button>
34724
+ @for (f of filters(); track f.value) {
34725
+ <button type="button" class="filter-chip"
34726
+ [class.active-type]="isFilterActive(f.value)"
34727
+ [attr.aria-pressed]="isFilterActive(f.value)"
34728
+ [style.--chip-color]="f.color"
34729
+ [style.--chip-bg]="f.bgColor ?? null"
34730
+ (click)="toggleFilter(f.value)">
34731
+ <span class="chip-dot" [style.background]="f.color" aria-hidden="true"></span>
34732
+ {{ f.label }}
34733
+ @if (showFilterCounts()) { <span class="chip-count">{{ typeCounts()[f.value] ?? 0 }}</span> }
34734
+ </button>
34735
+ }
34736
+ </div>
34737
+ </div>
34738
+ }
34739
+
34740
+ @if (loading()) {
34741
+ <div class="cal-skeleton" aria-busy="true" aria-label="Loading calendar" role="status">
34742
+ <div class="skel-dow-row">
34743
+ @for (d of weekDayLabels; track d) { <div class="skel-dow"><ui-skeleton [height]="16" width="36px" [radius]="4" /></div> }
34744
+ </div>
34745
+ <div class="skel-month-grid">
34746
+ @for (i of skeletonCells; track i) {
34747
+ <div class="skel-cell">
34748
+ <ui-skeleton [height]="22" width="22px" [radius]="11" />
34749
+ @if (i % 3 === 0) { <ui-skeleton [height]="14" [radius]="3" /> }
34750
+ @if (i % 5 === 0) { <ui-skeleton [height]="14" width="72%" [radius]="3" /> }
34751
+ </div>
34752
+ }
34753
+ </div>
34754
+ </div>
34755
+ } @else {
34756
+ @switch (view()) {
34757
+ @case ('month') {
34758
+ <div class="month-view">
34759
+ <div class="month-grid" role="grid" [attr.aria-label]="periodLabel()">
34760
+ <div class="month-header" role="row">
34761
+ @for (d of weekDayLabels; track d; let i = $index) {
34762
+ <div class="month-dow" role="columnheader" [attr.aria-label]="weekDayNames[i]">
34763
+ <span class="dow-full" aria-hidden="true">{{ d }}</span><span class="dow-short" aria-hidden="true">{{ d.slice(0, 2) }}</span>
34764
+ </div>
34765
+ }
34766
+ </div>
34767
+ @for (row of monthRows(); track row.key) {
34768
+ <div class="month-row" role="row">
34769
+ @for (c of row.cells; track c.day.dateStr) {
34770
+ <div class="month-cell" role="gridcell"
34771
+ [attr.data-date]="c.day.dateStr"
34772
+ [class.other-month]="!c.day.isCurrentMonth" [class.today]="c.day.isToday" [class.weekend]="c.day.isWeekend"
34773
+ [class.clickable]="c.clickable"
34774
+ [attr.tabindex]="c.day.dateStr === focusDate() ? 0 : -1"
34775
+ [attr.aria-label]="c.label"
34776
+ [attr.aria-current]="c.day.isToday ? 'date' : null"
34777
+ (click)="onDateClick(c.day.dateStr)"
34778
+ (focus)="focusedDate.set(c.day.dateStr)"
34779
+ (keydown)="onCellKey($event, c.day.dateStr)">
34780
+ <span class="day-num" [class.today-badge]="c.day.isToday">{{ c.day.dayNum }}</span>
34781
+ <div class="cell-events">
34782
+ @for (e of c.visible; track e.id) {
34783
+ <button type="button" class="event-chip" [class.stacked]="chipLayout() === 'stacked'" [class.has-head]="!!(e.iconPath || chipTime(e))" [style.background]="e.bgColor" [style.borderLeftColor]="e.color"
34784
+ [attr.aria-label]="itemLabel(e)" [title]="e.title"
34785
+ (click)="onItemClick(e, $event)">
34786
+ <span class="chip-head">
34787
+ @if (e.iconPath) {
34788
+ <svg class="chip-icon" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path [attr.d]="e.iconPath"/></svg>
34789
+ }
34790
+ @if (chipTime(e); as t) { <span class="chip-time">{{ t }}</span> }
34791
+ </span>
34792
+ <span class="chip-title" [class.strike]="e.strike">{{ e.title }}</span>
34793
+ @if (e.tag) { <span class="chip-src">{{ e.tag }}</span> }
34794
+ </button>
34795
+ }
34796
+ @if (c.overflow > 0) {
34797
+ <button type="button" class="more-events" (click)="onMoreClick(c.day.dateStr, c.items, $event)">+{{ c.overflow }} more</button>
34798
+ }
34799
+ </div>
34800
+ </div>
34801
+ }
34802
+ </div>
34803
+ }
34804
+ </div>
34805
+ </div>
34806
+ }
34807
+ @case ('week') {
34808
+ <div class="week-view">
34809
+ <div class="week-header">
34810
+ <div class="time-gutter"></div>
34811
+ @for (col of weekColumns(); track col.day.dateStr) {
34812
+ <div class="week-day-hdr" [class.today]="col.day.isToday">
34813
+ <span class="wdh-dow">{{ dowLabel(col.day.dateStr) }}</span>
34814
+ <span class="wdh-num" [class.today-badge]="col.day.isToday">{{ col.day.dayNum }}</span>
34815
+ </div>
34816
+ }
34817
+ </div>
34818
+ <div class="allday-row">
34819
+ <div class="time-gutter allday-label">All day</div>
34820
+ @for (col of weekColumns(); track col.day.dateStr) {
34821
+ <div class="allday-cell" [class.clickable]="col.clickable" (click)="onDateClick(col.day.dateStr)">
34822
+ @if (col.clickable) {
34823
+ <button type="button" class="slot-add" [attr.aria-label]="'Add all-day event on ' + col.label" (click)="onAddAllDay(col.day.dateStr, $event)">+ Add</button>
34824
+ }
34825
+ @for (e of col.allDay; track e.id) {
34826
+ <button type="button" class="allday-chip" [style.background]="e.bgColor" [style.borderLeftColor]="e.color"
34827
+ [attr.aria-label]="itemLabel(e)" (click)="onItemClick(e, $event)">{{ e.title }}</button>
34828
+ }
34829
+ </div>
34830
+ }
34831
+ </div>
34832
+ <div class="week-body">
34833
+ <div class="time-col">
34834
+ @for (h of hours(); track h) { <div class="time-slot-label">{{ formatHour(h) }}</div> }
34835
+ </div>
34836
+ @for (col of weekColumns(); track col.day.dateStr) {
34837
+ <div class="day-col" [class.today]="col.day.isToday" [class.clickable]="col.clickable" (click)="onSlotClick(col.day.dateStr, $event)">
34838
+ @if (col.clickable) {
34839
+ <button type="button" class="slot-add" [attr.aria-label]="'Add event on ' + col.label" (click)="onAddTimed(col.day.dateStr, $event)">+ Add</button>
34840
+ }
34841
+ @for (h of hours(); track h) { <div class="time-slot"></div> }
34842
+ @for (t of col.timed; track t.item.id) {
34843
+ <button type="button" class="timed-event"
34844
+ [style.top.px]="t.top" [style.height.px]="t.height"
34845
+ [style.left]="'calc(' + (t.lane.lane / t.lane.lanes * 100) + '% + 2px)'"
34846
+ [style.width]="'calc(' + (100 / t.lane.lanes) + '% - 4px)'"
34847
+ [style.background]="t.item.bgColor" [style.borderLeftColor]="t.item.color"
34848
+ [attr.aria-label]="itemLabel(t.item)" (click)="onItemClick(t.item, $event)">
34849
+ <span class="te-title" [class.strike]="t.item.strike">{{ t.item.title }}</span>
34850
+ @if (t.item.startTime) { <span class="te-time">{{ t.item.timeLabel || timeRange(t.item) }}</span> }
34851
+ </button>
34852
+ }
34853
+ </div>
34854
+ }
34855
+ </div>
34856
+ </div>
34857
+ }
34858
+ @case ('agenda') {
34859
+ <div class="agenda-view">
34860
+ @if (agendaGroups().length === 0) {
34861
+ <ui-empty-state iconType="task" [message]="emptyMessage()" />
34862
+ }
34863
+ @for (group of agendaGroups(); track group.dateStr) {
34864
+ <div class="agenda-group">
34865
+ <div class="agenda-date-hdr">
34866
+ <span class="ag-dow">{{ agendaDow(group.dateStr) }}</span>
34867
+ <span class="ag-date">{{ agendaDate(group.dateStr) }}</span>
34868
+ @if (group.dateStr === todayStr()) { <ui-badge label="Today" variant="blue" /> }
34869
+ </div>
34870
+ <div class="agenda-events">
34871
+ @for (e of group.items; track e.id) {
34872
+ <button type="button" class="agenda-event" [attr.aria-label]="e.ariaLabel || null" (click)="onItemClick(e, $event)">
34873
+ <span class="ae-color-bar" [style.background]="e.color"></span>
34874
+ <span class="ae-body">
34875
+ <span class="ae-top">
34876
+ <span class="ae-title" [class.strike]="e.strike">{{ e.title }}</span>
34877
+ @for (b of e.badges ?? []; track b.label) { <ui-badge [label]="b.label" [variant]="b.variant" /> }
34878
+ </span>
34879
+ @if (agendaMeta(e).length) {
34880
+ <span class="ae-meta">
34881
+ @for (m of agendaMeta(e); track $index) { <span class="ae-meta-item">{{ m }}</span> }
34882
+ </span>
34883
+ }
34884
+ </span>
34885
+ </button>
34886
+ }
34887
+ </div>
34888
+ </div>
34889
+ }
34890
+ </div>
34891
+ }
34892
+ }
34893
+ }
34894
+ <ui-toast />
34895
+ `,
34896
+ styles: [":host{display:flex;flex-direction:column;gap:0;height:100%;min-height:0}.cal-toolbar{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;padding-bottom:16px;gap:16px;flex-shrink:0}.toolbar-left{display:flex;flex-direction:column;align-items:flex-start;gap:6px}.toolbar-center{display:flex;align-items:center;justify-content:center;gap:10px}.toolbar-right{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}.period-label{font-size:1.125rem;font-weight:700;color:#111827;margin:0}.nav-controls{display:flex;align-items:center;gap:8px}.btn-nav{width:32px;height:32px;border:1px solid #e2e8f0;background:#fff;border-radius:6px;font-family:inherit;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#475569}.btn-nav:hover{background:#f8fafc}.btn-today{padding:6px 14px;border:1px solid #e2e8f0;background:#fff;border-radius:6px;font-family:inherit;font-size:.875rem;font-weight:500;color:#374151;cursor:pointer}.btn-today:hover{background:#f8fafc}.btn-nav:focus-visible,.btn-today:focus-visible,.filter-chip:focus-visible,.event-chip:focus-visible,.more-events:focus-visible,.allday-chip:focus-visible,.timed-event:focus-visible,.agenda-event:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.month-cell:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.slot-add:focus,.slot-add:focus-visible{outline:2px solid #3b82f6;outline-offset:1px}.mobile-summary{display:none}.filter-bar{display:flex;flex-direction:column;gap:8px;padding:12px 0;border-top:1px solid #e2e8f0;flex-shrink:0}.filter-bar-label{font-size:.6875rem;font-weight:700;color:#94a3b8;text-transform:uppercase;letter-spacing:.06em}.filter-chips{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.filter-chip{display:inline-flex;align-items:center;gap:5px;padding:4px 12px;border-radius:20px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#475569;cursor:pointer;transition:all .12s;white-space:nowrap;font-family:inherit}.filter-chip:hover{border-color:#cbd5e1;background:#f8fafc}.filter-chip.active-all{background:#1e293b;color:#fff;border-color:#1e293b}.filter-chip.active-all .chip-count{background:#fff3;color:#fff}.filter-chip.active-type{background:var(--chip-bg, #f1f5f9);color:#1e293b;border-color:var(--chip-color);font-weight:600}.filter-chip.active-type .chip-count{background:var(--chip-color);color:#fff}.chip-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.chip-count{font-size:.6875rem;font-weight:700;background:#f1f5f9;color:#64748b;padding:1px 7px;border-radius:999px}.cal-skeleton,.month-view,.week-view,.agenda-view{flex:1;display:flex;flex-direction:column;min-height:0;background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden}.skel-dow-row{display:grid;grid-template-columns:repeat(7,1fr);gap:8px;padding:12px 10px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.skel-dow{display:flex;justify-content:center}.skel-month-grid{display:grid;grid-template-columns:repeat(7,1fr);grid-template-rows:repeat(6,minmax(80px,1fr));flex:1}.skel-cell{border-right:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;padding:8px 6px;display:flex;flex-direction:column;gap:6px}.skel-cell:nth-child(7n){border-right:none}.month-grid{display:flex;flex-direction:column;flex:1;min-height:0;overflow:auto}.month-header{display:grid;grid-template-columns:repeat(7,1fr);border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;position:sticky;top:0;z-index:1}.month-dow{padding:10px 8px;font-size:.75rem;font-weight:600;color:#6b7280;text-align:center;text-transform:uppercase;letter-spacing:.04em}.dow-short{display:none}.month-row{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));flex:1 0 120px}.month-cell{border-right:1px solid #f1f5f9;border-bottom:1px solid #f1f5f9;padding:6px 6px 4px;min-height:120px;transition:background .1s;min-width:0;box-sizing:border-box}.month-cell.clickable{cursor:pointer}.month-cell.clickable:hover{background:#f8fafc}.month-cell:nth-child(7n){border-right:none}.month-cell.other-month{background:#fafafa}.month-cell.other-month .day-num{color:#64748b}.month-cell.today{background:#eff6ff}.day-num{display:inline-block;width:26px;height:26px;line-height:26px;text-align:center;border-radius:50%;font-size:.8125rem;font-weight:500;color:#374151;margin-bottom:4px}.today-badge{background:#2563eb;color:#fff;font-weight:700}.cell-events{display:flex;flex-direction:column;gap:2px}.event-chip{display:flex;align-items:center;gap:3px;padding:2px 6px;width:100%;box-sizing:border-box;text-align:left;font-family:inherit;border:0;border-radius:4px;border-left:3px solid transparent;font-size:.6875rem;font-weight:500;cursor:pointer;overflow:hidden}.event-chip:hover{opacity:.85}.event-chip.stacked{flex-direction:column;align-items:flex-start;gap:0}.chip-head{display:inline-flex;align-items:center;gap:3px;flex-shrink:0}.chip-icon{flex-shrink:0}.chip-time{font-weight:700;flex-shrink:0;color:#1e293b}.chip-title{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#1e293b;min-width:0;max-width:100%}.strike{text-decoration:line-through}.chip-src{font-size:.625rem;font-weight:700;margin-left:auto;flex-shrink:0;color:#1e293b}.more-events{font-size:.6875rem;color:#2563eb;font-weight:600;cursor:pointer;padding:1px 6px;border:0;background:none;text-align:left;font-family:inherit}.more-events:hover{text-decoration:underline}.week-view{overflow:auto}.week-header{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:1px solid #e2e8f0;background:#f8fafc;flex-shrink:0;overflow-y:scroll}.time-gutter{border-right:1px solid #e2e8f0}.week-day-hdr{display:flex;flex-direction:column;align-items:center;padding:10px 4px;border-right:1px solid #f1f5f9}.week-day-hdr.today{background:#eff6ff}.week-day-hdr:last-child{border-right:none}.wdh-dow{font-size:.6875rem;font-weight:600;color:#6b7280;text-transform:uppercase}.wdh-num{width:28px;height:28px;line-height:28px;text-align:center;border-radius:50%;font-size:.9375rem;font-weight:600;color:#374151;margin-top:2px}.wdh-num.today-badge{background:#2563eb;color:#fff;font-weight:700}.allday-row{display:grid;grid-template-columns:60px repeat(7,1fr);border-bottom:1px solid #e2e8f0;min-height:32px;flex-shrink:0;overflow-y:scroll}.allday-label{font-size:.625rem;color:#64748b;font-weight:600;text-transform:uppercase;display:flex;align-items:center;justify-content:center}.slot-add{position:absolute;top:2px;left:2px;z-index:3;width:1px;height:1px;padding:0;margin:0;overflow:hidden;clip-path:inset(50%);border:0;white-space:nowrap;font-family:inherit}.slot-add:focus,.slot-add:focus-visible{width:auto;height:auto;padding:2px 8px;clip-path:none;background:#1e293b;color:#fff;border-radius:4px;font-size:.75rem;font-weight:600}.allday-cell{position:relative;border-right:1px solid #f1f5f9;padding:3px 4px;display:flex;flex-direction:column;gap:2px;min-width:0}.allday-cell.clickable{cursor:pointer}.allday-cell:last-child{border-right:none}.allday-chip{padding:2px 6px;border:0;border-radius:4px;border-left:3px solid transparent;font-size:.6875rem;font-weight:500;color:#1e293b;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left;font-family:inherit}.allday-chip:hover{opacity:.85}.week-body{display:grid;grid-template-columns:60px repeat(7,1fr);flex:1;overflow-y:scroll}.time-col{display:flex;flex-direction:column;border-right:1px solid #e2e8f0;flex-shrink:0}.time-slot-label{height:60px;display:flex;align-items:flex-start;justify-content:flex-end;padding:4px 8px 0 0;font-size:.6875rem;color:#64748b;font-weight:500;border-bottom:1px solid #f1f5f9;flex-shrink:0;box-sizing:border-box}.day-col{position:relative;border-right:1px solid #f1f5f9;min-width:0}.day-col.clickable{cursor:pointer}.day-col:last-child{border-right:none}.day-col.today{background:#fafbff}.time-slot{height:60px;border-bottom:1px solid #f1f5f9;box-sizing:border-box}.day-col.clickable .time-slot:hover{background:#f8fafc}.timed-event{position:absolute;min-height:20px;border:0;border-radius:6px;padding:3px 6px;overflow:hidden;cursor:pointer;box-sizing:border-box;border-left:3px solid transparent;display:flex;flex-direction:column;align-items:flex-start;gap:1px;box-shadow:0 1px 3px #00000014;text-align:left;font-family:inherit}.timed-event:hover{opacity:.85}.te-title{font-size:.6875rem;font-weight:600;color:#1e293b;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.te-time{font-size:.625rem;color:#475569}.agenda-view{overflow-y:auto}.agenda-group{display:flex;border-bottom:1px solid #f1f5f9}.agenda-date-hdr{width:100px;flex-shrink:0;padding:16px 12px;display:flex;flex-direction:column;gap:4px;background:#f8fafc;border-right:2px solid #e2e8f0}.ag-dow{font-size:.6875rem;font-weight:700;color:#6b7280;text-transform:uppercase;letter-spacing:.04em}.ag-date{font-size:.8125rem;font-weight:600;color:#374151}.agenda-events{flex:1;display:flex;flex-direction:column;min-width:0}.agenda-event{display:flex;align-items:stretch;padding:10px 12px;cursor:pointer;border:0;border-bottom:1px solid #f8fafc;background:none;text-align:left;width:100%;font-family:inherit;transition:background .1s}.agenda-event:hover{background:#f8fafc}.agenda-event:last-child{border-bottom:none}.ae-color-bar{display:block;width:4px;border-radius:4px;flex-shrink:0;margin-right:12px}.ae-body{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.ae-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.ae-title{font-size:.9375rem;font-weight:600;color:#111827}.ae-meta{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.ae-meta-item{font-size:.8125rem;color:#6b7280}@media(pointer:coarse),(max-width:480px){.btn-nav,.btn-today,.filter-chip,.event-chip,.more-events,.allday-chip,.agenda-event{min-height:44px}.btn-nav{min-width:44px}}@media(max-width:768px){.cal-toolbar{grid-template-columns:1fr}.toolbar-center{display:none}.toolbar-left{flex-wrap:wrap}.toolbar-right{justify-content:flex-start}.mobile-summary{display:block;margin-bottom:4px;flex-shrink:0}.mobile-summary:empty{display:none}.filter-chips{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px;-webkit-overflow-scrolling:touch}.month-view,.cal-skeleton,.week-view{overflow-x:auto;-webkit-overflow-scrolling:touch}.month-grid,.skel-month-grid,.skel-dow-row{min-width:560px}.month-row{flex-basis:80px}.month-cell{min-height:80px}.week-header,.allday-row,.week-body{min-width:640px}.agenda-date-hdr{width:76px;padding:12px 8px}.ae-title{font-size:.875rem}}@media(max-width:640px){.event-chip.stacked.has-head .chip-title{display:none}}@media(max-width:480px){.dow-full{display:none}.dow-short{display:inline}}\n"]
34897
+ }]
34898
+ }],
34899
+ ctorParameters: () => [],
34900
+ propDecorators: {
34901
+ items: [{
34902
+ type: i0.Input,
34903
+ args: [{
34904
+ isSignal: true,
34905
+ alias: "items",
34906
+ required: false
34907
+ }]
34908
+ }],
34909
+ loading: [{
34910
+ type: i0.Input,
34911
+ args: [{
34912
+ isSignal: true,
34913
+ alias: "loading",
34914
+ required: false
34915
+ }]
34916
+ }],
34917
+ view: [{
34918
+ type: i0.Input,
34919
+ args: [{
34920
+ isSignal: true,
34921
+ alias: "view",
34922
+ required: false
34923
+ }]
34924
+ }, {
34925
+ type: i0.Output,
34926
+ args: ["viewChange"]
34927
+ }],
34928
+ views: [{
34929
+ type: i0.Input,
34930
+ args: [{
34931
+ isSignal: true,
34932
+ alias: "views",
34933
+ required: false
34934
+ }]
34935
+ }],
34936
+ anchorDate: [{
34937
+ type: i0.Input,
34938
+ args: [{
34939
+ isSignal: true,
34940
+ alias: "anchorDate",
34941
+ required: false
34942
+ }]
34943
+ }, {
34944
+ type: i0.Output,
34945
+ args: ["anchorDateChange"]
34946
+ }],
34947
+ filters: [{
34948
+ type: i0.Input,
34949
+ args: [{
34950
+ isSignal: true,
34951
+ alias: "filters",
34952
+ required: false
34953
+ }]
34954
+ }],
34955
+ filterLabel: [{
34956
+ type: i0.Input,
34957
+ args: [{
34958
+ isSignal: true,
34959
+ alias: "filterLabel",
34960
+ required: false
34961
+ }]
34962
+ }],
34963
+ filterMode: [{
34964
+ type: i0.Input,
34965
+ args: [{
34966
+ isSignal: true,
34967
+ alias: "filterMode",
34968
+ required: false
34969
+ }]
34970
+ }],
34971
+ activeFilters: [{
34972
+ type: i0.Input,
34973
+ args: [{
34974
+ isSignal: true,
34975
+ alias: "activeFilters",
34976
+ required: false
34977
+ }]
34978
+ }, {
34979
+ type: i0.Output,
34980
+ args: ["activeFiltersChange"]
34981
+ }],
34982
+ showFilterCounts: [{
34983
+ type: i0.Input,
34984
+ args: [{
34985
+ isSignal: true,
34986
+ alias: "showFilterCounts",
34987
+ required: false
34988
+ }]
34989
+ }],
34990
+ canCreate: [{
34991
+ type: i0.Input,
34992
+ args: [{
34993
+ isSignal: true,
34994
+ alias: "canCreate",
34995
+ required: false
34996
+ }]
34997
+ }],
34998
+ disablePast: [{
34999
+ type: i0.Input,
35000
+ args: [{
35001
+ isSignal: true,
35002
+ alias: "disablePast",
35003
+ required: false
35004
+ }]
35005
+ }],
35006
+ maxVisible: [{
35007
+ type: i0.Input,
35008
+ args: [{
35009
+ isSignal: true,
35010
+ alias: "maxVisible",
35011
+ required: false
35012
+ }]
35013
+ }],
35014
+ chipLayout: [{
35015
+ type: i0.Input,
35016
+ args: [{
35017
+ isSignal: true,
35018
+ alias: "chipLayout",
35019
+ required: false
35020
+ }]
35021
+ }],
35022
+ sortByTime: [{
35023
+ type: i0.Input,
35024
+ args: [{
35025
+ isSignal: true,
35026
+ alias: "sortByTime",
35027
+ required: false
35028
+ }]
35029
+ }],
35030
+ startHour: [{
35031
+ type: i0.Input,
35032
+ args: [{
35033
+ isSignal: true,
35034
+ alias: "startHour",
35035
+ required: false
35036
+ }]
35037
+ }],
35038
+ endHour: [{
35039
+ type: i0.Input,
35040
+ args: [{
35041
+ isSignal: true,
35042
+ alias: "endHour",
35043
+ required: false
35044
+ }]
35045
+ }],
35046
+ emptyMessage: [{
35047
+ type: i0.Input,
35048
+ args: [{
35049
+ isSignal: true,
35050
+ alias: "emptyMessage",
35051
+ required: false
35052
+ }]
35053
+ }],
35054
+ dayLabelFn: [{
35055
+ type: i0.Input,
35056
+ args: [{
35057
+ isSignal: true,
35058
+ alias: "dayLabelFn",
35059
+ required: false
35060
+ }]
35061
+ }],
35062
+ rangeChange: [{
35063
+ type: i0.Output,
35064
+ args: ["rangeChange"]
35065
+ }],
35066
+ itemClick: [{
35067
+ type: i0.Output,
35068
+ args: ["itemClick"]
35069
+ }],
35070
+ dateClick: [{
35071
+ type: i0.Output,
35072
+ args: ["dateClick"]
35073
+ }],
35074
+ slotClick: [{
35075
+ type: i0.Output,
35076
+ args: ["slotClick"]
35077
+ }],
35078
+ moreClick: [{
35079
+ type: i0.Output,
35080
+ args: ["moreClick"]
35081
+ }]
35082
+ }
35083
+ });
35084
+ export { ActionBarComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BarRowComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, CalendarComponent, CheckboxComponent, CheckboxTrailingDirective, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DropdownComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FileInputComponent, FormColSpanDirective, FormComponent, FormRowComponent, FormSectionComponent, HintComponent, IconComponent, ImageComponent, ImageGalleryComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, KpiCardComponent, LAYOUT_GAP_PX, ListComponent, ListItemComponent, LiveRegionComponent, ModalComponent, MoreMenuComponent, MultiSelectComponent, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PaginationComponent, PanelInfoListComponent, PdfHotspotComponent, PhoneNumberPickerComponent, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, RadioOptionContentDirective, ReadonlyFieldsetComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SearchInputComponent, SectionHeaderComponent, SelectComponent, SidePanelComponent, SignaturePadComponent, SkeletonComponent, StackComponent, StarComponent, StepperComponent, TableToolbarComponent, TextComponent, TextInputComponent, TextareaInputComponent, TimeInputComponent, TimelineComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_STATES, UiFieldValidity, acceptLabel, appShellGroupsStorageKey, autoVariant, buildDefaultSchedule, builtInActionIcon, businessTimeOptions, createFieldReveal, decodeFilterValues, digitsOnly, encodeFilterValue, encodeFilterValues, errorContextInterceptor, fileMatchesAccept, formatFileSize, formatIsoDate, formatIsoDateTime, formatTime, getEligibleIds, getEligibleOptions, getErrorMessage, humanReadableMessage, iconPath, isoKey, issueToErrors, maxLengthIssue, normalizeHexColor, parseBizHours, parseIso, parseTime, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, serializeBizHours };
33560
35085
 
33561
35086
  //# sourceMappingURL=forgeroute-ui.mjs.map