@forgeroute/ui 0.4.4 → 0.4.6

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, 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, 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";
@@ -2108,6 +2108,9 @@ var ModalComponent = class ModalComponent {
2108
2108
  this.description = input("", ...ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []);
2109
2109
  this.maxWidth = input("460px", ...ngDevMode ? [{ debugName: "maxWidth" }] : /* istanbul ignore next */ []);
2110
2110
  this.bodyOverflow = input("auto", ...ngDevMode ? [{ debugName: "bodyOverflow" }] : /* istanbul ignore next */ []);
2111
+ this.dialogTestId = input("", ...ngDevMode ? [{ debugName: "dialogTestId" }] : /* istanbul ignore next */ []);
2112
+ this.hideClose = input(false, ...ngDevMode ? [{ debugName: "hideClose" }] : /* istanbul ignore next */ []);
2113
+ this.closable = input(true, ...ngDevMode ? [{ debugName: "closable" }] : /* istanbul ignore next */ []);
2111
2114
  this.close = output();
2112
2115
  this.titleId = `m-title-${Math.random().toString(36).slice(2, 8)}`;
2113
2116
  this.el = inject(ElementRef);
@@ -2141,7 +2144,7 @@ var ModalComponent = class ModalComponent {
2141
2144
  if (!this.open() || !this._overlays.isTop(this)) return;
2142
2145
  if (event.key === "Escape") {
2143
2146
  event.preventDefault();
2144
- this.close.emit();
2147
+ if (this.closable()) this.close.emit();
2145
2148
  return;
2146
2149
  }
2147
2150
  if (event.key === "Tab") {
@@ -2233,6 +2236,27 @@ var ModalComponent = class ModalComponent {
2233
2236
  isSignal: true,
2234
2237
  isRequired: false,
2235
2238
  transformFunction: null
2239
+ },
2240
+ dialogTestId: {
2241
+ classPropertyName: "dialogTestId",
2242
+ publicName: "dialogTestId",
2243
+ isSignal: true,
2244
+ isRequired: false,
2245
+ transformFunction: null
2246
+ },
2247
+ hideClose: {
2248
+ classPropertyName: "hideClose",
2249
+ publicName: "hideClose",
2250
+ isSignal: true,
2251
+ isRequired: false,
2252
+ transformFunction: null
2253
+ },
2254
+ closable: {
2255
+ classPropertyName: "closable",
2256
+ publicName: "closable",
2257
+ isSignal: true,
2258
+ isRequired: false,
2259
+ transformFunction: null
2236
2260
  }
2237
2261
  },
2238
2262
  outputs: { close: "close" },
@@ -2240,8 +2264,8 @@ var ModalComponent = class ModalComponent {
2240
2264
  ngImport: i0,
2241
2265
  template: `
2242
2266
  @if (open()) {
2243
- <div class="m-backdrop" (click)="close.emit()"></div>
2244
- <div class="m-modal" role="dialog" aria-modal="true" tabindex="-1" [attr.aria-labelledby]="titleId" [style.max-width]="maxWidth()">
2267
+ <div class="m-backdrop" (click)="closable() && close.emit()"></div>
2268
+ <div class="m-modal" role="dialog" aria-modal="true" tabindex="-1" [attr.aria-labelledby]="titleId" [attr.data-testid]="dialogTestId() || null" [style.max-width]="maxWidth()">
2245
2269
  <div class="m-header">
2246
2270
  <div class="m-header-text">
2247
2271
  <h3 class="m-title" [id]="titleId">{{ title() }}</h3>
@@ -2249,24 +2273,27 @@ var ModalComponent = class ModalComponent {
2249
2273
  <p class="m-description">{{ description() }}</p>
2250
2274
  }
2251
2275
  </div>
2252
- <button class="m-close" type="button" aria-label="Close" (click)="close.emit()">
2253
- <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
2254
- <line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/>
2255
- </svg>
2256
- </button>
2276
+ @if (!hideClose() && closable()) {
2277
+ <button class="m-close" type="button" aria-label="Close" (click)="close.emit()">
2278
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
2279
+ <line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/>
2280
+ </svg>
2281
+ </button>
2282
+ }
2257
2283
  </div>
2258
2284
  <div class="m-body" [style.overflow-y]="bodyOverflow()">
2259
2285
  <ng-content />
2260
2286
  </div>
2261
2287
  <div class="m-footer">
2262
2288
  <div class="m-footer-left"><ng-content select="[modal-footer-left]" /></div>
2289
+ <div class="m-footer-center"><ng-content select="[modal-footer-center]" /></div>
2263
2290
  <div class="m-footer-right"><ng-content select="[modal-footer-right]" /></div>
2264
2291
  </div>
2265
2292
  </div>
2266
2293
  }
2267
2294
  `,
2268
2295
  isInline: true,
2269
- styles: [".m-backdrop{position:fixed;inset:0;background:#02081773;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);z-index:200;animation:m-fade .18s ease}.m-modal:focus{outline:none}.m-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;border-radius:16px;border:1px solid rgba(0,0,0,.07);z-index:201;width:calc(100% - 32px);box-shadow:0 4px 6px #0000000a,0 16px 32px #0000001f,0 48px 96px #0000001a;max-height:calc(100vh - 48px);max-height:calc(100dvh - 48px);display:flex;flex-direction:column;animation:m-scale .22s cubic-bezier(.16,1,.3,1)}.m-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0;border-radius:16px 16px 0 0;flex-shrink:0}.m-header-text{display:flex;flex-direction:column;gap:3px;flex:1;min-width:0}.m-title{font-size:1.125rem;font-weight:700;color:#0f172a;margin:0;letter-spacing:-.02em;line-height:1.3}.m-description{font-size:.8125rem;color:#64748b;margin:0;line-height:1.4}.m-close{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:8px;border:none;background:none;cursor:pointer;color:#94a3b8;flex-shrink:0;margin-left:12px;transition:background .13s,color .13s}.m-close:hover{background:#f1f5f9;color:#1e293b}.m-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.m-body{padding:20px 24px;overflow-y:auto;flex:1;min-height:0;font-size:.9rem;color:#475569;line-height:1.65}.m-footer{padding:14px 24px 18px;background:#f8fafc;border-top:1px solid #e2e8f0;border-radius:0 0 16px 16px;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;gap:8px}.m-footer:not(:has(*)){display:none}.m-footer-left{display:flex;align-items:center;gap:8px}.m-footer-right{display:flex;align-items:center;gap:8px;margin-left:auto}@media(max-width:480px){.m-modal{top:auto;bottom:var(--ui-kb, 0px);left:0;right:0;transform:none;width:100vw;max-width:none!important;max-height:min(85dvh,var(--ui-vvh, 100dvh));border-radius:20px 20px 0 0;animation:m-up .24s cubic-bezier(.16,1,.3,1)}.m-footer{border-radius:0;flex-direction:column-reverse;align-items:stretch;padding-bottom:max(18px,env(safe-area-inset-bottom))}}@media(pointer:coarse),(max-width:480px){.m-close{position:relative}.m-close:after{content:\"\";position:absolute;inset:-7px}}@keyframes m-fade{0%{opacity:0}to{opacity:1}}@keyframes m-scale{0%{opacity:0;transform:translate(-50%,-48%) scale(.96)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}@keyframes m-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}\n"],
2296
+ styles: [".m-backdrop{position:fixed;inset:0;background:#02081773;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);z-index:200;animation:m-fade .18s ease}.m-modal:focus{outline:none}.m-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;border-radius:16px;border:1px solid rgba(0,0,0,.07);z-index:201;width:calc(100% - 32px);box-shadow:0 4px 6px #0000000a,0 16px 32px #0000001f,0 48px 96px #0000001a;max-height:calc(100vh - 48px);max-height:calc(100dvh - 48px);display:flex;flex-direction:column;animation:m-scale .22s cubic-bezier(.16,1,.3,1)}.m-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0;border-radius:16px 16px 0 0;flex-shrink:0}.m-header-text{display:flex;flex-direction:column;gap:3px;flex:1;min-width:0}.m-title{font-size:1.125rem;font-weight:700;color:#0f172a;margin:0;letter-spacing:-.02em;line-height:1.3}.m-description{font-size:.8125rem;color:#64748b;margin:0;line-height:1.4}.m-close{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:8px;border:none;background:none;cursor:pointer;color:#94a3b8;flex-shrink:0;margin-left:12px;transition:background .13s,color .13s}.m-close:hover{background:#f1f5f9;color:#1e293b}.m-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.m-body{padding:20px 24px;overflow-y:auto;flex:1;min-height:0;font-size:.9rem;color:#475569;line-height:1.65}.m-footer{padding:14px 24px 18px;background:#f8fafc;border-top:1px solid #e2e8f0;border-radius:0 0 16px 16px;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;gap:8px}.m-footer:not(:has(*)){display:none}.m-footer-left{display:flex;align-items:center;gap:8px}.m-footer-right{display:flex;align-items:center;gap:8px;margin-left:auto}.m-footer-center{display:flex;align-items:center;justify-content:center;gap:8px;flex:1 1 auto;margin:0 8px}.m-footer-center:empty{display:none}@media(max-width:480px){.m-modal{top:auto;bottom:var(--ui-kb, 0px);left:0;right:0;transform:none;width:100vw;max-width:none!important;max-height:min(85dvh,var(--ui-vvh, 100dvh));border-radius:20px 20px 0 0;animation:m-up .24s cubic-bezier(.16,1,.3,1)}.m-footer{border-radius:0;flex-direction:column-reverse;align-items:stretch;padding-bottom:max(18px,env(safe-area-inset-bottom))}}@media(pointer:coarse),(max-width:480px){.m-close{position:relative}.m-close:after{content:\"\";position:absolute;inset:-7px}}@keyframes m-fade{0%{opacity:0}to{opacity:1}}@keyframes m-scale{0%{opacity:0;transform:translate(-50%,-48%) scale(.96)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}@keyframes m-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}\n"],
2270
2297
  changeDetection: i0.ChangeDetectionStrategy.OnPush
2271
2298
  });
2272
2299
  }
@@ -2285,8 +2312,8 @@ i0.ɵɵngDeclareClassMetadata({
2285
2312
  host: { "(document:keydown)": "onKeydown($event)" },
2286
2313
  template: `
2287
2314
  @if (open()) {
2288
- <div class="m-backdrop" (click)="close.emit()"></div>
2289
- <div class="m-modal" role="dialog" aria-modal="true" tabindex="-1" [attr.aria-labelledby]="titleId" [style.max-width]="maxWidth()">
2315
+ <div class="m-backdrop" (click)="closable() && close.emit()"></div>
2316
+ <div class="m-modal" role="dialog" aria-modal="true" tabindex="-1" [attr.aria-labelledby]="titleId" [attr.data-testid]="dialogTestId() || null" [style.max-width]="maxWidth()">
2290
2317
  <div class="m-header">
2291
2318
  <div class="m-header-text">
2292
2319
  <h3 class="m-title" [id]="titleId">{{ title() }}</h3>
@@ -2294,23 +2321,26 @@ i0.ɵɵngDeclareClassMetadata({
2294
2321
  <p class="m-description">{{ description() }}</p>
2295
2322
  }
2296
2323
  </div>
2297
- <button class="m-close" type="button" aria-label="Close" (click)="close.emit()">
2298
- <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
2299
- <line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/>
2300
- </svg>
2301
- </button>
2324
+ @if (!hideClose() && closable()) {
2325
+ <button class="m-close" type="button" aria-label="Close" (click)="close.emit()">
2326
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
2327
+ <line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/>
2328
+ </svg>
2329
+ </button>
2330
+ }
2302
2331
  </div>
2303
2332
  <div class="m-body" [style.overflow-y]="bodyOverflow()">
2304
2333
  <ng-content />
2305
2334
  </div>
2306
2335
  <div class="m-footer">
2307
2336
  <div class="m-footer-left"><ng-content select="[modal-footer-left]" /></div>
2337
+ <div class="m-footer-center"><ng-content select="[modal-footer-center]" /></div>
2308
2338
  <div class="m-footer-right"><ng-content select="[modal-footer-right]" /></div>
2309
2339
  </div>
2310
2340
  </div>
2311
2341
  }
2312
2342
  `,
2313
- styles: [".m-backdrop{position:fixed;inset:0;background:#02081773;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);z-index:200;animation:m-fade .18s ease}.m-modal:focus{outline:none}.m-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;border-radius:16px;border:1px solid rgba(0,0,0,.07);z-index:201;width:calc(100% - 32px);box-shadow:0 4px 6px #0000000a,0 16px 32px #0000001f,0 48px 96px #0000001a;max-height:calc(100vh - 48px);max-height:calc(100dvh - 48px);display:flex;flex-direction:column;animation:m-scale .22s cubic-bezier(.16,1,.3,1)}.m-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0;border-radius:16px 16px 0 0;flex-shrink:0}.m-header-text{display:flex;flex-direction:column;gap:3px;flex:1;min-width:0}.m-title{font-size:1.125rem;font-weight:700;color:#0f172a;margin:0;letter-spacing:-.02em;line-height:1.3}.m-description{font-size:.8125rem;color:#64748b;margin:0;line-height:1.4}.m-close{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:8px;border:none;background:none;cursor:pointer;color:#94a3b8;flex-shrink:0;margin-left:12px;transition:background .13s,color .13s}.m-close:hover{background:#f1f5f9;color:#1e293b}.m-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.m-body{padding:20px 24px;overflow-y:auto;flex:1;min-height:0;font-size:.9rem;color:#475569;line-height:1.65}.m-footer{padding:14px 24px 18px;background:#f8fafc;border-top:1px solid #e2e8f0;border-radius:0 0 16px 16px;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;gap:8px}.m-footer:not(:has(*)){display:none}.m-footer-left{display:flex;align-items:center;gap:8px}.m-footer-right{display:flex;align-items:center;gap:8px;margin-left:auto}@media(max-width:480px){.m-modal{top:auto;bottom:var(--ui-kb, 0px);left:0;right:0;transform:none;width:100vw;max-width:none!important;max-height:min(85dvh,var(--ui-vvh, 100dvh));border-radius:20px 20px 0 0;animation:m-up .24s cubic-bezier(.16,1,.3,1)}.m-footer{border-radius:0;flex-direction:column-reverse;align-items:stretch;padding-bottom:max(18px,env(safe-area-inset-bottom))}}@media(pointer:coarse),(max-width:480px){.m-close{position:relative}.m-close:after{content:\"\";position:absolute;inset:-7px}}@keyframes m-fade{0%{opacity:0}to{opacity:1}}@keyframes m-scale{0%{opacity:0;transform:translate(-50%,-48%) scale(.96)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}@keyframes m-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}\n"]
2343
+ styles: [".m-backdrop{position:fixed;inset:0;background:#02081773;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);z-index:200;animation:m-fade .18s ease}.m-modal:focus{outline:none}.m-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;border-radius:16px;border:1px solid rgba(0,0,0,.07);z-index:201;width:calc(100% - 32px);box-shadow:0 4px 6px #0000000a,0 16px 32px #0000001f,0 48px 96px #0000001a;max-height:calc(100vh - 48px);max-height:calc(100dvh - 48px);display:flex;flex-direction:column;animation:m-scale .22s cubic-bezier(.16,1,.3,1)}.m-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0;border-radius:16px 16px 0 0;flex-shrink:0}.m-header-text{display:flex;flex-direction:column;gap:3px;flex:1;min-width:0}.m-title{font-size:1.125rem;font-weight:700;color:#0f172a;margin:0;letter-spacing:-.02em;line-height:1.3}.m-description{font-size:.8125rem;color:#64748b;margin:0;line-height:1.4}.m-close{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:8px;border:none;background:none;cursor:pointer;color:#94a3b8;flex-shrink:0;margin-left:12px;transition:background .13s,color .13s}.m-close:hover{background:#f1f5f9;color:#1e293b}.m-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.m-body{padding:20px 24px;overflow-y:auto;flex:1;min-height:0;font-size:.9rem;color:#475569;line-height:1.65}.m-footer{padding:14px 24px 18px;background:#f8fafc;border-top:1px solid #e2e8f0;border-radius:0 0 16px 16px;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;gap:8px}.m-footer:not(:has(*)){display:none}.m-footer-left{display:flex;align-items:center;gap:8px}.m-footer-right{display:flex;align-items:center;gap:8px;margin-left:auto}.m-footer-center{display:flex;align-items:center;justify-content:center;gap:8px;flex:1 1 auto;margin:0 8px}.m-footer-center:empty{display:none}@media(max-width:480px){.m-modal{top:auto;bottom:var(--ui-kb, 0px);left:0;right:0;transform:none;width:100vw;max-width:none!important;max-height:min(85dvh,var(--ui-vvh, 100dvh));border-radius:20px 20px 0 0;animation:m-up .24s cubic-bezier(.16,1,.3,1)}.m-footer{border-radius:0;flex-direction:column-reverse;align-items:stretch;padding-bottom:max(18px,env(safe-area-inset-bottom))}}@media(pointer:coarse),(max-width:480px){.m-close{position:relative}.m-close:after{content:\"\";position:absolute;inset:-7px}}@keyframes m-fade{0%{opacity:0}to{opacity:1}}@keyframes m-scale{0%{opacity:0;transform:translate(-50%,-48%) scale(.96)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}@keyframes m-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}\n"]
2314
2344
  }]
2315
2345
  }],
2316
2346
  ctorParameters: () => [],
@@ -2355,12 +2385,71 @@ i0.ɵɵngDeclareClassMetadata({
2355
2385
  required: false
2356
2386
  }]
2357
2387
  }],
2388
+ dialogTestId: [{
2389
+ type: i0.Input,
2390
+ args: [{
2391
+ isSignal: true,
2392
+ alias: "dialogTestId",
2393
+ required: false
2394
+ }]
2395
+ }],
2396
+ hideClose: [{
2397
+ type: i0.Input,
2398
+ args: [{
2399
+ isSignal: true,
2400
+ alias: "hideClose",
2401
+ required: false
2402
+ }]
2403
+ }],
2404
+ closable: [{
2405
+ type: i0.Input,
2406
+ args: [{
2407
+ isSignal: true,
2408
+ alias: "closable",
2409
+ required: false
2410
+ }]
2411
+ }],
2358
2412
  close: [{
2359
2413
  type: i0.Output,
2360
2414
  args: ["close"]
2361
2415
  }]
2362
2416
  }
2363
2417
  });
2418
+ var CheckboxTrailingDirective = class CheckboxTrailingDirective {
2419
+ static {
2420
+ this.ɵfac = i0.ɵɵngDeclareFactory({
2421
+ minVersion: "12.0.0",
2422
+ version: "22.2.2",
2423
+ ngImport: i0,
2424
+ type: CheckboxTrailingDirective,
2425
+ deps: [],
2426
+ target: i0.ɵɵFactoryTarget.Directive
2427
+ });
2428
+ }
2429
+ static {
2430
+ this.ɵdir = i0.ɵɵngDeclareDirective({
2431
+ minVersion: "14.0.0",
2432
+ version: "22.2.2",
2433
+ type: CheckboxTrailingDirective,
2434
+ isStandalone: true,
2435
+ selector: "[checkbox-trailing]",
2436
+ ngImport: i0
2437
+ });
2438
+ }
2439
+ };
2440
+ i0.ɵɵngDeclareClassMetadata({
2441
+ minVersion: "12.0.0",
2442
+ version: "22.2.2",
2443
+ ngImport: i0,
2444
+ type: CheckboxTrailingDirective,
2445
+ decorators: [{
2446
+ type: Directive,
2447
+ args: [{
2448
+ selector: "[checkbox-trailing]",
2449
+ standalone: true
2450
+ }]
2451
+ }]
2452
+ });
2364
2453
  var UiFieldValidity = class {};
