@forgeroute/ui 0.4.3 → 0.4.5

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,6 +14024,7 @@ 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"
@@ -13712,6 +14115,13 @@ var RadioComponent = class RadioComponent {
13712
14115
  isRequired: false,
13713
14116
  transformFunction: null
13714
14117
  },
14118
+ controls: {
14119
+ classPropertyName: "controls",
14120
+ publicName: "controls",
14121
+ isSignal: true,
14122
+ isRequired: false,
14123
+ transformFunction: null
14124
+ },
13715
14125
  _disabledInput: {
13716
14126
  classPropertyName: "_disabledInput",
13717
14127
  publicName: "disabled",
@@ -13738,6 +14148,7 @@ var RadioComponent = class RadioComponent {
13738
14148
  [attr.aria-labelledby]="_labelledBy()"
13739
14149
  [attr.aria-invalid]="invalid() ? 'true' : null"
13740
14150
  [attr.aria-describedby]="_describedByIds()"
14151
+ [attr.aria-controls]="controls() || null"
13741
14152
  (change)="onChange($event)"
13742
14153
  />
13743
14154
  <span class="rd-text">
@@ -13780,6 +14191,7 @@ i0.ɵɵngDeclareClassMetadata({
13780
14191
  [attr.aria-labelledby]="_labelledBy()"
13781
14192
  [attr.aria-invalid]="invalid() ? 'true' : null"
13782
14193
  [attr.aria-describedby]="_describedByIds()"
14194
+ [attr.aria-controls]="controls() || null"
13783
14195
  (change)="onChange($event)"
13784
14196
  />
13785
14197
  <span class="rd-text">
@@ -13857,6 +14269,14 @@ i0.ɵɵngDeclareClassMetadata({
13857
14269
  required: false
13858
14270
  }]
13859
14271
  }],
14272
+ controls: [{
14273
+ type: i0.Input,
14274
+ args: [{
14275
+ isSignal: true,
14276
+ alias: "controls",
14277
+ required: false
14278
+ }]
14279
+ }],
13860
14280
  _disabledInput: [{
13861
14281
  type: i0.Input,
13862
14282
  args: [{
@@ -13871,6 +14291,63 @@ i0.ɵɵngDeclareClassMetadata({
13871
14291
  }]
13872
14292
  }
13873
14293
  });
14294
+ var RadioOptionContentDirective = class RadioOptionContentDirective {
14295
+ constructor() {
14296
+ this.value = input.required({
14297
+ ...ngDevMode ? { debugName: "value" } : /* istanbul ignore next */ {},
14298
+ alias: "uiRadioOptionContent"
14299
+ });
14300
+ this.template = inject(TemplateRef);
14301
+ }
14302
+ static {
14303
+ this.ɵfac = i0.ɵɵngDeclareFactory({
14304
+ minVersion: "12.0.0",
14305
+ version: "22.2.2",
14306
+ ngImport: i0,
14307
+ type: RadioOptionContentDirective,
14308
+ deps: [],
14309
+ target: i0.ɵɵFactoryTarget.Directive
14310
+ });
14311
+ }
14312
+ static {
14313
+ this.ɵdir = i0.ɵɵngDeclareDirective({
14314
+ minVersion: "17.1.0",
14315
+ version: "22.2.2",
14316
+ type: RadioOptionContentDirective,
14317
+ isStandalone: true,
14318
+ selector: "ng-template[uiRadioOptionContent]",
14319
+ inputs: { value: {
14320
+ classPropertyName: "value",
14321
+ publicName: "uiRadioOptionContent",
14322
+ isSignal: true,
14323
+ isRequired: true,
14324
+ transformFunction: null
14325
+ } },
14326
+ ngImport: i0
14327
+ });
14328
+ }
14329
+ };
14330
+ i0.ɵɵngDeclareClassMetadata({
14331
+ minVersion: "12.0.0",
14332
+ version: "22.2.2",
14333
+ ngImport: i0,
14334
+ type: RadioOptionContentDirective,
14335
+ decorators: [{
14336
+ type: Directive,
14337
+ args: [{
14338
+ selector: "ng-template[uiRadioOptionContent]",
14339
+ standalone: true
14340
+ }]
14341
+ }],
14342
+ propDecorators: { value: [{
14343
+ type: i0.Input,
14344
+ args: [{
14345
+ isSignal: true,
14346
+ alias: "uiRadioOptionContent",
14347
+ required: true
14348
+ }]
14349
+ }] }
14350
+ });
13874
14351
  var RadioGroupComponent = class RadioGroupComponent {
13875
14352
  get _name() {
13876
14353
  return this.name() || this._generatedName;
@@ -13884,6 +14361,12 @@ var RadioGroupComponent = class RadioGroupComponent {
13884
14361
  this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
13885
14362
  this.orientation = input("vertical", ...ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []);
13886
14363
  this.name = input("", ...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
14364
+ this._optionContent = contentChildren(RadioOptionContentDirective, ...ngDevMode ? [{ debugName: "_optionContent" }] : /* istanbul ignore next */ []);
14365
+ this._nestedContent = computed(() => {
14366
+ const byValue = /* @__PURE__ */ new Map();
14367
+ for (const content of this._optionContent()) byValue.set(content.value(), content.template);
14368
+ return byValue;
14369
+ }, ...ngDevMode ? [{ debugName: "_nestedContent" }] : /* istanbul ignore next */ []);
13887
14370
  this._disabledInput = input(false, {
13888
14371
  ...ngDevMode ? { debugName: "_disabledInput" } : /* istanbul ignore next */ {},
13889
14372
  alias: "disabled"
@@ -13892,6 +14375,7 @@ var RadioGroupComponent = class RadioGroupComponent {
13892
14375
  this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
13893
14376
  this._generatedName = `rg-${Math.random().toString(36).slice(2, 8)}`;
13894
14377
  this._descId = `${this._generatedName}-desc`;
14378
+ this._nestedId = `${this._generatedName}-nested`;
13895
14379
  this._value = signal("", ...ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []);
13896
14380
  this._reveal = createFieldReveal(this.showErrors);
13897
14381
  this._issue = computed(() => this._check(this._value()), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
@@ -14047,6 +14531,11 @@ var RadioGroupComponent = class RadioGroupComponent {
14047
14531
  useExisting: forwardRef(() => RadioGroupComponent)
14048
14532
  }
14049
14533
  ],
14534
+ queries: [{
14535
+ propertyName: "_optionContent",
14536
+ predicate: RadioOptionContentDirective,
14537
+ isSignal: true
14538
+ }],
14050
14539
  usesOnChanges: true,
14051
14540
  ngImport: i0,
14052
14541
  template: `
@@ -14077,7 +14566,11 @@ var RadioGroupComponent = class RadioGroupComponent {
14077
14566
  [disabled]="disabled() || !!opt.disabled"
14078
14567
  [invalid]="!!_activeError()"
14079
14568
  [describedBy]="(_activeError() || hint()) ? _descId : ''"
14569
+ [controls]="(_value() === opt.value && _nestedContent().has(opt.value)) ? _nestedId : ''"
14080
14570
  (selected)="onSelect($event)" />
14571
+ @if (_value() === opt.value && _nestedContent().get(opt.value); as nested) {
14572
+ <div class="rg-nested" [id]="_nestedId"><ng-container [ngTemplateOutlet]="nested" /></div>
14573
+ }
14081
14574
  }
14082
14575
  </div>
14083
14576
  @if (_activeError()) {
@@ -14088,7 +14581,7 @@ var RadioGroupComponent = class RadioGroupComponent {
14088
14581
  </fieldset>
14089
14582
  `,
14090
14583
  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"],
14584
+ 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
14585
  dependencies: [{
14093
14586
  kind: "component",
14094
14587
  type: RadioComponent,
@@ -14102,9 +14595,19 @@ var RadioGroupComponent = class RadioGroupComponent {
14102
14595
  "checked",
14103
14596
  "invalid",
14104
14597
  "describedBy",
14598
+ "controls",
14105
14599
  "disabled"
14106
14600
  ],
14107
14601
  outputs: ["selected"]
14602
+ }, {
14603
+ kind: "directive",
14604
+ type: NgTemplateOutlet,
14605
+ selector: "[ngTemplateOutlet]",
14606
+ inputs: [
14607
+ "ngTemplateOutletContext",
14608
+ "ngTemplateOutlet",
14609
+ "ngTemplateOutletInjector"
14610
+ ]
14108
14611
  }],
14109
14612
  changeDetection: i0.ChangeDetectionStrategy.OnPush
14110
14613
  });
@@ -14120,7 +14623,7 @@ i0.ɵɵngDeclareClassMetadata({
14120
14623
  args: [{
14121
14624
  selector: "ui-radio-group",
14122
14625
  standalone: true,
14123
- imports: [RadioComponent],
14626
+ imports: [RadioComponent, NgTemplateOutlet],
14124
14627
  changeDetection: ChangeDetectionStrategy.OnPush,
14125
14628
  providers: [
14126
14629
  {
@@ -14166,7 +14669,11 @@ i0.ɵɵngDeclareClassMetadata({
14166
14669
  [disabled]="disabled() || !!opt.disabled"
14167
14670
  [invalid]="!!_activeError()"
14168
14671
  [describedBy]="(_activeError() || hint()) ? _descId : ''"
14672
+ [controls]="(_value() === opt.value && _nestedContent().has(opt.value)) ? _nestedId : ''"
14169
14673
  (selected)="onSelect($event)" />
14674
+ @if (_value() === opt.value && _nestedContent().get(opt.value); as nested) {
14675
+ <div class="rg-nested" [id]="_nestedId"><ng-container [ngTemplateOutlet]="nested" /></div>
14676
+ }
14170
14677
  }
14171
14678
  </div>
14172
14679
  @if (_activeError()) {
@@ -14176,7 +14683,7 @@ i0.ɵɵngDeclareClassMetadata({
14176
14683
  }
14177
14684
  </fieldset>
14178
14685
  `,
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"]
14686
+ 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
14687
  }]
14181
14688
  }],
14182
14689
  ctorParameters: () => [],
@@ -14245,6 +14752,10 @@ i0.ɵɵngDeclareClassMetadata({
14245
14752
  required: false
14246
14753
  }]
14247
14754
  }],
14755
+ _optionContent: [{
14756
+ type: i0.ContentChildren,
14757
+ args: [i0.forwardRef(() => RadioOptionContentDirective), { isSignal: true }]
14758
+ }],
14248
14759
  _disabledInput: [{
14249
14760
  type: i0.Input,
14250
14761
  args: [{
@@ -14340,7 +14851,7 @@ var AlertComponent = class AlertComponent {
14340
14851
  </div>
14341
14852
  `,
14342
14853
  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"],
14854
+ 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
14855
  changeDetection: i0.ChangeDetectionStrategy.OnPush
14345
14856
  });
14346
14857
  }
@@ -14371,7 +14882,7 @@ i0.ɵɵngDeclareClassMetadata({
14371
14882
  }
14372
14883
  </div>
14373
14884
  `,
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"]
14885
+ 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
14886
  }]
14376
14887
  }],
14377
14888
  propDecorators: {
@@ -14884,7 +15395,9 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
14884
15395
  "primaryLabel",
14885
15396
  "primaryVariant",
14886
15397
  "primaryLoading",
14887
- "primaryDisabled"
15398
+ "primaryDisabled",
15399
+ "cancelTestId",
15400
+ "primaryTestId"
14888
15401
  ],
14889
15402
  outputs: ["closed", "primaryClick"]
14890
15403
  },
@@ -14896,6 +15409,7 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
14896
15409
  "label",
14897
15410
  "ariaLabel",
14898
15411
  "placeholder",
15412
+ "prefix",
14899
15413
  "type",
14900
15414
  "maxlength",
14901
15415
  "required",
@@ -14910,6 +15424,7 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
14910
15424
  "maxDecimals",
14911
15425
  "step",
14912
15426
  "valueType",
15427
+ "formatter",
14913
15428
  "showErrors",
14914
15429
  "disabled"
14915
15430
  ],
@@ -14944,6 +15459,7 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
14944
15459
  "variant",
14945
15460
  "routerLink",
14946
15461
  "queryParams",
15462
+ "fragment",
14947
15463
  "href",
14948
15464
  "target",
14949
15465
  "rel",
@@ -16058,7 +16574,7 @@ var ContactPickerComponent = class ContactPickerComponent {
16058
16574
  {
16059
16575
  kind: "component",
16060
16576
  type: CheckboxComponent,
16061
- selector: "ui-checkbox",
16577
+ selector: "ui-checkbox, ui-checkbox-group",
16062
16578
  inputs: [
16063
16579
  "label",
16064
16580
  "ariaLabel",
@@ -16066,6 +16582,9 @@ var ContactPickerComponent = class ContactPickerComponent {
16066
16582
  "checked",
16067
16583
  "options",
16068
16584
  "legend",
16585
+ "orientation",
16586
+ "values",
16587
+ "description",
16069
16588
  "indent",
16070
16589
  "required",
16071
16590
  "requiredMessage",
@@ -16074,7 +16593,11 @@ var ContactPickerComponent = class ContactPickerComponent {
16074
16593
  "showErrors",
16075
16594
  "disabled"
16076
16595
  ],
16077
- outputs: ["checkedChange", "invalidChange"]
16596
+ outputs: [
16597
+ "checkedChange",
16598
+ "valuesChange",
16599
+ "invalidChange"
16600
+ ]
16078
16601
  }
16079
16602
  ],
16080
16603
  changeDetection: i0.ChangeDetectionStrategy.OnPush
@@ -16996,7 +17519,9 @@ var BulkMessagePanelComponent = class BulkMessagePanelComponent {
16996
17519
  "primaryLabel",
16997
17520
  "primaryVariant",
16998
17521
  "primaryLoading",
16999
- "primaryDisabled"
17522
+ "primaryDisabled",
17523
+ "cancelTestId",
17524
+ "primaryTestId"
17000
17525
  ],
17001
17526
  outputs: ["closed", "primaryClick"]
17002
17527
  },
@@ -17015,6 +17540,7 @@ var BulkMessagePanelComponent = class BulkMessagePanelComponent {
17015
17540
  "label",
17016
17541
  "ariaLabel",
17017
17542
  "placeholder",
17543
+ "prefix",
17018
17544
  "type",
17019
17545
  "maxlength",
17020
17546
  "required",
@@ -17029,6 +17555,7 @@ var BulkMessagePanelComponent = class BulkMessagePanelComponent {
17029
17555
  "maxDecimals",
17030
17556
  "step",
17031
17557
  "valueType",
17558
+ "formatter",
17032
17559
  "showErrors",
17033
17560
  "disabled"
17034
17561
  ],
@@ -17544,6 +18071,7 @@ var FileInputComponent = class FileInputComponent {
17544
18071
  this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
17545
18072
  this.showField = input(true, ...ngDevMode ? [{ debugName: "showField" }] : /* istanbul ignore next */ []);
17546
18073
  this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
18074
+ this.toastOnReject = input(false, ...ngDevMode ? [{ debugName: "toastOnReject" }] : /* istanbul ignore next */ []);
17547
18075
  this.clearable = input(false, ...ngDevMode ? [{ debugName: "clearable" }] : /* istanbul ignore next */ []);
17548
18076
  this.removeLabel = input("Remove", ...ngDevMode ? [{ debugName: "removeLabel" }] : /* istanbul ignore next */ []);
17549
18077
  this.maxSize = input(null, ...ngDevMode ? [{ debugName: "maxSize" }] : /* istanbul ignore next */ []);
@@ -17573,6 +18101,7 @@ var FileInputComponent = class FileInputComponent {
17573
18101
  this._inputId = `fi-${Math.random().toString(36).slice(2, 8)}`;
17574
18102
  this.fileEl = viewChild("fileEl", ...ngDevMode ? [{ debugName: "fileEl" }] : /* istanbul ignore next */ []);
17575
18103
  this._dragging = signal(false, ...ngDevMode ? [{ debugName: "_dragging" }] : /* istanbul ignore next */ []);
18104
+ this._toast = inject(ToastService);
17576
18105
  this._rejection = signal("", ...ngDevMode ? [{ debugName: "_rejection" }] : /* istanbul ignore next */ []);
17577
18106
  this._reveal = createFieldReveal(this.showErrors);
17578
18107
  this._issue = computed(() => this.disabled() || !this.required() || this._files().length > 0 ? null : requiredIssue(this.label() || "File"), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
@@ -17723,6 +18252,7 @@ var FileInputComponent = class FileInputComponent {
17723
18252
  }
17724
18253
  this._rejection.set(rejected[0]?.message ?? "");
17725
18254
  rejected.forEach((r) => this.fileRejected.emit(r));
18255
+ if (this.toastOnReject() && rejected.length > 0) this._toast.error(rejected.map((r) => `"${r.file.name}" was not added. ${r.message}`).join(" "));
17726
18256
  if (ok.length === 0) {
17727
18257
  if (native) native.value = "";
17728
18258
  this._files.set([]);
@@ -17830,6 +18360,13 @@ var FileInputComponent = class FileInputComponent {
17830
18360
  isRequired: false,
17831
18361
  transformFunction: null
17832
18362
  },
18363
+ toastOnReject: {
18364
+ classPropertyName: "toastOnReject",
18365
+ publicName: "toastOnReject",
18366
+ isSignal: true,
18367
+ isRequired: false,
18368
+ transformFunction: null
18369
+ },
17833
18370
  clearable: {
17834
18371
  classPropertyName: "clearable",
17835
18372
  publicName: "clearable",
@@ -18230,6 +18767,14 @@ i0.ɵɵngDeclareClassMetadata({
18230
18767
  required: false
18231
18768
  }]
18232
18769
  }],
18770
+ toastOnReject: [{
18771
+ type: i0.Input,
18772
+ args: [{
18773
+ isSignal: true,
18774
+ alias: "toastOnReject",
18775
+ required: false
18776
+ }]
18777
+ }],
18233
18778
  clearable: [{
18234
18779
  type: i0.Input,
18235
18780
  args: [{
@@ -20673,7 +21218,7 @@ var MultiSelectComponent = class MultiSelectComponent {
20673
21218
  }, {
20674
21219
  kind: "component",
20675
21220
  type: CheckboxComponent,
20676
- selector: "ui-checkbox",
21221
+ selector: "ui-checkbox, ui-checkbox-group",
20677
21222
  inputs: [
20678
21223
  "label",
20679
21224
  "ariaLabel",
@@ -20681,6 +21226,9 @@ var MultiSelectComponent = class MultiSelectComponent {
20681
21226
  "checked",
20682
21227
  "options",
20683
21228
  "legend",
21229
+ "orientation",
21230
+ "values",
21231
+ "description",
20684
21232
  "indent",
20685
21233
  "required",
20686
21234
  "requiredMessage",
@@ -20689,7 +21237,11 @@ var MultiSelectComponent = class MultiSelectComponent {
20689
21237
  "showErrors",
20690
21238
  "disabled"
20691
21239
  ],
20692
- outputs: ["checkedChange", "invalidChange"]
21240
+ outputs: [
21241
+ "checkedChange",
21242
+ "valuesChange",
21243
+ "invalidChange"
21244
+ ]
20693
21245
  }],
20694
21246
  changeDetection: i0.ChangeDetectionStrategy.OnPush
20695
21247
  });
@@ -20992,7 +21544,7 @@ var DiscountSelectorComponent = class DiscountSelectorComponent {
20992
21544
  dependencies: [{
20993
21545
  kind: "component",
20994
21546
  type: CheckboxComponent,
20995
- selector: "ui-checkbox",
21547
+ selector: "ui-checkbox, ui-checkbox-group",
20996
21548
  inputs: [
20997
21549
  "label",
20998
21550
  "ariaLabel",
@@ -21000,6 +21552,9 @@ var DiscountSelectorComponent = class DiscountSelectorComponent {
21000
21552
  "checked",
21001
21553
  "options",
21002
21554
  "legend",
21555
+ "orientation",
21556
+ "values",
21557
+ "description",
21003
21558
  "indent",
21004
21559
  "required",
21005
21560
  "requiredMessage",
@@ -21008,7 +21563,11 @@ var DiscountSelectorComponent = class DiscountSelectorComponent {
21008
21563
  "showErrors",
21009
21564
  "disabled"
21010
21565
  ],
21011
- outputs: ["checkedChange", "invalidChange"]
21566
+ outputs: [
21567
+ "checkedChange",
21568
+ "valuesChange",
21569
+ "invalidChange"
21570
+ ]
21012
21571
  }],
21013
21572
  changeDetection: i0.ChangeDetectionStrategy.OnPush
21014
21573
  });
@@ -21636,7 +22195,7 @@ var FormRowComponent = class FormRowComponent {
21636
22195
  ngImport: i0,
21637
22196
  template: `<div class="fr-row" [style.--fr-cols]="cols()"><ng-content /></div>`,
21638
22197
  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"],
22198
+ 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
22199
  changeDetection: i0.ChangeDetectionStrategy.OnPush
21641
22200
  });
21642
22201
  }
@@ -21653,7 +22212,7 @@ i0.ɵɵngDeclareClassMetadata({
21653
22212
  standalone: true,
21654
22213
  changeDetection: ChangeDetectionStrategy.OnPush,
21655
22214
  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"]
22215
+ 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
22216
  }]
21658
22217
  }],
21659
22218
  propDecorators: { cols: [{
@@ -21665,6 +22224,65 @@ i0.ɵɵngDeclareClassMetadata({
21665
22224
  }]
21666
22225
  }] }
21667
22226
  });
22227
+ var FormColSpanDirective = class FormColSpanDirective {
22228
+ constructor() {
22229
+ this.uiColSpan = input("", ...ngDevMode ? [{ debugName: "uiColSpan" }] : /* istanbul ignore next */ []);
22230
+ this._class = computed(() => {
22231
+ const v = String(this.uiColSpan());
22232
+ return v === "2" || v === "3" || v === "all" ? `ui-span-${v}` : "";
22233
+ }, ...ngDevMode ? [{ debugName: "_class" }] : /* istanbul ignore next */ []);
22234
+ }
22235
+ static {
22236
+ this.ɵfac = i0.ɵɵngDeclareFactory({
22237
+ minVersion: "12.0.0",
22238
+ version: "22.2.2",
22239
+ ngImport: i0,
22240
+ type: FormColSpanDirective,
22241
+ deps: [],
22242
+ target: i0.ɵɵFactoryTarget.Directive
22243
+ });
22244
+ }
22245
+ static {
22246
+ this.ɵdir = i0.ɵɵngDeclareDirective({
22247
+ minVersion: "17.1.0",
22248
+ version: "22.2.2",
22249
+ type: FormColSpanDirective,
22250
+ isStandalone: true,
22251
+ selector: "[uiColSpan]",
22252
+ inputs: { uiColSpan: {
22253
+ classPropertyName: "uiColSpan",
22254
+ publicName: "uiColSpan",
22255
+ isSignal: true,
22256
+ isRequired: false,
22257
+ transformFunction: null
22258
+ } },
22259
+ host: { properties: { "class": "_class()" } },
22260
+ ngImport: i0
22261
+ });
22262
+ }
22263
+ };
22264
+ i0.ɵɵngDeclareClassMetadata({
22265
+ minVersion: "12.0.0",
22266
+ version: "22.2.2",
22267
+ ngImport: i0,
22268
+ type: FormColSpanDirective,
22269
+ decorators: [{
22270
+ type: Directive,
22271
+ args: [{
22272
+ selector: "[uiColSpan]",
22273
+ standalone: true,
22274
+ host: { "[class]": "_class()" }
22275
+ }]
22276
+ }],
22277
+ propDecorators: { uiColSpan: [{
22278
+ type: i0.Input,
22279
+ args: [{
22280
+ isSignal: true,
22281
+ alias: "uiColSpan",
22282
+ required: false
22283
+ }]
22284
+ }] }
22285
+ });
21668
22286
  var ListItemComponent = class ListItemComponent {
21669
22287
  constructor() {
21670
22288
  this.leading = input("none", ...ngDevMode ? [{ debugName: "leading" }] : /* istanbul ignore next */ []);
@@ -22602,6 +23220,7 @@ var ListComponent = class ListComponent {
22602
23220
  "variant",
22603
23221
  "routerLink",
22604
23222
  "queryParams",
23223
+ "fragment",
22605
23224
  "href",
22606
23225
  "target",
22607
23226
  "rel",
@@ -23905,6 +24524,7 @@ var QrCodeComponent = class QrCodeComponent {
23905
24524
  "variant",
23906
24525
  "routerLink",
23907
24526
  "queryParams",
24527
+ "fragment",
23908
24528
  "href",
23909
24529
  "target",
23910
24530
  "rel",
@@ -24030,6 +24650,28 @@ var PanelInfoListComponent = class PanelInfoListComponent {
24030
24650
  this.showEmptyState = input(false, ...ngDevMode ? [{ debugName: "showEmptyState" }] : /* istanbul ignore next */ []);
24031
24651
  this.displaySections = computed(() => this.showEmptyState() ? this.sections() : this.sections().filter((s) => s.items.some((i) => !i.hidden)), ...ngDevMode ? [{ debugName: "displaySections" }] : /* istanbul ignore next */ []);
24032
24652
  }
24653
+ hrefOf(item) {
24654
+ let raw = item.href?.trim() ?? "";
24655
+ if (!raw && item.email?.trim()) raw = "mailto:" + item.email.trim();
24656
+ if (!raw && item.phone?.trim()) {
24657
+ const p = item.phone.trim();
24658
+ raw = "tel:" + (p.startsWith("+") ? "+" : "") + p.replace(/\D/g, "");
24659
+ }
24660
+ if (!raw) return null;
24661
+ const scheme = /^([a-z][a-z0-9+.\-]*):/i.exec(raw.replace(/[\u0000-\u0020]/g, ""));
24662
+ return scheme && [
24663
+ "mailto",
24664
+ "tel",
24665
+ "http",
24666
+ "https"
24667
+ ].includes(scheme[1].toLowerCase()) ? raw : null;
24668
+ }
24669
+ isWeb(href) {
24670
+ return /^https?:/i.test(href.replace(/[\u0000-\u0020]/g, ""));
24671
+ }
24672
+ textOf(item) {
24673
+ return item.value || item.email || item.phone || item.href || "";
24674
+ }
24033
24675
  visibleItems(section) {
24034
24676
  return section.items.filter((i) => !i.hidden);
24035
24677
  }
@@ -24088,6 +24730,8 @@ var PanelInfoListComponent = class PanelInfoListComponent {
24088
24730
  <span class="pil-value pil-value--block">
24089
24731
  @if (item.badge) {
24090
24732
  <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" />
24733
+ } @else if (hrefOf(item); as h) {
24734
+ <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
24735
  } @else {
24092
24736
  <span [class.pil-muted]="item.muted" [class.pil-danger]="item.danger">{{ item.value || '—' }}</span>
24093
24737
  }
@@ -24108,6 +24752,8 @@ var PanelInfoListComponent = class PanelInfoListComponent {
24108
24752
  </span>
24109
24753
  } @else if (item.badge) {
24110
24754
  <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" />
24755
+ } @else if (hrefOf(item); as h) {
24756
+ <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
24757
  } @else if (item.link && item.value && item.linkIcon) {
24112
24758
  <a class="pil-link-icon" [routerLink]="item.link">
24113
24759
  {{ item.value }}
@@ -24133,7 +24779,7 @@ var PanelInfoListComponent = class PanelInfoListComponent {
24133
24779
  }
24134
24780
  `,
24135
24781
  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"],
24782
+ 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
24783
  dependencies: [
24138
24784
  {
24139
24785
  kind: "component",
@@ -24178,6 +24824,7 @@ var PanelInfoListComponent = class PanelInfoListComponent {
24178
24824
  "variant",
24179
24825
  "routerLink",
24180
24826
  "queryParams",
24827
+ "fragment",
24181
24828
  "href",
24182
24829
  "target",
24183
24830
  "rel",
@@ -24239,6 +24886,8 @@ i0.ɵɵngDeclareClassMetadata({
24239
24886
  <span class="pil-value pil-value--block">
24240
24887
  @if (item.badge) {
24241
24888
  <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" />
24889
+ } @else if (hrefOf(item); as h) {
24890
+ <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
24891
  } @else {
24243
24892
  <span [class.pil-muted]="item.muted" [class.pil-danger]="item.danger">{{ item.value || '—' }}</span>
24244
24893
  }
@@ -24259,6 +24908,8 @@ i0.ɵɵngDeclareClassMetadata({
24259
24908
  </span>
24260
24909
  } @else if (item.badge) {
24261
24910
  <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" />
24911
+ } @else if (hrefOf(item); as h) {
24912
+ <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
24913
  } @else if (item.link && item.value && item.linkIcon) {
24263
24914
  <a class="pil-link-icon" [routerLink]="item.link">
24264
24915
  {{ item.value }}
@@ -24283,7 +24934,7 @@ i0.ɵɵngDeclareClassMetadata({
24283
24934
  </div>
24284
24935
  }
24285
24936
  `,
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"]
24937
+ 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
24938
  }]
24288
24939
  }],
24289
24940
  propDecorators: {
@@ -25502,7 +26153,15 @@ const EXTRA_ICONS = {
25502
26153
  "chevron-down": "M6 9l6 6 6-6",
25503
26154
  "arrow-left": "M19 12H5 M12 19l-7-7 7-7",
25504
26155
  "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"
26156
+ "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",
26157
+ "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",
26158
+ "arrow-up": "M12 19V5 M5 12l7-7 7 7",
26159
+ "arrow-down": "M12 5v14 M19 12l-7 7-7-7",
26160
+ "arrow-right": "M5 12h14 M12 5l7 7-7 7",
26161
+ "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",
26162
+ "grip": "M9 5h.01 M15 5h.01 M9 12h.01 M15 12h.01 M9 19h.01 M15 19h.01",
26163
+ "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",
26164
+ "bank": "M3 21h18 M3 10h18 M5 6l7-3 7 3 M4 10v11 M20 10v11 M8 14v3 M12 14v3 M16 14v3"
25506
26165
  };
25507
26166
  function iconPath(name) {
25508
26167
  return Object.prototype.hasOwnProperty.call(EXTRA_ICONS, name) ? EXTRA_ICONS[name] : builtInActionIcon(name);
@@ -25757,17 +26416,18 @@ i0.ɵɵngDeclareClassMetadata({
25757
26416
  }]
25758
26417
  }
25759
26418
  });
25760
- var ErrorComponent = class ErrorComponent {
26419
+ var TimelineComponent = class TimelineComponent {
25761
26420
  constructor() {
25762
- this.message = input("", ...ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []);
25763
- this.errorId = input("", ...ngDevMode ? [{ debugName: "errorId" }] : /* istanbul ignore next */ []);
26421
+ this.items = input([], ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
26422
+ this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
26423
+ this.emptyMessage = input("", ...ngDevMode ? [{ debugName: "emptyMessage" }] : /* istanbul ignore next */ []);
25764
26424
  }
25765
26425
  static {
25766
26426
  this.ɵfac = i0.ɵɵngDeclareFactory({
25767
26427
  minVersion: "12.0.0",
25768
26428
  version: "22.2.2",
25769
26429
  ngImport: i0,
25770
- type: ErrorComponent,
26430
+ type: TimelineComponent,
25771
26431
  deps: [],
25772
26432
  target: i0.ɵɵFactoryTarget.Component
25773
26433
  });
@@ -25776,20 +26436,27 @@ var ErrorComponent = class ErrorComponent {
25776
26436
  this.ɵcmp = i0.ɵɵngDeclareComponent({
25777
26437
  minVersion: "17.0.0",
25778
26438
  version: "22.2.2",
25779
- type: ErrorComponent,
26439
+ type: TimelineComponent,
25780
26440
  isStandalone: true,
25781
- selector: "ui-error",
26441
+ selector: "ui-timeline",
25782
26442
  inputs: {
25783
- message: {
25784
- classPropertyName: "message",
25785
- publicName: "message",
26443
+ items: {
26444
+ classPropertyName: "items",
26445
+ publicName: "items",
25786
26446
  isSignal: true,
25787
26447
  isRequired: false,
25788
26448
  transformFunction: null
25789
26449
  },
25790
- errorId: {
25791
- classPropertyName: "errorId",
25792
- publicName: "errorId",
26450
+ ariaLabel: {
26451
+ classPropertyName: "ariaLabel",
26452
+ publicName: "ariaLabel",
26453
+ isSignal: true,
26454
+ isRequired: false,
26455
+ transformFunction: null
26456
+ },
26457
+ emptyMessage: {
26458
+ classPropertyName: "emptyMessage",
26459
+ publicName: "emptyMessage",
25793
26460
  isSignal: true,
25794
26461
  isRequired: false,
25795
26462
  transformFunction: null
@@ -25797,12 +26464,61 @@ var ErrorComponent = class ErrorComponent {
25797
26464
  },
25798
26465
  ngImport: i0,
25799
26466
  template: `
25800
- @if (message()) {
25801
- <p class="ui-error" role="alert" [attr.id]="errorId() || null">{{ message() }}</p>
26467
+ @if (items().length) {
26468
+ <ol class="tl" [attr.aria-label]="ariaLabel() || null">
26469
+ @for (item of items(); track item.id ?? $index) {
26470
+ <li class="tl-item" [class]="'tl-item tl-item--' + (item.tone ?? 'default')" [class.tl-item--icon]="!!item.icon">
26471
+ <span class="tl-marker" aria-hidden="true">
26472
+ @if (item.icon) { <ui-icon [name]="item.icon" [interactive]="false" [size]="12" /> }
26473
+ </span>
26474
+ <div class="tl-content">
26475
+ <div class="tl-head">
26476
+ <span class="tl-title">{{ item.title }}</span>
26477
+ @if (item.badge) { <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" /> }
26478
+ </div>
26479
+ @if (item.description) { <p class="tl-description">{{ item.description }}</p> }
26480
+ @if (item.time || item.dateTime) {
26481
+ <time class="tl-time" [attr.datetime]="item.dateTime || null">{{ item.time || item.dateTime }}</time>
26482
+ }
26483
+ </div>
26484
+ </li>
26485
+ }
26486
+ </ol>
26487
+ } @else if (emptyMessage()) {
26488
+ <ui-hint class="tl-empty">{{ emptyMessage() }}</ui-hint>
25802
26489
  }
25803
26490
  `,
25804
26491
  isInline: true,
25805
- styles: [":host{display:block}.ui-error{margin:6px 0 0;font-size:.75rem;line-height:1.4;color:#ef4444}\n"],
26492
+ 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"],
26493
+ dependencies: [
26494
+ {
26495
+ kind: "component",
26496
+ type: BadgeComponent,
26497
+ selector: "ui-badge",
26498
+ inputs: ["label", "variant"]
26499
+ },
26500
+ {
26501
+ kind: "component",
26502
+ type: HintComponent,
26503
+ selector: "ui-hint"
26504
+ },
26505
+ {
26506
+ kind: "component",
26507
+ type: IconComponent,
26508
+ selector: "ui-icon",
26509
+ inputs: [
26510
+ "name",
26511
+ "tooltip",
26512
+ "ariaLabel",
26513
+ "size",
26514
+ "variant",
26515
+ "disabled",
26516
+ "loading",
26517
+ "interactive"
26518
+ ],
26519
+ outputs: ["iconClick"]
26520
+ }
26521
+ ],
25806
26522
  changeDetection: i0.ChangeDetectionStrategy.OnPush
25807
26523
  });
25808
26524
  }
@@ -25811,51 +26527,172 @@ i0.ɵɵngDeclareClassMetadata({
25811
26527
  minVersion: "12.0.0",
25812
26528
  version: "22.2.2",
25813
26529
  ngImport: i0,
25814
- type: ErrorComponent,
26530
+ type: TimelineComponent,
25815
26531
  decorators: [{
25816
26532
  type: Component,
25817
26533
  args: [{
25818
- selector: "ui-error",
26534
+ selector: "ui-timeline",
25819
26535
  standalone: true,
25820
26536
  changeDetection: ChangeDetectionStrategy.OnPush,
26537
+ imports: [
26538
+ BadgeComponent,
26539
+ HintComponent,
26540
+ IconComponent
26541
+ ],
25821
26542
  template: `
25822
- @if (message()) {
25823
- <p class="ui-error" role="alert" [attr.id]="errorId() || null">{{ message() }}</p>
26543
+ @if (items().length) {
26544
+ <ol class="tl" [attr.aria-label]="ariaLabel() || null">
26545
+ @for (item of items(); track item.id ?? $index) {
26546
+ <li class="tl-item" [class]="'tl-item tl-item--' + (item.tone ?? 'default')" [class.tl-item--icon]="!!item.icon">
26547
+ <span class="tl-marker" aria-hidden="true">
26548
+ @if (item.icon) { <ui-icon [name]="item.icon" [interactive]="false" [size]="12" /> }
26549
+ </span>
26550
+ <div class="tl-content">
26551
+ <div class="tl-head">
26552
+ <span class="tl-title">{{ item.title }}</span>
26553
+ @if (item.badge) { <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" /> }
26554
+ </div>
26555
+ @if (item.description) { <p class="tl-description">{{ item.description }}</p> }
26556
+ @if (item.time || item.dateTime) {
26557
+ <time class="tl-time" [attr.datetime]="item.dateTime || null">{{ item.time || item.dateTime }}</time>
26558
+ }
26559
+ </div>
26560
+ </li>
26561
+ }
26562
+ </ol>
26563
+ } @else if (emptyMessage()) {
26564
+ <ui-hint class="tl-empty">{{ emptyMessage() }}</ui-hint>
25824
26565
  }
25825
26566
  `,
25826
- styles: [":host{display:block}.ui-error{margin:6px 0 0;font-size:.75rem;line-height:1.4;color:#ef4444}\n"]
26567
+ 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
26568
  }]
25828
26569
  }],
25829
26570
  propDecorators: {
25830
- message: [{
26571
+ items: [{
25831
26572
  type: i0.Input,
25832
26573
  args: [{
25833
26574
  isSignal: true,
25834
- alias: "message",
26575
+ alias: "items",
25835
26576
  required: false
25836
26577
  }]
25837
26578
  }],
25838
- errorId: [{
26579
+ ariaLabel: [{
25839
26580
  type: i0.Input,
25840
26581
  args: [{
25841
26582
  isSignal: true,
25842
- alias: "errorId",
26583
+ alias: "ariaLabel",
26584
+ required: false
26585
+ }]
26586
+ }],
26587
+ emptyMessage: [{
26588
+ type: i0.Input,
26589
+ args: [{
26590
+ isSignal: true,
26591
+ alias: "emptyMessage",
25843
26592
  required: false
25844
26593
  }]
25845
26594
  }]
25846
26595
  }
25847
26596
  });
25848
- var KpiCardComponent = class KpiCardComponent {
26597
+ var ErrorComponent = class ErrorComponent {
25849
26598
  constructor() {
25850
- this.sanitizer = inject(DomSanitizer);
25851
- this.host = inject(ElementRef);
25852
- this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
25853
- this.value = input("", ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
25854
- this.subtitle = input("", ...ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []);
25855
- this.icon = input("", ...ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []);
25856
- this.color = input("slate", ...ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []);
25857
- this.highlight = input(false, ...ngDevMode ? [{ debugName: "highlight" }] : /* istanbul ignore next */ []);
25858
- this.clickable = input(false, ...ngDevMode ? [{ debugName: "clickable" }] : /* istanbul ignore next */ []);
26599
+ this.message = input("", ...ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []);
26600
+ this.errorId = input("", ...ngDevMode ? [{ debugName: "errorId" }] : /* istanbul ignore next */ []);
26601
+ }
26602
+ static {
26603
+ this.ɵfac = i0.ɵɵngDeclareFactory({
26604
+ minVersion: "12.0.0",
26605
+ version: "22.2.2",
26606
+ ngImport: i0,
26607
+ type: ErrorComponent,
26608
+ deps: [],
26609
+ target: i0.ɵɵFactoryTarget.Component
26610
+ });
26611
+ }
26612
+ static {
26613
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
26614
+ minVersion: "17.0.0",
26615
+ version: "22.2.2",
26616
+ type: ErrorComponent,
26617
+ isStandalone: true,
26618
+ selector: "ui-error",
26619
+ inputs: {
26620
+ message: {
26621
+ classPropertyName: "message",
26622
+ publicName: "message",
26623
+ isSignal: true,
26624
+ isRequired: false,
26625
+ transformFunction: null
26626
+ },
26627
+ errorId: {
26628
+ classPropertyName: "errorId",
26629
+ publicName: "errorId",
26630
+ isSignal: true,
26631
+ isRequired: false,
26632
+ transformFunction: null
26633
+ }
26634
+ },
26635
+ ngImport: i0,
26636
+ template: `
26637
+ @if (message()) {
26638
+ <p class="ui-error" role="alert" [attr.id]="errorId() || null">{{ message() }}</p>
26639
+ }
26640
+ `,
26641
+ isInline: true,
26642
+ styles: [":host{display:block}.ui-error{margin:6px 0 0;font-size:.75rem;line-height:1.4;color:#ef4444}\n"],
26643
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
26644
+ });
26645
+ }
26646
+ };
26647
+ i0.ɵɵngDeclareClassMetadata({
26648
+ minVersion: "12.0.0",
26649
+ version: "22.2.2",
26650
+ ngImport: i0,
26651
+ type: ErrorComponent,
26652
+ decorators: [{
26653
+ type: Component,
26654
+ args: [{
26655
+ selector: "ui-error",
26656
+ standalone: true,
26657
+ changeDetection: ChangeDetectionStrategy.OnPush,
26658
+ template: `
26659
+ @if (message()) {
26660
+ <p class="ui-error" role="alert" [attr.id]="errorId() || null">{{ message() }}</p>
26661
+ }
26662
+ `,
26663
+ styles: [":host{display:block}.ui-error{margin:6px 0 0;font-size:.75rem;line-height:1.4;color:#ef4444}\n"]
26664
+ }]
26665
+ }],
26666
+ propDecorators: {
26667
+ message: [{
26668
+ type: i0.Input,
26669
+ args: [{
26670
+ isSignal: true,
26671
+ alias: "message",
26672
+ required: false
26673
+ }]
26674
+ }],
26675
+ errorId: [{
26676
+ type: i0.Input,
26677
+ args: [{
26678
+ isSignal: true,
26679
+ alias: "errorId",
26680
+ required: false
26681
+ }]
26682
+ }]
26683
+ }
26684
+ });
26685
+ var KpiCardComponent = class KpiCardComponent {
26686
+ constructor() {
26687
+ this.sanitizer = inject(DomSanitizer);
26688
+ this.host = inject(ElementRef);
26689
+ this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
26690
+ this.value = input("", ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
26691
+ this.subtitle = input("", ...ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []);
26692
+ this.icon = input("", ...ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []);
26693
+ this.color = input("slate", ...ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []);
26694
+ this.highlight = input(false, ...ngDevMode ? [{ debugName: "highlight" }] : /* istanbul ignore next */ []);
26695
+ this.clickable = input(false, ...ngDevMode ? [{ debugName: "clickable" }] : /* istanbul ignore next */ []);
25859
26696
  this.valueColor = input("default", ...ngDevMode ? [{ debugName: "valueColor" }] : /* istanbul ignore next */ []);
25860
26697
  this.background = input("", ...ngDevMode ? [{ debugName: "background" }] : /* istanbul ignore next */ []);
25861
26698
  this.progress = input(null, ...ngDevMode ? [{ debugName: "progress" }] : /* istanbul ignore next */ []);
@@ -26447,6 +27284,7 @@ var DateRangePickerComponent = class DateRangePickerComponent {
26447
27284
  "variant",
26448
27285
  "routerLink",
26449
27286
  "queryParams",
27287
+ "fragment",
26450
27288
  "href",
26451
27289
  "target",
26452
27290
  "rel",
@@ -28260,6 +29098,7 @@ var RadioMatrixComponent = class RadioMatrixComponent {
28260
29098
  "checked",
28261
29099
  "invalid",
28262
29100
  "describedBy",
29101
+ "controls",
28263
29102
  "disabled"
28264
29103
  ],
28265
29104
  outputs: ["selected"]
@@ -28442,43 +29281,318 @@ i0.ɵɵngDeclareClassMetadata({
28442
29281
  }]
28443
29282
  }
28444
29283
  });
28445
- var DetailCardComponent = class DetailCardComponent {
29284
+ let nextPadId = 0;
29285
+ var SignaturePadComponent = class SignaturePadComponent {
28446
29286
  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 */ []);
29287
+ this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
28450
29288
  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();
29289
+ this.hint = input("", ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
29290
+ this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
29291
+ this.width = input(600, ...ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []);
29292
+ this.height = input(120, ...ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []);
29293
+ this.outputWidth = input(600, ...ngDevMode ? [{ debugName: "outputWidth" }] : /* istanbul ignore next */ []);
29294
+ this.outputHeight = input(60, ...ngDevMode ? [{ debugName: "outputHeight" }] : /* istanbul ignore next */ []);
29295
+ this.penColor = input("#000000", ...ngDevMode ? [{ debugName: "penColor" }] : /* istanbul ignore next */ []);
29296
+ this.penWidth = input(3, ...ngDevMode ? [{ debugName: "penWidth" }] : /* istanbul ignore next */ []);
29297
+ this.showClear = input(true, ...ngDevMode ? [{ debugName: "showClear" }] : /* istanbul ignore next */ []);
29298
+ this.clearLabel = input("Clear", ...ngDevMode ? [{ debugName: "clearLabel" }] : /* istanbul ignore next */ []);
29299
+ this._disabledInput = input(false, {
29300
+ ...ngDevMode ? { debugName: "_disabledInput" } : /* istanbul ignore next */ {},
29301
+ alias: "disabled"
29302
+ });
29303
+ this.signatureChange = output();
29304
+ this._canvas = viewChild("canvas", ...ngDevMode ? [{ debugName: "_canvas" }] : /* istanbul ignore next */ []);
29305
+ this._cvaDisabled = signal(false, ...ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []);
29306
+ this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
29307
+ this._empty = signal(true, ...ngDevMode ? [{ debugName: "_empty" }] : /* istanbul ignore next */ []);
29308
+ this._cursorVisible = signal(false, ...ngDevMode ? [{ debugName: "_cursorVisible" }] : /* istanbul ignore next */ []);
29309
+ this._cursorX = signal(0, ...ngDevMode ? [{ debugName: "_cursorX" }] : /* istanbul ignore next */ []);
29310
+ this._cursorY = signal(0, ...ngDevMode ? [{ debugName: "_cursorY" }] : /* istanbul ignore next */ []);
29311
+ this._keyboardDrawing = signal(false, ...ngDevMode ? [{ debugName: "_keyboardDrawing" }] : /* istanbul ignore next */ []);
29312
+ this._announcement = signal("", ...ngDevMode ? [{ debugName: "_announcement" }] : /* istanbul ignore next */ []);
29313
+ this._keyboardHelp = "Use the arrow keys to move the cursor, hold Space to draw, press Escape to hide the cursor.";
29314
+ this._injector = inject(Injector);
29315
+ this._id = ++nextPadId;
29316
+ this._labelId = `sp-label-${this._id}`;
29317
+ this._descId = `sp-desc-${this._id}`;
29318
+ this._helpId = `sp-help-${this._id}`;
29319
+ this._accessibleName = computed(() => this.ariaLabel() || (this.label() ? null : "Signature pad"), ...ngDevMode ? [{ debugName: "_accessibleName" }] : /* istanbul ignore next */ []);
29320
+ this._describedBy = computed(() => (this.error() || this.hint() ? this._descId + " " : "") + this._helpId, ...ngDevMode ? [{ debugName: "_describedBy" }] : /* istanbul ignore next */ []);
29321
+ this._ctx = null;
29322
+ this._pointerId = null;
29323
+ this._dirty = false;
29324
+ this._pendingImage = false;
29325
+ this._value = null;
29326
+ this._loading = false;
29327
+ this._sizeKey = null;
29328
+ this._onChange = () => {};
29329
+ this._onTouched = () => {};
29330
+ effect(() => {
29331
+ const canvas = this._canvas()?.nativeElement;
29332
+ const sizeKey = `${this.width()}x${this.height()}`;
29333
+ this.penColor();
29334
+ this.penWidth();
29335
+ if (canvas) untracked(() => {
29336
+ this._setUpContext(canvas);
29337
+ if (this._sizeKey !== null && this._sizeKey !== sizeKey) this._repaintAfterResize();
29338
+ this._sizeKey = sizeKey;
29339
+ if (this._pendingImage && this._value && this._ctx) {
29340
+ this._pendingImage = false;
29341
+ this._paint(this._value, canvas, this._ctx);
29342
+ }
29343
+ });
29344
+ });
28460
29345
  }
28461
- groupLabel() {
28462
- if (this.showHeader() && this.title()) return this.titleId() ? null : this.title();
28463
- return this.ariaLabel().trim() || null;
29346
+ isEmpty() {
29347
+ return this._empty();
28464
29348
  }
28465
- isOpen() {
28466
- return !(this.showHeader() && this.collapsible()) || this.expanded();
29349
+ toDataUrl() {
29350
+ if (this._empty()) return null;
29351
+ return this._loading || this._pendingImage ? this._value : this._normalize();
28467
29352
  }
28468
- toggle() {
28469
- this.expanded.set(!this.expanded());
29353
+ clear() {
29354
+ this._clearBitmap();
29355
+ this._value = null;
29356
+ this._pendingImage = false;
29357
+ this._loading = false;
29358
+ const wasEmpty = this._empty();
29359
+ this._empty.set(true);
29360
+ this._dirty = false;
29361
+ this._keyboardDrawing.set(false);
29362
+ this._cursorVisible.set(false);
29363
+ if (!wasEmpty) this._announcement.set("Signature cleared");
29364
+ this._onChange(null);
29365
+ this.signatureChange.emit(null);
29366
+ }
29367
+ writeValue(value) {
29368
+ this._value = value || null;
29369
+ this._pendingImage = false;
29370
+ this._loading = false;
29371
+ this._clearBitmap();
29372
+ this._announcement.set("");
29373
+ this._dirty = false;
29374
+ if (!value) {
29375
+ this._empty.set(true);
29376
+ return;
29377
+ }
29378
+ this._empty.set(false);
29379
+ const canvas = this._canvas()?.nativeElement;
29380
+ const ctx = canvas ? this._contextOf(canvas) : null;
29381
+ if (!canvas || !ctx) {
29382
+ this._pendingImage = true;
29383
+ return;
29384
+ }
29385
+ this._paint(value, canvas, ctx);
28470
29386
  }
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();
29387
+ _paint(value, canvas, ctx) {
29388
+ const image = new Image();
29389
+ this._loading = true;
29390
+ image.onerror = () => {
29391
+ if (this._value === value) this._loading = false;
29392
+ };
29393
+ image.onload = () => {
29394
+ if (this._value !== value) return;
29395
+ this._loading = false;
29396
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
29397
+ const scale = Math.min(canvas.width / image.width, canvas.height / image.height);
29398
+ const drawWidth = image.width * scale;
29399
+ const drawHeight = image.height * scale;
29400
+ ctx.drawImage(image, 0, (canvas.height - drawHeight) / 2, drawWidth, drawHeight);
29401
+ };
29402
+ image.src = value;
29403
+ }
29404
+ _repaintAfterResize() {
29405
+ afterNextRender(() => {
29406
+ const canvas = this._canvas()?.nativeElement;
29407
+ const ctx = canvas ? this._contextOf(canvas) : null;
29408
+ if (!canvas || !ctx || this._empty() || !this._value) return;
29409
+ this._paint(this._value, canvas, ctx);
29410
+ }, { injector: this._injector });
29411
+ }
29412
+ registerOnChange(fn) {
29413
+ this._onChange = fn;
29414
+ }
29415
+ registerOnTouched(fn) {
29416
+ this._onTouched = fn;
29417
+ }
29418
+ setDisabledState(disabled) {
29419
+ this._cvaDisabled.set(disabled);
29420
+ }
29421
+ onPointerDown(event) {
29422
+ if (this.disabled() || event.pointerType === "mouse" && event.button !== 0) return;
29423
+ if (!event.isPrimary) return;
29424
+ if (this._pointerId !== null) {
29425
+ if (event.pointerId !== this._pointerId) return;
29426
+ this._pointerId = null;
29427
+ this._commit();
29428
+ }
29429
+ const canvas = this._canvas()?.nativeElement;
29430
+ const ctx = canvas ? this._contextOf(canvas) : null;
29431
+ if (!canvas || !ctx) return;
29432
+ event.preventDefault();
29433
+ this._applyPen(ctx);
29434
+ this._pointerId = event.pointerId;
29435
+ canvas.setPointerCapture?.(event.pointerId);
29436
+ this._cursorVisible.set(false);
29437
+ const point = this._pointOf(event.clientX, event.clientY, canvas);
29438
+ ctx.beginPath();
29439
+ ctx.moveTo(point.x, point.y);
29440
+ ctx.lineTo(point.x + .01, point.y);
29441
+ ctx.stroke();
29442
+ this._dirty = true;
29443
+ }
29444
+ onPointerMove(event) {
29445
+ if (this._pointerId === null || event.pointerId !== this._pointerId) return;
29446
+ const canvas = this._canvas()?.nativeElement;
29447
+ const ctx = this._ctx;
29448
+ if (!canvas || !ctx) return;
29449
+ event.preventDefault();
29450
+ const point = this._pointOf(event.clientX, event.clientY, canvas);
29451
+ ctx.lineTo(point.x, point.y);
29452
+ ctx.stroke();
29453
+ }
29454
+ onPointerEnd(event) {
29455
+ if (this._pointerId === null || event.pointerId !== this._pointerId) return;
29456
+ this._pointerId = null;
29457
+ this._commit();
29458
+ }
29459
+ onKeyDown(event) {
29460
+ if (this.disabled()) return;
29461
+ const canvas = this._canvas()?.nativeElement;
29462
+ const ctx = canvas ? this._contextOf(canvas) : null;
29463
+ if (!ctx) return;
29464
+ if (event.key === "Escape") {
29465
+ if (this._cursorVisible()) {
29466
+ event.stopPropagation();
29467
+ this._stopKeyboardStroke();
29468
+ this._cursorVisible.set(false);
29469
+ }
29470
+ return;
29471
+ }
29472
+ const isArrow = [
29473
+ "ArrowUp",
29474
+ "ArrowDown",
29475
+ "ArrowLeft",
29476
+ "ArrowRight"
29477
+ ].includes(event.key);
29478
+ if (!isArrow && event.key !== " ") return;
29479
+ event.preventDefault();
29480
+ if (!this._cursorVisible()) {
29481
+ this._cursorVisible.set(true);
29482
+ this._cursorX.set(this.width() / 2);
29483
+ this._cursorY.set(this.height() / 2);
29484
+ }
29485
+ if (isArrow) {
29486
+ const step = event.shiftKey ? 10 : 2;
29487
+ if (event.key === "ArrowUp") this._cursorY.set(Math.max(0, this._cursorY() - step));
29488
+ if (event.key === "ArrowDown") this._cursorY.set(Math.min(this.height(), this._cursorY() + step));
29489
+ if (event.key === "ArrowLeft") this._cursorX.set(Math.max(0, this._cursorX() - step));
29490
+ if (event.key === "ArrowRight") this._cursorX.set(Math.min(this.width(), this._cursorX() + step));
29491
+ if (this._keyboardDrawing()) {
29492
+ ctx.lineTo(this._cursorX(), this._cursorY());
29493
+ ctx.stroke();
29494
+ this._dirty = true;
29495
+ }
29496
+ return;
29497
+ }
29498
+ if (!this._keyboardDrawing()) {
29499
+ this._keyboardDrawing.set(true);
29500
+ this._applyPen(ctx);
29501
+ ctx.beginPath();
29502
+ ctx.moveTo(this._cursorX(), this._cursorY());
29503
+ ctx.lineTo(this._cursorX() + .01, this._cursorY());
29504
+ ctx.stroke();
29505
+ this._dirty = true;
29506
+ }
29507
+ }
29508
+ onKeyUp(event) {
29509
+ if (event.key !== " " || this.disabled()) return;
29510
+ event.preventDefault();
29511
+ this._stopKeyboardStroke();
29512
+ }
29513
+ onBlur() {
29514
+ this._stopKeyboardStroke();
29515
+ this._cursorVisible.set(false);
29516
+ this._onTouched();
29517
+ }
29518
+ _stopKeyboardStroke() {
29519
+ if (!this._keyboardDrawing()) return;
29520
+ this._keyboardDrawing.set(false);
29521
+ this._commit();
29522
+ }
29523
+ _commit() {
29524
+ if (!this._dirty) return;
29525
+ this._dirty = false;
29526
+ const wasEmpty = this._empty();
29527
+ this._empty.set(false);
29528
+ this._loading = false;
29529
+ this._value = this._normalize();
29530
+ if (wasEmpty) this._announcement.set("Signature captured");
29531
+ this._onChange(this._value);
29532
+ this.signatureChange.emit(this._value);
29533
+ }
29534
+ _setUpContext(canvas) {
29535
+ this._ctx = canvas.getContext("2d");
29536
+ if (this._ctx) this._applyPen(this._ctx);
29537
+ }
29538
+ _contextOf(canvas) {
29539
+ if (!this._ctx) this._setUpContext(canvas);
29540
+ return this._ctx;
29541
+ }
29542
+ _applyPen(ctx) {
29543
+ ctx.strokeStyle = this.penColor();
29544
+ ctx.lineWidth = this.penWidth();
29545
+ ctx.lineCap = "round";
29546
+ ctx.lineJoin = "round";
29547
+ }
29548
+ _clearBitmap() {
29549
+ const canvas = this._canvas()?.nativeElement;
29550
+ this._ctx?.clearRect(0, 0, canvas?.width ?? this.width(), canvas?.height ?? this.height());
29551
+ }
29552
+ _pointOf(clientX, clientY, canvas) {
29553
+ const rect = canvas.getBoundingClientRect();
29554
+ const scaleX = rect.width ? canvas.width / rect.width : 1;
29555
+ const scaleY = rect.height ? canvas.height / rect.height : 1;
29556
+ return {
29557
+ x: (clientX - rect.left) * scaleX,
29558
+ y: (clientY - rect.top) * scaleY
29559
+ };
29560
+ }
29561
+ _normalize() {
29562
+ const source = this._canvas()?.nativeElement;
29563
+ const sourceCtx = this._ctx;
29564
+ if (!source || !sourceCtx) return null;
29565
+ const { data, width, height } = sourceCtx.getImageData(0, 0, source.width, source.height);
29566
+ let minX = width, minY = height, maxX = -1, maxY = -1;
29567
+ for (let y = 0; y < height; y++) for (let x = 0; x < width; x++) if (data[(y * width + x) * 4 + 3] > 0) {
29568
+ if (x < minX) minX = x;
29569
+ if (x > maxX) maxX = x;
29570
+ if (y < minY) minY = y;
29571
+ if (y > maxY) maxY = y;
29572
+ }
29573
+ if (maxX < 0) return null;
29574
+ const padding = 4;
29575
+ minX = Math.max(0, minX - padding);
29576
+ minY = Math.max(0, minY - padding);
29577
+ maxX = Math.min(width - 1, maxX + padding);
29578
+ maxY = Math.min(height - 1, maxY + padding);
29579
+ const cropWidth = maxX - minX + 1;
29580
+ const cropHeight = maxY - minY + 1;
29581
+ const out = document.createElement("canvas");
29582
+ out.width = this.outputWidth();
29583
+ out.height = this.outputHeight();
29584
+ const scale = Math.min(out.width / cropWidth, out.height / cropHeight);
29585
+ const drawWidth = cropWidth * scale;
29586
+ const drawHeight = cropHeight * scale;
29587
+ out.getContext("2d").drawImage(source, minX, minY, cropWidth, cropHeight, 0, (out.height - drawHeight) / 2, drawWidth, drawHeight);
29588
+ return out.toDataURL("image/png");
28475
29589
  }
28476
29590
  static {
28477
29591
  this.ɵfac = i0.ɵɵngDeclareFactory({
28478
29592
  minVersion: "12.0.0",
28479
29593
  version: "22.2.2",
28480
29594
  ngImport: i0,
28481
- type: DetailCardComponent,
29595
+ type: SignaturePadComponent,
28482
29596
  deps: [],
28483
29597
  target: i0.ɵɵFactoryTarget.Component
28484
29598
  });
@@ -28487,101 +29601,792 @@ var DetailCardComponent = class DetailCardComponent {
28487
29601
  this.ɵcmp = i0.ɵɵngDeclareComponent({
28488
29602
  minVersion: "17.0.0",
28489
29603
  version: "22.2.2",
28490
- type: DetailCardComponent,
29604
+ type: SignaturePadComponent,
28491
29605
  isStandalone: true,
28492
- selector: "ui-detail-card",
29606
+ selector: "ui-signature-pad",
28493
29607
  inputs: {
28494
- title: {
28495
- classPropertyName: "title",
28496
- publicName: "title",
29608
+ label: {
29609
+ classPropertyName: "label",
29610
+ publicName: "label",
28497
29611
  isSignal: true,
28498
29612
  isRequired: false,
28499
29613
  transformFunction: null
28500
29614
  },
28501
- headingLevel: {
28502
- classPropertyName: "headingLevel",
28503
- publicName: "headingLevel",
29615
+ ariaLabel: {
29616
+ classPropertyName: "ariaLabel",
29617
+ publicName: "ariaLabel",
28504
29618
  isSignal: true,
28505
29619
  isRequired: false,
28506
29620
  transformFunction: null
28507
29621
  },
28508
- titleId: {
28509
- classPropertyName: "titleId",
28510
- publicName: "titleId",
29622
+ hint: {
29623
+ classPropertyName: "hint",
29624
+ publicName: "hint",
28511
29625
  isSignal: true,
28512
29626
  isRequired: false,
28513
29627
  transformFunction: null
28514
29628
  },
28515
- ariaLabel: {
28516
- classPropertyName: "ariaLabel",
28517
- publicName: "ariaLabel",
29629
+ error: {
29630
+ classPropertyName: "error",
29631
+ publicName: "error",
28518
29632
  isSignal: true,
28519
29633
  isRequired: false,
28520
29634
  transformFunction: null
28521
29635
  },
28522
- subtitle: {
28523
- classPropertyName: "subtitle",
28524
- publicName: "subtitle",
29636
+ width: {
29637
+ classPropertyName: "width",
29638
+ publicName: "width",
28525
29639
  isSignal: true,
28526
29640
  isRequired: false,
28527
29641
  transformFunction: null
28528
29642
  },
28529
- background: {
28530
- classPropertyName: "background",
28531
- publicName: "background",
29643
+ height: {
29644
+ classPropertyName: "height",
29645
+ publicName: "height",
28532
29646
  isSignal: true,
28533
29647
  isRequired: false,
28534
29648
  transformFunction: null
28535
29649
  },
28536
- textColor: {
28537
- classPropertyName: "textColor",
28538
- publicName: "textColor",
29650
+ outputWidth: {
29651
+ classPropertyName: "outputWidth",
29652
+ publicName: "outputWidth",
28539
29653
  isSignal: true,
28540
29654
  isRequired: false,
28541
29655
  transformFunction: null
28542
29656
  },
28543
- showHeader: {
28544
- classPropertyName: "showHeader",
28545
- publicName: "showHeader",
29657
+ outputHeight: {
29658
+ classPropertyName: "outputHeight",
29659
+ publicName: "outputHeight",
28546
29660
  isSignal: true,
28547
29661
  isRequired: false,
28548
29662
  transformFunction: null
28549
29663
  },
28550
- collapsible: {
28551
- classPropertyName: "collapsible",
28552
- publicName: "collapsible",
29664
+ penColor: {
29665
+ classPropertyName: "penColor",
29666
+ publicName: "penColor",
28553
29667
  isSignal: true,
28554
29668
  isRequired: false,
28555
29669
  transformFunction: null
28556
29670
  },
28557
- expanded: {
28558
- classPropertyName: "expanded",
28559
- publicName: "expanded",
29671
+ penWidth: {
29672
+ classPropertyName: "penWidth",
29673
+ publicName: "penWidth",
28560
29674
  isSignal: true,
28561
29675
  isRequired: false,
28562
29676
  transformFunction: null
28563
29677
  },
28564
- showEdit: {
28565
- classPropertyName: "showEdit",
28566
- publicName: "showEdit",
29678
+ showClear: {
29679
+ classPropertyName: "showClear",
29680
+ publicName: "showClear",
28567
29681
  isSignal: true,
28568
29682
  isRequired: false,
28569
29683
  transformFunction: null
28570
29684
  },
28571
- editLabel: {
28572
- classPropertyName: "editLabel",
28573
- publicName: "editLabel",
29685
+ clearLabel: {
29686
+ classPropertyName: "clearLabel",
29687
+ publicName: "clearLabel",
29688
+ isSignal: true,
29689
+ isRequired: false,
29690
+ transformFunction: null
29691
+ },
29692
+ _disabledInput: {
29693
+ classPropertyName: "_disabledInput",
29694
+ publicName: "disabled",
28574
29695
  isSignal: true,
28575
29696
  isRequired: false,
28576
29697
  transformFunction: null
28577
29698
  }
28578
29699
  },
28579
- outputs: {
28580
- expanded: "expandedChange",
28581
- editClick: "editClick"
28582
- },
28583
- host: {
28584
- attributes: { "role": "group" },
29700
+ outputs: { signatureChange: "signatureChange" },
29701
+ providers: [{
29702
+ provide: NG_VALUE_ACCESSOR,
29703
+ useExisting: forwardRef(() => SignaturePadComponent),
29704
+ multi: true
29705
+ }],
29706
+ viewQueries: [{
29707
+ propertyName: "_canvas",
29708
+ first: true,
29709
+ predicate: ["canvas"],
29710
+ descendants: true,
29711
+ isSignal: true
29712
+ }],
29713
+ ngImport: i0,
29714
+ template: `
29715
+ <div class="sp-field" [class.sp-disabled]="disabled()" [class.sp-error]="!!error()">
29716
+ @if (label()) {
29717
+ <span class="sp-label" [id]="_labelId">{{ label() }}</span>
29718
+ }
29719
+ <div class="sp-pad">
29720
+ <canvas
29721
+ #canvas
29722
+ class="sp-canvas"
29723
+ role="application"
29724
+ [width]="width()"
29725
+ [height]="height()"
29726
+ [style.aspect-ratio]="width() + ' / ' + height()"
29727
+ [attr.tabindex]="disabled() ? null : 0"
29728
+ [attr.aria-label]="_accessibleName()"
29729
+ [attr.aria-labelledby]="!ariaLabel() && label() ? _labelId : null"
29730
+ [attr.aria-describedby]="_describedBy()"
29731
+ [attr.aria-disabled]="disabled() ? 'true' : null"
29732
+ [attr.aria-invalid]="error() ? 'true' : null"
29733
+ (pointerdown)="onPointerDown($event)"
29734
+ (pointermove)="onPointerMove($event)"
29735
+ (pointerup)="onPointerEnd($event)"
29736
+ (pointercancel)="onPointerEnd($event)"
29737
+ (lostpointercapture)="onPointerEnd($event)"
29738
+ (keydown)="onKeyDown($event)"
29739
+ (keyup)="onKeyUp($event)"
29740
+ (blur)="onBlur()"></canvas>
29741
+ @if (_cursorVisible()) {
29742
+ <span class="sp-cursor" [class.is-drawing]="_keyboardDrawing()" [style.left.%]="_cursorX() / width() * 100" [style.top.%]="_cursorY() / height() * 100"></span>
29743
+ }
29744
+ </div>
29745
+ <span class="sp-sr" [id]="_helpId">{{ _keyboardHelp }}</span>
29746
+ <span class="sp-sr" role="status" aria-live="polite">{{ _announcement() }}</span>
29747
+ @if (error()) {
29748
+ <p class="sp-desc sp-desc-error" [id]="_descId" role="alert">{{ error() }}</p>
29749
+ } @else if (hint()) {
29750
+ <p class="sp-desc" [id]="_descId">{{ hint() }}</p>
29751
+ }
29752
+ @if (showClear()) {
29753
+ <ui-button variant="secondary" size="sm" [disabled]="disabled() || _empty()" (click)="clear()">{{ clearLabel() }}</ui-button>
29754
+ }
29755
+ </div>
29756
+ `,
29757
+ isInline: true,
29758
+ 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"],
29759
+ dependencies: [{
29760
+ kind: "component",
29761
+ type: ButtonComponent,
29762
+ selector: "ui-button",
29763
+ inputs: [
29764
+ "variant",
29765
+ "routerLink",
29766
+ "queryParams",
29767
+ "fragment",
29768
+ "href",
29769
+ "target",
29770
+ "rel",
29771
+ "color",
29772
+ "active",
29773
+ "size",
29774
+ "type",
29775
+ "disabled",
29776
+ "loading",
29777
+ "fullWidth",
29778
+ "ariaLabel",
29779
+ "ariaExpanded",
29780
+ "ariaPressed",
29781
+ "ariaDescribedBy",
29782
+ "modal-footer-left",
29783
+ "modal-footer-right"
29784
+ ]
29785
+ }],
29786
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
29787
+ });
29788
+ }
29789
+ };
29790
+ i0.ɵɵngDeclareClassMetadata({
29791
+ minVersion: "12.0.0",
29792
+ version: "22.2.2",
29793
+ ngImport: i0,
29794
+ type: SignaturePadComponent,
29795
+ decorators: [{
29796
+ type: Component,
29797
+ args: [{
29798
+ selector: "ui-signature-pad",
29799
+ standalone: true,
29800
+ imports: [ButtonComponent],
29801
+ changeDetection: ChangeDetectionStrategy.OnPush,
29802
+ providers: [{
29803
+ provide: NG_VALUE_ACCESSOR,
29804
+ useExisting: forwardRef(() => SignaturePadComponent),
29805
+ multi: true
29806
+ }],
29807
+ template: `
29808
+ <div class="sp-field" [class.sp-disabled]="disabled()" [class.sp-error]="!!error()">
29809
+ @if (label()) {
29810
+ <span class="sp-label" [id]="_labelId">{{ label() }}</span>
29811
+ }
29812
+ <div class="sp-pad">
29813
+ <canvas
29814
+ #canvas
29815
+ class="sp-canvas"
29816
+ role="application"
29817
+ [width]="width()"
29818
+ [height]="height()"
29819
+ [style.aspect-ratio]="width() + ' / ' + height()"
29820
+ [attr.tabindex]="disabled() ? null : 0"
29821
+ [attr.aria-label]="_accessibleName()"
29822
+ [attr.aria-labelledby]="!ariaLabel() && label() ? _labelId : null"
29823
+ [attr.aria-describedby]="_describedBy()"
29824
+ [attr.aria-disabled]="disabled() ? 'true' : null"
29825
+ [attr.aria-invalid]="error() ? 'true' : null"
29826
+ (pointerdown)="onPointerDown($event)"
29827
+ (pointermove)="onPointerMove($event)"
29828
+ (pointerup)="onPointerEnd($event)"
29829
+ (pointercancel)="onPointerEnd($event)"
29830
+ (lostpointercapture)="onPointerEnd($event)"
29831
+ (keydown)="onKeyDown($event)"
29832
+ (keyup)="onKeyUp($event)"
29833
+ (blur)="onBlur()"></canvas>
29834
+ @if (_cursorVisible()) {
29835
+ <span class="sp-cursor" [class.is-drawing]="_keyboardDrawing()" [style.left.%]="_cursorX() / width() * 100" [style.top.%]="_cursorY() / height() * 100"></span>
29836
+ }
29837
+ </div>
29838
+ <span class="sp-sr" [id]="_helpId">{{ _keyboardHelp }}</span>
29839
+ <span class="sp-sr" role="status" aria-live="polite">{{ _announcement() }}</span>
29840
+ @if (error()) {
29841
+ <p class="sp-desc sp-desc-error" [id]="_descId" role="alert">{{ error() }}</p>
29842
+ } @else if (hint()) {
29843
+ <p class="sp-desc" [id]="_descId">{{ hint() }}</p>
29844
+ }
29845
+ @if (showClear()) {
29846
+ <ui-button variant="secondary" size="sm" [disabled]="disabled() || _empty()" (click)="clear()">{{ clearLabel() }}</ui-button>
29847
+ }
29848
+ </div>
29849
+ `,
29850
+ 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"]
29851
+ }]
29852
+ }],
29853
+ ctorParameters: () => [],
29854
+ propDecorators: {
29855
+ label: [{
29856
+ type: i0.Input,
29857
+ args: [{
29858
+ isSignal: true,
29859
+ alias: "label",
29860
+ required: false
29861
+ }]
29862
+ }],
29863
+ ariaLabel: [{
29864
+ type: i0.Input,
29865
+ args: [{
29866
+ isSignal: true,
29867
+ alias: "ariaLabel",
29868
+ required: false
29869
+ }]
29870
+ }],
29871
+ hint: [{
29872
+ type: i0.Input,
29873
+ args: [{
29874
+ isSignal: true,
29875
+ alias: "hint",
29876
+ required: false
29877
+ }]
29878
+ }],
29879
+ error: [{
29880
+ type: i0.Input,
29881
+ args: [{
29882
+ isSignal: true,
29883
+ alias: "error",
29884
+ required: false
29885
+ }]
29886
+ }],
29887
+ width: [{
29888
+ type: i0.Input,
29889
+ args: [{
29890
+ isSignal: true,
29891
+ alias: "width",
29892
+ required: false
29893
+ }]
29894
+ }],
29895
+ height: [{
29896
+ type: i0.Input,
29897
+ args: [{
29898
+ isSignal: true,
29899
+ alias: "height",
29900
+ required: false
29901
+ }]
29902
+ }],
29903
+ outputWidth: [{
29904
+ type: i0.Input,
29905
+ args: [{
29906
+ isSignal: true,
29907
+ alias: "outputWidth",
29908
+ required: false
29909
+ }]
29910
+ }],
29911
+ outputHeight: [{
29912
+ type: i0.Input,
29913
+ args: [{
29914
+ isSignal: true,
29915
+ alias: "outputHeight",
29916
+ required: false
29917
+ }]
29918
+ }],
29919
+ penColor: [{
29920
+ type: i0.Input,
29921
+ args: [{
29922
+ isSignal: true,
29923
+ alias: "penColor",
29924
+ required: false
29925
+ }]
29926
+ }],
29927
+ penWidth: [{
29928
+ type: i0.Input,
29929
+ args: [{
29930
+ isSignal: true,
29931
+ alias: "penWidth",
29932
+ required: false
29933
+ }]
29934
+ }],
29935
+ showClear: [{
29936
+ type: i0.Input,
29937
+ args: [{
29938
+ isSignal: true,
29939
+ alias: "showClear",
29940
+ required: false
29941
+ }]
29942
+ }],
29943
+ clearLabel: [{
29944
+ type: i0.Input,
29945
+ args: [{
29946
+ isSignal: true,
29947
+ alias: "clearLabel",
29948
+ required: false
29949
+ }]
29950
+ }],
29951
+ _disabledInput: [{
29952
+ type: i0.Input,
29953
+ args: [{
29954
+ isSignal: true,
29955
+ alias: "disabled",
29956
+ required: false
29957
+ }]
29958
+ }],
29959
+ signatureChange: [{
29960
+ type: i0.Output,
29961
+ args: ["signatureChange"]
29962
+ }],
29963
+ _canvas: [{
29964
+ type: i0.ViewChild,
29965
+ args: ["canvas", { isSignal: true }]
29966
+ }]
29967
+ }
29968
+ });
29969
+ var PdfHotspotComponent = class PdfHotspotComponent {
29970
+ constructor() {
29971
+ this.x = input(0, ...ngDevMode ? [{ debugName: "x" }] : /* istanbul ignore next */ []);
29972
+ this.y = input(0, ...ngDevMode ? [{ debugName: "y" }] : /* istanbul ignore next */ []);
29973
+ this.width = input(0, ...ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []);
29974
+ this.height = input(0, ...ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []);
29975
+ this.state = input("ready", ...ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []);
29976
+ this.tone = input("primary", ...ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []);
29977
+ this.label = input("Sign Here", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
29978
+ this.blockedLabel = input("", ...ngDevMode ? [{ debugName: "blockedLabel" }] : /* istanbul ignore next */ []);
29979
+ this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
29980
+ this.image = input(null, ...ngDevMode ? [{ debugName: "image" }] : /* istanbul ignore next */ []);
29981
+ this.imageAlt = input("Applied signature", ...ngDevMode ? [{ debugName: "imageAlt" }] : /* istanbul ignore next */ []);
29982
+ this.activate = output();
29983
+ this.fontSize = computed(() => Math.min(11, Math.max(7, this.height() * .25)), ...ngDevMode ? [{ debugName: "fontSize" }] : /* istanbul ignore next */ []);
29984
+ }
29985
+ static {
29986
+ this.ɵfac = i0.ɵɵngDeclareFactory({
29987
+ minVersion: "12.0.0",
29988
+ version: "22.2.2",
29989
+ ngImport: i0,
29990
+ type: PdfHotspotComponent,
29991
+ deps: [],
29992
+ target: i0.ɵɵFactoryTarget.Component
29993
+ });
29994
+ }
29995
+ static {
29996
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
29997
+ minVersion: "17.0.0",
29998
+ version: "22.2.2",
29999
+ type: PdfHotspotComponent,
30000
+ isStandalone: true,
30001
+ selector: "ui-pdf-hotspot",
30002
+ inputs: {
30003
+ x: {
30004
+ classPropertyName: "x",
30005
+ publicName: "x",
30006
+ isSignal: true,
30007
+ isRequired: false,
30008
+ transformFunction: null
30009
+ },
30010
+ y: {
30011
+ classPropertyName: "y",
30012
+ publicName: "y",
30013
+ isSignal: true,
30014
+ isRequired: false,
30015
+ transformFunction: null
30016
+ },
30017
+ width: {
30018
+ classPropertyName: "width",
30019
+ publicName: "width",
30020
+ isSignal: true,
30021
+ isRequired: false,
30022
+ transformFunction: null
30023
+ },
30024
+ height: {
30025
+ classPropertyName: "height",
30026
+ publicName: "height",
30027
+ isSignal: true,
30028
+ isRequired: false,
30029
+ transformFunction: null
30030
+ },
30031
+ state: {
30032
+ classPropertyName: "state",
30033
+ publicName: "state",
30034
+ isSignal: true,
30035
+ isRequired: false,
30036
+ transformFunction: null
30037
+ },
30038
+ tone: {
30039
+ classPropertyName: "tone",
30040
+ publicName: "tone",
30041
+ isSignal: true,
30042
+ isRequired: false,
30043
+ transformFunction: null
30044
+ },
30045
+ label: {
30046
+ classPropertyName: "label",
30047
+ publicName: "label",
30048
+ isSignal: true,
30049
+ isRequired: false,
30050
+ transformFunction: null
30051
+ },
30052
+ blockedLabel: {
30053
+ classPropertyName: "blockedLabel",
30054
+ publicName: "blockedLabel",
30055
+ isSignal: true,
30056
+ isRequired: false,
30057
+ transformFunction: null
30058
+ },
30059
+ ariaLabel: {
30060
+ classPropertyName: "ariaLabel",
30061
+ publicName: "ariaLabel",
30062
+ isSignal: true,
30063
+ isRequired: false,
30064
+ transformFunction: null
30065
+ },
30066
+ image: {
30067
+ classPropertyName: "image",
30068
+ publicName: "image",
30069
+ isSignal: true,
30070
+ isRequired: false,
30071
+ transformFunction: null
30072
+ },
30073
+ imageAlt: {
30074
+ classPropertyName: "imageAlt",
30075
+ publicName: "imageAlt",
30076
+ isSignal: true,
30077
+ isRequired: false,
30078
+ transformFunction: null
30079
+ }
30080
+ },
30081
+ outputs: { activate: "activate" },
30082
+ host: { properties: {
30083
+ "style.left.px": "x()",
30084
+ "style.top.px": "y()",
30085
+ "style.width.px": "width()",
30086
+ "style.height.px": "height()",
30087
+ "attr.data-state": "state()"
30088
+ } },
30089
+ ngImport: i0,
30090
+ template: `
30091
+ @if (state() === 'signed' && image()) {
30092
+ <img class="ph-image" [src]="image()" [alt]="imageAlt()" />
30093
+ } @else {
30094
+ <button
30095
+ type="button"
30096
+ class="ph-button"
30097
+ [class.ph-ready]="state() === 'ready'"
30098
+ [class.ph-warning]="tone() === 'warning'"
30099
+ [disabled]="state() !== 'ready'"
30100
+ [attr.aria-label]="ariaLabel() || null"
30101
+ [style.font-size.px]="fontSize()"
30102
+ (click)="activate.emit()"><span class="ph-text">{{ state() === 'blocked' ? blockedLabel() : label() }}</span></button>
30103
+ }
30104
+ `,
30105
+ isInline: true,
30106
+ 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:44px;transform:translateY(-50%)}}\n"],
30107
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
30108
+ });
30109
+ }
30110
+ };
30111
+ i0.ɵɵngDeclareClassMetadata({
30112
+ minVersion: "12.0.0",
30113
+ version: "22.2.2",
30114
+ ngImport: i0,
30115
+ type: PdfHotspotComponent,
30116
+ decorators: [{
30117
+ type: Component,
30118
+ args: [{
30119
+ selector: "ui-pdf-hotspot",
30120
+ standalone: true,
30121
+ changeDetection: ChangeDetectionStrategy.OnPush,
30122
+ host: {
30123
+ "[style.left.px]": "x()",
30124
+ "[style.top.px]": "y()",
30125
+ "[style.width.px]": "width()",
30126
+ "[style.height.px]": "height()",
30127
+ "[attr.data-state]": "state()"
30128
+ },
30129
+ template: `
30130
+ @if (state() === 'signed' && image()) {
30131
+ <img class="ph-image" [src]="image()" [alt]="imageAlt()" />
30132
+ } @else {
30133
+ <button
30134
+ type="button"
30135
+ class="ph-button"
30136
+ [class.ph-ready]="state() === 'ready'"
30137
+ [class.ph-warning]="tone() === 'warning'"
30138
+ [disabled]="state() !== 'ready'"
30139
+ [attr.aria-label]="ariaLabel() || null"
30140
+ [style.font-size.px]="fontSize()"
30141
+ (click)="activate.emit()"><span class="ph-text">{{ state() === 'blocked' ? blockedLabel() : label() }}</span></button>
30142
+ }
30143
+ `,
30144
+ 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:44px;transform:translateY(-50%)}}\n"]
30145
+ }]
30146
+ }],
30147
+ propDecorators: {
30148
+ x: [{
30149
+ type: i0.Input,
30150
+ args: [{
30151
+ isSignal: true,
30152
+ alias: "x",
30153
+ required: false
30154
+ }]
30155
+ }],
30156
+ y: [{
30157
+ type: i0.Input,
30158
+ args: [{
30159
+ isSignal: true,
30160
+ alias: "y",
30161
+ required: false
30162
+ }]
30163
+ }],
30164
+ width: [{
30165
+ type: i0.Input,
30166
+ args: [{
30167
+ isSignal: true,
30168
+ alias: "width",
30169
+ required: false
30170
+ }]
30171
+ }],
30172
+ height: [{
30173
+ type: i0.Input,
30174
+ args: [{
30175
+ isSignal: true,
30176
+ alias: "height",
30177
+ required: false
30178
+ }]
30179
+ }],
30180
+ state: [{
30181
+ type: i0.Input,
30182
+ args: [{
30183
+ isSignal: true,
30184
+ alias: "state",
30185
+ required: false
30186
+ }]
30187
+ }],
30188
+ tone: [{
30189
+ type: i0.Input,
30190
+ args: [{
30191
+ isSignal: true,
30192
+ alias: "tone",
30193
+ required: false
30194
+ }]
30195
+ }],
30196
+ label: [{
30197
+ type: i0.Input,
30198
+ args: [{
30199
+ isSignal: true,
30200
+ alias: "label",
30201
+ required: false
30202
+ }]
30203
+ }],
30204
+ blockedLabel: [{
30205
+ type: i0.Input,
30206
+ args: [{
30207
+ isSignal: true,
30208
+ alias: "blockedLabel",
30209
+ required: false
30210
+ }]
30211
+ }],
30212
+ ariaLabel: [{
30213
+ type: i0.Input,
30214
+ args: [{
30215
+ isSignal: true,
30216
+ alias: "ariaLabel",
30217
+ required: false
30218
+ }]
30219
+ }],
30220
+ image: [{
30221
+ type: i0.Input,
30222
+ args: [{
30223
+ isSignal: true,
30224
+ alias: "image",
30225
+ required: false
30226
+ }]
30227
+ }],
30228
+ imageAlt: [{
30229
+ type: i0.Input,
30230
+ args: [{
30231
+ isSignal: true,
30232
+ alias: "imageAlt",
30233
+ required: false
30234
+ }]
30235
+ }],
30236
+ activate: [{
30237
+ type: i0.Output,
30238
+ args: ["activate"]
30239
+ }]
30240
+ }
30241
+ });
30242
+ var DetailCardComponent = class DetailCardComponent {
30243
+ constructor() {
30244
+ this.title = input("", ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
30245
+ this.uppercaseTitle = input(true, ...ngDevMode ? [{ debugName: "uppercaseTitle" }] : /* istanbul ignore next */ []);
30246
+ this.headingLevel = input(null, ...ngDevMode ? [{ debugName: "headingLevel" }] : /* istanbul ignore next */ []);
30247
+ this.titleId = input("", ...ngDevMode ? [{ debugName: "titleId" }] : /* istanbul ignore next */ []);
30248
+ this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
30249
+ this.subtitle = input("", ...ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []);
30250
+ this.background = input("", ...ngDevMode ? [{ debugName: "background" }] : /* istanbul ignore next */ []);
30251
+ this.textColor = input("", ...ngDevMode ? [{ debugName: "textColor" }] : /* istanbul ignore next */ []);
30252
+ this.showHeader = input(true, ...ngDevMode ? [{ debugName: "showHeader" }] : /* istanbul ignore next */ []);
30253
+ this.collapsible = input(true, ...ngDevMode ? [{ debugName: "collapsible" }] : /* istanbul ignore next */ []);
30254
+ this.expanded = model(true, ...ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []);
30255
+ this.showEdit = input(false, ...ngDevMode ? [{ debugName: "showEdit" }] : /* istanbul ignore next */ []);
30256
+ this.editLabel = input("Edit", ...ngDevMode ? [{ debugName: "editLabel" }] : /* istanbul ignore next */ []);
30257
+ this.editClick = output();
30258
+ }
30259
+ groupLabel() {
30260
+ if (this.showHeader() && this.title()) return this.titleId() ? null : this.title();
30261
+ return this.ariaLabel().trim() || null;
30262
+ }
30263
+ isOpen() {
30264
+ return !(this.showHeader() && this.collapsible()) || this.expanded();
30265
+ }
30266
+ toggle() {
30267
+ this.expanded.set(!this.expanded());
30268
+ }
30269
+ onHeaderClick(event) {
30270
+ if (!this.showHeader() || !this.collapsible()) return;
30271
+ if (event.target?.closest("button, a, input, select, textarea, label, [role=\"button\"], [role=\"link\"], [tabindex]:not([tabindex=\"-1\"])")?.closest(".dc-header")) return;
30272
+ this.toggle();
30273
+ }
30274
+ static {
30275
+ this.ɵfac = i0.ɵɵngDeclareFactory({
30276
+ minVersion: "12.0.0",
30277
+ version: "22.2.2",
30278
+ ngImport: i0,
30279
+ type: DetailCardComponent,
30280
+ deps: [],
30281
+ target: i0.ɵɵFactoryTarget.Component
30282
+ });
30283
+ }
30284
+ static {
30285
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
30286
+ minVersion: "17.0.0",
30287
+ version: "22.2.2",
30288
+ type: DetailCardComponent,
30289
+ isStandalone: true,
30290
+ selector: "ui-detail-card",
30291
+ inputs: {
30292
+ title: {
30293
+ classPropertyName: "title",
30294
+ publicName: "title",
30295
+ isSignal: true,
30296
+ isRequired: false,
30297
+ transformFunction: null
30298
+ },
30299
+ uppercaseTitle: {
30300
+ classPropertyName: "uppercaseTitle",
30301
+ publicName: "uppercaseTitle",
30302
+ isSignal: true,
30303
+ isRequired: false,
30304
+ transformFunction: null
30305
+ },
30306
+ headingLevel: {
30307
+ classPropertyName: "headingLevel",
30308
+ publicName: "headingLevel",
30309
+ isSignal: true,
30310
+ isRequired: false,
30311
+ transformFunction: null
30312
+ },
30313
+ titleId: {
30314
+ classPropertyName: "titleId",
30315
+ publicName: "titleId",
30316
+ isSignal: true,
30317
+ isRequired: false,
30318
+ transformFunction: null
30319
+ },
30320
+ ariaLabel: {
30321
+ classPropertyName: "ariaLabel",
30322
+ publicName: "ariaLabel",
30323
+ isSignal: true,
30324
+ isRequired: false,
30325
+ transformFunction: null
30326
+ },
30327
+ subtitle: {
30328
+ classPropertyName: "subtitle",
30329
+ publicName: "subtitle",
30330
+ isSignal: true,
30331
+ isRequired: false,
30332
+ transformFunction: null
30333
+ },
30334
+ background: {
30335
+ classPropertyName: "background",
30336
+ publicName: "background",
30337
+ isSignal: true,
30338
+ isRequired: false,
30339
+ transformFunction: null
30340
+ },
30341
+ textColor: {
30342
+ classPropertyName: "textColor",
30343
+ publicName: "textColor",
30344
+ isSignal: true,
30345
+ isRequired: false,
30346
+ transformFunction: null
30347
+ },
30348
+ showHeader: {
30349
+ classPropertyName: "showHeader",
30350
+ publicName: "showHeader",
30351
+ isSignal: true,
30352
+ isRequired: false,
30353
+ transformFunction: null
30354
+ },
30355
+ collapsible: {
30356
+ classPropertyName: "collapsible",
30357
+ publicName: "collapsible",
30358
+ isSignal: true,
30359
+ isRequired: false,
30360
+ transformFunction: null
30361
+ },
30362
+ expanded: {
30363
+ classPropertyName: "expanded",
30364
+ publicName: "expanded",
30365
+ isSignal: true,
30366
+ isRequired: false,
30367
+ transformFunction: null
30368
+ },
30369
+ showEdit: {
30370
+ classPropertyName: "showEdit",
30371
+ publicName: "showEdit",
30372
+ isSignal: true,
30373
+ isRequired: false,
30374
+ transformFunction: null
30375
+ },
30376
+ editLabel: {
30377
+ classPropertyName: "editLabel",
30378
+ publicName: "editLabel",
30379
+ isSignal: true,
30380
+ isRequired: false,
30381
+ transformFunction: null
30382
+ }
30383
+ },
30384
+ outputs: {
30385
+ expanded: "expandedChange",
30386
+ editClick: "editClick"
30387
+ },
30388
+ host: {
30389
+ attributes: { "role": "group" },
28585
30390
  properties: {
28586
30391
  "attr.aria-labelledby": "showHeader() && title() && titleId() ? titleId() : null",
28587
30392
  "attr.aria-label": "groupLabel()"
@@ -28605,7 +30410,7 @@ var DetailCardComponent = class DetailCardComponent {
28605
30410
  }
28606
30411
  <ng-content select="[card-header-leading]" />
28607
30412
  <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> }
30413
+ @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
30414
  @if (subtitle()) { <span class="dc-subtitle">{{ subtitle() }}</span> }
28610
30415
  <ng-content select="[card-header]" />
28611
30416
  </div>
@@ -28629,7 +30434,7 @@ var DetailCardComponent = class DetailCardComponent {
28629
30434
  </div>
28630
30435
  `,
28631
30436
  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"],
30437
+ 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
30438
  dependencies: [{
28634
30439
  kind: "component",
28635
30440
  type: ButtonComponent,
@@ -28638,6 +30443,7 @@ var DetailCardComponent = class DetailCardComponent {
28638
30443
  "variant",
28639
30444
  "routerLink",
28640
30445
  "queryParams",
30446
+ "fragment",
28641
30447
  "href",
28642
30448
  "target",
28643
30449
  "rel",
@@ -28694,7 +30500,7 @@ i0.ɵɵngDeclareClassMetadata({
28694
30500
  }
28695
30501
  <ng-content select="[card-header-leading]" />
28696
30502
  <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> }
30503
+ @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
30504
  @if (subtitle()) { <span class="dc-subtitle">{{ subtitle() }}</span> }
28699
30505
  <ng-content select="[card-header]" />
28700
30506
  </div>
@@ -28717,7 +30523,7 @@ i0.ɵɵngDeclareClassMetadata({
28717
30523
  </div>
28718
30524
  </div>
28719
30525
  `,
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"]
30526
+ 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
30527
  }]
28722
30528
  }],
28723
30529
  propDecorators: {
@@ -28729,6 +30535,14 @@ i0.ɵɵngDeclareClassMetadata({
28729
30535
  required: false
28730
30536
  }]
28731
30537
  }],
30538
+ uppercaseTitle: [{
30539
+ type: i0.Input,
30540
+ args: [{
30541
+ isSignal: true,
30542
+ alias: "uppercaseTitle",
30543
+ required: false
30544
+ }]
30545
+ }],
28732
30546
  headingLevel: [{
28733
30547
  type: i0.Input,
28734
30548
  args: [{
@@ -30248,6 +32062,6 @@ i0.ɵɵngDeclareClassMetadata({
30248
32062
  }]
30249
32063
  }
30250
32064
  });
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 };
32065
+ 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
32066
 
30253
32067
  //# sourceMappingURL=forgeroute-ui.mjs.map