@forgeroute/ui 0.4.56 → 0.4.58

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.
@@ -2519,8 +2519,13 @@ var ModalComponent = class ModalComponent {
2519
2519
  this.dialogTestId = input("", ...ngDevMode ? [{ debugName: "dialogTestId" }] : /* istanbul ignore next */ []);
2520
2520
  this.hideClose = input(false, ...ngDevMode ? [{ debugName: "hideClose" }] : /* istanbul ignore next */ []);
2521
2521
  this.closable = input(true, ...ngDevMode ? [{ debugName: "closable" }] : /* istanbul ignore next */ []);
2522
+ this.layout = input("default", ...ngDevMode ? [{ debugName: "layout" }] : /* istanbul ignore next */ []);
2523
+ this.closeOnBackdrop = input(true, ...ngDevMode ? [{ debugName: "closeOnBackdrop" }] : /* istanbul ignore next */ []);
2524
+ this.closeOnEscape = input(true, ...ngDevMode ? [{ debugName: "closeOnEscape" }] : /* istanbul ignore next */ []);
2525
+ this.busy = input(false, ...ngDevMode ? [{ debugName: "busy" }] : /* istanbul ignore next */ []);
2522
2526
  this.close = output();
2523
2527
  this.returnFocusTo = input(null, ...ngDevMode ? [{ debugName: "returnFocusTo" }] : /* istanbul ignore next */ []);
2528
+ this.kiosk = computed(() => this.layout() === "kiosk", ...ngDevMode ? [{ debugName: "kiosk" }] : /* istanbul ignore next */ []);
2524
2529
  this.titleId = `m-title-${Math.random().toString(36).slice(2, 8)}`;
2525
2530
  this.el = inject(ElementRef);
2526
2531
  this.ren = inject(Renderer2);
@@ -2563,7 +2568,7 @@ var ModalComponent = class ModalComponent {
2563
2568
  if (!this.open() || !this._overlays.isTop(this)) return;
2564
2569
  if (event.key === "Escape") {
2565
2570
  event.preventDefault();
2566
- if (this.closable()) this.close.emit();
2571
+ this.dismiss("escape");
2567
2572
  return;
2568
2573
  }
2569
2574
  if (event.key === "Tab") {
@@ -2586,6 +2591,12 @@ var ModalComponent = class ModalComponent {
2586
2591
  }
2587
2592
  }
2588
2593
  }
2594
+ dismiss(via) {
2595
+ if (!this.closable() || this.busy()) return;
2596
+ if (via === "backdrop" && !this.closeOnBackdrop()) return;
2597
+ if (via === "escape" && !this.closeOnEscape()) return;
2598
+ this.close.emit();
2599
+ }
2589
2600
  onGuardFocus(which, event) {
2590
2601
  if (!this._overlays.isTop(this)) return;
2591
2602
  redirectFromGuard(which, this.el.nativeElement, this.el.nativeElement.querySelector(".m-modal"), event?.relatedTarget ?? null);
@@ -2606,6 +2617,10 @@ var ModalComponent = class ModalComponent {
2606
2617
  this._stopViewport?.();
2607
2618
  this._stopViewport = null;
2608
2619
  this._overlays.remove(this);
2620
+ if (this._scrollLocked && this.layout() === "kiosk") {
2621
+ restoreFocus(this.returnFocusTo(), this._prevFocus);
2622
+ this._prevFocus = null;
2623
+ }
2609
2624
  if (this._scrollLocked && this._overlays.isEmpty) this.doc.body.style.overflow = "";
2610
2625
  const el = this.el.nativeElement;
2611
2626
  if (el.parentNode === this.doc.body) this.ren.removeChild(this.doc.body, el);
@@ -2684,6 +2699,34 @@ var ModalComponent = class ModalComponent {
2684
2699
  isRequired: false,
2685
2700
  transformFunction: null
2686
2701
  },
2702
+ layout: {
2703
+ classPropertyName: "layout",
2704
+ publicName: "layout",
2705
+ isSignal: true,
2706
+ isRequired: false,
2707
+ transformFunction: null
2708
+ },
2709
+ closeOnBackdrop: {
2710
+ classPropertyName: "closeOnBackdrop",
2711
+ publicName: "closeOnBackdrop",
2712
+ isSignal: true,
2713
+ isRequired: false,
2714
+ transformFunction: null
2715
+ },
2716
+ closeOnEscape: {
2717
+ classPropertyName: "closeOnEscape",
2718
+ publicName: "closeOnEscape",
2719
+ isSignal: true,
2720
+ isRequired: false,
2721
+ transformFunction: null
2722
+ },
2723
+ busy: {
2724
+ classPropertyName: "busy",
2725
+ publicName: "busy",
2726
+ isSignal: true,
2727
+ isRequired: false,
2728
+ transformFunction: null
2729
+ },
2687
2730
  returnFocusTo: {
2688
2731
  classPropertyName: "returnFocusTo",
2689
2732
  publicName: "returnFocusTo",
@@ -2697,8 +2740,8 @@ var ModalComponent = class ModalComponent {
2697
2740
  ngImport: i0,
2698
2741
  template: `
2699
2742
  @if (open()) {
2700
- <div class="m-backdrop" (click)="closable() && close.emit()"></div>
2701
- <div class="m-modal" role="dialog" aria-modal="true" tabindex="-1" [attr.aria-labelledby]="titleId" [attr.data-testid]="dialogTestId() || null" [style.max-width]="maxWidth()">
2743
+ <div class="m-backdrop" [class.m-kiosk-backdrop]="kiosk()" (click)="dismiss('backdrop')"></div>
2744
+ <div class="m-modal" [class.m-kiosk]="kiosk()" role="dialog" aria-modal="true" tabindex="-1" [attr.aria-labelledby]="titleId" [attr.aria-busy]="busy() ? 'true' : null" [attr.data-testid]="dialogTestId() || null" [style.max-width]="maxWidth()">
2702
2745
  <span class="m-focus-guard" data-ui-focus-guard="start" tabindex="0" (focus)="onGuardFocus('start', $event)"></span>
2703
2746
  <div class="m-header">
2704
2747
  <div class="m-header-text">
@@ -2707,8 +2750,9 @@ var ModalComponent = class ModalComponent {
2707
2750
  <p class="m-description">{{ description() }}</p>
2708
2751
  }
2709
2752
  </div>
2753
+ <ng-content select="[modal-header-end]" />
2710
2754
  @if (!hideClose() && closable()) {
2711
- <button class="m-close" type="button" aria-label="Close" (click)="close.emit()">
2755
+ <button class="m-close" type="button" aria-label="Close" [disabled]="busy()" (click)="dismiss('close')">
2712
2756
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
2713
2757
  <line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/>
2714
2758
  </svg>
@@ -2728,7 +2772,7 @@ var ModalComponent = class ModalComponent {
2728
2772
  }
2729
2773
  `,
2730
2774
  isInline: true,
2731
- 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-focus-guard{position:absolute;width:1px;height:1px;padding:0;margin:-1px;border:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;outline:none}.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-wrap:wrap;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)}}@media(prefers-reduced-motion:reduce){.m-backdrop,.m-modal{animation:none}}\n"],
2775
+ 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-close:disabled{opacity:.4;cursor:not-allowed}.m-focus-guard{position:absolute;width:1px;height:1px;padding:0;margin:-1px;border:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;outline:none}.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:not(.m-kiosk){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-wrap:wrap;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}}.m-backdrop.m-kiosk-backdrop{background:#0f172ab8;backdrop-filter:none;-webkit-backdrop-filter:none}.m-modal.m-kiosk{inset:0;transform:none;margin:auto;width:calc(100% - 32px);height:fit-content;max-height:calc(100vh - 32px);max-height:calc(100dvh - 32px);overflow:hidden;animation:m-fade .18s ease;box-shadow:0 25px 60px #00000040}.m-modal.m-kiosk .m-body{overscroll-behavior:contain;-webkit-overflow-scrolling:touch}.m-modal.m-kiosk .m-footer{border-radius:0 0 16px 16px}@media(max-width:480px){.m-modal.m-kiosk{bottom:var(--ui-kb, 0px);max-height:min(calc(100dvh - 32px),var(--ui-vvh, 100dvh));border-radius:16px}.m-modal.m-kiosk .m-footer{flex-wrap:wrap;padding-bottom:max(18px,env(safe-area-inset-bottom))}}@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)}}@media(prefers-reduced-motion:reduce){.m-backdrop,.m-modal{animation:none}}\n"],
2732
2776
  changeDetection: i0.ChangeDetectionStrategy.OnPush
2733
2777
  });
2734
2778
  }
@@ -2747,8 +2791,8 @@ i0.ɵɵngDeclareClassMetadata({
2747
2791
  host: { "(document:keydown)": "onKeydown($event)" },
2748
2792
  template: `
2749
2793
  @if (open()) {
2750
- <div class="m-backdrop" (click)="closable() && close.emit()"></div>
2751
- <div class="m-modal" role="dialog" aria-modal="true" tabindex="-1" [attr.aria-labelledby]="titleId" [attr.data-testid]="dialogTestId() || null" [style.max-width]="maxWidth()">
2794
+ <div class="m-backdrop" [class.m-kiosk-backdrop]="kiosk()" (click)="dismiss('backdrop')"></div>
2795
+ <div class="m-modal" [class.m-kiosk]="kiosk()" role="dialog" aria-modal="true" tabindex="-1" [attr.aria-labelledby]="titleId" [attr.aria-busy]="busy() ? 'true' : null" [attr.data-testid]="dialogTestId() || null" [style.max-width]="maxWidth()">
2752
2796
  <span class="m-focus-guard" data-ui-focus-guard="start" tabindex="0" (focus)="onGuardFocus('start', $event)"></span>
2753
2797
  <div class="m-header">
2754
2798
  <div class="m-header-text">
@@ -2757,8 +2801,9 @@ i0.ɵɵngDeclareClassMetadata({
2757
2801
  <p class="m-description">{{ description() }}</p>
2758
2802
  }
2759
2803
  </div>
2804
+ <ng-content select="[modal-header-end]" />
2760
2805
  @if (!hideClose() && closable()) {
2761
- <button class="m-close" type="button" aria-label="Close" (click)="close.emit()">
2806
+ <button class="m-close" type="button" aria-label="Close" [disabled]="busy()" (click)="dismiss('close')">
2762
2807
  <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
2763
2808
  <line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/>
2764
2809
  </svg>
@@ -2777,7 +2822,7 @@ i0.ɵɵngDeclareClassMetadata({
2777
2822
  </div>
2778
2823
  }
2779
2824
  `,
2780
- 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-focus-guard{position:absolute;width:1px;height:1px;padding:0;margin:-1px;border:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;outline:none}.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-wrap:wrap;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)}}@media(prefers-reduced-motion:reduce){.m-backdrop,.m-modal{animation:none}}\n"]
2825
+ 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-close:disabled{opacity:.4;cursor:not-allowed}.m-focus-guard{position:absolute;width:1px;height:1px;padding:0;margin:-1px;border:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;outline:none}.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:not(.m-kiosk){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-wrap:wrap;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}}.m-backdrop.m-kiosk-backdrop{background:#0f172ab8;backdrop-filter:none;-webkit-backdrop-filter:none}.m-modal.m-kiosk{inset:0;transform:none;margin:auto;width:calc(100% - 32px);height:fit-content;max-height:calc(100vh - 32px);max-height:calc(100dvh - 32px);overflow:hidden;animation:m-fade .18s ease;box-shadow:0 25px 60px #00000040}.m-modal.m-kiosk .m-body{overscroll-behavior:contain;-webkit-overflow-scrolling:touch}.m-modal.m-kiosk .m-footer{border-radius:0 0 16px 16px}@media(max-width:480px){.m-modal.m-kiosk{bottom:var(--ui-kb, 0px);max-height:min(calc(100dvh - 32px),var(--ui-vvh, 100dvh));border-radius:16px}.m-modal.m-kiosk .m-footer{flex-wrap:wrap;padding-bottom:max(18px,env(safe-area-inset-bottom))}}@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)}}@media(prefers-reduced-motion:reduce){.m-backdrop,.m-modal{animation:none}}\n"]
2781
2826
  }]
2782
2827
  }],
2783
2828
  ctorParameters: () => [],
@@ -2846,6 +2891,38 @@ i0.ɵɵngDeclareClassMetadata({
2846
2891
  required: false
2847
2892
  }]
2848
2893
  }],