2365
2454
  function issueToErrors(issue) {
2366
2455
  return issue ? { [issue.key]: issue.value ?? true } : null;
@@ -2467,6 +2556,17 @@ var CheckboxComponent = class CheckboxComponent {
2467
2556
  this.checked = model(false, ...ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []);
2468
2557
  this.options = input([], ...ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []);
2469
2558
  this.legend = input("", ...ngDevMode ? [{ debugName: "legend" }] : /* istanbul ignore next */ []);
2559
+ this._legend = computed(() => this.legend() || (this._host.nativeElement.tagName === "UI-CHECKBOX-GROUP" ? this.label() : ""), ...ngDevMode ? [{ debugName: "_legend" }] : /* istanbul ignore next */ []);
2560
+ this.orientation = input("vertical", ...ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []);
2561
+ this.values = model(void 0, ...ngDevMode ? [{ debugName: "values" }] : /* istanbul ignore next */ []);
2562
+ this.description = input("", ...ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []);
2563
+ this._trailingContent = contentChild(CheckboxTrailingDirective, ...ngDevMode ? [{ debugName: "_trailingContent" }] : /* istanbul ignore next */ []);
2564
+ this._trailing = computed(() => !this.groupMode() && !!this._trailingContent(), ...ngDevMode ? [{ debugName: "_trailing" }] : /* istanbul ignore next */ []);
2565
+ this._host = inject(ElementRef);
2566
+ this._singleDescribedBy = computed(() => {
2567
+ const ids = [this.description() ? this._descId + "-d" : "", this._activeError() || this.hint() ? this._descId : ""].filter(Boolean);
2568
+ return ids.length ? ids.join(" ") : null;
2569
+ }, ...ngDevMode ? [{ debugName: "_singleDescribedBy" }] : /* istanbul ignore next */ []);
2470
2570
  this.indent = input(false, ...ngDevMode ? [{ debugName: "indent" }] : /* istanbul ignore next */ []);
2471
2571
  this.groupMode = computed(() => this.options().length > 0, ...ngDevMode ? [{ debugName: "groupMode" }] : /* istanbul ignore next */ []);
2472
2572
  this._selected = signal([], ...ngDevMode ? [{ debugName: "_selected" }] : /* istanbul ignore next */ []);
@@ -2494,6 +2594,32 @@ var CheckboxComponent = class CheckboxComponent {
2494
2594
  effect(() => {
2495
2595
  this.invalidChange.emit(this.invalid());
2496
2596
  });
2597
+ effect(() => {
2598
+ const v = this.values();
2599
+ if (!v) return;
2600
+ const next = this.inOptionOrder(v);
2601
+ const cur = this._selected();
2602
+ if (next.length !== cur.length || next.some((x, i) => x !== cur[i])) this._selected.set(next);
2603
+ });
2604
+ }
2605
+ reset(value = false) {
2606
+ if (this.groupMode()) {
2607
+ const next = this.inOptionOrder(Array.isArray(value) ? value : []);
2608
+ this._selected.set(next);
2609
+ if (this.values() !== void 0) this.values.set(next);
2610
+ this._syncNative((opt) => next.includes(opt));
2611
+ this.onChange(next);
2612
+ } else {
2613
+ const on = Array.isArray(value) ? value.length > 0 : !!value;
2614
+ this.checked.set(on);
2615
+ this._syncNative(() => on);
2616
+ this.onChange(on);
2617
+ }
2618
+ }
2619
+ _syncNative(isOn) {
2620
+ this._host.nativeElement.querySelectorAll("input[type=\"checkbox\"]").forEach((el) => {
2621
+ el.checked = this.groupMode() ? isOn(el.getAttribute("value") ?? "") : isOn("");
2622
+ });
2497
2623
  }
2498
2624
  ngOnChanges() {
2499
2625
  this._onValidatorChange();
@@ -2511,7 +2637,7 @@ var CheckboxComponent = class CheckboxComponent {
2511
2637
  return rm ? {
2512
2638
  key: "required",
2513
2639
  message: rm
2514
- } : requiredIssue(this.groupMode() ? this.legend() : this.label());
2640
+ } : requiredIssue(this.groupMode() ? this._legend() : this.label());
2515
2641
  }
2516
2642
  writeValue(val) {
2517
2643
  if (Array.isArray(val)) this._selected.set(this.inOptionOrder(val));
@@ -2544,6 +2670,7 @@ var CheckboxComponent = class CheckboxComponent {
2544
2670
  const on = event.target.checked;
2545
2671
  const next = this.inOptionOrder(on ? [...this._selected(), value] : this._selected().filter((v) => v !== value));
2546
2672
  this._selected.set(next);
2673
+ if (this.values() !== void 0) this.values.set(next);
2547
2674
  this.onChange(next);
2548
2675
  this.onTouched();
2549
2676
  this._reveal.touched.set(true);
@@ -2564,7 +2691,7 @@ var CheckboxComponent = class CheckboxComponent {
2564
2691
  version: "22.2.2",
2565
2692
  type: CheckboxComponent,
2566
2693
  isStandalone: true,
2567
- selector: "ui-checkbox",
2694
+ selector: "ui-checkbox, ui-checkbox-group",
2568
2695
  inputs: {
2569
2696
  label: {
2570
2697
  classPropertyName: "label",
@@ -2608,6 +2735,27 @@ var CheckboxComponent = class CheckboxComponent {
2608
2735
  isRequired: false,
2609
2736
  transformFunction: null
2610
2737
  },
2738
+ orientation: {
2739
+ classPropertyName: "orientation",
2740
+ publicName: "orientation",
2741
+ isSignal: true,
2742
+ isRequired: false,
2743
+ transformFunction: null
2744
+ },
2745
+ values: {
2746
+ classPropertyName: "values",
2747
+ publicName: "values",
2748
+ isSignal: true,
2749
+ isRequired: false,
2750
+ transformFunction: null
2751
+ },
2752
+ description: {
2753
+ classPropertyName: "description",
2754
+ publicName: "description",
2755
+ isSignal: true,
2756
+ isRequired: false,
2757
+ transformFunction: null
2758
+ },
2611
2759
  indent: {
2612
2760
  classPropertyName: "indent",
2613
2761
  publicName: "indent",
@@ -2660,6 +2808,7 @@ var CheckboxComponent = class CheckboxComponent {
2660
2808
  },
2661
2809
  outputs: {
2662
2810
  checked: "checkedChange",
2811
+ values: "valuesChange",
2663
2812
  invalidChange: "invalidChange"
2664
2813
  },
2665
2814
  providers: [
@@ -2678,6 +2827,13 @@ var CheckboxComponent = class CheckboxComponent {
2678
2827
  useExisting: forwardRef(() => CheckboxComponent)
2679
2828
  }
2680
2829
  ],
2830
+ queries: [{
2831
+ propertyName: "_trailingContent",
2832
+ first: true,
2833
+ predicate: CheckboxTrailingDirective,
2834
+ descendants: true,
2835
+ isSignal: true
2836
+ }],
2681
2837
  usesOnChanges: true,
2682
2838
  ngImport: i0,
2683
2839
  template: `
@@ -2685,10 +2841,10 @@ var CheckboxComponent = class CheckboxComponent {
2685
2841
  <fieldset class="cb-group" [class.cb-indent]="indent()" [class.cb-error]="_activeError()" [disabled]="disabled()"
2686
2842
  [attr.aria-required]="required() ? 'true' : null" [attr.aria-invalid]="_activeError() ? 'true' : null"
2687
2843
  [attr.aria-describedby]="(_activeError() || hint()) ? _descId : null">
2688
- @if (legend()) {
2689
- <legend class="cb-legend">{{ legend() }}@if (required()) { <span class="cb-required" aria-hidden="true">*</span> }</legend>
2844
+ @if (_legend()) {
2845
+ <legend class="cb-legend">{{ _legend() }}@if (required()) { <span class="cb-required" aria-hidden="true">*</span> }</legend>
2690
2846
  }
2691
- <div class="cb-options">
2847
+ <div class="cb-options" [class.cb-horizontal]="orientation() === 'horizontal'">
2692
2848
  @for (opt of options(); track opt.value; let i = $index) {
2693
2849
  <div class="cb-option">
2694
2850
  <label class="cb-wrap" [class.cb-disabled]="disabled() || opt.disabled">
@@ -2703,6 +2859,8 @@ var CheckboxComponent = class CheckboxComponent {
2703
2859
  type="checkbox"
2704
2860
  class="cb-hidden"
2705
2861
  [checked]="isSelected(opt.value)"
2862
+ [attr.value]="opt.value"
2863
+ [attr.data-testid]="opt.testId || null"
2706
2864
  [disabled]="disabled() || !!opt.disabled"
2707
2865
  [attr.aria-describedby]="opt.description ? _descId + '-' + i : null"
2708
2866
  (change)="onToggleOption(opt.value, $event)"
@@ -2722,7 +2880,8 @@ var CheckboxComponent = class CheckboxComponent {
2722
2880
  }
2723
2881
  </fieldset>
2724
2882
  } @else {
2725
- <div class="cb-field" [class.cb-indent]="indent()" [class.cb-error]="_activeError()">
2883
+ <div class="cb-field" [class.cb-indent]="indent()" [class.cb-error]="_activeError()" [class.cb-has-trailing]="_trailing()">
2884
+ <ng-template #labelRow>
2726
2885
  <label class="cb-wrap" [class.cb-disabled]="disabled()">
2727
2886
  <span class="cb-box" [class.cb-checked]="checked()" [class.cb-indeterminate]="indeterminate() && !checked()" [class.cb-disabled]="disabled()">
2728
2887
  @if (checked()) {
@@ -2744,7 +2903,7 @@ var CheckboxComponent = class CheckboxComponent {
2744
2903
  [attr.aria-checked]="indeterminate() && !checked() ? 'mixed' : null"
2745
2904
  [attr.aria-required]="required() ? 'true' : null"
2746
2905
  [attr.aria-invalid]="_activeError() ? 'true' : null"
2747
- [attr.aria-describedby]="(_activeError() || hint()) ? _descId : null"
2906
+ [attr.aria-describedby]="_singleDescribedBy()"
2748
2907
  (change)="onToggle($event)"
2749
2908
  />
2750
2909
  @if (label()) {
@@ -2752,6 +2911,18 @@ var CheckboxComponent = class CheckboxComponent {
2752
2911
  }
2753
2912
  <ng-content />
2754
2913
  </label>
2914
+ </ng-template>
2915
+ @if (_trailing()) {
2916
+ <div class="cb-row">
2917
+ <ng-container [ngTemplateOutlet]="labelRow" />
2918
+ <span class="cb-trailing"><ng-content select="[checkbox-trailing]" /></span>
2919
+ </div>
2920
+ } @else {
2921
+ <ng-container [ngTemplateOutlet]="labelRow" />
2922
+ }
2923
+ @if (description()) {
2924
+ <p class="cb-desc" [id]="_descId + '-d'">{{ description() }}</p>
2925
+ }
2755
2926
  @if (_activeError()) {
2756
2927
  <p class="cb-desc cb-desc-error" [id]="_descId" role="alert">{{ _activeError() }}</p>
2757
2928
  } @else if (hint()) {
@@ -2761,7 +2932,17 @@ var CheckboxComponent = class CheckboxComponent {
2761
2932
  }
2762
2933
  `,
2763
2934
  isInline: true,
2764
- styles: [".cb-field{display:inline-flex;flex-direction:column;gap:4px}.cb-group{display:flex;flex-direction:column;gap:8px;margin:0;padding:0;border:0;min-width:0}.cb-legend{padding:0;margin:0 0 8px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1.2}.cb-required{color:#ef4444;margin-left:2px}.cb-options{display:flex;flex-direction:column;gap:10px}.cb-option{display:flex;flex-direction:column;gap:4px}.cb-group-desc{margin-left:0}.cb-indent{margin-left:29px}.cb-desc{margin:0 0 0 29px;font-size:.75rem;line-height:1.4;color:#64748b}.cb-desc-error{color:#ef4444}.cb-error .cb-box:not(.cb-checked){border-color:#ef4444}.cb-wrap{display:inline-flex;align-items:center;gap:9px;cursor:pointer;-webkit-user-select:none;user-select:none}.cb-wrap.cb-disabled{cursor:not-allowed;opacity:.5}.cb-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.cb-wrap:has(.cb-hidden:focus-visible) .cb-box{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.cb-wrap{position:relative}.cb-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:50%;transform:translateY(-50%);opacity:0;cursor:pointer;z-index:1}.cb-wrap.cb-disabled .cb-hidden{cursor:not-allowed}}.cb-box{flex-shrink:0;width:20px;height:20px;border:2px solid #cbd5e1;border-radius:5px;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.cb-box.cb-checked,.cb-box.cb-indeterminate{background:#3b82f6;border-color:#3b82f6}.cb-wrap:hover .cb-box:not(.cb-checked):not(.cb-disabled){border-color:#3b82f6}@media(max-width:640px),(pointer:coarse){.cb-box{position:relative}.cb-box:after{content:\"\";position:absolute;inset:-12px}}.cb-label{font-size:.875rem;color:#334155;line-height:1.4}\n"],
2935
+ styles: [".cb-field{display:inline-flex;flex-direction:column;gap:4px}.cb-group{display:flex;flex-direction:column;gap:8px;margin:0;padding:0;border:0;min-width:0}.cb-legend{padding:0;margin:0 0 8px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1.2}.cb-required{color:#ef4444;margin-left:2px}.cb-options{display:flex;flex-direction:column;gap:10px}.cb-options.cb-horizontal{flex-direction:row;flex-wrap:wrap;gap:8px 20px}.cb-field.cb-has-trailing{display:flex}.cb-row{display:flex;align-items:center;justify-content:space-between;gap:12px}.cb-trailing{display:inline-flex;align-items:center;flex-shrink:0}.cb-option{display:flex;flex-direction:column;gap:4px}.cb-group-desc{margin-left:0}.cb-indent{margin-left:29px}.cb-desc{margin:0 0 0 29px;font-size:.75rem;line-height:1.4;color:#64748b}.cb-desc-error{color:#ef4444}.cb-error .cb-box:not(.cb-checked){border-color:#ef4444}.cb-wrap{display:inline-flex;align-items:center;gap:9px;cursor:pointer;-webkit-user-select:none;user-select:none}.cb-wrap.cb-disabled{cursor:not-allowed;opacity:.5}.cb-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.cb-wrap:has(.cb-hidden:focus-visible) .cb-box{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.cb-wrap{position:relative}.cb-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:50%;transform:translateY(-50%);opacity:0;cursor:pointer;z-index:1}.cb-wrap.cb-disabled .cb-hidden{cursor:not-allowed}}.cb-box{flex-shrink:0;width:20px;height:20px;border:2px solid #cbd5e1;border-radius:5px;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.cb-box.cb-checked,.cb-box.cb-indeterminate{background:#3b82f6;border-color:#3b82f6}.cb-wrap:hover .cb-box:not(.cb-checked):not(.cb-disabled){border-color:#3b82f6}@media(max-width:640px),(pointer:coarse){.cb-box{position:relative}.cb-box:after{content:\"\";position:absolute;inset:-12px}}.cb-label{font-size:.875rem;color:#334155;line-height:1.4}\n"],
2936
+ dependencies: [{
2937
+ kind: "directive",
2938
+ type: NgTemplateOutlet,
2939
+ selector: "[ngTemplateOutlet]",
2940
+ inputs: [
2941
+ "ngTemplateOutletContext",
2942
+ "ngTemplateOutlet",
2943
+ "ngTemplateOutletInjector"
2944
+ ]
2945
+ }],
2765
2946
  changeDetection: i0.ChangeDetectionStrategy.OnPush
2766
2947
  });
2767
2948
  }
@@ -2774,8 +2955,9 @@ i0.ɵɵngDeclareClassMetadata({
2774
2955
  decorators: [{
2775
2956
  type: Component,
2776
2957
  args: [{
2777
- selector: "ui-checkbox",
2958
+ selector: "ui-checkbox, ui-checkbox-group",
2778
2959
  standalone: true,
2960
+ imports: [NgTemplateOutlet],
2779
2961
  changeDetection: ChangeDetectionStrategy.OnPush,
2780
2962
  providers: [
2781
2963
  {
@@ -2798,10 +2980,10 @@ i0.ɵɵngDeclareClassMetadata({
2798
2980
  <fieldset class="cb-group" [class.cb-indent]="indent()" [class.cb-error]="_activeError()" [disabled]="disabled()"
2799
2981
  [attr.aria-required]="required() ? 'true' : null" [attr.aria-invalid]="_activeError() ? 'true' : null"
2800
2982
  [attr.aria-describedby]="(_activeError() || hint()) ? _descId : null">
2801
- @if (legend()) {
2802
- <legend class="cb-legend">{{ legend() }}@if (required()) { <span class="cb-required" aria-hidden="true">*</span> }</legend>
2983
+ @if (_legend()) {
2984
+ <legend class="cb-legend">{{ _legend() }}@if (required()) { <span class="cb-required" aria-hidden="true">*</span> }</legend>
2803
2985
  }
2804
- <div class="cb-options">
2986
+ <div class="cb-options" [class.cb-horizontal]="orientation() === 'horizontal'">
2805
2987
  @for (opt of options(); track opt.value; let i = $index) {
2806
2988
  <div class="cb-option">
2807
2989
  <label class="cb-wrap" [class.cb-disabled]="disabled() || opt.disabled">
@@ -2816,6 +2998,8 @@ i0.ɵɵngDeclareClassMetadata({
2816
2998
  type="checkbox"
2817
2999
  class="cb-hidden"
2818
3000
  [checked]="isSelected(opt.value)"
3001
+ [attr.value]="opt.value"
3002
+ [attr.data-testid]="opt.testId || null"
2819
3003
  [disabled]="disabled() || !!opt.disabled"
2820
3004
  [attr.aria-describedby]="opt.description ? _descId + '-' + i : null"
2821
3005
  (change)="onToggleOption(opt.value, $event)"
@@ -2835,7 +3019,8 @@ i0.ɵɵngDeclareClassMetadata({
2835
3019
  }
2836
3020
  </fieldset>
2837
3021
  } @else {
2838
- <div class="cb-field" [class.cb-indent]="indent()" [class.cb-error]="_activeError()">
3022
+ <div class="cb-field" [class.cb-indent]="indent()" [class.cb-error]="_activeError()" [class.cb-has-trailing]="_trailing()">
3023
+ <ng-template #labelRow>
2839
3024
  <label class="cb-wrap" [class.cb-disabled]="disabled()">
2840
3025
  <span class="cb-box" [class.cb-checked]="checked()" [class.cb-indeterminate]="indeterminate() && !checked()" [class.cb-disabled]="disabled()">
2841
3026
  @if (checked()) {
@@ -2857,7 +3042,7 @@ i0.ɵɵngDeclareClassMetadata({
2857
3042
  [attr.aria-checked]="indeterminate() && !checked() ? 'mixed' : null"
2858
3043
  [attr.aria-required]="required() ? 'true' : null"
2859
3044
  [attr.aria-invalid]="_activeError() ? 'true' : null"
2860
- [attr.aria-describedby]="(_activeError() || hint()) ? _descId : null"
3045
+ [attr.aria-describedby]="_singleDescribedBy()"
2861
3046
  (change)="onToggle($event)"
2862
3047
  />
2863
3048
  @if (label()) {
@@ -2865,6 +3050,18 @@ i0.ɵɵngDeclareClassMetadata({
2865
3050
  }
2866
3051
  <ng-content />
2867
3052
  </label>
3053
+ </ng-template>
3054
+ @if (_trailing()) {
3055
+ <div class="cb-row">
3056
+ <ng-container [ngTemplateOutlet]="labelRow" />
3057
+ <span class="cb-trailing"><ng-content select="[checkbox-trailing]" /></span>
3058
+ </div>
3059
+ } @else {
3060
+ <ng-container [ngTemplateOutlet]="labelRow" />
3061
+ }
3062
+ @if (description()) {
3063
+ <p class="cb-desc" [id]="_descId + '-d'">{{ description() }}</p>
3064
+ }
2868
3065
  @if (_activeError()) {
2869
3066
  <p class="cb-desc cb-desc-error" [id]="_descId" role="alert">{{ _activeError() }}</p>
2870
3067
  } @else if (hint()) {
@@ -2873,7 +3070,7 @@ i0.ɵɵngDeclareClassMetadata({
2873
3070
  </div>
2874
3071
  }
2875
3072
  `,
2876
- styles: [".cb-field{display:inline-flex;flex-direction:column;gap:4px}.cb-group{display:flex;flex-direction:column;gap:8px;margin:0;padding:0;border:0;min-width:0}.cb-legend{padding:0;margin:0 0 8px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1.2}.cb-required{color:#ef4444;margin-left:2px}.cb-options{display:flex;flex-direction:column;gap:10px}.cb-option{display:flex;flex-direction:column;gap:4px}.cb-group-desc{margin-left:0}.cb-indent{margin-left:29px}.cb-desc{margin:0 0 0 29px;font-size:.75rem;line-height:1.4;color:#64748b}.cb-desc-error{color:#ef4444}.cb-error .cb-box:not(.cb-checked){border-color:#ef4444}.cb-wrap{display:inline-flex;align-items:center;gap:9px;cursor:pointer;-webkit-user-select:none;user-select:none}.cb-wrap.cb-disabled{cursor:not-allowed;opacity:.5}.cb-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.cb-wrap:has(.cb-hidden:focus-visible) .cb-box{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.cb-wrap{position:relative}.cb-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:50%;transform:translateY(-50%);opacity:0;cursor:pointer;z-index:1}.cb-wrap.cb-disabled .cb-hidden{cursor:not-allowed}}.cb-box{flex-shrink:0;width:20px;height:20px;border:2px solid #cbd5e1;border-radius:5px;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.cb-box.cb-checked,.cb-box.cb-indeterminate{background:#3b82f6;border-color:#3b82f6}.cb-wrap:hover .cb-box:not(.cb-checked):not(.cb-disabled){border-color:#3b82f6}@media(max-width:640px),(pointer:coarse){.cb-box{position:relative}.cb-box:after{content:\"\";position:absolute;inset:-12px}}.cb-label{font-size:.875rem;color:#334155;line-height:1.4}\n"]
3073
+ styles: [".cb-field{display:inline-flex;flex-direction:column;gap:4px}.cb-group{display:flex;flex-direction:column;gap:8px;margin:0;padding:0;border:0;min-width:0}.cb-legend{padding:0;margin:0 0 8px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1.2}.cb-required{color:#ef4444;margin-left:2px}.cb-options{display:flex;flex-direction:column;gap:10px}.cb-options.cb-horizontal{flex-direction:row;flex-wrap:wrap;gap:8px 20px}.cb-field.cb-has-trailing{display:flex}.cb-row{display:flex;align-items:center;justify-content:space-between;gap:12px}.cb-trailing{display:inline-flex;align-items:center;flex-shrink:0}.cb-option{display:flex;flex-direction:column;gap:4px}.cb-group-desc{margin-left:0}.cb-indent{margin-left:29px}.cb-desc{margin:0 0 0 29px;font-size:.75rem;line-height:1.4;color:#64748b}.cb-desc-error{color:#ef4444}.cb-error .cb-box:not(.cb-checked){border-color:#ef4444}.cb-wrap{display:inline-flex;align-items:center;gap:9px;cursor:pointer;-webkit-user-select:none;user-select:none}.cb-wrap.cb-disabled{cursor:not-allowed;opacity:.5}.cb-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.cb-wrap:has(.cb-hidden:focus-visible) .cb-box{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.cb-wrap{position:relative}.cb-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:50%;transform:translateY(-50%);opacity:0;cursor:pointer;z-index:1}.cb-wrap.cb-disabled .cb-hidden{cursor:not-allowed}}.cb-box{flex-shrink:0;width:20px;height:20px;border:2px solid #cbd5e1;border-radius:5px;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.cb-box.cb-checked,.cb-box.cb-indeterminate{background:#3b82f6;border-color:#3b82f6}.cb-wrap:hover .cb-box:not(.cb-checked):not(.cb-disabled){border-color:#3b82f6}@media(max-width:640px),(pointer:coarse){.cb-box{position:relative}.cb-box:after{content:\"\";position:absolute;inset:-12px}}.cb-label{font-size:.875rem;color:#334155;line-height:1.4}\n"]
2877
3074
  }]
2878
3075
  }],
2879
3076
  ctorParameters: () => [],
@@ -2929,6 +3126,37 @@ i0.ɵɵngDeclareClassMetadata({
2929
3126
  required: false
2930
3127
  }]
2931
3128
  }],
3129
+ orientation: [{
3130
+ type: i0.Input,
3131
+ args: [{
3132
+ isSignal: true,
3133
+ alias: "orientation",
3134
+ required: false
3135
+ }]
3136
+ }],
3137
+ values: [{
3138
+ type: i0.Input,
3139
+ args: [{
3140
+ isSignal: true,
3141
+ alias: "values",
3142
+ required: false
3143
+ }]
3144
+ }, {
3145
+ type: i0.Output,
3146
+ args: ["valuesChange"]
3147
+ }],
3148
+ description: [{
3149
+ type: i0.Input,
3150
+ args: [{
3151
+ isSignal: true,
3152
+ alias: "description",
3153
+ required: false
3154
+ }]
3155
+ }],
3156
+ _trailingContent: [{
3157
+ type: i0.ContentChild,
3158
+ args: [i0.forwardRef(() => CheckboxTrailingDirective), { isSignal: true }]
3159
+ }],
2932
3160
  indent: [{
2933
3161
  type: i0.Input,
2934
3162
  args: [{
@@ -2996,6 +3224,7 @@ var ButtonComponent = class ButtonComponent {
2996
3224
  this.variant = input("primary", ...ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []);
2997
3225
  this.routerLink = input(null, ...ngDevMode ? [{ debugName: "routerLink" }] : /* istanbul ignore next */ []);
2998
3226
  this.queryParams = input(null, ...ngDevMode ? [{ debugName: "queryParams" }] : /* istanbul ignore next */ []);
3227
+ this.fragment = input(null, ...ngDevMode ? [{ debugName: "fragment" }] : /* istanbul ignore next */ []);
2999
3228
  this.href = input(null, ...ngDevMode ? [{ debugName: "href" }] : /* istanbul ignore next */ []);
3000
3229
  this.target = input(null, ...ngDevMode ? [{ debugName: "target" }] : /* istanbul ignore next */ []);
3001
3230
  this.rel = input(null, ...ngDevMode ? [{ debugName: "rel" }] : /* istanbul ignore next */ []);
@@ -3073,6 +3302,13 @@ var ButtonComponent = class ButtonComponent {
3073
3302
  isRequired: false,
3074
3303
  transformFunction: null
3075
3304
  },
3305
+ fragment: {
3306
+ classPropertyName: "fragment",
3307
+ publicName: "fragment",
3308
+ isSignal: true,
3309
+ isRequired: false,
3310
+ transformFunction: null
3311
+ },
3076
3312
  href: {
3077
3313
  classPropertyName: "href",
3078
3314
  publicName: "href",
@@ -3186,6 +3422,7 @@ var ButtonComponent = class ButtonComponent {
3186
3422
  transformFunction: null
3187
3423
  }
3188
3424
  },
3425
+ host: { properties: { "class.ui-btn-block": "variant() === 'ghost-start'" } },
3189
3426
  ngImport: i0,
3190
3427
  template: `
3191
3428
  <ng-template #content>
@@ -3196,14 +3433,26 @@ var ButtonComponent = class ButtonComponent {
3196
3433
  </ng-template>
3197
3434
  @if (routerLink() !== null) {
3198
3435
  <!-- A real link (middle-click, open in new tab, screen readers say "link"): same look as the button of this variant, underlined. -->
3199
- <a
3200
- [routerLink]="routerLink()"
3201
- [queryParams]="queryParams()"
3202
- [class]="'btn btn-anchor btn-' + variant() + ' btn-' + size()"
3203
- [class.btn-full]="fullWidth()"
3204
- [attr.aria-label]="ariaLabel()"
3205
- [attr.aria-describedby]="ariaDescribedBy() || null"
3206
- ><ng-container [ngTemplateOutlet]="content" /></a>
3436
+ @if (disabled() || loading()) {
3437
+ <!-- Like a disabled href: no href, so it cannot be clicked, middle-clicked or opened in a new tab. -->
3438
+ <span
3439
+ role="link" aria-disabled="true"
3440
+ [class]="'btn btn-anchor btn-' + variant() + ' btn-' + size()"
3441
+ [class.btn-full]="fullWidth()"
3442
+ [attr.aria-label]="ariaLabel()"
3443
+ [attr.aria-describedby]="ariaDescribedBy() || null"
3444
+ ><ng-container [ngTemplateOutlet]="content" /></span>
3445
+ } @else {
3446
+ <a
3447
+ [routerLink]="routerLink()"
3448
+ [queryParams]="queryParams()"
3449
+ [fragment]="fragment() ?? undefined"
3450
+ [class]="'btn btn-anchor btn-' + variant() + ' btn-' + size()"
3451
+ [class.btn-full]="fullWidth()"
3452
+ [attr.aria-label]="ariaLabel()"
3453
+ [attr.aria-describedby]="ariaDescribedBy() || null"
3454
+ ><ng-container [ngTemplateOutlet]="content" /></a>
3455
+ }
3207
3456
  } @else if (_safeHref() !== null) {
3208
3457
  <!-- A plain link (mailto:, tel:, https://…): the browser handles it, so middle-click, copy-link and "open in new tab" work. -->
3209
3458
  @if (disabled() || loading()) {
@@ -3242,7 +3491,7 @@ var ButtonComponent = class ButtonComponent {
3242
3491
  }
3243
3492
  `,
3244
3493
  isInline: true,
3245
- styles: [":host{display:inline-flex}.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 #3b82f6;outline-offset:2px}.btn-full{width:100%}.btn-primary{background:#3b82f6;color:#fff;border:1px solid #3B82F6}.btn-primary:hover:not(:disabled){background:#2563eb;border-color:#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-danger{background:#dc2626;color:#fff;border:1px solid #dc2626}.btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.btn-link{background:none;color:#3b82f6;border:none;padding:0;font-weight:500}.btn-link:hover:not(:disabled){color:#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:#3b82f6;border-bottom-color:#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"],
3494
+ 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 #3b82f6;outline-offset:2px}.btn-full{width:100%}.btn-primary{background:#3b82f6;color:#fff;border:1px solid #3B82F6}.btn-primary:hover:not(:disabled){background:#2563eb;border-color:#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:#3b82f6;border:none;padding:0;font-weight:500}.btn-link:hover:not(:disabled){color:#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:#3b82f6;border-bottom-color:#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"],
3246
3495
  dependencies: [{
3247
3496
  kind: "directive",
3248
3497
  type: NgTemplateOutlet,
@@ -3286,6 +3535,7 @@ i0.ɵɵngDeclareClassMetadata({
3286
3535
  selector: "ui-button",
3287
3536
  standalone: true,
3288
3537
  imports: [NgTemplateOutlet, RouterLink],
3538
+ host: { "[class.ui-btn-block]": "variant() === 'ghost-start'" },
3289
3539
  changeDetection: ChangeDetectionStrategy.OnPush,
3290
3540
  template: `
3291
3541
  <ng-template #content>
@@ -3296,14 +3546,26 @@ i0.ɵɵngDeclareClassMetadata({
3296
3546
  </ng-template>
3297
3547
  @if (routerLink() !== null) {
3298
3548
  <!-- A real link (middle-click, open in new tab, screen readers say "link"): same look as the button of this variant, underlined. -->
3299
- <a
3300
- [routerLink]="routerLink()"
3301
- [queryParams]="queryParams()"
3302
- [class]="'btn btn-anchor btn-' + variant() + ' btn-' + size()"
3303
- [class.btn-full]="fullWidth()"
3304
- [attr.aria-label]="ariaLabel()"
3305
- [attr.aria-describedby]="ariaDescribedBy() || null"
3306
- ><ng-container [ngTemplateOutlet]="content" /></a>
3549
+ @if (disabled() || loading()) {
3550
+ <!-- Like a disabled href: no href, so it cannot be clicked, middle-clicked or opened in a new tab. -->
3551
+ <span
3552
+ role="link" aria-disabled="true"
3553
+ [class]="'btn btn-anchor btn-' + variant() + ' btn-' + size()"
3554
+ [class.btn-full]="fullWidth()"
3555
+ [attr.aria-label]="ariaLabel()"
3556
+ [attr.aria-describedby]="ariaDescribedBy() || null"
3557
+ ><ng-container [ngTemplateOutlet]="content" /></span>
3558
+ } @else {
3559
+ <a
3560
+ [routerLink]="routerLink()"
3561
+ [queryParams]="queryParams()"
3562
+ [fragment]="fragment() ?? undefined"
3563
+ [class]="'btn btn-anchor btn-' + variant() + ' btn-' + size()"
3564
+ [class.btn-full]="fullWidth()"
3565
+ [attr.aria-label]="ariaLabel()"
3566
+ [attr.aria-describedby]="ariaDescribedBy() || null"
3567
+ ><ng-container [ngTemplateOutlet]="content" /></a>
3568
+ }
3307
3569
  } @else if (_safeHref() !== null) {
3308
3570
  <!-- A plain link (mailto:, tel:, https://…): the browser handles it, so middle-click, copy-link and "open in new tab" work. -->
3309
3571
  @if (disabled() || loading()) {
@@ -3341,7 +3603,7 @@ i0.ɵɵngDeclareClassMetadata({
3341
3603
  ><ng-container [ngTemplateOutlet]="content" /></button>
3342
3604
  }
3343
3605
  `,
3344
- styles: [":host{display:inline-flex}.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 #3b82f6;outline-offset:2px}.btn-full{width:100%}.btn-primary{background:#3b82f6;color:#fff;border:1px solid #3B82F6}.btn-primary:hover:not(:disabled){background:#2563eb;border-color:#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-danger{background:#dc2626;color:#fff;border:1px solid #dc2626}.btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.btn-link{background:none;color:#3b82f6;border:none;padding:0;font-weight:500}.btn-link:hover:not(:disabled){color:#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:#3b82f6;border-bottom-color:#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"]
3606
+ 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 #3b82f6;outline-offset:2px}.btn-full{width:100%}.btn-primary{background:#3b82f6;color:#fff;border:1px solid #3B82F6}.btn-primary:hover:not(:disabled){background:#2563eb;border-color:#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:#3b82f6;border:none;padding:0;font-weight:500}.btn-link:hover:not(:disabled){color:#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:#3b82f6;border-bottom-color:#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"]
3345
3607
  }]
3346
3608
  }],
3347
3609
  propDecorators: {
@@ -3369,6 +3631,14 @@ i0.ɵɵngDeclareClassMetadata({
3369
3631
  required: false
3370
3632
  }]
3371
3633
  }],
3634
+ fragment: [{
3635
+ type: i0.Input,
3636
+ args: [{
3637
+ isSignal: true,
3638
+ alias: "fragment",
3639
+ required: false
3640
+ }]
3641
+ }],
3372
3642
  href: [{
3373
3643
  type: i0.Input,
3374
3644
  args: [{
@@ -3499,6 +3769,7 @@ var TextInputComponent = class TextInputComponent {
3499
3769
  this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
3500
3770
  this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
3501
3771
  this.placeholder = input("", ...ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []);
3772
+ this.prefix = input("", ...ngDevMode ? [{ debugName: "prefix" }] : /* istanbul ignore next */ []);
3502
3773
  this.type = input("text", ...ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []);
3503
3774
  this.maxlength = input(void 0, ...ngDevMode ? [{ debugName: "maxlength" }] : /* istanbul ignore next */ []);
3504
3775
  this.required = input(false, ...ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []);
@@ -3513,6 +3784,7 @@ var TextInputComponent = class TextInputComponent {
3513
3784
  this.maxDecimals = input(void 0, ...ngDevMode ? [{ debugName: "maxDecimals" }] : /* istanbul ignore next */ []);
3514
3785
  this.step = input(void 0, ...ngDevMode ? [{ debugName: "step" }] : /* istanbul ignore next */ []);
3515
3786
  this.valueType = input("string", ...ngDevMode ? [{ debugName: "valueType" }] : /* istanbul ignore next */ []);
3787
+ this.formatter = input(void 0, ...ngDevMode ? [{ debugName: "formatter" }] : /* istanbul ignore next */ []);
3516
3788
  this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
3517
3789
  this.focused = output();
3518
3790
  this.blurred = output();
@@ -3525,6 +3797,7 @@ var TextInputComponent = class TextInputComponent {
3525
3797
  this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
3526
3798
  this._value = signal("", ...ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []);
3527
3799
  this._reveal = createFieldReveal(this.showErrors);
3800
+ this._prefixPadding = computed(() => this.prefix() ? `calc(12px + ${this.prefix().length}ch + 6px)` : null, ...ngDevMode ? [{ debugName: "_prefixPadding" }] : /* istanbul ignore next */ []);
3528
3801
  this._numeric = computed(() => this.valueType() === "number" && this.type() === "number", ...ngDevMode ? [{ debugName: "_numeric" }] : /* istanbul ignore next */ []);
3529
3802
  this._stepAttr = computed(() => {
3530
3803
  const step = this.step();
@@ -3579,10 +3852,20 @@ var TextInputComponent = class TextInputComponent {
3579
3852
  this._cvaDisabled.set(d);
3580
3853
  }
3581
3854
  onInput(event) {
3582
- const raw = event.target.value;
3583
- const val = this._formatting() ? TextInputComponent._formatPhone(raw) : raw;
3855
+ const input = event.target;
3856
+ const raw = input.value;
3857
+ let val = this._formatting() ? TextInputComponent._formatPhone(raw) : raw;
3858
+ const format = this.formatter();
3859
+ if (format) val = format(val);
3584
3860
  this._value.set(val);
3585
3861
  this._onChange(this._numeric() ? TextInputComponent._parse(val) : val);
3862
+ const shown = this._value();
3863
+ if (input.value !== shown) {
3864
+ input.value = shown;
3865
+ try {
3866
+ input.setSelectionRange(shown.length, shown.length);
3867
+ } catch {}
3868
+ }
3586
3869
  }
3587
3870
  static _parse(text) {
3588
3871
  const t = text.trim();
@@ -3700,6 +3983,13 @@ var TextInputComponent = class TextInputComponent {
3700
3983
  isRequired: false,
3701
3984
  transformFunction: null
3702
3985
  },
3986
+ prefix: {
3987
+ classPropertyName: "prefix",
3988
+ publicName: "prefix",
3989
+ isSignal: true,
3990
+ isRequired: false,
3991
+ transformFunction: null
3992
+ },
3703
3993
  type: {
3704
3994
  classPropertyName: "type",
3705
3995
  publicName: "type",
@@ -3798,6 +4088,13 @@ var TextInputComponent = class TextInputComponent {
3798
4088
  isRequired: false,
3799
4089
  transformFunction: null
3800
4090
  },
4091
+ formatter: {
4092
+ classPropertyName: "formatter",
4093
+ publicName: "formatter",
4094
+ isSignal: true,
4095
+ isRequired: false,
4096
+ transformFunction: null
4097
+ },
3801
4098
  showErrors: {
3802
4099
  classPropertyName: "showErrors",
3803
4100
  publicName: "showErrors",
@@ -3837,7 +4134,8 @@ var TextInputComponent = class TextInputComponent {
3837
4134
  usesOnChanges: true,
3838
4135
  ngImport: i0,
3839
4136
  template: `
3840
- <div class="ti-field" [class.ti-error]="_activeError()" [class.ti-disabled]="disabled()">
4137
+ <div class="ti-field" [class.ti-error]="_activeError()" [class.ti-disabled]="disabled()"
4138
+ [class.ti-prefixed]="!!prefix()" [style.--ti-input-row]="prefix() ? (label() ? 2 : 1) : null">
3841
4139
  @if (label()) {
3842
4140
  <label class="ti-label" [for]="_inputId">
3843
4141
  {{ label() }}
@@ -3846,6 +4144,7 @@ var TextInputComponent = class TextInputComponent {
3846
4144
  }
3847
4145
  <input
3848
4146
  class="ti-input"
4147
+ [style.padding-left]="_prefixPadding()"
3849
4148
  [id]="_inputId"
3850
4149
  [type]="type()"
3851
4150
  [attr.inputmode]="inputmode() || (type() === 'tel' ? 'tel' : null)"
@@ -3864,6 +4163,10 @@ var TextInputComponent = class TextInputComponent {
3864
4163
  (focus)="onFocus()"
3865
4164
  (blur)="onBlur()"
3866
4165
  />
4166
+ @if (prefix()) {
4167
+ <!-- Optional leading mark ("$"): a sibling after the input, laid over it by the grid of .ti-prefixed, so toggling it never recreates the input (focus and caret stay). -->
4168
+ <span class="ti-prefix" aria-hidden="true">{{ prefix() }}</span>
4169
+ }
3867
4170
  @if (_activeError()) {
3868
4171
  <p class="ti-desc ti-desc-error" [id]="_inputId + '-desc'" role="alert">{{ _activeError() }}</p>
3869
4172
  } @else if (hint()) {
@@ -3872,7 +4175,7 @@ var TextInputComponent = class TextInputComponent {
3872
4175
  </div>
3873
4176
  `,
3874
4177
  isInline: true,
3875
- styles: [":host{display:block}.ti-field{display:flex;flex-direction:column;gap:6px}.ti-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ti-required{color:#ef4444;margin-left:2px}.ti-input{width:100%;box-sizing:border-box;padding:9px 12px;font-size:.875rem;font-family:inherit;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px;outline:none;transition:border-color .15s,box-shadow .15s}.ti-input::placeholder{color:#94a3b8}.ti-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ti-input:read-only{background:#f8fafc;cursor:default}.ti-error .ti-input{border-color:#ef4444}.ti-error .ti-input:focus{box-shadow:0 0 0 3px #ef44441f}.ti-disabled .ti-input{opacity:.5;cursor:not-allowed}.ti-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ti-desc-error{color:#ef4444}@media(max-width:480px){.ti-input{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.ti-input{min-height:44px}}\n"],
4178
+ styles: [":host{display:block}.ti-field{display:flex;flex-direction:column;gap:6px}.ti-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ti-required{color:#ef4444;margin-left:2px}.ti-prefixed{display:grid;grid-template-columns:minmax(0,1fr)}.ti-prefixed .ti-input{grid-row:var(--ti-input-row);grid-column:1}.ti-prefix{grid-row:var(--ti-input-row);grid-column:1;justify-self:start;align-self:center;margin-left:12px;font-size:.875rem;line-height:1;color:#64748b;pointer-events:none}@media(max-width:480px){.ti-prefix{font-size:1rem}}.ti-disabled .ti-prefix{opacity:.5}.ti-input{width:100%;box-sizing:border-box;padding:9px 12px;font-size:.875rem;font-family:inherit;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px;outline:none;transition:border-color .15s,box-shadow .15s}.ti-input::placeholder{color:#94a3b8}.ti-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ti-input:read-only{background:#f8fafc;cursor:default}.ti-error .ti-input{border-color:#ef4444}.ti-error .ti-input:focus{box-shadow:0 0 0 3px #ef44441f}.ti-disabled .ti-input{opacity:.5;cursor:not-allowed}.ti-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ti-desc-error{color:#ef4444}@media(max-width:480px){.ti-input{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.ti-input{min-height:44px}}\n"],
3876
4179
  changeDetection: i0.ChangeDetectionStrategy.OnPush
3877
4180
  });
3878
4181
  }
@@ -3905,7 +4208,8 @@ i0.ɵɵngDeclareClassMetadata({
3905
4208
  }
3906
4209
  ],
3907
4210
  template: `
3908
- <div class="ti-field" [class.ti-error]="_activeError()" [class.ti-disabled]="disabled()">
4211
+ <div class="ti-field" [class.ti-error]="_activeError()" [class.ti-disabled]="disabled()"
4212
+ [class.ti-prefixed]="!!prefix()" [style.--ti-input-row]="prefix() ? (label() ? 2 : 1) : null">
3909
4213
  @if (label()) {
3910
4214
  <label class="ti-label" [for]="_inputId">
3911
4215
  {{ label() }}
@@ -3914,6 +4218,7 @@ i0.ɵɵngDeclareClassMetadata({
3914
4218
  }
3915
4219
  <input
3916
4220
  class="ti-input"
4221
+ [style.padding-left]="_prefixPadding()"
3917
4222
  [id]="_inputId"
3918
4223
  [type]="type()"
3919
4224
  [attr.inputmode]="inputmode() || (type() === 'tel' ? 'tel' : null)"
@@ -3932,6 +4237,10 @@ i0.ɵɵngDeclareClassMetadata({
3932
4237
  (focus)="onFocus()"
3933
4238
  (blur)="onBlur()"
3934
4239
  />
4240
+ @if (prefix()) {
4241
+ <!-- Optional leading mark ("$"): a sibling after the input, laid over it by the grid of .ti-prefixed, so toggling it never recreates the input (focus and caret stay). -->
4242
+ <span class="ti-prefix" aria-hidden="true">{{ prefix() }}</span>
4243
+ }
3935
4244
  @if (_activeError()) {
3936
4245
  <p class="ti-desc ti-desc-error" [id]="_inputId + '-desc'" role="alert">{{ _activeError() }}</p>
3937
4246
  } @else if (hint()) {
@@ -3939,7 +4248,7 @@ i0.ɵɵngDeclareClassMetadata({
3939
4248
  }
3940
4249
  </div>
3941
4250
  `,
3942
- styles: [":host{display:block}.ti-field{display:flex;flex-direction:column;gap:6px}.ti-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ti-required{color:#ef4444;margin-left:2px}.ti-input{width:100%;box-sizing:border-box;padding:9px 12px;font-size:.875rem;font-family:inherit;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px;outline:none;transition:border-color .15s,box-shadow .15s}.ti-input::placeholder{color:#94a3b8}.ti-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ti-input:read-only{background:#f8fafc;cursor:default}.ti-error .ti-input{border-color:#ef4444}.ti-error .ti-input:focus{box-shadow:0 0 0 3px #ef44441f}.ti-disabled .ti-input{opacity:.5;cursor:not-allowed}.ti-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ti-desc-error{color:#ef4444}@media(max-width:480px){.ti-input{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.ti-input{min-height:44px}}\n"]
4251
+ styles: [":host{display:block}.ti-field{display:flex;flex-direction:column;gap:6px}.ti-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ti-required{color:#ef4444;margin-left:2px}.ti-prefixed{display:grid;grid-template-columns:minmax(0,1fr)}.ti-prefixed .ti-input{grid-row:var(--ti-input-row);grid-column:1}.ti-prefix{grid-row:var(--ti-input-row);grid-column:1;justify-self:start;align-self:center;margin-left:12px;font-size:.875rem;line-height:1;color:#64748b;pointer-events:none}@media(max-width:480px){.ti-prefix{font-size:1rem}}.ti-disabled .ti-prefix{opacity:.5}.ti-input{width:100%;box-sizing:border-box;padding:9px 12px;font-size:.875rem;font-family:inherit;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px;outline:none;transition:border-color .15s,box-shadow .15s}.ti-input::placeholder{color:#94a3b8}.ti-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ti-input:read-only{background:#f8fafc;cursor:default}.ti-error .ti-input{border-color:#ef4444}.ti-error .ti-input:focus{box-shadow:0 0 0 3px #ef44441f}.ti-disabled .ti-input{opacity:.5;cursor:not-allowed}.ti-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ti-desc-error{color:#ef4444}@media(max-width:480px){.ti-input{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.ti-input{min-height:44px}}\n"]
3943
4252
  }]
3944
4253
  }],
3945
4254
  ctorParameters: () => [],
@@ -3968,6 +4277,14 @@ i0.ɵɵngDeclareClassMetadata({
3968
4277
  required: false
3969
4278
  }]
3970
4279
  }],
4280
+ prefix: [{
4281
+ type: i0.Input,
4282
+ args: [{
4283
+ isSignal: true,
4284
+ alias: "prefix",
4285
+ required: false
4286
+ }]
4287
+ }],
3971
4288
  type: [{
3972
4289
  type: i0.Input,
3973
4290
  args: [{
@@ -4080,6 +4397,14 @@ i0.ɵɵngDeclareClassMetadata({
4080
4397
  required: false
4081
4398
  }]
4082
4399
  }],
4400
+ formatter: [{
4401
+ type: i0.Input,
4402
+ args: [{
4403
+ isSignal: true,
4404
+ alias: "formatter",
4405
+ required: false
4406
+ }]
4407
+ }],
4083
4408
  showErrors: [{
4084
4409
  type: i0.Input,
4085
4410
  args: [{
@@ -4487,14 +4812,17 @@ var TableToolbarComponent = class TableToolbarComponent {
4487
4812
  "title",
4488
4813
  "description",
4489
4814
  "maxWidth",
4490
- "bodyOverflow"
4815
+ "bodyOverflow",
4816
+ "dialogTestId",
4817
+ "hideClose",
4818
+ "closable"
4491
4819
  ],
4492
4820
  outputs: ["close"]
4493
4821
  },
4494
4822
  {
4495
4823
  kind: "component",
4496
4824
  type: CheckboxComponent,
4497
- selector: "ui-checkbox",
4825
+ selector: "ui-checkbox, ui-checkbox-group",
4498
4826
  inputs: [
4499
4827
  "label",
4500
4828
  "ariaLabel",
@@ -4502,6 +4830,9 @@ var TableToolbarComponent = class TableToolbarComponent {
4502
4830
  "checked",
4503
4831
  "options",
4504
4832
  "legend",
4833
+ "orientation",
4834
+ "values",
4835
+ "description",
4505
4836
  "indent",
4506
4837
  "required",
4507
4838
  "requiredMessage",
@@ -4510,7 +4841,11 @@ var TableToolbarComponent = class TableToolbarComponent {
4510
4841
  "showErrors",
4511
4842
  "disabled"
4512
4843
  ],
4513
- outputs: ["checkedChange", "invalidChange"]
4844
+ outputs: [
4845
+ "checkedChange",
4846
+ "valuesChange",
4847
+ "invalidChange"
4848
+ ]
4514
4849
  },
4515
4850
  {
4516
4851
  kind: "component",
@@ -4520,6 +4855,7 @@ var TableToolbarComponent = class TableToolbarComponent {
4520
4855
  "variant",
4521
4856
  "routerLink",
4522
4857
  "queryParams",
4858
+ "fragment",
4523
4859
  "href",
4524
4860
  "target",
4525
4861
  "rel",
@@ -4546,6 +4882,7 @@ var TableToolbarComponent = class TableToolbarComponent {
4546
4882
  "label",
4547
4883
  "ariaLabel",
4548
4884
  "placeholder",
4885
+ "prefix",
4549
4886
  "type",
4550
4887
  "maxlength",
4551
4888
  "required",
@@ -4560,6 +4897,7 @@ var TableToolbarComponent = class TableToolbarComponent {
4560
4897
  "maxDecimals",
4561
4898
  "step",
4562
4899
  "valueType",
4900
+ "formatter",
4563
4901
  "showErrors",
4564
4902
  "disabled"
4565
4903
  ],
@@ -5907,7 +6245,7 @@ var SelectComponent = class SelectComponent {
5907
6245
  <option value="" [disabled]="true" [selected]="_value() === ''">{{ placeholder() }}</option>
5908
6246
  }
5909
6247
  @for (opt of options(); track opt.value; let i = $index) {
5910
- <option [value]="_key(opt)" [selected]="i === _selectedIndex()" [attr.title]="opt.description || null">{{ opt.label }}</option>
6248
+ <option [value]="_key(opt)" [selected]="i === _selectedIndex()" [attr.title]="opt.description || null">{{ opt.badge ? opt.label + ' — ' + opt.badge : opt.label }}</option>
5911
6249
  }
5912
6250
  </select>
5913
6251
  <svg class="sl-chevron" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>
@@ -5978,7 +6316,7 @@ i0.ɵɵngDeclareClassMetadata({
5978
6316
  <option value="" [disabled]="true" [selected]="_value() === ''">{{ placeholder() }}</option>
5979
6317
  }
5980
6318
  @for (opt of options(); track opt.value; let i = $index) {
5981
- <option [value]="_key(opt)" [selected]="i === _selectedIndex()" [attr.title]="opt.description || null">{{ opt.label }}</option>
6319
+ <option [value]="_key(opt)" [selected]="i === _selectedIndex()" [attr.title]="opt.description || null">{{ opt.badge ? opt.label + ' — ' + opt.badge : opt.label }}</option>
5982
6320
  }
5983
6321
  </select>
5984
6322
  <svg class="sl-chevron" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>
@@ -7067,7 +7405,10 @@ var ImportExportComponent = class ImportExportComponent {
7067
7405
  "title",
7068
7406
  "description",
7069
7407
  "maxWidth",
7070
- "bodyOverflow"
7408
+ "bodyOverflow",
7409
+ "dialogTestId",
7410
+ "hideClose",
7411
+ "closable"
7071
7412
  ],
7072
7413
  outputs: ["close"]
7073
7414
  },
@@ -7079,6 +7420,7 @@ var ImportExportComponent = class ImportExportComponent {
7079
7420
  "variant",
7080
7421
  "routerLink",
7081
7422
  "queryParams",
7423
+ "fragment",
7082
7424
  "href",
7083
7425
  "target",
7084
7426
  "rel",
@@ -7561,7 +7903,10 @@ var ConfirmOutletComponent = class ConfirmOutletComponent {
7561
7903
  "title",
7562
7904
  "description",
7563
7905
  "maxWidth",
7564
- "bodyOverflow"
7906
+ "bodyOverflow",
7907
+ "dialogTestId",
7908
+ "hideClose",
7909
+ "closable"
7565
7910
  ],
7566
7911
  outputs: ["close"]
7567
7912
  }, {
@@ -7572,6 +7917,7 @@ var ConfirmOutletComponent = class ConfirmOutletComponent {
7572
7917
  "variant",
7573
7918
  "routerLink",
7574
7919
  "queryParams",
7920
+ "fragment",
7575
7921
  "href",
7576
7922
  "target",
7577
7923
  "rel",
@@ -7922,6 +8268,7 @@ var ErrorStateComponent = class ErrorStateComponent {
7922
8268
  "variant",
7923
8269
  "routerLink",
7924
8270
  "queryParams",
8271
+ "fragment",
7925
8272
  "href",
7926
8273
  "target",
7927
8274
  "rel",
@@ -10260,6 +10607,7 @@ var DataTableComponent = class DataTableComponent {
10260
10607
  "variant",
10261
10608
  "routerLink",
10262
10609
  "queryParams",
10610
+ "fragment",
10263
10611
  "href",
10264
10612
  "target",
10265
10613
  "rel",
@@ -10281,7 +10629,7 @@ var DataTableComponent = class DataTableComponent {
10281
10629
  {
10282
10630
  kind: "component",
10283
10631
  type: CheckboxComponent,
10284
- selector: "ui-checkbox",
10632
+ selector: "ui-checkbox, ui-checkbox-group",
10285
10633
  inputs: [
10286
10634
  "label",
10287
10635
  "ariaLabel",
@@ -10289,6 +10637,9 @@ var DataTableComponent = class DataTableComponent {
10289
10637
  "checked",
10290
10638
  "options",
10291
10639
  "legend",
10640
+ "orientation",
10641
+ "values",
10642
+ "description",
10292
10643
  "indent",
10293
10644
  "required",
10294
10645
  "requiredMessage",
@@ -10297,7 +10648,11 @@ var DataTableComponent = class DataTableComponent {
10297
10648
  "showErrors",
10298
10649
  "disabled"
10299
10650
  ],
10300
- outputs: ["checkedChange", "invalidChange"]
10651
+ outputs: [
10652
+ "checkedChange",
10653
+ "valuesChange",
10654
+ "invalidChange"
10655
+ ]
10301
10656
  },
10302
10657
  {
10303
10658
  kind: "component",
@@ -10350,7 +10705,10 @@ var DataTableComponent = class DataTableComponent {
10350
10705
  "title",
10351
10706
  "description",
10352
10707
  "maxWidth",
10353
- "bodyOverflow"
10708
+ "bodyOverflow",
10709
+ "dialogTestId",
10710
+ "hideClose",
10711
+ "closable"
10354
10712
  ],
10355
10713
  outputs: ["close"]
10356
10714
  },
@@ -11312,6 +11670,8 @@ var SidePanelComponent = class SidePanelComponent {
11312
11670
  this.primaryVariant = input("primary", ...ngDevMode ? [{ debugName: "primaryVariant" }] : /* istanbul ignore next */ []);
11313
11671
  this.primaryLoading = input(false, ...ngDevMode ? [{ debugName: "primaryLoading" }] : /* istanbul ignore next */ []);
11314
11672
  this.primaryDisabled = input(false, ...ngDevMode ? [{ debugName: "primaryDisabled" }] : /* istanbul ignore next */ []);
11673
+ this.cancelTestId = input("", ...ngDevMode ? [{ debugName: "cancelTestId" }] : /* istanbul ignore next */ []);
11674
+ this.primaryTestId = input("", ...ngDevMode ? [{ debugName: "primaryTestId" }] : /* istanbul ignore next */ []);
11315
11675
  this.closed = output();
11316
11676
  this.primaryClick = output();
11317
11677
  this.titleId = `sp-title-${Math.random().toString(36).slice(2, 8)}`;
@@ -11467,6 +11827,20 @@ var SidePanelComponent = class SidePanelComponent {
11467
11827
  isSignal: true,
11468
11828
  isRequired: false,
11469
11829
  transformFunction: null
11830
+ },
11831
+ cancelTestId: {
11832
+ classPropertyName: "cancelTestId",
11833
+ publicName: "cancelTestId",
11834
+ isSignal: true,
11835
+ isRequired: false,
11836
+ transformFunction: null
11837
+ },
11838
+ primaryTestId: {
11839
+ classPropertyName: "primaryTestId",
11840
+ publicName: "primaryTestId",
11841
+ isSignal: true,
11842
+ isRequired: false,
11843
+ transformFunction: null
11470
11844
  }
11471
11845
  },
11472
11846
  outputs: {
@@ -11509,14 +11883,16 @@ var SidePanelComponent = class SidePanelComponent {
11509
11883
  @if (cancelLabel() || primaryLabel()) {
11510
11884
  <div class="sp-footer">
11511
11885
  @if (cancelLabel()) {
11512
- <button class="sp-btn sp-btn-cancel" type="button" (click)="closed.emit()">
11886
+ <button class="sp-btn sp-btn-cancel" type="button" [attr.data-testid]="cancelTestId() || null" (click)="closed.emit()">
11513
11887
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
11514
11888
  {{ cancelLabel() }}
11515
11889
  </button>
11516
11890
  }
11891
+ <div class="sp-footer-extra"><ng-content select="[panel-footer-extra]" /></div>
11517
11892
  @if (primaryLabel()) {
11518
11893
  <button
11519
11894
  class="sp-btn"
11895
+ [attr.data-testid]="primaryTestId() || null"
11520
11896
  [class.sp-btn-primary]="primaryVariant() === 'primary'"
11521
11897
  [class.sp-btn-danger]="primaryVariant() === 'danger'"
11522
11898
  [class.sp-btn-warning]="primaryVariant() === 'warning'"
@@ -11541,7 +11917,7 @@ var SidePanelComponent = class SidePanelComponent {
11541
11917
  }
11542
11918
  `,
11543
11919
  isInline: true,
11544
- styles: [".sp-backdrop{position:fixed;inset:0;background:#0000004d;z-index:90;animation:sp-fade .2s ease}.sp-panel{position:fixed;top:0;right:0;bottom:var(--ui-kb, 0px);width:480px;max-width:100vw;max-height:100vh;max-height:var(--ui-vvh, 100dvh);background:#fff;z-index:100;box-shadow:-4px 0 20px #0000001a;display:flex;flex-direction:column;animation:sp-slide .25s ease}.sp-panel:focus{outline:none}.sp-wide{width:620px}.sp-extra-wide{width:760px}.sp-header{display:flex;justify-content:space-between;align-items:center;padding:24px 24px 20px;gap:12px;flex-shrink:0;background:linear-gradient(135deg,#1e293b,#334155)}.sp-header-text{flex:1;min-width:0}.sp-title{font-size:1.125rem;font-weight:700;color:#fff;margin:0}.sp-subtitle{font-size:.8125rem;color:#94a3b8;margin:4px 0 0}.sp-close{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:36px;height:36px;border-radius:8px;border:1px solid rgba(255,255,255,.2);background:#ffffff1a;cursor:pointer;color:#cbd5e1;transition:background .15s,border-color .15s}.sp-close:hover{background:#fff3;border-color:#ffffff4d;color:#fff}.sp-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-body{padding:20px 24px 24px;flex:1;overflow-y:auto;overflow-x:hidden}.sp-footer{display:flex;align-items:center;justify-content:space-between;flex-shrink:0;padding:14px 24px calc(14px + env(safe-area-inset-bottom,0px));border-top:1px solid #e2e8f0;background:#f8fafc}.sp-btn{display:inline-flex;align-items:center;gap:7px;padding:8px 18px;border-radius:7px;font-size:.875rem;font-weight:500;font-family:inherit;cursor:pointer;white-space:nowrap;transition:background .1s,border-color .1s,opacity .1s}.sp-btn:disabled{opacity:.5;cursor:default}.sp-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-btn-cancel{background:#fff;border:1px solid #e2e8f0;color:#475569}.sp-btn-cancel:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.sp-btn-primary{background:#3b82f6;border:1px solid #3b82f6;color:#fff}.sp-btn-primary:hover:not(:disabled){background:#2563eb;border-color:#2563eb}.sp-btn-danger{background:#dc2626;border:1px solid #dc2626;color:#fff}.sp-btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.sp-btn-warning{background:#d97706;border:1px solid #d97706;color:#fff}.sp-btn-warning:hover:not(:disabled){background:#b45309;border-color:#b45309}.sp-spinner{display:inline-block;width:13px;height:13px;border-radius:50%;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;animation:sp-spin .55s linear infinite;flex-shrink:0}@media(max-width:768px){.sp-panel,.sp-wide,.sp-extra-wide{width:100vw}}@media(max-width:480px){.sp-panel,.sp-wide,.sp-extra-wide{inset:auto 0 0;width:100vw;max-height:90vh;max-height:min(90dvh,var(--ui-vvh, 100dvh));border-radius:16px 16px 0 0;box-shadow:0 -4px 24px #00000026;animation:sp-up .25s ease}.sp-header{padding:16px 16px 14px}.sp-body{padding:16px}.sp-footer{padding:12px 16px calc(12px + env(safe-area-inset-bottom,0px))}}@media(pointer:coarse),(max-width:480px){.sp-close{position:relative}.sp-close:after{content:\"\";position:absolute;inset:-5px}.sp-btn{min-height:44px;justify-content:center}}@keyframes sp-slide{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes sp-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes sp-fade{0%{opacity:0}to{opacity:1}}@keyframes sp-spin{to{transform:rotate(360deg)}}\n"],
11920
+ styles: [".sp-backdrop{position:fixed;inset:0;background:#0000004d;z-index:90;animation:sp-fade .2s ease}.sp-panel{position:fixed;top:0;right:0;bottom:var(--ui-kb, 0px);width:480px;max-width:100vw;max-height:100vh;max-height:var(--ui-vvh, 100dvh);background:#fff;z-index:100;box-shadow:-4px 0 20px #0000001a;display:flex;flex-direction:column;animation:sp-slide .25s ease}.sp-panel:focus{outline:none}.sp-wide{width:620px}.sp-extra-wide{width:760px}.sp-header{display:flex;justify-content:space-between;align-items:center;padding:24px 24px 20px;gap:12px;flex-shrink:0;background:linear-gradient(135deg,#1e293b,#334155)}.sp-header-text{flex:1;min-width:0}.sp-title{font-size:1.125rem;font-weight:700;color:#fff;margin:0}.sp-subtitle{font-size:.8125rem;color:#94a3b8;margin:4px 0 0}.sp-close{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:36px;height:36px;border-radius:8px;border:1px solid rgba(255,255,255,.2);background:#ffffff1a;cursor:pointer;color:#cbd5e1;transition:background .15s,border-color .15s}.sp-close:hover{background:#fff3;border-color:#ffffff4d;color:#fff}.sp-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-body{padding:20px 24px 24px;flex:1;overflow-y:auto;overflow-x:hidden}.sp-footer{display:flex;align-items:center;justify-content:space-between;flex-shrink:0;padding:14px 24px calc(14px + env(safe-area-inset-bottom,0px));border-top:1px solid #e2e8f0;background:#f8fafc}.sp-footer-extra{display:flex;align-items:center;justify-content:center;gap:8px;flex:1 1 auto;margin:0 8px;min-width:0}.sp-footer-extra:empty{display:none}.sp-btn{display:inline-flex;align-items:center;gap:7px;padding:8px 18px;border-radius:7px;font-size:.875rem;font-weight:500;font-family:inherit;cursor:pointer;white-space:nowrap;transition:background .1s,border-color .1s,opacity .1s}.sp-btn:disabled{opacity:.5;cursor:default}.sp-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-btn-cancel{background:#fff;border:1px solid #e2e8f0;color:#475569}.sp-btn-cancel:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.sp-btn-primary{background:#3b82f6;border:1px solid #3b82f6;color:#fff}.sp-btn-primary:hover:not(:disabled){background:#2563eb;border-color:#2563eb}.sp-btn-danger{background:#dc2626;border:1px solid #dc2626;color:#fff}.sp-btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.sp-btn-warning{background:#d97706;border:1px solid #d97706;color:#fff}.sp-btn-warning:hover:not(:disabled){background:#b45309;border-color:#b45309}.sp-spinner{display:inline-block;width:13px;height:13px;border-radius:50%;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;animation:sp-spin .55s linear infinite;flex-shrink:0}@media(max-width:768px){.sp-panel,.sp-wide,.sp-extra-wide{width:100vw}}@media(max-width:480px){.sp-panel,.sp-wide,.sp-extra-wide{inset:auto 0 0;width:100vw;max-height:90vh;max-height:min(90dvh,var(--ui-vvh, 100dvh));border-radius:16px 16px 0 0;box-shadow:0 -4px 24px #00000026;animation:sp-up .25s ease}.sp-header{padding:16px 16px 14px}.sp-body{padding:16px}.sp-footer{padding:12px 16px calc(12px + env(safe-area-inset-bottom,0px))}}@media(pointer:coarse),(max-width:480px){.sp-close{position:relative}.sp-close:after{content:\"\";position:absolute;inset:-5px}.sp-btn{min-height:44px;justify-content:center}}@keyframes sp-slide{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes sp-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes sp-fade{0%{opacity:0}to{opacity:1}}@keyframes sp-spin{to{transform:rotate(360deg)}}\n"],
11545
11921
  changeDetection: i0.ChangeDetectionStrategy.OnPush
11546
11922
  });
11547
11923
  }
@@ -11592,14 +11968,16 @@ i0.ɵɵngDeclareClassMetadata({
11592
11968
  @if (cancelLabel() || primaryLabel()) {
11593
11969
  <div class="sp-footer">
11594
11970
  @if (cancelLabel()) {
11595
- <button class="sp-btn sp-btn-cancel" type="button" (click)="closed.emit()">
11971
+ <button class="sp-btn sp-btn-cancel" type="button" [attr.data-testid]="cancelTestId() || null" (click)="closed.emit()">
11596
11972
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
11597
11973
  {{ cancelLabel() }}
11598
11974
  </button>
11599
11975
  }
11976
+ <div class="sp-footer-extra"><ng-content select="[panel-footer-extra]" /></div>
11600
11977
  @if (primaryLabel()) {
11601
11978
  <button
11602
11979
  class="sp-btn"
11980
+ [attr.data-testid]="primaryTestId() || null"
11603
11981
  [class.sp-btn-primary]="primaryVariant() === 'primary'"
11604
11982
  [class.sp-btn-danger]="primaryVariant() === 'danger'"
11605
11983
  [class.sp-btn-warning]="primaryVariant() === 'warning'"
@@ -11623,7 +12001,7 @@ i0.ɵɵngDeclareClassMetadata({
11623
12001
  </aside>
11624
12002
  }
11625
12003
  `,
11626
- styles: [".sp-backdrop{position:fixed;inset:0;background:#0000004d;z-index:90;animation:sp-fade .2s ease}.sp-panel{position:fixed;top:0;right:0;bottom:var(--ui-kb, 0px);width:480px;max-width:100vw;max-height:100vh;max-height:var(--ui-vvh, 100dvh);background:#fff;z-index:100;box-shadow:-4px 0 20px #0000001a;display:flex;flex-direction:column;animation:sp-slide .25s ease}.sp-panel:focus{outline:none}.sp-wide{width:620px}.sp-extra-wide{width:760px}.sp-header{display:flex;justify-content:space-between;align-items:center;padding:24px 24px 20px;gap:12px;flex-shrink:0;background:linear-gradient(135deg,#1e293b,#334155)}.sp-header-text{flex:1;min-width:0}.sp-title{font-size:1.125rem;font-weight:700;color:#fff;margin:0}.sp-subtitle{font-size:.8125rem;color:#94a3b8;margin:4px 0 0}.sp-close{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:36px;height:36px;border-radius:8px;border:1px solid rgba(255,255,255,.2);background:#ffffff1a;cursor:pointer;color:#cbd5e1;transition:background .15s,border-color .15s}.sp-close:hover{background:#fff3;border-color:#ffffff4d;color:#fff}.sp-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-body{padding:20px 24px 24px;flex:1;overflow-y:auto;overflow-x:hidden}.sp-footer{display:flex;align-items:center;justify-content:space-between;flex-shrink:0;padding:14px 24px calc(14px + env(safe-area-inset-bottom,0px));border-top:1px solid #e2e8f0;background:#f8fafc}.sp-btn{display:inline-flex;align-items:center;gap:7px;padding:8px 18px;border-radius:7px;font-size:.875rem;font-weight:500;font-family:inherit;cursor:pointer;white-space:nowrap;transition:background .1s,border-color .1s,opacity .1s}.sp-btn:disabled{opacity:.5;cursor:default}.sp-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-btn-cancel{background:#fff;border:1px solid #e2e8f0;color:#475569}.sp-btn-cancel:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.sp-btn-primary{background:#3b82f6;border:1px solid #3b82f6;color:#fff}.sp-btn-primary:hover:not(:disabled){background:#2563eb;border-color:#2563eb}.sp-btn-danger{background:#dc2626;border:1px solid #dc2626;color:#fff}.sp-btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.sp-btn-warning{background:#d97706;border:1px solid #d97706;color:#fff}.sp-btn-warning:hover:not(:disabled){background:#b45309;border-color:#b45309}.sp-spinner{display:inline-block;width:13px;height:13px;border-radius:50%;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;animation:sp-spin .55s linear infinite;flex-shrink:0}@media(max-width:768px){.sp-panel,.sp-wide,.sp-extra-wide{width:100vw}}@media(max-width:480px){.sp-panel,.sp-wide,.sp-extra-wide{inset:auto 0 0;width:100vw;max-height:90vh;max-height:min(90dvh,var(--ui-vvh, 100dvh));border-radius:16px 16px 0 0;box-shadow:0 -4px 24px #00000026;animation:sp-up .25s ease}.sp-header{padding:16px 16px 14px}.sp-body{padding:16px}.sp-footer{padding:12px 16px calc(12px + env(safe-area-inset-bottom,0px))}}@media(pointer:coarse),(max-width:480px){.sp-close{position:relative}.sp-close:after{content:\"\";position:absolute;inset:-5px}.sp-btn{min-height:44px;justify-content:center}}@keyframes sp-slide{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes sp-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes sp-fade{0%{opacity:0}to{opacity:1}}@keyframes sp-spin{to{transform:rotate(360deg)}}\n"]
12004
+ styles: [".sp-backdrop{position:fixed;inset:0;background:#0000004d;z-index:90;animation:sp-fade .2s ease}.sp-panel{position:fixed;top:0;right:0;bottom:var(--ui-kb, 0px);width:480px;max-width:100vw;max-height:100vh;max-height:var(--ui-vvh, 100dvh);background:#fff;z-index:100;box-shadow:-4px 0 20px #0000001a;display:flex;flex-direction:column;animation:sp-slide .25s ease}.sp-panel:focus{outline:none}.sp-wide{width:620px}.sp-extra-wide{width:760px}.sp-header{display:flex;justify-content:space-between;align-items:center;padding:24px 24px 20px;gap:12px;flex-shrink:0;background:linear-gradient(135deg,#1e293b,#334155)}.sp-header-text{flex:1;min-width:0}.sp-title{font-size:1.125rem;font-weight:700;color:#fff;margin:0}.sp-subtitle{font-size:.8125rem;color:#94a3b8;margin:4px 0 0}.sp-close{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:36px;height:36px;border-radius:8px;border:1px solid rgba(255,255,255,.2);background:#ffffff1a;cursor:pointer;color:#cbd5e1;transition:background .15s,border-color .15s}.sp-close:hover{background:#fff3;border-color:#ffffff4d;color:#fff}.sp-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-body{padding:20px 24px 24px;flex:1;overflow-y:auto;overflow-x:hidden}.sp-footer{display:flex;align-items:center;justify-content:space-between;flex-shrink:0;padding:14px 24px calc(14px + env(safe-area-inset-bottom,0px));border-top:1px solid #e2e8f0;background:#f8fafc}.sp-footer-extra{display:flex;align-items:center;justify-content:center;gap:8px;flex:1 1 auto;margin:0 8px;min-width:0}.sp-footer-extra:empty{display:none}.sp-btn{display:inline-flex;align-items:center;gap:7px;padding:8px 18px;border-radius:7px;font-size:.875rem;font-weight:500;font-family:inherit;cursor:pointer;white-space:nowrap;transition:background .1s,border-color .1s,opacity .1s}.sp-btn:disabled{opacity:.5;cursor:default}.sp-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-btn-cancel{background:#fff;border:1px solid #e2e8f0;color:#475569}.sp-btn-cancel:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.sp-btn-primary{background:#3b82f6;border:1px solid #3b82f6;color:#fff}.sp-btn-primary:hover:not(:disabled){background:#2563eb;border-color:#2563eb}.sp-btn-danger{background:#dc2626;border:1px solid #dc2626;color:#fff}.sp-btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.sp-btn-warning{background:#d97706;border:1px solid #d97706;color:#fff}.sp-btn-warning:hover:not(:disabled){background:#b45309;border-color:#b45309}.sp-spinner{display:inline-block;width:13px;height:13px;border-radius:50%;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;animation:sp-spin .55s linear infinite;flex-shrink:0}@media(max-width:768px){.sp-panel,.sp-wide,.sp-extra-wide{width:100vw}}@media(max-width:480px){.sp-panel,.sp-wide,.sp-extra-wide{inset:auto 0 0;width:100vw;max-height:90vh;max-height:min(90dvh,var(--ui-vvh, 100dvh));border-radius:16px 16px 0 0;box-shadow:0 -4px 24px #00000026;animation:sp-up .25s ease}.sp-header{padding:16px 16px 14px}.sp-body{padding:16px}.sp-footer{padding:12px 16px calc(12px + env(safe-area-inset-bottom,0px))}}@media(pointer:coarse),(max-width:480px){.sp-close{position:relative}.sp-close:after{content:\"\";position:absolute;inset:-5px}.sp-btn{min-height:44px;justify-content:center}}@keyframes sp-slide{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes sp-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes sp-fade{0%{opacity:0}to{opacity:1}}@keyframes sp-spin{to{transform:rotate(360deg)}}\n"]
11627
12005
  }]
11628
12006
  }],
11629
12007
  ctorParameters: () => [],
@@ -11708,13 +12086,29 @@ i0.ɵɵngDeclareClassMetadata({
11708
12086
  required: false
11709
12087
  }]
11710
12088
  }],
11711
- closed: [{
11712
- type: i0.Output,
11713
- args: ["closed"]
12089
+ cancelTestId: [{
12090
+ type: i0.Input,
12091
+ args: [{
12092
+ isSignal: true,
12093
+ alias: "cancelTestId",
12094
+ required: false
12095
+ }]
11714
12096
  }],
11715
- primaryClick: [{
11716
- type: i0.Output,
11717
- args: ["primaryClick"]
12097
+ primaryTestId: [{
12098
+ type: i0.Input,
12099
+ args: [{
12100
+ isSignal: true,
12101
+ alias: "primaryTestId",
12102
+ required: false
12103
+ }]
12104
+ }],
12105
+ closed: [{
12106
+ type: i0.Output,
12107
+ args: ["closed"]
12108
+ }],
12109
+ primaryClick: [{
12110
+ type: i0.Output,
12111
+ args: ["primaryClick"]
11718
12112
  }]
11719
12113
  }
11720
12114
  });
@@ -13370,6 +13764,7 @@ var BusinessHoursComponent = class BusinessHoursComponent {
13370
13764
  "variant",
13371
13765
  "routerLink",
13372
13766
  "queryParams",
13767
+ "fragment",
13373
13768
  "href",
13374
13769
  "target",
13375
13770
  "rel",
@@ -13391,7 +13786,7 @@ var BusinessHoursComponent = class BusinessHoursComponent {
13391
13786
  {
13392
13787
  kind: "component",
13393
13788
  type: CheckboxComponent,
13394
- selector: "ui-checkbox",
13789
+ selector: "ui-checkbox, ui-checkbox-group",
13395
13790
  inputs: [
13396
13791
  "label",
13397
13792
  "ariaLabel",
@@ -13399,6 +13794,9 @@ var BusinessHoursComponent = class BusinessHoursComponent {
13399
13794
  "checked",
13400
13795
  "options",
13401
13796
  "legend",
13797
+ "orientation",
13798
+ "values",
13799
+ "description",
13402
13800
  "indent",
13403
13801
  "required",
13404
13802
  "requiredMessage",
@@ -13407,7 +13805,11 @@ var BusinessHoursComponent = class BusinessHoursComponent {
13407
13805
  "showErrors",
13408
13806
  "disabled"
13409
13807
  ],
13410
- outputs: ["checkedChange", "invalidChange"]
13808
+ outputs: [
13809
+ "checkedChange",
13810
+ "valuesChange",
13811
+ "invalidChange"
13812
+ ]
13411
13813
  },
13412
13814
  {
13413
13815
  kind: "component",
@@ -13622,13 +14024,16 @@ var RadioComponent = class RadioComponent {
13622
14024
  this.checked = input(false, ...ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []);
13623
14025
  this.invalid = input(false, ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
13624
14026
  this.describedBy = input("", ...ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []);
14027
+ this.controls = input("", ...ngDevMode ? [{ debugName: "controls" }] : /* istanbul ignore next */ []);
13625
14028
  this._disabledInput = input(false, {
13626
14029
  ...ngDevMode ? { debugName: "_disabledInput" } : /* istanbul ignore next */ {},
13627
14030
  alias: "disabled"
13628
14031
  });
13629
14032
  this.disabled = this._disabledInput;
13630
- this._labelId = `rd-${Math.random().toString(36).slice(2, 8)}-label`;
13631
- this._labelledBy = computed(() => this.label() && this.description() && !this.ariaLabel() ? this._labelId : null, ...ngDevMode ? [{ debugName: "_labelledBy" }] : /* istanbul ignore next */ []);
14033
+ this.labelId = input("", ...ngDevMode ? [{ debugName: "labelId" }] : /* istanbul ignore next */ []);
14034
+ this._generatedLabelId = `rd-${Math.random().toString(36).slice(2, 8)}-label`;
14035
+ this._labelId = computed(() => this.labelId() || this._generatedLabelId, ...ngDevMode ? [{ debugName: "_labelId" }] : /* istanbul ignore next */ []);
14036
+ this._labelledBy = computed(() => this.label() && this.description() && !this.ariaLabel() ? this._labelId() : null, ...ngDevMode ? [{ debugName: "_labelledBy" }] : /* istanbul ignore next */ []);
13632
14037
  this._descriptionId = `rd-${Math.random().toString(36).slice(2, 8)}-desc`;
13633
14038
  this._describedByIds = computed(() => {
13634
14039
  return [this.describedBy(), this.description() ? this._descriptionId : ""].filter(Boolean).join(" ") || null;
@@ -13712,12 +14117,26 @@ var RadioComponent = class RadioComponent {
13712
14117
  isRequired: false,
13713
14118
  transformFunction: null
13714
14119
  },
14120
+ controls: {
14121
+ classPropertyName: "controls",
14122
+ publicName: "controls",
14123
+ isSignal: true,
14124
+ isRequired: false,
14125
+ transformFunction: null
14126
+ },
13715
14127
  _disabledInput: {
13716
14128
  classPropertyName: "_disabledInput",
13717
14129
  publicName: "disabled",
13718
14130
  isSignal: true,
13719
14131
  isRequired: false,
13720
14132
  transformFunction: null
14133
+ },
14134
+ labelId: {
14135
+ classPropertyName: "labelId",
14136
+ publicName: "labelId",
14137
+ isSignal: true,
14138
+ isRequired: false,
14139
+ transformFunction: null
13721
14140
  }
13722
14141
  },
13723
14142
  outputs: { selected: "selected" },
@@ -13738,10 +14157,11 @@ var RadioComponent = class RadioComponent {
13738
14157
  [attr.aria-labelledby]="_labelledBy()"
13739
14158
  [attr.aria-invalid]="invalid() ? 'true' : null"
13740
14159
  [attr.aria-describedby]="_describedByIds()"
14160
+ [attr.aria-controls]="controls() || null"
13741
14161
  (change)="onChange($event)"
13742
14162
  />
13743
14163
  <span class="rd-text">
13744
- @if (label()) { <span class="rd-label" [id]="_labelId">{{ label() }}</span> }
14164
+ @if (label()) { <span class="rd-label" [id]="_labelId()">{{ label() }}</span> }
13745
14165
  @if (description()) { <span class="rd-description" [id]="_descriptionId">{{ description() }}</span> }
13746
14166
  <ng-content />
13747
14167
  </span>
@@ -13780,10 +14200,11 @@ i0.ɵɵngDeclareClassMetadata({
13780
14200
  [attr.aria-labelledby]="_labelledBy()"
13781
14201
  [attr.aria-invalid]="invalid() ? 'true' : null"
13782
14202
  [attr.aria-describedby]="_describedByIds()"
14203
+ [attr.aria-controls]="controls() || null"
13783
14204
  (change)="onChange($event)"
13784
14205
  />
13785
14206
  <span class="rd-text">
13786
- @if (label()) { <span class="rd-label" [id]="_labelId">{{ label() }}</span> }
14207
+ @if (label()) { <span class="rd-label" [id]="_labelId()">{{ label() }}</span> }
13787
14208
  @if (description()) { <span class="rd-description" [id]="_descriptionId">{{ description() }}</span> }
13788
14209
  <ng-content />
13789
14210
  </span>
@@ -13857,6 +14278,14 @@ i0.ɵɵngDeclareClassMetadata({
13857
14278
  required: false
13858
14279
  }]
13859
14280
  }],
14281
+ controls: [{
14282
+ type: i0.Input,
14283
+ args: [{
14284
+ isSignal: true,
14285
+ alias: "controls",
14286
+ required: false
14287
+ }]
14288
+ }],
13860
14289
  _disabledInput: [{
13861
14290
  type: i0.Input,
13862
14291
  args: [{
@@ -13865,16 +14294,84 @@ i0.ɵɵngDeclareClassMetadata({
13865
14294
  required: false
13866
14295
  }]
13867
14296
  }],
14297
+ labelId: [{
14298
+ type: i0.Input,
14299
+ args: [{
14300
+ isSignal: true,
14301
+ alias: "labelId",
14302
+ required: false
14303
+ }]
14304
+ }],
13868
14305
  selected: [{
13869
14306
  type: i0.Output,
13870
14307
  args: ["selected"]
13871
14308
  }]
13872
14309
  }
13873
14310
  });
14311
+ var RadioOptionContentDirective = class RadioOptionContentDirective {
14312
+ constructor() {
14313
+ this.value = input.required({
14314
+ ...ngDevMode ? { debugName: "value" } : /* istanbul ignore next */ {},
14315
+ alias: "uiRadioOptionContent"
14316
+ });
14317
+ this.template = inject(TemplateRef);
14318
+ }
14319
+ static {
14320
+ this.ɵfac = i0.ɵɵngDeclareFactory({
14321
+ minVersion: "12.0.0",
14322
+ version: "22.2.2",
14323
+ ngImport: i0,
14324
+ type: RadioOptionContentDirective,
14325
+ deps: [],
14326
+ target: i0.ɵɵFactoryTarget.Directive
14327
+ });
14328
+ }
14329
+ static {
14330
+ this.ɵdir = i0.ɵɵngDeclareDirective({
14331
+ minVersion: "17.1.0",
14332
+ version: "22.2.2",
14333
+ type: RadioOptionContentDirective,
14334
+ isStandalone: true,
14335
+ selector: "ng-template[uiRadioOptionContent]",
14336
+ inputs: { value: {
14337
+ classPropertyName: "value",
14338
+ publicName: "uiRadioOptionContent",
14339
+ isSignal: true,
14340
+ isRequired: true,
14341
+ transformFunction: null
14342
+ } },
14343
+ ngImport: i0
14344
+ });
14345
+ }
14346
+ };
14347
+ i0.ɵɵngDeclareClassMetadata({
14348
+ minVersion: "12.0.0",
14349
+ version: "22.2.2",
14350
+ ngImport: i0,
14351
+ type: RadioOptionContentDirective,
14352
+ decorators: [{
14353
+ type: Directive,
14354
+ args: [{
14355
+ selector: "ng-template[uiRadioOptionContent]",
14356
+ standalone: true
14357
+ }]
14358
+ }],
14359
+ propDecorators: { value: [{
14360
+ type: i0.Input,
14361
+ args: [{
14362
+ isSignal: true,
14363
+ alias: "uiRadioOptionContent",
14364
+ required: true
14365
+ }]
14366
+ }] }
14367
+ });
13874
14368
  var RadioGroupComponent = class RadioGroupComponent {
13875
14369
  get _name() {
13876
14370
  return this.name() || this._generatedName;
13877
14371
  }
14372
+ _optionLabelId(index) {
14373
+ return `${this._generatedName}-opt-${index}-label`;
14374
+ }
13878
14375
  constructor() {
13879
14376
  this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
13880
14377
  this.options = input([], ...ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []);
@@ -13884,6 +14381,12 @@ var RadioGroupComponent = class RadioGroupComponent {
13884
14381
  this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
13885
14382
  this.orientation = input("vertical", ...ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []);
13886
14383
  this.name = input("", ...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
14384
+ this._optionContent = contentChildren(RadioOptionContentDirective, ...ngDevMode ? [{ debugName: "_optionContent" }] : /* istanbul ignore next */ []);
14385
+ this._nestedContent = computed(() => {
14386
+ const byValue = /* @__PURE__ */ new Map();
14387
+ for (const content of this._optionContent()) byValue.set(content.value(), content.template);
14388
+ return byValue;
14389
+ }, ...ngDevMode ? [{ debugName: "_nestedContent" }] : /* istanbul ignore next */ []);
13887
14390
  this._disabledInput = input(false, {
13888
14391
  ...ngDevMode ? { debugName: "_disabledInput" } : /* istanbul ignore next */ {},
13889
14392
  alias: "disabled"
@@ -13892,6 +14395,7 @@ var RadioGroupComponent = class RadioGroupComponent {
13892
14395
  this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
13893
14396
  this._generatedName = `rg-${Math.random().toString(36).slice(2, 8)}`;
13894
14397
  this._descId = `${this._generatedName}-desc`;
14398
+ this._nestedId = `${this._generatedName}-nested`;
13895
14399
  this._value = signal("", ...ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []);
13896
14400
  this._reveal = createFieldReveal(this.showErrors);
13897
14401
  this._issue = computed(() => this._check(this._value()), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
@@ -14047,6 +14551,11 @@ var RadioGroupComponent = class RadioGroupComponent {
14047
14551
  useExisting: forwardRef(() => RadioGroupComponent)
14048
14552
  }
14049
14553
  ],
14554
+ queries: [{
14555
+ propertyName: "_optionContent",
14556
+ predicate: RadioOptionContentDirective,
14557
+ isSignal: true
14558
+ }],
14050
14559
  usesOnChanges: true,
14051
14560
  ngImport: i0,
14052
14561
  template: `
@@ -14077,7 +14586,12 @@ var RadioGroupComponent = class RadioGroupComponent {
14077
14586
  [disabled]="disabled() || !!opt.disabled"
14078
14587
  [invalid]="!!_activeError()"
14079
14588
  [describedBy]="(_activeError() || hint()) ? _descId : ''"
14589
+ [controls]="(_value() === opt.value && _nestedContent().has(opt.value)) ? _nestedId : ''"
14590
+ [labelId]="_nestedContent().has(opt.value) ? _optionLabelId($index) : ''"
14080
14591
  (selected)="onSelect($event)" />
14592
+ @if (_value() === opt.value && _nestedContent().get(opt.value); as nested) {
14593
+ <div class="rg-nested" role="group" [id]="_nestedId" [attr.aria-labelledby]="opt.label ? _optionLabelId($index) : null"><ng-container [ngTemplateOutlet]="nested" /></div>
14594
+ }
14081
14595
  }
14082
14596
  </div>
14083
14597
  @if (_activeError()) {
@@ -14088,7 +14602,7 @@ var RadioGroupComponent = class RadioGroupComponent {
14088
14602
  </fieldset>
14089
14603
  `,
14090
14604
  isInline: true,
14091
- styles: [":host{display:block}.rg-field{display:flex;flex-direction:column;gap:6px;border:0;margin:0;padding:0;min-width:0}.rg-label{padding:0;margin-bottom:6px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.rg-required{color:#ef4444;margin-left:2px}.rg-options{display:flex;flex-direction:column;gap:10px}.rg-options.rg-horizontal{flex-direction:row;flex-wrap:wrap;gap:8px 20px}.rg-disabled{cursor:not-allowed}.rg-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.rg-desc-error{color:#ef4444}@media(pointer:coarse),(max-width:480px){.rg-options{gap:4px}}\n"],
14605
+ styles: [":host{display:block}.rg-field{display:flex;flex-direction:column;gap:6px;border:0;margin:0;padding:0;min-width:0}.rg-label{padding:0;margin-bottom:6px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.rg-required{color:#ef4444;margin-left:2px}.rg-options{display:flex;flex-direction:column;gap:10px}.rg-options.rg-horizontal{flex-direction:row;flex-wrap:wrap;gap:8px 20px}.rg-nested{padding-left:29px;min-width:0}.rg-options.rg-horizontal .rg-nested{flex:1 0 100%}.rg-disabled{cursor:not-allowed}.rg-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.rg-desc-error{color:#ef4444}@media(pointer:coarse),(max-width:480px){.rg-options{gap:4px}}\n"],
14092
14606
  dependencies: [{
14093
14607
  kind: "component",
14094
14608
  type: RadioComponent,
@@ -14102,9 +14616,20 @@ var RadioGroupComponent = class RadioGroupComponent {
14102
14616
  "checked",
14103
14617
  "invalid",
14104
14618
  "describedBy",
14105
- "disabled"
14619
+ "controls",
14620
+ "disabled",
14621
+ "labelId"
14106
14622
  ],
14107
14623
  outputs: ["selected"]
14624
+ }, {
14625
+ kind: "directive",
14626
+ type: NgTemplateOutlet,
14627
+ selector: "[ngTemplateOutlet]",
14628
+ inputs: [
14629
+ "ngTemplateOutletContext",
14630
+ "ngTemplateOutlet",
14631
+ "ngTemplateOutletInjector"
14632
+ ]
14108
14633
  }],
14109
14634
  changeDetection: i0.ChangeDetectionStrategy.OnPush
14110
14635
  });
@@ -14120,7 +14645,7 @@ i0.ɵɵngDeclareClassMetadata({
14120
14645
  args: [{
14121
14646
  selector: "ui-radio-group",
14122
14647
  standalone: true,
14123
- imports: [RadioComponent],
14648
+ imports: [RadioComponent, NgTemplateOutlet],
14124
14649
  changeDetection: ChangeDetectionStrategy.OnPush,
14125
14650
  providers: [
14126
14651
  {
@@ -14166,7 +14691,12 @@ i0.ɵɵngDeclareClassMetadata({
14166
14691
  [disabled]="disabled() || !!opt.disabled"
14167
14692
  [invalid]="!!_activeError()"
14168
14693
  [describedBy]="(_activeError() || hint()) ? _descId : ''"
14694
+ [controls]="(_value() === opt.value && _nestedContent().has(opt.value)) ? _nestedId : ''"
14695
+ [labelId]="_nestedContent().has(opt.value) ? _optionLabelId($index) : ''"
14169
14696
  (selected)="onSelect($event)" />
14697
+ @if (_value() === opt.value && _nestedContent().get(opt.value); as nested) {
14698
+ <div class="rg-nested" role="group" [id]="_nestedId" [attr.aria-labelledby]="opt.label ? _optionLabelId($index) : null"><ng-container [ngTemplateOutlet]="nested" /></div>
14699
+ }
14170
14700
  }
14171
14701
  </div>
14172
14702
  @if (_activeError()) {
@@ -14176,7 +14706,7 @@ i0.ɵɵngDeclareClassMetadata({
14176
14706
  }
14177
14707
  </fieldset>
14178
14708
  `,
14179
- styles: [":host{display:block}.rg-field{display:flex;flex-direction:column;gap:6px;border:0;margin:0;padding:0;min-width:0}.rg-label{padding:0;margin-bottom:6px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.rg-required{color:#ef4444;margin-left:2px}.rg-options{display:flex;flex-direction:column;gap:10px}.rg-options.rg-horizontal{flex-direction:row;flex-wrap:wrap;gap:8px 20px}.rg-disabled{cursor:not-allowed}.rg-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.rg-desc-error{color:#ef4444}@media(pointer:coarse),(max-width:480px){.rg-options{gap:4px}}\n"]
14709
+ styles: [":host{display:block}.rg-field{display:flex;flex-direction:column;gap:6px;border:0;margin:0;padding:0;min-width:0}.rg-label{padding:0;margin-bottom:6px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.rg-required{color:#ef4444;margin-left:2px}.rg-options{display:flex;flex-direction:column;gap:10px}.rg-options.rg-horizontal{flex-direction:row;flex-wrap:wrap;gap:8px 20px}.rg-nested{padding-left:29px;min-width:0}.rg-options.rg-horizontal .rg-nested{flex:1 0 100%}.rg-disabled{cursor:not-allowed}.rg-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.rg-desc-error{color:#ef4444}@media(pointer:coarse),(max-width:480px){.rg-options{gap:4px}}\n"]
14180
14710
  }]
14181
14711
  }],
14182
14712
  ctorParameters: () => [],
@@ -14245,6 +14775,10 @@ i0.ɵɵngDeclareClassMetadata({
14245
14775
  required: false
14246
14776
  }]
14247
14777
  }],
14778
+ _optionContent: [{
14779
+ type: i0.ContentChildren,
14780
+ args: [i0.forwardRef(() => RadioOptionContentDirective), { isSignal: true }]
14781
+ }],
14248
14782
  _disabledInput: [{
14249
14783
  type: i0.Input,
14250
14784
  args: [{
@@ -14340,7 +14874,7 @@ var AlertComponent = class AlertComponent {
14340
14874
  </div>
14341
14875
  `,
14342
14876
  isInline: true,
14343
- styles: [":host{display:block}.alert{display:flex;align-items:flex-start;gap:12px;padding:12px 14px;border-radius:8px;border-left:4px solid transparent;font-size:13px;line-height:1.5}.alert--info{background:#dbeafe;border-color:#3b82f6;color:#1e3a8a}.alert--success{background:#dcfce7;border-color:#22c55e;color:#14532d}.alert--warning{background:#ffedd5;border-color:#f97316;color:#7c2d12}.alert--danger{background:#fee2e2;border-color:#ef4444;color:#7f1d1d}.alert--compact{padding:8px 12px;gap:8px;font-size:12.5px;line-height:1.4}.alert-content{flex:1;display:flex;flex-direction:column;gap:2px}.alert-title{font-weight:700}.alert-body{opacity:.9;display:flex;align-items:center;flex-wrap:wrap;gap:8px}.alert-dismiss{flex-shrink:0;background:none;border:none;cursor:pointer;padding:2px;border-radius:4px;color:inherit;opacity:.6;display:flex;align-items:center;transition:opacity .15s}.alert-dismiss:hover{opacity:1}\n"],
14877
+ styles: [":host{display:block}.alert{display:flex;align-items:flex-start;gap:12px;padding:12px 14px;border-radius:8px;border-left:4px solid transparent;font-size:13px;line-height:1.5}.alert--info{background:#dbeafe;border-color:#3b82f6;color:#1e3a8a}.alert--success{background:#dcfce7;border-color:#22c55e;color:#14532d}.alert--warning{background:#ffedd5;border-color:#f97316;color:#7c2d12}.alert--danger{background:#fee2e2;border-color:#ef4444;color:#7f1d1d}.alert--neutral{background:#f1f5f9;border-color:#64748b;color:#334155}.alert--compact{padding:8px 12px;gap:8px;font-size:12.5px;line-height:1.4}.alert-content{flex:1;display:flex;flex-direction:column;gap:2px}.alert-title{font-weight:700}.alert-body{opacity:.9;display:flex;align-items:center;flex-wrap:wrap;gap:8px}.alert-dismiss{flex-shrink:0;background:none;border:none;cursor:pointer;padding:2px;border-radius:4px;color:inherit;opacity:.6;display:flex;align-items:center;transition:opacity .15s}.alert-dismiss:hover{opacity:1}\n"],
14344
14878
  changeDetection: i0.ChangeDetectionStrategy.OnPush
14345
14879
  });
14346
14880
  }
@@ -14371,7 +14905,7 @@ i0.ɵɵngDeclareClassMetadata({
14371
14905
  }
14372
14906
  </div>
14373
14907
  `,
14374
- styles: [":host{display:block}.alert{display:flex;align-items:flex-start;gap:12px;padding:12px 14px;border-radius:8px;border-left:4px solid transparent;font-size:13px;line-height:1.5}.alert--info{background:#dbeafe;border-color:#3b82f6;color:#1e3a8a}.alert--success{background:#dcfce7;border-color:#22c55e;color:#14532d}.alert--warning{background:#ffedd5;border-color:#f97316;color:#7c2d12}.alert--danger{background:#fee2e2;border-color:#ef4444;color:#7f1d1d}.alert--compact{padding:8px 12px;gap:8px;font-size:12.5px;line-height:1.4}.alert-content{flex:1;display:flex;flex-direction:column;gap:2px}.alert-title{font-weight:700}.alert-body{opacity:.9;display:flex;align-items:center;flex-wrap:wrap;gap:8px}.alert-dismiss{flex-shrink:0;background:none;border:none;cursor:pointer;padding:2px;border-radius:4px;color:inherit;opacity:.6;display:flex;align-items:center;transition:opacity .15s}.alert-dismiss:hover{opacity:1}\n"]
14908
+ styles: [":host{display:block}.alert{display:flex;align-items:flex-start;gap:12px;padding:12px 14px;border-radius:8px;border-left:4px solid transparent;font-size:13px;line-height:1.5}.alert--info{background:#dbeafe;border-color:#3b82f6;color:#1e3a8a}.alert--success{background:#dcfce7;border-color:#22c55e;color:#14532d}.alert--warning{background:#ffedd5;border-color:#f97316;color:#7c2d12}.alert--danger{background:#fee2e2;border-color:#ef4444;color:#7f1d1d}.alert--neutral{background:#f1f5f9;border-color:#64748b;color:#334155}.alert--compact{padding:8px 12px;gap:8px;font-size:12.5px;line-height:1.4}.alert-content{flex:1;display:flex;flex-direction:column;gap:2px}.alert-title{font-weight:700}.alert-body{opacity:.9;display:flex;align-items:center;flex-wrap:wrap;gap:8px}.alert-dismiss{flex-shrink:0;background:none;border:none;cursor:pointer;padding:2px;border-radius:4px;color:inherit;opacity:.6;display:flex;align-items:center;transition:opacity .15s}.alert-dismiss:hover{opacity:1}\n"]
14375
14909
  }]
14376
14910
  }],
14377
14911
  propDecorators: {
@@ -14884,7 +15418,9 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
14884
15418
  "primaryLabel",
14885
15419
  "primaryVariant",
14886
15420
  "primaryLoading",
14887
- "primaryDisabled"
15421
+ "primaryDisabled",
15422
+ "cancelTestId",
15423
+ "primaryTestId"
14888
15424
  ],
14889
15425
  outputs: ["closed", "primaryClick"]
14890
15426
  },
@@ -14896,6 +15432,7 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
14896
15432
  "label",
14897
15433
  "ariaLabel",
14898
15434
  "placeholder",
15435
+ "prefix",
14899
15436
  "type",
14900
15437
  "maxlength",
14901
15438
  "required",
@@ -14910,6 +15447,7 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
14910
15447
  "maxDecimals",
14911
15448
  "step",
14912
15449
  "valueType",
15450
+ "formatter",
14913
15451
  "showErrors",
14914
15452
  "disabled"
14915
15453
  ],
@@ -14944,6 +15482,7 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
14944
15482
  "variant",
14945
15483
  "routerLink",
14946
15484
  "queryParams",
15485
+ "fragment",
14947
15486
  "href",
14948
15487
  "target",
14949
15488
  "rel",
@@ -16058,7 +16597,7 @@ var ContactPickerComponent = class ContactPickerComponent {
16058
16597
  {
16059
16598
  kind: "component",
16060
16599
  type: CheckboxComponent,
16061
- selector: "ui-checkbox",
16600
+ selector: "ui-checkbox, ui-checkbox-group",
16062
16601
  inputs: [
16063
16602
  "label",
16064
16603
  "ariaLabel",
@@ -16066,6 +16605,9 @@ var ContactPickerComponent = class ContactPickerComponent {
16066
16605
  "checked",
16067
16606
  "options",
16068
16607
  "legend",
16608
+ "orientation",
16609
+ "values",
16610
+ "description",
16069
16611
  "indent",
16070
16612
  "required",
16071
16613
  "requiredMessage",
@@ -16074,7 +16616,11 @@ var ContactPickerComponent = class ContactPickerComponent {
16074
16616
  "showErrors",
16075
16617
  "disabled"
16076
16618
  ],
16077
- outputs: ["checkedChange", "invalidChange"]
16619
+ outputs: [
16620
+ "checkedChange",
16621
+ "valuesChange",
16622
+ "invalidChange"
16623
+ ]
16078
16624
  }
16079
16625
  ],
16080
16626
  changeDetection: i0.ChangeDetectionStrategy.OnPush
@@ -16996,7 +17542,9 @@ var BulkMessagePanelComponent = class BulkMessagePanelComponent {
16996
17542
  "primaryLabel",
16997
17543
  "primaryVariant",
16998
17544
  "primaryLoading",
16999
- "primaryDisabled"
17545
+ "primaryDisabled",
17546
+ "cancelTestId",
17547
+ "primaryTestId"
17000
17548
  ],
17001
17549
  outputs: ["closed", "primaryClick"]
17002
17550
  },
@@ -17015,6 +17563,7 @@ var BulkMessagePanelComponent = class BulkMessagePanelComponent {
17015
17563
  "label",
17016
17564
  "ariaLabel",
17017
17565
  "placeholder",
17566
+ "prefix",
17018
17567
  "type",
17019
17568
  "maxlength",
17020
17569
  "required",
@@ -17029,6 +17578,7 @@ var BulkMessagePanelComponent = class BulkMessagePanelComponent {
17029
17578
  "maxDecimals",
17030
17579
  "step",
17031
17580
  "valueType",
17581
+ "formatter",
17032
17582
  "showErrors",
17033
17583
  "disabled"
17034
17584
  ],
@@ -17544,6 +18094,7 @@ var FileInputComponent = class FileInputComponent {
17544
18094
  this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
17545
18095
  this.showField = input(true, ...ngDevMode ? [{ debugName: "showField" }] : /* istanbul ignore next */ []);
17546
18096
  this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
18097
+ this.toastOnReject = input(false, ...ngDevMode ? [{ debugName: "toastOnReject" }] : /* istanbul ignore next */ []);
17547
18098
  this.clearable = input(false, ...ngDevMode ? [{ debugName: "clearable" }] : /* istanbul ignore next */ []);
17548
18099
  this.removeLabel = input("Remove", ...ngDevMode ? [{ debugName: "removeLabel" }] : /* istanbul ignore next */ []);
17549
18100
  this.maxSize = input(null, ...ngDevMode ? [{ debugName: "maxSize" }] : /* istanbul ignore next */ []);
@@ -17573,6 +18124,7 @@ var FileInputComponent = class FileInputComponent {
17573
18124
  this._inputId = `fi-${Math.random().toString(36).slice(2, 8)}`;
17574
18125
  this.fileEl = viewChild("fileEl", ...ngDevMode ? [{ debugName: "fileEl" }] : /* istanbul ignore next */ []);
17575
18126
  this._dragging = signal(false, ...ngDevMode ? [{ debugName: "_dragging" }] : /* istanbul ignore next */ []);
18127
+ this._toast = inject(ToastService);
17576
18128
  this._rejection = signal("", ...ngDevMode ? [{ debugName: "_rejection" }] : /* istanbul ignore next */ []);
17577
18129
  this._reveal = createFieldReveal(this.showErrors);
17578
18130
  this._issue = computed(() => this.disabled() || !this.required() || this._files().length > 0 ? null : requiredIssue(this.label() || "File"), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
@@ -17723,6 +18275,7 @@ var FileInputComponent = class FileInputComponent {
17723
18275
  }
17724
18276
  this._rejection.set(rejected[0]?.message ?? "");
17725
18277
  rejected.forEach((r) => this.fileRejected.emit(r));
18278
+ if (this.toastOnReject() && rejected.length > 0) this._toast.error(rejected.map((r) => `"${r.file.name}" was not added. ${r.message}`).join(" "));
17726
18279
  if (ok.length === 0) {
17727
18280
  if (native) native.value = "";
17728
18281
  this._files.set([]);
@@ -17830,6 +18383,13 @@ var FileInputComponent = class FileInputComponent {
17830
18383
  isRequired: false,
17831
18384
  transformFunction: null
17832
18385
  },
18386
+ toastOnReject: {
18387
+ classPropertyName: "toastOnReject",
18388
+ publicName: "toastOnReject",
18389
+ isSignal: true,
18390
+ isRequired: false,
18391
+ transformFunction: null
18392
+ },
17833
18393
  clearable: {
17834
18394
  classPropertyName: "clearable",
17835
18395
  publicName: "clearable",
@@ -18230,6 +18790,14 @@ i0.ɵɵngDeclareClassMetadata({
18230
18790
  required: false
18231
18791
  }]
18232
18792
  }],
18793
+ toastOnReject: [{
18794
+ type: i0.Input,
18795
+ args: [{
18796
+ isSignal: true,
18797
+ alias: "toastOnReject",
18798
+ required: false
18799
+ }]
18800
+ }],
18233
18801
  clearable: [{
18234
18802
  type: i0.Input,
18235
18803
  args: [{
@@ -20673,7 +21241,7 @@ var MultiSelectComponent = class MultiSelectComponent {
20673
21241
  }, {
20674
21242
  kind: "component",
20675
21243
  type: CheckboxComponent,
20676
- selector: "ui-checkbox",
21244
+ selector: "ui-checkbox, ui-checkbox-group",
20677
21245
  inputs: [
20678
21246
  "label",
20679
21247
  "ariaLabel",
@@ -20681,6 +21249,9 @@ var MultiSelectComponent = class MultiSelectComponent {
20681
21249
  "checked",
20682
21250
  "options",
20683
21251
  "legend",
21252
+ "orientation",
21253
+ "values",
21254
+ "description",
20684
21255
  "indent",
20685
21256
  "required",
20686
21257
  "requiredMessage",
@@ -20689,7 +21260,11 @@ var MultiSelectComponent = class MultiSelectComponent {
20689
21260
  "showErrors",
20690
21261
  "disabled"
20691
21262
  ],
20692
- outputs: ["checkedChange", "invalidChange"]
21263
+ outputs: [
21264
+ "checkedChange",
21265
+ "valuesChange",
21266
+ "invalidChange"
21267
+ ]
20693
21268
  }],
20694
21269
  changeDetection: i0.ChangeDetectionStrategy.OnPush
20695
21270
  });
@@ -20992,7 +21567,7 @@ var DiscountSelectorComponent = class DiscountSelectorComponent {
20992
21567
  dependencies: [{
20993
21568
  kind: "component",
20994
21569
  type: CheckboxComponent,
20995
- selector: "ui-checkbox",
21570
+ selector: "ui-checkbox, ui-checkbox-group",
20996
21571
  inputs: [
20997
21572
  "label",
20998
21573
  "ariaLabel",
@@ -21000,6 +21575,9 @@ var DiscountSelectorComponent = class DiscountSelectorComponent {
21000
21575
  "checked",
21001
21576
  "options",
21002
21577
  "legend",
21578
+ "orientation",
21579
+ "values",
21580
+ "description",
21003
21581
  "indent",
21004
21582
  "required",
21005
21583
  "requiredMessage",
@@ -21008,7 +21586,11 @@ var DiscountSelectorComponent = class DiscountSelectorComponent {
21008
21586
  "showErrors",
21009
21587
  "disabled"
21010
21588
  ],
21011
- outputs: ["checkedChange", "invalidChange"]
21589
+ outputs: [
21590
+ "checkedChange",
21591
+ "valuesChange",
21592
+ "invalidChange"
21593
+ ]
21012
21594
  }],
21013
21595
  changeDetection: i0.ChangeDetectionStrategy.OnPush
21014
21596
  });
@@ -21636,7 +22218,7 @@ var FormRowComponent = class FormRowComponent {
21636
22218
  ngImport: i0,
21637
22219
  template: `<div class="fr-row" [style.--fr-cols]="cols()"><ng-content /></div>`,
21638
22220
  isInline: true,
21639
- styles: [":host{display:block}.fr-row{display:grid;grid-template-columns:repeat(var(--fr-cols, 2),1fr);gap:12px}@media(max-width:480px){.fr-row{grid-template-columns:1fr}}\n"],
22221
+ styles: [":host{display:block}.fr-row{display:grid;grid-template-columns:repeat(var(--fr-cols, 2),1fr);gap:12px}.fr-row>::ng-deep .ui-span-2{grid-column:span 2}.fr-row>::ng-deep .ui-span-3{grid-column:span 3}.fr-row>::ng-deep .ui-span-all{grid-column:1 / -1}@media(max-width:480px){.fr-row{grid-template-columns:1fr}.fr-row>::ng-deep .ui-span-2,.fr-row>::ng-deep .ui-span-3,.fr-row>::ng-deep .ui-span-all{grid-column:1 / -1}}\n"],
21640
22222
  changeDetection: i0.ChangeDetectionStrategy.OnPush
21641
22223
  });
21642
22224
  }
@@ -21653,7 +22235,7 @@ i0.ɵɵngDeclareClassMetadata({
21653
22235
  standalone: true,
21654
22236
  changeDetection: ChangeDetectionStrategy.OnPush,
21655
22237
  template: `<div class="fr-row" [style.--fr-cols]="cols()"><ng-content /></div>`,
21656
- styles: [":host{display:block}.fr-row{display:grid;grid-template-columns:repeat(var(--fr-cols, 2),1fr);gap:12px}@media(max-width:480px){.fr-row{grid-template-columns:1fr}}\n"]
22238
+ styles: [":host{display:block}.fr-row{display:grid;grid-template-columns:repeat(var(--fr-cols, 2),1fr);gap:12px}.fr-row>::ng-deep .ui-span-2{grid-column:span 2}.fr-row>::ng-deep .ui-span-3{grid-column:span 3}.fr-row>::ng-deep .ui-span-all{grid-column:1 / -1}@media(max-width:480px){.fr-row{grid-template-columns:1fr}.fr-row>::ng-deep .ui-span-2,.fr-row>::ng-deep .ui-span-3,.fr-row>::ng-deep .ui-span-all{grid-column:1 / -1}}\n"]
21657
22239
  }]
21658
22240
  }],
21659
22241
  propDecorators: { cols: [{
@@ -21665,6 +22247,65 @@ i0.ɵɵngDeclareClassMetadata({
21665
22247
  }]
21666
22248
  }] }
21667
22249
  });
22250
+ var FormColSpanDirective = class FormColSpanDirective {
22251
+ constructor() {
22252
+ this.uiColSpan = input("", ...ngDevMode ? [{ debugName: "uiColSpan" }] : /* istanbul ignore next */ []);
22253
+ this._class = computed(() => {
22254
+ const v = String(this.uiColSpan());
22255
+ return v === "2" || v === "3" || v === "all" ? `ui-span-${v}` : "";
22256
+ }, ...ngDevMode ? [{ debugName: "_class" }] : /* istanbul ignore next */ []);
22257
+ }
22258
+ static {
22259
+ this.ɵfac = i0.ɵɵngDeclareFactory({
22260
+ minVersion: "12.0.0",
22261
+ version: "22.2.2",
22262
+ ngImport: i0,
22263
+ type: FormColSpanDirective,
22264
+ deps: [],
22265
+ target: i0.ɵɵFactoryTarget.Directive
22266
+ });
22267
+ }
22268
+ static {
22269
+ this.ɵdir = i0.ɵɵngDeclareDirective({
22270
+ minVersion: "17.1.0",
22271
+ version: "22.2.2",
22272
+ type: FormColSpanDirective,
22273
+ isStandalone: true,
22274
+ selector: "[uiColSpan]",
22275
+ inputs: { uiColSpan: {
22276
+ classPropertyName: "uiColSpan",
22277
+ publicName: "uiColSpan",
22278
+ isSignal: true,
22279
+ isRequired: false,
22280
+ transformFunction: null
22281
+ } },
22282
+ host: { properties: { "class": "_class()" } },
22283
+ ngImport: i0
22284
+ });
22285
+ }
22286
+ };
22287
+ i0.ɵɵngDeclareClassMetadata({
22288
+ minVersion: "12.0.0",
22289
+ version: "22.2.2",
22290
+ ngImport: i0,
22291
+ type: FormColSpanDirective,
22292
+ decorators: [{
22293
+ type: Directive,
22294
+ args: [{
22295
+ selector: "[uiColSpan]",
22296
+ standalone: true,
22297
+ host: { "[class]": "_class()" }
22298
+ }]
22299
+ }],
22300
+ propDecorators: { uiColSpan: [{
22301
+ type: i0.Input,
22302
+ args: [{
22303
+ isSignal: true,
22304
+ alias: "uiColSpan",
22305
+ required: false
22306
+ }]
22307
+ }] }
22308
+ });
21668
22309
  var ListItemComponent = class ListItemComponent {
21669
22310
  constructor() {
21670
22311
  this.leading = input("none", ...ngDevMode ? [{ debugName: "leading" }] : /* istanbul ignore next */ []);
@@ -22602,6 +23243,7 @@ var ListComponent = class ListComponent {
22602
23243
  "variant",
22603
23244
  "routerLink",
22604
23245
  "queryParams",
23246
+ "fragment",
22605
23247
  "href",
22606
23248
  "target",
22607
23249
  "rel",
@@ -23905,6 +24547,7 @@ var QrCodeComponent = class QrCodeComponent {
23905
24547
  "variant",
23906
24548
  "routerLink",
23907
24549
  "queryParams",
24550
+ "fragment",
23908
24551
  "href",
23909
24552
  "target",
23910
24553
  "rel",
@@ -24030,6 +24673,28 @@ var PanelInfoListComponent = class PanelInfoListComponent {
24030
24673
  this.showEmptyState = input(false, ...ngDevMode ? [{ debugName: "showEmptyState" }] : /* istanbul ignore next */ []);
24031
24674
  this.displaySections = computed(() => this.showEmptyState() ? this.sections() : this.sections().filter((s) => s.items.some((i) => !i.hidden)), ...ngDevMode ? [{ debugName: "displaySections" }] : /* istanbul ignore next */ []);
24032
24675
  }
24676
+ hrefOf(item) {
24677
+ let raw = item.href?.trim() ?? "";
24678
+ if (!raw && item.email?.trim()) raw = "mailto:" + item.email.trim();
24679
+ if (!raw && item.phone?.trim()) {
24680
+ const p = item.phone.trim();
24681
+ raw = "tel:" + (p.startsWith("+") ? "+" : "") + p.replace(/\D/g, "");
24682
+ }
24683
+ if (!raw) return null;
24684
+ const scheme = /^([a-z][a-z0-9+.\-]*):/i.exec(raw.replace(/[\u0000-\u0020]/g, ""));
24685
+ return scheme && [
24686
+ "mailto",
24687
+ "tel",
24688
+ "http",
24689
+ "https"
24690
+ ].includes(scheme[1].toLowerCase()) ? raw : null;
24691
+ }
24692
+ isWeb(href) {
24693
+ return /^https?:/i.test(href.replace(/[\u0000-\u0020]/g, ""));
24694
+ }
24695
+ textOf(item) {
24696
+ return item.value || item.email || item.phone || item.href || "";
24697
+ }
24033
24698
  visibleItems(section) {
24034
24699
  return section.items.filter((i) => !i.hidden);
24035
24700
  }
@@ -24088,6 +24753,8 @@ var PanelInfoListComponent = class PanelInfoListComponent {
24088
24753
  <span class="pil-value pil-value--block">
24089
24754
  @if (item.badge) {
24090
24755
  <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" />
24756
+ } @else if (hrefOf(item); as h) {
24757
+ <a class="pil-link pil-link--href" [attr.href]="h" [attr.target]="isWeb(h) ? '_blank' : null" [attr.rel]="isWeb(h) ? 'noopener noreferrer' : null">{{ textOf(item) }}</a>
24091
24758
  } @else {
24092
24759
  <span [class.pil-muted]="item.muted" [class.pil-danger]="item.danger">{{ item.value || '—' }}</span>
24093
24760
  }
@@ -24108,6 +24775,8 @@ var PanelInfoListComponent = class PanelInfoListComponent {
24108
24775
  </span>
24109
24776
  } @else if (item.badge) {
24110
24777
  <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" />
24778
+ } @else if (hrefOf(item); as h) {
24779
+ <a class="pil-link pil-link--href" [attr.href]="h" [attr.target]="isWeb(h) ? '_blank' : null" [attr.rel]="isWeb(h) ? 'noopener noreferrer' : null">{{ textOf(item) }}</a>
24111
24780
  } @else if (item.link && item.value && item.linkIcon) {
24112
24781
  <a class="pil-link-icon" [routerLink]="item.link">
24113
24782
  {{ item.value }}
@@ -24133,7 +24802,7 @@ var PanelInfoListComponent = class PanelInfoListComponent {
24133
24802
  }
24134
24803
  `,
24135
24804
  isInline: true,
24136
- styles: [":host{display:flex;flex-direction:column;gap:12px}.pil-section{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.pil-section-label{display:flex;justify-content:space-between;align-items:center;font-size:.6875rem;font-weight:700;letter-spacing:.07em;color:#94a3b8;text-transform:uppercase;padding:8px 14px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.pil-header-link{font-size:.75rem;font-weight:500;color:#2563eb;text-decoration:none;text-transform:none;letter-spacing:0}.pil-header-link:hover{text-decoration:underline}.pil-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:9px 14px;border-bottom:1px solid #f1f5f9}.pil-row:last-child{border-bottom:none}.pil-label{font-size:.8125rem;color:#64748b;flex-shrink:0}.pil-value{font-size:.875rem;font-weight:500;color:#1e293b;text-align:right;display:flex;align-items:center;justify-content:flex-end}.pil-badges{display:flex;align-items:center;gap:4px;flex-wrap:wrap;justify-content:flex-end}.pil-edit-btn{margin-left:4px;flex-shrink:0}ui-empty-state{padding:12px 0}.pil-muted{color:#1e293b;font-weight:400}.pil-danger{color:#ef4444;font-weight:600}.pil-link{font-size:.875rem;font-weight:500;color:#2563eb;text-decoration:none}.pil-link:hover{text-decoration:underline}.pil-link-icon{display:inline-flex;align-items:center;gap:5px;font-size:.875rem;font-weight:500;color:#1e293b;text-decoration:none}.pil-link-icon svg{color:#94a3b8;flex-shrink:0}.pil-grid-2{display:grid;grid-template-columns:1fr 1fr}.pil-grid-cell{display:flex;flex-direction:column;gap:3px;padding:10px 14px;border-right:1px solid #f1f5f9}.pil-grid-cell:last-child{border-right:none}.pil-value--block{text-align:left;justify-content:flex-start}\n"],
24805
+ styles: [":host{display:flex;flex-direction:column;gap:12px}.pil-section{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.pil-section-label{display:flex;justify-content:space-between;align-items:center;font-size:.6875rem;font-weight:700;letter-spacing:.07em;color:#94a3b8;text-transform:uppercase;padding:8px 14px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.pil-header-link{font-size:.75rem;font-weight:500;color:#2563eb;text-decoration:none;text-transform:none;letter-spacing:0}.pil-header-link:hover{text-decoration:underline}.pil-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:9px 14px;border-bottom:1px solid #f1f5f9}.pil-row:last-child{border-bottom:none}.pil-label{font-size:.8125rem;color:#64748b;flex-shrink:0}.pil-value{font-size:.875rem;font-weight:500;color:#1e293b;text-align:right;display:flex;align-items:center;justify-content:flex-end}.pil-badges{display:flex;align-items:center;gap:4px;flex-wrap:wrap;justify-content:flex-end}.pil-edit-btn{margin-left:4px;flex-shrink:0}ui-empty-state{padding:12px 0}.pil-muted{color:#1e293b;font-weight:400}.pil-danger{color:#ef4444;font-weight:600}.pil-link{font-size:.875rem;font-weight:500;color:#2563eb;text-decoration:none}.pil-link:hover{text-decoration:underline}.pil-link--href{overflow-wrap:anywhere;word-break:break-word}.pil-link:focus-visible,.pil-header-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:2px}.pil-link-icon{display:inline-flex;align-items:center;gap:5px;font-size:.875rem;font-weight:500;color:#1e293b;text-decoration:none}.pil-link-icon svg{color:#94a3b8;flex-shrink:0}.pil-grid-2{display:grid;grid-template-columns:1fr 1fr}.pil-grid-cell{display:flex;flex-direction:column;gap:3px;padding:10px 14px;border-right:1px solid #f1f5f9}.pil-grid-cell:last-child{border-right:none}.pil-value--block{text-align:left;justify-content:flex-start}\n"],
24137
24806
  dependencies: [
24138
24807
  {
24139
24808
  kind: "component",
@@ -24178,6 +24847,7 @@ var PanelInfoListComponent = class PanelInfoListComponent {
24178
24847
  "variant",
24179
24848
  "routerLink",
24180
24849
  "queryParams",
24850
+ "fragment",
24181
24851
  "href",
24182
24852
  "target",
24183
24853
  "rel",
@@ -24239,6 +24909,8 @@ i0.ɵɵngDeclareClassMetadata({
24239
24909
  <span class="pil-value pil-value--block">
24240
24910
  @if (item.badge) {
24241
24911
  <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" />
24912
+ } @else if (hrefOf(item); as h) {
24913
+ <a class="pil-link pil-link--href" [attr.href]="h" [attr.target]="isWeb(h) ? '_blank' : null" [attr.rel]="isWeb(h) ? 'noopener noreferrer' : null">{{ textOf(item) }}</a>
24242
24914
  } @else {
24243
24915
  <span [class.pil-muted]="item.muted" [class.pil-danger]="item.danger">{{ item.value || '—' }}</span>
24244
24916
  }
@@ -24259,6 +24931,8 @@ i0.ɵɵngDeclareClassMetadata({
24259
24931
  </span>
24260
24932
  } @else if (item.badge) {
24261
24933
  <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" />
24934
+ } @else if (hrefOf(item); as h) {
24935
+ <a class="pil-link pil-link--href" [attr.href]="h" [attr.target]="isWeb(h) ? '_blank' : null" [attr.rel]="isWeb(h) ? 'noopener noreferrer' : null">{{ textOf(item) }}</a>
24262
24936
  } @else if (item.link && item.value && item.linkIcon) {
24263
24937
  <a class="pil-link-icon" [routerLink]="item.link">
24264
24938
  {{ item.value }}
@@ -24283,7 +24957,7 @@ i0.ɵɵngDeclareClassMetadata({
24283
24957
  </div>
24284
24958
  }
24285
24959
  `,
24286
- styles: [":host{display:flex;flex-direction:column;gap:12px}.pil-section{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.pil-section-label{display:flex;justify-content:space-between;align-items:center;font-size:.6875rem;font-weight:700;letter-spacing:.07em;color:#94a3b8;text-transform:uppercase;padding:8px 14px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.pil-header-link{font-size:.75rem;font-weight:500;color:#2563eb;text-decoration:none;text-transform:none;letter-spacing:0}.pil-header-link:hover{text-decoration:underline}.pil-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:9px 14px;border-bottom:1px solid #f1f5f9}.pil-row:last-child{border-bottom:none}.pil-label{font-size:.8125rem;color:#64748b;flex-shrink:0}.pil-value{font-size:.875rem;font-weight:500;color:#1e293b;text-align:right;display:flex;align-items:center;justify-content:flex-end}.pil-badges{display:flex;align-items:center;gap:4px;flex-wrap:wrap;justify-content:flex-end}.pil-edit-btn{margin-left:4px;flex-shrink:0}ui-empty-state{padding:12px 0}.pil-muted{color:#1e293b;font-weight:400}.pil-danger{color:#ef4444;font-weight:600}.pil-link{font-size:.875rem;font-weight:500;color:#2563eb;text-decoration:none}.pil-link:hover{text-decoration:underline}.pil-link-icon{display:inline-flex;align-items:center;gap:5px;font-size:.875rem;font-weight:500;color:#1e293b;text-decoration:none}.pil-link-icon svg{color:#94a3b8;flex-shrink:0}.pil-grid-2{display:grid;grid-template-columns:1fr 1fr}.pil-grid-cell{display:flex;flex-direction:column;gap:3px;padding:10px 14px;border-right:1px solid #f1f5f9}.pil-grid-cell:last-child{border-right:none}.pil-value--block{text-align:left;justify-content:flex-start}\n"]
24960
+ styles: [":host{display:flex;flex-direction:column;gap:12px}.pil-section{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.pil-section-label{display:flex;justify-content:space-between;align-items:center;font-size:.6875rem;font-weight:700;letter-spacing:.07em;color:#94a3b8;text-transform:uppercase;padding:8px 14px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.pil-header-link{font-size:.75rem;font-weight:500;color:#2563eb;text-decoration:none;text-transform:none;letter-spacing:0}.pil-header-link:hover{text-decoration:underline}.pil-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:9px 14px;border-bottom:1px solid #f1f5f9}.pil-row:last-child{border-bottom:none}.pil-label{font-size:.8125rem;color:#64748b;flex-shrink:0}.pil-value{font-size:.875rem;font-weight:500;color:#1e293b;text-align:right;display:flex;align-items:center;justify-content:flex-end}.pil-badges{display:flex;align-items:center;gap:4px;flex-wrap:wrap;justify-content:flex-end}.pil-edit-btn{margin-left:4px;flex-shrink:0}ui-empty-state{padding:12px 0}.pil-muted{color:#1e293b;font-weight:400}.pil-danger{color:#ef4444;font-weight:600}.pil-link{font-size:.875rem;font-weight:500;color:#2563eb;text-decoration:none}.pil-link:hover{text-decoration:underline}.pil-link--href{overflow-wrap:anywhere;word-break:break-word}.pil-link:focus-visible,.pil-header-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:2px}.pil-link-icon{display:inline-flex;align-items:center;gap:5px;font-size:.875rem;font-weight:500;color:#1e293b;text-decoration:none}.pil-link-icon svg{color:#94a3b8;flex-shrink:0}.pil-grid-2{display:grid;grid-template-columns:1fr 1fr}.pil-grid-cell{display:flex;flex-direction:column;gap:3px;padding:10px 14px;border-right:1px solid #f1f5f9}.pil-grid-cell:last-child{border-right:none}.pil-value--block{text-align:left;justify-content:flex-start}\n"]
24287
24961
  }]
24288
24962
  }],
24289
24963
  propDecorators: {
@@ -25502,7 +26176,15 @@ const EXTRA_ICONS = {
25502
26176
  "chevron-down": "M6 9l6 6 6-6",
25503
26177
  "arrow-left": "M19 12H5 M12 19l-7-7 7-7",
25504
26178
  "bell": "M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9 M13.73 21a2 2 0 0 1-3.46 0",
25505
- "print": "M6 9V2h12v7 M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2 M6 14h12v8H6z"
26179
+ "print": "M6 9V2h12v7 M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2 M6 14h12v8H6z",
26180
+ "lock": "M5 11h14a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2z M7 11V7a5 5 0 0 1 10 0v4",
26181
+ "arrow-up": "M12 19V5 M5 12l7-7 7 7",
26182
+ "arrow-down": "M12 5v14 M19 12l-7 7-7-7",
26183
+ "arrow-right": "M5 12h14 M12 5l7 7-7 7",
26184
+ "document": "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z M14 2v6h6 M16 13H8 M16 17H8 M10 9H8",
26185
+ "grip": "M9 5h.01 M15 5h.01 M9 12h.01 M15 12h.01 M9 19h.01 M15 19h.01",
26186
+ "card": "M3 4h18a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z M1 10h22",
26187
+ "bank": "M3 21h18 M3 10h18 M5 6l7-3 7 3 M4 10v11 M20 10v11 M8 14v3 M12 14v3 M16 14v3"
25506
26188
  };
25507
26189
  function iconPath(name) {
25508
26190
  return Object.prototype.hasOwnProperty.call(EXTRA_ICONS, name) ? EXTRA_ICONS[name] : builtInActionIcon(name);
@@ -25757,17 +26439,18 @@ i0.ɵɵngDeclareClassMetadata({
25757
26439
  }]
25758
26440
  }
25759
26441
  });
25760
- var ErrorComponent = class ErrorComponent {
26442
+ var TimelineComponent = class TimelineComponent {
25761
26443
  constructor() {
25762
- this.message = input("", ...ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []);
25763
- this.errorId = input("", ...ngDevMode ? [{ debugName: "errorId" }] : /* istanbul ignore next */ []);
26444
+ this.items = input([], ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
26445
+ this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
26446
+ this.emptyMessage = input("", ...ngDevMode ? [{ debugName: "emptyMessage" }] : /* istanbul ignore next */ []);
25764
26447
  }
25765
26448
  static {
25766
26449
  this.ɵfac = i0.ɵɵngDeclareFactory({
25767
26450
  minVersion: "12.0.0",
25768
26451
  version: "22.2.2",
25769
26452
  ngImport: i0,
25770
- type: ErrorComponent,
26453
+ type: TimelineComponent,
25771
26454
  deps: [],
25772
26455
  target: i0.ɵɵFactoryTarget.Component
25773
26456
  });
@@ -25776,20 +26459,27 @@ var ErrorComponent = class ErrorComponent {
25776
26459
  this.ɵcmp = i0.ɵɵngDeclareComponent({
25777
26460
  minVersion: "17.0.0",
25778
26461
  version: "22.2.2",
25779
- type: ErrorComponent,
26462
+ type: TimelineComponent,
25780
26463
  isStandalone: true,
25781
- selector: "ui-error",
26464
+ selector: "ui-timeline",
25782
26465
  inputs: {
25783
- message: {
25784
- classPropertyName: "message",
25785
- publicName: "message",
26466
+ items: {
26467
+ classPropertyName: "items",
26468
+ publicName: "items",
25786
26469
  isSignal: true,
25787
26470
  isRequired: false,
25788
26471
  transformFunction: null
25789
26472
  },
25790
- errorId: {
25791
- classPropertyName: "errorId",
25792
- publicName: "errorId",
26473
+ ariaLabel: {
26474
+ classPropertyName: "ariaLabel",
26475
+ publicName: "ariaLabel",
26476
+ isSignal: true,
26477
+ isRequired: false,
26478
+ transformFunction: null
26479
+ },
26480
+ emptyMessage: {
26481
+ classPropertyName: "emptyMessage",
26482
+ publicName: "emptyMessage",
25793
26483
  isSignal: true,
25794
26484
  isRequired: false,
25795
26485
  transformFunction: null
@@ -25797,12 +26487,61 @@ var ErrorComponent = class ErrorComponent {
25797
26487
  },
25798
26488
  ngImport: i0,
25799
26489
  template: `
25800
- @if (message()) {
25801
- <p class="ui-error" role="alert" [attr.id]="errorId() || null">{{ message() }}</p>
26490
+ @if (items().length) {
26491
+ <ol class="tl" [attr.aria-label]="ariaLabel() || null">
26492
+ @for (item of items(); track item.id ?? $index) {
26493
+ <li class="tl-item" [class]="'tl-item tl-item--' + (item.tone ?? 'default')" [class.tl-item--icon]="!!item.icon">
26494
+ <span class="tl-marker" aria-hidden="true">
26495
+ @if (item.icon) { <ui-icon [name]="item.icon" [interactive]="false" [size]="12" /> }
26496
+ </span>
26497
+ <div class="tl-content">
26498
+ <div class="tl-head">
26499
+ <span class="tl-title">{{ item.title }}</span>
26500
+ @if (item.badge) { <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" /> }
26501
+ </div>
26502
+ @if (item.description) { <p class="tl-description">{{ item.description }}</p> }
26503
+ @if (item.time || item.dateTime) {
26504
+ <time class="tl-time" [attr.datetime]="item.dateTime || null">{{ item.time || item.dateTime }}</time>
26505
+ }
26506
+ </div>
26507
+ </li>
26508
+ }
26509
+ </ol>
26510
+ } @else if (emptyMessage()) {
26511
+ <ui-hint class="tl-empty">{{ emptyMessage() }}</ui-hint>
25802
26512
  }
25803
26513
  `,
25804
26514
  isInline: true,
25805
- styles: [":host{display:block}.ui-error{margin:6px 0 0;font-size:.75rem;line-height:1.4;color:#ef4444}\n"],
26515
+ styles: [":host{display:block}.tl{list-style:none;margin:0;padding:0}.tl-item{position:relative;display:flex;gap:12px;padding-bottom:16px;--tl-color: #475569}.tl-item:last-child{padding-bottom:0}.tl-item:before{content:\"\";position:absolute;left:7px;top:18px;bottom:-2px;width:2px;background:#e2e8f0}.tl-item:last-child:before{display:none}.tl-item--success{--tl-color: #15803d}.tl-item--warning{--tl-color: #b45309}.tl-item--danger{--tl-color: #b91c1c}.tl-marker{flex-shrink:0;box-sizing:border-box;width:16px;height:16px;margin-top:2px;border-radius:50%;background:var(--tl-color);border:3px solid #fff;box-shadow:0 0 0 1px var(--tl-color);display:inline-flex;align-items:center;justify-content:center;position:relative;z-index:1}.tl-item--icon .tl-marker{border:none;box-shadow:none;color:#fff}.tl-content{flex:1;min-width:0;overflow-wrap:anywhere;word-break:break-word}.tl-head{display:flex;align-items:center;flex-wrap:wrap;gap:4px 8px}.tl-title{font-size:.875rem;font-weight:600;color:#1e293b;line-height:1.4}.tl-description{margin:2px 0 0;font-size:.8125rem;line-height:1.5;color:#475569}.tl-time{display:block;margin-top:2px;font-size:.75rem;color:#64748b}\n"],
26516
+ dependencies: [
26517
+ {
26518
+ kind: "component",
26519
+ type: BadgeComponent,
26520
+ selector: "ui-badge",
26521
+ inputs: ["label", "variant"]
26522
+ },
26523
+ {
26524
+ kind: "component",
26525
+ type: HintComponent,
26526
+ selector: "ui-hint"
26527
+ },
26528
+ {
26529
+ kind: "component",
26530
+ type: IconComponent,
26531
+ selector: "ui-icon",
26532
+ inputs: [
26533
+ "name",
26534
+ "tooltip",
26535
+ "ariaLabel",
26536
+ "size",
26537
+ "variant",
26538
+ "disabled",
26539
+ "loading",
26540
+ "interactive"
26541
+ ],
26542
+ outputs: ["iconClick"]
26543
+ }
26544
+ ],
25806
26545
  changeDetection: i0.ChangeDetectionStrategy.OnPush
25807
26546
  });
25808
26547
  }
@@ -25811,43 +26550,164 @@ i0.ɵɵngDeclareClassMetadata({
25811
26550
  minVersion: "12.0.0",
25812
26551
  version: "22.2.2",
25813
26552
  ngImport: i0,
25814
- type: ErrorComponent,
26553
+ type: TimelineComponent,
25815
26554
  decorators: [{
25816
26555
  type: Component,
25817
26556
  args: [{
25818
- selector: "ui-error",
26557
+ selector: "ui-timeline",
25819
26558
  standalone: true,
25820
26559
  changeDetection: ChangeDetectionStrategy.OnPush,
26560
+ imports: [
26561
+ BadgeComponent,
26562
+ HintComponent,
26563
+ IconComponent
26564
+ ],
25821
26565
  template: `
25822
- @if (message()) {
25823
- <p class="ui-error" role="alert" [attr.id]="errorId() || null">{{ message() }}</p>
26566
+ @if (items().length) {
26567
+ <ol class="tl" [attr.aria-label]="ariaLabel() || null">
26568
+ @for (item of items(); track item.id ?? $index) {
26569
+ <li class="tl-item" [class]="'tl-item tl-item--' + (item.tone ?? 'default')" [class.tl-item--icon]="!!item.icon">
26570
+ <span class="tl-marker" aria-hidden="true">
26571
+ @if (item.icon) { <ui-icon [name]="item.icon" [interactive]="false" [size]="12" /> }
26572
+ </span>
26573
+ <div class="tl-content">
26574
+ <div class="tl-head">
26575
+ <span class="tl-title">{{ item.title }}</span>
26576
+ @if (item.badge) { <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" /> }
26577
+ </div>
26578
+ @if (item.description) { <p class="tl-description">{{ item.description }}</p> }
26579
+ @if (item.time || item.dateTime) {
26580
+ <time class="tl-time" [attr.datetime]="item.dateTime || null">{{ item.time || item.dateTime }}</time>
26581
+ }
26582
+ </div>
26583
+ </li>
26584
+ }
26585
+ </ol>
26586
+ } @else if (emptyMessage()) {
26587
+ <ui-hint class="tl-empty">{{ emptyMessage() }}</ui-hint>
25824
26588
  }
25825
26589
  `,
25826
- styles: [":host{display:block}.ui-error{margin:6px 0 0;font-size:.75rem;line-height:1.4;color:#ef4444}\n"]
26590
+ styles: [":host{display:block}.tl{list-style:none;margin:0;padding:0}.tl-item{position:relative;display:flex;gap:12px;padding-bottom:16px;--tl-color: #475569}.tl-item:last-child{padding-bottom:0}.tl-item:before{content:\"\";position:absolute;left:7px;top:18px;bottom:-2px;width:2px;background:#e2e8f0}.tl-item:last-child:before{display:none}.tl-item--success{--tl-color: #15803d}.tl-item--warning{--tl-color: #b45309}.tl-item--danger{--tl-color: #b91c1c}.tl-marker{flex-shrink:0;box-sizing:border-box;width:16px;height:16px;margin-top:2px;border-radius:50%;background:var(--tl-color);border:3px solid #fff;box-shadow:0 0 0 1px var(--tl-color);display:inline-flex;align-items:center;justify-content:center;position:relative;z-index:1}.tl-item--icon .tl-marker{border:none;box-shadow:none;color:#fff}.tl-content{flex:1;min-width:0;overflow-wrap:anywhere;word-break:break-word}.tl-head{display:flex;align-items:center;flex-wrap:wrap;gap:4px 8px}.tl-title{font-size:.875rem;font-weight:600;color:#1e293b;line-height:1.4}.tl-description{margin:2px 0 0;font-size:.8125rem;line-height:1.5;color:#475569}.tl-time{display:block;margin-top:2px;font-size:.75rem;color:#64748b}\n"]
25827
26591
  }]
25828
26592
  }],
25829
26593
  propDecorators: {
25830
- message: [{
26594
+ items: [{
25831
26595
  type: i0.Input,
25832
26596
  args: [{
25833
26597
  isSignal: true,
25834
- alias: "message",
26598
+ alias: "items",
25835
26599
  required: false
25836
26600
  }]
25837
26601
  }],
25838
- errorId: [{
26602
+ ariaLabel: [{
25839
26603
  type: i0.Input,
25840
26604
  args: [{
25841
26605
  isSignal: true,
25842
- alias: "errorId",
26606
+ alias: "ariaLabel",
25843
26607
  required: false
25844
26608
  }]
25845
- }]
25846
- }
25847
- });
25848
- var KpiCardComponent = class KpiCardComponent {
25849
- constructor() {
25850
- this.sanitizer = inject(DomSanitizer);
26609
+ }],
26610
+ emptyMessage: [{
26611
+ type: i0.Input,
26612
+ args: [{
26613
+ isSignal: true,
26614
+ alias: "emptyMessage",
26615
+ required: false
26616
+ }]
26617
+ }]
26618
+ }
26619
+ });
26620
+ var ErrorComponent = class ErrorComponent {
26621
+ constructor() {
26622
+ this.message = input("", ...ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []);
26623
+ this.errorId = input("", ...ngDevMode ? [{ debugName: "errorId" }] : /* istanbul ignore next */ []);
26624
+ }
26625
+ static {
26626
+ this.ɵfac = i0.ɵɵngDeclareFactory({
26627
+ minVersion: "12.0.0",
26628
+ version: "22.2.2",
26629
+ ngImport: i0,
26630
+ type: ErrorComponent,
26631
+ deps: [],
26632
+ target: i0.ɵɵFactoryTarget.Component
26633
+ });
26634
+ }
26635
+ static {
26636
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
26637
+ minVersion: "17.0.0",
26638
+ version: "22.2.2",
26639
+ type: ErrorComponent,
26640
+ isStandalone: true,
26641
+ selector: "ui-error",
26642
+ inputs: {
26643
+ message: {
26644
+ classPropertyName: "message",
26645
+ publicName: "message",
26646
+ isSignal: true,
26647
+ isRequired: false,
26648
+ transformFunction: null
26649
+ },
26650
+ errorId: {
26651
+ classPropertyName: "errorId",
26652
+ publicName: "errorId",
26653
+ isSignal: true,
26654
+ isRequired: false,
26655
+ transformFunction: null
26656
+ }
26657
+ },
26658
+ ngImport: i0,
26659
+ template: `
26660
+ @if (message()) {
26661
+ <p class="ui-error" role="alert" [attr.id]="errorId() || null">{{ message() }}</p>
26662
+ }
26663
+ `,
26664
+ isInline: true,
26665
+ styles: [":host{display:block}.ui-error{margin:6px 0 0;font-size:.75rem;line-height:1.4;color:#ef4444}\n"],
26666
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
26667
+ });
26668
+ }
26669
+ };
26670
+ i0.ɵɵngDeclareClassMetadata({
26671
+ minVersion: "12.0.0",
26672
+ version: "22.2.2",
26673
+ ngImport: i0,
26674
+ type: ErrorComponent,
26675
+ decorators: [{
26676
+ type: Component,
26677
+ args: [{
26678
+ selector: "ui-error",
26679
+ standalone: true,
26680
+ changeDetection: ChangeDetectionStrategy.OnPush,
26681
+ template: `
26682
+ @if (message()) {
26683
+ <p class="ui-error" role="alert" [attr.id]="errorId() || null">{{ message() }}</p>
26684
+ }
26685
+ `,
26686
+ styles: [":host{display:block}.ui-error{margin:6px 0 0;font-size:.75rem;line-height:1.4;color:#ef4444}\n"]
26687
+ }]
26688
+ }],
26689
+ propDecorators: {
26690
+ message: [{
26691
+ type: i0.Input,
26692
+ args: [{
26693
+ isSignal: true,
26694
+ alias: "message",
26695
+ required: false
26696
+ }]
26697
+ }],
26698
+ errorId: [{
26699
+ type: i0.Input,
26700
+ args: [{
26701
+ isSignal: true,
26702
+ alias: "errorId",
26703
+ required: false
26704
+ }]
26705
+ }]
26706
+ }
26707
+ });
26708
+ var KpiCardComponent = class KpiCardComponent {
26709
+ constructor() {
26710
+ this.sanitizer = inject(DomSanitizer);
25851
26711
  this.host = inject(ElementRef);
25852
26712
  this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
25853
26713
  this.value = input("", ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
@@ -26447,6 +27307,7 @@ var DateRangePickerComponent = class DateRangePickerComponent {
26447
27307
  "variant",
26448
27308
  "routerLink",
26449
27309
  "queryParams",
27310
+ "fragment",
26450
27311
  "href",
26451
27312
  "target",
26452
27313
  "rel",
@@ -28260,7 +29121,9 @@ var RadioMatrixComponent = class RadioMatrixComponent {
28260
29121
  "checked",
28261
29122
  "invalid",
28262
29123
  "describedBy",
28263
- "disabled"
29124
+ "controls",
29125
+ "disabled",
29126
+ "labelId"
28264
29127
  ],
28265
29128
  outputs: ["selected"]
28266
29129
  }],
@@ -28442,43 +29305,318 @@ i0.ɵɵngDeclareClassMetadata({
28442
29305
  }]
28443
29306
  }
28444
29307
  });
28445
- var DetailCardComponent = class DetailCardComponent {
29308
+ let nextPadId = 0;
29309
+ var SignaturePadComponent = class SignaturePadComponent {
28446
29310
  constructor() {
28447
- this.title = input("", ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
28448
- this.headingLevel = input(null, ...ngDevMode ? [{ debugName: "headingLevel" }] : /* istanbul ignore next */ []);
28449
- this.titleId = input("", ...ngDevMode ? [{ debugName: "titleId" }] : /* istanbul ignore next */ []);
29311
+ this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
28450
29312
  this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
28451
- this.subtitle = input("", ...ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []);
28452
- this.background = input("", ...ngDevMode ? [{ debugName: "background" }] : /* istanbul ignore next */ []);
28453
- this.textColor = input("", ...ngDevMode ? [{ debugName: "textColor" }] : /* istanbul ignore next */ []);
28454
- this.showHeader = input(true, ...ngDevMode ? [{ debugName: "showHeader" }] : /* istanbul ignore next */ []);
28455
- this.collapsible = input(true, ...ngDevMode ? [{ debugName: "collapsible" }] : /* istanbul ignore next */ []);
28456
- this.expanded = model(true, ...ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []);
28457
- this.showEdit = input(false, ...ngDevMode ? [{ debugName: "showEdit" }] : /* istanbul ignore next */ []);
28458
- this.editLabel = input("Edit", ...ngDevMode ? [{ debugName: "editLabel" }] : /* istanbul ignore next */ []);
28459
- this.editClick = output();
29313
+ this.hint = input("", ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
29314
+ this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
29315
+ this.width = input(600, ...ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []);
29316
+ this.height = input(120, ...ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []);
29317
+ this.outputWidth = input(600, ...ngDevMode ? [{ debugName: "outputWidth" }] : /* istanbul ignore next */ []);
29318
+ this.outputHeight = input(60, ...ngDevMode ? [{ debugName: "outputHeight" }] : /* istanbul ignore next */ []);
29319
+ this.penColor = input("#000000", ...ngDevMode ? [{ debugName: "penColor" }] : /* istanbul ignore next */ []);
29320
+ this.penWidth = input(3, ...ngDevMode ? [{ debugName: "penWidth" }] : /* istanbul ignore next */ []);
29321
+ this.showClear = input(true, ...ngDevMode ? [{ debugName: "showClear" }] : /* istanbul ignore next */ []);
29322
+ this.clearLabel = input("Clear", ...ngDevMode ? [{ debugName: "clearLabel" }] : /* istanbul ignore next */ []);
29323
+ this._disabledInput = input(false, {
29324
+ ...ngDevMode ? { debugName: "_disabledInput" } : /* istanbul ignore next */ {},
29325
+ alias: "disabled"
29326
+ });
29327
+ this.signatureChange = output();
29328
+ this._canvas = viewChild("canvas", ...ngDevMode ? [{ debugName: "_canvas" }] : /* istanbul ignore next */ []);
29329
+ this._cvaDisabled = signal(false, ...ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []);
29330
+ this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
29331
+ this._empty = signal(true, ...ngDevMode ? [{ debugName: "_empty" }] : /* istanbul ignore next */ []);
29332
+ this._cursorVisible = signal(false, ...ngDevMode ? [{ debugName: "_cursorVisible" }] : /* istanbul ignore next */ []);
29333
+ this._cursorX = signal(0, ...ngDevMode ? [{ debugName: "_cursorX" }] : /* istanbul ignore next */ []);
29334
+ this._cursorY = signal(0, ...ngDevMode ? [{ debugName: "_cursorY" }] : /* istanbul ignore next */ []);
29335
+ this._keyboardDrawing = signal(false, ...ngDevMode ? [{ debugName: "_keyboardDrawing" }] : /* istanbul ignore next */ []);
29336
+ this._announcement = signal("", ...ngDevMode ? [{ debugName: "_announcement" }] : /* istanbul ignore next */ []);
29337
+ this._keyboardHelp = "Use the arrow keys to move the cursor, hold Space to draw, press Escape to hide the cursor.";
29338
+ this._injector = inject(Injector);
29339
+ this._id = ++nextPadId;
29340
+ this._labelId = `sp-label-${this._id}`;
29341
+ this._descId = `sp-desc-${this._id}`;
29342
+ this._helpId = `sp-help-${this._id}`;
29343
+ this._accessibleName = computed(() => this.ariaLabel() || (this.label() ? null : "Signature pad"), ...ngDevMode ? [{ debugName: "_accessibleName" }] : /* istanbul ignore next */ []);
29344
+ this._describedBy = computed(() => (this.error() || this.hint() ? this._descId + " " : "") + this._helpId, ...ngDevMode ? [{ debugName: "_describedBy" }] : /* istanbul ignore next */ []);
29345
+ this._ctx = null;
29346
+ this._pointerId = null;
29347
+ this._dirty = false;
29348
+ this._pendingImage = false;
29349
+ this._value = null;
29350
+ this._loading = false;
29351
+ this._sizeKey = null;
29352
+ this._onChange = () => {};
29353
+ this._onTouched = () => {};
29354
+ effect(() => {
29355
+ const canvas = this._canvas()?.nativeElement;
29356
+ const sizeKey = `${this.width()}x${this.height()}`;
29357
+ this.penColor();
29358
+ this.penWidth();
29359
+ if (canvas) untracked(() => {
29360
+ this._setUpContext(canvas);
29361
+ if (this._sizeKey !== null && this._sizeKey !== sizeKey) this._repaintAfterResize();
29362
+ this._sizeKey = sizeKey;
29363
+ if (this._pendingImage && this._value && this._ctx) {
29364
+ this._pendingImage = false;
29365
+ this._paint(this._value, canvas, this._ctx);
29366
+ }
29367
+ });
29368
+ });
28460
29369
  }
28461
- groupLabel() {
28462
- if (this.showHeader() && this.title()) return this.titleId() ? null : this.title();
28463
- return this.ariaLabel().trim() || null;
29370
+ isEmpty() {
29371
+ return this._empty();
28464
29372
  }
28465
- isOpen() {
28466
- return !(this.showHeader() && this.collapsible()) || this.expanded();
29373
+ toDataUrl() {
29374
+ if (this._empty()) return null;
29375
+ return this._loading || this._pendingImage ? this._value : this._normalize();
28467
29376
  }
28468
- toggle() {
28469
- this.expanded.set(!this.expanded());
29377
+ clear() {
29378
+ this._clearBitmap();
29379
+ this._value = null;
29380
+ this._pendingImage = false;
29381
+ this._loading = false;
29382
+ const wasEmpty = this._empty();
29383
+ this._empty.set(true);
29384
+ this._dirty = false;
29385
+ this._keyboardDrawing.set(false);
29386
+ this._cursorVisible.set(false);
29387
+ if (!wasEmpty) this._announcement.set("Signature cleared");
29388
+ this._onChange(null);
29389
+ this.signatureChange.emit(null);
29390
+ }
29391
+ writeValue(value) {
29392
+ this._value = value || null;
29393
+ this._pendingImage = false;
29394
+ this._loading = false;
29395
+ this._clearBitmap();
29396
+ this._announcement.set("");
29397
+ this._dirty = false;
29398
+ if (!value) {
29399
+ this._empty.set(true);
29400
+ return;
29401
+ }
29402
+ this._empty.set(false);
29403
+ const canvas = this._canvas()?.nativeElement;
29404
+ const ctx = canvas ? this._contextOf(canvas) : null;
29405
+ if (!canvas || !ctx) {
29406
+ this._pendingImage = true;
29407
+ return;
29408
+ }
29409
+ this._paint(value, canvas, ctx);
28470
29410
  }
28471
- onHeaderClick(event) {
28472
- if (!this.showHeader() || !this.collapsible()) return;
28473
- if (event.target?.closest("button, a, input, select, textarea, label, [role=\"button\"], [role=\"link\"], [tabindex]:not([tabindex=\"-1\"])")?.closest(".dc-header")) return;
28474
- this.toggle();
29411
+ _paint(value, canvas, ctx) {
29412
+ const image = new Image();
29413
+ this._loading = true;
29414
+ image.onerror = () => {
29415
+ if (this._value === value) this._loading = false;
29416
+ };
29417
+ image.onload = () => {
29418
+ if (this._value !== value) return;
29419
+ this._loading = false;
29420
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
29421
+ const scale = Math.min(canvas.width / image.width, canvas.height / image.height);
29422
+ const drawWidth = image.width * scale;
29423
+ const drawHeight = image.height * scale;
29424
+ ctx.drawImage(image, 0, (canvas.height - drawHeight) / 2, drawWidth, drawHeight);
29425
+ };
29426
+ image.src = value;
29427
+ }
29428
+ _repaintAfterResize() {
29429
+ afterNextRender(() => {
29430
+ const canvas = this._canvas()?.nativeElement;
29431
+ const ctx = canvas ? this._contextOf(canvas) : null;
29432
+ if (!canvas || !ctx || this._empty() || !this._value) return;
29433
+ this._paint(this._value, canvas, ctx);
29434
+ }, { injector: this._injector });
29435
+ }
29436
+ registerOnChange(fn) {
29437
+ this._onChange = fn;
29438
+ }
29439
+ registerOnTouched(fn) {
29440
+ this._onTouched = fn;
29441
+ }
29442
+ setDisabledState(disabled) {
29443
+ this._cvaDisabled.set(disabled);
29444
+ }
29445
+ onPointerDown(event) {
29446
+ if (this.disabled() || event.pointerType === "mouse" && event.button !== 0) return;
29447
+ if (!event.isPrimary) return;
29448
+ if (this._pointerId !== null) {
29449
+ if (event.pointerId !== this._pointerId) return;
29450
+ this._pointerId = null;
29451
+ this._commit();
29452
+ }
29453
+ const canvas = this._canvas()?.nativeElement;
29454
+ const ctx = canvas ? this._contextOf(canvas) : null;
29455
+ if (!canvas || !ctx) return;
29456
+ event.preventDefault();
29457
+ this._applyPen(ctx);
29458
+ this._pointerId = event.pointerId;
29459
+ canvas.setPointerCapture?.(event.pointerId);
29460
+ this._cursorVisible.set(false);
29461
+ const point = this._pointOf(event.clientX, event.clientY, canvas);
29462
+ ctx.beginPath();
29463
+ ctx.moveTo(point.x, point.y);
29464
+ ctx.lineTo(point.x + .01, point.y);
29465
+ ctx.stroke();
29466
+ this._dirty = true;
29467
+ }
29468
+ onPointerMove(event) {
29469
+ if (this._pointerId === null || event.pointerId !== this._pointerId) return;
29470
+ const canvas = this._canvas()?.nativeElement;
29471
+ const ctx = this._ctx;
29472
+ if (!canvas || !ctx) return;
29473
+ event.preventDefault();
29474
+ const point = this._pointOf(event.clientX, event.clientY, canvas);
29475
+ ctx.lineTo(point.x, point.y);
29476
+ ctx.stroke();
29477
+ }
29478
+ onPointerEnd(event) {
29479
+ if (this._pointerId === null || event.pointerId !== this._pointerId) return;
29480
+ this._pointerId = null;
29481
+ this._commit();
29482
+ }
29483
+ onKeyDown(event) {
29484
+ if (this.disabled()) return;
29485
+ const canvas = this._canvas()?.nativeElement;
29486
+ const ctx = canvas ? this._contextOf(canvas) : null;
29487
+ if (!ctx) return;
29488
+ if (event.key === "Escape") {
29489
+ if (this._cursorVisible()) {
29490
+ event.stopPropagation();
29491
+ this._stopKeyboardStroke();
29492
+ this._cursorVisible.set(false);
29493
+ }
29494
+ return;
29495
+ }
29496
+ const isArrow = [
29497
+ "ArrowUp",
29498
+ "ArrowDown",
29499
+ "ArrowLeft",
29500
+ "ArrowRight"
29501
+ ].includes(event.key);
29502
+ if (!isArrow && event.key !== " ") return;
29503
+ event.preventDefault();
29504
+ if (!this._cursorVisible()) {
29505
+ this._cursorVisible.set(true);
29506
+ this._cursorX.set(this.width() / 2);
29507
+ this._cursorY.set(this.height() / 2);
29508
+ }
29509
+ if (isArrow) {
29510
+ const step = event.shiftKey ? 10 : 2;
29511
+ if (event.key === "ArrowUp") this._cursorY.set(Math.max(0, this._cursorY() - step));
29512
+ if (event.key === "ArrowDown") this._cursorY.set(Math.min(this.height(), this._cursorY() + step));
29513
+ if (event.key === "ArrowLeft") this._cursorX.set(Math.max(0, this._cursorX() - step));
29514
+ if (event.key === "ArrowRight") this._cursorX.set(Math.min(this.width(), this._cursorX() + step));
29515
+ if (this._keyboardDrawing()) {
29516
+ ctx.lineTo(this._cursorX(), this._cursorY());
29517
+ ctx.stroke();
29518
+ this._dirty = true;
29519
+ }
29520
+ return;
29521
+ }
29522
+ if (!this._keyboardDrawing()) {
29523
+ this._keyboardDrawing.set(true);
29524
+ this._applyPen(ctx);
29525
+ ctx.beginPath();
29526
+ ctx.moveTo(this._cursorX(), this._cursorY());
29527
+ ctx.lineTo(this._cursorX() + .01, this._cursorY());
29528
+ ctx.stroke();
29529
+ this._dirty = true;
29530
+ }
29531
+ }
29532
+ onKeyUp(event) {
29533
+ if (event.key !== " " || this.disabled()) return;
29534
+ event.preventDefault();
29535
+ this._stopKeyboardStroke();
29536
+ }
29537
+ onBlur() {
29538
+ this._stopKeyboardStroke();
29539
+ this._cursorVisible.set(false);
29540
+ this._onTouched();
29541
+ }
29542
+ _stopKeyboardStroke() {
29543
+ if (!this._keyboardDrawing()) return;
29544
+ this._keyboardDrawing.set(false);
29545
+ this._commit();
29546
+ }
29547
+ _commit() {
29548
+ if (!this._dirty) return;
29549
+ this._dirty = false;
29550
+ const wasEmpty = this._empty();
29551
+ this._empty.set(false);
29552
+ this._loading = false;
29553
+ this._value = this._normalize();
29554
+ if (wasEmpty) this._announcement.set("Signature captured");
29555
+ this._onChange(this._value);
29556
+ this.signatureChange.emit(this._value);
29557
+ }
29558
+ _setUpContext(canvas) {
29559
+ this._ctx = canvas.getContext("2d");
29560
+ if (this._ctx) this._applyPen(this._ctx);
29561
+ }
29562
+ _contextOf(canvas) {
29563
+ if (!this._ctx) this._setUpContext(canvas);
29564
+ return this._ctx;
29565
+ }
29566
+ _applyPen(ctx) {
29567
+ ctx.strokeStyle = this.penColor();
29568
+ ctx.lineWidth = this.penWidth();
29569
+ ctx.lineCap = "round";
29570
+ ctx.lineJoin = "round";
29571
+ }
29572
+ _clearBitmap() {
29573
+ const canvas = this._canvas()?.nativeElement;
29574
+ this._ctx?.clearRect(0, 0, canvas?.width ?? this.width(), canvas?.height ?? this.height());
29575
+ }
29576
+ _pointOf(clientX, clientY, canvas) {
29577
+ const rect = canvas.getBoundingClientRect();
29578
+ const scaleX = rect.width ? canvas.width / rect.width : 1;
29579
+ const scaleY = rect.height ? canvas.height / rect.height : 1;
29580
+ return {
29581
+ x: (clientX - rect.left) * scaleX,
29582
+ y: (clientY - rect.top) * scaleY
29583
+ };
29584
+ }
29585
+ _normalize() {
29586
+ const source = this._canvas()?.nativeElement;
29587
+ const sourceCtx = this._ctx;
29588
+ if (!source || !sourceCtx) return null;
29589
+ const { data, width, height } = sourceCtx.getImageData(0, 0, source.width, source.height);
29590
+ let minX = width, minY = height, maxX = -1, maxY = -1;
29591
+ for (let y = 0; y < height; y++) for (let x = 0; x < width; x++) if (data[(y * width + x) * 4 + 3] > 0) {
29592
+ if (x < minX) minX = x;
29593
+ if (x > maxX) maxX = x;
29594
+ if (y < minY) minY = y;
29595
+ if (y > maxY) maxY = y;
29596
+ }
29597
+ if (maxX < 0) return null;
29598
+ const padding = 4;
29599
+ minX = Math.max(0, minX - padding);
29600
+ minY = Math.max(0, minY - padding);
29601
+ maxX = Math.min(width - 1, maxX + padding);
29602
+ maxY = Math.min(height - 1, maxY + padding);
29603
+ const cropWidth = maxX - minX + 1;
29604
+ const cropHeight = maxY - minY + 1;
29605
+ const out = document.createElement("canvas");
29606
+ out.width = this.outputWidth();
29607
+ out.height = this.outputHeight();
29608
+ const scale = Math.min(out.width / cropWidth, out.height / cropHeight);
29609
+ const drawWidth = cropWidth * scale;
29610
+ const drawHeight = cropHeight * scale;
29611
+ out.getContext("2d").drawImage(source, minX, minY, cropWidth, cropHeight, 0, (out.height - drawHeight) / 2, drawWidth, drawHeight);
29612
+ return out.toDataURL("image/png");
28475
29613
  }
28476
29614
  static {
28477
29615
  this.ɵfac = i0.ɵɵngDeclareFactory({
28478
29616
  minVersion: "12.0.0",
28479
29617
  version: "22.2.2",
28480
29618
  ngImport: i0,
28481
- type: DetailCardComponent,
29619
+ type: SignaturePadComponent,
28482
29620
  deps: [],
28483
29621
  target: i0.ɵɵFactoryTarget.Component
28484
29622
  });
@@ -28487,99 +29625,812 @@ var DetailCardComponent = class DetailCardComponent {
28487
29625
  this.ɵcmp = i0.ɵɵngDeclareComponent({
28488
29626
  minVersion: "17.0.0",
28489
29627
  version: "22.2.2",
28490
- type: DetailCardComponent,
29628
+ type: SignaturePadComponent,
28491
29629
  isStandalone: true,
28492
- selector: "ui-detail-card",
29630
+ selector: "ui-signature-pad",
28493
29631
  inputs: {
28494
- title: {
28495
- classPropertyName: "title",
28496
- publicName: "title",
29632
+ label: {
29633
+ classPropertyName: "label",
29634
+ publicName: "label",
28497
29635
  isSignal: true,
28498
29636
  isRequired: false,
28499
29637
  transformFunction: null
28500
29638
  },
28501
- headingLevel: {
28502
- classPropertyName: "headingLevel",
28503
- publicName: "headingLevel",
29639
+ ariaLabel: {
29640
+ classPropertyName: "ariaLabel",
29641
+ publicName: "ariaLabel",
28504
29642
  isSignal: true,
28505
29643
  isRequired: false,
28506
29644
  transformFunction: null
28507
29645
  },
28508
- titleId: {
28509
- classPropertyName: "titleId",
28510
- publicName: "titleId",
29646
+ hint: {
29647
+ classPropertyName: "hint",
29648
+ publicName: "hint",
28511
29649
  isSignal: true,
28512
29650
  isRequired: false,
28513
29651
  transformFunction: null
28514
29652
  },
28515
- ariaLabel: {
28516
- classPropertyName: "ariaLabel",
28517
- publicName: "ariaLabel",
29653
+ error: {
29654
+ classPropertyName: "error",
29655
+ publicName: "error",
28518
29656
  isSignal: true,
28519
29657
  isRequired: false,
28520
29658
  transformFunction: null
28521
29659
  },
28522
- subtitle: {
28523
- classPropertyName: "subtitle",
28524
- publicName: "subtitle",
29660
+ width: {
29661
+ classPropertyName: "width",
29662
+ publicName: "width",
28525
29663
  isSignal: true,
28526
29664
  isRequired: false,
28527
29665
  transformFunction: null
28528
29666
  },
28529
- background: {
28530
- classPropertyName: "background",
28531
- publicName: "background",
29667
+ height: {
29668
+ classPropertyName: "height",
29669
+ publicName: "height",
28532
29670
  isSignal: true,
28533
29671
  isRequired: false,
28534
29672
  transformFunction: null
28535
29673
  },
28536
- textColor: {
28537
- classPropertyName: "textColor",
28538
- publicName: "textColor",
29674
+ outputWidth: {
29675
+ classPropertyName: "outputWidth",
29676
+ publicName: "outputWidth",
28539
29677
  isSignal: true,
28540
29678
  isRequired: false,
28541
29679
  transformFunction: null
28542
29680
  },
28543
- showHeader: {
28544
- classPropertyName: "showHeader",
28545
- publicName: "showHeader",
29681
+ outputHeight: {
29682
+ classPropertyName: "outputHeight",
29683
+ publicName: "outputHeight",
28546
29684
  isSignal: true,
28547
29685
  isRequired: false,
28548
29686
  transformFunction: null
28549
29687
  },
28550
- collapsible: {
28551
- classPropertyName: "collapsible",
28552
- publicName: "collapsible",
29688
+ penColor: {
29689
+ classPropertyName: "penColor",
29690
+ publicName: "penColor",
28553
29691
  isSignal: true,
28554
29692
  isRequired: false,
28555
29693
  transformFunction: null
28556
29694
  },
28557
- expanded: {
28558
- classPropertyName: "expanded",
28559
- publicName: "expanded",
29695
+ penWidth: {
29696
+ classPropertyName: "penWidth",
29697
+ publicName: "penWidth",
28560
29698
  isSignal: true,
28561
29699
  isRequired: false,
28562
29700
  transformFunction: null
28563
29701
  },
28564
- showEdit: {
28565
- classPropertyName: "showEdit",
28566
- publicName: "showEdit",
29702
+ showClear: {
29703
+ classPropertyName: "showClear",
29704
+ publicName: "showClear",
28567
29705
  isSignal: true,
28568
29706
  isRequired: false,
28569
29707
  transformFunction: null
28570
29708
  },
28571
- editLabel: {
28572
- classPropertyName: "editLabel",
28573
- publicName: "editLabel",
29709
+ clearLabel: {
29710
+ classPropertyName: "clearLabel",
29711
+ publicName: "clearLabel",
28574
29712
  isSignal: true,
28575
29713
  isRequired: false,
28576
29714
  transformFunction: null
28577
- }
28578
- },
28579
- outputs: {
28580
- expanded: "expandedChange",
28581
- editClick: "editClick"
28582
- },
29715
+ },
29716
+ _disabledInput: {
29717
+ classPropertyName: "_disabledInput",
29718
+ publicName: "disabled",
29719
+ isSignal: true,
29720
+ isRequired: false,
29721
+ transformFunction: null
29722
+ }
29723
+ },
29724
+ outputs: { signatureChange: "signatureChange" },
29725
+ providers: [{
29726
+ provide: NG_VALUE_ACCESSOR,
29727
+ useExisting: forwardRef(() => SignaturePadComponent),
29728
+ multi: true
29729
+ }],
29730
+ viewQueries: [{
29731
+ propertyName: "_canvas",
29732
+ first: true,
29733
+ predicate: ["canvas"],
29734
+ descendants: true,
29735
+ isSignal: true
29736
+ }],
29737
+ ngImport: i0,
29738
+ template: `
29739
+ <div class="sp-field" [class.sp-disabled]="disabled()" [class.sp-error]="!!error()">
29740
+ @if (label()) {
29741
+ <span class="sp-label" [id]="_labelId">{{ label() }}</span>
29742
+ }
29743
+ <div class="sp-pad">
29744
+ <canvas
29745
+ #canvas
29746
+ class="sp-canvas"
29747
+ role="application"
29748
+ [width]="width()"
29749
+ [height]="height()"
29750
+ [style.aspect-ratio]="width() + ' / ' + height()"
29751
+ [attr.tabindex]="disabled() ? null : 0"
29752
+ [attr.aria-label]="_accessibleName()"
29753
+ [attr.aria-labelledby]="!ariaLabel() && label() ? _labelId : null"
29754
+ [attr.aria-describedby]="_describedBy()"
29755
+ [attr.aria-disabled]="disabled() ? 'true' : null"
29756
+ [attr.aria-invalid]="error() ? 'true' : null"
29757
+ (pointerdown)="onPointerDown($event)"
29758
+ (pointermove)="onPointerMove($event)"
29759
+ (pointerup)="onPointerEnd($event)"
29760
+ (pointercancel)="onPointerEnd($event)"
29761
+ (lostpointercapture)="onPointerEnd($event)"
29762
+ (keydown)="onKeyDown($event)"
29763
+ (keyup)="onKeyUp($event)"
29764
+ (blur)="onBlur()"></canvas>
29765
+ @if (_cursorVisible()) {
29766
+ <span class="sp-cursor" [class.is-drawing]="_keyboardDrawing()" [style.left.%]="_cursorX() / width() * 100" [style.top.%]="_cursorY() / height() * 100"></span>
29767
+ }
29768
+ </div>
29769
+ <span class="sp-sr" [id]="_helpId">{{ _keyboardHelp }}</span>
29770
+ <span class="sp-sr" role="status" aria-live="polite">{{ _announcement() }}</span>
29771
+ @if (error()) {
29772
+ <p class="sp-desc sp-desc-error" [id]="_descId" role="alert">{{ error() }}</p>
29773
+ } @else if (hint()) {
29774
+ <p class="sp-desc" [id]="_descId">{{ hint() }}</p>
29775
+ }
29776
+ @if (showClear()) {
29777
+ <ui-button variant="secondary" size="sm" [disabled]="disabled() || _empty()" (click)="clear()">{{ clearLabel() }}</ui-button>
29778
+ }
29779
+ </div>
29780
+ `,
29781
+ isInline: true,
29782
+ styles: [":host{display:block}.sp-field{display:flex;flex-direction:column;gap:6px}.sp-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.sp-pad{position:relative;border:2px solid #d1d5db;border-radius:8px;background:#f9fafb}.sp-error .sp-pad{border-color:#ef4444}.sp-canvas{display:block;width:100%;height:auto;cursor:crosshair;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:none;-webkit-tap-highlight-color:transparent;border-radius:6px}.sp-canvas:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-disabled .sp-pad{opacity:.5}.sp-disabled .sp-canvas{cursor:not-allowed}.sp-cursor{position:absolute;width:8px;height:8px;border-radius:9999px;pointer-events:none;background:#2563eb;border:2px solid #fff;box-shadow:0 1px 4px #00000059;transform:translate(-50%,-50%)}.sp-cursor.is-drawing{animation:sp-pulse 1s ease-in-out infinite}@keyframes sp-pulse{50%{opacity:.5}}@media(prefers-reduced-motion:reduce){.sp-cursor.is-drawing{animation:none}}.sp-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.sp-desc-error{color:#ef4444}.sp-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n"],
29783
+ dependencies: [{
29784
+ kind: "component",
29785
+ type: ButtonComponent,
29786
+ selector: "ui-button",
29787
+ inputs: [
29788
+ "variant",
29789
+ "routerLink",
29790
+ "queryParams",
29791
+ "fragment",
29792
+ "href",
29793
+ "target",
29794
+ "rel",
29795
+ "color",
29796
+ "active",
29797
+ "size",
29798
+ "type",
29799
+ "disabled",
29800
+ "loading",
29801
+ "fullWidth",
29802
+ "ariaLabel",
29803
+ "ariaExpanded",
29804
+ "ariaPressed",
29805
+ "ariaDescribedBy",
29806
+ "modal-footer-left",
29807
+ "modal-footer-right"
29808
+ ]
29809
+ }],
29810
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
29811
+ });
29812
+ }
29813
+ };
29814
+ i0.ɵɵngDeclareClassMetadata({
29815
+ minVersion: "12.0.0",
29816
+ version: "22.2.2",
29817
+ ngImport: i0,
29818
+ type: SignaturePadComponent,
29819
+ decorators: [{
29820
+ type: Component,
29821
+ args: [{
29822
+ selector: "ui-signature-pad",
29823
+ standalone: true,
29824
+ imports: [ButtonComponent],
29825
+ changeDetection: ChangeDetectionStrategy.OnPush,
29826
+ providers: [{
29827
+ provide: NG_VALUE_ACCESSOR,
29828
+ useExisting: forwardRef(() => SignaturePadComponent),
29829
+ multi: true
29830
+ }],
29831
+ template: `
29832
+ <div class="sp-field" [class.sp-disabled]="disabled()" [class.sp-error]="!!error()">
29833
+ @if (label()) {
29834
+ <span class="sp-label" [id]="_labelId">{{ label() }}</span>
29835
+ }
29836
+ <div class="sp-pad">
29837
+ <canvas
29838
+ #canvas
29839
+ class="sp-canvas"
29840
+ role="application"
29841
+ [width]="width()"
29842
+ [height]="height()"
29843
+ [style.aspect-ratio]="width() + ' / ' + height()"
29844
+ [attr.tabindex]="disabled() ? null : 0"
29845
+ [attr.aria-label]="_accessibleName()"
29846
+ [attr.aria-labelledby]="!ariaLabel() && label() ? _labelId : null"
29847
+ [attr.aria-describedby]="_describedBy()"
29848
+ [attr.aria-disabled]="disabled() ? 'true' : null"
29849
+ [attr.aria-invalid]="error() ? 'true' : null"
29850
+ (pointerdown)="onPointerDown($event)"
29851
+ (pointermove)="onPointerMove($event)"
29852
+ (pointerup)="onPointerEnd($event)"
29853
+ (pointercancel)="onPointerEnd($event)"
29854
+ (lostpointercapture)="onPointerEnd($event)"
29855
+ (keydown)="onKeyDown($event)"
29856
+ (keyup)="onKeyUp($event)"
29857
+ (blur)="onBlur()"></canvas>
29858
+ @if (_cursorVisible()) {
29859
+ <span class="sp-cursor" [class.is-drawing]="_keyboardDrawing()" [style.left.%]="_cursorX() / width() * 100" [style.top.%]="_cursorY() / height() * 100"></span>
29860
+ }
29861
+ </div>
29862
+ <span class="sp-sr" [id]="_helpId">{{ _keyboardHelp }}</span>
29863
+ <span class="sp-sr" role="status" aria-live="polite">{{ _announcement() }}</span>
29864
+ @if (error()) {
29865
+ <p class="sp-desc sp-desc-error" [id]="_descId" role="alert">{{ error() }}</p>
29866
+ } @else if (hint()) {
29867
+ <p class="sp-desc" [id]="_descId">{{ hint() }}</p>
29868
+ }
29869
+ @if (showClear()) {
29870
+ <ui-button variant="secondary" size="sm" [disabled]="disabled() || _empty()" (click)="clear()">{{ clearLabel() }}</ui-button>
29871
+ }
29872
+ </div>
29873
+ `,
29874
+ styles: [":host{display:block}.sp-field{display:flex;flex-direction:column;gap:6px}.sp-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.sp-pad{position:relative;border:2px solid #d1d5db;border-radius:8px;background:#f9fafb}.sp-error .sp-pad{border-color:#ef4444}.sp-canvas{display:block;width:100%;height:auto;cursor:crosshair;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;touch-action:none;-webkit-tap-highlight-color:transparent;border-radius:6px}.sp-canvas:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-disabled .sp-pad{opacity:.5}.sp-disabled .sp-canvas{cursor:not-allowed}.sp-cursor{position:absolute;width:8px;height:8px;border-radius:9999px;pointer-events:none;background:#2563eb;border:2px solid #fff;box-shadow:0 1px 4px #00000059;transform:translate(-50%,-50%)}.sp-cursor.is-drawing{animation:sp-pulse 1s ease-in-out infinite}@keyframes sp-pulse{50%{opacity:.5}}@media(prefers-reduced-motion:reduce){.sp-cursor.is-drawing{animation:none}}.sp-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.sp-desc-error{color:#ef4444}.sp-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n"]
29875
+ }]
29876
+ }],
29877
+ ctorParameters: () => [],
29878
+ propDecorators: {
29879
+ label: [{
29880
+ type: i0.Input,
29881
+ args: [{
29882
+ isSignal: true,
29883
+ alias: "label",
29884
+ required: false
29885
+ }]
29886
+ }],
29887
+ ariaLabel: [{
29888
+ type: i0.Input,
29889
+ args: [{
29890
+ isSignal: true,
29891
+ alias: "ariaLabel",
29892
+ required: false
29893
+ }]
29894
+ }],
29895
+ hint: [{
29896
+ type: i0.Input,
29897
+ args: [{
29898
+ isSignal: true,
29899
+ alias: "hint",
29900
+ required: false
29901
+ }]
29902
+ }],
29903
+ error: [{
29904
+ type: i0.Input,
29905
+ args: [{
29906
+ isSignal: true,
29907
+ alias: "error",
29908
+ required: false
29909
+ }]
29910
+ }],
29911
+ width: [{
29912
+ type: i0.Input,
29913
+ args: [{
29914
+ isSignal: true,
29915
+ alias: "width",
29916
+ required: false
29917
+ }]
29918
+ }],
29919
+ height: [{
29920
+ type: i0.Input,
29921
+ args: [{
29922
+ isSignal: true,
29923
+ alias: "height",
29924
+ required: false
29925
+ }]
29926
+ }],
29927
+ outputWidth: [{
29928
+ type: i0.Input,
29929
+ args: [{
29930
+ isSignal: true,
29931
+ alias: "outputWidth",
29932
+ required: false
29933
+ }]
29934
+ }],
29935
+ outputHeight: [{
29936
+ type: i0.Input,
29937
+ args: [{
29938
+ isSignal: true,
29939
+ alias: "outputHeight",
29940
+ required: false
29941
+ }]
29942
+ }],
29943
+ penColor: [{
29944
+ type: i0.Input,
29945
+ args: [{
29946
+ isSignal: true,
29947
+ alias: "penColor",
29948
+ required: false
29949
+ }]
29950
+ }],
29951
+ penWidth: [{
29952
+ type: i0.Input,
29953
+ args: [{
29954
+ isSignal: true,
29955
+ alias: "penWidth",
29956
+ required: false
29957
+ }]
29958
+ }],
29959
+ showClear: [{
29960
+ type: i0.Input,
29961
+ args: [{
29962
+ isSignal: true,
29963
+ alias: "showClear",
29964
+ required: false
29965
+ }]
29966
+ }],
29967
+ clearLabel: [{
29968
+ type: i0.Input,
29969
+ args: [{
29970
+ isSignal: true,
29971
+ alias: "clearLabel",
29972
+ required: false
29973
+ }]
29974
+ }],
29975
+ _disabledInput: [{
29976
+ type: i0.Input,
29977
+ args: [{
29978
+ isSignal: true,
29979
+ alias: "disabled",
29980
+ required: false
29981
+ }]
29982
+ }],
29983
+ signatureChange: [{
29984
+ type: i0.Output,
29985
+ args: ["signatureChange"]
29986
+ }],
29987
+ _canvas: [{
29988
+ type: i0.ViewChild,
29989
+ args: ["canvas", { isSignal: true }]
29990
+ }]
29991
+ }
29992
+ });
29993
+ var PdfHotspotComponent = class PdfHotspotComponent {
29994
+ constructor() {
29995
+ this.x = input(0, ...ngDevMode ? [{ debugName: "x" }] : /* istanbul ignore next */ []);
29996
+ this.y = input(0, ...ngDevMode ? [{ debugName: "y" }] : /* istanbul ignore next */ []);
29997
+ this.width = input(0, ...ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []);
29998
+ this.height = input(0, ...ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []);
29999
+ this.state = input("ready", ...ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []);
30000
+ this.tone = input("primary", ...ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []);
30001
+ this.label = input("Sign Here", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
30002
+ this.blockedLabel = input("", ...ngDevMode ? [{ debugName: "blockedLabel" }] : /* istanbul ignore next */ []);
30003
+ this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
30004
+ this.image = input(null, ...ngDevMode ? [{ debugName: "image" }] : /* istanbul ignore next */ []);
30005
+ this.imageAlt = input("Applied signature", ...ngDevMode ? [{ debugName: "imageAlt" }] : /* istanbul ignore next */ []);
30006
+ this.scale = input(1, ...ngDevMode ? [{ debugName: "scale" }] : /* istanbul ignore next */ []);
30007
+ this.activate = output();
30008
+ this._scaleVar = computed(() => {
30009
+ const s = this.scale();
30010
+ return typeof s === "number" && Number.isFinite(s) && s > 0 && s !== 1 ? String(s) : null;
30011
+ }, ...ngDevMode ? [{ debugName: "_scaleVar" }] : /* istanbul ignore next */ []);
30012
+ this.fontSize = computed(() => Math.min(11, Math.max(7, this.height() * .25)), ...ngDevMode ? [{ debugName: "fontSize" }] : /* istanbul ignore next */ []);
30013
+ }
30014
+ static {
30015
+ this.ɵfac = i0.ɵɵngDeclareFactory({
30016
+ minVersion: "12.0.0",
30017
+ version: "22.2.2",
30018
+ ngImport: i0,
30019
+ type: PdfHotspotComponent,
30020
+ deps: [],
30021
+ target: i0.ɵɵFactoryTarget.Component
30022
+ });
30023
+ }
30024
+ static {
30025
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
30026
+ minVersion: "17.0.0",
30027
+ version: "22.2.2",
30028
+ type: PdfHotspotComponent,
30029
+ isStandalone: true,
30030
+ selector: "ui-pdf-hotspot",
30031
+ inputs: {
30032
+ x: {
30033
+ classPropertyName: "x",
30034
+ publicName: "x",
30035
+ isSignal: true,
30036
+ isRequired: false,
30037
+ transformFunction: null
30038
+ },
30039
+ y: {
30040
+ classPropertyName: "y",
30041
+ publicName: "y",
30042
+ isSignal: true,
30043
+ isRequired: false,
30044
+ transformFunction: null
30045
+ },
30046
+ width: {
30047
+ classPropertyName: "width",
30048
+ publicName: "width",
30049
+ isSignal: true,
30050
+ isRequired: false,
30051
+ transformFunction: null
30052
+ },
30053
+ height: {
30054
+ classPropertyName: "height",
30055
+ publicName: "height",
30056
+ isSignal: true,
30057
+ isRequired: false,
30058
+ transformFunction: null
30059
+ },
30060
+ state: {
30061
+ classPropertyName: "state",
30062
+ publicName: "state",
30063
+ isSignal: true,
30064
+ isRequired: false,
30065
+ transformFunction: null
30066
+ },
30067
+ tone: {
30068
+ classPropertyName: "tone",
30069
+ publicName: "tone",
30070
+ isSignal: true,
30071
+ isRequired: false,
30072
+ transformFunction: null
30073
+ },
30074
+ label: {
30075
+ classPropertyName: "label",
30076
+ publicName: "label",
30077
+ isSignal: true,
30078
+ isRequired: false,
30079
+ transformFunction: null
30080
+ },
30081
+ blockedLabel: {
30082
+ classPropertyName: "blockedLabel",
30083
+ publicName: "blockedLabel",
30084
+ isSignal: true,
30085
+ isRequired: false,
30086
+ transformFunction: null
30087
+ },
30088
+ ariaLabel: {
30089
+ classPropertyName: "ariaLabel",
30090
+ publicName: "ariaLabel",
30091
+ isSignal: true,
30092
+ isRequired: false,
30093
+ transformFunction: null
30094
+ },
30095
+ image: {
30096
+ classPropertyName: "image",
30097
+ publicName: "image",
30098
+ isSignal: true,
30099
+ isRequired: false,
30100
+ transformFunction: null
30101
+ },
30102
+ imageAlt: {
30103
+ classPropertyName: "imageAlt",
30104
+ publicName: "imageAlt",
30105
+ isSignal: true,
30106
+ isRequired: false,
30107
+ transformFunction: null
30108
+ },
30109
+ scale: {
30110
+ classPropertyName: "scale",
30111
+ publicName: "scale",
30112
+ isSignal: true,
30113
+ isRequired: false,
30114
+ transformFunction: null
30115
+ }
30116
+ },
30117
+ outputs: { activate: "activate" },
30118
+ host: { properties: {
30119
+ "style.left.px": "x()",
30120
+ "style.top.px": "y()",
30121
+ "style.width.px": "width()",
30122
+ "style.height.px": "height()",
30123
+ "attr.data-state": "state()",
30124
+ "style.--ph-scale": "_scaleVar()"
30125
+ } },
30126
+ ngImport: i0,
30127
+ template: `
30128
+ @if (state() === 'signed' && image()) {
30129
+ <img class="ph-image" [src]="image()" [alt]="imageAlt()" />
30130
+ } @else {
30131
+ <button
30132
+ type="button"
30133
+ class="ph-button"
30134
+ [class.ph-ready]="state() === 'ready'"
30135
+ [class.ph-warning]="tone() === 'warning'"
30136
+ [disabled]="state() !== 'ready'"
30137
+ [attr.aria-label]="ariaLabel() || null"
30138
+ [style.font-size.px]="fontSize()"
30139
+ (click)="activate.emit()"><span class="ph-text">{{ state() === 'blocked' ? blockedLabel() : label() }}</span></button>
30140
+ }
30141
+ `,
30142
+ isInline: true,
30143
+ styles: [":host{position:absolute;display:block;box-sizing:border-box}.ph-image{display:block;width:100%;height:100%;object-fit:contain;object-position:left}.ph-button{position:relative;box-sizing:border-box;width:100%;height:100%;white-space:nowrap;font:inherit;font-weight:500;line-height:1;border:2px solid #d1d5db;background:#f3f4f6;color:#9ca3af;cursor:not-allowed;box-shadow:0 4px 10px #0000002e;transition:background-color .15s,border-color .15s}.ph-text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.2}.ph-button.ph-ready{border-color:#2563eb;background:#dbeafe;color:#1d4ed8;cursor:pointer}.ph-button.ph-ready:hover{background:#bfdbfe}.ph-button.ph-ready.ph-warning{border-color:#f59e0b;background:#fffbeb;color:#b45309}.ph-button.ph-ready.ph-warning:hover{background:#fef3c7}.ph-button:focus-visible{outline:2px solid #2563eb;outline-offset:2px}@media(pointer:coarse){.ph-button:after{content:\"\";position:absolute;left:0;right:0;top:50%;height:100%;min-height:calc(44px / var(--ph-scale, 1));transform:translateY(-50%)}}\n"],
30144
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
30145
+ });
30146
+ }
30147
+ };
30148
+ i0.ɵɵngDeclareClassMetadata({
30149
+ minVersion: "12.0.0",
30150
+ version: "22.2.2",
30151
+ ngImport: i0,
30152
+ type: PdfHotspotComponent,
30153
+ decorators: [{
30154
+ type: Component,
30155
+ args: [{
30156
+ selector: "ui-pdf-hotspot",
30157
+ standalone: true,
30158
+ changeDetection: ChangeDetectionStrategy.OnPush,
30159
+ host: {
30160
+ "[style.left.px]": "x()",
30161
+ "[style.top.px]": "y()",
30162
+ "[style.width.px]": "width()",
30163
+ "[style.height.px]": "height()",
30164
+ "[attr.data-state]": "state()",
30165
+ "[style.--ph-scale]": "_scaleVar()"
30166
+ },
30167
+ template: `
30168
+ @if (state() === 'signed' && image()) {
30169
+ <img class="ph-image" [src]="image()" [alt]="imageAlt()" />
30170
+ } @else {
30171
+ <button
30172
+ type="button"
30173
+ class="ph-button"
30174
+ [class.ph-ready]="state() === 'ready'"
30175
+ [class.ph-warning]="tone() === 'warning'"
30176
+ [disabled]="state() !== 'ready'"
30177
+ [attr.aria-label]="ariaLabel() || null"
30178
+ [style.font-size.px]="fontSize()"
30179
+ (click)="activate.emit()"><span class="ph-text">{{ state() === 'blocked' ? blockedLabel() : label() }}</span></button>
30180
+ }
30181
+ `,
30182
+ styles: [":host{position:absolute;display:block;box-sizing:border-box}.ph-image{display:block;width:100%;height:100%;object-fit:contain;object-position:left}.ph-button{position:relative;box-sizing:border-box;width:100%;height:100%;white-space:nowrap;font:inherit;font-weight:500;line-height:1;border:2px solid #d1d5db;background:#f3f4f6;color:#9ca3af;cursor:not-allowed;box-shadow:0 4px 10px #0000002e;transition:background-color .15s,border-color .15s}.ph-text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.2}.ph-button.ph-ready{border-color:#2563eb;background:#dbeafe;color:#1d4ed8;cursor:pointer}.ph-button.ph-ready:hover{background:#bfdbfe}.ph-button.ph-ready.ph-warning{border-color:#f59e0b;background:#fffbeb;color:#b45309}.ph-button.ph-ready.ph-warning:hover{background:#fef3c7}.ph-button:focus-visible{outline:2px solid #2563eb;outline-offset:2px}@media(pointer:coarse){.ph-button:after{content:\"\";position:absolute;left:0;right:0;top:50%;height:100%;min-height:calc(44px / var(--ph-scale, 1));transform:translateY(-50%)}}\n"]
30183
+ }]
30184
+ }],
30185
+ propDecorators: {
30186
+ x: [{
30187
+ type: i0.Input,
30188
+ args: [{
30189
+ isSignal: true,
30190
+ alias: "x",
30191
+ required: false
30192
+ }]
30193
+ }],
30194
+ y: [{
30195
+ type: i0.Input,
30196
+ args: [{
30197
+ isSignal: true,
30198
+ alias: "y",
30199
+ required: false
30200
+ }]
30201
+ }],
30202
+ width: [{
30203
+ type: i0.Input,
30204
+ args: [{
30205
+ isSignal: true,
30206
+ alias: "width",
30207
+ required: false
30208
+ }]
30209
+ }],
30210
+ height: [{
30211
+ type: i0.Input,
30212
+ args: [{
30213
+ isSignal: true,
30214
+ alias: "height",
30215
+ required: false
30216
+ }]
30217
+ }],
30218
+ state: [{
30219
+ type: i0.Input,
30220
+ args: [{
30221
+ isSignal: true,
30222
+ alias: "state",
30223
+ required: false
30224
+ }]
30225
+ }],
30226
+ tone: [{
30227
+ type: i0.Input,
30228
+ args: [{
30229
+ isSignal: true,
30230
+ alias: "tone",
30231
+ required: false
30232
+ }]
30233
+ }],
30234
+ label: [{
30235
+ type: i0.Input,
30236
+ args: [{
30237
+ isSignal: true,
30238
+ alias: "label",
30239
+ required: false
30240
+ }]
30241
+ }],
30242
+ blockedLabel: [{
30243
+ type: i0.Input,
30244
+ args: [{
30245
+ isSignal: true,
30246
+ alias: "blockedLabel",
30247
+ required: false
30248
+ }]
30249
+ }],
30250
+ ariaLabel: [{
30251
+ type: i0.Input,
30252
+ args: [{
30253
+ isSignal: true,
30254
+ alias: "ariaLabel",
30255
+ required: false
30256
+ }]
30257
+ }],
30258
+ image: [{
30259
+ type: i0.Input,
30260
+ args: [{
30261
+ isSignal: true,
30262
+ alias: "image",
30263
+ required: false
30264
+ }]
30265
+ }],
30266
+ imageAlt: [{
30267
+ type: i0.Input,
30268
+ args: [{
30269
+ isSignal: true,
30270
+ alias: "imageAlt",
30271
+ required: false
30272
+ }]
30273
+ }],
30274
+ scale: [{
30275
+ type: i0.Input,
30276
+ args: [{
30277
+ isSignal: true,
30278
+ alias: "scale",
30279
+ required: false
30280
+ }]
30281
+ }],
30282
+ activate: [{
30283
+ type: i0.Output,
30284
+ args: ["activate"]
30285
+ }]
30286
+ }
30287
+ });
30288
+ var DetailCardComponent = class DetailCardComponent {
30289
+ constructor() {
30290
+ this.title = input("", ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
30291
+ this.uppercaseTitle = input(true, ...ngDevMode ? [{ debugName: "uppercaseTitle" }] : /* istanbul ignore next */ []);
30292
+ this.headingLevel = input(null, ...ngDevMode ? [{ debugName: "headingLevel" }] : /* istanbul ignore next */ []);
30293
+ this.titleId = input("", ...ngDevMode ? [{ debugName: "titleId" }] : /* istanbul ignore next */ []);
30294
+ this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
30295
+ this.subtitle = input("", ...ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []);
30296
+ this.background = input("", ...ngDevMode ? [{ debugName: "background" }] : /* istanbul ignore next */ []);
30297
+ this.textColor = input("", ...ngDevMode ? [{ debugName: "textColor" }] : /* istanbul ignore next */ []);
30298
+ this.showHeader = input(true, ...ngDevMode ? [{ debugName: "showHeader" }] : /* istanbul ignore next */ []);
30299
+ this.collapsible = input(true, ...ngDevMode ? [{ debugName: "collapsible" }] : /* istanbul ignore next */ []);
30300
+ this.expanded = model(true, ...ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []);
30301
+ this.showEdit = input(false, ...ngDevMode ? [{ debugName: "showEdit" }] : /* istanbul ignore next */ []);
30302
+ this.editLabel = input("Edit", ...ngDevMode ? [{ debugName: "editLabel" }] : /* istanbul ignore next */ []);
30303
+ this.editClick = output();
30304
+ }
30305
+ groupLabel() {
30306
+ if (this.showHeader() && this.title()) return this.titleId() ? null : this.title();
30307
+ return this.ariaLabel().trim() || null;
30308
+ }
30309
+ isOpen() {
30310
+ return !(this.showHeader() && this.collapsible()) || this.expanded();
30311
+ }
30312
+ toggle() {
30313
+ this.expanded.set(!this.expanded());
30314
+ }
30315
+ onHeaderClick(event) {
30316
+ if (!this.showHeader() || !this.collapsible()) return;
30317
+ if (event.target?.closest("button, a, input, select, textarea, label, [role=\"button\"], [role=\"link\"], [tabindex]:not([tabindex=\"-1\"])")?.closest(".dc-header")) return;
30318
+ this.toggle();
30319
+ }
30320
+ static {
30321
+ this.ɵfac = i0.ɵɵngDeclareFactory({
30322
+ minVersion: "12.0.0",
30323
+ version: "22.2.2",
30324
+ ngImport: i0,
30325
+ type: DetailCardComponent,
30326
+ deps: [],
30327
+ target: i0.ɵɵFactoryTarget.Component
30328
+ });
30329
+ }
30330
+ static {
30331
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
30332
+ minVersion: "17.0.0",
30333
+ version: "22.2.2",
30334
+ type: DetailCardComponent,
30335
+ isStandalone: true,
30336
+ selector: "ui-detail-card",
30337
+ inputs: {
30338
+ title: {
30339
+ classPropertyName: "title",
30340
+ publicName: "title",
30341
+ isSignal: true,
30342
+ isRequired: false,
30343
+ transformFunction: null
30344
+ },
30345
+ uppercaseTitle: {
30346
+ classPropertyName: "uppercaseTitle",
30347
+ publicName: "uppercaseTitle",
30348
+ isSignal: true,
30349
+ isRequired: false,
30350
+ transformFunction: null
30351
+ },
30352
+ headingLevel: {
30353
+ classPropertyName: "headingLevel",
30354
+ publicName: "headingLevel",
30355
+ isSignal: true,
30356
+ isRequired: false,
30357
+ transformFunction: null
30358
+ },
30359
+ titleId: {
30360
+ classPropertyName: "titleId",
30361
+ publicName: "titleId",
30362
+ isSignal: true,
30363
+ isRequired: false,
30364
+ transformFunction: null
30365
+ },
30366
+ ariaLabel: {
30367
+ classPropertyName: "ariaLabel",
30368
+ publicName: "ariaLabel",
30369
+ isSignal: true,
30370
+ isRequired: false,
30371
+ transformFunction: null
30372
+ },
30373
+ subtitle: {
30374
+ classPropertyName: "subtitle",
30375
+ publicName: "subtitle",
30376
+ isSignal: true,
30377
+ isRequired: false,
30378
+ transformFunction: null
30379
+ },
30380
+ background: {
30381
+ classPropertyName: "background",
30382
+ publicName: "background",
30383
+ isSignal: true,
30384
+ isRequired: false,
30385
+ transformFunction: null
30386
+ },
30387
+ textColor: {
30388
+ classPropertyName: "textColor",
30389
+ publicName: "textColor",
30390
+ isSignal: true,
30391
+ isRequired: false,
30392
+ transformFunction: null
30393
+ },
30394
+ showHeader: {
30395
+ classPropertyName: "showHeader",
30396
+ publicName: "showHeader",
30397
+ isSignal: true,
30398
+ isRequired: false,
30399
+ transformFunction: null
30400
+ },
30401
+ collapsible: {
30402
+ classPropertyName: "collapsible",
30403
+ publicName: "collapsible",
30404
+ isSignal: true,
30405
+ isRequired: false,
30406
+ transformFunction: null
30407
+ },
30408
+ expanded: {
30409
+ classPropertyName: "expanded",
30410
+ publicName: "expanded",
30411
+ isSignal: true,
30412
+ isRequired: false,
30413
+ transformFunction: null
30414
+ },
30415
+ showEdit: {
30416
+ classPropertyName: "showEdit",
30417
+ publicName: "showEdit",
30418
+ isSignal: true,
30419
+ isRequired: false,
30420
+ transformFunction: null
30421
+ },
30422
+ editLabel: {
30423
+ classPropertyName: "editLabel",
30424
+ publicName: "editLabel",
30425
+ isSignal: true,
30426
+ isRequired: false,
30427
+ transformFunction: null
30428
+ }
30429
+ },
30430
+ outputs: {
30431
+ expanded: "expandedChange",
30432
+ editClick: "editClick"
30433
+ },
28583
30434
  host: {
28584
30435
  attributes: { "role": "group" },
28585
30436
  properties: {
@@ -28605,7 +30456,7 @@ var DetailCardComponent = class DetailCardComponent {
28605
30456
  }
28606
30457
  <ng-content select="[card-header-leading]" />
28607
30458
  <div class="dc-header-text">
28608
- @if (title()) { <span class="dc-title" [attr.id]="titleId() || null" [attr.role]="headingLevel() ? 'heading' : null" [attr.aria-level]="headingLevel() || null">{{ title() }}</span> }
30459
+ @if (title()) { <span class="dc-title" [class.dc-title--as-written]="!uppercaseTitle()" [attr.id]="titleId() || null" [attr.role]="headingLevel() ? 'heading' : null" [attr.aria-level]="headingLevel() || null">{{ title() }}</span> }
28609
30460
  @if (subtitle()) { <span class="dc-subtitle">{{ subtitle() }}</span> }
28610
30461
  <ng-content select="[card-header]" />
28611
30462
  </div>
@@ -28629,7 +30480,7 @@ var DetailCardComponent = class DetailCardComponent {
28629
30480
  </div>
28630
30481
  `,
28631
30482
  isInline: true,
28632
- styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom: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-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"],
30483
+ styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom: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"],
28633
30484
  dependencies: [{
28634
30485
  kind: "component",
28635
30486
  type: ButtonComponent,
@@ -28638,6 +30489,7 @@ var DetailCardComponent = class DetailCardComponent {
28638
30489
  "variant",
28639
30490
  "routerLink",
28640
30491
  "queryParams",
30492
+ "fragment",
28641
30493
  "href",
28642
30494
  "target",
28643
30495
  "rel",
@@ -28694,7 +30546,7 @@ i0.ɵɵngDeclareClassMetadata({
28694
30546
  }
28695
30547
  <ng-content select="[card-header-leading]" />
28696
30548
  <div class="dc-header-text">
28697
- @if (title()) { <span class="dc-title" [attr.id]="titleId() || null" [attr.role]="headingLevel() ? 'heading' : null" [attr.aria-level]="headingLevel() || null">{{ title() }}</span> }
30549
+ @if (title()) { <span class="dc-title" [class.dc-title--as-written]="!uppercaseTitle()" [attr.id]="titleId() || null" [attr.role]="headingLevel() ? 'heading' : null" [attr.aria-level]="headingLevel() || null">{{ title() }}</span> }
28698
30550
  @if (subtitle()) { <span class="dc-subtitle">{{ subtitle() }}</span> }
28699
30551
  <ng-content select="[card-header]" />
28700
30552
  </div>
@@ -28717,7 +30569,7 @@ i0.ɵɵngDeclareClassMetadata({
28717
30569
  </div>
28718
30570
  </div>
28719
30571
  `,
28720
- styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom: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-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"]
30572
+ styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom: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"]
28721
30573
  }]
28722
30574
  }],
28723
30575
  propDecorators: {
@@ -28729,6 +30581,14 @@ i0.ɵɵngDeclareClassMetadata({
28729
30581
  required: false
28730
30582
  }]
28731
30583
  }],
30584
+ uppercaseTitle: [{
30585
+ type: i0.Input,
30586
+ args: [{
30587
+ isSignal: true,
30588
+ alias: "uppercaseTitle",
30589
+ required: false
30590
+ }]
30591
+ }],
28732
30592
  headingLevel: [{
28733
30593
  type: i0.Input,
28734
30594
  args: [{
@@ -30248,6 +32108,6 @@ i0.ɵɵngDeclareClassMetadata({
30248
32108
  }]
30249
32109
  }
30250
32110
  });
30251
- export { ActionBarComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BarRowComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, CheckboxComponent, 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, FormRowComponent, FormSectionComponent, HintComponent, IconComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, KpiCardComponent, LAYOUT_GAP_PX, ListComponent, ListItemComponent, ModalComponent, MoreMenuComponent, MultiSelectComponent, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PaginationComponent, PanelInfoListComponent, PhoneNumberPickerComponent, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, ReadonlyFieldsetComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SearchInputComponent, SectionHeaderComponent, SelectComponent, SidePanelComponent, SkeletonComponent, StackComponent, StarComponent, StepperComponent, TableToolbarComponent, TextComponent, TextInputComponent, TextareaInputComponent, TimeInputComponent, 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 };
32111
+ 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, FormRowComponent, FormSectionComponent, HintComponent, IconComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, KpiCardComponent, LAYOUT_GAP_PX, ListComponent, ListItemComponent, 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 };
30252
32112
 
30253
32113
  //# sourceMappingURL=forgeroute-ui.mjs.map