@forgeroute/ui 0.4.56 → 0.4.57

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,676 @@ var BulkMessagePanelComponent = class BulkMessagePanelComponent {
21377
21528
  "inputmode",
21378
21529
  "readonly",
21379
21530
  "hint",
21531
+ "ariaDescribedBy",
21532
+ "error",
21533
+ "phoneFormat",
21534
+ "min",
21535
+ "max",
21536
+ "maxDecimals",
21537
+ "step",
21538
+ "valueType",
21539
+ "formatter",
21540
+ "integer",
21541
+ "showErrors",
21542
+ "disabled"
21543
+ ],
21544
+ outputs: [
21545
+ "valueChange",
21546
+ "focused",
21547
+ "blurred",
21548
+ "invalidChange"
21549
+ ]
21550
+ },
21551
+ {
21552
+ kind: "component",
21553
+ type: TextareaInputComponent,
21554
+ selector: "ui-textarea-input",
21555
+ inputs: [
21556
+ "label",
21557
+ "ariaLabel",
21558
+ "placeholder",
21559
+ "rows",
21560
+ "maxlength",
21561
+ "required",
21562
+ "readonly",
21563
+ "hint",
21564
+ "ariaDescribedBy",
21565
+ "hintAsDescription",
21566
+ "error",
21567
+ "monospace",
21568
+ "showErrors",
21569
+ "disabled"
21570
+ ],
21571
+ outputs: ["invalidChange"]
21572
+ }
21573
+ ],
21574
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
21575
+ });
21576
+ }
21577
+ };
21578
+ i0.ɵɵngDeclareClassMetadata({
21579
+ minVersion: "12.0.0",
21580
+ version: "22.2.2",
21581
+ ngImport: i0,
21582
+ type: BulkMessagePanelComponent,
21583
+ decorators: [{
21584
+ type: Component,
21585
+ args: [{
21586
+ selector: "ui-bulk-message-panel",
21587
+ standalone: true,
21588
+ changeDetection: ChangeDetectionStrategy.OnPush,
21589
+ imports: [
21590
+ FormsModule,
21591
+ SidePanelComponent,
21592
+ ToggleBadgeComponent,
21593
+ TextInputComponent,
21594
+ TextareaInputComponent
21595
+ ],
21596
+ template: `
21597
+ <ui-side-panel
21598
+ [open]="open()"
21599
+ title="Send Bulk Message"
21600
+ [primaryLabel]="primaryLabel()"
21601
+ primaryVariant="warning"
21602
+ [primaryLoading]="sending()"
21603
+ [primaryDisabled]="!canSend()"
21604
+ (closed)="closed.emit()"
21605
+ (primaryClick)="onSend()">
21606
+
21607
+ <div class="msg-channel-row">
21608
+ <label class="form-label">Send via</label>
21609
+ <div class="msg-via-tabs">
21610
+ <ui-toggle-badge [active]="channel() === 'email'" (toggle)="onChannelChange('email')">
21611
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"/></svg>
21612
+ Email
21613
+ </ui-toggle-badge>
21614
+ @if (textEnabled()) {
21615
+ <ui-toggle-badge [active]="channel() === 'text'" (toggle)="onChannelChange('text')">
21616
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>
21617
+ Text
21618
+ </ui-toggle-badge>
21619
+ }
21620
+ </div>
21621
+ </div>
21622
+
21623
+ <p class="bulk-msg-recipients">
21624
+ Sending to <strong>{{ activeContacts().length }}</strong> contact{{ activeContacts().length === 1 ? '' : 's' }}
21625
+ @if (skippedCount() > 0) {
21626
+ <span class="bulk-msg-skipped">&mdash; {{ skippedCount() }} skipped (no {{ channel() === 'email' ? 'email' : 'phone' }})</span>
21627
+ }
21628
+ </p>
21629
+
21630
+ @if (channel() === 'email') {
21631
+ <ui-text-input label="Subject" [(ngModel)]="subject" placeholder="Subject line" />
21632
+ }
21633
+ <ui-textarea-input label="Message" [rows]="6" [(ngModel)]="body" placeholder="Write your message..." />
21634
+
21635
+ </ui-side-panel>
21636
+ `,
21637
+ styles: [".msg-channel-row{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.msg-via-tabs{display:flex;gap:6px;flex-wrap:wrap}.form-label{font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.05em;white-space:nowrap}.bulk-msg-recipients{font-size:.9375rem;color:#334155;margin:0 0 16px}.bulk-msg-skipped{color:#94a3b8;font-size:.875rem}\n"]
21638
+ }]
21639
+ }],
21640
+ ctorParameters: () => [],
21641
+ propDecorators: {
21642
+ open: [{
21643
+ type: i0.Input,
21644
+ args: [{
21645
+ isSignal: true,
21646
+ alias: "open",
21647
+ required: false
21648
+ }]
21649
+ }],
21650
+ contacts: [{
21651
+ type: i0.Input,
21652
+ args: [{
21653
+ isSignal: true,
21654
+ alias: "contacts",
21655
+ required: false
21656
+ }]
21657
+ }],
21658
+ textEnabled: [{
21659
+ type: i0.Input,
21660
+ args: [{
21661
+ isSignal: true,
21662
+ alias: "textEnabled",
21663
+ required: false
21664
+ }]
21665
+ }],
21666
+ sending: [{
21667
+ type: i0.Input,
21668
+ args: [{
21669
+ isSignal: true,
21670
+ alias: "sending",
21671
+ required: false
21672
+ }]
21673
+ }],
21674
+ closed: [{
21675
+ type: i0.Output,
21676
+ args: ["closed"]
21677
+ }],
21678
+ send: [{
21679
+ type: i0.Output,
21680
+ args: ["send"]
21681
+ }]
21682
+ }
21683
+ });
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
+ }
21720
+ };
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 {
21747
+ constructor() {
21748
+ this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
21749
+ this.divider = input(false, ...ngDevMode ? [{ debugName: "divider" }] : /* istanbul ignore next */ []);
21750
+ }
21751
+ static {
21752
+ this.ɵfac = i0.ɵɵngDeclareFactory({
21753
+ minVersion: "12.0.0",
21754
+ version: "22.2.2",
21755
+ ngImport: i0,
21756
+ type: FormSectionComponent,
21757
+ deps: [],
21758
+ target: i0.ɵɵFactoryTarget.Component
21759
+ });
21760
+ }
21761
+ static {
21762
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
21763
+ minVersion: "17.0.0",
21764
+ version: "22.2.2",
21765
+ type: FormSectionComponent,
21766
+ isStandalone: true,
21767
+ selector: "ui-form-section",
21768
+ inputs: {
21769
+ label: {
21770
+ classPropertyName: "label",
21771
+ publicName: "label",
21772
+ isSignal: true,
21773
+ isRequired: false,
21774
+ transformFunction: null
21775
+ },
21776
+ divider: {
21777
+ classPropertyName: "divider",
21778
+ publicName: "divider",
21779
+ isSignal: true,
21780
+ isRequired: false,
21781
+ transformFunction: null
21782
+ }
21783
+ },
21784
+ ngImport: i0,
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
+ `,
21790
+ isInline: true,
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"],
21792
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
21793
+ });
21794
+ }
21795
+ };
21796
+ i0.ɵɵngDeclareClassMetadata({
21797
+ minVersion: "12.0.0",
21798
+ version: "22.2.2",
21799
+ ngImport: i0,
21800
+ type: FormSectionComponent,
21801
+ decorators: [{
21802
+ type: Component,
21803
+ args: [{
21804
+ selector: "ui-form-section",
21805
+ standalone: true,
21806
+ changeDetection: ChangeDetectionStrategy.OnPush,
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"]
21813
+ }]
21814
+ }],
21815
+ propDecorators: {
21816
+ label: [{
21817
+ type: i0.Input,
21818
+ args: [{
21819
+ isSignal: true,
21820
+ alias: "label",
21821
+ required: false
21822
+ }]
21823
+ }],
21824
+ divider: [{
21825
+ type: i0.Input,
21826
+ args: [{
21827
+ isSignal: true,
21828
+ alias: "divider",
21829
+ required: false
21830
+ }]
21831
+ }]
21832
+ }
21833
+ });
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 {
21851
+ constructor() {
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 */ []);
21902
+ effect(() => {
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));
21909
+ });
21910
+ }
21911
+ id(name) {
21912
+ return `${this.testIdPrefix()}-${name}`;
21913
+ }
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);
21945
+ }
21946
+ static {
21947
+ this.ɵfac = i0.ɵɵngDeclareFactory({
21948
+ minVersion: "12.0.0",
21949
+ version: "22.2.2",
21950
+ ngImport: i0,
21951
+ type: BankAccountFormComponent,
21952
+ deps: [],
21953
+ target: i0.ɵɵFactoryTarget.Component
21954
+ });
21955
+ }
21956
+ static {
21957
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
21958
+ minVersion: "17.2.0",
21959
+ version: "22.2.2",
21960
+ type: BankAccountFormComponent,
21961
+ isStandalone: true,
21962
+ selector: "ui-bank-account-form",
21963
+ inputs: {
21964
+ showErrors: {
21965
+ classPropertyName: "showErrors",
21966
+ publicName: "showErrors",
21967
+ isSignal: true,
21968
+ isRequired: false,
21969
+ transformFunction: null
21970
+ },
21971
+ disabled: {
21972
+ classPropertyName: "disabled",
21973
+ publicName: "disabled",
21974
+ isSignal: true,
21975
+ isRequired: false,
21976
+ transformFunction: null
21977
+ },
21978
+ busy: {
21979
+ classPropertyName: "busy",
21980
+ publicName: "busy",
21981
+ isSignal: true,
21982
+ isRequired: false,
21983
+ transformFunction: null
21984
+ },
21985
+ mandateText: {
21986
+ classPropertyName: "mandateText",
21987
+ publicName: "mandateText",
21988
+ isSignal: true,
21989
+ isRequired: false,
21990
+ transformFunction: null
21991
+ },
21992
+ accountTypeOptions: {
21993
+ classPropertyName: "accountTypeOptions",
21994
+ publicName: "accountTypeOptions",
21995
+ isSignal: true,
21996
+ isRequired: false,
21997
+ transformFunction: null
21998
+ },
21999
+ holderTypeOptions: {
22000
+ classPropertyName: "holderTypeOptions",
22001
+ publicName: "holderTypeOptions",
22002
+ isSignal: true,
22003
+ isRequired: false,
22004
+ transformFunction: null
22005
+ },
22006
+ accountHolderNameDefault: {
22007
+ classPropertyName: "accountHolderNameDefault",
22008
+ publicName: "accountHolderNameDefault",
22009
+ isSignal: true,
22010
+ isRequired: false,
22011
+ transformFunction: null
22012
+ },
22013
+ testIdPrefix: {
22014
+ classPropertyName: "testIdPrefix",
22015
+ publicName: "testIdPrefix",
22016
+ isSignal: true,
22017
+ isRequired: false,
22018
+ transformFunction: null
22019
+ }
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
+ }],
22036
+ ngImport: i0,
22037
+ template: `
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>
22061
+ `,
22062
+ isInline: true,
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",
21380
22201
  "error",
21381
22202
  "phoneFormat",
21382
22203
  "min",
@@ -21395,27 +22216,6 @@ var BulkMessagePanelComponent = class BulkMessagePanelComponent {
21395
22216
  "blurred",
21396
22217
  "invalidChange"
21397
22218
  ]
21398
- },
21399
- {
21400
- kind: "component",
21401
- type: TextareaInputComponent,
21402
- selector: "ui-textarea-input",
21403
- inputs: [
21404
- "label",
21405
- "ariaLabel",
21406
- "placeholder",
21407
- "rows",
21408
- "maxlength",
21409
- "required",
21410
- "readonly",
21411
- "hint",
21412
- "hintAsDescription",
21413
- "error",
21414
- "monospace",
21415
- "showErrors",
21416
- "disabled"
21417
- ],
21418
- outputs: ["invalidChange"]
21419
22219
  }
21420
22220
  ],
21421
22221
  changeDetection: i0.ChangeDetectionStrategy.OnPush
@@ -21426,105 +22226,131 @@ i0.ɵɵngDeclareClassMetadata({
21426
22226
  minVersion: "12.0.0",
21427
22227
  version: "22.2.2",
21428
22228
  ngImport: i0,
21429
- type: BulkMessagePanelComponent,
22229
+ type: BankAccountFormComponent,
21430
22230
  decorators: [{
21431
22231
  type: Component,
21432
22232
  args: [{
21433
- selector: "ui-bulk-message-panel",
22233
+ selector: "ui-bank-account-form",
21434
22234
  standalone: true,
21435
22235
  changeDetection: ChangeDetectionStrategy.OnPush,
21436
22236
  imports: [
21437
22237
  FormsModule,
21438
- SidePanelComponent,
21439
- ToggleBadgeComponent,
21440
- TextInputComponent,
21441
- TextareaInputComponent
22238
+ CheckboxComponent,
22239
+ FormRowComponent,
22240
+ FormSectionComponent,
22241
+ SelectComponent,
22242
+ TextInputComponent
21442
22243
  ],
22244
+ providers: [{
22245
+ provide: UiFieldValidity,
22246
+ useExisting: forwardRef(() => BankAccountFormComponent)
22247
+ }],
22248
+ host: { "[attr.aria-busy]": "busy() ? \"true\" : null" },
21443
22249
  template: `
21444
- <ui-side-panel
21445
- [open]="open()"
21446
- title="Send Bulk Message"
21447
- [primaryLabel]="primaryLabel()"
21448
- primaryVariant="warning"
21449
- [primaryLoading]="sending()"
21450
- [primaryDisabled]="!canSend()"
21451
- (closed)="closed.emit()"
21452
- (primaryClick)="onSend()">
21453
-
21454
- <div class="msg-channel-row">
21455
- <label class="form-label">Send via</label>
21456
- <div class="msg-via-tabs">
21457
- <ui-toggle-badge [active]="channel() === 'email'" (toggle)="onChannelChange('email')">
21458
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"/></svg>
21459
- Email
21460
- </ui-toggle-badge>
21461
- @if (textEnabled()) {
21462
- <ui-toggle-badge [active]="channel() === 'text'" (toggle)="onChannelChange('text')">
21463
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>
21464
- Text
21465
- </ui-toggle-badge>
21466
- }
21467
- </div>
21468
- </div>
21469
-
21470
- <p class="bulk-msg-recipients">
21471
- Sending to <strong>{{ activeContacts().length }}</strong> contact{{ activeContacts().length === 1 ? '' : 's' }}
21472
- @if (skippedCount() > 0) {
21473
- <span class="bulk-msg-skipped">&mdash; {{ skippedCount() }} skipped (no {{ channel() === 'email' ? 'email' : 'phone' }})</span>
21474
- }
21475
- </p>
21476
-
21477
- @if (channel() === 'email') {
21478
- <ui-text-input label="Subject" [(ngModel)]="subject" placeholder="Subject line" />
21479
- }
21480
- <ui-textarea-input label="Message" [rows]="6" [(ngModel)]="body" placeholder="Write your message..." />
21481
-
21482
- </ui-side-panel>
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>
21483
22273
  `,
21484
- styles: [".msg-channel-row{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.msg-via-tabs{display:flex;gap:6px;flex-wrap:wrap}.form-label{font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.05em;white-space:nowrap}.bulk-msg-recipients{font-size:.9375rem;color:#334155;margin:0 0 16px}.bulk-msg-skipped{color:#94a3b8;font-size:.875rem}\n"]
22274
+ styles: [":host{display:block}\n"]
21485
22275
  }]
21486
22276
  }],
21487
22277
  ctorParameters: () => [],
21488
22278
  propDecorators: {
21489
- open: [{
22279
+ showErrors: [{
21490
22280
  type: i0.Input,
21491
22281
  args: [{
21492
22282
  isSignal: true,
21493
- alias: "open",
22283
+ alias: "showErrors",
21494
22284
  required: false
21495
22285
  }]
21496
22286
  }],
21497
- contacts: [{
22287
+ disabled: [{
21498
22288
  type: i0.Input,
21499
22289
  args: [{
21500
22290
  isSignal: true,
21501
- alias: "contacts",
22291
+ alias: "disabled",
21502
22292
  required: false
21503
22293
  }]
21504
22294
  }],
21505
- textEnabled: [{
22295
+ busy: [{
21506
22296
  type: i0.Input,
21507
22297
  args: [{
21508
22298
  isSignal: true,
21509
- alias: "textEnabled",
22299
+ alias: "busy",
21510
22300
  required: false
21511
22301
  }]
21512
22302
  }],
21513
- sending: [{
22303
+ mandateText: [{
21514
22304
  type: i0.Input,
21515
22305
  args: [{
21516
22306
  isSignal: true,
21517
- alias: "sending",
22307
+ alias: "mandateText",
21518
22308
  required: false
21519
22309
  }]
21520
22310
  }],
21521
- closed: [{
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: [{
21522
22344
  type: i0.Output,
21523
- args: ["closed"]
22345
+ args: ["submitted"]
21524
22346
  }],
21525
- send: [{
22347
+ validChange: [{
21526
22348
  type: i0.Output,
21527
- args: ["send"]
22349
+ args: ["validChange"]
22350
+ }],
22351
+ _fields: [{
22352
+ type: i0.ViewChildren,
22353
+ args: [i0.forwardRef(() => UiFieldValidity), { isSignal: true }]
21528
22354
  }]
21529
22355
  }
21530
22356
  });
@@ -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",
@@ -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",
@@ -48424,6 +49166,6 @@ i0.ɵɵngDeclareClassMetadata({
48424
49166
  }]
48425
49167
  }
48426
49168
  });
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 };
49169
+ 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, 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, mergeDescribedBy, normalizeHexColor, parseBizHours, parseIso, parseTime, passwordMeetsRules, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, serializeBizHours, serializedTextLength, setupIntegrations, splitIntro };
48428
49170
 
48429
49171
  //# sourceMappingURL=forgeroute-ui.mjs.map