2894
+ layout: [{
2895
+ type: i0.Input,
2896
+ args: [{
2897
+ isSignal: true,
2898
+ alias: "layout",
2899
+ required: false
2900
+ }]
2901
+ }],
2902
+ closeOnBackdrop: [{
2903
+ type: i0.Input,
2904
+ args: [{
2905
+ isSignal: true,
2906
+ alias: "closeOnBackdrop",
2907
+ required: false
2908
+ }]
2909
+ }],
2910
+ closeOnEscape: [{
2911
+ type: i0.Input,
2912
+ args: [{
2913
+ isSignal: true,
2914
+ alias: "closeOnEscape",
2915
+ required: false
2916
+ }]
2917
+ }],
2918
+ busy: [{
2919
+ type: i0.Input,
2920
+ args: [{
2921
+ isSignal: true,
2922
+ alias: "busy",
2923
+ required: false
2924
+ }]
2925
+ }],
2849
2926
  close: [{
2850
2927
  type: i0.Output,
2851
2928
  args: ["close"]
@@ -2990,6 +3067,11 @@ function formatTime(value) {
2990
3067
  const h = Math.floor(t / 60), mi = t % 60;
2991
3068
  return `${h % 12 === 0 ? 12 : h % 12}:${String(mi).padStart(2, "0")} ${h < 12 ? "AM" : "PM"}`;
2992
3069
  }
3070
+ function mergeDescribedBy(own, external) {
3071
+ const ids = `${own ?? ""} ${external ?? ""}`.split(/\s+/).filter(Boolean);
3072
+ const unique = ids.filter((id, i) => ids.indexOf(id) === i);
3073
+ return unique.length ? unique.join(" ") : null;
3074
+ }
2993
3075
  var CheckboxComponent = class CheckboxComponent {
2994
3076
  isSelected(value) {
2995
3077
  return this._selected().includes(value);
@@ -4969,6 +5051,7 @@ var TextInputComponent = class TextInputComponent {
4969
5051
  this.inputmode = input("", ...ngDevMode ? [{ debugName: "inputmode" }] : /* istanbul ignore next */ []);
4970
5052
  this.readonly = input(false, ...ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []);
4971
5053
  this.hint = input("", ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
5054
+ this.ariaDescribedBy = input("", ...ngDevMode ? [{ debugName: "ariaDescribedBy" }] : /* istanbul ignore next */ []);
4972
5055
  this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
4973
5056
  this.phoneFormat = input(false, ...ngDevMode ? [{ debugName: "phoneFormat" }] : /* istanbul ignore next */ []);
4974
5057
  this.min = input(void 0, ...ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []);
@@ -5005,8 +5088,7 @@ var TextInputComponent = class TextInputComponent {
5005
5088
  this._eyeOffPath = iconPath("view-off");
5006
5089
  this._showRequirements = computed(() => this.passwordRequirements() && this.type() === "password" && this._typed(), ...ngDevMode ? [{ debugName: "_showRequirements" }] : /* istanbul ignore next */ []);
5007
5090
  this._describedBy = computed(() => {
5008
- const ids = [this._activeError() || this.hint() ? this._inputId + "-desc" : "", this._showRequirements() ? this._inputId + "-req" : ""].filter(Boolean);
5009
- return ids.length ? ids.join(" ") : null;
5091
+ return mergeDescribedBy([this._activeError() || this.hint() ? this._inputId + "-desc" : "", this._showRequirements() ? this._inputId + "-req" : ""].filter(Boolean).join(" "), this.ariaDescribedBy());
5010
5092
  }, ...ngDevMode ? [{ debugName: "_describedBy" }] : /* istanbul ignore next */ []);
5011
5093
  this._typed = signal(false, ...ngDevMode ? [{ debugName: "_typed" }] : /* istanbul ignore next */ []);
5012
5094
  this._defaultRules = DEFAULT_PASSWORD_RULES;
@@ -5300,6 +5382,13 @@ var TextInputComponent = class TextInputComponent {
5300
5382
  isRequired: false,
5301
5383
  transformFunction: null
5302
5384
  },
5385
+ ariaDescribedBy: {
5386
+ classPropertyName: "ariaDescribedBy",
5387
+ publicName: "ariaDescribedBy",
5388
+ isSignal: true,
5389
+ isRequired: false,
5390
+ transformFunction: null
5391
+ },
5303
5392
  error: {
5304
5393
  classPropertyName: "error",
5305
5394
  publicName: "error",
@@ -5687,6 +5776,14 @@ i0.ɵɵngDeclareClassMetadata({
5687
5776
  required: false
5688
5777
  }]
5689
5778
  }],
5779
+ ariaDescribedBy: [{
5780
+ type: i0.Input,
5781
+ args: [{
5782
+ isSignal: true,
5783
+ alias: "ariaDescribedBy",
5784
+ required: false
5785
+ }]
5786
+ }],
5690
5787
  error: [{
5691
5788
  type: i0.Input,
5692
5789
  args: [{
@@ -6174,6 +6271,10 @@ var TableToolbarComponent = class TableToolbarComponent {
6174
6271
  "dialogTestId",
6175
6272
  "hideClose",
6176
6273
  "closable",
6274
+ "layout",
6275
+ "closeOnBackdrop",
6276
+ "closeOnEscape",
6277
+ "busy",
6177
6278
  "returnFocusTo"
6178
6279
  ],
6179
6280
  outputs: ["close"]
@@ -6259,6 +6360,7 @@ var TableToolbarComponent = class TableToolbarComponent {
6259
6360
  "inputmode",
6260
6361
  "readonly",
6261
6362
  "hint",
6363
+ "ariaDescribedBy",
6262
6364
  "error",
6263
6365
  "phoneFormat",
6264
6366
  "min",
@@ -7330,6 +7432,7 @@ var SelectComponent = class SelectComponent {
7330
7432
  this.valueType = input("string", ...ngDevMode ? [{ debugName: "valueType" }] : /* istanbul ignore next */ []);
7331
7433
  this.required = input(false, ...ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []);
7332
7434
  this.hint = input("", ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
7435
+ this.ariaDescribedBy = input("", ...ngDevMode ? [{ debugName: "ariaDescribedBy" }] : /* istanbul ignore next */ []);
7333
7436
  this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
7334
7437
  this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
7335
7438
  this.size = input("default", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
@@ -7345,7 +7448,7 @@ var SelectComponent = class SelectComponent {
7345
7448
  return this.options().findIndex((o) => this._norm(String(o.value)) === v);
7346
7449
  }, ...ngDevMode ? [{ debugName: "_selectedIndex" }] : /* istanbul ignore next */ []);
7347
7450
  this._selectedDescription = computed(() => this.options()[this._selectedIndex()]?.description ?? "", ...ngDevMode ? [{ debugName: "_selectedDescription" }] : /* istanbul ignore next */ []);
7348
- this._describedBy = computed(() => [this._activeError() || this.hint() ? this._selectId + "-desc" : "", !this._activeError() && this._selectedDescription() ? this._selectId + "-opt-desc" : ""].filter(Boolean).join(" "), ...ngDevMode ? [{ debugName: "_describedBy" }] : /* istanbul ignore next */ []);
7451
+ this._describedBy = computed(() => mergeDescribedBy([this._activeError() || this.hint() ? this._selectId + "-desc" : "", !this._activeError() && this._selectedDescription() ? this._selectId + "-opt-desc" : ""].filter(Boolean).join(" "), this.ariaDescribedBy()), ...ngDevMode ? [{ debugName: "_describedBy" }] : /* istanbul ignore next */ []);
7349
7452
  this._reveal = createFieldReveal(this.showErrors);
7350
7453
  this._issue = computed(() => this._check(this._value()), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
7351
7454
  this.invalid = computed(() => !!this.error() || !!this._issue(), ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
@@ -7494,6 +7597,13 @@ var SelectComponent = class SelectComponent {
7494
7597
  isRequired: false,
7495
7598
  transformFunction: null
7496
7599
  },
7600
+ ariaDescribedBy: {
7601
+ classPropertyName: "ariaDescribedBy",
7602
+ publicName: "ariaDescribedBy",
7603
+ isSignal: true,
7604
+ isRequired: false,
7605
+ transformFunction: null
7606
+ },
7497
7607
  error: {
7498
7608
  classPropertyName: "error",
7499
7609
  publicName: "error",
@@ -7715,6 +7825,14 @@ i0.ɵɵngDeclareClassMetadata({
7715
7825
  required: false
7716
7826
  }]
7717
7827
  }],
7828
+ ariaDescribedBy: [{
7829
+ type: i0.Input,
7830
+ args: [{
7831
+ isSignal: true,
7832
+ alias: "ariaDescribedBy",
7833
+ required: false
7834
+ }]
7835
+ }],
7718
7836
  error: [{
7719
7837
  type: i0.Input,
7720
7838
  args: [{
@@ -10110,6 +10228,10 @@ var ImportExportComponent = class ImportExportComponent {
10110
10228
  "dialogTestId",
10111
10229
  "hideClose",
10112
10230
  "closable",
10231
+ "layout",
10232
+ "closeOnBackdrop",
10233
+ "closeOnEscape",
10234
+ "busy",
10113
10235
  "returnFocusTo"
10114
10236
  ],
10115
10237
  outputs: ["close"]
@@ -10156,6 +10278,7 @@ var ImportExportComponent = class ImportExportComponent {
10156
10278
  "valueType",
10157
10279
  "required",
10158
10280
  "hint",
10281
+ "ariaDescribedBy",
10159
10282
  "error",
10160
10283
  "showErrors",
10161
10284
  "size",
@@ -10650,6 +10773,10 @@ var ConfirmOutletComponent = class ConfirmOutletComponent {
10650
10773
  "dialogTestId",
10651
10774
  "hideClose",
10652
10775
  "closable",
10776
+ "layout",
10777
+ "closeOnBackdrop",
10778
+ "closeOnEscape",
10779
+ "busy",
10653
10780
  "returnFocusTo"
10654
10781
  ],
10655
10782
  outputs: ["close"]
@@ -13827,6 +13954,7 @@ var DataTableComponent = class DataTableComponent {
13827
13954
  "valueType",
13828
13955
  "required",
13829
13956
  "hint",
13957
+ "ariaDescribedBy",
13830
13958
  "error",
13831
13959
  "showErrors",
13832
13960
  "size",
@@ -13872,6 +14000,10 @@ var DataTableComponent = class DataTableComponent {
13872
14000
  "dialogTestId",
13873
14001
  "hideClose",
13874
14002
  "closable",
14003
+ "layout",
14004
+ "closeOnBackdrop",
14005
+ "closeOnEscape",
14006
+ "busy",
13875
14007
  "returnFocusTo"
13876
14008
  ],
13877
14009
  outputs: ["close"]
@@ -17416,6 +17548,7 @@ var BusinessHoursComponent = class BusinessHoursComponent {
17416
17548
  "valueType",
17417
17549
  "required",
17418
17550
  "hint",
17551
+ "ariaDescribedBy",
17419
17552
  "error",
17420
17553
  "showErrors",
17421
17554
  "size",
@@ -19112,6 +19245,7 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
19112
19245
  "inputmode",
19113
19246
  "readonly",
19114
19247
  "hint",
19248
+ "ariaDescribedBy",
19115
19249
  "error",
19116
19250
  "phoneFormat",
19117
19251
  "min",
@@ -20710,6 +20844,7 @@ var TextareaInputComponent = class TextareaInputComponent {
20710
20844
  this.required = input(false, ...ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []);
20711
20845
  this.readonly = input(false, ...ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []);
20712
20846
  this.hint = input("", ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
20847
+ this.ariaDescribedBy = input("", ...ngDevMode ? [{ debugName: "ariaDescribedBy" }] : /* istanbul ignore next */ []);
20713
20848
  this.hintAsDescription = input(false, ...ngDevMode ? [{ debugName: "hintAsDescription" }] : /* istanbul ignore next */ []);
20714
20849
  this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
20715
20850
  this.monospace = input(false, ...ngDevMode ? [{ debugName: "monospace" }] : /* istanbul ignore next */ []);
@@ -20722,13 +20857,14 @@ var TextareaInputComponent = class TextareaInputComponent {
20722
20857
  this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
20723
20858
  this._value = signal("", ...ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []);
20724
20859
  this._unlabelledHint = computed(() => !this.label() && !!this.hint(), ...ngDevMode ? [{ debugName: "_unlabelledHint" }] : /* istanbul ignore next */ []);
20725
- this._describedBy = computed(() => {
20860
+ this._describedBy = computed(() => mergeDescribedBy(this._ownDescribedBy(), this.ariaDescribedBy()), ...ngDevMode ? [{ debugName: "_describedBy" }] : /* istanbul ignore next */ []);
20861
+ this._ownDescribedBy = computed(() => {
20726
20862
  if (!this.hintAsDescription()) return this._activeError() ? this._inputId + "-desc" : this._unlabelledHint() ? this._inputId + "-hint" : null;
20727
20863
  const ids = [];
20728
20864
  if (this.hint() && (this.label() || !this._activeError())) ids.push(this._inputId + "-hint");
20729
20865
  if (this._activeError()) ids.push(this._inputId + "-desc");
20730
20866
  return ids.length ? ids.join(" ") : null;
20731
- }, ...ngDevMode ? [{ debugName: "_describedBy" }] : /* istanbul ignore next */ []);
20867
+ }, ...ngDevMode ? [{ debugName: "_ownDescribedBy" }] : /* istanbul ignore next */ []);
20732
20868
  this._reveal = createFieldReveal(this.showErrors);
20733
20869
  this._issue = computed(() => this._check(this._value()), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
20734
20870
  this.invalid = computed(() => !!this.error() || !!this._issue(), ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
@@ -20854,6 +20990,13 @@ var TextareaInputComponent = class TextareaInputComponent {
20854
20990
  isRequired: false,
20855
20991
  transformFunction: null
20856
20992
  },
20993
+ ariaDescribedBy: {
20994
+ classPropertyName: "ariaDescribedBy",
20995
+ publicName: "ariaDescribedBy",
20996
+ isSignal: true,
20997
+ isRequired: false,
20998
+ transformFunction: null
20999
+ },
20857
21000
  hintAsDescription: {
20858
21001
  classPropertyName: "hintAsDescription",
20859
21002
  publicName: "hintAsDescription",
@@ -21099,6 +21242,14 @@ i0.ɵɵngDeclareClassMetadata({
21099
21242
  required: false
21100
21243
  }]
21101
21244
  }],
21245
+ ariaDescribedBy: [{
21246
+ type: i0.Input,
21247
+ args: [{
21248
+ isSignal: true,
21249
+ alias: "ariaDescribedBy",
21250
+ required: false
21251
+ }]
21252
+ }],
21102
21253
  hintAsDescription: [{
21103
21254
  type: i0.Input,
21104
21255
  args: [{
@@ -21377,6 +21528,7 @@ var BulkMessagePanelComponent = class BulkMessagePanelComponent {
21377
21528
  "inputmode",
21378
21529
  "readonly",
21379
21530
  "hint",
21531
+ "ariaDescribedBy",
21380
21532
  "error",
21381
21533
  "phoneFormat",
21382
21534
  "min",
@@ -21409,6 +21561,7 @@ var BulkMessagePanelComponent = class BulkMessagePanelComponent {
21409
21561
  "required",
21410
21562
  "readonly",
21411
21563
  "hint",
21564
+ "ariaDescribedBy",
21412
21565
  "hintAsDescription",
21413
21566
  "error",
21414
21567
  "monospace",
@@ -21528,67 +21681,79 @@ i0.ɵɵngDeclareClassMetadata({
21528
21681
  }]
21529
21682
  }
21530
21683
  });
21531
- const SIZE_REM = {
21532
- sm: "0.8125rem",
21533
- md: "0.875rem",
21534
- lg: "1rem"
21535
- };
21536
- const WEIGHT = {
21537
- normal: null,
21538
- medium: "500",
21539
- semibold: "600",
21540
- bold: "700"
21684
+ var FormRowComponent = class FormRowComponent {
21685
+ constructor() {
21686
+ this.cols = input(2, ...ngDevMode ? [{ debugName: "cols" }] : /* istanbul ignore next */ []);
21687
+ }
21688
+ static {
21689
+ this.ɵfac = i0.ɵɵngDeclareFactory({
21690
+ minVersion: "12.0.0",
21691
+ version: "22.2.2",
21692
+ ngImport: i0,
21693
+ type: FormRowComponent,
21694
+ deps: [],
21695
+ target: i0.ɵɵFactoryTarget.Component
21696
+ });
21697
+ }
21698
+ static {
21699
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
21700
+ minVersion: "17.1.0",
21701
+ version: "22.2.2",
21702
+ type: FormRowComponent,
21703
+ isStandalone: true,
21704
+ selector: "ui-form-row",
21705
+ inputs: { cols: {
21706
+ classPropertyName: "cols",
21707
+ publicName: "cols",
21708
+ isSignal: true,
21709
+ isRequired: false,
21710
+ transformFunction: null
21711
+ } },
21712
+ ngImport: i0,
21713
+ template: `<div class="fr-row" [class.fr-row--4]="cols() === 4" [style.--fr-cols]="cols()"><ng-content /></div>`,
21714
+ isInline: true,
21715
+ styles: ["ui-form-row{display:block}.fr-row{display:grid;grid-template-columns:repeat(var(--fr-cols, 2),1fr);gap:12px}.fr-row>.ui-span-2{grid-column:span 2}.fr-row>.ui-span-3{grid-column:span 3}.fr-row>.ui-span-all{grid-column:1 / -1}@media(max-width:768px){.fr-row--4{grid-template-columns:repeat(2,1fr)}.fr-row--4>.ui-span-3{grid-column:1 / -1}}@media(max-width:480px){.fr-row{grid-template-columns:1fr}.fr-row>.ui-span-2,.fr-row>.ui-span-3,.fr-row>.ui-span-all{grid-column:1 / -1}}\n"],
21716
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
21717
+ encapsulation: i0.ViewEncapsulation.None
21718
+ });
21719
+ }
21541
21720
  };
21542
- var TextComponent = class TextComponent {
21721
+ i0.ɵɵngDeclareClassMetadata({
21722
+ minVersion: "12.0.0",
21723
+ version: "22.2.2",
21724
+ ngImport: i0,
21725
+ type: FormRowComponent,
21726
+ decorators: [{
21727
+ type: Component,
21728
+ args: [{
21729
+ selector: "ui-form-row",
21730
+ standalone: true,
21731
+ changeDetection: ChangeDetectionStrategy.OnPush,
21732
+ encapsulation: ViewEncapsulation.None,
21733
+ template: `<div class="fr-row" [class.fr-row--4]="cols() === 4" [style.--fr-cols]="cols()"><ng-content /></div>`,
21734
+ styles: ["ui-form-row{display:block}.fr-row{display:grid;grid-template-columns:repeat(var(--fr-cols, 2),1fr);gap:12px}.fr-row>.ui-span-2{grid-column:span 2}.fr-row>.ui-span-3{grid-column:span 3}.fr-row>.ui-span-all{grid-column:1 / -1}@media(max-width:768px){.fr-row--4{grid-template-columns:repeat(2,1fr)}.fr-row--4>.ui-span-3{grid-column:1 / -1}}@media(max-width:480px){.fr-row{grid-template-columns:1fr}.fr-row>.ui-span-2,.fr-row>.ui-span-3,.fr-row>.ui-span-all{grid-column:1 / -1}}\n"]
21735
+ }]
21736
+ }],
21737
+ propDecorators: { cols: [{
21738
+ type: i0.Input,
21739
+ args: [{
21740
+ isSignal: true,
21741
+ alias: "cols",
21742
+ required: false
21743
+ }]
21744
+ }] }
21745
+ });
21746
+ var FormSectionComponent = class FormSectionComponent {
21543
21747
  constructor() {
21544
- this.text = input("", ...ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []);
21545
- this.size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
21546
- this.tone = input("default", ...ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []);
21547
- this.color = input("", ...ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []);
21548
- this.strong = input(null, ...ngDevMode ? [{ debugName: "strong" }] : /* istanbul ignore next */ []);
21549
- this.segments = computed(() => {
21550
- const text = this.text() ?? "";
21551
- const raw = this.strong();
21552
- const needles = (Array.isArray(raw) ? raw : raw ? [raw] : []).filter((n) => typeof n === "string" && n !== "").sort((a, b) => b.length - a.length);
21553
- if (!text || !needles.length) return [];
21554
- const out = [];
21555
- let i = 0, plain = "";
21556
- while (i < text.length) {
21557
- const hit = needles.find((n) => text.startsWith(n, i));
21558
- if (hit) {
21559
- if (plain) {
21560
- out.push({
21561
- text: plain,
21562
- strong: false
21563
- });
21564
- plain = "";
21565
- }
21566
- out.push({
21567
- text: hit,
21568
- strong: true
21569
- });
21570
- i += hit.length;
21571
- } else {
21572
- plain += text[i];
21573
- i++;
21574
- }
21575
- }
21576
- if (plain) out.push({
21577
- text: plain,
21578
- strong: false
21579
- });
21580
- return out.some((s) => s.strong) ? out : [];
21581
- }, ...ngDevMode ? [{ debugName: "segments" }] : /* istanbul ignore next */ []);
21582
- this.weight = input("normal", ...ngDevMode ? [{ debugName: "weight" }] : /* istanbul ignore next */ []);
21583
- this.fontWeight = computed(() => WEIGHT[this.weight()] ?? null, ...ngDevMode ? [{ debugName: "fontWeight" }] : /* istanbul ignore next */ []);
21584
- this.fontSize = computed(() => SIZE_REM[this.size()] ?? SIZE_REM.md, ...ngDevMode ? [{ debugName: "fontSize" }] : /* istanbul ignore next */ []);
21748
+ this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
21749
+ this.divider = input(false, ...ngDevMode ? [{ debugName: "divider" }] : /* istanbul ignore next */ []);
21585
21750
  }
21586
21751
  static {
21587
21752
  this.ɵfac = i0.ɵɵngDeclareFactory({
21588
21753
  minVersion: "12.0.0",
21589
21754
  version: "22.2.2",
21590
21755
  ngImport: i0,
21591
- type: TextComponent,
21756
+ type: FormSectionComponent,
21592
21757
  deps: [],
21593
21758
  target: i0.ɵɵFactoryTarget.Component
21594
21759
  });
@@ -21597,57 +21762,33 @@ var TextComponent = class TextComponent {
21597
21762
  this.ɵcmp = i0.ɵɵngDeclareComponent({
21598
21763
  minVersion: "17.0.0",
21599
21764
  version: "22.2.2",
21600
- type: TextComponent,
21765
+ type: FormSectionComponent,
21601
21766
  isStandalone: true,
21602
- selector: "ui-text",
21767
+ selector: "ui-form-section",
21603
21768
  inputs: {
21604
- text: {
21605
- classPropertyName: "text",
21606
- publicName: "text",
21607
- isSignal: true,
21608
- isRequired: false,
21609
- transformFunction: null
21610
- },
21611
- size: {
21612
- classPropertyName: "size",
21613
- publicName: "size",
21614
- isSignal: true,
21615
- isRequired: false,
21616
- transformFunction: null
21617
- },
21618
- tone: {
21619
- classPropertyName: "tone",
21620
- publicName: "tone",
21621
- isSignal: true,
21622
- isRequired: false,
21623
- transformFunction: null
21624
- },
21625
- color: {
21626
- classPropertyName: "color",
21627
- publicName: "color",
21628
- isSignal: true,
21629
- isRequired: false,
21630
- transformFunction: null
21631
- },
21632
- strong: {
21633
- classPropertyName: "strong",
21634
- publicName: "strong",
21769
+ label: {
21770
+ classPropertyName: "label",
21771
+ publicName: "label",
21635
21772
  isSignal: true,
21636
21773
  isRequired: false,
21637
21774
  transformFunction: null
21638
21775
  },
21639
- weight: {
21640
- classPropertyName: "weight",
21641
- publicName: "weight",
21776
+ divider: {
21777
+ classPropertyName: "divider",
21778
+ publicName: "divider",
21642
21779
  isSignal: true,
21643
21780
  isRequired: false,
21644
21781
  transformFunction: null
21645
21782
  }
21646
21783
  },
21647
21784
  ngImport: i0,
21648
- template: `<div class="tx" [class.tx-muted]="tone() === 'muted'" [class.tx-accent]="tone() === 'accent'" [style.color]="color() || null" [style.font-size]="fontSize()" [style.font-weight]="fontWeight()">{{ segments().length ? '' : text() }}@for (s of segments(); track $index) {@if (s.strong) {<strong>{{ s.text }}</strong>} @else {<ng-container>{{ s.text }}</ng-container>}}</div>`,
21785
+ template: `
21786
+ @if (divider()) { <div class="fs-divider"></div> }
21787
+ @if (label()) { <p class="fs-label">{{ label() }}</p> }
21788
+ <div class="fs-fields"><ng-content /></div>
21789
+ `,
21649
21790
  isInline: true,
21650
- styles: [":host{display:block;min-width:0}.tx{margin:0;line-height:1.5;color:#1f2937;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;-webkit-user-select:text;user-select:text}.tx-muted{color:#64748b}.tx-accent{color:var(--ui-accent, #2563eb)}.tx strong{font-weight:700}\n"],
21791
+ styles: [":host{display:block}.fs-divider{height:1px;background:#f1f5f9;margin:8px -24px 16px}.fs-label{font-size:.6875rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:#64748b;margin:0 0 12px}.fs-fields{display:flex;flex-direction:column;gap:14px}\n"],
21651
21792
  changeDetection: i0.ChangeDetectionStrategy.OnPush
21652
21793
  });
21653
21794
  }
@@ -21656,266 +21797,951 @@ i0.ɵɵngDeclareClassMetadata({
21656
21797
  minVersion: "12.0.0",
21657
21798
  version: "22.2.2",
21658
21799
  ngImport: i0,
21659
- type: TextComponent,
21800
+ type: FormSectionComponent,
21660
21801
  decorators: [{
21661
21802
  type: Component,
21662
21803
  args: [{
21663
- selector: "ui-text",
21804
+ selector: "ui-form-section",
21664
21805
  standalone: true,
21665
21806
  changeDetection: ChangeDetectionStrategy.OnPush,
21666
- template: `<div class="tx" [class.tx-muted]="tone() === 'muted'" [class.tx-accent]="tone() === 'accent'" [style.color]="color() || null" [style.font-size]="fontSize()" [style.font-weight]="fontWeight()">{{ segments().length ? '' : text() }}@for (s of segments(); track $index) {@if (s.strong) {<strong>{{ s.text }}</strong>} @else {<ng-container>{{ s.text }}</ng-container>}}</div>`,
21667
- styles: [":host{display:block;min-width:0}.tx{margin:0;line-height:1.5;color:#1f2937;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;-webkit-user-select:text;user-select:text}.tx-muted{color:#64748b}.tx-accent{color:var(--ui-accent, #2563eb)}.tx strong{font-weight:700}\n"]
21807
+ template: `
21808
+ @if (divider()) { <div class="fs-divider"></div> }
21809
+ @if (label()) { <p class="fs-label">{{ label() }}</p> }
21810
+ <div class="fs-fields"><ng-content /></div>
21811
+ `,
21812
+ styles: [":host{display:block}.fs-divider{height:1px;background:#f1f5f9;margin:8px -24px 16px}.fs-label{font-size:.6875rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:#64748b;margin:0 0 12px}.fs-fields{display:flex;flex-direction:column;gap:14px}\n"]
21668
21813
  }]
21669
21814
  }],
21670
21815
  propDecorators: {
21671
- text: [{
21672
- type: i0.Input,
21673
- args: [{
21674
- isSignal: true,
21675
- alias: "text",
21676
- required: false
21677
- }]
21678
- }],
21679
- size: [{
21680
- type: i0.Input,
21681
- args: [{
21682
- isSignal: true,
21683
- alias: "size",
21684
- required: false
21685
- }]
21686
- }],
21687
- tone: [{
21688
- type: i0.Input,
21689
- args: [{
21690
- isSignal: true,
21691
- alias: "tone",
21692
- required: false
21693
- }]
21694
- }],
21695
- color: [{
21696
- type: i0.Input,
21697
- args: [{
21698
- isSignal: true,
21699
- alias: "color",
21700
- required: false
21701
- }]
21702
- }],
21703
- strong: [{
21816
+ label: [{
21704
21817
  type: i0.Input,
21705
21818
  args: [{
21706
21819
  isSignal: true,
21707
- alias: "strong",
21820
+ alias: "label",
21708
21821
  required: false
21709
21822
  }]
21710
21823
  }],
21711
- weight: [{
21824
+ divider: [{
21712
21825
  type: i0.Input,
21713
21826
  args: [{
21714
21827
  isSignal: true,
21715
- alias: "weight",
21828
+ alias: "divider",
21716
21829
  required: false
21717
21830
  }]
21718
21831
  }]
21719
21832
  }
21720
21833
  });
21721
- var ImagePreviewComponent = class ImagePreviewComponent {
21834
+ const DEFAULT_BANK_MANDATE_TEXT = "By checking this box, I authorize the above business to initiate ACH debit entries to my bank account for agreed-upon payments. I understand I may revoke this authorization at any time by contacting the business.";
21835
+ const DEFAULT_BANK_ACCOUNT_TYPE_OPTIONS = [{
21836
+ value: "checking",
21837
+ label: "Checking"
21838
+ }, {
21839
+ value: "savings",
21840
+ label: "Savings"
21841
+ }];
21842
+ const DEFAULT_BANK_HOLDER_TYPE_OPTIONS = [{
21843
+ value: "individual",
21844
+ label: "Individual"
21845
+ }, {
21846
+ value: "company",
21847
+ label: "Business"
21848
+ }];
21849
+ const digitsOnly$1 = (max) => (raw) => raw.replace(/\D/g, "").slice(0, max);
21850
+ var BankAccountFormComponent = class BankAccountFormComponent {
21722
21851
  constructor() {
21723
- this.src = input(null, ...ngDevMode ? [{ debugName: "src" }] : /* istanbul ignore next */ []);
21724
- this.alt = input("", ...ngDevMode ? [{ debugName: "alt" }] : /* istanbul ignore next */ []);
21725
- this.shape = input("rounded", ...ngDevMode ? [{ debugName: "shape" }] : /* istanbul ignore next */ []);
21726
- this.size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
21727
- this.placeholder = input("image", ...ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []);
21728
- this.loading = input("lazy", ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
21729
- this.positionX = input(50, ...ngDevMode ? [{ debugName: "positionX" }] : /* istanbul ignore next */ []);
21730
- this.positionY = input(50, ...ngDevMode ? [{ debugName: "positionY" }] : /* istanbul ignore next */ []);
21731
- this.retryKey = input(null, ...ngDevMode ? [{ debugName: "retryKey" }] : /* istanbul ignore next */ []);
21732
- this._failed = signal(false, ...ngDevMode ? [{ debugName: "_failed" }] : /* istanbul ignore next */ []);
21733
- this._url = computed(() => this.src()?.trim() || null, ...ngDevMode ? [{ debugName: "_url" }] : /* istanbul ignore next */ []);
21734
- this._objectPosition = computed(() => `${this.positionX() ?? 50}% ${this.positionY() ?? 50}%`, ...ngDevMode ? [{ debugName: "_objectPosition" }] : /* istanbul ignore next */ []);
21735
- this._cls = computed(() => `ip-${this.shape()}-${this.size()}`, ...ngDevMode ? [{ debugName: "_cls" }] : /* istanbul ignore next */ []);
21852
+ this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
21853
+ this.disabled = input(false, ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
21854
+ this.busy = input(false, ...ngDevMode ? [{ debugName: "busy" }] : /* istanbul ignore next */ []);
21855
+ this.mandateText = input(DEFAULT_BANK_MANDATE_TEXT, ...ngDevMode ? [{ debugName: "mandateText" }] : /* istanbul ignore next */ []);
21856
+ this.accountTypeOptions = input(DEFAULT_BANK_ACCOUNT_TYPE_OPTIONS, ...ngDevMode ? [{ debugName: "accountTypeOptions" }] : /* istanbul ignore next */ []);
21857
+ this.holderTypeOptions = input(DEFAULT_BANK_HOLDER_TYPE_OPTIONS, ...ngDevMode ? [{ debugName: "holderTypeOptions" }] : /* istanbul ignore next */ []);
21858
+ this.accountHolderNameDefault = input("", ...ngDevMode ? [{ debugName: "accountHolderNameDefault" }] : /* istanbul ignore next */ []);
21859
+ this.testIdPrefix = input("bank", ...ngDevMode ? [{ debugName: "testIdPrefix" }] : /* istanbul ignore next */ []);
21860
+ this.submitted = output();
21861
+ this.validChange = output();
21862
+ this.routingNumber = signal("", ...ngDevMode ? [{ debugName: "routingNumber" }] : /* istanbul ignore next */ []);
21863
+ this.accountNumber = signal("", ...ngDevMode ? [{ debugName: "accountNumber" }] : /* istanbul ignore next */ []);
21864
+ this.confirmAccount = signal("", ...ngDevMode ? [{ debugName: "confirmAccount" }] : /* istanbul ignore next */ []);
21865
+ this.accountHolderName = signal("", ...ngDevMode ? [{ debugName: "accountHolderName" }] : /* istanbul ignore next */ []);
21866
+ this.accountType = signal("checking", ...ngDevMode ? [{ debugName: "accountType" }] : /* istanbul ignore next */ []);
21867
+ this.holderType = signal("individual", ...ngDevMode ? [{ debugName: "holderType" }] : /* istanbul ignore next */ []);
21868
+ this.mandateAccepted = signal(false, ...ngDevMode ? [{ debugName: "mandateAccepted" }] : /* istanbul ignore next */ []);
21869
+ this._touched = signal(false, ...ngDevMode ? [{ debugName: "_touched" }] : /* istanbul ignore next */ []);
21870
+ this.routingFormatter = digitsOnly$1(9);
21871
+ this.accountFormatter = digitsOnly$1(17);
21872
+ this.locked = computed(() => this.disabled() || this.busy(), ...ngDevMode ? [{ debugName: "locked" }] : /* istanbul ignore next */ []);
21873
+ this.reveal = computed(() => this.showErrors() || this._touched(), ...ngDevMode ? [{ debugName: "reveal" }] : /* istanbul ignore next */ []);
21874
+ this.routingError = computed(() => {
21875
+ const v = this.routingNumber().trim();
21876
+ return v && v.length !== 9 ? "Routing number must be 9 digits." : "";
21877
+ }, ...ngDevMode ? [{ debugName: "routingError" }] : /* istanbul ignore next */ []);
21878
+ this.accountError = computed(() => {
21879
+ const v = this.accountNumber().trim();
21880
+ return v && v.length < 4 ? "Account number must be at least 4 digits." : "";
21881
+ }, ...ngDevMode ? [{ debugName: "accountError" }] : /* istanbul ignore next */ []);
21882
+ this.confirmError = computed(() => {
21883
+ const v = this.confirmAccount().trim();
21884
+ return v && v !== this.accountNumber().trim() ? "Account numbers do not match." : "";
21885
+ }, ...ngDevMode ? [{ debugName: "confirmError" }] : /* istanbul ignore next */ []);
21886
+ this.errorMessage = computed(() => {
21887
+ if (!this.accountHolderName().trim()) return "Account holder name is required.";
21888
+ if (!this.routingNumber().trim()) return "Routing number is required.";
21889
+ if (this.routingError()) return this.routingError();
21890
+ if (!this.accountNumber().trim()) return "Account number is required.";
21891
+ if (this.accountError()) return this.accountError();
21892
+ if (!this.confirmAccount().trim()) return "Confirm account number is required.";
21893
+ if (this.confirmError()) return this.confirmError();
21894
+ if (!this.accountTypeOptions().some((o) => String(o.value) === this.accountType())) return "Select a valid account type.";
21895
+ if (!this.holderTypeOptions().some((o) => String(o.value) === this.holderType())) return "Select a valid holder type.";
21896
+ if (!this.mandateAccepted()) return "You must authorize ACH debits to continue.";
21897
+ return "";
21898
+ }, ...ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []);
21899
+ this.invalid = computed(() => this.errorMessage() !== "", ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
21900
+ this.valid = computed(() => !this.invalid(), ...ngDevMode ? [{ debugName: "valid" }] : /* istanbul ignore next */ []);
21901
+ this._fields = viewChildren(UiFieldValidity, ...ngDevMode ? [{ debugName: "_fields" }] : /* istanbul ignore next */ []);
21736
21902
  effect(() => {
21737
- this.src();
21738
- this.retryKey();
21739
- untracked(() => this._failed.set(false));
21903
+ const d = this.accountHolderNameDefault();
21904
+ untracked(() => this.accountHolderName.set(d));
21905
+ });
21906
+ effect(() => {
21907
+ const v = this.valid();
21908
+ untracked(() => this.validChange.emit(v));
21740
21909
  });
21741
21910
  }
21742
- retry() {
21743
- this._failed.set(false);
21911
+ id(name) {
21912
+ return `${this.testIdPrefix()}-${name}`;
21744
21913
  }
21745
- _onError() {
21746
- this._failed.set(true);
21914
+ onEnter(event) {
21915
+ const t = event.target;
21916
+ if (t instanceof HTMLInputElement && t.type === "text") {
21917
+ event.preventDefault();
21918
+ this.submit();
21919
+ }
21920
+ }
21921
+ submit() {
21922
+ if (this.locked()) return;
21923
+ if (this.invalid() || this._fields().some((f) => f.invalid())) {
21924
+ this._touched.set(true);
21925
+ return;
21926
+ }
21927
+ this.submitted.emit({
21928
+ routingNumber: this.routingNumber().trim(),
21929
+ accountNumber: this.accountNumber().trim(),
21930
+ accountType: this.accountType(),
21931
+ accountHolderName: this.accountHolderName().trim(),
21932
+ holderType: this.holderType(),
21933
+ mandateAccepted: true
21934
+ });
21935
+ }
21936
+ reset() {
21937
+ this.routingNumber.set("");
21938
+ this.accountNumber.set("");
21939
+ this.confirmAccount.set("");
21940
+ this.accountHolderName.set(this.accountHolderNameDefault());
21941
+ this.accountType.set("checking");
21942
+ this.holderType.set("individual");
21943
+ this.mandateAccepted.set(false);
21944
+ this._touched.set(false);
21747
21945
  }
21748
21946
  static {
21749
21947
  this.ɵfac = i0.ɵɵngDeclareFactory({
21750
21948
  minVersion: "12.0.0",
21751
21949
  version: "22.2.2",
21752
21950
  ngImport: i0,
21753
- type: ImagePreviewComponent,
21951
+ type: BankAccountFormComponent,
21754
21952
  deps: [],
21755
21953
  target: i0.ɵɵFactoryTarget.Component
21756
21954
  });
21757
21955
  }
21758
21956
  static {
21759
21957
  this.ɵcmp = i0.ɵɵngDeclareComponent({
21760
- minVersion: "17.0.0",
21958
+ minVersion: "17.2.0",
21761
21959
  version: "22.2.2",
21762
- type: ImagePreviewComponent,
21960
+ type: BankAccountFormComponent,
21763
21961
  isStandalone: true,
21764
- selector: "ui-image-preview",
21962
+ selector: "ui-bank-account-form",
21765
21963
  inputs: {
21766
- src: {
21767
- classPropertyName: "src",
21768
- publicName: "src",
21769
- isSignal: true,
21770
- isRequired: false,
21771
- transformFunction: null
21772
- },
21773
- alt: {
21774
- classPropertyName: "alt",
21775
- publicName: "alt",
21964
+ showErrors: {
21965
+ classPropertyName: "showErrors",
21966
+ publicName: "showErrors",
21776
21967
  isSignal: true,
21777
21968
  isRequired: false,
21778
21969
  transformFunction: null
21779
21970
  },
21780
- shape: {
21781
- classPropertyName: "shape",
21782
- publicName: "shape",
21971
+ disabled: {
21972
+ classPropertyName: "disabled",
21973
+ publicName: "disabled",
21783
21974
  isSignal: true,
21784
21975
  isRequired: false,
21785
21976
  transformFunction: null
21786
21977
  },
21787
- size: {
21788
- classPropertyName: "size",
21789
- publicName: "size",
21978
+ busy: {
21979
+ classPropertyName: "busy",
21980
+ publicName: "busy",
21790
21981
  isSignal: true,
21791
21982
  isRequired: false,
21792
21983
  transformFunction: null
21793
21984
  },
21794
- placeholder: {
21795
- classPropertyName: "placeholder",
21796
- publicName: "placeholder",
21985
+ mandateText: {
21986
+ classPropertyName: "mandateText",
21987
+ publicName: "mandateText",
21797
21988
  isSignal: true,
21798
21989
  isRequired: false,
21799
21990
  transformFunction: null
21800
21991
  },
21801
- loading: {
21802
- classPropertyName: "loading",
21803
- publicName: "loading",
21992
+ accountTypeOptions: {
21993
+ classPropertyName: "accountTypeOptions",
21994
+ publicName: "accountTypeOptions",
21804
21995
  isSignal: true,
21805
21996
  isRequired: false,
21806
21997
  transformFunction: null
21807
21998
  },
21808
- positionX: {
21809
- classPropertyName: "positionX",
21810
- publicName: "positionX",
21999
+ holderTypeOptions: {
22000
+ classPropertyName: "holderTypeOptions",
22001
+ publicName: "holderTypeOptions",
21811
22002
  isSignal: true,
21812
22003
  isRequired: false,
21813
22004
  transformFunction: null
21814
22005
  },
21815
- positionY: {
21816
- classPropertyName: "positionY",
21817
- publicName: "positionY",
22006
+ accountHolderNameDefault: {
22007
+ classPropertyName: "accountHolderNameDefault",
22008
+ publicName: "accountHolderNameDefault",
21818
22009
  isSignal: true,
21819
22010
  isRequired: false,
21820
22011
  transformFunction: null
21821
22012
  },
21822
- retryKey: {
21823
- classPropertyName: "retryKey",
21824
- publicName: "retryKey",
22013
+ testIdPrefix: {
22014
+ classPropertyName: "testIdPrefix",
22015
+ publicName: "testIdPrefix",
21825
22016
  isSignal: true,
21826
22017
  isRequired: false,
21827
22018
  transformFunction: null
21828
22019
  }
21829
22020
  },
22021
+ outputs: {
22022
+ submitted: "submitted",
22023
+ validChange: "validChange"
22024
+ },
22025
+ host: { properties: { "attr.aria-busy": "busy() ? \"true\" : null" } },
22026
+ providers: [{
22027
+ provide: UiFieldValidity,
22028
+ useExisting: forwardRef(() => BankAccountFormComponent)
22029
+ }],
22030
+ viewQueries: [{
22031
+ propertyName: "_fields",
22032
+ predicate: UiFieldValidity,
22033
+ descendants: true,
22034
+ isSignal: true
22035
+ }],
21830
22036
  ngImport: i0,
21831
22037
  template: `
21832
- @if (_url() && !_failed()) {
21833
- <img class="ip-img" [class]="_cls()" [src]="_url()" [attr.alt]="alt()" [attr.loading]="loading()" [style.object-position]="_objectPosition()" decoding="async" (error)="_onError()" />
21834
- } @else {
21835
- <span class="ip-img ip-ph" [class]="_cls()" aria-hidden="true">
21836
- @if (placeholder() === 'person') {
21837
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4 3.6-7 8-7s8 3 8 7"/></svg>
21838
- } @else {
21839
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="9" cy="10" r="1.8"/><path d="M21 16l-5-5-8 9"/></svg>
21840
- }
21841
- </span>
21842
- }
22038
+ <form novalidate (submit)="$event.preventDefault(); submit()" (keydown.enter)="onEnter($event)">
22039
+ <ui-form-section>
22040
+ <ui-text-input label="Account holder name" [inputTestId]="id('holder-name')" autocomplete="name" [required]="true" [maxlength]="100"
22041
+ [showErrors]="reveal()" [disabled]="locked()" [ngModel]="accountHolderName()" (ngModelChange)="accountHolderName.set($event ?? '')" [ngModelOptions]="{ standalone: true }" />
22042
+ <ui-text-input label="Routing number" [inputTestId]="id('routing')" inputmode="numeric" placeholder="9-digit routing number" [required]="true"
22043
+ [maxlength]="9" [formatter]="routingFormatter" [error]="routingError()" [showErrors]="reveal()" [disabled]="locked()"
22044
+ [ngModel]="routingNumber()" (ngModelChange)="routingNumber.set($event ?? '')" [ngModelOptions]="{ standalone: true }" />
22045
+ <ui-text-input label="Account number" [inputTestId]="id('account')" inputmode="numeric" placeholder="Account number" [required]="true"
22046
+ [maxlength]="17" [formatter]="accountFormatter" [error]="accountError()" [showErrors]="reveal()" [disabled]="locked()"
22047
+ [ngModel]="accountNumber()" (ngModelChange)="accountNumber.set($event ?? '')" [ngModelOptions]="{ standalone: true }" />
22048
+ <ui-text-input label="Confirm account number" [inputTestId]="id('confirm')" inputmode="numeric" placeholder="Re-enter account number" [required]="true"
22049
+ [maxlength]="17" [formatter]="accountFormatter" [error]="confirmError()" [showErrors]="reveal()" [disabled]="locked()"
22050
+ [ngModel]="confirmAccount()" (ngModelChange)="confirmAccount.set($event ?? '')" [ngModelOptions]="{ standalone: true }" />
22051
+ <ui-form-row>
22052
+ <ui-select label="Account type" [attr.data-testid]="id('account-type')" [options]="accountTypeOptions()" [required]="true" [showErrors]="reveal()"
22053
+ [disabled]="locked()" [ngModel]="accountType()" (ngModelChange)="accountType.set($event)" [ngModelOptions]="{ standalone: true }" />
22054
+ <ui-select label="Holder type" [attr.data-testid]="id('holder-type')" [options]="holderTypeOptions()" [required]="true" [showErrors]="reveal()"
22055
+ [disabled]="locked()" [ngModel]="holderType()" (ngModelChange)="holderType.set($event)" [ngModelOptions]="{ standalone: true }" />
22056
+ </ui-form-row>
22057
+ <ui-checkbox [testId]="id('mandate')" [label]="mandateText()" [required]="true" requiredMessage="You must authorize ACH debits to continue."
22058
+ [showErrors]="reveal()" [disabled]="locked()" [ngModel]="mandateAccepted()" (ngModelChange)="mandateAccepted.set(!!$event)" [ngModelOptions]="{ standalone: true }" />
22059
+ </ui-form-section>
22060
+ </form>
21843
22061
  `,
21844
22062
  isInline: true,
21845
- styles: [":host{display:inline-block;line-height:0;flex-shrink:0}.ip-img{display:block;object-fit:cover;border:1px solid #e2e8f0;background:#f1f5f9;box-sizing:border-box;flex-shrink:0}.ip-ph{display:inline-flex;align-items:center;justify-content:center;color:#94a3b8}.ip-ph svg{width:55%;height:55%}.ip-circle-sm{width:28px;height:28px;border-radius:50%}.ip-circle-md{width:40px;height:40px;border-radius:50%}.ip-circle-lg{width:80px;height:80px;border-radius:50%}.ip-rounded-sm{width:36px;height:24px;border-radius:5px}.ip-rounded-md{width:48px;height:32px;border-radius:6px}.ip-rounded-lg{width:112px;height:64px;border-radius:8px}\n"],
21846
- changeDetection: i0.ChangeDetectionStrategy.OnPush
21847
- });
21848
- }
21849
- };
21850
- i0.ɵɵngDeclareClassMetadata({
21851
- minVersion: "12.0.0",
21852
- version: "22.2.2",
21853
- ngImport: i0,
21854
- type: ImagePreviewComponent,
21855
- decorators: [{
21856
- type: Component,
21857
- args: [{
21858
- selector: "ui-image-preview",
21859
- standalone: true,
21860
- changeDetection: ChangeDetectionStrategy.OnPush,
21861
- template: `
21862
- @if (_url() && !_failed()) {
21863
- <img class="ip-img" [class]="_cls()" [src]="_url()" [attr.alt]="alt()" [attr.loading]="loading()" [style.object-position]="_objectPosition()" decoding="async" (error)="_onError()" />
21864
- } @else {
21865
- <span class="ip-img ip-ph" [class]="_cls()" aria-hidden="true">
21866
- @if (placeholder() === 'person') {
21867
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4 3.6-7 8-7s8 3 8 7"/></svg>
21868
- } @else {
21869
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="9" cy="10" r="1.8"/><path d="M21 16l-5-5-8 9"/></svg>
21870
- }
21871
- </span>
21872
- }
21873
- `,
21874
- styles: [":host{display:inline-block;line-height:0;flex-shrink:0}.ip-img{display:block;object-fit:cover;border:1px solid #e2e8f0;background:#f1f5f9;box-sizing:border-box;flex-shrink:0}.ip-ph{display:inline-flex;align-items:center;justify-content:center;color:#94a3b8}.ip-ph svg{width:55%;height:55%}.ip-circle-sm{width:28px;height:28px;border-radius:50%}.ip-circle-md{width:40px;height:40px;border-radius:50%}.ip-circle-lg{width:80px;height:80px;border-radius:50%}.ip-rounded-sm{width:36px;height:24px;border-radius:5px}.ip-rounded-md{width:48px;height:32px;border-radius:6px}.ip-rounded-lg{width:112px;height:64px;border-radius:8px}\n"]
21875
- }]
21876
- }],
21877
- ctorParameters: () => [],
21878
- propDecorators: {
21879
- src: [{
21880
- type: i0.Input,
21881
- args: [{
21882
- isSignal: true,
21883
- alias: "src",
21884
- required: false
21885
- }]
21886
- }],
21887
- alt: [{
21888
- type: i0.Input,
21889
- args: [{
21890
- isSignal: true,
21891
- alias: "alt",
21892
- required: false
21893
- }]
21894
- }],
21895
- shape: [{
21896
- type: i0.Input,
21897
- args: [{
21898
- isSignal: true,
21899
- alias: "shape",
21900
- required: false
21901
- }]
21902
- }],
21903
- size: [{
21904
- type: i0.Input,
21905
- args: [{
21906
- isSignal: true,
21907
- alias: "size",
21908
- required: false
21909
- }]
21910
- }],
21911
- placeholder: [{
21912
- type: i0.Input,
21913
- args: [{
21914
- isSignal: true,
21915
- alias: "placeholder",
21916
- required: false
21917
- }]
21918
- }],
22063
+ styles: [":host{display:block}\n"],
22064
+ dependencies: [
22065
+ {
22066
+ kind: "ngmodule",
22067
+ type: FormsModule
22068
+ },
22069
+ {
22070
+ kind: "directive",
22071
+ type: i1.ɵNgNoValidate,
22072
+ selector: "form:not([ngNoForm]):not([ngNativeValidate])"
22073
+ },
22074
+ {
22075
+ kind: "directive",
22076
+ type: i1.NgControlStatus,
22077
+ selector: "[formControlName],[ngModel],[formControl]"
22078
+ },
22079
+ {
22080
+ kind: "directive",
22081
+ type: i1.NgControlStatusGroup,
22082
+ selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]"
22083
+ },
22084
+ {
22085
+ kind: "directive",
22086
+ type: i1.RequiredValidator,
22087
+ selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",
22088
+ inputs: ["required"]
22089
+ },
22090
+ {
22091
+ kind: "directive",
22092
+ type: i1.MaxLengthValidator,
22093
+ selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]",
22094
+ inputs: ["maxlength"]
22095
+ },
22096
+ {
22097
+ kind: "directive",
22098
+ type: i1.NgModel,
22099
+ selector: "[ngModel]:not([formControlName]):not([formControl])",
22100
+ inputs: [
22101
+ "name",
22102
+ "disabled",
22103
+ "ngModel",
22104
+ "ngModelOptions"
22105
+ ],
22106
+ outputs: ["ngModelChange"],
22107
+ exportAs: ["ngModel"]
22108
+ },
22109
+ {
22110
+ kind: "directive",
22111
+ type: i1.NgForm,
22112
+ selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]",
22113
+ inputs: ["ngFormOptions"],
22114
+ outputs: ["ngSubmit"],
22115
+ exportAs: ["ngForm"]
22116
+ },
22117
+ {
22118
+ kind: "component",
22119
+ type: CheckboxComponent,
22120
+ selector: "ui-checkbox, ui-checkbox-group",
22121
+ inputs: [
22122
+ "label",
22123
+ "ariaLabel",
22124
+ "testId",
22125
+ "labelTestId",
22126
+ "headingLevel",
22127
+ "indeterminate",
22128
+ "checked",
22129
+ "options",
22130
+ "legend",
22131
+ "orientation",
22132
+ "values",
22133
+ "description",
22134
+ "indent",
22135
+ "required",
22136
+ "requiredMessage",
22137
+ "hint",
22138
+ "error",
22139
+ "showErrors",
22140
+ "disabled"
22141
+ ],
22142
+ outputs: [
22143
+ "checkedChange",
22144
+ "valuesChange",
22145
+ "invalidChange"
22146
+ ]
22147
+ },
22148
+ {
22149
+ kind: "component",
22150
+ type: FormRowComponent,
22151
+ selector: "ui-form-row",
22152
+ inputs: ["cols"]
22153
+ },
22154
+ {
22155
+ kind: "component",
22156
+ type: FormSectionComponent,
22157
+ selector: "ui-form-section",
22158
+ inputs: ["label", "divider"]
22159
+ },
22160
+ {
22161
+ kind: "component",
22162
+ type: SelectComponent,
22163
+ selector: "ui-select",
22164
+ inputs: [
22165
+ "label",
22166
+ "ariaLabel",
22167
+ "placeholder",
22168
+ "options",
22169
+ "valueType",
22170
+ "required",
22171
+ "hint",
22172
+ "ariaDescribedBy",
22173
+ "error",
22174
+ "showErrors",
22175
+ "size",
22176
+ "disabled"
22177
+ ],
22178
+ outputs: ["invalidChange", "valueChange"]
22179
+ },
22180
+ {
22181
+ kind: "component",
22182
+ type: TextInputComponent,
22183
+ selector: "ui-text-input",
22184
+ inputs: [
22185
+ "label",
22186
+ "ariaLabel",
22187
+ "inputTestId",
22188
+ "placeholder",
22189
+ "prefix",
22190
+ "revealable",
22191
+ "passwordRequirements",
22192
+ "passwordRules",
22193
+ "type",
22194
+ "maxlength",
22195
+ "required",
22196
+ "autocomplete",
22197
+ "inputmode",
22198
+ "readonly",
22199
+ "hint",
22200
+ "ariaDescribedBy",
22201
+ "error",
22202
+ "phoneFormat",
22203
+ "min",
22204
+ "max",
22205
+ "maxDecimals",
22206
+ "step",
22207
+ "valueType",
22208
+ "formatter",
22209
+ "integer",
22210
+ "showErrors",
22211
+ "disabled"
22212
+ ],
22213
+ outputs: [
22214
+ "valueChange",
22215
+ "focused",
22216
+ "blurred",
22217
+ "invalidChange"
22218
+ ]
22219
+ }
22220
+ ],
22221
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
22222
+ });
22223
+ }
22224
+ };
22225
+ i0.ɵɵngDeclareClassMetadata({
22226
+ minVersion: "12.0.0",
22227
+ version: "22.2.2",
22228
+ ngImport: i0,
22229
+ type: BankAccountFormComponent,
22230
+ decorators: [{
22231
+ type: Component,
22232
+ args: [{
22233
+ selector: "ui-bank-account-form",
22234
+ standalone: true,
22235
+ changeDetection: ChangeDetectionStrategy.OnPush,
22236
+ imports: [
22237
+ FormsModule,
22238
+ CheckboxComponent,
22239
+ FormRowComponent,
22240
+ FormSectionComponent,
22241
+ SelectComponent,
22242
+ TextInputComponent
22243
+ ],
22244
+ providers: [{
22245
+ provide: UiFieldValidity,
22246
+ useExisting: forwardRef(() => BankAccountFormComponent)
22247
+ }],
22248
+ host: { "[attr.aria-busy]": "busy() ? \"true\" : null" },
22249
+ template: `
22250
+ <form novalidate (submit)="$event.preventDefault(); submit()" (keydown.enter)="onEnter($event)">
22251
+ <ui-form-section>
22252
+ <ui-text-input label="Account holder name" [inputTestId]="id('holder-name')" autocomplete="name" [required]="true" [maxlength]="100"
22253
+ [showErrors]="reveal()" [disabled]="locked()" [ngModel]="accountHolderName()" (ngModelChange)="accountHolderName.set($event ?? '')" [ngModelOptions]="{ standalone: true }" />
22254
+ <ui-text-input label="Routing number" [inputTestId]="id('routing')" inputmode="numeric" placeholder="9-digit routing number" [required]="true"
22255
+ [maxlength]="9" [formatter]="routingFormatter" [error]="routingError()" [showErrors]="reveal()" [disabled]="locked()"
22256
+ [ngModel]="routingNumber()" (ngModelChange)="routingNumber.set($event ?? '')" [ngModelOptions]="{ standalone: true }" />
22257
+ <ui-text-input label="Account number" [inputTestId]="id('account')" inputmode="numeric" placeholder="Account number" [required]="true"
22258
+ [maxlength]="17" [formatter]="accountFormatter" [error]="accountError()" [showErrors]="reveal()" [disabled]="locked()"
22259
+ [ngModel]="accountNumber()" (ngModelChange)="accountNumber.set($event ?? '')" [ngModelOptions]="{ standalone: true }" />
22260
+ <ui-text-input label="Confirm account number" [inputTestId]="id('confirm')" inputmode="numeric" placeholder="Re-enter account number" [required]="true"
22261
+ [maxlength]="17" [formatter]="accountFormatter" [error]="confirmError()" [showErrors]="reveal()" [disabled]="locked()"
22262
+ [ngModel]="confirmAccount()" (ngModelChange)="confirmAccount.set($event ?? '')" [ngModelOptions]="{ standalone: true }" />
22263
+ <ui-form-row>
22264
+ <ui-select label="Account type" [attr.data-testid]="id('account-type')" [options]="accountTypeOptions()" [required]="true" [showErrors]="reveal()"
22265
+ [disabled]="locked()" [ngModel]="accountType()" (ngModelChange)="accountType.set($event)" [ngModelOptions]="{ standalone: true }" />
22266
+ <ui-select label="Holder type" [attr.data-testid]="id('holder-type')" [options]="holderTypeOptions()" [required]="true" [showErrors]="reveal()"
22267
+ [disabled]="locked()" [ngModel]="holderType()" (ngModelChange)="holderType.set($event)" [ngModelOptions]="{ standalone: true }" />
22268
+ </ui-form-row>
22269
+ <ui-checkbox [testId]="id('mandate')" [label]="mandateText()" [required]="true" requiredMessage="You must authorize ACH debits to continue."
22270
+ [showErrors]="reveal()" [disabled]="locked()" [ngModel]="mandateAccepted()" (ngModelChange)="mandateAccepted.set(!!$event)" [ngModelOptions]="{ standalone: true }" />
22271
+ </ui-form-section>
22272
+ </form>
22273
+ `,
22274
+ styles: [":host{display:block}\n"]
22275
+ }]
22276
+ }],
22277
+ ctorParameters: () => [],
22278
+ propDecorators: {
22279
+ showErrors: [{
22280
+ type: i0.Input,
22281
+ args: [{
22282
+ isSignal: true,
22283
+ alias: "showErrors",
22284
+ required: false
22285
+ }]
22286
+ }],
22287
+ disabled: [{
22288
+ type: i0.Input,
22289
+ args: [{
22290
+ isSignal: true,
22291
+ alias: "disabled",
22292
+ required: false
22293
+ }]
22294
+ }],
22295
+ busy: [{
22296
+ type: i0.Input,
22297
+ args: [{
22298
+ isSignal: true,
22299
+ alias: "busy",
22300
+ required: false
22301
+ }]
22302
+ }],
22303
+ mandateText: [{
22304
+ type: i0.Input,
22305
+ args: [{
22306
+ isSignal: true,
22307
+ alias: "mandateText",
22308
+ required: false
22309
+ }]
22310
+ }],
22311
+ accountTypeOptions: [{
22312
+ type: i0.Input,
22313
+ args: [{
22314
+ isSignal: true,
22315
+ alias: "accountTypeOptions",
22316
+ required: false
22317
+ }]
22318
+ }],
22319
+ holderTypeOptions: [{
22320
+ type: i0.Input,
22321
+ args: [{
22322
+ isSignal: true,
22323
+ alias: "holderTypeOptions",
22324
+ required: false
22325
+ }]
22326
+ }],
22327
+ accountHolderNameDefault: [{
22328
+ type: i0.Input,
22329
+ args: [{
22330
+ isSignal: true,
22331
+ alias: "accountHolderNameDefault",
22332
+ required: false
22333
+ }]
22334
+ }],
22335
+ testIdPrefix: [{
22336
+ type: i0.Input,
22337
+ args: [{
22338
+ isSignal: true,
22339
+ alias: "testIdPrefix",
22340
+ required: false
22341
+ }]
22342
+ }],
22343
+ submitted: [{
22344
+ type: i0.Output,
22345
+ args: ["submitted"]
22346
+ }],
22347
+ validChange: [{
22348
+ type: i0.Output,
22349
+ args: ["validChange"]
22350
+ }],
22351
+ _fields: [{
22352
+ type: i0.ViewChildren,
22353
+ args: [i0.forwardRef(() => UiFieldValidity), { isSignal: true }]
22354
+ }]
22355
+ }
22356
+ });
22357
+ const SIZE_REM = {
22358
+ sm: "0.8125rem",
22359
+ md: "0.875rem",
22360
+ lg: "1rem"
22361
+ };
22362
+ const WEIGHT = {
22363
+ normal: null,
22364
+ medium: "500",
22365
+ semibold: "600",
22366
+ bold: "700"
22367
+ };
22368
+ var TextComponent = class TextComponent {
22369
+ constructor() {
22370
+ this.text = input("", ...ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []);
22371
+ this.size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
22372
+ this.tone = input("default", ...ngDevMode ? [{ debugName: "tone" }] : /* istanbul ignore next */ []);
22373
+ this.color = input("", ...ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []);
22374
+ this.strong = input(null, ...ngDevMode ? [{ debugName: "strong" }] : /* istanbul ignore next */ []);
22375
+ this.segments = computed(() => {
22376
+ const text = this.text() ?? "";
22377
+ const raw = this.strong();
22378
+ const needles = (Array.isArray(raw) ? raw : raw ? [raw] : []).filter((n) => typeof n === "string" && n !== "").sort((a, b) => b.length - a.length);
22379
+ if (!text || !needles.length) return [];
22380
+ const out = [];
22381
+ let i = 0, plain = "";
22382
+ while (i < text.length) {
22383
+ const hit = needles.find((n) => text.startsWith(n, i));
22384
+ if (hit) {
22385
+ if (plain) {
22386
+ out.push({
22387
+ text: plain,
22388
+ strong: false
22389
+ });
22390
+ plain = "";
22391
+ }
22392
+ out.push({
22393
+ text: hit,
22394
+ strong: true
22395
+ });
22396
+ i += hit.length;
22397
+ } else {
22398
+ plain += text[i];
22399
+ i++;
22400
+ }
22401
+ }
22402
+ if (plain) out.push({
22403
+ text: plain,
22404
+ strong: false
22405
+ });
22406
+ return out.some((s) => s.strong) ? out : [];
22407
+ }, ...ngDevMode ? [{ debugName: "segments" }] : /* istanbul ignore next */ []);
22408
+ this.weight = input("normal", ...ngDevMode ? [{ debugName: "weight" }] : /* istanbul ignore next */ []);
22409
+ this.fontWeight = computed(() => WEIGHT[this.weight()] ?? null, ...ngDevMode ? [{ debugName: "fontWeight" }] : /* istanbul ignore next */ []);
22410
+ this.fontSize = computed(() => SIZE_REM[this.size()] ?? SIZE_REM.md, ...ngDevMode ? [{ debugName: "fontSize" }] : /* istanbul ignore next */ []);
22411
+ }
22412
+ static {
22413
+ this.ɵfac = i0.ɵɵngDeclareFactory({
22414
+ minVersion: "12.0.0",
22415
+ version: "22.2.2",
22416
+ ngImport: i0,
22417
+ type: TextComponent,
22418
+ deps: [],
22419
+ target: i0.ɵɵFactoryTarget.Component
22420
+ });
22421
+ }
22422
+ static {
22423
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
22424
+ minVersion: "17.0.0",
22425
+ version: "22.2.2",
22426
+ type: TextComponent,
22427
+ isStandalone: true,
22428
+ selector: "ui-text",
22429
+ inputs: {
22430
+ text: {
22431
+ classPropertyName: "text",
22432
+ publicName: "text",
22433
+ isSignal: true,
22434
+ isRequired: false,
22435
+ transformFunction: null
22436
+ },
22437
+ size: {
22438
+ classPropertyName: "size",
22439
+ publicName: "size",
22440
+ isSignal: true,
22441
+ isRequired: false,
22442
+ transformFunction: null
22443
+ },
22444
+ tone: {
22445
+ classPropertyName: "tone",
22446
+ publicName: "tone",
22447
+ isSignal: true,
22448
+ isRequired: false,
22449
+ transformFunction: null
22450
+ },
22451
+ color: {
22452
+ classPropertyName: "color",
22453
+ publicName: "color",
22454
+ isSignal: true,
22455
+ isRequired: false,
22456
+ transformFunction: null
22457
+ },
22458
+ strong: {
22459
+ classPropertyName: "strong",
22460
+ publicName: "strong",
22461
+ isSignal: true,
22462
+ isRequired: false,
22463
+ transformFunction: null
22464
+ },
22465
+ weight: {
22466
+ classPropertyName: "weight",
22467
+ publicName: "weight",
22468
+ isSignal: true,
22469
+ isRequired: false,
22470
+ transformFunction: null
22471
+ }
22472
+ },
22473
+ ngImport: i0,
22474
+ template: `<div class="tx" [class.tx-muted]="tone() === 'muted'" [class.tx-accent]="tone() === 'accent'" [style.color]="color() || null" [style.font-size]="fontSize()" [style.font-weight]="fontWeight()">{{ segments().length ? '' : text() }}@for (s of segments(); track $index) {@if (s.strong) {<strong>{{ s.text }}</strong>} @else {<ng-container>{{ s.text }}</ng-container>}}</div>`,
22475
+ isInline: true,
22476
+ styles: [":host{display:block;min-width:0}.tx{margin:0;line-height:1.5;color:#1f2937;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;-webkit-user-select:text;user-select:text}.tx-muted{color:#64748b}.tx-accent{color:var(--ui-accent, #2563eb)}.tx strong{font-weight:700}\n"],
22477
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
22478
+ });
22479
+ }
22480
+ };
22481
+ i0.ɵɵngDeclareClassMetadata({
22482
+ minVersion: "12.0.0",
22483
+ version: "22.2.2",
22484
+ ngImport: i0,
22485
+ type: TextComponent,
22486
+ decorators: [{
22487
+ type: Component,
22488
+ args: [{
22489
+ selector: "ui-text",
22490
+ standalone: true,
22491
+ changeDetection: ChangeDetectionStrategy.OnPush,
22492
+ template: `<div class="tx" [class.tx-muted]="tone() === 'muted'" [class.tx-accent]="tone() === 'accent'" [style.color]="color() || null" [style.font-size]="fontSize()" [style.font-weight]="fontWeight()">{{ segments().length ? '' : text() }}@for (s of segments(); track $index) {@if (s.strong) {<strong>{{ s.text }}</strong>} @else {<ng-container>{{ s.text }}</ng-container>}}</div>`,
22493
+ styles: [":host{display:block;min-width:0}.tx{margin:0;line-height:1.5;color:#1f2937;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;-webkit-user-select:text;user-select:text}.tx-muted{color:#64748b}.tx-accent{color:var(--ui-accent, #2563eb)}.tx strong{font-weight:700}\n"]
22494
+ }]
22495
+ }],
22496
+ propDecorators: {
22497
+ text: [{
22498
+ type: i0.Input,
22499
+ args: [{
22500
+ isSignal: true,
22501
+ alias: "text",
22502
+ required: false
22503
+ }]
22504
+ }],
22505
+ size: [{
22506
+ type: i0.Input,
22507
+ args: [{
22508
+ isSignal: true,
22509
+ alias: "size",
22510
+ required: false
22511
+ }]
22512
+ }],
22513
+ tone: [{
22514
+ type: i0.Input,
22515
+ args: [{
22516
+ isSignal: true,
22517
+ alias: "tone",
22518
+ required: false
22519
+ }]
22520
+ }],
22521
+ color: [{
22522
+ type: i0.Input,
22523
+ args: [{
22524
+ isSignal: true,
22525
+ alias: "color",
22526
+ required: false
22527
+ }]
22528
+ }],
22529
+ strong: [{
22530
+ type: i0.Input,
22531
+ args: [{
22532
+ isSignal: true,
22533
+ alias: "strong",
22534
+ required: false
22535
+ }]
22536
+ }],
22537
+ weight: [{
22538
+ type: i0.Input,
22539
+ args: [{
22540
+ isSignal: true,
22541
+ alias: "weight",
22542
+ required: false
22543
+ }]
22544
+ }]
22545
+ }
22546
+ });
22547
+ var ImagePreviewComponent = class ImagePreviewComponent {
22548
+ constructor() {
22549
+ this.src = input(null, ...ngDevMode ? [{ debugName: "src" }] : /* istanbul ignore next */ []);
22550
+ this.alt = input("", ...ngDevMode ? [{ debugName: "alt" }] : /* istanbul ignore next */ []);
22551
+ this.shape = input("rounded", ...ngDevMode ? [{ debugName: "shape" }] : /* istanbul ignore next */ []);
22552
+ this.size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
22553
+ this.placeholder = input("image", ...ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []);
22554
+ this.loading = input("lazy", ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
22555
+ this.positionX = input(50, ...ngDevMode ? [{ debugName: "positionX" }] : /* istanbul ignore next */ []);
22556
+ this.positionY = input(50, ...ngDevMode ? [{ debugName: "positionY" }] : /* istanbul ignore next */ []);
22557
+ this.retryKey = input(null, ...ngDevMode ? [{ debugName: "retryKey" }] : /* istanbul ignore next */ []);
22558
+ this._failed = signal(false, ...ngDevMode ? [{ debugName: "_failed" }] : /* istanbul ignore next */ []);
22559
+ this._url = computed(() => this.src()?.trim() || null, ...ngDevMode ? [{ debugName: "_url" }] : /* istanbul ignore next */ []);
22560
+ this._objectPosition = computed(() => `${this.positionX() ?? 50}% ${this.positionY() ?? 50}%`, ...ngDevMode ? [{ debugName: "_objectPosition" }] : /* istanbul ignore next */ []);
22561
+ this._cls = computed(() => `ip-${this.shape()}-${this.size()}`, ...ngDevMode ? [{ debugName: "_cls" }] : /* istanbul ignore next */ []);
22562
+ effect(() => {
22563
+ this.src();
22564
+ this.retryKey();
22565
+ untracked(() => this._failed.set(false));
22566
+ });
22567
+ }
22568
+ retry() {
22569
+ this._failed.set(false);
22570
+ }
22571
+ _onError() {
22572
+ this._failed.set(true);
22573
+ }
22574
+ static {
22575
+ this.ɵfac = i0.ɵɵngDeclareFactory({
22576
+ minVersion: "12.0.0",
22577
+ version: "22.2.2",
22578
+ ngImport: i0,
22579
+ type: ImagePreviewComponent,
22580
+ deps: [],
22581
+ target: i0.ɵɵFactoryTarget.Component
22582
+ });
22583
+ }
22584
+ static {
22585
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
22586
+ minVersion: "17.0.0",
22587
+ version: "22.2.2",
22588
+ type: ImagePreviewComponent,
22589
+ isStandalone: true,
22590
+ selector: "ui-image-preview",
22591
+ inputs: {
22592
+ src: {
22593
+ classPropertyName: "src",
22594
+ publicName: "src",
22595
+ isSignal: true,
22596
+ isRequired: false,
22597
+ transformFunction: null
22598
+ },
22599
+ alt: {
22600
+ classPropertyName: "alt",
22601
+ publicName: "alt",
22602
+ isSignal: true,
22603
+ isRequired: false,
22604
+ transformFunction: null
22605
+ },
22606
+ shape: {
22607
+ classPropertyName: "shape",
22608
+ publicName: "shape",
22609
+ isSignal: true,
22610
+ isRequired: false,
22611
+ transformFunction: null
22612
+ },
22613
+ size: {
22614
+ classPropertyName: "size",
22615
+ publicName: "size",
22616
+ isSignal: true,
22617
+ isRequired: false,
22618
+ transformFunction: null
22619
+ },
22620
+ placeholder: {
22621
+ classPropertyName: "placeholder",
22622
+ publicName: "placeholder",
22623
+ isSignal: true,
22624
+ isRequired: false,
22625
+ transformFunction: null
22626
+ },
22627
+ loading: {
22628
+ classPropertyName: "loading",
22629
+ publicName: "loading",
22630
+ isSignal: true,
22631
+ isRequired: false,
22632
+ transformFunction: null
22633
+ },
22634
+ positionX: {
22635
+ classPropertyName: "positionX",
22636
+ publicName: "positionX",
22637
+ isSignal: true,
22638
+ isRequired: false,
22639
+ transformFunction: null
22640
+ },
22641
+ positionY: {
22642
+ classPropertyName: "positionY",
22643
+ publicName: "positionY",
22644
+ isSignal: true,
22645
+ isRequired: false,
22646
+ transformFunction: null
22647
+ },
22648
+ retryKey: {
22649
+ classPropertyName: "retryKey",
22650
+ publicName: "retryKey",
22651
+ isSignal: true,
22652
+ isRequired: false,
22653
+ transformFunction: null
22654
+ }
22655
+ },
22656
+ ngImport: i0,
22657
+ template: `
22658
+ @if (_url() && !_failed()) {
22659
+ <img class="ip-img" [class]="_cls()" [src]="_url()" [attr.alt]="alt()" [attr.loading]="loading()" [style.object-position]="_objectPosition()" decoding="async" (error)="_onError()" />
22660
+ } @else {
22661
+ <span class="ip-img ip-ph" [class]="_cls()" aria-hidden="true">
22662
+ @if (placeholder() === 'person') {
22663
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4 3.6-7 8-7s8 3 8 7"/></svg>
22664
+ } @else {
22665
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="9" cy="10" r="1.8"/><path d="M21 16l-5-5-8 9"/></svg>
22666
+ }
22667
+ </span>
22668
+ }
22669
+ `,
22670
+ isInline: true,
22671
+ styles: [":host{display:inline-block;line-height:0;flex-shrink:0}.ip-img{display:block;object-fit:cover;border:1px solid #e2e8f0;background:#f1f5f9;box-sizing:border-box;flex-shrink:0}.ip-ph{display:inline-flex;align-items:center;justify-content:center;color:#94a3b8}.ip-ph svg{width:55%;height:55%}.ip-circle-sm{width:28px;height:28px;border-radius:50%}.ip-circle-md{width:40px;height:40px;border-radius:50%}.ip-circle-lg{width:80px;height:80px;border-radius:50%}.ip-rounded-sm{width:36px;height:24px;border-radius:5px}.ip-rounded-md{width:48px;height:32px;border-radius:6px}.ip-rounded-lg{width:112px;height:64px;border-radius:8px}\n"],
22672
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
22673
+ });
22674
+ }
22675
+ };
22676
+ i0.ɵɵngDeclareClassMetadata({
22677
+ minVersion: "12.0.0",
22678
+ version: "22.2.2",
22679
+ ngImport: i0,
22680
+ type: ImagePreviewComponent,
22681
+ decorators: [{
22682
+ type: Component,
22683
+ args: [{
22684
+ selector: "ui-image-preview",
22685
+ standalone: true,
22686
+ changeDetection: ChangeDetectionStrategy.OnPush,
22687
+ template: `
22688
+ @if (_url() && !_failed()) {
22689
+ <img class="ip-img" [class]="_cls()" [src]="_url()" [attr.alt]="alt()" [attr.loading]="loading()" [style.object-position]="_objectPosition()" decoding="async" (error)="_onError()" />
22690
+ } @else {
22691
+ <span class="ip-img ip-ph" [class]="_cls()" aria-hidden="true">
22692
+ @if (placeholder() === 'person') {
22693
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8" r="4"/><path d="M4 21c0-4 3.6-7 8-7s8 3 8 7"/></svg>
22694
+ } @else {
22695
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="2"/><circle cx="9" cy="10" r="1.8"/><path d="M21 16l-5-5-8 9"/></svg>
22696
+ }
22697
+ </span>
22698
+ }
22699
+ `,
22700
+ styles: [":host{display:inline-block;line-height:0;flex-shrink:0}.ip-img{display:block;object-fit:cover;border:1px solid #e2e8f0;background:#f1f5f9;box-sizing:border-box;flex-shrink:0}.ip-ph{display:inline-flex;align-items:center;justify-content:center;color:#94a3b8}.ip-ph svg{width:55%;height:55%}.ip-circle-sm{width:28px;height:28px;border-radius:50%}.ip-circle-md{width:40px;height:40px;border-radius:50%}.ip-circle-lg{width:80px;height:80px;border-radius:50%}.ip-rounded-sm{width:36px;height:24px;border-radius:5px}.ip-rounded-md{width:48px;height:32px;border-radius:6px}.ip-rounded-lg{width:112px;height:64px;border-radius:8px}\n"]
22701
+ }]
22702
+ }],
22703
+ ctorParameters: () => [],
22704
+ propDecorators: {
22705
+ src: [{
22706
+ type: i0.Input,
22707
+ args: [{
22708
+ isSignal: true,
22709
+ alias: "src",
22710
+ required: false
22711
+ }]
22712
+ }],
22713
+ alt: [{
22714
+ type: i0.Input,
22715
+ args: [{
22716
+ isSignal: true,
22717
+ alias: "alt",
22718
+ required: false
22719
+ }]
22720
+ }],
22721
+ shape: [{
22722
+ type: i0.Input,
22723
+ args: [{
22724
+ isSignal: true,
22725
+ alias: "shape",
22726
+ required: false
22727
+ }]
22728
+ }],
22729
+ size: [{
22730
+ type: i0.Input,
22731
+ args: [{
22732
+ isSignal: true,
22733
+ alias: "size",
22734
+ required: false
22735
+ }]
22736
+ }],
22737
+ placeholder: [{
22738
+ type: i0.Input,
22739
+ args: [{
22740
+ isSignal: true,
22741
+ alias: "placeholder",
22742
+ required: false
22743
+ }]
22744
+ }],
21919
22745
  loading: [{
21920
22746
  type: i0.Input,
21921
22747
  args: [{
@@ -22851,6 +23677,7 @@ var DateInputComponent = class DateInputComponent {
22851
23677
  this.min = input("", ...ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []);
22852
23678
  this.max = input("", ...ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []);
22853
23679
  this.hint = input("", ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
23680
+ this.ariaDescribedBy = input("", ...ngDevMode ? [{ debugName: "ariaDescribedBy" }] : /* istanbul ignore next */ []);
22854
23681
  this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
22855
23682
  this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
22856
23683
  this._disabledInput = input(false, {
@@ -22860,6 +23687,7 @@ var DateInputComponent = class DateInputComponent {
22860
23687
  this._cvaDisabled = signal(false, ...ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []);
22861
23688
  this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
22862
23689
  this._value = signal("", ...ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []);
23690
+ this._describedBy = computed(() => mergeDescribedBy(this._activeError() || this.hint() ? this._inputId + "-desc" : null, this.ariaDescribedBy()), ...ngDevMode ? [{ debugName: "_describedBy" }] : /* istanbul ignore next */ []);
22863
23691
  this._reveal = createFieldReveal(this.showErrors);
22864
23692
  this._issue = computed(() => this._check(this._value()), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
22865
23693
  this.invalid = computed(() => !!this.error() || !!this._issue(), ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
@@ -22989,6 +23817,13 @@ var DateInputComponent = class DateInputComponent {
22989
23817
  isRequired: false,
22990
23818
  transformFunction: null
22991
23819
  },
23820
+ ariaDescribedBy: {
23821
+ classPropertyName: "ariaDescribedBy",
23822
+ publicName: "ariaDescribedBy",
23823
+ isSignal: true,
23824
+ isRequired: false,
23825
+ transformFunction: null
23826
+ },
22992
23827
  error: {
22993
23828
  classPropertyName: "error",
22994
23829
  publicName: "error",
@@ -23051,7 +23886,7 @@ var DateInputComponent = class DateInputComponent {
23051
23886
  [attr.max]="max() || null"
23052
23887
  [attr.required]="required() || null"
23053
23888
  [attr.aria-invalid]="_activeError() ? 'true' : null"
23054
- [attr.aria-describedby]="(_activeError() || hint()) ? _inputId + '-desc' : null"
23889
+ [attr.aria-describedby]="_describedBy()"
23055
23890
  (change)="onChange($event)"
23056
23891
  (blur)="onBlur()"
23057
23892
  />
@@ -23113,7 +23948,7 @@ i0.ɵɵngDeclareClassMetadata({
23113
23948
  [attr.max]="max() || null"
23114
23949
  [attr.required]="required() || null"
23115
23950
  [attr.aria-invalid]="_activeError() ? 'true' : null"
23116
- [attr.aria-describedby]="(_activeError() || hint()) ? _inputId + '-desc' : null"
23951
+ [attr.aria-describedby]="_describedBy()"
23117
23952
  (change)="onChange($event)"
23118
23953
  (blur)="onBlur()"
23119
23954
  />
@@ -23169,6 +24004,14 @@ i0.ɵɵngDeclareClassMetadata({
23169
24004
  required: false
23170
24005
  }]
23171
24006
  }],
24007
+ ariaDescribedBy: [{
24008
+ type: i0.Input,
24009
+ args: [{
24010
+ isSignal: true,
24011
+ alias: "ariaDescribedBy",
24012
+ required: false
24013
+ }]
24014
+ }],
23172
24015
  error: [{
23173
24016
  type: i0.Input,
23174
24017
  args: [{
@@ -23210,6 +24053,7 @@ var DatetimeInputComponent = class DatetimeInputComponent {
23210
24053
  this.min = input("", ...ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []);
23211
24054
  this.max = input("", ...ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []);
23212
24055
  this.hint = input("", ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
24056
+ this.ariaDescribedBy = input("", ...ngDevMode ? [{ debugName: "ariaDescribedBy" }] : /* istanbul ignore next */ []);
23213
24057
  this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
23214
24058
  this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
23215
24059
  this._disabledInput = input(false, {
@@ -23219,6 +24063,7 @@ var DatetimeInputComponent = class DatetimeInputComponent {
23219
24063
  this._cvaDisabled = signal(false, ...ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []);
23220
24064
  this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
23221
24065
  this._value = signal("", ...ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []);
24066
+ this._describedBy = computed(() => mergeDescribedBy(this._activeError() || this.hint() ? this._inputId + "-desc" : null, this.ariaDescribedBy()), ...ngDevMode ? [{ debugName: "_describedBy" }] : /* istanbul ignore next */ []);
23222
24067
  this._reveal = createFieldReveal(this.showErrors);
23223
24068
  this._issue = computed(() => this._check(this._value()), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
23224
24069
  this.invalid = computed(() => !!this.error() || !!this._issue(), ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
@@ -23346,6 +24191,13 @@ var DatetimeInputComponent = class DatetimeInputComponent {
23346
24191
  isRequired: false,
23347
24192
  transformFunction: null
23348
24193
  },
24194
+ ariaDescribedBy: {
24195
+ classPropertyName: "ariaDescribedBy",
24196
+ publicName: "ariaDescribedBy",
24197
+ isSignal: true,
24198
+ isRequired: false,
24199
+ transformFunction: null
24200
+ },
23349
24201
  error: {
23350
24202
  classPropertyName: "error",
23351
24203
  publicName: "error",
@@ -23405,7 +24257,7 @@ var DatetimeInputComponent = class DatetimeInputComponent {
23405
24257
  [attr.max]="max() || null"
23406
24258
  [attr.required]="required() || null"
23407
24259
  [attr.aria-invalid]="_activeError() ? 'true' : null"
23408
- [attr.aria-describedby]="(_activeError() || hint()) ? _inputId + '-desc' : null"
24260
+ [attr.aria-describedby]="_describedBy()"
23409
24261
  (change)="onChange($event)"
23410
24262
  (blur)="onBlur()"
23411
24263
  />
@@ -23467,7 +24319,7 @@ i0.ɵɵngDeclareClassMetadata({
23467
24319
  [attr.max]="max() || null"
23468
24320
  [attr.required]="required() || null"
23469
24321
  [attr.aria-invalid]="_activeError() ? 'true' : null"
23470
- [attr.aria-describedby]="(_activeError() || hint()) ? _inputId + '-desc' : null"
24322
+ [attr.aria-describedby]="_describedBy()"
23471
24323
  (change)="onChange($event)"
23472
24324
  (blur)="onBlur()"
23473
24325
  />
@@ -23523,6 +24375,14 @@ i0.ɵɵngDeclareClassMetadata({
23523
24375
  required: false
23524
24376
  }]
23525
24377
  }],
24378
+ ariaDescribedBy: [{
24379
+ type: i0.Input,
24380
+ args: [{
24381
+ isSignal: true,
24382
+ alias: "ariaDescribedBy",
24383
+ required: false
24384
+ }]
24385
+ }],
23526
24386
  error: [{
23527
24387
  type: i0.Input,
23528
24388
  args: [{
@@ -23561,6 +24421,7 @@ var TimeInputComponent = class TimeInputComponent {
23561
24421
  this.min = input("", ...ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []);
23562
24422
  this.max = input("", ...ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []);
23563
24423
  this.hint = input("", ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
24424
+ this.ariaDescribedBy = input("", ...ngDevMode ? [{ debugName: "ariaDescribedBy" }] : /* istanbul ignore next */ []);
23564
24425
  this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
23565
24426
  this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
23566
24427
  this._disabledInput = input(false, {
@@ -23571,6 +24432,7 @@ var TimeInputComponent = class TimeInputComponent {
23571
24432
  this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
23572
24433
  this._value = signal("", ...ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []);
23573
24434
  this._inputId = `tmi-${Math.random().toString(36).slice(2, 8)}`;
24435
+ this._describedBy = computed(() => mergeDescribedBy(this._activeError() || this.hint() ? this._inputId + "-desc" : null, this.ariaDescribedBy()), ...ngDevMode ? [{ debugName: "_describedBy" }] : /* istanbul ignore next */ []);
23574
24436
  this._reveal = createFieldReveal(this.showErrors);
23575
24437
  this._issue = computed(() => this._check(this._value()), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
23576
24438
  this.invalid = computed(() => !!this.error() || !!this._issue(), ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
@@ -23708,6 +24570,13 @@ var TimeInputComponent = class TimeInputComponent {
23708
24570
  isRequired: false,
23709
24571
  transformFunction: null
23710
24572
  },
24573
+ ariaDescribedBy: {
24574
+ classPropertyName: "ariaDescribedBy",
24575
+ publicName: "ariaDescribedBy",
24576
+ isSignal: true,
24577
+ isRequired: false,
24578
+ transformFunction: null
24579
+ },
23711
24580
  error: {
23712
24581
  classPropertyName: "error",
23713
24582
  publicName: "error",
@@ -23769,7 +24638,7 @@ var TimeInputComponent = class TimeInputComponent {
23769
24638
  [attr.aria-label]="ariaLabel() || label() || null"
23770
24639
  [attr.aria-required]="required() ? 'true' : null"
23771
24640
  [attr.aria-invalid]="_activeError() ? 'true' : null"
23772
- [attr.aria-describedby]="(_activeError() || hint()) ? _inputId + '-desc' : null"
24641
+ [attr.aria-describedby]="_describedBy()"
23773
24642
  (change)="onChange($event)"
23774
24643
  (blur)="onBlur()"
23775
24644
  />
@@ -23833,7 +24702,7 @@ i0.ɵɵngDeclareClassMetadata({
23833
24702
  [attr.aria-label]="ariaLabel() || label() || null"
23834
24703
  [attr.aria-required]="required() ? 'true' : null"
23835
24704
  [attr.aria-invalid]="_activeError() ? 'true' : null"
23836
- [attr.aria-describedby]="(_activeError() || hint()) ? _inputId + '-desc' : null"
24705
+ [attr.aria-describedby]="_describedBy()"
23837
24706
  (change)="onChange($event)"
23838
24707
  (blur)="onBlur()"
23839
24708
  />
@@ -23897,6 +24766,14 @@ i0.ɵɵngDeclareClassMetadata({
23897
24766
  required: false
23898
24767
  }]
23899
24768
  }],
24769
+ ariaDescribedBy: [{
24770
+ type: i0.Input,
24771
+ args: [{
24772
+ isSignal: true,
24773
+ alias: "ariaDescribedBy",
24774
+ required: false
24775
+ }]
24776
+ }],
23900
24777
  error: [{
23901
24778
  type: i0.Input,
23902
24779
  args: [{
@@ -26609,156 +27486,6 @@ i0.ɵɵngDeclareClassMetadata({
26609
27486
  }]
26610
27487
  }
26611
27488
  });
26612
- var FormSectionComponent = class FormSectionComponent {
26613
- constructor() {
26614
- this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
26615
- this.divider = input(false, ...ngDevMode ? [{ debugName: "divider" }] : /* istanbul ignore next */ []);
26616
- }
26617
- static {
26618
- this.ɵfac = i0.ɵɵngDeclareFactory({
26619
- minVersion: "12.0.0",
26620
- version: "22.2.2",
26621
- ngImport: i0,
26622
- type: FormSectionComponent,
26623
- deps: [],
26624
- target: i0.ɵɵFactoryTarget.Component
26625
- });
26626
- }
26627
- static {
26628
- this.ɵcmp = i0.ɵɵngDeclareComponent({
26629
- minVersion: "17.0.0",
26630
- version: "22.2.2",
26631
- type: FormSectionComponent,
26632
- isStandalone: true,
26633
- selector: "ui-form-section",
26634
- inputs: {
26635
- label: {
26636
- classPropertyName: "label",
26637
- publicName: "label",
26638
- isSignal: true,
26639
- isRequired: false,
26640
- transformFunction: null
26641
- },
26642
- divider: {
26643
- classPropertyName: "divider",
26644
- publicName: "divider",
26645
- isSignal: true,
26646
- isRequired: false,
26647
- transformFunction: null
26648
- }
26649
- },
26650
- ngImport: i0,
26651
- template: `
26652
- @if (divider()) { <div class="fs-divider"></div> }
26653
- @if (label()) { <p class="fs-label">{{ label() }}</p> }
26654
- <div class="fs-fields"><ng-content /></div>
26655
- `,
26656
- isInline: true,
26657
- styles: [":host{display:block}.fs-divider{height:1px;background:#f1f5f9;margin:8px -24px 16px}.fs-label{font-size:.6875rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:#64748b;margin:0 0 12px}.fs-fields{display:flex;flex-direction:column;gap:14px}\n"],
26658
- changeDetection: i0.ChangeDetectionStrategy.OnPush
26659
- });
26660
- }
26661
- };
26662
- i0.ɵɵngDeclareClassMetadata({
26663
- minVersion: "12.0.0",
26664
- version: "22.2.2",
26665
- ngImport: i0,
26666
- type: FormSectionComponent,
26667
- decorators: [{
26668
- type: Component,
26669
- args: [{
26670
- selector: "ui-form-section",
26671
- standalone: true,
26672
- changeDetection: ChangeDetectionStrategy.OnPush,
26673
- template: `
26674
- @if (divider()) { <div class="fs-divider"></div> }
26675
- @if (label()) { <p class="fs-label">{{ label() }}</p> }
26676
- <div class="fs-fields"><ng-content /></div>
26677
- `,
26678
- styles: [":host{display:block}.fs-divider{height:1px;background:#f1f5f9;margin:8px -24px 16px}.fs-label{font-size:.6875rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:#64748b;margin:0 0 12px}.fs-fields{display:flex;flex-direction:column;gap:14px}\n"]
26679
- }]
26680
- }],
26681
- propDecorators: {
26682
- label: [{
26683
- type: i0.Input,
26684
- args: [{
26685
- isSignal: true,
26686
- alias: "label",
26687
- required: false
26688
- }]
26689
- }],
26690
- divider: [{
26691
- type: i0.Input,
26692
- args: [{
26693
- isSignal: true,
26694
- alias: "divider",
26695
- required: false
26696
- }]
26697
- }]
26698
- }
26699
- });
26700
- var FormRowComponent = class FormRowComponent {
26701
- constructor() {
26702
- this.cols = input(2, ...ngDevMode ? [{ debugName: "cols" }] : /* istanbul ignore next */ []);
26703
- }
26704
- static {
26705
- this.ɵfac = i0.ɵɵngDeclareFactory({
26706
- minVersion: "12.0.0",
26707
- version: "22.2.2",
26708
- ngImport: i0,
26709
- type: FormRowComponent,
26710
- deps: [],
26711
- target: i0.ɵɵFactoryTarget.Component
26712
- });
26713
- }
26714
- static {
26715
- this.ɵcmp = i0.ɵɵngDeclareComponent({
26716
- minVersion: "17.1.0",
26717
- version: "22.2.2",
26718
- type: FormRowComponent,
26719
- isStandalone: true,
26720
- selector: "ui-form-row",
26721
- inputs: { cols: {
26722
- classPropertyName: "cols",
26723
- publicName: "cols",
26724
- isSignal: true,
26725
- isRequired: false,
26726
- transformFunction: null
26727
- } },
26728
- ngImport: i0,
26729
- template: `<div class="fr-row" [class.fr-row--4]="cols() === 4" [style.--fr-cols]="cols()"><ng-content /></div>`,
26730
- isInline: true,
26731
- styles: ["ui-form-row{display:block}.fr-row{display:grid;grid-template-columns:repeat(var(--fr-cols, 2),1fr);gap:12px}.fr-row>.ui-span-2{grid-column:span 2}.fr-row>.ui-span-3{grid-column:span 3}.fr-row>.ui-span-all{grid-column:1 / -1}@media(max-width:768px){.fr-row--4{grid-template-columns:repeat(2,1fr)}.fr-row--4>.ui-span-3{grid-column:1 / -1}}@media(max-width:480px){.fr-row{grid-template-columns:1fr}.fr-row>.ui-span-2,.fr-row>.ui-span-3,.fr-row>.ui-span-all{grid-column:1 / -1}}\n"],
26732
- changeDetection: i0.ChangeDetectionStrategy.OnPush,
26733
- encapsulation: i0.ViewEncapsulation.None
26734
- });
26735
- }
26736
- };
26737
- i0.ɵɵngDeclareClassMetadata({
26738
- minVersion: "12.0.0",
26739
- version: "22.2.2",
26740
- ngImport: i0,
26741
- type: FormRowComponent,
26742
- decorators: [{
26743
- type: Component,
26744
- args: [{
26745
- selector: "ui-form-row",
26746
- standalone: true,
26747
- changeDetection: ChangeDetectionStrategy.OnPush,
26748
- encapsulation: ViewEncapsulation.None,
26749
- template: `<div class="fr-row" [class.fr-row--4]="cols() === 4" [style.--fr-cols]="cols()"><ng-content /></div>`,
26750
- styles: ["ui-form-row{display:block}.fr-row{display:grid;grid-template-columns:repeat(var(--fr-cols, 2),1fr);gap:12px}.fr-row>.ui-span-2{grid-column:span 2}.fr-row>.ui-span-3{grid-column:span 3}.fr-row>.ui-span-all{grid-column:1 / -1}@media(max-width:768px){.fr-row--4{grid-template-columns:repeat(2,1fr)}.fr-row--4>.ui-span-3{grid-column:1 / -1}}@media(max-width:480px){.fr-row{grid-template-columns:1fr}.fr-row>.ui-span-2,.fr-row>.ui-span-3,.fr-row>.ui-span-all{grid-column:1 / -1}}\n"]
26751
- }]
26752
- }],
26753
- propDecorators: { cols: [{
26754
- type: i0.Input,
26755
- args: [{
26756
- isSignal: true,
26757
- alias: "cols",
26758
- required: false
26759
- }]
26760
- }] }
26761
- });
26762
27489
  var FormColSpanDirective = class FormColSpanDirective {
26763
27490
  constructor() {
26764
27491
  this.uiColSpan = input("", ...ngDevMode ? [{ debugName: "uiColSpan" }] : /* istanbul ignore next */ []);
@@ -27338,6 +28065,7 @@ var CardListItemComponent = class CardListItemComponent {
27338
28065
  this.actionLabel = input("", ...ngDevMode ? [{ debugName: "actionLabel" }] : /* istanbul ignore next */ []);
27339
28066
  this.actionTestId = input("", ...ngDevMode ? [{ debugName: "actionTestId" }] : /* istanbul ignore next */ []);
27340
28067
  this.actionAriaLabel = input("", ...ngDevMode ? [{ debugName: "actionAriaLabel" }] : /* istanbul ignore next */ []);
28068
+ this.hasBuiltInChip = computed(() => this.editButton() || this.viewButton() || !!this.actionLabel() || this.deletable(), ...ngDevMode ? [{ debugName: "hasBuiltInChip" }] : /* istanbul ignore next */ []);
27341
28069
  this.editClick = output();
27342
28070
  this.viewClick = output();
27343
28071
  this.delete = output();
@@ -27517,7 +28245,7 @@ var CardListItemComponent = class CardListItemComponent {
27517
28245
  @if (status() && statusVariant()) { <ui-badge [label]="status()!" [variant]="statusVariant()!" /> }
27518
28246
  </div>
27519
28247
  }
27520
- <div class="cli-row" [class.cli-row--badges]="hasBadges()" [class.cli-row--badges-2]="hasBadges() && !!type() && !!status() && !!statusVariant()">
28248
+ <div class="cli-row" [class.cli-row--badges]="hasBadges()" [class.cli-row--badges-2]="hasBadges() && !!type() && !!status() && !!statusVariant()" [class.cli-row--badges-chip]="hasBadges() && hasBuiltInChip()">
27521
28249
  @if (iconPath(); as d) {
27522
28250
  <div class="cli-icon-circle" [class]="'cli-icon-circle cli-icon-circle--' + icon()" aria-hidden="true">
27523
28251
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path [attr.d]="d" /></svg>
@@ -27570,7 +28298,7 @@ var CardListItemComponent = class CardListItemComponent {
27570
28298
  <ng-content select="[card-detail]" />
27571
28299
  `,
27572
28300
  isInline: true,
27573
- styles: ["ui-card-list-item{position:relative;display:block;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden;margin-bottom:8px}ui-card-list-item:last-child{margin-bottom:0}ui-card-list-item .cli-row{display:flex;align-items:flex-start;gap:12px;padding:13px 18px;transition:background .12s}ui-card-list-item .cli-row:hover{background:#f8fafc}@media(prefers-reduced-motion:reduce){ui-card-list-item .cli-row{transition:none}}ui-card-list-item .cli-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;margin-top:5px}ui-card-list-item .cli-dot:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-dot--high{background:#ef4444}ui-card-list-item .cli-dot--medium{background:#f59e0b}ui-card-list-item .cli-dot--low{background:#94a3b8}ui-card-list-item .cli-dot--blue{background:#3b82f6}ui-card-list-item .cli-dot--green{background:#22c55e}ui-card-list-item .cli-icon-circle{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}ui-card-list-item .cli-icon-circle--call{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--email{background:#dcfce7;color:#16a34a}ui-card-list-item .cli-icon-circle--sms{background:#fef9c3;color:#ca8a04}ui-card-list-item .cli-icon-circle--task{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--doc{background:#ffedd5;color:#ea580c}ui-card-list-item .cli-icon-circle--money{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--deal{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--survey{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--property{background:#fef3c7;color:#d97706}ui-card-list-item .cli-icon-circle--search{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--heart{background:#fce7f3;color:#db2777}ui-card-list-item .cli-icon-circle--calc{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--repeat{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px;overflow-wrap:anywhere;word-break:break-word}ui-card-list-item .cli-badges{position:absolute;top:10px;right:12px;display:flex;align-items:center;gap:6px;z-index:1}ui-card-list-item .cli-row--badges .cli-body{padding-right:96px}ui-card-list-item .cli-row--badges-2 .cli-body{padding-right:190px}ui-card-list-item .cli-row--badges .cli-chip{align-self:flex-end}ui-card-list-item .cli-title-row{display:flex;align-items:center;gap:7px;flex-wrap:wrap}ui-card-list-item .cli-title{font-size:.875rem;font-weight:600;color:#1e293b}ui-card-list-item .cli-desc-row{display:flex;align-items:center;gap:8px}ui-card-list-item .cli-desc-row:empty{display:none}ui-card-list-item .cli-description{font-size:.8125rem;color:#64748b;min-width:0}ui-card-list-item .cli-date{display:flex;align-items:center;gap:4px;font-size:.75rem;color:#64748b}ui-card-list-item .cli-chip{flex-shrink:0;display:inline-flex;align-items:center;gap:5px;align-self:center;box-sizing:border-box;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;background:none;cursor:pointer;padding:4px 10px;border-radius:6px;text-decoration:none;transition:background .15s,color .15s,border-color .15s}ui-card-list-item .cli-chip--edit{color:#64748b;border:1px solid #e2e8f0}ui-card-list-item .cli-chip--edit:hover{background:#f1f5f9;color:#1e293b}ui-card-list-item .cli-chip--view{color:#2563eb;border:1px solid #dbeafe}ui-card-list-item .cli-chip--view:hover{background:#eff6ff;border-color:#bfdbfe;color:#1d4ed8}ui-card-list-item .cli-chip--action{color:#475569;border:1px solid #e2e8f0}ui-card-list-item .cli-chip--action:hover{background:#f1f5f9;color:#1e293b}ui-card-list-item .cli-chip--delete{position:relative;justify-content:center;width:28px;height:28px;padding:0;color:#b91c1c;border:1px solid #fecaca}ui-card-list-item .cli-chip--delete:hover{background:#fef2f2;border-color:#fca5a5;color:#991b1b}ui-card-list-item .cli-chip--delete:after{content:\"\";position:absolute;top:50%;left:50%;width:44px;height:44px;transform:translate(-50%,-50%)}ui-card-list-item .cli-chip:focus-visible,ui-card-list-item .cli-inline-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-inline-link{flex-shrink:0;margin-left:auto;display:inline-flex;align-items:center;gap:4px;font-size:.8rem;font-weight:500;color:#2563eb;text-decoration:none;transition:color .15s}ui-card-list-item .cli-inline-link:hover{color:#1d4ed8}@media(pointer:coarse),(max-width:480px){ui-card-list-item .cli-chip{min-height:44px;padding:4px 14px}ui-card-list-item .cli-chip--delete{min-height:28px;padding:0}}ui-card-list-item [card-stats]{display:flex;align-items:stretch;background:#f8fafc;border-top:1px solid #f1f5f9}ui-card-list-item [card-detail]{background:#f8fafc;border-top:1px solid #e2e8f0}ui-card-list-item .cli-stat{flex:1;display:flex;flex-direction:column;gap:2px;padding:10px 14px}ui-card-list-item .cli-stat-label{font-size:.6875rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:#64748b}ui-card-list-item .cli-stat-value{font-size:.9375rem;font-weight:600;color:#0f172a}ui-card-list-item .cli-stat-divider{width:1px;background:#e2e8f0;margin:8px 0}\n"],
28301
+ styles: ["ui-card-list-item{position:relative;display:block;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden;margin-bottom:8px}ui-card-list-item:last-child{margin-bottom:0}ui-card-list-item .cli-row{display:flex;align-items:flex-start;gap:12px;padding:13px 18px;transition:background .12s}ui-card-list-item .cli-row:hover{background:#f8fafc}@media(prefers-reduced-motion:reduce){ui-card-list-item .cli-row{transition:none}}ui-card-list-item .cli-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;margin-top:5px}ui-card-list-item .cli-dot:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-dot--high{background:#ef4444}ui-card-list-item .cli-dot--medium{background:#f59e0b}ui-card-list-item .cli-dot--low{background:#94a3b8}ui-card-list-item .cli-dot--blue{background:#3b82f6}ui-card-list-item .cli-dot--green{background:#22c55e}ui-card-list-item .cli-icon-circle{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}ui-card-list-item .cli-icon-circle--call{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--email{background:#dcfce7;color:#16a34a}ui-card-list-item .cli-icon-circle--sms{background:#fef9c3;color:#ca8a04}ui-card-list-item .cli-icon-circle--task{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--doc{background:#ffedd5;color:#ea580c}ui-card-list-item .cli-icon-circle--money{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--deal{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--survey{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--property{background:#fef3c7;color:#d97706}ui-card-list-item .cli-icon-circle--search{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--heart{background:#fce7f3;color:#db2777}ui-card-list-item .cli-icon-circle--calc{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--repeat{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px;overflow-wrap:anywhere;word-break:break-word}ui-card-list-item .cli-badges{position:absolute;top:10px;right:12px;display:flex;align-items:center;gap:6px;z-index:1}ui-card-list-item .cli-row--badges .cli-body{padding-right:96px}ui-card-list-item .cli-row--badges-2 .cli-body{padding-right:190px}ui-card-list-item .cli-row--badges .cli-chip{align-self:flex-end}ui-card-list-item .cli-row--badges-chip{box-sizing:border-box;min-height:76px}ui-card-list-item .cli-row--badges:has([card-list-action]){box-sizing:border-box;min-height:76px}@media(pointer:coarse),(max-width:480px){ui-card-list-item .cli-row--badges-chip{min-height:92px}ui-card-list-item .cli-row--badges:has([card-list-action]){min-height:92px}}ui-card-list-item .cli-title-row{display:flex;align-items:center;gap:7px;flex-wrap:wrap}ui-card-list-item .cli-title{font-size:.875rem;font-weight:600;color:#1e293b}ui-card-list-item .cli-desc-row{display:flex;align-items:center;gap:8px}ui-card-list-item .cli-desc-row:empty{display:none}ui-card-list-item .cli-description{font-size:.8125rem;color:#64748b;min-width:0}ui-card-list-item .cli-date{display:flex;align-items:center;gap:4px;font-size:.75rem;color:#64748b}ui-card-list-item .cli-chip{flex-shrink:0;display:inline-flex;align-items:center;gap:5px;align-self:center;box-sizing:border-box;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;background:none;cursor:pointer;padding:4px 10px;border-radius:6px;text-decoration:none;transition:background .15s,color .15s,border-color .15s}ui-card-list-item .cli-chip--edit{color:#64748b;border:1px solid #e2e8f0}ui-card-list-item .cli-chip--edit:hover{background:#f1f5f9;color:#1e293b}ui-card-list-item .cli-chip--view{color:#2563eb;border:1px solid #dbeafe}ui-card-list-item .cli-chip--view:hover{background:#eff6ff;border-color:#bfdbfe;color:#1d4ed8}ui-card-list-item .cli-chip--action{color:#475569;border:1px solid #e2e8f0}ui-card-list-item .cli-chip--action:hover{background:#f1f5f9;color:#1e293b}ui-card-list-item .cli-chip--delete{position:relative;justify-content:center;width:28px;height:28px;padding:0;color:#b91c1c;border:1px solid #fecaca}ui-card-list-item .cli-chip--delete:hover{background:#fef2f2;border-color:#fca5a5;color:#991b1b}ui-card-list-item .cli-chip--delete:after{content:\"\";position:absolute;top:50%;left:50%;width:44px;height:44px;transform:translate(-50%,-50%)}ui-card-list-item .cli-chip:focus-visible,ui-card-list-item .cli-inline-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-inline-link{flex-shrink:0;margin-left:auto;display:inline-flex;align-items:center;gap:4px;font-size:.8rem;font-weight:500;color:#2563eb;text-decoration:none;transition:color .15s}ui-card-list-item .cli-inline-link:hover{color:#1d4ed8}@media(pointer:coarse),(max-width:480px){ui-card-list-item .cli-chip{min-height:44px;padding:4px 14px}ui-card-list-item .cli-chip--delete{min-height:28px;padding:0}}ui-card-list-item [card-stats]{display:flex;align-items:stretch;background:#f8fafc;border-top:1px solid #f1f5f9}ui-card-list-item [card-detail]{background:#f8fafc;border-top:1px solid #e2e8f0}ui-card-list-item .cli-stat{flex:1;display:flex;flex-direction:column;gap:2px;padding:10px 14px}ui-card-list-item .cli-stat-label{font-size:.6875rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:#64748b}ui-card-list-item .cli-stat-value{font-size:.9375rem;font-weight:600;color:#0f172a}ui-card-list-item .cli-stat-divider{width:1px;background:#e2e8f0;margin:8px 0}\n"],
27574
28302
  dependencies: [{
27575
28303
  kind: "component",
27576
28304
  type: BadgeComponent,
@@ -27607,7 +28335,7 @@ i0.ɵɵngDeclareClassMetadata({
27607
28335
  @if (status() && statusVariant()) { <ui-badge [label]="status()!" [variant]="statusVariant()!" /> }
27608
28336
  </div>
27609
28337
  }
27610
- <div class="cli-row" [class.cli-row--badges]="hasBadges()" [class.cli-row--badges-2]="hasBadges() && !!type() && !!status() && !!statusVariant()">
28338
+ <div class="cli-row" [class.cli-row--badges]="hasBadges()" [class.cli-row--badges-2]="hasBadges() && !!type() && !!status() && !!statusVariant()" [class.cli-row--badges-chip]="hasBadges() && hasBuiltInChip()">
27611
28339
  @if (iconPath(); as d) {
27612
28340
  <div class="cli-icon-circle" [class]="'cli-icon-circle cli-icon-circle--' + icon()" aria-hidden="true">
27613
28341
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path [attr.d]="d" /></svg>
@@ -27659,7 +28387,7 @@ i0.ɵɵngDeclareClassMetadata({
27659
28387
  <ng-content select="[card-stats]" />
27660
28388
  <ng-content select="[card-detail]" />
27661
28389
  `,
27662
- styles: ["ui-card-list-item{position:relative;display:block;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden;margin-bottom:8px}ui-card-list-item:last-child{margin-bottom:0}ui-card-list-item .cli-row{display:flex;align-items:flex-start;gap:12px;padding:13px 18px;transition:background .12s}ui-card-list-item .cli-row:hover{background:#f8fafc}@media(prefers-reduced-motion:reduce){ui-card-list-item .cli-row{transition:none}}ui-card-list-item .cli-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;margin-top:5px}ui-card-list-item .cli-dot:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-dot--high{background:#ef4444}ui-card-list-item .cli-dot--medium{background:#f59e0b}ui-card-list-item .cli-dot--low{background:#94a3b8}ui-card-list-item .cli-dot--blue{background:#3b82f6}ui-card-list-item .cli-dot--green{background:#22c55e}ui-card-list-item .cli-icon-circle{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}ui-card-list-item .cli-icon-circle--call{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--email{background:#dcfce7;color:#16a34a}ui-card-list-item .cli-icon-circle--sms{background:#fef9c3;color:#ca8a04}ui-card-list-item .cli-icon-circle--task{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--doc{background:#ffedd5;color:#ea580c}ui-card-list-item .cli-icon-circle--money{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--deal{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--survey{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--property{background:#fef3c7;color:#d97706}ui-card-list-item .cli-icon-circle--search{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--heart{background:#fce7f3;color:#db2777}ui-card-list-item .cli-icon-circle--calc{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--repeat{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px;overflow-wrap:anywhere;word-break:break-word}ui-card-list-item .cli-badges{position:absolute;top:10px;right:12px;display:flex;align-items:center;gap:6px;z-index:1}ui-card-list-item .cli-row--badges .cli-body{padding-right:96px}ui-card-list-item .cli-row--badges-2 .cli-body{padding-right:190px}ui-card-list-item .cli-row--badges .cli-chip{align-self:flex-end}ui-card-list-item .cli-title-row{display:flex;align-items:center;gap:7px;flex-wrap:wrap}ui-card-list-item .cli-title{font-size:.875rem;font-weight:600;color:#1e293b}ui-card-list-item .cli-desc-row{display:flex;align-items:center;gap:8px}ui-card-list-item .cli-desc-row:empty{display:none}ui-card-list-item .cli-description{font-size:.8125rem;color:#64748b;min-width:0}ui-card-list-item .cli-date{display:flex;align-items:center;gap:4px;font-size:.75rem;color:#64748b}ui-card-list-item .cli-chip{flex-shrink:0;display:inline-flex;align-items:center;gap:5px;align-self:center;box-sizing:border-box;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;background:none;cursor:pointer;padding:4px 10px;border-radius:6px;text-decoration:none;transition:background .15s,color .15s,border-color .15s}ui-card-list-item .cli-chip--edit{color:#64748b;border:1px solid #e2e8f0}ui-card-list-item .cli-chip--edit:hover{background:#f1f5f9;color:#1e293b}ui-card-list-item .cli-chip--view{color:#2563eb;border:1px solid #dbeafe}ui-card-list-item .cli-chip--view:hover{background:#eff6ff;border-color:#bfdbfe;color:#1d4ed8}ui-card-list-item .cli-chip--action{color:#475569;border:1px solid #e2e8f0}ui-card-list-item .cli-chip--action:hover{background:#f1f5f9;color:#1e293b}ui-card-list-item .cli-chip--delete{position:relative;justify-content:center;width:28px;height:28px;padding:0;color:#b91c1c;border:1px solid #fecaca}ui-card-list-item .cli-chip--delete:hover{background:#fef2f2;border-color:#fca5a5;color:#991b1b}ui-card-list-item .cli-chip--delete:after{content:\"\";position:absolute;top:50%;left:50%;width:44px;height:44px;transform:translate(-50%,-50%)}ui-card-list-item .cli-chip:focus-visible,ui-card-list-item .cli-inline-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-inline-link{flex-shrink:0;margin-left:auto;display:inline-flex;align-items:center;gap:4px;font-size:.8rem;font-weight:500;color:#2563eb;text-decoration:none;transition:color .15s}ui-card-list-item .cli-inline-link:hover{color:#1d4ed8}@media(pointer:coarse),(max-width:480px){ui-card-list-item .cli-chip{min-height:44px;padding:4px 14px}ui-card-list-item .cli-chip--delete{min-height:28px;padding:0}}ui-card-list-item [card-stats]{display:flex;align-items:stretch;background:#f8fafc;border-top:1px solid #f1f5f9}ui-card-list-item [card-detail]{background:#f8fafc;border-top:1px solid #e2e8f0}ui-card-list-item .cli-stat{flex:1;display:flex;flex-direction:column;gap:2px;padding:10px 14px}ui-card-list-item .cli-stat-label{font-size:.6875rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:#64748b}ui-card-list-item .cli-stat-value{font-size:.9375rem;font-weight:600;color:#0f172a}ui-card-list-item .cli-stat-divider{width:1px;background:#e2e8f0;margin:8px 0}\n"]
28390
+ styles: ["ui-card-list-item{position:relative;display:block;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden;margin-bottom:8px}ui-card-list-item:last-child{margin-bottom:0}ui-card-list-item .cli-row{display:flex;align-items:flex-start;gap:12px;padding:13px 18px;transition:background .12s}ui-card-list-item .cli-row:hover{background:#f8fafc}@media(prefers-reduced-motion:reduce){ui-card-list-item .cli-row{transition:none}}ui-card-list-item .cli-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;margin-top:5px}ui-card-list-item .cli-dot:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-dot--high{background:#ef4444}ui-card-list-item .cli-dot--medium{background:#f59e0b}ui-card-list-item .cli-dot--low{background:#94a3b8}ui-card-list-item .cli-dot--blue{background:#3b82f6}ui-card-list-item .cli-dot--green{background:#22c55e}ui-card-list-item .cli-icon-circle{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}ui-card-list-item .cli-icon-circle--call{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--email{background:#dcfce7;color:#16a34a}ui-card-list-item .cli-icon-circle--sms{background:#fef9c3;color:#ca8a04}ui-card-list-item .cli-icon-circle--task{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--doc{background:#ffedd5;color:#ea580c}ui-card-list-item .cli-icon-circle--money{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--deal{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--survey{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--property{background:#fef3c7;color:#d97706}ui-card-list-item .cli-icon-circle--search{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--heart{background:#fce7f3;color:#db2777}ui-card-list-item .cli-icon-circle--calc{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--repeat{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px;overflow-wrap:anywhere;word-break:break-word}ui-card-list-item .cli-badges{position:absolute;top:10px;right:12px;display:flex;align-items:center;gap:6px;z-index:1}ui-card-list-item .cli-row--badges .cli-body{padding-right:96px}ui-card-list-item .cli-row--badges-2 .cli-body{padding-right:190px}ui-card-list-item .cli-row--badges .cli-chip{align-self:flex-end}ui-card-list-item .cli-row--badges-chip{box-sizing:border-box;min-height:76px}ui-card-list-item .cli-row--badges:has([card-list-action]){box-sizing:border-box;min-height:76px}@media(pointer:coarse),(max-width:480px){ui-card-list-item .cli-row--badges-chip{min-height:92px}ui-card-list-item .cli-row--badges:has([card-list-action]){min-height:92px}}ui-card-list-item .cli-title-row{display:flex;align-items:center;gap:7px;flex-wrap:wrap}ui-card-list-item .cli-title{font-size:.875rem;font-weight:600;color:#1e293b}ui-card-list-item .cli-desc-row{display:flex;align-items:center;gap:8px}ui-card-list-item .cli-desc-row:empty{display:none}ui-card-list-item .cli-description{font-size:.8125rem;color:#64748b;min-width:0}ui-card-list-item .cli-date{display:flex;align-items:center;gap:4px;font-size:.75rem;color:#64748b}ui-card-list-item .cli-chip{flex-shrink:0;display:inline-flex;align-items:center;gap:5px;align-self:center;box-sizing:border-box;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;background:none;cursor:pointer;padding:4px 10px;border-radius:6px;text-decoration:none;transition:background .15s,color .15s,border-color .15s}ui-card-list-item .cli-chip--edit{color:#64748b;border:1px solid #e2e8f0}ui-card-list-item .cli-chip--edit:hover{background:#f1f5f9;color:#1e293b}ui-card-list-item .cli-chip--view{color:#2563eb;border:1px solid #dbeafe}ui-card-list-item .cli-chip--view:hover{background:#eff6ff;border-color:#bfdbfe;color:#1d4ed8}ui-card-list-item .cli-chip--action{color:#475569;border:1px solid #e2e8f0}ui-card-list-item .cli-chip--action:hover{background:#f1f5f9;color:#1e293b}ui-card-list-item .cli-chip--delete{position:relative;justify-content:center;width:28px;height:28px;padding:0;color:#b91c1c;border:1px solid #fecaca}ui-card-list-item .cli-chip--delete:hover{background:#fef2f2;border-color:#fca5a5;color:#991b1b}ui-card-list-item .cli-chip--delete:after{content:\"\";position:absolute;top:50%;left:50%;width:44px;height:44px;transform:translate(-50%,-50%)}ui-card-list-item .cli-chip:focus-visible,ui-card-list-item .cli-inline-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-inline-link{flex-shrink:0;margin-left:auto;display:inline-flex;align-items:center;gap:4px;font-size:.8rem;font-weight:500;color:#2563eb;text-decoration:none;transition:color .15s}ui-card-list-item .cli-inline-link:hover{color:#1d4ed8}@media(pointer:coarse),(max-width:480px){ui-card-list-item .cli-chip{min-height:44px;padding:4px 14px}ui-card-list-item .cli-chip--delete{min-height:28px;padding:0}}ui-card-list-item [card-stats]{display:flex;align-items:stretch;background:#f8fafc;border-top:1px solid #f1f5f9}ui-card-list-item [card-detail]{background:#f8fafc;border-top:1px solid #e2e8f0}ui-card-list-item .cli-stat{flex:1;display:flex;flex-direction:column;gap:2px;padding:10px 14px}ui-card-list-item .cli-stat-label{font-size:.6875rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:#64748b}ui-card-list-item .cli-stat-value{font-size:.9375rem;font-weight:600;color:#0f172a}ui-card-list-item .cli-stat-divider{width:1px;background:#e2e8f0;margin:8px 0}\n"]
27663
28391
  }]
27664
28392
  }],
27665
28393
  propDecorators: {
@@ -28236,6 +28964,10 @@ var NotesComponent = class NotesComponent {
28236
28964
  "dialogTestId",
28237
28965
  "hideClose",
28238
28966
  "closable",
28967
+ "layout",
28968
+ "closeOnBackdrop",
28969
+ "closeOnEscape",
28970
+ "busy",
28239
28971
  "returnFocusTo"
28240
28972
  ],
28241
28973
  outputs: ["close"]
@@ -28277,6 +29009,7 @@ var NotesComponent = class NotesComponent {
28277
29009
  "required",
28278
29010
  "readonly",
28279
29011
  "hint",
29012
+ "ariaDescribedBy",
28280
29013
  "hintAsDescription",
28281
29014
  "error",
28282
29015
  "monospace",
@@ -29016,7 +29749,7 @@ var ListComponent = class ListComponent {
29016
29749
  }
29017
29750
  `,
29018
29751
  isInline: true,
29019
- styles: ["ui-list{display:block;min-width:0}.ul-list{margin:0;padding:0;min-width:0}.ul-list--unordered{list-style:none}.ul-list--ordered{list-style:decimal;-webkit-padding-start:1.75rem;padding-inline-start:1.75rem}.ul-list--ordered>.ul-item::marker{color:var(--text-secondary, #64748b);font-size:.875rem}.ul-item{min-width:0;transition:background-color .4s ease}.ul-item.ul-item--moved{background-color:var(--surface-hover, #f1f5f9)}.ul-list:not(.ul-list--grid)>.ul-item+.ul-item{margin-top:var(--ul-gap, 0px)}.ul-list:not(.ul-list--grid)>.ul-item:not(:last-child)>.ul-row>.ul-content>ui-list-item:not(.li-bordered) .li-row{border-bottom:1px solid var(--border, #e2e8f0)}.ul-row{display:flex;align-items:center;gap:8px;min-width:0}.ul-content{flex:1 1 auto;min-width:0;word-break:break-word;overflow-wrap:anywhere}.ul-controls{display:flex;flex:0 0 auto;align-items:center;gap:2px}.ul-item--nav{cursor:pointer;border-radius:10px;transition:background-color .12s ease}.ul-item--nav:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.ul-item--nav:hover{background:var(--surface-hover, #f8fafc)}.ul-item--nav:hover:has(>.ul-row>.ul-content>ui-list-item.li-bordered){background:transparent}.ul-item--nav>.ul-row{padding-inline-end:8px}.ul-item--nav:hover .ul-chevron{color:#0f172a;transform:translate(2px)}.ul-chevron{flex:0 0 auto;color:#94a3b8;transition:color .15s ease,transform .15s ease}@media(prefers-reduced-motion:reduce){.ul-chevron{transition:none;transform:none!important}}.ul-list.ul-list--grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--ul-min, 130px),100%),1fr));gap:var(--ul-gap, 12px);list-style:none;-webkit-padding-start:0;padding-inline-start:0}.ul-list--grid>.ul-item>.ul-row{flex-direction:column;align-items:stretch;gap:6px}.ul-list--grid>.ul-item>.ul-row>.ul-controls{align-self:center}@media(pointer:coarse),(max-width:480px){.ul-controls{gap:16px}}.ul-item--draggable{-webkit-user-select:none;user-select:none;-webkit-user-drag:element}@media(hover:hover)and (pointer:fine){.ul-item--draggable{cursor:grab}.ul-item--draggable:active{cursor:grabbing}}.ul-item--draggable:focus{outline:2px solid #3b82f6;outline-offset:2px;border-radius:6px}.ul-item--draggable:focus:not(:focus-visible){outline:none}ui-list .ul-item--draggable img,ui-list .ul-item--draggable ui-image-preview{pointer-events:none;-webkit-user-drag:none}.ul-item--dragging{opacity:.5}.ul-item--over{outline:2px dashed #3b82f6;outline-offset:2px;border-radius:6px}@media(prefers-reduced-motion:reduce){.ul-item{transition:none}}@media(forced-colors:active){.ul-item.ul-item--moved{outline:2px solid Highlight;outline-offset:-2px}}@media(forced-colors:active){.ul-item.ul-item--dragging{outline:2px dotted Highlight;outline-offset:2px}.ul-item.ul-item--over{outline:2px dashed Highlight;outline-offset:2px}.ul-item--draggable:focus{outline:2px solid Highlight;outline-offset:2px}}.ul-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"],
29752
+ styles: ["ui-list{display:block;min-width:0}.ul-list{margin:0;padding:0;min-width:0}.ul-list--unordered{list-style:none}.ul-list--ordered{list-style:decimal;-webkit-padding-start:1.75rem;padding-inline-start:1.75rem}.ul-list--ordered>.ul-item::marker{color:var(--text-secondary, #64748b);font-size:.875rem}.ul-item{min-width:0;transition:background-color .4s ease}.ul-item.ul-item--moved{background-color:var(--surface-hover, #f1f5f9)}.ul-list:not(.ul-list--grid)>.ul-item+.ul-item{margin-top:var(--ul-gap, 0px)}.ul-list:not(.ul-list--grid)>.ul-item:not(:last-child)>.ul-row>.ul-content>ui-list-item:not(.li-bordered) .li-row{border-bottom:1px solid var(--border, #e2e8f0)}.ul-row{display:flex;align-items:center;gap:8px;min-width:0}.ul-content{flex:1 1 auto;min-width:0;word-break:break-word;overflow-wrap:anywhere}.ul-controls{display:flex;flex:0 0 auto;align-items:center;gap:2px}.ul-item--nav{cursor:pointer;border-radius:10px;transition:background-color .12s ease}.ul-item--nav:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.ul-item--nav:hover{background:var(--surface-hover, #f8fafc)}.ul-item--nav:hover:has(>.ul-row>.ul-content>ui-list-item.li-bordered){background:transparent}.ul-item--nav>.ul-row{padding-inline-end:8px}.ul-item--nav:hover .ul-chevron{color:#0f172a;transform:translate(2px)}.ul-chevron{flex:0 0 auto;color:#94a3b8;transition:color .15s ease,transform .15s ease}@media(prefers-reduced-motion:reduce){.ul-chevron{transition:none;transform:none!important}}.ul-item--nav:has(>.ul-row>.ul-content>ui-list-item.li-bordered)>.ul-row{position:relative;padding-inline-end:0}.ul-item--nav:has(>.ul-row>.ul-content>ui-list-item.li-bordered)>.ul-row>.ul-chevron{position:absolute;inset-inline-end:12px;top:50%;margin-top:-10px;pointer-events:none}.ul-item--nav>.ul-row>.ul-content>ui-list-item.li-bordered .li-row{padding-inline-end:40px}.ul-list.ul-list--grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--ul-min, 130px),100%),1fr));gap:var(--ul-gap, 12px);list-style:none;-webkit-padding-start:0;padding-inline-start:0}.ul-list--grid>.ul-item>.ul-row{flex-direction:column;align-items:stretch;gap:6px}.ul-list--grid>.ul-item>.ul-row>.ul-controls{align-self:center}@media(pointer:coarse),(max-width:480px){.ul-controls{gap:16px}}.ul-item--draggable{-webkit-user-select:none;user-select:none;-webkit-user-drag:element}@media(hover:hover)and (pointer:fine){.ul-item--draggable{cursor:grab}.ul-item--draggable:active{cursor:grabbing}}.ul-item--draggable:focus{outline:2px solid #3b82f6;outline-offset:2px;border-radius:6px}.ul-item--draggable:focus:not(:focus-visible){outline:none}ui-list .ul-item--draggable img,ui-list .ul-item--draggable ui-image-preview{pointer-events:none;-webkit-user-drag:none}.ul-item--dragging{opacity:.5}.ul-item--over{outline:2px dashed #3b82f6;outline-offset:2px;border-radius:6px}@media(prefers-reduced-motion:reduce){.ul-item{transition:none}}@media(forced-colors:active){.ul-item.ul-item--moved{outline:2px solid Highlight;outline-offset:-2px}}@media(forced-colors:active){.ul-item.ul-item--dragging{outline:2px dotted Highlight;outline-offset:2px}.ul-item.ul-item--over{outline:2px dashed Highlight;outline-offset:2px}.ul-item--draggable:focus{outline:2px solid Highlight;outline-offset:2px}}.ul-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"],
29020
29753
  dependencies: [{
29021
29754
  kind: "directive",
29022
29755
  type: NgTemplateOutlet,
@@ -29144,7 +29877,7 @@ i0.ɵɵngDeclareClassMetadata({
29144
29877
  <div class="ul-sr" role="status" aria-live="polite" aria-atomic="true">{{ announcement() }}</div>
29145
29878
  }
29146
29879
  `,
29147
- styles: ["ui-list{display:block;min-width:0}.ul-list{margin:0;padding:0;min-width:0}.ul-list--unordered{list-style:none}.ul-list--ordered{list-style:decimal;-webkit-padding-start:1.75rem;padding-inline-start:1.75rem}.ul-list--ordered>.ul-item::marker{color:var(--text-secondary, #64748b);font-size:.875rem}.ul-item{min-width:0;transition:background-color .4s ease}.ul-item.ul-item--moved{background-color:var(--surface-hover, #f1f5f9)}.ul-list:not(.ul-list--grid)>.ul-item+.ul-item{margin-top:var(--ul-gap, 0px)}.ul-list:not(.ul-list--grid)>.ul-item:not(:last-child)>.ul-row>.ul-content>ui-list-item:not(.li-bordered) .li-row{border-bottom:1px solid var(--border, #e2e8f0)}.ul-row{display:flex;align-items:center;gap:8px;min-width:0}.ul-content{flex:1 1 auto;min-width:0;word-break:break-word;overflow-wrap:anywhere}.ul-controls{display:flex;flex:0 0 auto;align-items:center;gap:2px}.ul-item--nav{cursor:pointer;border-radius:10px;transition:background-color .12s ease}.ul-item--nav:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.ul-item--nav:hover{background:var(--surface-hover, #f8fafc)}.ul-item--nav:hover:has(>.ul-row>.ul-content>ui-list-item.li-bordered){background:transparent}.ul-item--nav>.ul-row{padding-inline-end:8px}.ul-item--nav:hover .ul-chevron{color:#0f172a;transform:translate(2px)}.ul-chevron{flex:0 0 auto;color:#94a3b8;transition:color .15s ease,transform .15s ease}@media(prefers-reduced-motion:reduce){.ul-chevron{transition:none;transform:none!important}}.ul-list.ul-list--grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--ul-min, 130px),100%),1fr));gap:var(--ul-gap, 12px);list-style:none;-webkit-padding-start:0;padding-inline-start:0}.ul-list--grid>.ul-item>.ul-row{flex-direction:column;align-items:stretch;gap:6px}.ul-list--grid>.ul-item>.ul-row>.ul-controls{align-self:center}@media(pointer:coarse),(max-width:480px){.ul-controls{gap:16px}}.ul-item--draggable{-webkit-user-select:none;user-select:none;-webkit-user-drag:element}@media(hover:hover)and (pointer:fine){.ul-item--draggable{cursor:grab}.ul-item--draggable:active{cursor:grabbing}}.ul-item--draggable:focus{outline:2px solid #3b82f6;outline-offset:2px;border-radius:6px}.ul-item--draggable:focus:not(:focus-visible){outline:none}ui-list .ul-item--draggable img,ui-list .ul-item--draggable ui-image-preview{pointer-events:none;-webkit-user-drag:none}.ul-item--dragging{opacity:.5}.ul-item--over{outline:2px dashed #3b82f6;outline-offset:2px;border-radius:6px}@media(prefers-reduced-motion:reduce){.ul-item{transition:none}}@media(forced-colors:active){.ul-item.ul-item--moved{outline:2px solid Highlight;outline-offset:-2px}}@media(forced-colors:active){.ul-item.ul-item--dragging{outline:2px dotted Highlight;outline-offset:2px}.ul-item.ul-item--over{outline:2px dashed Highlight;outline-offset:2px}.ul-item--draggable:focus{outline:2px solid Highlight;outline-offset:2px}}.ul-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"]
29880
+ styles: ["ui-list{display:block;min-width:0}.ul-list{margin:0;padding:0;min-width:0}.ul-list--unordered{list-style:none}.ul-list--ordered{list-style:decimal;-webkit-padding-start:1.75rem;padding-inline-start:1.75rem}.ul-list--ordered>.ul-item::marker{color:var(--text-secondary, #64748b);font-size:.875rem}.ul-item{min-width:0;transition:background-color .4s ease}.ul-item.ul-item--moved{background-color:var(--surface-hover, #f1f5f9)}.ul-list:not(.ul-list--grid)>.ul-item+.ul-item{margin-top:var(--ul-gap, 0px)}.ul-list:not(.ul-list--grid)>.ul-item:not(:last-child)>.ul-row>.ul-content>ui-list-item:not(.li-bordered) .li-row{border-bottom:1px solid var(--border, #e2e8f0)}.ul-row{display:flex;align-items:center;gap:8px;min-width:0}.ul-content{flex:1 1 auto;min-width:0;word-break:break-word;overflow-wrap:anywhere}.ul-controls{display:flex;flex:0 0 auto;align-items:center;gap:2px}.ul-item--nav{cursor:pointer;border-radius:10px;transition:background-color .12s ease}.ul-item--nav:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.ul-item--nav:hover{background:var(--surface-hover, #f8fafc)}.ul-item--nav:hover:has(>.ul-row>.ul-content>ui-list-item.li-bordered){background:transparent}.ul-item--nav>.ul-row{padding-inline-end:8px}.ul-item--nav:hover .ul-chevron{color:#0f172a;transform:translate(2px)}.ul-chevron{flex:0 0 auto;color:#94a3b8;transition:color .15s ease,transform .15s ease}@media(prefers-reduced-motion:reduce){.ul-chevron{transition:none;transform:none!important}}.ul-item--nav:has(>.ul-row>.ul-content>ui-list-item.li-bordered)>.ul-row{position:relative;padding-inline-end:0}.ul-item--nav:has(>.ul-row>.ul-content>ui-list-item.li-bordered)>.ul-row>.ul-chevron{position:absolute;inset-inline-end:12px;top:50%;margin-top:-10px;pointer-events:none}.ul-item--nav>.ul-row>.ul-content>ui-list-item.li-bordered .li-row{padding-inline-end:40px}.ul-list.ul-list--grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--ul-min, 130px),100%),1fr));gap:var(--ul-gap, 12px);list-style:none;-webkit-padding-start:0;padding-inline-start:0}.ul-list--grid>.ul-item>.ul-row{flex-direction:column;align-items:stretch;gap:6px}.ul-list--grid>.ul-item>.ul-row>.ul-controls{align-self:center}@media(pointer:coarse),(max-width:480px){.ul-controls{gap:16px}}.ul-item--draggable{-webkit-user-select:none;user-select:none;-webkit-user-drag:element}@media(hover:hover)and (pointer:fine){.ul-item--draggable{cursor:grab}.ul-item--draggable:active{cursor:grabbing}}.ul-item--draggable:focus{outline:2px solid #3b82f6;outline-offset:2px;border-radius:6px}.ul-item--draggable:focus:not(:focus-visible){outline:none}ui-list .ul-item--draggable img,ui-list .ul-item--draggable ui-image-preview{pointer-events:none;-webkit-user-drag:none}.ul-item--dragging{opacity:.5}.ul-item--over{outline:2px dashed #3b82f6;outline-offset:2px;border-radius:6px}@media(prefers-reduced-motion:reduce){.ul-item{transition:none}}@media(forced-colors:active){.ul-item.ul-item--moved{outline:2px solid Highlight;outline-offset:-2px}}@media(forced-colors:active){.ul-item.ul-item--dragging{outline:2px dotted Highlight;outline-offset:2px}.ul-item.ul-item--over{outline:2px dashed Highlight;outline-offset:2px}.ul-item--draggable:focus{outline:2px solid Highlight;outline-offset:2px}}.ul-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"]
29148
29881
  }]
29149
29882
  }],
29150
29883
  propDecorators: {
@@ -34098,6 +34831,7 @@ var DateRangePickerComponent = class DateRangePickerComponent {
34098
34831
  "min",
34099
34832
  "max",
34100
34833
  "hint",
34834
+ "ariaDescribedBy",
34101
34835
  "error",
34102
34836
  "showErrors",
34103
34837
  "disabled"
@@ -42473,6 +43207,10 @@ var ImageGalleryDialogComponent = class ImageGalleryDialogComponent {
42473
43207
  "dialogTestId",
42474
43208
  "hideClose",
42475
43209
  "closable",
43210
+ "layout",
43211
+ "closeOnBackdrop",
43212
+ "closeOnEscape",
43213
+ "busy",
42476
43214
  "returnFocusTo"
42477
43215
  ],
42478
43216
  outputs: ["close"]
@@ -45441,6 +46179,7 @@ var SetupWizardComponent = class SetupWizardComponent {
45441
46179
  "inputmode",
45442
46180
  "readonly",
45443
46181
  "hint",
46182
+ "ariaDescribedBy",
45444
46183
  "error",
45445
46184
  "phoneFormat",
45446
46185
  "min",
@@ -47500,6 +48239,7 @@ var EmailTemplateEditorComponent = class EmailTemplateEditorComponent {
47500
48239
  "min",
47501
48240
  "max",
47502
48241
  "hint",
48242
+ "ariaDescribedBy",
47503
48243
  "error",
47504
48244
  "showErrors",
47505
48245
  "disabled"
@@ -47593,6 +48333,7 @@ var EmailTemplateEditorComponent = class EmailTemplateEditorComponent {
47593
48333
  "valueType",
47594
48334
  "required",
47595
48335
  "hint",
48336
+ "ariaDescribedBy",
47596
48337
  "error",
47597
48338
  "showErrors",
47598
48339
  "size",
@@ -47653,6 +48394,7 @@ var EmailTemplateEditorComponent = class EmailTemplateEditorComponent {
47653
48394
  "inputmode",
47654
48395
  "readonly",
47655
48396
  "hint",
48397
+ "ariaDescribedBy",
47656
48398
  "error",
47657
48399
  "phoneFormat",
47658
48400
  "min",
@@ -48330,100 +49072,1113 @@ i0.ɵɵngDeclareClassMetadata({
48330
49072
  type: i0.Input,
48331
49073
  args: [{
48332
49074
  isSignal: true,
48333
- alias: "testSendEnabled",
48334
- required: false
49075
+ alias: "testSendEnabled",
49076
+ required: false
49077
+ }]
49078
+ }],
49079
+ saving: [{
49080
+ type: i0.Input,
49081
+ args: [{
49082
+ isSignal: true,
49083
+ alias: "saving",
49084
+ required: false
49085
+ }]
49086
+ }],
49087
+ testSending: [{
49088
+ type: i0.Input,
49089
+ args: [{
49090
+ isSignal: true,
49091
+ alias: "testSending",
49092
+ required: false
49093
+ }]
49094
+ }],
49095
+ videos: [{
49096
+ type: i0.Input,
49097
+ args: [{
49098
+ isSignal: true,
49099
+ alias: "videos",
49100
+ required: false
49101
+ }]
49102
+ }],
49103
+ hideVideos: [{
49104
+ type: i0.Input,
49105
+ args: [{
49106
+ isSignal: true,
49107
+ alias: "hideVideos",
49108
+ required: false
49109
+ }]
49110
+ }],
49111
+ videosLoading: [{
49112
+ type: i0.Input,
49113
+ args: [{
49114
+ isSignal: true,
49115
+ alias: "videosLoading",
49116
+ required: false
49117
+ }]
49118
+ }],
49119
+ videoDefaults: [{
49120
+ type: i0.Input,
49121
+ args: [{
49122
+ isSignal: true,
49123
+ alias: "videoDefaults",
49124
+ required: false
49125
+ }]
49126
+ }],
49127
+ videoLink: [{
49128
+ type: i0.Input,
49129
+ args: [{
49130
+ isSignal: true,
49131
+ alias: "videoLink",
49132
+ required: false
49133
+ }]
49134
+ }],
49135
+ noVideosHint: [{
49136
+ type: i0.Input,
49137
+ args: [{
49138
+ isSignal: true,
49139
+ alias: "noVideosHint",
49140
+ required: false
49141
+ }]
49142
+ }],
49143
+ save: [{
49144
+ type: i0.Output,
49145
+ args: ["save"]
49146
+ }],
49147
+ testSend: [{
49148
+ type: i0.Output,
49149
+ args: ["testSend"]
49150
+ }],
49151
+ videosRequested: [{
49152
+ type: i0.Output,
49153
+ args: ["videosRequested"]
49154
+ }],
49155
+ useAsMine: [{
49156
+ type: i0.Output,
49157
+ args: ["useAsMine"]
49158
+ }],
49159
+ blockEditors: [{
49160
+ type: i0.ViewChildren,
49161
+ args: ["blockEditor", { isSignal: true }]
49162
+ }],
49163
+ colorInputRef: [{
49164
+ type: i0.ViewChild,
49165
+ args: ["colorInput", { isSignal: true }]
49166
+ }]
49167
+ }
49168
+ });
49169
+ const facebookShareUrl = (url) => `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(url)}`;
49170
+ const xShareUrl = (url, text) => `https://twitter.com/intent/tweet?url=${encodeURIComponent(url)}&text=${encodeURIComponent(text)}`;
49171
+ const linkedInShareUrl = (url) => `https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(url)}`;
49172
+ const gmailShareUrl = (url, title) => `https://mail.google.com/mail/?view=cm&fs=1&su=${encodeURIComponent(title)}&body=${encodeURIComponent(`${title}\n\n${url}`)}`;
49173
+ const outlookShareUrl = (url, title) => `https://outlook.live.com/mail/0/deeplink/compose?subject=${encodeURIComponent(title)}&body=${encodeURIComponent(`${title}\n\n${url}`)}`;
49174
+ const emailShareUrl = (url, title) => `mailto:?subject=${encodeURIComponent(title)}&body=${encodeURIComponent(`${title}\n\n${url}`)}`;
49175
+ let nextShareMenuId = 0;
49176
+ var ShareMenuComponent = class ShareMenuComponent {
49177
+ constructor() {
49178
+ this.url = input.required(...ngDevMode ? [{ debugName: "url" }] : /* istanbul ignore next */ []);
49179
+ this.title = input.required(...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
49180
+ this.label = input("this page", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
49181
+ this.panelId = `ui-share-panel-${nextShareMenuId++}`;
49182
+ this.doc = inject(DOCUMENT);
49183
+ this.toast = inject(ToastService);
49184
+ this.injector = inject(Injector);
49185
+ this.host = inject(ElementRef);
49186
+ this.trigger = viewChild("trigger", ...ngDevMode ? [{ debugName: "trigger" }] : /* istanbul ignore next */ []);
49187
+ this.panel = viewChild("panel", ...ngDevMode ? [{ debugName: "panel" }] : /* istanbul ignore next */ []);
49188
+ this.open = signal(false, ...ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []);
49189
+ this.shiftX = signal(0, ...ngDevMode ? [{ debugName: "shiftX" }] : /* istanbul ignore next */ []);
49190
+ this.isTouchDevice = computed(() => this.doc.defaultView?.matchMedia?.("(pointer: coarse)").matches === true, ...ngDevMode ? [{ debugName: "isTouchDevice" }] : /* istanbul ignore next */ []);
49191
+ this.canNativeShare = computed(() => typeof this.doc.defaultView?.navigator?.share === "function" && this.isTouchDevice(), ...ngDevMode ? [{ debugName: "canNativeShare" }] : /* istanbul ignore next */ []);
49192
+ this.tiles = computed(() => [
49193
+ {
49194
+ value: "facebook",
49195
+ label: "Facebook",
49196
+ background: "#1877f2"
49197
+ },
49198
+ {
49199
+ value: "x",
49200
+ label: "X",
49201
+ background: "#000000"
49202
+ },
49203
+ {
49204
+ value: "linkedin",
49205
+ label: "LinkedIn",
49206
+ background: "#0a66c2"
49207
+ },
49208
+ ...this.isTouchDevice() ? [{
49209
+ value: "email",
49210
+ label: "Email",
49211
+ background: "#78716c"
49212
+ }] : [{
49213
+ value: "gmail",
49214
+ label: "Gmail",
49215
+ background: "#ea4335"
49216
+ }, {
49217
+ value: "outlook",
49218
+ label: "Outlook",
49219
+ background: "#0078d4"
49220
+ }],
49221
+ {
49222
+ value: "copy",
49223
+ label: "Copy link",
49224
+ background: "var(--ui-share-accent, var(--primary, #2563eb))"
49225
+ },
49226
+ ...this.canNativeShare() ? [{
49227
+ value: "native",
49228
+ label: "More",
49229
+ background: "#57534e"
49230
+ }] : []
49231
+ ], ...ngDevMode ? [{ debugName: "tiles" }] : /* istanbul ignore next */ []);
49232
+ this.links = computed(() => ({
49233
+ facebook: facebookShareUrl(this.url()),
49234
+ x: xShareUrl(this.url(), this.title()),
49235
+ linkedin: linkedInShareUrl(this.url()),
49236
+ email: emailShareUrl(this.url(), this.title()),
49237
+ gmail: gmailShareUrl(this.url(), this.title()),
49238
+ outlook: outlookShareUrl(this.url(), this.title())
49239
+ }), ...ngDevMode ? [{ debugName: "links" }] : /* istanbul ignore next */ []);
49240
+ }
49241
+ toggle(event) {
49242
+ event.stopPropagation();
49243
+ if (this.open()) this.close();
49244
+ else this.show();
49245
+ }
49246
+ show() {
49247
+ this.shiftX.set(0);
49248
+ this.open.set(true);
49249
+ afterNextRender(() => {
49250
+ const panel = this.panel()?.nativeElement;
49251
+ if (!panel) return;
49252
+ const view = this.doc.documentElement.clientWidth;
49253
+ const rect = panel.getBoundingClientRect();
49254
+ const margin = 8;
49255
+ if (rect.right > view - margin) this.shiftX.set(Math.round(view - margin - rect.right));
49256
+ else if (rect.left < margin) this.shiftX.set(Math.round(margin - rect.left));
49257
+ if (this.doc.activeElement === this.trigger()?.nativeElement) panel.querySelector("button")?.focus();
49258
+ }, { injector: this.injector });
49259
+ }
49260
+ close(returnFocus = false) {
49261
+ if (!this.open()) return;
49262
+ this.open.set(false);
49263
+ if (returnFocus) this.trigger()?.nativeElement.focus();
49264
+ }
49265
+ onEscape() {
49266
+ if (!this.open()) return;
49267
+ const focusInside = this.host.nativeElement.contains(this.doc.activeElement);
49268
+ this.close(focusInside);
49269
+ }
49270
+ onDocumentClick(event) {
49271
+ if (this.open() && !this.host.nativeElement.contains(event.target)) this.close();
49272
+ }
49273
+ onFocusOut(event) {
49274
+ const next = event.relatedTarget;
49275
+ if (this.open() && next && !this.host.nativeElement.contains(next)) this.close();
49276
+ }
49277
+ onPanelKeydown(event) {
49278
+ const options = Array.from(this.panel().nativeElement.querySelectorAll("button"));
49279
+ const i = options.indexOf(this.doc.activeElement);
49280
+ const to = event.key === "ArrowRight" ? (i + 1) % options.length : event.key === "ArrowLeft" ? (i - 1 + options.length) % options.length : event.key === "Home" ? 0 : event.key === "End" ? options.length - 1 : -1;
49281
+ if (to < 0) return;
49282
+ event.preventDefault();
49283
+ options[to].focus();
49284
+ }
49285
+ choose(option) {
49286
+ switch (option) {
49287
+ case "native":
49288
+ this.nativeShare();
49289
+ break;
49290
+ case "facebook":
49291
+ case "x":
49292
+ case "linkedin":
49293
+ case "gmail":
49294
+ case "outlook":
49295
+ this.doc.defaultView?.open(this.links()[option], "_blank", "noopener,noreferrer");
49296
+ break;
49297
+ case "email":
49298
+ this.email();
49299
+ break;
49300
+ case "copy": this.copy();
49301
+ }
49302
+ this.close(true);
49303
+ }
49304
+ async nativeShare() {
49305
+ try {
49306
+ await this.doc.defaultView.navigator.share({
49307
+ title: this.title(),
49308
+ url: this.url()
49309
+ });
49310
+ } catch (err) {
49311
+ if (err?.name !== "AbortError") this.toast.error("Sharing from this page isn't available here. Use one of the other options.");
49312
+ }
49313
+ }
49314
+ email() {
49315
+ const link = this.doc.createElement("a");
49316
+ link.href = this.links().email;
49317
+ link.rel = "noopener noreferrer";
49318
+ link.click();
49319
+ }
49320
+ async copy() {
49321
+ const url = this.url();
49322
+ try {
49323
+ await this.doc.defaultView.navigator.clipboard.writeText(url);
49324
+ this.toast.show("Link copied");
49325
+ return;
49326
+ } catch {}
49327
+ if (this.legacyCopy(url)) {
49328
+ this.toast.show("Link copied");
49329
+ return;
49330
+ }
49331
+ this.doc.defaultView?.prompt("Copy this link:", url);
49332
+ }
49333
+ legacyCopy(text) {
49334
+ const textarea = this.doc.createElement("textarea");
49335
+ textarea.value = text;
49336
+ textarea.setAttribute("readonly", "");
49337
+ textarea.style.position = "fixed";
49338
+ textarea.style.opacity = "0";
49339
+ this.doc.body.appendChild(textarea);
49340
+ try {
49341
+ textarea.select();
49342
+ textarea.setSelectionRange(0, text.length);
49343
+ return this.doc.execCommand("copy");
49344
+ } catch {
49345
+ return false;
49346
+ } finally {
49347
+ textarea.remove();
49348
+ }
49349
+ }
49350
+ static {
49351
+ this.ɵfac = i0.ɵɵngDeclareFactory({
49352
+ minVersion: "12.0.0",
49353
+ version: "22.2.2",
49354
+ ngImport: i0,
49355
+ type: ShareMenuComponent,
49356
+ deps: [],
49357
+ target: i0.ɵɵFactoryTarget.Component
49358
+ });
49359
+ }
49360
+ static {
49361
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
49362
+ minVersion: "17.0.0",
49363
+ version: "22.2.2",
49364
+ type: ShareMenuComponent,
49365
+ isStandalone: true,
49366
+ selector: "ui-share-menu",
49367
+ inputs: {
49368
+ url: {
49369
+ classPropertyName: "url",
49370
+ publicName: "url",
49371
+ isSignal: true,
49372
+ isRequired: true,
49373
+ transformFunction: null
49374
+ },
49375
+ title: {
49376
+ classPropertyName: "title",
49377
+ publicName: "title",
49378
+ isSignal: true,
49379
+ isRequired: true,
49380
+ transformFunction: null
49381
+ },
49382
+ label: {
49383
+ classPropertyName: "label",
49384
+ publicName: "label",
49385
+ isSignal: true,
49386
+ isRequired: false,
49387
+ transformFunction: null
49388
+ }
49389
+ },
49390
+ host: { listeners: {
49391
+ "document:keydown.escape": "onEscape()",
49392
+ "document:click": "onDocumentClick($event)",
49393
+ "focusout": "onFocusOut($event)"
49394
+ } },
49395
+ viewQueries: [{
49396
+ propertyName: "trigger",
49397
+ first: true,
49398
+ predicate: ["trigger"],
49399
+ descendants: true,
49400
+ isSignal: true
49401
+ }, {
49402
+ propertyName: "panel",
49403
+ first: true,
49404
+ predicate: ["panel"],
49405
+ descendants: true,
49406
+ isSignal: true
49407
+ }],
49408
+ ngImport: i0,
49409
+ template: `
49410
+ <div class="share-wrap">
49411
+ <button
49412
+ #trigger
49413
+ type="button"
49414
+ class="share-trigger"
49415
+ data-testid="share-trigger"
49416
+ [attr.aria-label]="'Share ' + label()"
49417
+ [attr.aria-expanded]="open()"
49418
+ [attr.aria-controls]="open() ? panelId : null"
49419
+ (click)="toggle($event)"
49420
+ >
49421
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
49422
+ <circle cx="18" cy="5" r="3"/><circle cx="6" cy="12" r="3"/><circle cx="18" cy="19" r="3"/>
49423
+ <line x1="8.59" y1="13.51" x2="15.42" y2="17.49"/><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"/>
49424
+ </svg>
49425
+ Share
49426
+ </button>
49427
+
49428
+ @if (open()) {
49429
+ <div
49430
+ #panel
49431
+ [id]="panelId"
49432
+ class="share-panel"
49433
+ role="group"
49434
+ aria-label="Share options"
49435
+ data-testid="share-panel"
49436
+ [style.transform]="'translateX(' + shiftX() + 'px)'"
49437
+ (keydown)="onPanelKeydown($event)"
49438
+ >
49439
+ @for (tile of tiles(); track tile.value) {
49440
+ <button type="button" class="share-tile" [attr.data-testid]="'share-' + tile.value" (click)="choose(tile.value)">
49441
+ <span class="share-icon" [style.background]="tile.background" aria-hidden="true">
49442
+ @switch (tile.value) {
49443
+ @case ('facebook') {
49444
+ <svg width="26" height="26" viewBox="0 0 24 24" fill="currentColor"><path d="M13.5 21v-7.5h2.6l.4-3h-3V8.6c0-.9.3-1.5 1.6-1.5h1.5V4.4c-.3 0-1.2-.1-2.3-.1-2.3 0-3.8 1.4-3.8 3.9v2.3H8v3h2.5V21h3z"/></svg>
49445
+ }
49446
+ @case ('x') {
49447
+ <svg width="22" height="22" viewBox="0 0 24 24" fill="currentColor"><path d="M17.8 3h3.1l-6.8 7.7L22 21h-6.2l-4.9-6.4L5.3 21H2.2l7.3-8.3L2 3h6.4l4.4 5.8L17.8 3zm-1.1 16.2h1.7L7.3 4.7H5.5l11.2 14.5z"/></svg>
49448
+ }
49449
+ @case ('linkedin') {
49450
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><path d="M6.9 8.9H3.6V20h3.3V8.9zM5.2 3.5a1.9 1.9 0 100 3.8 1.9 1.9 0 000-3.8zM20.4 13.4c0-3-1.6-4.7-4.1-4.7-1.2 0-2.2.6-2.7 1.4V8.9h-3.2V20h3.3v-6c0-1.4.7-2.4 1.9-2.4s1.5 1 1.5 2.4V20h3.3v-6.6z"/></svg>
49451
+ }
49452
+ @case ('email') {
49453
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2"/><path d="M3 7l9 6 9-6"/></svg>
49454
+ }
49455
+ @case ('gmail') {
49456
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2"/><path d="M3 7l9 6 9-6"/></svg>
49457
+ }
49458
+ @case ('outlook') {
49459
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2"/><path d="M3 7l9 6 9-6"/></svg>
49460
+ }
49461
+ @case ('copy') {
49462
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 007.1 0l3-3a5 5 0 00-7.1-7.1l-1.7 1.7"/><path d="M14 11a5 5 0 00-7.1 0l-3 3A5 5 0 0011 21l1.7-1.7"/></svg>
49463
+ }
49464
+ @case ('native') {
49465
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><circle cx="5" cy="12" r="2"/><circle cx="12" cy="12" r="2"/><circle cx="19" cy="12" r="2"/></svg>
49466
+ }
49467
+ }
49468
+ </span>
49469
+ <span class="share-name">{{ tile.label }}</span>
49470
+ </button>
49471
+ }
49472
+ </div>
49473
+ }
49474
+ </div>
49475
+ <ui-toast />
49476
+ `,
49477
+ isInline: true,
49478
+ styles: [":host{display:inline-block}.share-wrap{position:relative}.share-trigger{display:inline-flex;align-items:center;gap:.4rem;min-height:2.25rem;padding:.35rem .95rem;border:1px solid #d6d3d1;border-radius:9999px;background:#fff;color:#44403c;font-size:.875rem;font-weight:600;font-family:inherit;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent}.share-trigger:hover{border-color:#a8a29e;background:#fafaf9}.share-trigger[aria-expanded=true]{border-color:#78716c;background:#f5f5f4}.share-trigger:focus-visible,.share-tile:focus-visible{outline:2px solid var(--ui-share-accent, var(--primary, #2563eb));outline-offset:2px}@media(pointer:coarse){.share-trigger{min-height:2.75rem}}.share-panel{position:absolute;top:calc(100% + 8px);left:0;z-index:50;display:flex;align-items:flex-start;gap:4px;padding:14px 12px 10px;width:max-content;max-width:calc(100vw - 16px);overflow-x:auto;-webkit-overflow-scrolling:touch;background:#fff;border:1px solid #e7e5e4;border-radius:16px;box-shadow:0 10px 30px #1c19172e}.share-tile{display:flex;flex-direction:column;align-items:center;gap:6px;flex:none;width:64px;padding:2px 0;border:0;background:none;border-radius:10px;font-family:inherit;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent}.share-icon{display:flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:9999px;color:#fff;transition:transform .12s ease,box-shadow .12s ease}.share-tile:hover .share-icon{transform:translateY(-2px);box-shadow:0 4px 10px #1c191740}.share-name{font-size:.75rem;line-height:1.1;font-weight:500;color:#57534e;text-align:center}@media(max-width:480px){.share-panel{padding:12px 8px 8px;gap:2px}.share-tile{width:auto;min-width:48px;padding:2px 1px}.share-icon{width:44px;height:44px}.share-name{white-space:nowrap;font-size:.8125rem}}@media(prefers-reduced-motion:reduce){.share-icon{transition:none}.share-tile:hover .share-icon{transform:none}}\n"],
49479
+ dependencies: [{
49480
+ kind: "component",
49481
+ type: ToastComponent,
49482
+ selector: "ui-toast",
49483
+ inputs: ["dismissible", "persistentLiveRegion"]
49484
+ }],
49485
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
49486
+ });
49487
+ }
49488
+ };
49489
+ i0.ɵɵngDeclareClassMetadata({
49490
+ minVersion: "12.0.0",
49491
+ version: "22.2.2",
49492
+ ngImport: i0,
49493
+ type: ShareMenuComponent,
49494
+ decorators: [{
49495
+ type: Component,
49496
+ args: [{
49497
+ selector: "ui-share-menu",
49498
+ standalone: true,
49499
+ changeDetection: ChangeDetectionStrategy.OnPush,
49500
+ imports: [ToastComponent],
49501
+ host: {
49502
+ "(document:keydown.escape)": "onEscape()",
49503
+ "(document:click)": "onDocumentClick($event)",
49504
+ "(focusout)": "onFocusOut($event)"
49505
+ },
49506
+ template: `
49507
+ <div class="share-wrap">
49508
+ <button
49509
+ #trigger
49510
+ type="button"
49511
+ class="share-trigger"
49512
+ data-testid="share-trigger"
49513
+ [attr.aria-label]="'Share ' + label()"
49514
+ [attr.aria-expanded]="open()"
49515
+ [attr.aria-controls]="open() ? panelId : null"
49516
+ (click)="toggle($event)"
49517
+ >
49518
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
49519
+ <circle cx="18" cy="5" r="3"/><circle cx="6" cy="12" r="3"/><circle cx="18" cy="19" r="3"/>
49520
+ <line x1="8.59" y1="13.51" x2="15.42" y2="17.49"/><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"/>
49521
+ </svg>
49522
+ Share
49523
+ </button>
49524
+
49525
+ @if (open()) {
49526
+ <div
49527
+ #panel
49528
+ [id]="panelId"
49529
+ class="share-panel"
49530
+ role="group"
49531
+ aria-label="Share options"
49532
+ data-testid="share-panel"
49533
+ [style.transform]="'translateX(' + shiftX() + 'px)'"
49534
+ (keydown)="onPanelKeydown($event)"
49535
+ >
49536
+ @for (tile of tiles(); track tile.value) {
49537
+ <button type="button" class="share-tile" [attr.data-testid]="'share-' + tile.value" (click)="choose(tile.value)">
49538
+ <span class="share-icon" [style.background]="tile.background" aria-hidden="true">
49539
+ @switch (tile.value) {
49540
+ @case ('facebook') {
49541
+ <svg width="26" height="26" viewBox="0 0 24 24" fill="currentColor"><path d="M13.5 21v-7.5h2.6l.4-3h-3V8.6c0-.9.3-1.5 1.6-1.5h1.5V4.4c-.3 0-1.2-.1-2.3-.1-2.3 0-3.8 1.4-3.8 3.9v2.3H8v3h2.5V21h3z"/></svg>
49542
+ }
49543
+ @case ('x') {
49544
+ <svg width="22" height="22" viewBox="0 0 24 24" fill="currentColor"><path d="M17.8 3h3.1l-6.8 7.7L22 21h-6.2l-4.9-6.4L5.3 21H2.2l7.3-8.3L2 3h6.4l4.4 5.8L17.8 3zm-1.1 16.2h1.7L7.3 4.7H5.5l11.2 14.5z"/></svg>
49545
+ }
49546
+ @case ('linkedin') {
49547
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><path d="M6.9 8.9H3.6V20h3.3V8.9zM5.2 3.5a1.9 1.9 0 100 3.8 1.9 1.9 0 000-3.8zM20.4 13.4c0-3-1.6-4.7-4.1-4.7-1.2 0-2.2.6-2.7 1.4V8.9h-3.2V20h3.3v-6c0-1.4.7-2.4 1.9-2.4s1.5 1 1.5 2.4V20h3.3v-6.6z"/></svg>
49548
+ }
49549
+ @case ('email') {
49550
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2"/><path d="M3 7l9 6 9-6"/></svg>
49551
+ }
49552
+ @case ('gmail') {
49553
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2"/><path d="M3 7l9 6 9-6"/></svg>
49554
+ }
49555
+ @case ('outlook') {
49556
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2"/><path d="M3 7l9 6 9-6"/></svg>
49557
+ }
49558
+ @case ('copy') {
49559
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 007.1 0l3-3a5 5 0 00-7.1-7.1l-1.7 1.7"/><path d="M14 11a5 5 0 00-7.1 0l-3 3A5 5 0 0011 21l1.7-1.7"/></svg>
49560
+ }
49561
+ @case ('native') {
49562
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="currentColor"><circle cx="5" cy="12" r="2"/><circle cx="12" cy="12" r="2"/><circle cx="19" cy="12" r="2"/></svg>
49563
+ }
49564
+ }
49565
+ </span>
49566
+ <span class="share-name">{{ tile.label }}</span>
49567
+ </button>
49568
+ }
49569
+ </div>
49570
+ }
49571
+ </div>
49572
+ <ui-toast />
49573
+ `,
49574
+ styles: [":host{display:inline-block}.share-wrap{position:relative}.share-trigger{display:inline-flex;align-items:center;gap:.4rem;min-height:2.25rem;padding:.35rem .95rem;border:1px solid #d6d3d1;border-radius:9999px;background:#fff;color:#44403c;font-size:.875rem;font-weight:600;font-family:inherit;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent}.share-trigger:hover{border-color:#a8a29e;background:#fafaf9}.share-trigger[aria-expanded=true]{border-color:#78716c;background:#f5f5f4}.share-trigger:focus-visible,.share-tile:focus-visible{outline:2px solid var(--ui-share-accent, var(--primary, #2563eb));outline-offset:2px}@media(pointer:coarse){.share-trigger{min-height:2.75rem}}.share-panel{position:absolute;top:calc(100% + 8px);left:0;z-index:50;display:flex;align-items:flex-start;gap:4px;padding:14px 12px 10px;width:max-content;max-width:calc(100vw - 16px);overflow-x:auto;-webkit-overflow-scrolling:touch;background:#fff;border:1px solid #e7e5e4;border-radius:16px;box-shadow:0 10px 30px #1c19172e}.share-tile{display:flex;flex-direction:column;align-items:center;gap:6px;flex:none;width:64px;padding:2px 0;border:0;background:none;border-radius:10px;font-family:inherit;cursor:pointer;touch-action:manipulation;-webkit-tap-highlight-color:transparent}.share-icon{display:flex;align-items:center;justify-content:center;width:52px;height:52px;border-radius:9999px;color:#fff;transition:transform .12s ease,box-shadow .12s ease}.share-tile:hover .share-icon{transform:translateY(-2px);box-shadow:0 4px 10px #1c191740}.share-name{font-size:.75rem;line-height:1.1;font-weight:500;color:#57534e;text-align:center}@media(max-width:480px){.share-panel{padding:12px 8px 8px;gap:2px}.share-tile{width:auto;min-width:48px;padding:2px 1px}.share-icon{width:44px;height:44px}.share-name{white-space:nowrap;font-size:.8125rem}}@media(prefers-reduced-motion:reduce){.share-icon{transition:none}.share-tile:hover .share-icon{transform:none}}\n"]
49575
+ }]
49576
+ }],
49577
+ propDecorators: {
49578
+ url: [{
49579
+ type: i0.Input,
49580
+ args: [{
49581
+ isSignal: true,
49582
+ alias: "url",
49583
+ required: true
48335
49584
  }]
48336
49585
  }],
48337
- saving: [{
49586
+ title: [{
48338
49587
  type: i0.Input,
48339
49588
  args: [{
48340
49589
  isSignal: true,
48341
- alias: "saving",
48342
- required: false
49590
+ alias: "title",
49591
+ required: true
48343
49592
  }]
48344
49593
  }],
48345
- testSending: [{
49594
+ label: [{
48346
49595
  type: i0.Input,
48347
49596
  args: [{
48348
49597
  isSignal: true,
48349
- alias: "testSending",
49598
+ alias: "label",
48350
49599
  required: false
48351
49600
  }]
48352
49601
  }],
48353
- videos: [{
48354
- type: i0.Input,
48355
- args: [{
48356
- isSignal: true,
48357
- alias: "videos",
48358
- required: false
48359
- }]
49602
+ trigger: [{
49603
+ type: i0.ViewChild,
49604
+ args: ["trigger", { isSignal: true }]
48360
49605
  }],
48361
- hideVideos: [{
49606
+ panel: [{
49607
+ type: i0.ViewChild,
49608
+ args: ["panel", { isSignal: true }]
49609
+ }]
49610
+ }
49611
+ });
49612
+ var SnackbarService = class SnackbarService {
49613
+ constructor() {
49614
+ this._messages = signal([], ...ngDevMode ? [{ debugName: "_messages" }] : /* istanbul ignore next */ []);
49615
+ this.nextId = 0;
49616
+ this.timers = /* @__PURE__ */ new Map();
49617
+ }
49618
+ messages$() {
49619
+ return [...this._messages()];
49620
+ }
49621
+ showSuccess(message, duration = 5e3) {
49622
+ this.show(message, "success", duration);
49623
+ }
49624
+ showError(message, duration = 5e3) {
49625
+ this.show(message, "error", duration);
49626
+ }
49627
+ showInfo(message, duration = 5e3, action) {
49628
+ this.show(message, "info", duration, action);
49629
+ }
49630
+ show(message, type, duration, action) {
49631
+ const id = this.nextId++;
49632
+ this._messages.update((messages) => [...messages, {
49633
+ id,
49634
+ message,
49635
+ type,
49636
+ action
49637
+ }]);
49638
+ if (duration > 0) this.timers.set(id, setTimeout(() => this.dismiss(id), duration));
49639
+ }
49640
+ dismiss(id) {
49641
+ const timer = this.timers.get(id);
49642
+ if (timer) {
49643
+ clearTimeout(timer);
49644
+ this.timers.delete(id);
49645
+ }
49646
+ this._messages.update((messages) => messages.filter((m) => m.id !== id));
49647
+ }
49648
+ static {
49649
+ this.ɵfac = i0.ɵɵngDeclareFactory({
49650
+ minVersion: "12.0.0",
49651
+ version: "22.2.2",
49652
+ ngImport: i0,
49653
+ type: SnackbarService,
49654
+ deps: [],
49655
+ target: i0.ɵɵFactoryTarget.Injectable
49656
+ });
49657
+ }
49658
+ static {
49659
+ this.ɵprov = i0.ɵɵngDeclareInjectable({
49660
+ minVersion: "12.0.0",
49661
+ version: "22.2.2",
49662
+ ngImport: i0,
49663
+ type: SnackbarService,
49664
+ providedIn: "root"
49665
+ });
49666
+ }
49667
+ };
49668
+ i0.ɵɵngDeclareClassMetadata({
49669
+ minVersion: "12.0.0",
49670
+ version: "22.2.2",
49671
+ ngImport: i0,
49672
+ type: SnackbarService,
49673
+ decorators: [{
49674
+ type: Injectable,
49675
+ args: [{ providedIn: "root" }]
49676
+ }]
49677
+ });
49678
+ var SnackbarComponent = class SnackbarComponent {
49679
+ constructor() {
49680
+ this.service = inject(SnackbarService);
49681
+ this.messages = computed(() => this.service.messages$(), ...ngDevMode ? [{ debugName: "messages" }] : /* istanbul ignore next */ []);
49682
+ }
49683
+ variant(m) {
49684
+ return m.type === "error" ? "danger" : m.type;
49685
+ }
49686
+ dismiss(id) {
49687
+ this.service.dismiss(id);
49688
+ }
49689
+ runAction(m, callback) {
49690
+ callback();
49691
+ this.service.dismiss(m.id);
49692
+ }
49693
+ static {
49694
+ this.ɵfac = i0.ɵɵngDeclareFactory({
49695
+ minVersion: "12.0.0",
49696
+ version: "22.2.2",
49697
+ ngImport: i0,
49698
+ type: SnackbarComponent,
49699
+ deps: [],
49700
+ target: i0.ɵɵFactoryTarget.Component
49701
+ });
49702
+ }
49703
+ static {
49704
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
49705
+ minVersion: "17.0.0",
49706
+ version: "22.2.2",
49707
+ type: SnackbarComponent,
49708
+ isStandalone: true,
49709
+ selector: "ui-snackbar",
49710
+ ngImport: i0,
49711
+ template: `
49712
+ <div class="sb-stack" role="region" aria-label="Notifications" aria-live="polite">
49713
+ @for (m of messages(); track m.id) {
49714
+ <ui-alert class="sb-item" [variant]="variant(m)" [dismissible]="true" dismissAriaLabel="Dismiss notification"
49715
+ [attr.data-testid]="m.type + '-message'" (dismissed)="dismiss(m.id)">
49716
+ <span class="sb-text">{{ m.message }}</span>
49717
+ @if (m.action; as act) {
49718
+ <ui-button variant="link" size="sm" data-testid="snackbar-action" (click)="runAction(m, act.callback)">{{ act.label }}</ui-button>
49719
+ }
49720
+ </ui-alert>
49721
+ }
49722
+ </div>
49723
+ `,
49724
+ isInline: true,
49725
+ styles: [":host{display:contents}.sb-stack{position:fixed;top:16px;right:16px;z-index:9999;display:flex;flex-direction:column;gap:8px;width:20rem;max-width:calc(100vw - 32px);pointer-events:none}.sb-item{pointer-events:auto;box-shadow:0 8px 20px #0f172a2e;border-radius:8px;animation:sb-in .28s cubic-bezier(.16,1,.3,1)}.sb-text{min-width:0;overflow-wrap:anywhere}@keyframes sb-in{0%{opacity:0;transform:translate(24px)}to{opacity:1;transform:translate(0)}}@media(prefers-reduced-motion:reduce){.sb-item{animation:none}}\n"],
49726
+ dependencies: [{
49727
+ kind: "component",
49728
+ type: AlertComponent,
49729
+ selector: "ui-alert",
49730
+ inputs: [
49731
+ "variant",
49732
+ "title",
49733
+ "dismissible",
49734
+ "dismissAriaLabel",
49735
+ "quiet",
49736
+ "compact",
49737
+ "inline",
49738
+ "fill"
49739
+ ],
49740
+ outputs: ["dismissed"]
49741
+ }, {
49742
+ kind: "component",
49743
+ type: ButtonComponent,
49744
+ selector: "ui-button",
49745
+ inputs: [
49746
+ "variant",
49747
+ "routerLink",
49748
+ "queryParams",
49749
+ "fragment",
49750
+ "state",
49751
+ "href",
49752
+ "target",
49753
+ "rel",
49754
+ "shortLabel",
49755
+ "shortBelow",
49756
+ "color",
49757
+ "active",
49758
+ "size",
49759
+ "type",
49760
+ "disabled",
49761
+ "loading",
49762
+ "fullWidth",
49763
+ "ariaLabel",
49764
+ "ariaExpanded",
49765
+ "ariaPressed",
49766
+ "ariaDescribedBy",
49767
+ "modal-footer-left",
49768
+ "modal-footer-right"
49769
+ ]
49770
+ }],
49771
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
49772
+ });
49773
+ }
49774
+ };
49775
+ i0.ɵɵngDeclareClassMetadata({
49776
+ minVersion: "12.0.0",
49777
+ version: "22.2.2",
49778
+ ngImport: i0,
49779
+ type: SnackbarComponent,
49780
+ decorators: [{
49781
+ type: Component,
49782
+ args: [{
49783
+ selector: "ui-snackbar",
49784
+ standalone: true,
49785
+ changeDetection: ChangeDetectionStrategy.OnPush,
49786
+ imports: [AlertComponent, ButtonComponent],
49787
+ template: `
49788
+ <div class="sb-stack" role="region" aria-label="Notifications" aria-live="polite">
49789
+ @for (m of messages(); track m.id) {
49790
+ <ui-alert class="sb-item" [variant]="variant(m)" [dismissible]="true" dismissAriaLabel="Dismiss notification"
49791
+ [attr.data-testid]="m.type + '-message'" (dismissed)="dismiss(m.id)">
49792
+ <span class="sb-text">{{ m.message }}</span>
49793
+ @if (m.action; as act) {
49794
+ <ui-button variant="link" size="sm" data-testid="snackbar-action" (click)="runAction(m, act.callback)">{{ act.label }}</ui-button>
49795
+ }
49796
+ </ui-alert>
49797
+ }
49798
+ </div>
49799
+ `,
49800
+ styles: [":host{display:contents}.sb-stack{position:fixed;top:16px;right:16px;z-index:9999;display:flex;flex-direction:column;gap:8px;width:20rem;max-width:calc(100vw - 32px);pointer-events:none}.sb-item{pointer-events:auto;box-shadow:0 8px 20px #0f172a2e;border-radius:8px;animation:sb-in .28s cubic-bezier(.16,1,.3,1)}.sb-text{min-width:0;overflow-wrap:anywhere}@keyframes sb-in{0%{opacity:0;transform:translate(24px)}to{opacity:1;transform:translate(0)}}@media(prefers-reduced-motion:reduce){.sb-item{animation:none}}\n"]
49801
+ }]
49802
+ }]
49803
+ });
49804
+ var OfflineBannerComponent = class OfflineBannerComponent {
49805
+ constructor() {
49806
+ this.title = input("You are currently offline", ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
49807
+ this.message = input("Some features may not work properly. Please check your internet connection.", ...ngDevMode ? [{ debugName: "message" }] : /* istanbul ignore next */ []);
49808
+ this.offline = input(null, ...ngDevMode ? [{ debugName: "offline" }] : /* istanbul ignore next */ []);
49809
+ this.browserOffline = signal(false, ...ngDevMode ? [{ debugName: "browserOffline" }] : /* istanbul ignore next */ []);
49810
+ this.dismissed = signal(false, ...ngDevMode ? [{ debugName: "dismissed" }] : /* istanbul ignore next */ []);
49811
+ this.isOffline = computed(() => this.offline() ?? this.browserOffline(), ...ngDevMode ? [{ debugName: "isOffline" }] : /* istanbul ignore next */ []);
49812
+ this.visible = computed(() => this.isOffline() && !this.dismissed(), ...ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []);
49813
+ const win = inject(DOCUMENT).defaultView;
49814
+ if (!win) return;
49815
+ this.browserOffline.set(win.navigator.onLine === false);
49816
+ const goOffline = () => this.browserOffline.set(true);
49817
+ const goOnline = () => {
49818
+ this.browserOffline.set(false);
49819
+ this.dismissed.set(false);
49820
+ };
49821
+ win.addEventListener("offline", goOffline);
49822
+ win.addEventListener("online", goOnline);
49823
+ inject(DestroyRef).onDestroy(() => {
49824
+ win.removeEventListener("offline", goOffline);
49825
+ win.removeEventListener("online", goOnline);
49826
+ });
49827
+ }
49828
+ dismiss() {
49829
+ this.dismissed.set(true);
49830
+ }
49831
+ static {
49832
+ this.ɵfac = i0.ɵɵngDeclareFactory({
49833
+ minVersion: "12.0.0",
49834
+ version: "22.2.2",
49835
+ ngImport: i0,
49836
+ type: OfflineBannerComponent,
49837
+ deps: [],
49838
+ target: i0.ɵɵFactoryTarget.Component
49839
+ });
49840
+ }
49841
+ static {
49842
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
49843
+ minVersion: "17.0.0",
49844
+ version: "22.2.2",
49845
+ type: OfflineBannerComponent,
49846
+ isStandalone: true,
49847
+ selector: "ui-offline-banner",
49848
+ inputs: {
49849
+ title: {
49850
+ classPropertyName: "title",
49851
+ publicName: "title",
49852
+ isSignal: true,
49853
+ isRequired: false,
49854
+ transformFunction: null
49855
+ },
49856
+ message: {
49857
+ classPropertyName: "message",
49858
+ publicName: "message",
49859
+ isSignal: true,
49860
+ isRequired: false,
49861
+ transformFunction: null
49862
+ },
49863
+ offline: {
49864
+ classPropertyName: "offline",
49865
+ publicName: "offline",
49866
+ isSignal: true,
49867
+ isRequired: false,
49868
+ transformFunction: null
49869
+ }
49870
+ },
49871
+ ngImport: i0,
49872
+ template: `
49873
+ @if (visible()) {
49874
+ <div class="ob-bar" data-testid="offline-banner">
49875
+ <ui-alert variant="warning" [title]="title()" [dismissible]="true" dismissAriaLabel="Dismiss offline notification" (dismissed)="dismiss()">{{ message() }}</ui-alert>
49876
+ </div>
49877
+ }
49878
+ `,
49879
+ isInline: true,
49880
+ styles: [":host{display:contents}.ob-bar{position:fixed;top:0;left:0;right:0;z-index:9999;padding:8px 16px;pointer-events:none}.ob-bar ui-alert{pointer-events:auto;max-width:1200px;margin:0 auto;box-shadow:0 4px 12px #0f172a26;border-radius:8px}\n"],
49881
+ dependencies: [{
49882
+ kind: "component",
49883
+ type: AlertComponent,
49884
+ selector: "ui-alert",
49885
+ inputs: [
49886
+ "variant",
49887
+ "title",
49888
+ "dismissible",
49889
+ "dismissAriaLabel",
49890
+ "quiet",
49891
+ "compact",
49892
+ "inline",
49893
+ "fill"
49894
+ ],
49895
+ outputs: ["dismissed"]
49896
+ }],
49897
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
49898
+ });
49899
+ }
49900
+ };
49901
+ i0.ɵɵngDeclareClassMetadata({
49902
+ minVersion: "12.0.0",
49903
+ version: "22.2.2",
49904
+ ngImport: i0,
49905
+ type: OfflineBannerComponent,
49906
+ decorators: [{
49907
+ type: Component,
49908
+ args: [{
49909
+ selector: "ui-offline-banner",
49910
+ standalone: true,
49911
+ changeDetection: ChangeDetectionStrategy.OnPush,
49912
+ imports: [AlertComponent],
49913
+ template: `
49914
+ @if (visible()) {
49915
+ <div class="ob-bar" data-testid="offline-banner">
49916
+ <ui-alert variant="warning" [title]="title()" [dismissible]="true" dismissAriaLabel="Dismiss offline notification" (dismissed)="dismiss()">{{ message() }}</ui-alert>
49917
+ </div>
49918
+ }
49919
+ `,
49920
+ styles: [":host{display:contents}.ob-bar{position:fixed;top:0;left:0;right:0;z-index:9999;padding:8px 16px;pointer-events:none}.ob-bar ui-alert{pointer-events:auto;max-width:1200px;margin:0 auto;box-shadow:0 4px 12px #0f172a26;border-radius:8px}\n"]
49921
+ }]
49922
+ }],
49923
+ ctorParameters: () => [],
49924
+ propDecorators: {
49925
+ title: [{
48362
49926
  type: i0.Input,
48363
49927
  args: [{
48364
49928
  isSignal: true,
48365
- alias: "hideVideos",
49929
+ alias: "title",
48366
49930
  required: false
48367
49931
  }]
48368
49932
  }],
48369
- videosLoading: [{
49933
+ message: [{
48370
49934
  type: i0.Input,
48371
49935
  args: [{
48372
49936
  isSignal: true,
48373
- alias: "videosLoading",
49937
+ alias: "message",
48374
49938
  required: false
48375
49939
  }]
48376
49940
  }],
48377
- videoDefaults: [{
49941
+ offline: [{
48378
49942
  type: i0.Input,
48379
49943
  args: [{
48380
49944
  isSignal: true,
48381
- alias: "videoDefaults",
49945
+ alias: "offline",
48382
49946
  required: false
48383
49947
  }]
48384
- }],
48385
- videoLink: [{
49948
+ }]
49949
+ }
49950
+ });
49951
+ var ReminderAlertsComponent = class ReminderAlertsComponent {
49952
+ constructor() {
49953
+ this.items = input([], ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
49954
+ this.ariaLabel = input("Alerts", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
49955
+ this.action = output();
49956
+ this.hidden = output();
49957
+ }
49958
+ variant(item) {
49959
+ return item.tone;
49960
+ }
49961
+ static {
49962
+ this.ɵfac = i0.ɵɵngDeclareFactory({
49963
+ minVersion: "12.0.0",
49964
+ version: "22.2.2",
49965
+ ngImport: i0,
49966
+ type: ReminderAlertsComponent,
49967
+ deps: [],
49968
+ target: i0.ɵɵFactoryTarget.Component
49969
+ });
49970
+ }
49971
+ static {
49972
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
49973
+ minVersion: "17.0.0",
49974
+ version: "22.2.2",
49975
+ type: ReminderAlertsComponent,
49976
+ isStandalone: true,
49977
+ selector: "ui-reminder-alerts",
49978
+ inputs: {
49979
+ items: {
49980
+ classPropertyName: "items",
49981
+ publicName: "items",
49982
+ isSignal: true,
49983
+ isRequired: false,
49984
+ transformFunction: null
49985
+ },
49986
+ ariaLabel: {
49987
+ classPropertyName: "ariaLabel",
49988
+ publicName: "ariaLabel",
49989
+ isSignal: true,
49990
+ isRequired: false,
49991
+ transformFunction: null
49992
+ }
49993
+ },
49994
+ outputs: {
49995
+ action: "action",
49996
+ hidden: "hidden"
49997
+ },
49998
+ ngImport: i0,
49999
+ template: `
50000
+ @if (items().length) {
50001
+ <div class="ra-stack" role="region" [attr.aria-label]="ariaLabel()" aria-live="polite">
50002
+ @for (item of items(); track item.id) {
50003
+ <ui-alert class="ra-item" [variant]="variant(item)" [attr.data-testid]="'reminder-alert-' + item.id">
50004
+ <div class="ra-body">
50005
+ <ui-button class="ra-hide" variant="icon" size="xs" [ariaLabel]="item.hideLabel || 'Hide alert'" [attr.data-testid]="item.hideTestId || 'alert-hide'" (click)="hidden.emit(item)">
50006
+ <ui-icon name="close" [size]="14" [interactive]="false" />
50007
+ </ui-button>
50008
+ <span class="ra-label">{{ item.label }}</span>
50009
+ <p class="ra-title">{{ item.title }}</p>
50010
+ @if (item.badge; as b) {
50011
+ <ui-badge class="ra-badge" role="img" variant="purple" [label]="b.label" [attr.aria-label]="b.ariaLabel || b.label" [attr.title]="b.ariaLabel || b.label" [attr.data-testid]="b.testId || 'alert-badge'" />
50012
+ }
50013
+ @for (line of item.lines ?? []; track $index) {
50014
+ <p class="ra-line">{{ line }}</p>
50015
+ }
50016
+ @if (item.actions?.length) {
50017
+ <div class="ra-actions">
50018
+ @for (a of item.actions; track a.id) {
50019
+ <ui-button [variant]="a.variant || 'secondary'" size="xs" [attr.data-testid]="'alert-' + a.id" (click)="action.emit({ item, actionId: a.id })">{{ a.label }}</ui-button>
50020
+ }
50021
+ </div>
50022
+ }
50023
+ </div>
50024
+ </ui-alert>
50025
+ }
50026
+ </div>
50027
+ }
50028
+ `,
50029
+ isInline: true,
50030
+ styles: [":host{display:contents}.ra-stack{position:fixed;top:16px;right:16px;z-index:9990;display:flex;flex-direction:column;gap:8px;width:24rem;max-width:calc(100vw - 32px);pointer-events:none}.ra-item{pointer-events:auto;box-shadow:0 8px 20px #0f172a2e;border-radius:8px;animation:ra-in .3s ease-out}.ra-body{position:relative;display:flex;flex-direction:column;gap:2px;min-width:0;width:100%;padding-right:28px}.ra-hide{position:absolute;top:-4px;right:-4px}.ra-label{font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.02em}.ra-title{margin:0;font-size:.875rem;font-weight:600;overflow-wrap:anywhere}.ra-line{margin:0;font-size:.75rem;overflow-wrap:anywhere}.ra-badge{align-self:flex-start;max-width:100%;overflow:hidden}.ra-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}@keyframes ra-in{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}@media(prefers-reduced-motion:reduce){.ra-item{animation:none}}\n"],
50031
+ dependencies: [
50032
+ {
50033
+ kind: "component",
50034
+ type: AlertComponent,
50035
+ selector: "ui-alert",
50036
+ inputs: [
50037
+ "variant",
50038
+ "title",
50039
+ "dismissible",
50040
+ "dismissAriaLabel",
50041
+ "quiet",
50042
+ "compact",
50043
+ "inline",
50044
+ "fill"
50045
+ ],
50046
+ outputs: ["dismissed"]
50047
+ },
50048
+ {
50049
+ kind: "component",
50050
+ type: BadgeComponent,
50051
+ selector: "ui-badge",
50052
+ inputs: ["label", "variant"]
50053
+ },
50054
+ {
50055
+ kind: "component",
50056
+ type: ButtonComponent,
50057
+ selector: "ui-button",
50058
+ inputs: [
50059
+ "variant",
50060
+ "routerLink",
50061
+ "queryParams",
50062
+ "fragment",
50063
+ "state",
50064
+ "href",
50065
+ "target",
50066
+ "rel",
50067
+ "shortLabel",
50068
+ "shortBelow",
50069
+ "color",
50070
+ "active",
50071
+ "size",
50072
+ "type",
50073
+ "disabled",
50074
+ "loading",
50075
+ "fullWidth",
50076
+ "ariaLabel",
50077
+ "ariaExpanded",
50078
+ "ariaPressed",
50079
+ "ariaDescribedBy",
50080
+ "modal-footer-left",
50081
+ "modal-footer-right"
50082
+ ]
50083
+ },
50084
+ {
50085
+ kind: "component",
50086
+ type: IconComponent,
50087
+ selector: "ui-icon",
50088
+ inputs: [
50089
+ "name",
50090
+ "tooltip",
50091
+ "ariaLabel",
50092
+ "size",
50093
+ "variant",
50094
+ "disabled",
50095
+ "loading",
50096
+ "interactive"
50097
+ ],
50098
+ outputs: ["iconClick"]
50099
+ }
50100
+ ],
50101
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
50102
+ });
50103
+ }
50104
+ };
50105
+ i0.ɵɵngDeclareClassMetadata({
50106
+ minVersion: "12.0.0",
50107
+ version: "22.2.2",
50108
+ ngImport: i0,
50109
+ type: ReminderAlertsComponent,
50110
+ decorators: [{
50111
+ type: Component,
50112
+ args: [{
50113
+ selector: "ui-reminder-alerts",
50114
+ standalone: true,
50115
+ changeDetection: ChangeDetectionStrategy.OnPush,
50116
+ imports: [
50117
+ AlertComponent,
50118
+ BadgeComponent,
50119
+ ButtonComponent,
50120
+ IconComponent
50121
+ ],
50122
+ template: `
50123
+ @if (items().length) {
50124
+ <div class="ra-stack" role="region" [attr.aria-label]="ariaLabel()" aria-live="polite">
50125
+ @for (item of items(); track item.id) {
50126
+ <ui-alert class="ra-item" [variant]="variant(item)" [attr.data-testid]="'reminder-alert-' + item.id">
50127
+ <div class="ra-body">
50128
+ <ui-button class="ra-hide" variant="icon" size="xs" [ariaLabel]="item.hideLabel || 'Hide alert'" [attr.data-testid]="item.hideTestId || 'alert-hide'" (click)="hidden.emit(item)">
50129
+ <ui-icon name="close" [size]="14" [interactive]="false" />
50130
+ </ui-button>
50131
+ <span class="ra-label">{{ item.label }}</span>
50132
+ <p class="ra-title">{{ item.title }}</p>
50133
+ @if (item.badge; as b) {
50134
+ <ui-badge class="ra-badge" role="img" variant="purple" [label]="b.label" [attr.aria-label]="b.ariaLabel || b.label" [attr.title]="b.ariaLabel || b.label" [attr.data-testid]="b.testId || 'alert-badge'" />
50135
+ }
50136
+ @for (line of item.lines ?? []; track $index) {
50137
+ <p class="ra-line">{{ line }}</p>
50138
+ }
50139
+ @if (item.actions?.length) {
50140
+ <div class="ra-actions">
50141
+ @for (a of item.actions; track a.id) {
50142
+ <ui-button [variant]="a.variant || 'secondary'" size="xs" [attr.data-testid]="'alert-' + a.id" (click)="action.emit({ item, actionId: a.id })">{{ a.label }}</ui-button>
50143
+ }
50144
+ </div>
50145
+ }
50146
+ </div>
50147
+ </ui-alert>
50148
+ }
50149
+ </div>
50150
+ }
50151
+ `,
50152
+ styles: [":host{display:contents}.ra-stack{position:fixed;top:16px;right:16px;z-index:9990;display:flex;flex-direction:column;gap:8px;width:24rem;max-width:calc(100vw - 32px);pointer-events:none}.ra-item{pointer-events:auto;box-shadow:0 8px 20px #0f172a2e;border-radius:8px;animation:ra-in .3s ease-out}.ra-body{position:relative;display:flex;flex-direction:column;gap:2px;min-width:0;width:100%;padding-right:28px}.ra-hide{position:absolute;top:-4px;right:-4px}.ra-label{font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.02em}.ra-title{margin:0;font-size:.875rem;font-weight:600;overflow-wrap:anywhere}.ra-line{margin:0;font-size:.75rem;overflow-wrap:anywhere}.ra-badge{align-self:flex-start;max-width:100%;overflow:hidden}.ra-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}@keyframes ra-in{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}@media(prefers-reduced-motion:reduce){.ra-item{animation:none}}\n"]
50153
+ }]
50154
+ }],
50155
+ propDecorators: {
50156
+ items: [{
48386
50157
  type: i0.Input,
48387
50158
  args: [{
48388
50159
  isSignal: true,
48389
- alias: "videoLink",
50160
+ alias: "items",
48390
50161
  required: false
48391
50162
  }]
48392
50163
  }],
48393
- noVideosHint: [{
50164
+ ariaLabel: [{
48394
50165
  type: i0.Input,
48395
50166
  args: [{
48396
50167
  isSignal: true,
48397
- alias: "noVideosHint",
50168
+ alias: "ariaLabel",
48398
50169
  required: false
48399
50170
  }]
48400
50171
  }],
48401
- save: [{
48402
- type: i0.Output,
48403
- args: ["save"]
48404
- }],
48405
- testSend: [{
48406
- type: i0.Output,
48407
- args: ["testSend"]
48408
- }],
48409
- videosRequested: [{
50172
+ action: [{
48410
50173
  type: i0.Output,
48411
- args: ["videosRequested"]
50174
+ args: ["action"]
48412
50175
  }],
48413
- useAsMine: [{
50176
+ hidden: [{
48414
50177
  type: i0.Output,
48415
- args: ["useAsMine"]
48416
- }],
48417
- blockEditors: [{
48418
- type: i0.ViewChildren,
48419
- args: ["blockEditor", { isSignal: true }]
48420
- }],
48421
- colorInputRef: [{
48422
- type: i0.ViewChild,
48423
- args: ["colorInput", { isSignal: true }]
50178
+ args: ["hidden"]
48424
50179
  }]
48425
50180
  }
48426
50181
  });
48427
- export { ActionBarComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BarRowComponent, BoardCardDirective, BoardComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, CalendarComponent, CardListItemComponent, CheckboxComponent, CheckboxTrailingDirective, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, DEFAULT_EMAIL_TEMPLATE_BLOCK_GROUPS, DEFAULT_EMAIL_TEMPLATE_VARIABLE_GROUPS, DEFAULT_PASSWORD_RULES, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DropdownComponent, EMAIL_BLOCK_DRAG_TYPE, EMAIL_TEMPLATE_MAX_BODY, EMAIL_TEMPLATE_MAX_TEXT, EMAIL_TEMPLATE_START_TEXT, EmailTemplateEditorComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FadeComponent, FileInputComponent, FixedFooterComponent, FormColSpanDirective, FormComponent, FormRowComponent, FormSectionComponent, HintComponent, IDX_BEHAVIOR_SIGNALS, INTEGRATION_CATALOG, INTEGRATION_FIELD_DEFS, INTEGRATION_GROUP_ORDER, INTEGRATION_OPTION_DEFS, IconComponent, ImageComponent, ImageGalleryComponent, ImageGalleryDialogComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, ImportSourceGridComponent, KpiCardComponent, LAYOUT_GAP_PX, ListComponent, ListItemComponent, LiveRegionComponent, MAX_EMAIL_ADDRESS_LENGTH, ModalComponent, MoreMenuComponent, MultiSelectComponent, NOTES_MAX_LENGTH, NotesComponent, OptionCardComponent, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PageComponent, PaginationComponent, PanelInfoListComponent, PasswordRequirementsComponent, PdfHotspotComponent, PhoneNumberPickerComponent, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, RadioOptionContentDirective, ReadonlyFieldsetComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SETUP_DONE_KEY, SETUP_INTEGRATIONS, SearchInputComponent, SectionHeaderComponent, SelectComponent, SetupWizardComponent, SetupWizardStepDirective, SetupWizardStepHeaderDirective, ShowComponent, SidePanelComponent, SidebarLayoutComponent, SignaturePadComponent, SkeletonComponent, StackComponent, StarComponent, StepperComponent, TableToolbarComponent, TextComponent, TextInputComponent, TextTemplatePickerComponent, TextareaInputComponent, TimeInputComponent, TimelineComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_STATES, UiFieldValidity, acceptLabel, appShellGroupsStorageKey, autoVariant, blockHasContent, buildDefaultSchedule, buildPreviewDocument, buildVideoBlockHtml, builtInActionIcon, businessTimeOptions, createFieldReveal, decodeFilterValues, digitsOnly, downloadBlob, encodeFilterValue, encodeFilterValues, errorContextInterceptor, escapeHtml, fileMatchesAccept, formatAddress, formatCategoryLabel, formatCurrency, formatFileSize, formatIsoDate, formatIsoDateTime, formatTime, formatVideoDuration, getEligibleIds, getEligibleOptions, getErrorMessage, humanReadableMessage, iconPath, insideEditorBlock, integrationPlainText, integrationsForApp, integrationsOnlyFor, isBlockDrag, isValidEmailAddress, isWebUrl, isoKey, issueToErrors, maxLengthIssue, normalizeHexColor, parseBizHours, parseIso, parseTime, passwordMeetsRules, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, serializeBizHours, serializedTextLength, setupIntegrations, splitIntro };
50182
+ export { ActionBarComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BankAccountFormComponent, BarRowComponent, BoardCardDirective, BoardComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, CalendarComponent, CardListItemComponent, CheckboxComponent, CheckboxTrailingDirective, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, DEFAULT_BANK_ACCOUNT_TYPE_OPTIONS, DEFAULT_BANK_HOLDER_TYPE_OPTIONS, DEFAULT_BANK_MANDATE_TEXT, DEFAULT_EMAIL_TEMPLATE_BLOCK_GROUPS, DEFAULT_EMAIL_TEMPLATE_VARIABLE_GROUPS, DEFAULT_PASSWORD_RULES, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DropdownComponent, EMAIL_BLOCK_DRAG_TYPE, EMAIL_TEMPLATE_MAX_BODY, EMAIL_TEMPLATE_MAX_TEXT, EMAIL_TEMPLATE_START_TEXT, EmailTemplateEditorComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FadeComponent, FileInputComponent, FixedFooterComponent, FormColSpanDirective, FormComponent, FormRowComponent, FormSectionComponent, HintComponent, IDX_BEHAVIOR_SIGNALS, INTEGRATION_CATALOG, INTEGRATION_FIELD_DEFS, INTEGRATION_GROUP_ORDER, INTEGRATION_OPTION_DEFS, IconComponent, ImageComponent, ImageGalleryComponent, ImageGalleryDialogComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, ImportSourceGridComponent, KpiCardComponent, LAYOUT_GAP_PX, ListComponent, ListItemComponent, LiveRegionComponent, MAX_EMAIL_ADDRESS_LENGTH, ModalComponent, MoreMenuComponent, MultiSelectComponent, NOTES_MAX_LENGTH, NotesComponent, OfflineBannerComponent, OptionCardComponent, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PageComponent, PaginationComponent, PanelInfoListComponent, PasswordRequirementsComponent, PdfHotspotComponent, PhoneNumberPickerComponent, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, RadioOptionContentDirective, ReadonlyFieldsetComponent, ReminderAlertsComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SETUP_DONE_KEY, SETUP_INTEGRATIONS, SearchInputComponent, SectionHeaderComponent, SelectComponent, SetupWizardComponent, SetupWizardStepDirective, SetupWizardStepHeaderDirective, ShareMenuComponent, ShowComponent, SidePanelComponent, SidebarLayoutComponent, SignaturePadComponent, SkeletonComponent, SnackbarComponent, SnackbarService, StackComponent, StarComponent, StepperComponent, TableToolbarComponent, TextComponent, TextInputComponent, TextTemplatePickerComponent, TextareaInputComponent, TimeInputComponent, TimelineComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_STATES, UiFieldValidity, acceptLabel, appShellGroupsStorageKey, autoVariant, blockHasContent, buildDefaultSchedule, buildPreviewDocument, buildVideoBlockHtml, builtInActionIcon, businessTimeOptions, createFieldReveal, decodeFilterValues, digitsOnly, downloadBlob, emailShareUrl, encodeFilterValue, encodeFilterValues, errorContextInterceptor, escapeHtml, facebookShareUrl, fileMatchesAccept, formatAddress, formatCategoryLabel, formatCurrency, formatFileSize, formatIsoDate, formatIsoDateTime, formatTime, formatVideoDuration, getEligibleIds, getEligibleOptions, getErrorMessage, gmailShareUrl, humanReadableMessage, iconPath, insideEditorBlock, integrationPlainText, integrationsForApp, integrationsOnlyFor, isBlockDrag, isValidEmailAddress, isWebUrl, isoKey, issueToErrors, linkedInShareUrl, maxLengthIssue, mergeDescribedBy, normalizeHexColor, outlookShareUrl, parseBizHours, parseIso, parseTime, passwordMeetsRules, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, serializeBizHours, serializedTextLength, setupIntegrations, splitIntro, xShareUrl };
48428
50183
 
48429
50184
  //# sourceMappingURL=forgeroute-ui.mjs.map