@forgeroute/ui 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from "@angular/core";
2
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, ElementRef, HostBinding, HostListener, Injectable, InjectionToken, Injector, Input, Renderer2, afterNextRender, computed, effect, forwardRef, inject, input, linkedSignal, model, output, signal, untracked, viewChild } from "@angular/core";
2
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, Directive, ElementRef, HostBinding, HostListener, Injectable, InjectionToken, Injector, Input, Renderer2, afterNextRender, computed, effect, forwardRef, inject, input, linkedSignal, model, output, signal, untracked, viewChild } from "@angular/core";
3
3
  import { HttpClient, HttpErrorResponse, HttpParams } from "@angular/common/http";
4
4
  import { takeUntilDestroyed, toObservable } from "@angular/core/rxjs-interop";
5
5
  import { catchError, debounceTime, distinctUntilChanged, skip, switchMap } from "rxjs/operators";
@@ -1200,7 +1200,7 @@ var ColumnFilterComponent = class ColumnFilterComponent {
1200
1200
  </div>
1201
1201
  `,
1202
1202
  isInline: true,
1203
- styles: [":host{display:inline-block;position:relative}.cf-wrapper{position:relative}.cf-trigger{display:inline-flex;align-items:center;gap:4px;background:none;border:none;cursor:pointer;color:#94a3b8;padding:2px 4px;border-radius:4px;font-family:inherit;font-size:.75rem;transition:color .15s}.cf-trigger:hover{color:#1e293b}.cf-trigger.cf-active{color:#3b82f6}.cf-trigger:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}@media(max-width:640px),(pointer:coarse){.cf-trigger{position:relative}.cf-trigger:after{content:\"\";position:absolute;top:50%;left:50%;width:44px;height:44px;transform:translate(-50%,-50%)}}.cf-active-label{font-size:.75rem;font-weight:500;color:#3b82f6}.cf-trigger--chip{min-height:44px;padding:0 14px;gap:6px;border:1px solid #e2e8f0;border-radius:999px;background:#fff;color:#334155;font-size:.8125rem;font-weight:500}.cf-trigger--chip.cf-active{border-color:#bfdbfe;background:#eff6ff}.cf-trigger--chip:after{display:none}.cf-chip-label{white-space:nowrap}.cf-dropdown{position:fixed;display:flex;flex-direction:column;max-height:calc(100vh - 16px);z-index:9999;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 4px 6px #0000000a,0 12px 28px #0000001a;min-width:220px;animation:cf-drop .16s cubic-bezier(.16,1,.3,1)}.cf-header{display:flex;align-items:center;justify-content:space-between;padding:12px 12px 10px 16px;border-bottom:1px solid #f1f5f9}.cf-header-label{font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:#64748b}.cf-close{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:6px;background:none;border:none;cursor:pointer;color:#94a3b8;flex-shrink:0;transition:background .13s,color .13s}.cf-close:hover{background:#f1f5f9;color:#1e293b}.cf-options{padding:6px 8px;overflow-y:auto;min-height:0}.cf-option{display:flex;align-items:center;gap:10px;width:100%;padding:10px;background:none;border:none;border-bottom:1px solid #e2e8f0;cursor:pointer;font-size:.875rem;color:#1e293b;font-family:inherit;text-align:left;border-radius:0;transition:background .12s}.cf-option:last-child{border-bottom:none}.cf-option:hover{background:#f8fafc}.cf-option.cf-selected{background:#eff6ff;color:#1d4ed8;font-weight:500}.cf-option:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.cf-checkbox{flex-shrink:0;width:16px;height:16px;border-radius:4px;border:1.5px solid #d1d5db;display:flex;align-items:center;justify-content:center;background:#fff;transition:background .12s,border-color .12s}.cf-checkbox.cf-checkbox--checked{background:#3b82f6;border-color:#3b82f6;color:#fff}.cf-count{margin-left:auto;font-size:.7rem;font-weight:600;line-height:1;background:#f1f5f9;color:#64748b;border-radius:999px;padding:2px 7px;min-width:22px;text-align:center}.cf-option.cf-selected .cf-count{background:#dbeafe;color:#2563eb}.cf-footer{display:flex;gap:8px;padding:10px 12px 12px;border-top:1px solid #f1f5f9}.cf-clear{flex:1;padding:8px;border-radius:8px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;color:#64748b;cursor:pointer;font-family:inherit;font-weight:500;transition:background .12s,color .12s}.cf-clear:hover{background:#f8fafc;color:#1e293b}.cf-apply{flex:1;padding:8px;border-radius:8px;border:none;background:#0f172a;color:#fff;font-size:.8125rem;cursor:pointer;font-family:inherit;font-weight:600;transition:background .12s}.cf-apply:hover{background:#1e293b}@keyframes cf-drop{0%{opacity:0;transform:translateY(-4px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@media(max-width:1024px){.cf-trigger{padding:6px 8px}.cf-option{padding:11px 10px;min-height:40px}.cf-clear,.cf-apply{padding:10px}}@media(max-width:640px){.cf-dropdown{min-width:200px;max-width:calc(100vw - 16px)}.cf-option{padding:12px 10px;min-height:44px}.cf-clear,.cf-apply{padding:11px}}\n"],
1203
+ styles: [":host{display:inline-block;position:relative}.cf-wrapper{position:relative}.cf-trigger{display:inline-flex;align-items:center;gap:4px;background:none;border:none;cursor:pointer;color:#94a3b8;padding:2px 4px;border-radius:4px;font-family:inherit;font-size:.75rem;transition:color .15s}.cf-trigger:hover{color:#1e293b}.cf-trigger.cf-active{color:#3b82f6}.cf-trigger:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}@media(max-width:640px),(pointer:coarse){.cf-trigger{position:relative}.cf-trigger:after{content:\"\";position:absolute;top:50%;left:50%;width:44px;height:44px;transform:translate(-50%,-50%)}}.cf-active-label{font-size:.75rem;font-weight:500;color:#3b82f6}.cf-trigger--chip{min-height:44px;padding:0 14px;gap:6px;border:1px solid #e2e8f0;border-radius:999px;background:#fff;color:#334155;font-size:.8125rem;font-weight:500}.cf-trigger--chip.cf-active{border-color:#bfdbfe;background:#eff6ff}.cf-trigger--chip:after{display:none}.cf-chip-label{white-space:nowrap}.cf-dropdown{position:fixed;display:flex;flex-direction:column;max-height:calc(100vh - 16px);z-index:9999;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 4px 6px #0000000a,0 12px 28px #0000001a;min-width:220px;animation:cf-drop .16s cubic-bezier(.16,1,.3,1)}.cf-header{display:flex;align-items:center;justify-content:space-between;padding:12px 12px 10px 16px;border-bottom:1px solid #f1f5f9}.cf-header-label{font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:#64748b}.cf-close{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:6px;background:none;border:none;cursor:pointer;color:#94a3b8;flex-shrink:0;transition:background .13s,color .13s}.cf-close:hover{background:#f1f5f9;color:#1e293b}@media(max-width:640px),(pointer:coarse){.cf-close{position:relative}.cf-close:after{content:\"\";position:absolute;inset:-10px}}.cf-options{padding:6px 8px;overflow-y:auto;min-height:0}.cf-option{display:flex;align-items:center;gap:10px;width:100%;padding:10px;background:none;border:none;border-bottom:1px solid #e2e8f0;cursor:pointer;font-size:.875rem;color:#1e293b;font-family:inherit;text-align:left;border-radius:0;transition:background .12s}.cf-option:last-child{border-bottom:none}.cf-option:hover{background:#f8fafc}.cf-option.cf-selected{background:#eff6ff;color:#1d4ed8;font-weight:500}.cf-option:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.cf-checkbox{flex-shrink:0;width:16px;height:16px;border-radius:4px;border:1.5px solid #d1d5db;display:flex;align-items:center;justify-content:center;background:#fff;transition:background .12s,border-color .12s}.cf-checkbox.cf-checkbox--checked{background:#3b82f6;border-color:#3b82f6;color:#fff}.cf-count{margin-left:auto;font-size:.7rem;font-weight:600;line-height:1;background:#f1f5f9;color:#64748b;border-radius:999px;padding:2px 7px;min-width:22px;text-align:center}.cf-option.cf-selected .cf-count{background:#dbeafe;color:#2563eb}.cf-footer{display:flex;gap:8px;padding:10px 12px 12px;border-top:1px solid #f1f5f9}.cf-clear{flex:1;padding:8px;border-radius:8px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;color:#64748b;cursor:pointer;font-family:inherit;font-weight:500;transition:background .12s,color .12s}.cf-clear:hover{background:#f8fafc;color:#1e293b}.cf-apply{flex:1;padding:8px;border-radius:8px;border:none;background:#0f172a;color:#fff;font-size:.8125rem;cursor:pointer;font-family:inherit;font-weight:600;transition:background .12s}.cf-apply:hover{background:#1e293b}@keyframes cf-drop{0%{opacity:0;transform:translateY(-4px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@media(max-width:1024px){.cf-trigger{padding:6px 8px}.cf-option{padding:11px 10px;min-height:40px}.cf-clear,.cf-apply{padding:10px}}@media(max-width:640px){.cf-dropdown{min-width:200px;max-width:calc(100vw - 16px)}.cf-option{padding:12px 10px;min-height:44px}.cf-clear,.cf-apply{padding:11px}}\n"],
1204
1204
  changeDetection: i0.ChangeDetectionStrategy.OnPush
1205
1205
  });
1206
1206
  }
@@ -1290,7 +1290,7 @@ i0.ɵɵngDeclareClassMetadata({
1290
1290
  }
1291
1291
  </div>
1292
1292
  `,
1293
- styles: [":host{display:inline-block;position:relative}.cf-wrapper{position:relative}.cf-trigger{display:inline-flex;align-items:center;gap:4px;background:none;border:none;cursor:pointer;color:#94a3b8;padding:2px 4px;border-radius:4px;font-family:inherit;font-size:.75rem;transition:color .15s}.cf-trigger:hover{color:#1e293b}.cf-trigger.cf-active{color:#3b82f6}.cf-trigger:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}@media(max-width:640px),(pointer:coarse){.cf-trigger{position:relative}.cf-trigger:after{content:\"\";position:absolute;top:50%;left:50%;width:44px;height:44px;transform:translate(-50%,-50%)}}.cf-active-label{font-size:.75rem;font-weight:500;color:#3b82f6}.cf-trigger--chip{min-height:44px;padding:0 14px;gap:6px;border:1px solid #e2e8f0;border-radius:999px;background:#fff;color:#334155;font-size:.8125rem;font-weight:500}.cf-trigger--chip.cf-active{border-color:#bfdbfe;background:#eff6ff}.cf-trigger--chip:after{display:none}.cf-chip-label{white-space:nowrap}.cf-dropdown{position:fixed;display:flex;flex-direction:column;max-height:calc(100vh - 16px);z-index:9999;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 4px 6px #0000000a,0 12px 28px #0000001a;min-width:220px;animation:cf-drop .16s cubic-bezier(.16,1,.3,1)}.cf-header{display:flex;align-items:center;justify-content:space-between;padding:12px 12px 10px 16px;border-bottom:1px solid #f1f5f9}.cf-header-label{font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:#64748b}.cf-close{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:6px;background:none;border:none;cursor:pointer;color:#94a3b8;flex-shrink:0;transition:background .13s,color .13s}.cf-close:hover{background:#f1f5f9;color:#1e293b}.cf-options{padding:6px 8px;overflow-y:auto;min-height:0}.cf-option{display:flex;align-items:center;gap:10px;width:100%;padding:10px;background:none;border:none;border-bottom:1px solid #e2e8f0;cursor:pointer;font-size:.875rem;color:#1e293b;font-family:inherit;text-align:left;border-radius:0;transition:background .12s}.cf-option:last-child{border-bottom:none}.cf-option:hover{background:#f8fafc}.cf-option.cf-selected{background:#eff6ff;color:#1d4ed8;font-weight:500}.cf-option:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.cf-checkbox{flex-shrink:0;width:16px;height:16px;border-radius:4px;border:1.5px solid #d1d5db;display:flex;align-items:center;justify-content:center;background:#fff;transition:background .12s,border-color .12s}.cf-checkbox.cf-checkbox--checked{background:#3b82f6;border-color:#3b82f6;color:#fff}.cf-count{margin-left:auto;font-size:.7rem;font-weight:600;line-height:1;background:#f1f5f9;color:#64748b;border-radius:999px;padding:2px 7px;min-width:22px;text-align:center}.cf-option.cf-selected .cf-count{background:#dbeafe;color:#2563eb}.cf-footer{display:flex;gap:8px;padding:10px 12px 12px;border-top:1px solid #f1f5f9}.cf-clear{flex:1;padding:8px;border-radius:8px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;color:#64748b;cursor:pointer;font-family:inherit;font-weight:500;transition:background .12s,color .12s}.cf-clear:hover{background:#f8fafc;color:#1e293b}.cf-apply{flex:1;padding:8px;border-radius:8px;border:none;background:#0f172a;color:#fff;font-size:.8125rem;cursor:pointer;font-family:inherit;font-weight:600;transition:background .12s}.cf-apply:hover{background:#1e293b}@keyframes cf-drop{0%{opacity:0;transform:translateY(-4px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@media(max-width:1024px){.cf-trigger{padding:6px 8px}.cf-option{padding:11px 10px;min-height:40px}.cf-clear,.cf-apply{padding:10px}}@media(max-width:640px){.cf-dropdown{min-width:200px;max-width:calc(100vw - 16px)}.cf-option{padding:12px 10px;min-height:44px}.cf-clear,.cf-apply{padding:11px}}\n"]
1293
+ styles: [":host{display:inline-block;position:relative}.cf-wrapper{position:relative}.cf-trigger{display:inline-flex;align-items:center;gap:4px;background:none;border:none;cursor:pointer;color:#94a3b8;padding:2px 4px;border-radius:4px;font-family:inherit;font-size:.75rem;transition:color .15s}.cf-trigger:hover{color:#1e293b}.cf-trigger.cf-active{color:#3b82f6}.cf-trigger:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}@media(max-width:640px),(pointer:coarse){.cf-trigger{position:relative}.cf-trigger:after{content:\"\";position:absolute;top:50%;left:50%;width:44px;height:44px;transform:translate(-50%,-50%)}}.cf-active-label{font-size:.75rem;font-weight:500;color:#3b82f6}.cf-trigger--chip{min-height:44px;padding:0 14px;gap:6px;border:1px solid #e2e8f0;border-radius:999px;background:#fff;color:#334155;font-size:.8125rem;font-weight:500}.cf-trigger--chip.cf-active{border-color:#bfdbfe;background:#eff6ff}.cf-trigger--chip:after{display:none}.cf-chip-label{white-space:nowrap}.cf-dropdown{position:fixed;display:flex;flex-direction:column;max-height:calc(100vh - 16px);z-index:9999;background:#fff;border:1px solid #e2e8f0;border-radius:12px;box-shadow:0 4px 6px #0000000a,0 12px 28px #0000001a;min-width:220px;animation:cf-drop .16s cubic-bezier(.16,1,.3,1)}.cf-header{display:flex;align-items:center;justify-content:space-between;padding:12px 12px 10px 16px;border-bottom:1px solid #f1f5f9}.cf-header-label{font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:#64748b}.cf-close{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:6px;background:none;border:none;cursor:pointer;color:#94a3b8;flex-shrink:0;transition:background .13s,color .13s}.cf-close:hover{background:#f1f5f9;color:#1e293b}@media(max-width:640px),(pointer:coarse){.cf-close{position:relative}.cf-close:after{content:\"\";position:absolute;inset:-10px}}.cf-options{padding:6px 8px;overflow-y:auto;min-height:0}.cf-option{display:flex;align-items:center;gap:10px;width:100%;padding:10px;background:none;border:none;border-bottom:1px solid #e2e8f0;cursor:pointer;font-size:.875rem;color:#1e293b;font-family:inherit;text-align:left;border-radius:0;transition:background .12s}.cf-option:last-child{border-bottom:none}.cf-option:hover{background:#f8fafc}.cf-option.cf-selected{background:#eff6ff;color:#1d4ed8;font-weight:500}.cf-option:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}.cf-checkbox{flex-shrink:0;width:16px;height:16px;border-radius:4px;border:1.5px solid #d1d5db;display:flex;align-items:center;justify-content:center;background:#fff;transition:background .12s,border-color .12s}.cf-checkbox.cf-checkbox--checked{background:#3b82f6;border-color:#3b82f6;color:#fff}.cf-count{margin-left:auto;font-size:.7rem;font-weight:600;line-height:1;background:#f1f5f9;color:#64748b;border-radius:999px;padding:2px 7px;min-width:22px;text-align:center}.cf-option.cf-selected .cf-count{background:#dbeafe;color:#2563eb}.cf-footer{display:flex;gap:8px;padding:10px 12px 12px;border-top:1px solid #f1f5f9}.cf-clear{flex:1;padding:8px;border-radius:8px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;color:#64748b;cursor:pointer;font-family:inherit;font-weight:500;transition:background .12s,color .12s}.cf-clear:hover{background:#f8fafc;color:#1e293b}.cf-apply{flex:1;padding:8px;border-radius:8px;border:none;background:#0f172a;color:#fff;font-size:.8125rem;cursor:pointer;font-family:inherit;font-weight:600;transition:background .12s}.cf-apply:hover{background:#1e293b}@keyframes cf-drop{0%{opacity:0;transform:translateY(-4px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@media(max-width:1024px){.cf-trigger{padding:6px 8px}.cf-option{padding:11px 10px;min-height:40px}.cf-clear,.cf-apply{padding:10px}}@media(max-width:640px){.cf-dropdown{min-width:200px;max-width:calc(100vw - 16px)}.cf-option{padding:12px 10px;min-height:44px}.cf-clear,.cf-apply{padding:11px}}\n"]
1294
1294
  }]
1295
1295
  }],
1296
1296
  ctorParameters: () => [],
@@ -2143,7 +2143,7 @@ var ModalComponent = class ModalComponent {
2143
2143
  }
2144
2144
  `,
2145
2145
  isInline: true,
2146
- styles: [".m-backdrop{position:fixed;inset:0;background:#02081773;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);z-index:200;animation:m-fade .18s ease}.m-modal:focus{outline:none}.m-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;border-radius:16px;border:1px solid rgba(0,0,0,.07);z-index:201;width:calc(100% - 32px);box-shadow:0 4px 6px #0000000a,0 16px 32px #0000001f,0 48px 96px #0000001a;max-height:calc(100vh - 48px);display:flex;flex-direction:column;animation:m-scale .22s cubic-bezier(.16,1,.3,1)}.m-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0;border-radius:16px 16px 0 0;flex-shrink:0}.m-header-text{display:flex;flex-direction:column;gap:3px;flex:1;min-width:0}.m-title{font-size:1.125rem;font-weight:700;color:#0f172a;margin:0;letter-spacing:-.02em;line-height:1.3}.m-description{font-size:.8125rem;color:#64748b;margin:0;line-height:1.4}.m-close{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:8px;border:none;background:none;cursor:pointer;color:#94a3b8;flex-shrink:0;margin-left:12px;transition:background .13s,color .13s}.m-close:hover{background:#f1f5f9;color:#1e293b}.m-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.m-body{padding:20px 24px;overflow-y:auto;flex:1;min-height:0;font-size:.9rem;color:#475569;line-height:1.65}.m-footer{padding:14px 24px 18px;background:#f8fafc;border-top:1px solid #e2e8f0;border-radius:0 0 16px 16px;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;gap:8px}.m-footer:not(:has(*)){display:none}.m-footer-left{display:flex;align-items:center;gap:8px}.m-footer-right{display:flex;align-items:center;gap:8px;margin-left:auto}@media(max-width:480px){.m-modal{top:auto;bottom:var(--ui-kb, 0px);left:0;right:0;transform:none;width:100vw;max-width:none!important;max-height:min(85dvh,var(--ui-vvh, 100dvh));border-radius:20px 20px 0 0;animation:m-up .24s cubic-bezier(.16,1,.3,1)}.m-footer{border-radius:0;flex-direction:column-reverse;align-items:stretch;padding-bottom:max(18px,env(safe-area-inset-bottom))}}@keyframes m-fade{0%{opacity:0}to{opacity:1}}@keyframes m-scale{0%{opacity:0;transform:translate(-50%,-48%) scale(.96)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}@keyframes m-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}\n"],
2146
+ styles: [".m-backdrop{position:fixed;inset:0;background:#02081773;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);z-index:200;animation:m-fade .18s ease}.m-modal:focus{outline:none}.m-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;border-radius:16px;border:1px solid rgba(0,0,0,.07);z-index:201;width:calc(100% - 32px);box-shadow:0 4px 6px #0000000a,0 16px 32px #0000001f,0 48px 96px #0000001a;max-height:calc(100vh - 48px);display:flex;flex-direction:column;animation:m-scale .22s cubic-bezier(.16,1,.3,1)}.m-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0;border-radius:16px 16px 0 0;flex-shrink:0}.m-header-text{display:flex;flex-direction:column;gap:3px;flex:1;min-width:0}.m-title{font-size:1.125rem;font-weight:700;color:#0f172a;margin:0;letter-spacing:-.02em;line-height:1.3}.m-description{font-size:.8125rem;color:#64748b;margin:0;line-height:1.4}.m-close{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:8px;border:none;background:none;cursor:pointer;color:#94a3b8;flex-shrink:0;margin-left:12px;transition:background .13s,color .13s}.m-close:hover{background:#f1f5f9;color:#1e293b}.m-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.m-body{padding:20px 24px;overflow-y:auto;flex:1;min-height:0;font-size:.9rem;color:#475569;line-height:1.65}.m-footer{padding:14px 24px 18px;background:#f8fafc;border-top:1px solid #e2e8f0;border-radius:0 0 16px 16px;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;gap:8px}.m-footer:not(:has(*)){display:none}.m-footer-left{display:flex;align-items:center;gap:8px}.m-footer-right{display:flex;align-items:center;gap:8px;margin-left:auto}@media(max-width:480px){.m-modal{top:auto;bottom:var(--ui-kb, 0px);left:0;right:0;transform:none;width:100vw;max-width:none!important;max-height:min(85dvh,var(--ui-vvh, 100dvh));border-radius:20px 20px 0 0;animation:m-up .24s cubic-bezier(.16,1,.3,1)}.m-footer{border-radius:0;flex-direction:column-reverse;align-items:stretch;padding-bottom:max(18px,env(safe-area-inset-bottom))}}@media(pointer:coarse),(max-width:480px){.m-close{position:relative}.m-close:after{content:\"\";position:absolute;inset:-7px}}@keyframes m-fade{0%{opacity:0}to{opacity:1}}@keyframes m-scale{0%{opacity:0;transform:translate(-50%,-48%) scale(.96)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}@keyframes m-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}\n"],
2147
2147
  changeDetection: i0.ChangeDetectionStrategy.OnPush
2148
2148
  });
2149
2149
  }
@@ -2187,7 +2187,7 @@ i0.ɵɵngDeclareClassMetadata({
2187
2187
  </div>
2188
2188
  }
2189
2189
  `,
2190
- styles: [".m-backdrop{position:fixed;inset:0;background:#02081773;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);z-index:200;animation:m-fade .18s ease}.m-modal:focus{outline:none}.m-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;border-radius:16px;border:1px solid rgba(0,0,0,.07);z-index:201;width:calc(100% - 32px);box-shadow:0 4px 6px #0000000a,0 16px 32px #0000001f,0 48px 96px #0000001a;max-height:calc(100vh - 48px);display:flex;flex-direction:column;animation:m-scale .22s cubic-bezier(.16,1,.3,1)}.m-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0;border-radius:16px 16px 0 0;flex-shrink:0}.m-header-text{display:flex;flex-direction:column;gap:3px;flex:1;min-width:0}.m-title{font-size:1.125rem;font-weight:700;color:#0f172a;margin:0;letter-spacing:-.02em;line-height:1.3}.m-description{font-size:.8125rem;color:#64748b;margin:0;line-height:1.4}.m-close{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:8px;border:none;background:none;cursor:pointer;color:#94a3b8;flex-shrink:0;margin-left:12px;transition:background .13s,color .13s}.m-close:hover{background:#f1f5f9;color:#1e293b}.m-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.m-body{padding:20px 24px;overflow-y:auto;flex:1;min-height:0;font-size:.9rem;color:#475569;line-height:1.65}.m-footer{padding:14px 24px 18px;background:#f8fafc;border-top:1px solid #e2e8f0;border-radius:0 0 16px 16px;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;gap:8px}.m-footer:not(:has(*)){display:none}.m-footer-left{display:flex;align-items:center;gap:8px}.m-footer-right{display:flex;align-items:center;gap:8px;margin-left:auto}@media(max-width:480px){.m-modal{top:auto;bottom:var(--ui-kb, 0px);left:0;right:0;transform:none;width:100vw;max-width:none!important;max-height:min(85dvh,var(--ui-vvh, 100dvh));border-radius:20px 20px 0 0;animation:m-up .24s cubic-bezier(.16,1,.3,1)}.m-footer{border-radius:0;flex-direction:column-reverse;align-items:stretch;padding-bottom:max(18px,env(safe-area-inset-bottom))}}@keyframes m-fade{0%{opacity:0}to{opacity:1}}@keyframes m-scale{0%{opacity:0;transform:translate(-50%,-48%) scale(.96)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}@keyframes m-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}\n"]
2190
+ styles: [".m-backdrop{position:fixed;inset:0;background:#02081773;backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);z-index:200;animation:m-fade .18s ease}.m-modal:focus{outline:none}.m-modal{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff;border-radius:16px;border:1px solid rgba(0,0,0,.07);z-index:201;width:calc(100% - 32px);box-shadow:0 4px 6px #0000000a,0 16px 32px #0000001f,0 48px 96px #0000001a;max-height:calc(100vh - 48px);display:flex;flex-direction:column;animation:m-scale .22s cubic-bezier(.16,1,.3,1)}.m-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0;border-radius:16px 16px 0 0;flex-shrink:0}.m-header-text{display:flex;flex-direction:column;gap:3px;flex:1;min-width:0}.m-title{font-size:1.125rem;font-weight:700;color:#0f172a;margin:0;letter-spacing:-.02em;line-height:1.3}.m-description{font-size:.8125rem;color:#64748b;margin:0;line-height:1.4}.m-close{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:8px;border:none;background:none;cursor:pointer;color:#94a3b8;flex-shrink:0;margin-left:12px;transition:background .13s,color .13s}.m-close:hover{background:#f1f5f9;color:#1e293b}.m-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.m-body{padding:20px 24px;overflow-y:auto;flex:1;min-height:0;font-size:.9rem;color:#475569;line-height:1.65}.m-footer{padding:14px 24px 18px;background:#f8fafc;border-top:1px solid #e2e8f0;border-radius:0 0 16px 16px;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;gap:8px}.m-footer:not(:has(*)){display:none}.m-footer-left{display:flex;align-items:center;gap:8px}.m-footer-right{display:flex;align-items:center;gap:8px;margin-left:auto}@media(max-width:480px){.m-modal{top:auto;bottom:var(--ui-kb, 0px);left:0;right:0;transform:none;width:100vw;max-width:none!important;max-height:min(85dvh,var(--ui-vvh, 100dvh));border-radius:20px 20px 0 0;animation:m-up .24s cubic-bezier(.16,1,.3,1)}.m-footer{border-radius:0;flex-direction:column-reverse;align-items:stretch;padding-bottom:max(18px,env(safe-area-inset-bottom))}}@media(pointer:coarse),(max-width:480px){.m-close{position:relative}.m-close:after{content:\"\";position:absolute;inset:-7px}}@keyframes m-fade{0%{opacity:0}to{opacity:1}}@keyframes m-scale{0%{opacity:0;transform:translate(-50%,-48%) scale(.96)}to{opacity:1;transform:translate(-50%,-50%) scale(1)}}@keyframes m-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}\n"]
2191
2191
  }]
2192
2192
  }],
2193
2193
  ctorParameters: () => [],
@@ -2238,12 +2238,120 @@ i0.ɵɵngDeclareClassMetadata({
2238
2238
  }]
2239
2239
  }
2240
2240
  });
2241
+ var UiFieldValidity = class {};
2242
+ function issueToErrors(issue) {
2243
+ return issue ? { [issue.key]: issue.value ?? true } : null;
2244
+ }
2245
+ function requiredIssue(label) {
2246
+ return {
2247
+ key: "required",
2248
+ message: `${label.trim() || "This field"} is required.`
2249
+ };
2250
+ }
2251
+ function maxLengthIssue(text, max) {
2252
+ if (max == null || max < 0 || text.length <= max) return null;
2253
+ return {
2254
+ key: "maxlength",
2255
+ message: `Too long (max ${max} characters).`,
2256
+ value: {
2257
+ requiredLength: max,
2258
+ actualLength: text.length
2259
+ }
2260
+ };
2261
+ }
2262
+ function createFieldReveal(showErrors) {
2263
+ const touched = signal(false, ...ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []);
2264
+ let previous = false;
2265
+ effect(() => {
2266
+ const show = showErrors();
2267
+ if (previous && !show) touched.set(false);
2268
+ previous = show;
2269
+ });
2270
+ return {
2271
+ touched,
2272
+ revealed: computed(() => touched() || showErrors())
2273
+ };
2274
+ }
2275
+ const MONTHS = [
2276
+ "Jan",
2277
+ "Feb",
2278
+ "Mar",
2279
+ "Apr",
2280
+ "May",
2281
+ "Jun",
2282
+ "Jul",
2283
+ "Aug",
2284
+ "Sep",
2285
+ "Oct",
2286
+ "Nov",
2287
+ "Dec"
2288
+ ];
2289
+ function parseIso(value, withTime) {
2290
+ if (typeof value !== "string") return null;
2291
+ const m = /^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2})(?::(\d{2})(?:\.\d+)?)?)?$/.exec(value.trim());
2292
+ if (!m) return null;
2293
+ if (m[6] !== void 0 && Number(m[6]) > 59) return null;
2294
+ if (withTime && m[4] === void 0) return null;
2295
+ if (!withTime && m[4] !== void 0) return null;
2296
+ const y = Number(m[1]), mo = Number(m[2]), d = Number(m[3]);
2297
+ const h = m[4] === void 0 ? 0 : Number(m[4]);
2298
+ const mi = m[5] === void 0 ? 0 : Number(m[5]);
2299
+ if (mo < 1 || mo > 12 || d < 1 || d > new Date(Date.UTC(y, mo, 0)).getUTCDate()) return null;
2300
+ if (h > 23 || mi > 59) return null;
2301
+ return {
2302
+ y,
2303
+ mo,
2304
+ d,
2305
+ h,
2306
+ mi
2307
+ };
2308
+ }
2309
+ function formatIsoDate(value) {
2310
+ const p = parseIso(value, false);
2311
+ return p ? `${MONTHS[p.mo - 1]} ${p.d}, ${p.y}` : typeof value === "string" ? value : "";
2312
+ }
2313
+ function formatIsoDateTime(value) {
2314
+ const p = parseIso(value, true);
2315
+ if (!p) return typeof value === "string" ? value : "";
2316
+ const hour = p.h % 12 === 0 ? 12 : p.h % 12;
2317
+ return `${MONTHS[p.mo - 1]} ${p.d}, ${p.y}, ${hour}:${String(p.mi).padStart(2, "0")} ${p.h < 12 ? "AM" : "PM"}`;
2318
+ }
2319
+ function isoKey(p) {
2320
+ return (((p.y * 100 + p.mo) * 100 + p.d) * 100 + p.h) * 100 + p.mi;
2321
+ }
2322
+ function parseTime(value) {
2323
+ if (typeof value !== "string") return null;
2324
+ const m = /^(\d{2}):(\d{2})(?::(\d{2})(?:\.\d+)?)?$/.exec(value.trim());
2325
+ if (!m) return null;
2326
+ if (m[3] !== void 0 && Number(m[3]) > 59) return null;
2327
+ const h = Number(m[1]), mi = Number(m[2]);
2328
+ return h > 23 || mi > 59 ? null : h * 60 + mi;
2329
+ }
2330
+ function formatTime(value) {
2331
+ const t = parseTime(value);
2332
+ if (t == null) return typeof value === "string" ? value : "";
2333
+ const h = Math.floor(t / 60), mi = t % 60;
2334
+ return `${h % 12 === 0 ? 12 : h % 12}:${String(mi).padStart(2, "0")} ${h < 12 ? "AM" : "PM"}`;
2335
+ }
2241
2336
  var CheckboxComponent = class CheckboxComponent {
2242
2337
  constructor() {
2243
2338
  this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
2244
2339
  this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
2245
2340
  this.indeterminate = input(false, ...ngDevMode ? [{ debugName: "indeterminate" }] : /* istanbul ignore next */ []);
2246
2341
  this.checked = model(false, ...ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []);
2342
+ this.required = input(false, ...ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []);
2343
+ this.requiredMessage = input("", ...ngDevMode ? [{ debugName: "requiredMessage" }] : /* istanbul ignore next */ []);
2344
+ this.hint = input("", ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
2345
+ this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
2346
+ this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
2347
+ this._descId = `cb-${Math.random().toString(36).slice(2, 8)}-desc`;
2348
+ this._reveal = createFieldReveal(this.showErrors);
2349
+ this._issue = computed(() => this._check(this.checked()), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
2350
+ this.invalid = computed(() => !!this.error() || !!this._issue(), ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
2351
+ this.errorMessage = computed(() => this._issue()?.message ?? "", ...ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []);
2352
+ this.invalidChange = output();
2353
+ this._activeError = computed(() => this.error() || (this._reveal.revealed() ? this.errorMessage() : ""), ...ngDevMode ? [{ debugName: "_activeError" }] : /* istanbul ignore next */ []);
2354
+ this._onValidatorChange = () => {};
2247
2355
  this._disabledInput = input(false, {
2248
2356
  ...ngDevMode ? { debugName: "_disabledInput" } : /* istanbul ignore next */ {},
2249
2357
  alias: "disabled"
@@ -2252,6 +2360,26 @@ var CheckboxComponent = class CheckboxComponent {
2252
2360
  this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
2253
2361
  this.onChange = (_) => {};
2254
2362
  this.onTouched = () => {};
2363
+ effect(() => {
2364
+ this.invalidChange.emit(this.invalid());
2365
+ });
2366
+ }
2367
+ ngOnChanges() {
2368
+ this._onValidatorChange();
2369
+ }
2370
+ validate(control) {
2371
+ return issueToErrors(this._check(!!control.value));
2372
+ }
2373
+ registerOnValidatorChange(fn) {
2374
+ this._onValidatorChange = fn;
2375
+ }
2376
+ _check(checked) {
2377
+ if (this.disabled() || !this.required() || checked) return null;
2378
+ const rm = this.requiredMessage();
2379
+ return rm ? {
2380
+ key: "required",
2381
+ message: rm
2382
+ } : requiredIssue(this.label());
2255
2383
  }
2256
2384
  writeValue(val) {
2257
2385
  this.checked.set(!!val);
@@ -2271,6 +2399,7 @@ var CheckboxComponent = class CheckboxComponent {
2271
2399
  this.checked.set(val);
2272
2400
  this.onChange(val);
2273
2401
  this.onTouched();
2402
+ this._reveal.touched.set(true);
2274
2403
  }
2275
2404
  static {
2276
2405
  this.ɵfac = i0.ɵɵngDeclareFactory({
@@ -2318,6 +2447,41 @@ var CheckboxComponent = class CheckboxComponent {
2318
2447
  isRequired: false,
2319
2448
  transformFunction: null
2320
2449
  },
2450
+ required: {
2451
+ classPropertyName: "required",
2452
+ publicName: "required",
2453
+ isSignal: true,
2454
+ isRequired: false,
2455
+ transformFunction: null
2456
+ },
2457
+ requiredMessage: {
2458
+ classPropertyName: "requiredMessage",
2459
+ publicName: "requiredMessage",
2460
+ isSignal: true,
2461
+ isRequired: false,
2462
+ transformFunction: null
2463
+ },
2464
+ hint: {
2465
+ classPropertyName: "hint",
2466
+ publicName: "hint",
2467
+ isSignal: true,
2468
+ isRequired: false,
2469
+ transformFunction: null
2470
+ },
2471
+ error: {
2472
+ classPropertyName: "error",
2473
+ publicName: "error",
2474
+ isSignal: true,
2475
+ isRequired: false,
2476
+ transformFunction: null
2477
+ },
2478
+ showErrors: {
2479
+ classPropertyName: "showErrors",
2480
+ publicName: "showErrors",
2481
+ isSignal: true,
2482
+ isRequired: false,
2483
+ transformFunction: null
2484
+ },
2321
2485
  _disabledInput: {
2322
2486
  classPropertyName: "_disabledInput",
2323
2487
  publicName: "disabled",
@@ -2326,14 +2490,30 @@ var CheckboxComponent = class CheckboxComponent {
2326
2490
  transformFunction: null
2327
2491
  }
2328
2492
  },
2329
- outputs: { checked: "checkedChange" },
2330
- providers: [{
2331
- provide: NG_VALUE_ACCESSOR,
2332
- useExisting: forwardRef(() => CheckboxComponent),
2333
- multi: true
2334
- }],
2493
+ outputs: {
2494
+ checked: "checkedChange",
2495
+ invalidChange: "invalidChange"
2496
+ },
2497
+ providers: [
2498
+ {
2499
+ provide: NG_VALUE_ACCESSOR,
2500
+ useExisting: forwardRef(() => CheckboxComponent),
2501
+ multi: true
2502
+ },
2503
+ {
2504
+ provide: NG_VALIDATORS,
2505
+ useExisting: forwardRef(() => CheckboxComponent),
2506
+ multi: true
2507
+ },
2508
+ {
2509
+ provide: UiFieldValidity,
2510
+ useExisting: forwardRef(() => CheckboxComponent)
2511
+ }
2512
+ ],
2513
+ usesOnChanges: true,
2335
2514
  ngImport: i0,
2336
2515
  template: `
2516
+ <div class="cb-field" [class.cb-error]="_activeError()">
2337
2517
  <label class="cb-wrap" [class.cb-disabled]="disabled()">
2338
2518
  <span class="cb-box" [class.cb-checked]="checked()" [class.cb-indeterminate]="indeterminate() && !checked()" [class.cb-disabled]="disabled()">
2339
2519
  @if (checked()) {
@@ -2353,6 +2533,9 @@ var CheckboxComponent = class CheckboxComponent {
2353
2533
  [disabled]="disabled()"
2354
2534
  [attr.aria-label]="ariaLabel() || null"
2355
2535
  [attr.aria-checked]="indeterminate() && !checked() ? 'mixed' : null"
2536
+ [attr.aria-required]="required() ? 'true' : null"
2537
+ [attr.aria-invalid]="_activeError() ? 'true' : null"
2538
+ [attr.aria-describedby]="(_activeError() || hint()) ? _descId : null"
2356
2539
  (change)="onToggle($event)"
2357
2540
  />
2358
2541
  @if (label()) {
@@ -2360,9 +2543,15 @@ var CheckboxComponent = class CheckboxComponent {
2360
2543
  }
2361
2544
  <ng-content />
2362
2545
  </label>
2546
+ @if (_activeError()) {
2547
+ <p class="cb-desc cb-desc-error" [id]="_descId" role="alert">{{ _activeError() }}</p>
2548
+ } @else if (hint()) {
2549
+ <p class="cb-desc" [id]="_descId">{{ hint() }}</p>
2550
+ }
2551
+ </div>
2363
2552
  `,
2364
2553
  isInline: true,
2365
- styles: [".cb-wrap{display:inline-flex;align-items:center;gap:9px;cursor:pointer;-webkit-user-select:none;user-select:none}.cb-wrap.cb-disabled{cursor:not-allowed;opacity:.5}.cb-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.cb-wrap:has(.cb-hidden:focus-visible) .cb-box{outline:2px solid #3b82f6;outline-offset:2px}.cb-box{flex-shrink:0;width:20px;height:20px;border:2px solid #cbd5e1;border-radius:5px;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.cb-box.cb-checked,.cb-box.cb-indeterminate{background:#3b82f6;border-color:#3b82f6}.cb-wrap:hover .cb-box:not(.cb-checked):not(.cb-disabled){border-color:#3b82f6}@media(max-width:640px),(pointer:coarse){.cb-box{position:relative}.cb-box:after{content:\"\";position:absolute;inset:-12px}}.cb-label{font-size:.875rem;color:#334155;line-height:1.4}\n"],
2554
+ styles: [".cb-field{display:inline-flex;flex-direction:column;gap:4px}.cb-desc{margin:0 0 0 29px;font-size:.75rem;line-height:1.4;color:#64748b}.cb-desc-error{color:#ef4444}.cb-error .cb-box:not(.cb-checked){border-color:#ef4444}.cb-wrap{display:inline-flex;align-items:center;gap:9px;cursor:pointer;-webkit-user-select:none;user-select:none}.cb-wrap.cb-disabled{cursor:not-allowed;opacity:.5}.cb-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.cb-wrap:has(.cb-hidden:focus-visible) .cb-box{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.cb-wrap{position:relative}.cb-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:50%;transform:translateY(-50%);opacity:0;cursor:pointer;z-index:1}.cb-wrap.cb-disabled .cb-hidden{cursor:not-allowed}}.cb-box{flex-shrink:0;width:20px;height:20px;border:2px solid #cbd5e1;border-radius:5px;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.cb-box.cb-checked,.cb-box.cb-indeterminate{background:#3b82f6;border-color:#3b82f6}.cb-wrap:hover .cb-box:not(.cb-checked):not(.cb-disabled){border-color:#3b82f6}@media(max-width:640px),(pointer:coarse){.cb-box{position:relative}.cb-box:after{content:\"\";position:absolute;inset:-12px}}.cb-label{font-size:.875rem;color:#334155;line-height:1.4}\n"],
2366
2555
  changeDetection: i0.ChangeDetectionStrategy.OnPush
2367
2556
  });
2368
2557
  }
@@ -2378,12 +2567,24 @@ i0.ɵɵngDeclareClassMetadata({
2378
2567
  selector: "ui-checkbox",
2379
2568
  standalone: true,
2380
2569
  changeDetection: ChangeDetectionStrategy.OnPush,
2381
- providers: [{
2382
- provide: NG_VALUE_ACCESSOR,
2383
- useExisting: forwardRef(() => CheckboxComponent),
2384
- multi: true
2385
- }],
2570
+ providers: [
2571
+ {
2572
+ provide: NG_VALUE_ACCESSOR,
2573
+ useExisting: forwardRef(() => CheckboxComponent),
2574
+ multi: true
2575
+ },
2576
+ {
2577
+ provide: NG_VALIDATORS,
2578
+ useExisting: forwardRef(() => CheckboxComponent),
2579
+ multi: true
2580
+ },
2581
+ {
2582
+ provide: UiFieldValidity,
2583
+ useExisting: forwardRef(() => CheckboxComponent)
2584
+ }
2585
+ ],
2386
2586
  template: `
2587
+ <div class="cb-field" [class.cb-error]="_activeError()">
2387
2588
  <label class="cb-wrap" [class.cb-disabled]="disabled()">
2388
2589
  <span class="cb-box" [class.cb-checked]="checked()" [class.cb-indeterminate]="indeterminate() && !checked()" [class.cb-disabled]="disabled()">
2389
2590
  @if (checked()) {
@@ -2403,6 +2604,9 @@ i0.ɵɵngDeclareClassMetadata({
2403
2604
  [disabled]="disabled()"
2404
2605
  [attr.aria-label]="ariaLabel() || null"
2405
2606
  [attr.aria-checked]="indeterminate() && !checked() ? 'mixed' : null"
2607
+ [attr.aria-required]="required() ? 'true' : null"
2608
+ [attr.aria-invalid]="_activeError() ? 'true' : null"
2609
+ [attr.aria-describedby]="(_activeError() || hint()) ? _descId : null"
2406
2610
  (change)="onToggle($event)"
2407
2611
  />
2408
2612
  @if (label()) {
@@ -2410,10 +2614,17 @@ i0.ɵɵngDeclareClassMetadata({
2410
2614
  }
2411
2615
  <ng-content />
2412
2616
  </label>
2617
+ @if (_activeError()) {
2618
+ <p class="cb-desc cb-desc-error" [id]="_descId" role="alert">{{ _activeError() }}</p>
2619
+ } @else if (hint()) {
2620
+ <p class="cb-desc" [id]="_descId">{{ hint() }}</p>
2621
+ }
2622
+ </div>
2413
2623
  `,
2414
- styles: [".cb-wrap{display:inline-flex;align-items:center;gap:9px;cursor:pointer;-webkit-user-select:none;user-select:none}.cb-wrap.cb-disabled{cursor:not-allowed;opacity:.5}.cb-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.cb-wrap:has(.cb-hidden:focus-visible) .cb-box{outline:2px solid #3b82f6;outline-offset:2px}.cb-box{flex-shrink:0;width:20px;height:20px;border:2px solid #cbd5e1;border-radius:5px;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.cb-box.cb-checked,.cb-box.cb-indeterminate{background:#3b82f6;border-color:#3b82f6}.cb-wrap:hover .cb-box:not(.cb-checked):not(.cb-disabled){border-color:#3b82f6}@media(max-width:640px),(pointer:coarse){.cb-box{position:relative}.cb-box:after{content:\"\";position:absolute;inset:-12px}}.cb-label{font-size:.875rem;color:#334155;line-height:1.4}\n"]
2624
+ styles: [".cb-field{display:inline-flex;flex-direction:column;gap:4px}.cb-desc{margin:0 0 0 29px;font-size:.75rem;line-height:1.4;color:#64748b}.cb-desc-error{color:#ef4444}.cb-error .cb-box:not(.cb-checked){border-color:#ef4444}.cb-wrap{display:inline-flex;align-items:center;gap:9px;cursor:pointer;-webkit-user-select:none;user-select:none}.cb-wrap.cb-disabled{cursor:not-allowed;opacity:.5}.cb-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.cb-wrap:has(.cb-hidden:focus-visible) .cb-box{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.cb-wrap{position:relative}.cb-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:50%;transform:translateY(-50%);opacity:0;cursor:pointer;z-index:1}.cb-wrap.cb-disabled .cb-hidden{cursor:not-allowed}}.cb-box{flex-shrink:0;width:20px;height:20px;border:2px solid #cbd5e1;border-radius:5px;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.cb-box.cb-checked,.cb-box.cb-indeterminate{background:#3b82f6;border-color:#3b82f6}.cb-wrap:hover .cb-box:not(.cb-checked):not(.cb-disabled){border-color:#3b82f6}@media(max-width:640px),(pointer:coarse){.cb-box{position:relative}.cb-box:after{content:\"\";position:absolute;inset:-12px}}.cb-label{font-size:.875rem;color:#334155;line-height:1.4}\n"]
2415
2625
  }]
2416
2626
  }],
2627
+ ctorParameters: () => [],
2417
2628
  propDecorators: {
2418
2629
  label: [{
2419
2630
  type: i0.Input,
@@ -2450,6 +2661,50 @@ i0.ɵɵngDeclareClassMetadata({
2450
2661
  type: i0.Output,
2451
2662
  args: ["checkedChange"]
2452
2663
  }],
2664
+ required: [{
2665
+ type: i0.Input,
2666
+ args: [{
2667
+ isSignal: true,
2668
+ alias: "required",
2669
+ required: false
2670
+ }]
2671
+ }],
2672
+ requiredMessage: [{
2673
+ type: i0.Input,
2674
+ args: [{
2675
+ isSignal: true,
2676
+ alias: "requiredMessage",
2677
+ required: false
2678
+ }]
2679
+ }],
2680
+ hint: [{
2681
+ type: i0.Input,
2682
+ args: [{
2683
+ isSignal: true,
2684
+ alias: "hint",
2685
+ required: false
2686
+ }]
2687
+ }],
2688
+ error: [{
2689
+ type: i0.Input,
2690
+ args: [{
2691
+ isSignal: true,
2692
+ alias: "error",
2693
+ required: false
2694
+ }]
2695
+ }],
2696
+ showErrors: [{
2697
+ type: i0.Input,
2698
+ args: [{
2699
+ isSignal: true,
2700
+ alias: "showErrors",
2701
+ required: false
2702
+ }]
2703
+ }],
2704
+ invalidChange: [{
2705
+ type: i0.Output,
2706
+ args: ["invalidChange"]
2707
+ }],
2453
2708
  _disabledInput: [{
2454
2709
  type: i0.Input,
2455
2710
  args: [{
@@ -2473,6 +2728,7 @@ var ButtonComponent = class ButtonComponent {
2473
2728
  this.ariaLabel = input(void 0, ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
2474
2729
  this.ariaExpanded = input(void 0, ...ngDevMode ? [{ debugName: "ariaExpanded" }] : /* istanbul ignore next */ []);
2475
2730
  this.ariaPressed = input(void 0, ...ngDevMode ? [{ debugName: "ariaPressed" }] : /* istanbul ignore next */ []);
2731
+ this.ariaDescribedBy = input(void 0, ...ngDevMode ? [{ debugName: "ariaDescribedBy" }] : /* istanbul ignore next */ []);
2476
2732
  }
2477
2733
  static {
2478
2734
  this.ɵfac = i0.ɵɵngDeclareFactory({
@@ -2569,6 +2825,13 @@ var ButtonComponent = class ButtonComponent {
2569
2825
  isRequired: false,
2570
2826
  transformFunction: null
2571
2827
  },
2828
+ ariaDescribedBy: {
2829
+ classPropertyName: "ariaDescribedBy",
2830
+ publicName: "ariaDescribedBy",
2831
+ isSignal: true,
2832
+ isRequired: false,
2833
+ transformFunction: null
2834
+ },
2572
2835
  _footerLeft: {
2573
2836
  classPropertyName: "_footerLeft",
2574
2837
  publicName: "modal-footer-left",
@@ -2595,6 +2858,7 @@ var ButtonComponent = class ButtonComponent {
2595
2858
  [attr.aria-label]="ariaLabel()"
2596
2859
  [attr.aria-expanded]="ariaExpanded()"
2597
2860
  [attr.aria-pressed]="ariaPressed()"
2861
+ [attr.aria-describedby]="ariaDescribedBy() || null"
2598
2862
  [style.background]="color() || null"
2599
2863
  [style.border-color]="color() || null"
2600
2864
  >
@@ -2631,6 +2895,7 @@ i0.ɵɵngDeclareClassMetadata({
2631
2895
  [attr.aria-label]="ariaLabel()"
2632
2896
  [attr.aria-expanded]="ariaExpanded()"
2633
2897
  [attr.aria-pressed]="ariaPressed()"
2898
+ [attr.aria-describedby]="ariaDescribedBy() || null"
2634
2899
  [style.background]="color() || null"
2635
2900
  [style.border-color]="color() || null"
2636
2901
  >
@@ -2732,6 +2997,14 @@ i0.ɵɵngDeclareClassMetadata({
2732
2997
  required: false
2733
2998
  }]
2734
2999
  }],
3000
+ ariaDescribedBy: [{
3001
+ type: i0.Input,
3002
+ args: [{
3003
+ isSignal: true,
3004
+ alias: "ariaDescribedBy",
3005
+ required: false
3006
+ }]
3007
+ }],
2735
3008
  _footerLeft: [{
2736
3009
  type: Input,
2737
3010
  args: ["modal-footer-left"]
@@ -2742,85 +3015,6 @@ i0.ɵɵngDeclareClassMetadata({
2742
3015
  }]
2743
3016
  }
2744
3017
  });
2745
- var UiFieldValidity = class {};
2746
- function issueToErrors(issue) {
2747
- return issue ? { [issue.key]: issue.value ?? true } : null;
2748
- }
2749
- function requiredIssue(label) {
2750
- return {
2751
- key: "required",
2752
- message: `${label.trim() || "This field"} is required.`
2753
- };
2754
- }
2755
- function maxLengthIssue(text, max) {
2756
- if (max == null || max < 0 || text.length <= max) return null;
2757
- return {
2758
- key: "maxlength",
2759
- message: `Too long (max ${max} characters).`,
2760
- value: {
2761
- requiredLength: max,
2762
- actualLength: text.length
2763
- }
2764
- };
2765
- }
2766
- function createFieldReveal(showErrors) {
2767
- const touched = signal(false, ...ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []);
2768
- let previous = false;
2769
- effect(() => {
2770
- const show = showErrors();
2771
- if (previous && !show) touched.set(false);
2772
- previous = show;
2773
- });
2774
- return {
2775
- touched,
2776
- revealed: computed(() => touched() || showErrors())
2777
- };
2778
- }
2779
- const MONTHS = [
2780
- "Jan",
2781
- "Feb",
2782
- "Mar",
2783
- "Apr",
2784
- "May",
2785
- "Jun",
2786
- "Jul",
2787
- "Aug",
2788
- "Sep",
2789
- "Oct",
2790
- "Nov",
2791
- "Dec"
2792
- ];
2793
- function parseIso(value, withTime) {
2794
- const m = /^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2})(?::\d{2}(?:\.\d+)?)?)?$/.exec(value.trim());
2795
- if (!m) return null;
2796
- if (withTime && m[4] === void 0) return null;
2797
- if (!withTime && m[4] !== void 0) return null;
2798
- const y = Number(m[1]), mo = Number(m[2]), d = Number(m[3]);
2799
- const h = m[4] === void 0 ? 0 : Number(m[4]);
2800
- const mi = m[5] === void 0 ? 0 : Number(m[5]);
2801
- if (mo < 1 || mo > 12 || d < 1 || d > new Date(Date.UTC(y, mo, 0)).getUTCDate()) return null;
2802
- if (h > 23 || mi > 59) return null;
2803
- return {
2804
- y,
2805
- mo,
2806
- d,
2807
- h,
2808
- mi
2809
- };
2810
- }
2811
- function formatIsoDate(value) {
2812
- const p = parseIso(value, false);
2813
- return p ? `${MONTHS[p.mo - 1]} ${p.d}, ${p.y}` : value;
2814
- }
2815
- function formatIsoDateTime(value) {
2816
- const p = parseIso(value, true);
2817
- if (!p) return value;
2818
- const hour = p.h % 12 === 0 ? 12 : p.h % 12;
2819
- return `${MONTHS[p.mo - 1]} ${p.d}, ${p.y}, ${hour}:${String(p.mi).padStart(2, "0")} ${p.h < 12 ? "AM" : "PM"}`;
2820
- }
2821
- function isoKey(p) {
2822
- return (((p.y * 100 + p.mo) * 100 + p.d) * 100 + p.h) * 100 + p.mi;
2823
- }
2824
3018
  var TextInputComponent = class TextInputComponent {
2825
3019
  static {
2826
3020
  this._EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
@@ -3399,7 +3593,7 @@ var TableToolbarComponent = class TableToolbarComponent {
3399
3593
  this.additionalDropdownButtons = computed(() => this._allowedButtons().filter((b) => !b.variant && !b.hidden && b.type !== "import" && b.type !== "export").sort((a, b) => a.label.localeCompare(b.label, void 0, { sensitivity: "base" })), ...ngDevMode ? [{ debugName: "additionalDropdownButtons" }] : /* istanbul ignore next */ []);
3400
3594
  this.showSavedViewsItem = computed(() => this.showSavedViews() && (!this.readOnly() || this.savedViews().length > 0), ...ngDevMode ? [{ debugName: "showSavedViewsItem" }] : /* istanbul ignore next */ []);
3401
3595
  this.hasMoreItems = computed(() => !!this.exportDropdownButton() || !!this.importButton() || !this.readOnly() || this.showSavedViewsItem() || this.additionalDropdownButtons().length > 0, ...ngDevMode ? [{ debugName: "hasMoreItems" }] : /* istanbul ignore next */ []);
3402
- this.configurableColumns = computed(() => this.columns().filter((c) => c.key !== this.lockedColumn()), ...ngDevMode ? [{ debugName: "configurableColumns" }] : /* istanbul ignore next */ []);
3596
+ this.configurableColumns = computed(() => this.columns().filter((c) => c.key !== this.lockedColumn() && c.cellType !== "actions"), ...ngDevMode ? [{ debugName: "configurableColumns" }] : /* istanbul ignore next */ []);
3403
3597
  this.hiddenCount = computed(() => this.configurableColumns().filter((c) => !this.visibleColumns().includes(c.key)).length, ...ngDevMode ? [{ debugName: "hiddenCount" }] : /* istanbul ignore next */ []);
3404
3598
  this.activeViewName = computed(() => this.savedViews().find((v) => v.id === this.activeViewId())?.name ?? "", ...ngDevMode ? [{ debugName: "activeViewName" }] : /* istanbul ignore next */ []);
3405
3599
  this.sortedViews = computed(() => {
@@ -3416,7 +3610,7 @@ var TableToolbarComponent = class TableToolbarComponent {
3416
3610
  this._pendingCols.update((cols) => cols.includes(key) ? cols.filter((k) => k !== key) : [...cols, key]);
3417
3611
  }
3418
3612
  applyColumns() {
3419
- this.visibleColumnsChange.emit(this._pendingCols());
3613
+ this.visibleColumnsChange.emit(this._pendingCols().filter((k) => !this.columns().some((c) => c.key === k && c.cellType === "actions")));
3420
3614
  this.colModalOpen.set(false);
3421
3615
  }
3422
3616
  closeColModal() {
@@ -3757,9 +3951,14 @@ var TableToolbarComponent = class TableToolbarComponent {
3757
3951
  "ariaLabel",
3758
3952
  "indeterminate",
3759
3953
  "checked",
3954
+ "required",
3955
+ "requiredMessage",
3956
+ "hint",
3957
+ "error",
3958
+ "showErrors",
3760
3959
  "disabled"
3761
3960
  ],
3762
- outputs: ["checkedChange"]
3961
+ outputs: ["checkedChange", "invalidChange"]
3763
3962
  },
3764
3963
  {
3765
3964
  kind: "component",
@@ -3777,6 +3976,7 @@ var TableToolbarComponent = class TableToolbarComponent {
3777
3976
  "ariaLabel",
3778
3977
  "ariaExpanded",
3779
3978
  "ariaPressed",
3979
+ "ariaDescribedBy",
3780
3980
  "modal-footer-left",
3781
3981
  "modal-footer-right"
3782
3982
  ]
@@ -4073,6 +4273,35 @@ i0.ɵɵngDeclareClassMetadata({
4073
4273
  }]
4074
4274
  }
4075
4275
  });
4276
+ function needsEscape(value) {
4277
+ return value.includes(",") || value.includes("\\\\") || value.endsWith("\\");
4278
+ }
4279
+ function encodeFilterValue(value) {
4280
+ return needsEscape(value) ? value.replace(/\\/g, "\\\\").replace(/,/g, "\\,") : value;
4281
+ }
4282
+ function encodeFilterValues(values) {
4283
+ return values.map(encodeFilterValue).join(",");
4284
+ }
4285
+ function decodeFilterValues(raw) {
4286
+ const out = [];
4287
+ let current = "";
4288
+ for (let i = 0; i < raw.length; i++) {
4289
+ const ch = raw[i];
4290
+ if (ch === "\\" && (raw[i + 1] === "," || raw[i + 1] === "\\")) {
4291
+ current += raw[i + 1];
4292
+ i++;
4293
+ continue;
4294
+ }
4295
+ if (ch === ",") {
4296
+ out.push(current);
4297
+ current = "";
4298
+ continue;
4299
+ }
4300
+ current += ch;
4301
+ }
4302
+ out.push(current);
4303
+ return out.map((v) => v.trim()).filter(Boolean);
4304
+ }
4076
4305
  function getEligibleOptions(options, selectedItems, field) {
4077
4306
  if (selectedItems.length === 0) return options;
4078
4307
  return options.filter((opt) => !selectedItems.every((item) => String(item[field] ?? "") === opt.value));
@@ -4349,16 +4578,159 @@ i0.ɵɵngDeclareClassMetadata({
4349
4578
  }]
4350
4579
  }
4351
4580
  });
4581
+ let nextTooltipId = 0;
4582
+ var TooltipDirective = class TooltipDirective {
4583
+ constructor() {
4584
+ this.uiTooltip = input("", ...ngDevMode ? [{ debugName: "uiTooltip" }] : /* istanbul ignore next */ []);
4585
+ this.tooltipPosition = input("top", ...ngDevMode ? [{ debugName: "tooltipPosition" }] : /* istanbul ignore next */ []);
4586
+ this.host = inject(ElementRef).nativeElement;
4587
+ this.doc = inject(DOCUMENT);
4588
+ this.bubble = null;
4589
+ this.id = `ui-tooltip-${nextTooltipId++}`;
4590
+ inject(DestroyRef).onDestroy(() => this.hide());
4591
+ }
4592
+ show() {
4593
+ const text = this.uiTooltip();
4594
+ if (!text || this.bubble) return;
4595
+ const el = this.doc.createElement("div");
4596
+ el.id = this.id;
4597
+ el.setAttribute("role", "tooltip");
4598
+ el.textContent = text;
4599
+ Object.assign(el.style, {
4600
+ position: "fixed",
4601
+ zIndex: "10000",
4602
+ maxWidth: "280px",
4603
+ padding: "6px 10px",
4604
+ background: "#0f172a",
4605
+ color: "#fff",
4606
+ fontSize: "0.75rem",
4607
+ lineHeight: "1.4",
4608
+ borderRadius: "6px",
4609
+ boxShadow: "0 4px 12px rgba(15,23,42,.25)",
4610
+ whiteSpace: "pre-line",
4611
+ pointerEvents: "none",
4612
+ visibility: "hidden"
4613
+ });
4614
+ this.doc.body.appendChild(el);
4615
+ this.bubble = el;
4616
+ this.host.setAttribute("aria-describedby", this.id);
4617
+ const r = this.host.getBoundingClientRect();
4618
+ const b = el.getBoundingClientRect();
4619
+ const gap = 6;
4620
+ let top = this.tooltipPosition() === "top" ? r.top - b.height - gap : r.bottom + gap;
4621
+ if (top < 4) top = r.bottom + gap;
4622
+ else if (top + b.height > window.innerHeight - 4) top = r.top - b.height - gap;
4623
+ const left = Math.min(Math.max(4, r.left + r.width / 2 - b.width / 2), window.innerWidth - b.width - 4);
4624
+ el.style.top = `${top}px`;
4625
+ el.style.left = `${left}px`;
4626
+ el.style.visibility = "visible";
4627
+ }
4628
+ hide() {
4629
+ this.bubble?.remove();
4630
+ this.bubble = null;
4631
+ this.host.removeAttribute("aria-describedby");
4632
+ }
4633
+ static {
4634
+ this.ɵfac = i0.ɵɵngDeclareFactory({
4635
+ minVersion: "12.0.0",
4636
+ version: "22.2.2",
4637
+ ngImport: i0,
4638
+ type: TooltipDirective,
4639
+ deps: [],
4640
+ target: i0.ɵɵFactoryTarget.Directive
4641
+ });
4642
+ }
4643
+ static {
4644
+ this.ɵdir = i0.ɵɵngDeclareDirective({
4645
+ minVersion: "17.1.0",
4646
+ version: "22.2.2",
4647
+ type: TooltipDirective,
4648
+ isStandalone: true,
4649
+ selector: "[uiTooltip]",
4650
+ inputs: {
4651
+ uiTooltip: {
4652
+ classPropertyName: "uiTooltip",
4653
+ publicName: "uiTooltip",
4654
+ isSignal: true,
4655
+ isRequired: false,
4656
+ transformFunction: null
4657
+ },
4658
+ tooltipPosition: {
4659
+ classPropertyName: "tooltipPosition",
4660
+ publicName: "tooltipPosition",
4661
+ isSignal: true,
4662
+ isRequired: false,
4663
+ transformFunction: null
4664
+ }
4665
+ },
4666
+ host: { listeners: {
4667
+ "mouseenter": "show()",
4668
+ "mouseleave": "hide()",
4669
+ "focusin": "show()",
4670
+ "focusout": "hide()",
4671
+ "keydown.escape": "hide()",
4672
+ "click": "hide()"
4673
+ } },
4674
+ ngImport: i0
4675
+ });
4676
+ }
4677
+ };
4678
+ i0.ɵɵngDeclareClassMetadata({
4679
+ minVersion: "12.0.0",
4680
+ version: "22.2.2",
4681
+ ngImport: i0,
4682
+ type: TooltipDirective,
4683
+ decorators: [{
4684
+ type: Directive,
4685
+ args: [{
4686
+ selector: "[uiTooltip]",
4687
+ standalone: true,
4688
+ host: {
4689
+ "(mouseenter)": "show()",
4690
+ "(mouseleave)": "hide()",
4691
+ "(focusin)": "show()",
4692
+ "(focusout)": "hide()",
4693
+ "(keydown.escape)": "hide()",
4694
+ "(click)": "hide()"
4695
+ }
4696
+ }]
4697
+ }],
4698
+ ctorParameters: () => [],
4699
+ propDecorators: {
4700
+ uiTooltip: [{
4701
+ type: i0.Input,
4702
+ args: [{
4703
+ isSignal: true,
4704
+ alias: "uiTooltip",
4705
+ required: false
4706
+ }]
4707
+ }],
4708
+ tooltipPosition: [{
4709
+ type: i0.Input,
4710
+ args: [{
4711
+ isSignal: true,
4712
+ alias: "tooltipPosition",
4713
+ required: false
4714
+ }]
4715
+ }]
4716
+ }
4717
+ });
4352
4718
  var ProgressBarComponent = class ProgressBarComponent {
4353
4719
  constructor() {
4354
4720
  this.value = input(0, ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
4355
4721
  this.max = input(100, ...ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []);
4356
4722
  this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
4357
- this.variant = input("blue", ...ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []);
4723
+ this.variant = input(null, ...ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []);
4358
4724
  this.tooltip = input("", ...ngDevMode ? [{ debugName: "tooltip" }] : /* istanbul ignore next */ []);
4359
4725
  this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
4360
4726
  this.clampedValue = computed(() => Math.min(Math.max(this.value(), 0), this.max()), ...ngDevMode ? [{ debugName: "clampedValue" }] : /* istanbul ignore next */ []);
4361
4727
  this.percent = computed(() => this.max() > 0 ? Math.round(this.clampedValue() / this.max() * 100) : 0, ...ngDevMode ? [{ debugName: "percent" }] : /* istanbul ignore next */ []);
4728
+ this.effectiveVariant = computed(() => {
4729
+ const fixed = this.variant();
4730
+ if (fixed) return fixed;
4731
+ const exact = this.max() > 0 ? this.clampedValue() / this.max() * 100 : 0;
4732
+ return exact <= 25 ? "red" : exact <= 50 ? "amber" : exact <= 75 ? "blue" : "green";
4733
+ }, ...ngDevMode ? [{ debugName: "effectiveVariant" }] : /* istanbul ignore next */ []);
4362
4734
  }
4363
4735
  static {
4364
4736
  this.ɵfac = i0.ɵɵngDeclareFactory({
@@ -4429,13 +4801,20 @@ var ProgressBarComponent = class ProgressBarComponent {
4429
4801
  [attr.aria-valuemax]="max()"
4430
4802
  [attr.aria-valuenow]="clampedValue()"
4431
4803
  [attr.aria-label]="ariaLabel() || label() || null"
4432
- [attr.title]="tooltip() || null">
4433
- <div class="pb-track"><div class="pb-fill" [class]="'pb-fill pb-' + variant()" [style.width.%]="percent()"></div></div>
4804
+ [uiTooltip]="tooltip()"
4805
+ [attr.tabindex]="tooltip() ? 0 : null">
4806
+ <div class="pb-track"><div class="pb-fill" [class]="'pb-fill pb-' + effectiveVariant()" [style.width.%]="percent()"></div></div>
4434
4807
  @if (label()) { <span class="pb-label">{{ label() }}</span> }
4435
4808
  </div>
4436
4809
  `,
4437
4810
  isInline: true,
4438
4811
  styles: [":host{display:block}.pb{display:flex;align-items:center;gap:8px;min-width:100px}.pb-track{flex:1;height:6px;background:#e2e8f0;border-radius:3px;overflow:hidden}.pb-fill{height:100%;border-radius:3px;transition:width .3s}.pb-blue{background:#3b82f6}.pb-green{background:#16a34a}.pb-amber{background:#f59e0b}.pb-red{background:#ef4444}.pb-slate{background:#94a3b8}.pb-label{font-size:.75rem;font-weight:500;color:#64748b;white-space:nowrap}\n"],
4812
+ dependencies: [{
4813
+ kind: "directive",
4814
+ type: TooltipDirective,
4815
+ selector: "[uiTooltip]",
4816
+ inputs: ["uiTooltip", "tooltipPosition"]
4817
+ }],
4439
4818
  changeDetection: i0.ChangeDetectionStrategy.OnPush
4440
4819
  });
4441
4820
  }
@@ -4450,6 +4829,7 @@ i0.ɵɵngDeclareClassMetadata({
4450
4829
  args: [{
4451
4830
  selector: "ui-progress-bar",
4452
4831
  standalone: true,
4832
+ imports: [TooltipDirective],
4453
4833
  changeDetection: ChangeDetectionStrategy.OnPush,
4454
4834
  template: `
4455
4835
  <div class="pb"
@@ -4458,8 +4838,9 @@ i0.ɵɵngDeclareClassMetadata({
4458
4838
  [attr.aria-valuemax]="max()"
4459
4839
  [attr.aria-valuenow]="clampedValue()"
4460
4840
  [attr.aria-label]="ariaLabel() || label() || null"
4461
- [attr.title]="tooltip() || null">
4462
- <div class="pb-track"><div class="pb-fill" [class]="'pb-fill pb-' + variant()" [style.width.%]="percent()"></div></div>
4841
+ [uiTooltip]="tooltip()"
4842
+ [attr.tabindex]="tooltip() ? 0 : null">
4843
+ <div class="pb-track"><div class="pb-fill" [class]="'pb-fill pb-' + effectiveVariant()" [style.width.%]="percent()"></div></div>
4463
4844
  @if (label()) { <span class="pb-label">{{ label() }}</span> }
4464
4845
  </div>
4465
4846
  `,
@@ -5789,6 +6170,7 @@ var ImportExportComponent = class ImportExportComponent {
5789
6170
  "ariaLabel",
5790
6171
  "ariaExpanded",
5791
6172
  "ariaPressed",
6173
+ "ariaDescribedBy",
5792
6174
  "modal-footer-left",
5793
6175
  "modal-footer-right"
5794
6176
  ]
@@ -6275,6 +6657,7 @@ var ConfirmOutletComponent = class ConfirmOutletComponent {
6275
6657
  "ariaLabel",
6276
6658
  "ariaExpanded",
6277
6659
  "ariaPressed",
6660
+ "ariaDescribedBy",
6278
6661
  "modal-footer-left",
6279
6662
  "modal-footer-right"
6280
6663
  ]
@@ -6619,6 +7002,7 @@ var ErrorStateComponent = class ErrorStateComponent {
6619
7002
  "ariaLabel",
6620
7003
  "ariaExpanded",
6621
7004
  "ariaPressed",
7005
+ "ariaDescribedBy",
6622
7006
  "modal-footer-left",
6623
7007
  "modal-footer-right"
6624
7008
  ]
@@ -6707,6 +7091,9 @@ var DataTableComponent = class DataTableComponent {
6707
7091
  _countLabel(count) {
6708
7092
  return count === 1 ? this.itemLabel() : this.itemLabelPlural() || pluralize(this.itemLabel());
6709
7093
  }
7094
+ _deleteTitle() {
7095
+ return `Delete ${(this.itemLabelPlural() || pluralize(this.itemLabel())).replace(/(^|\s)(\S)/g, (_m, sp, ch) => sp + ch.toUpperCase())}`;
7096
+ }
6710
7097
  _presentKeys(counts) {
6711
7098
  return Object.keys(counts).filter((k) => k !== "" && k !== "all" && (counts[k] ?? 0) > 0);
6712
7099
  }
@@ -6724,6 +7111,10 @@ var DataTableComponent = class DataTableComponent {
6724
7111
  }
6725
7112
  return null;
6726
7113
  }
7114
+ _configurableKeys(keys) {
7115
+ const actionKeys = new Set(this.columns().filter((c) => c.cellType === "actions").map((c) => c.key));
7116
+ return (keys ?? []).filter((k) => !actionKeys.has(k));
7117
+ }
6727
7118
  _rowClickable() {
6728
7119
  const listeners = this.rowClick.listeners;
6729
7120
  return listeners === void 0 ? true : (listeners?.length ?? 0) > 0;
@@ -6732,11 +7123,11 @@ var DataTableComponent = class DataTableComponent {
6732
7123
  const opts = this._getOptionsForField(def.field);
6733
7124
  return def.exclude?.length ? opts.filter((o) => !this._isBulkExcluded(def, o.value)) : opts;
6734
7125
  }
6735
- _canBulkMove(def, current, target) {
7126
+ _canBulkMove(def, current, target, row) {
6736
7127
  const cur = String(current ?? "");
6737
7128
  if (cur === String(target)) return false;
6738
- if (!def.allowedFrom) return true;
6739
- return !!def.allowedFrom[target]?.includes(cur);
7129
+ if (def.allowedFrom && !def.allowedFrom[target]?.includes(cur)) return false;
7130
+ return !def.canChange || row === void 0 || def.canChange(row, String(target));
6740
7131
  }
6741
7132
  _isBulkExcluded(def, value) {
6742
7133
  if (!def.exclude?.length) return false;
@@ -6752,12 +7143,16 @@ var DataTableComponent = class DataTableComponent {
6752
7143
  const raw = col.nameFn ? col.nameFn(item) : col.render ? col.render(item) : item[col.key];
6753
7144
  return raw == null ? "" : String(raw).trim();
6754
7145
  }
6755
- selectRowLabel(item) {
7146
+ rowAccessibleName(item) {
6756
7147
  const name = this.rowName(item);
7148
+ return name ? `${name}${this._rowNameSuffix().get(item) ?? ""}` : "";
7149
+ }
7150
+ selectRowLabel(item) {
7151
+ const name = this.rowAccessibleName(item);
6757
7152
  return name ? `Select ${name}` : "Select row";
6758
7153
  }
6759
7154
  rowActionsLabel(item) {
6760
- const name = this.rowName(item);
7155
+ const name = this.rowAccessibleName(item);
6761
7156
  return name ? `Row actions for ${name}` : "Row actions";
6762
7157
  }
6763
7158
  toggleSelectAll() {
@@ -6824,7 +7219,7 @@ var DataTableComponent = class DataTableComponent {
6824
7219
  const blockedCount = split.blocked.length;
6825
7220
  const skippedNote = blockedCount === 0 ? "" : blockedCount === 1 ? " 1 selected row can't be deleted and will be skipped." : ` ${blockedCount} selected rows can't be deleted and will be skipped.`;
6826
7221
  const deleteDefault = {
6827
- title: "Delete Selected",
7222
+ title: this._deleteTitle(),
6828
7223
  message: `Delete ${count} ${this._countLabel(count)}? This cannot be undone.${skippedNote}`,
6829
7224
  confirmLabel: "Delete",
6830
7225
  variant: "danger"
@@ -6989,7 +7384,7 @@ var DataTableComponent = class DataTableComponent {
6989
7384
  }
6990
7385
  if (action.startsWith("change-") && targetValue !== void 0) {
6991
7386
  const field = action.slice(7);
6992
- const eligible = selected.filter((item) => def ? this._canBulkMove(def, item[field], targetValue) : String(item[field] ?? "") !== String(targetValue));
7387
+ const eligible = selected.filter((item) => def ? this._canBulkMove(def, item[field], targetValue, item) : String(item[field] ?? "") !== String(targetValue));
6993
7388
  return {
6994
7389
  eligibleIds: eligible.map((i) => i.id),
6995
7390
  skippedCount: selected.length - eligible.length
@@ -7116,6 +7511,7 @@ var DataTableComponent = class DataTableComponent {
7116
7511
  }, ...ngDevMode ? [{ debugName: "_effectiveTabs" }] : /* istanbul ignore next */ []);
7117
7512
  this._error = signal(null, ...ngDevMode ? [{ debugName: "_error" }] : /* istanbul ignore next */ []);
7118
7513
  this._search = signal("", ...ngDevMode ? [{ debugName: "_search" }] : /* istanbul ignore next */ []);
7514
+ this._searchParam = computed(() => this._search().toLowerCase(), ...ngDevMode ? [{ debugName: "_searchParam" }] : /* istanbul ignore next */ []);
7119
7515
  this._page = signal(1, ...ngDevMode ? [{ debugName: "_page" }] : /* istanbul ignore next */ []);
7120
7516
  this._sortField = signal(null, ...ngDevMode ? [{ debugName: "_sortField" }] : /* istanbul ignore next */ []);
7121
7517
  this._sortDir = signal("asc", ...ngDevMode ? [{ debugName: "_sortDir" }] : /* istanbul ignore next */ []);
@@ -7131,7 +7527,7 @@ var DataTableComponent = class DataTableComponent {
7131
7527
  const vis = this._visibleColumns();
7132
7528
  const cols = this.columns();
7133
7529
  const numericKeys = this._numericKeys();
7134
- const base = vis.length ? cols.filter((c) => vis.includes(c.key)) : cols.filter((c) => c.defaultVisible !== false);
7530
+ const base = vis.length ? cols.filter((c) => c.cellType === "actions" || vis.includes(c.key)) : cols.filter((c) => c.defaultVisible !== false);
7135
7531
  const dates = [];
7136
7532
  const status = [];
7137
7533
  const regular = [];
@@ -7190,7 +7586,7 @@ var DataTableComponent = class DataTableComponent {
7190
7586
  this._exportParams = computed(() => {
7191
7587
  const params = { ...this._extraParams() };
7192
7588
  if (this._search()) {
7193
- params["search"] = this._search();
7589
+ params["search"] = this._searchParam();
7194
7590
  if (this._searchFields()) params["searchFields"] = this._searchFields();
7195
7591
  }
7196
7592
  if (this._activeTab()) params["filter"] = this._activeTab();
@@ -7199,7 +7595,7 @@ var DataTableComponent = class DataTableComponent {
7199
7595
  params["direction"] = this._sortDir();
7200
7596
  }
7201
7597
  const cf = this._colFilterValues();
7202
- for (const [key, vals] of Object.entries(cf)) if (vals.length > 0) params[key] = vals.join(",");
7598
+ for (const [key, vals] of Object.entries(cf)) if (vals.length > 0) params[key] = encodeFilterValues(vals);
7203
7599
  return params;
7204
7600
  }, ...ngDevMode ? [{ debugName: "_exportParams" }] : /* istanbul ignore next */ []);
7205
7601
  this._effectiveButtons = computed(() => {
@@ -7237,6 +7633,7 @@ var DataTableComponent = class DataTableComponent {
7237
7633
  const exclude = typeof entry === "string" ? [] : entry.exclude ?? [];
7238
7634
  const col = this.columns().find((c) => c.key === key);
7239
7635
  const allowedFrom = typeof entry === "string" ? void 0 : entry.allowedFrom;
7636
+ const canChange = typeof entry === "string" ? void 0 : entry.canChange;
7240
7637
  return {
7241
7638
  type: `change-${key}`,
7242
7639
  label: `Change ${col?.label ?? key}`,
@@ -7244,6 +7641,7 @@ var DataTableComponent = class DataTableComponent {
7244
7641
  field: key,
7245
7642
  ...exclude.length ? { exclude } : {},
7246
7643
  ...allowedFrom ? { allowedFrom } : {},
7644
+ ...canChange ? { canChange } : {},
7247
7645
  ...confirm ? { confirm } : {}
7248
7646
  };
7249
7647
  }).filter((def) => !def.field || !def.exclude?.length || this._bulkOptionsFor(def).length > 0), ...ngDevMode ? [{ debugName: "_bulkDefs" }] : /* istanbul ignore next */ []);
@@ -7261,8 +7659,8 @@ var DataTableComponent = class DataTableComponent {
7261
7659
  const allOpts = this._bulkOptionsFor(def);
7262
7660
  const selected = this._items().filter((i) => this._selectedIds().has(i["id"]));
7263
7661
  const eligible = getEligibleOptions(allOpts, selected, def.field);
7264
- if (!def.allowedFrom) return eligible;
7265
- return eligible.filter((o) => selected.some((i) => this._canBulkMove(def, i[def.field], o.value)));
7662
+ if (!def.allowedFrom && !def.canChange) return eligible;
7663
+ return eligible.filter((o) => selected.some((i) => this._canBulkMove(def, i[def.field], o.value, i)));
7266
7664
  }, ...ngDevMode ? [{ debugName: "_eligibleBulkOptions" }] : /* istanbul ignore next */ []);
7267
7665
  this._allSelected = computed(() => {
7268
7666
  const items = this._items();
@@ -7270,6 +7668,22 @@ var DataTableComponent = class DataTableComponent {
7270
7668
  return items.length > 0 && items.every((item) => sel.has(item["id"]));
7271
7669
  }, ...ngDevMode ? [{ debugName: "_allSelected" }] : /* istanbul ignore next */ []);
7272
7670
  this._someSelected = computed(() => this._selectedIds().size > 0 && !this._allSelected(), ...ngDevMode ? [{ debugName: "_someSelected" }] : /* istanbul ignore next */ []);
7671
+ this._rowNameSuffix = computed(() => {
7672
+ const items = this._items();
7673
+ const names = items.map((item) => this.rowName(item));
7674
+ const total = /* @__PURE__ */ new Map();
7675
+ for (const n of names) if (n) total.set(n, (total.get(n) ?? 0) + 1);
7676
+ const seen = /* @__PURE__ */ new Map();
7677
+ const out = /* @__PURE__ */ new Map();
7678
+ items.forEach((item, index) => {
7679
+ const n = names[index];
7680
+ if (!n || (total.get(n) ?? 0) < 2) return;
7681
+ const k = (seen.get(n) ?? 0) + 1;
7682
+ seen.set(n, k);
7683
+ out.set(item, ` (${k} of ${total.get(n)})`);
7684
+ });
7685
+ return out;
7686
+ }, ...ngDevMode ? [{ debugName: "_rowNameSuffix" }] : /* istanbul ignore next */ []);
7273
7687
  this._confirmingBulk = false;
7274
7688
  this._rowDeleteTarget = signal(null, ...ngDevMode ? [{ debugName: "_rowDeleteTarget" }] : /* istanbul ignore next */ []);
7275
7689
  this._rowDeleting = signal(false, ...ngDevMode ? [{ debugName: "_rowDeleting" }] : /* istanbul ignore next */ []);
@@ -7334,14 +7748,14 @@ var DataTableComponent = class DataTableComponent {
7334
7748
  this._error.set(null);
7335
7749
  let params = new HttpParams({ fromObject: this._extraParams() }).set("page", this._page() - 1).set("size", this.pageSize());
7336
7750
  if (this._search()) {
7337
- params = params.set("search", this._search());
7751
+ params = params.set("search", this._searchParam());
7338
7752
  const searchFields = this._searchFields();
7339
7753
  if (searchFields) params = params.set("searchFields", searchFields);
7340
7754
  }
7341
7755
  if (this._sortField()) params = params.set("sort", this._sortField()).set("direction", this._sortDir());
7342
7756
  if (this._activeTab()) params = params.set("filter", this._activeTab());
7343
7757
  const cf = this._colFilterValues();
7344
- for (const [key, vals] of Object.entries(cf)) if (vals.length > 0) params = params.set(key, vals.join(","));
7758
+ for (const [key, vals] of Object.entries(cf)) if (vals.length > 0) params = params.set(key, encodeFilterValues(vals));
7345
7759
  return this.http.get(`${this.config.baseUrl}${this.endpoint()}`, { params }).pipe(catchError(() => {
7346
7760
  this._error.set("Something went wrong. Please try again.");
7347
7761
  return of(null);
@@ -7367,7 +7781,7 @@ var DataTableComponent = class DataTableComponent {
7367
7781
  _countParams() {
7368
7782
  const params = { ...this._extraParams() };
7369
7783
  if (this._search()) {
7370
- params["search"] = this._search();
7784
+ params["search"] = this._searchParam();
7371
7785
  if (this._searchFields()) params["searchFields"] = this._searchFields();
7372
7786
  }
7373
7787
  return params;
@@ -7547,13 +7961,13 @@ var DataTableComponent = class DataTableComponent {
7547
7961
  }
7548
7962
  getState() {
7549
7963
  const columnFilters = {};
7550
- for (const [key, vals] of Object.entries(this._colFilterValues())) if (vals.length > 0) columnFilters[key] = vals.join(",");
7964
+ for (const [key, vals] of Object.entries(this._colFilterValues())) if (vals.length > 0) columnFilters[key] = encodeFilterValues(vals);
7551
7965
  return {
7552
7966
  columnFilters,
7553
7967
  quickFilter: this._activeTab() || null,
7554
7968
  sortField: this._sortField() || null,
7555
7969
  sortDir: this._sortField() ? this._sortDir() : null,
7556
- visibleColumns: this._visibleColumns().length ? [...this._visibleColumns()] : []
7970
+ visibleColumns: this._configurableKeys(this._visibleColumns())
7557
7971
  };
7558
7972
  }
7559
7973
  applyView(view) {
@@ -7566,7 +7980,7 @@ var DataTableComponent = class DataTableComponent {
7566
7980
  this._sortField.set(null);
7567
7981
  this._sortDir.set("asc");
7568
7982
  }
7569
- this._visibleColumns.set(view.visibleColumns?.length ? view.visibleColumns : []);
7983
+ this._visibleColumns.set(this._configurableKeys(view.visibleColumns));
7570
7984
  if (view.columnFilters && typeof view.columnFilters === "object") this._colFilterValues.set(this._restorableColumnFilters(view.columnFilters));
7571
7985
  this.resetToFirstPage();
7572
7986
  }
@@ -7577,7 +7991,7 @@ var DataTableComponent = class DataTableComponent {
7577
7991
  for (const [key, raw] of Object.entries(saved)) {
7578
7992
  if (!keys.has(key) || typeof raw !== "string") continue;
7579
7993
  const known = Object.keys(counts[key] ?? {});
7580
- let vals = raw.split(",").map((v) => v.trim()).filter(Boolean);
7994
+ let vals = decodeFilterValues(raw);
7581
7995
  if (known.length > 0) vals = vals.filter((v) => known.includes(v));
7582
7996
  if (vals.length > 0) out[key] = vals;
7583
7997
  }
@@ -7630,7 +8044,7 @@ var DataTableComponent = class DataTableComponent {
7630
8044
  _rowActions(col, item) {
7631
8045
  const actions = col.actionsFn?.(item) ?? [];
7632
8046
  if (this._canEdit()) return actions;
7633
- const visible = actions.filter((a) => a.type === "view");
8047
+ const visible = actions.filter((a) => a.type === "view" || a.allowReadOnly === true && a.type !== "delete");
7634
8048
  return visible.length === actions.length ? actions : visible;
7635
8049
  }
7636
8050
  async onTableRowAction(type, col, item) {
@@ -7731,6 +8145,15 @@ var DataTableComponent = class DataTableComponent {
7731
8145
  return "";
7732
8146
  }
7733
8147
  }
8148
+ imagePosition(col, item) {
8149
+ try {
8150
+ const p = col.imagePositionFn?.(item);
8151
+ const clamp = (n) => typeof n === "number" && Number.isFinite(n) ? Math.min(100, Math.max(0, n)) : 50;
8152
+ return `${clamp(p?.x)}% ${clamp(p?.y)}%`;
8153
+ } catch {
8154
+ return "50% 50%";
8155
+ }
8156
+ }
7734
8157
  imageClass(col, small) {
7735
8158
  const size = small ? "sm" : col.imageSize ?? "md";
7736
8159
  return `dt-img-${col.imageShape ?? "circle"}-${size}`;
@@ -8051,7 +8474,7 @@ var DataTableComponent = class DataTableComponent {
8051
8474
  [readOnly]="!_canEdit()"
8052
8475
  [tableButtons]="_toolbarButtons()"
8053
8476
  [hideMoreActions]="_emptyUnfiltered() && !_keepMoreActions()"
8054
- (visibleColumnsChange)="_visibleColumns.set($event)"
8477
+ (visibleColumnsChange)="_visibleColumns.set(_configurableKeys($event))"
8055
8478
  (saveViewClick)="onSaveViewClick($event)"
8056
8479
  (loadViewClick)="onLoadViewClick($event)"
8057
8480
  (deleteViewClick)="onDeleteViewClick($event)"
@@ -8096,7 +8519,7 @@ var DataTableComponent = class DataTableComponent {
8096
8519
  @let imgClass = imageClass(col, !!small);
8097
8520
  @if (imgUrl && !_failedImages().has(imgUrl)) {
8098
8521
  <img [class]="imgClass + ' dt-img'" [src]="imgUrl" [attr.alt]="imageAlt(col, item)"
8099
- loading="lazy" decoding="async" (error)="onImageError(imgUrl)" />
8522
+ [style.object-position]="imagePosition(col, item)" loading="lazy" decoding="async" (error)="onImageError(imgUrl)" />
8100
8523
  } @else {
8101
8524
  <span [class]="imgClass + ' dt-img-ph'" aria-hidden="true">
8102
8525
  @if (col.imagePlaceholder === 'person') {
@@ -8127,6 +8550,9 @@ var DataTableComponent = class DataTableComponent {
8127
8550
  <th
8128
8551
  scope="col"
8129
8552
  [style.text-align]="col.headerAlign ?? (col.cellType === 'number' ? 'right' : 'center')"
8553
+ [style.width]="col.width ?? null"
8554
+ [style.min-width]="col.width ?? null"
8555
+ [style.max-width]="col.width ?? null"
8130
8556
  [attr.aria-sort]="_isSortable(col) ? sortAriaLabel(col.key) : null"
8131
8557
  [class.dt-th-sorted]="_sortField() === col.key"
8132
8558
  [class.dt-th-actions]="col.cellType === 'actions'">
@@ -8227,6 +8653,10 @@ var DataTableComponent = class DataTableComponent {
8227
8653
  @for (col of visibleCols(); track col.key) {
8228
8654
  <td
8229
8655
  [style.text-align]="resolveCellAlign(col, item)"
8656
+ [style.width]="col.width ?? null"
8657
+ [style.min-width]="col.width ?? null"
8658
+ [style.max-width]="col.width ?? null"
8659
+ [class.dt-td-width]="!!col.width && col.cellType !== 'actions'"
8230
8660
  [class.dt-td-actions]="col.cellType === 'actions'">
8231
8661
 
8232
8662
  @switch (col.cellType) {
@@ -8274,7 +8704,7 @@ var DataTableComponent = class DataTableComponent {
8274
8704
  @let pCfg = col.progressFn ? col.progressFn(item) : null;
8275
8705
  @if (pCfg) {
8276
8706
  <ui-progress-bar [value]="pCfg.value" [max]="pCfg.max" [label]="pCfg.label ?? ''"
8277
- [variant]="pCfg.variant ?? 'blue'" [tooltip]="pCfg.tooltip ?? ''" />
8707
+ [variant]="pCfg.variant ?? null" [tooltip]="pCfg.tooltip ?? ''" />
8278
8708
  } @else { <span class="dt-none">—</span> }
8279
8709
  }
8280
8710
 
@@ -8564,7 +8994,7 @@ var DataTableComponent = class DataTableComponent {
8564
8994
  </div>
8565
8995
  `,
8566
8996
  isInline: true,
8567
- styles: [":host{display:flex;flex-direction:column;flex:1;min-height:0}.dt-host{display:flex;flex-direction:column;height:100%;min-height:0}.dt-header{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap;justify-content:space-between;position:relative;z-index:10}.dt-header-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}.dt-header-right{display:flex;align-items:center;gap:8px;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end}.dt-sk-shimmer{position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-shimmer:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}@keyframes dt-shimmer{to{transform:translate(200%)}}.dt-sk-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px}.dt-sk-toolbar-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.dt-sk-toolbar-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.dt-sk-search{display:flex;align-items:center;gap:10px;width:380px;height:36px;padding:0 12px;border:1px solid #e2e8f0;border-radius:6px;background:#f8fafc;box-sizing:border-box}.dt-sk-search-icon{width:16px;height:16px;border-radius:50%;flex-shrink:0}.dt-sk-search-text{flex:1;height:11px;border-radius:4px}.dt-sk-tab-strip{display:flex;gap:2px;padding:3px;background:#f1f5f9;border-radius:8px}.dt-sk-tab{height:28px;width:70px;border-radius:6px}.dt-sk-icon-btn{width:32px;height:32px;border-radius:6px}.dt-skeleton{border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dt-sk-header{display:flex;gap:24px;padding:12px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.dt-sk-row{display:flex;gap:24px;padding:13px 16px;border-bottom:1px solid #f1f5f9}.dt-sk-row:last-child{border-bottom:none}.dt-sk-cell{flex:1;height:13px;border-radius:4px;position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-cell:first-child{max-width:100px}.dt-sk-cell:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}.dt-sk-head{height:10px}.dt-table-wrap{flex:1;min-height:0;overflow:auto;border:1px solid #e2e8f0;border-radius:10px 10px 0 0}.dt-sk-reload-row td{padding:10px 14px;border-bottom:1px solid #f1f5f9}table{width:100%;border-collapse:collapse;font-size:.875rem}thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}thead{position:sticky;top:0;z-index:2}th{padding:10px 14px;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;border-right:1px solid #e2e8f0;text-align:center;background:#f8fafc}th:last-child{border-right:none}th.dt-th-sorted{background:#f1f5f9}th.dt-th-actions{width:48px}.dt-th-inner{display:flex;align-items:center;justify-content:center;gap:4px}.dt-sort-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:none;cursor:pointer;font-size:inherit;font-weight:inherit;color:inherit;font-family:inherit;padding:0;text-transform:inherit;letter-spacing:inherit}.dt-sort-btn:hover{color:#1e293b}.dt-sort-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:2px}.dt-sort-icon{transition:transform .15s}.dt-sort-desc{transform:rotate(180deg)}.dt-sort-inactive{opacity:.4}tbody tr{border-bottom:1px solid #f1f5f9;background:#fff;transition:background .1s}tbody tr:last-child{border-bottom:none}tbody tr:hover{background:#f8fafc}.dt-row-clickable{cursor:pointer}.dt-row-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}td{padding:10px 14px;color:#334155;vertical-align:middle;white-space:nowrap;border-right:1px solid #f1f5f9}td:last-child{border-right:none}.dt-td-actions{text-align:center;padding:6px 8px}.dt-img{display:inline-block;vertical-align:middle;object-fit:cover;border:1px solid #e2e8f0;background:#f1f5f9;flex-shrink:0}.dt-img-ph{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;color:#94a3b8;background:#f1f5f9;border:1px solid #e2e8f0;flex-shrink:0}.dt-img-ph svg{width:55%;height:55%}.dt-img-circle-md{width:40px;height:40px;border-radius:50%}.dt-img-circle-sm{width:28px;height:28px;border-radius:50%}.dt-img-rounded-md{width:48px;height:32px;border-radius:6px}.dt-img-rounded-sm{width:36px;height:24px;border-radius:5px}.dt-avatar-name{display:flex;align-items:center;gap:8px}.dt-name-text{font-weight:500;color:#1e293b}.dt-overdue{color:#dc2626;font-weight:500}.dt-none{color:#94a3b8}.dt-tags{display:flex;align-items:center;gap:4px}.dt-tags-more{font-size:.75rem;font-weight:600;color:#475569;background:#f1f5f9;border-radius:999px;padding:2px 7px;cursor:default;-webkit-user-select:none;user-select:none;border:1px solid #e2e8f0}.dt-tags-more:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:999px}.dt-tag-tooltip{position:fixed;z-index:9999;pointer-events:none;background:#1e293b;border-radius:10px;padding:8px 10px;display:flex;flex-direction:column;gap:5px;box-shadow:0 4px 6px #0000000f,0 10px 24px #00000024;transform:translate(-50%) translateY(-100%);animation:dt-tip-in .12s ease;max-width:220px}@keyframes dt-tip-in{0%{opacity:0;transform:translate(-50%) translateY(calc(-100% + 4px))}to{opacity:1;transform:translate(-50%) translateY(-100%)}}.dt-actions-cell{display:flex;align-items:center;justify-content:center}.dt-bulk-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;align-self:flex-start;padding:10px 14px;margin-bottom:8px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:8px}.dt-bulk-count{font-size:.875rem;font-weight:600;color:#1e40af;white-space:nowrap;flex-shrink:0}.dt-bulk-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;flex:1;min-width:0}.dt-bulk-actions ui-select{max-width:180px;min-width:120px}.dt-bulk-hint{font-size:.8125rem;line-height:1.35;color:#475569}.dt-card-cb{display:flex;align-items:center;padding:0 0 6px}.dt-card-selected{background:#eff6ff!important;border-color:#bfdbfe!important}.dt-th-cb{width:44px;padding:0 10px!important;text-align:center!important;border-right:1px solid #e2e8f0;background:#f8fafc}.dt-td-cb{width:44px;padding:0 10px!important;text-align:center!important;border-right:1px solid #f1f5f9}.dt-row-selected{background:#eff6ff!important}.dt-row-selected:hover{background:#dbeafe!important}.dt-state-cell{padding:0!important;border:none!important;background:#fff!important}@media(max-width:1024px){th{padding:10px 12px}td{padding:11px 12px}.dt-sort-btn{padding:4px 0}.dt-td-actions{padding:6px}.dt-bulk-bar{align-self:stretch}}@media(max-width:768px){th{padding:9px 10px;font-size:.8125rem}td{padding:10px;font-size:.8125rem}.dt-sk-search{width:100%}}@media(max-width:640px){.dt-header{flex-direction:column;align-items:stretch}.dt-header-left,.dt-header-right{width:100%}.dt-table-wrap{display:none}.dt-sk-search{width:100%}.dt-sk-toolbar{flex-direction:column;align-items:stretch;gap:8px}.dt-sk-toolbar-right{align-self:flex-end}.dt-bulk-bar{align-self:stretch;padding:10px 12px;row-gap:8px}.dt-bulk-count{flex:1}.dt-bulk-actions{width:100%}.dt-bulk-hint{flex-basis:100%}.dt-bulk-actions ui-select{max-width:100%;flex:1}}.dt-confirm-msg{margin:0;font-size:.9375rem;color:#334155;line-height:1.5;overflow-wrap:anywhere;word-break:break-word;white-space:pre-line}.dt-confirm-details{margin:10px 0 0;padding-left:20px;font-size:.875rem;color:#64748b;line-height:1.5;overflow-wrap:anywhere;word-break:break-word}.dt-confirm-details li+li{margin-top:4px}ui-pagination{flex-shrink:0}.dt-phone-controls{display:flex;flex-direction:column;gap:8px;margin-bottom:8px;flex-shrink:0}.dt-phone-sort{display:flex;align-items:center;gap:8px}.dt-phone-sort-label{font-size:.8125rem;font-weight:600;color:#64748b;flex-shrink:0}.dt-phone-sort-select{flex:1;min-width:0;min-height:44px;box-sizing:border-box;padding:0 12px;font-family:inherit;font-size:1rem;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px}.dt-phone-filters{display:flex;flex-wrap:wrap;gap:8px}.dt-card-list{display:none;flex-direction:column;gap:8px;flex:1;min-height:0;overflow-y:auto}@media(max-width:640px){.dt-card-list{display:flex;padding-bottom:8px}}.dt-card{background:#fff;border:1px solid #e2e8f0;border-radius:10px;contain:layout style;padding:14px 16px;display:flex;flex-direction:column;gap:10px;transition:background .1s}.dt-card:has(.mm-dropdown){position:relative;z-index:1}.dt-card-clickable{cursor:pointer}.dt-card-clickable:active{background:#f8fafc}.dt-card-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.dt-card-header{display:flex;align-items:center;gap:10px}.dt-card-title{display:flex;align-items:center;gap:10px;flex:1;min-width:0}.dt-card-name{min-width:0;font-weight:600;color:#1e293b;font-size:.9375rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dt-card-name-plain{flex:1}.dt-card-actions{margin-left:auto;flex-shrink:0}.dt-card-badges{display:flex;flex-wrap:wrap;gap:6px}.dt-card-tags{display:flex;flex-wrap:wrap;gap:4px}.dt-card-details{display:flex;flex-direction:column;gap:5px}.dt-card-detail-row{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:.8125rem}.dt-card-detail-label{color:#64748b;flex-shrink:0}.dt-card-detail-value{color:#334155;font-weight:500;text-align:right;min-width:0;overflow-wrap:anywhere;word-break:break-word}.dt-card-sk{gap:12px}.dt-card-sk-header{display:flex;align-items:center;gap:10px}.dt-card-sk-badges{display:flex;gap:6px}.dt-card-sk-rows{display:flex;flex-direction:column;gap:8px}\n"],
8997
+ styles: [":host{display:flex;flex-direction:column;flex:1;min-height:0}.dt-host{display:flex;flex-direction:column;height:100%;min-height:0}.dt-header{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap;justify-content:space-between;position:relative;z-index:10}.dt-header-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}.dt-header-right{display:flex;align-items:center;gap:8px;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end}.dt-sk-shimmer{position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-shimmer:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}@keyframes dt-shimmer{to{transform:translate(200%)}}.dt-sk-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px}.dt-sk-toolbar-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.dt-sk-toolbar-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.dt-sk-search{display:flex;align-items:center;gap:10px;width:380px;height:36px;padding:0 12px;border:1px solid #e2e8f0;border-radius:6px;background:#f8fafc;box-sizing:border-box}.dt-sk-search-icon{width:16px;height:16px;border-radius:50%;flex-shrink:0}.dt-sk-search-text{flex:1;height:11px;border-radius:4px}.dt-sk-tab-strip{display:flex;gap:2px;padding:3px;background:#f1f5f9;border-radius:8px}.dt-sk-tab{height:28px;width:70px;border-radius:6px}.dt-sk-icon-btn{width:32px;height:32px;border-radius:6px}.dt-skeleton{border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dt-sk-header{display:flex;gap:24px;padding:12px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.dt-sk-row{display:flex;gap:24px;padding:13px 16px;border-bottom:1px solid #f1f5f9}.dt-sk-row:last-child{border-bottom:none}.dt-sk-cell{flex:1;height:13px;border-radius:4px;position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-cell:first-child{max-width:100px}.dt-sk-cell:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}.dt-sk-head{height:10px}.dt-table-wrap{flex:1;min-height:0;overflow:auto;border:1px solid #e2e8f0;border-radius:10px 10px 0 0}.dt-sk-reload-row td{padding:10px 14px;border-bottom:1px solid #f1f5f9}table{width:100%;border-collapse:collapse;font-size:.875rem}thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}thead{position:sticky;top:0;z-index:2}th{padding:10px 14px;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;border-right:1px solid #e2e8f0;text-align:center;background:#f8fafc}th:last-child{border-right:none}th.dt-th-sorted{background:#f1f5f9}th.dt-th-actions{width:48px}.dt-th-inner{display:flex;align-items:center;justify-content:center;gap:4px}.dt-sort-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:none;cursor:pointer;font-size:inherit;font-weight:inherit;color:inherit;font-family:inherit;padding:0;text-transform:inherit;letter-spacing:inherit}.dt-sort-btn:hover{color:#1e293b}.dt-sort-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:2px}@media(pointer:coarse){.dt-sort-btn{position:relative}.dt-sort-btn:after{content:\"\";position:absolute;left:-4px;right:-4px;top:50%;height:44px;transform:translateY(-50%)}}.dt-sort-icon{transition:transform .15s}.dt-sort-desc{transform:rotate(180deg)}.dt-sort-inactive{opacity:.4}tbody tr{border-bottom:1px solid #f1f5f9;background:#fff;transition:background .1s}tbody tr:last-child{border-bottom:none}tbody tr:hover{background:#f8fafc}.dt-row-clickable{cursor:pointer}.dt-row-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}td{padding:10px 14px;color:#334155;vertical-align:middle;white-space:nowrap;border-right:1px solid #f1f5f9}td:last-child{border-right:none}.dt-td-actions{text-align:center;padding:6px 8px}.dt-td-width{overflow:hidden;text-overflow:ellipsis}.dt-img{display:inline-block;vertical-align:middle;object-fit:cover;border:1px solid #e2e8f0;background:#f1f5f9;flex-shrink:0}.dt-img-ph{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;color:#94a3b8;background:#f1f5f9;border:1px solid #e2e8f0;flex-shrink:0}.dt-img-ph svg{width:55%;height:55%}.dt-img-circle-md{width:40px;height:40px;border-radius:50%}.dt-img-circle-sm{width:28px;height:28px;border-radius:50%}.dt-img-rounded-md{width:48px;height:32px;border-radius:6px}.dt-img-rounded-sm{width:36px;height:24px;border-radius:5px}.dt-avatar-name{display:flex;align-items:center;gap:8px}.dt-name-text{color:#1e293b}.dt-overdue{color:#dc2626;font-weight:500}.dt-none{color:#94a3b8}.dt-tags{display:flex;align-items:center;gap:4px}.dt-tags-more{font-size:.75rem;font-weight:600;color:#475569;background:#f1f5f9;border-radius:999px;padding:2px 7px;cursor:default;-webkit-user-select:none;user-select:none;border:1px solid #e2e8f0}.dt-tags-more:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:999px}.dt-tag-tooltip{position:fixed;z-index:9999;pointer-events:none;background:#1e293b;border-radius:10px;padding:8px 10px;display:flex;flex-direction:column;gap:5px;box-shadow:0 4px 6px #0000000f,0 10px 24px #00000024;transform:translate(-50%) translateY(-100%);animation:dt-tip-in .12s ease;max-width:220px}@keyframes dt-tip-in{0%{opacity:0;transform:translate(-50%) translateY(calc(-100% + 4px))}to{opacity:1;transform:translate(-50%) translateY(-100%)}}.dt-actions-cell{display:flex;align-items:center;justify-content:center}.dt-bulk-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;align-self:flex-start;padding:10px 14px;margin-bottom:8px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:8px}.dt-bulk-count{font-size:.875rem;font-weight:600;color:#1e40af;white-space:nowrap;flex-shrink:0}.dt-bulk-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;flex:1;min-width:0}.dt-bulk-actions ui-select{max-width:180px;min-width:120px}.dt-bulk-hint{font-size:.8125rem;line-height:1.35;color:#475569}.dt-card-cb{display:flex;align-items:center;padding:0 0 6px}.dt-card-selected{background:#eff6ff!important;border-color:#bfdbfe!important}.dt-th-cb{width:44px;padding:0 10px!important;text-align:center!important;border-right:1px solid #e2e8f0;background:#f8fafc}.dt-td-cb{width:44px;padding:0 10px!important;text-align:center!important;border-right:1px solid #f1f5f9}.dt-row-selected{background:#eff6ff!important}.dt-row-selected:hover{background:#dbeafe!important}.dt-state-cell{padding:0!important;border:none!important;background:#fff!important}@media(max-width:1024px){th{padding:10px 12px}td{padding:11px 12px}.dt-sort-btn{padding:4px 0}.dt-td-actions{padding:6px}.dt-bulk-bar{align-self:stretch}}@media(max-width:768px){th{padding:9px 10px;font-size:.8125rem}td{padding:10px;font-size:.8125rem}.dt-sk-search{width:100%}}@media(max-width:640px){.dt-header{flex-direction:column;align-items:stretch}.dt-header-left,.dt-header-right{width:100%}.dt-table-wrap{display:none}.dt-sk-search{width:100%}.dt-sk-toolbar{flex-direction:column;align-items:stretch;gap:8px}.dt-sk-toolbar-right{align-self:flex-end}.dt-bulk-bar{align-self:stretch;padding:10px 12px;row-gap:8px}.dt-bulk-count{flex:1}.dt-bulk-actions{width:100%}.dt-bulk-hint{flex-basis:100%}.dt-bulk-actions ui-select{max-width:100%;flex:1}}.dt-confirm-msg{margin:0;font-size:.9375rem;color:#334155;line-height:1.5;overflow-wrap:anywhere;word-break:break-word;white-space:pre-line}.dt-confirm-details{margin:10px 0 0;padding-left:20px;font-size:.875rem;color:#64748b;line-height:1.5;overflow-wrap:anywhere;word-break:break-word}.dt-confirm-details li+li{margin-top:4px}ui-pagination{flex-shrink:0}.dt-phone-controls{display:flex;flex-direction:column;gap:8px;margin-bottom:8px;flex-shrink:0}.dt-phone-sort{display:flex;align-items:center;gap:8px}.dt-phone-sort-label{font-size:.8125rem;font-weight:600;color:#64748b;flex-shrink:0}.dt-phone-sort-select{flex:1;min-width:0;min-height:44px;box-sizing:border-box;padding:0 12px;font-family:inherit;font-size:1rem;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px}.dt-phone-filters{display:flex;flex-wrap:wrap;gap:8px}.dt-card-list{display:none;flex-direction:column;gap:8px;flex:1;min-height:0;overflow-y:auto}@media(max-width:640px){.dt-card-list{display:flex;padding-bottom:8px}}.dt-card{background:#fff;border:1px solid #e2e8f0;border-radius:10px;contain:layout style;padding:14px 16px;display:flex;flex-direction:column;gap:10px;transition:background .1s}.dt-card:has(.mm-dropdown){position:relative;z-index:1}.dt-card-clickable{cursor:pointer}.dt-card-clickable:active{background:#f8fafc}.dt-card-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.dt-card-header{display:flex;align-items:center;gap:10px}.dt-card-title{display:flex;align-items:center;gap:10px;flex:1;min-width:0}.dt-card-name{min-width:0;font-weight:600;color:#1e293b;font-size:.9375rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dt-card-name-plain{flex:1}.dt-card-actions{margin-left:auto;flex-shrink:0}.dt-card-badges{display:flex;flex-wrap:wrap;gap:6px}.dt-card-tags{display:flex;flex-wrap:wrap;gap:4px}.dt-card-details{display:flex;flex-direction:column;gap:5px}.dt-card-detail-row{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:.8125rem}.dt-card-detail-label{color:#64748b;flex-shrink:0}.dt-card-detail-value{color:#334155;font-weight:500;text-align:right;min-width:0;overflow-wrap:anywhere;word-break:break-word}.dt-card-sk{gap:12px}.dt-card-sk-header{display:flex;align-items:center;gap:10px}.dt-card-sk-badges{display:flex;gap:6px}.dt-card-sk-rows{display:flex;flex-direction:column;gap:8px}\n"],
8568
8998
  dependencies: [
8569
8999
  {
8570
9000
  kind: "directive",
@@ -8750,6 +9180,7 @@ var DataTableComponent = class DataTableComponent {
8750
9180
  "ariaLabel",
8751
9181
  "ariaExpanded",
8752
9182
  "ariaPressed",
9183
+ "ariaDescribedBy",
8753
9184
  "modal-footer-left",
8754
9185
  "modal-footer-right"
8755
9186
  ]
@@ -8763,9 +9194,14 @@ var DataTableComponent = class DataTableComponent {
8763
9194
  "ariaLabel",
8764
9195
  "indeterminate",
8765
9196
  "checked",
9197
+ "required",
9198
+ "requiredMessage",
9199
+ "hint",
9200
+ "error",
9201
+ "showErrors",
8766
9202
  "disabled"
8767
9203
  ],
8768
- outputs: ["checkedChange"]
9204
+ outputs: ["checkedChange", "invalidChange"]
8769
9205
  },
8770
9206
  {
8771
9207
  kind: "component",
@@ -8947,7 +9383,7 @@ i0.ɵɵngDeclareClassMetadata({
8947
9383
  [readOnly]="!_canEdit()"
8948
9384
  [tableButtons]="_toolbarButtons()"
8949
9385
  [hideMoreActions]="_emptyUnfiltered() && !_keepMoreActions()"
8950
- (visibleColumnsChange)="_visibleColumns.set($event)"
9386
+ (visibleColumnsChange)="_visibleColumns.set(_configurableKeys($event))"
8951
9387
  (saveViewClick)="onSaveViewClick($event)"
8952
9388
  (loadViewClick)="onLoadViewClick($event)"
8953
9389
  (deleteViewClick)="onDeleteViewClick($event)"
@@ -8992,7 +9428,7 @@ i0.ɵɵngDeclareClassMetadata({
8992
9428
  @let imgClass = imageClass(col, !!small);
8993
9429
  @if (imgUrl && !_failedImages().has(imgUrl)) {
8994
9430
  <img [class]="imgClass + ' dt-img'" [src]="imgUrl" [attr.alt]="imageAlt(col, item)"
8995
- loading="lazy" decoding="async" (error)="onImageError(imgUrl)" />
9431
+ [style.object-position]="imagePosition(col, item)" loading="lazy" decoding="async" (error)="onImageError(imgUrl)" />
8996
9432
  } @else {
8997
9433
  <span [class]="imgClass + ' dt-img-ph'" aria-hidden="true">
8998
9434
  @if (col.imagePlaceholder === 'person') {
@@ -9023,6 +9459,9 @@ i0.ɵɵngDeclareClassMetadata({
9023
9459
  <th
9024
9460
  scope="col"
9025
9461
  [style.text-align]="col.headerAlign ?? (col.cellType === 'number' ? 'right' : 'center')"
9462
+ [style.width]="col.width ?? null"
9463
+ [style.min-width]="col.width ?? null"
9464
+ [style.max-width]="col.width ?? null"
9026
9465
  [attr.aria-sort]="_isSortable(col) ? sortAriaLabel(col.key) : null"
9027
9466
  [class.dt-th-sorted]="_sortField() === col.key"
9028
9467
  [class.dt-th-actions]="col.cellType === 'actions'">
@@ -9123,6 +9562,10 @@ i0.ɵɵngDeclareClassMetadata({
9123
9562
  @for (col of visibleCols(); track col.key) {
9124
9563
  <td
9125
9564
  [style.text-align]="resolveCellAlign(col, item)"
9565
+ [style.width]="col.width ?? null"
9566
+ [style.min-width]="col.width ?? null"
9567
+ [style.max-width]="col.width ?? null"
9568
+ [class.dt-td-width]="!!col.width && col.cellType !== 'actions'"
9126
9569
  [class.dt-td-actions]="col.cellType === 'actions'">
9127
9570
 
9128
9571
  @switch (col.cellType) {
@@ -9170,7 +9613,7 @@ i0.ɵɵngDeclareClassMetadata({
9170
9613
  @let pCfg = col.progressFn ? col.progressFn(item) : null;
9171
9614
  @if (pCfg) {
9172
9615
  <ui-progress-bar [value]="pCfg.value" [max]="pCfg.max" [label]="pCfg.label ?? ''"
9173
- [variant]="pCfg.variant ?? 'blue'" [tooltip]="pCfg.tooltip ?? ''" />
9616
+ [variant]="pCfg.variant ?? null" [tooltip]="pCfg.tooltip ?? ''" />
9174
9617
  } @else { <span class="dt-none">—</span> }
9175
9618
  }
9176
9619
 
@@ -9459,7 +9902,7 @@ i0.ɵɵngDeclareClassMetadata({
9459
9902
  }
9460
9903
  </div>
9461
9904
  `,
9462
- styles: [":host{display:flex;flex-direction:column;flex:1;min-height:0}.dt-host{display:flex;flex-direction:column;height:100%;min-height:0}.dt-header{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap;justify-content:space-between;position:relative;z-index:10}.dt-header-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}.dt-header-right{display:flex;align-items:center;gap:8px;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end}.dt-sk-shimmer{position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-shimmer:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}@keyframes dt-shimmer{to{transform:translate(200%)}}.dt-sk-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px}.dt-sk-toolbar-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.dt-sk-toolbar-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.dt-sk-search{display:flex;align-items:center;gap:10px;width:380px;height:36px;padding:0 12px;border:1px solid #e2e8f0;border-radius:6px;background:#f8fafc;box-sizing:border-box}.dt-sk-search-icon{width:16px;height:16px;border-radius:50%;flex-shrink:0}.dt-sk-search-text{flex:1;height:11px;border-radius:4px}.dt-sk-tab-strip{display:flex;gap:2px;padding:3px;background:#f1f5f9;border-radius:8px}.dt-sk-tab{height:28px;width:70px;border-radius:6px}.dt-sk-icon-btn{width:32px;height:32px;border-radius:6px}.dt-skeleton{border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dt-sk-header{display:flex;gap:24px;padding:12px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.dt-sk-row{display:flex;gap:24px;padding:13px 16px;border-bottom:1px solid #f1f5f9}.dt-sk-row:last-child{border-bottom:none}.dt-sk-cell{flex:1;height:13px;border-radius:4px;position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-cell:first-child{max-width:100px}.dt-sk-cell:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}.dt-sk-head{height:10px}.dt-table-wrap{flex:1;min-height:0;overflow:auto;border:1px solid #e2e8f0;border-radius:10px 10px 0 0}.dt-sk-reload-row td{padding:10px 14px;border-bottom:1px solid #f1f5f9}table{width:100%;border-collapse:collapse;font-size:.875rem}thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}thead{position:sticky;top:0;z-index:2}th{padding:10px 14px;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;border-right:1px solid #e2e8f0;text-align:center;background:#f8fafc}th:last-child{border-right:none}th.dt-th-sorted{background:#f1f5f9}th.dt-th-actions{width:48px}.dt-th-inner{display:flex;align-items:center;justify-content:center;gap:4px}.dt-sort-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:none;cursor:pointer;font-size:inherit;font-weight:inherit;color:inherit;font-family:inherit;padding:0;text-transform:inherit;letter-spacing:inherit}.dt-sort-btn:hover{color:#1e293b}.dt-sort-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:2px}.dt-sort-icon{transition:transform .15s}.dt-sort-desc{transform:rotate(180deg)}.dt-sort-inactive{opacity:.4}tbody tr{border-bottom:1px solid #f1f5f9;background:#fff;transition:background .1s}tbody tr:last-child{border-bottom:none}tbody tr:hover{background:#f8fafc}.dt-row-clickable{cursor:pointer}.dt-row-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}td{padding:10px 14px;color:#334155;vertical-align:middle;white-space:nowrap;border-right:1px solid #f1f5f9}td:last-child{border-right:none}.dt-td-actions{text-align:center;padding:6px 8px}.dt-img{display:inline-block;vertical-align:middle;object-fit:cover;border:1px solid #e2e8f0;background:#f1f5f9;flex-shrink:0}.dt-img-ph{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;color:#94a3b8;background:#f1f5f9;border:1px solid #e2e8f0;flex-shrink:0}.dt-img-ph svg{width:55%;height:55%}.dt-img-circle-md{width:40px;height:40px;border-radius:50%}.dt-img-circle-sm{width:28px;height:28px;border-radius:50%}.dt-img-rounded-md{width:48px;height:32px;border-radius:6px}.dt-img-rounded-sm{width:36px;height:24px;border-radius:5px}.dt-avatar-name{display:flex;align-items:center;gap:8px}.dt-name-text{font-weight:500;color:#1e293b}.dt-overdue{color:#dc2626;font-weight:500}.dt-none{color:#94a3b8}.dt-tags{display:flex;align-items:center;gap:4px}.dt-tags-more{font-size:.75rem;font-weight:600;color:#475569;background:#f1f5f9;border-radius:999px;padding:2px 7px;cursor:default;-webkit-user-select:none;user-select:none;border:1px solid #e2e8f0}.dt-tags-more:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:999px}.dt-tag-tooltip{position:fixed;z-index:9999;pointer-events:none;background:#1e293b;border-radius:10px;padding:8px 10px;display:flex;flex-direction:column;gap:5px;box-shadow:0 4px 6px #0000000f,0 10px 24px #00000024;transform:translate(-50%) translateY(-100%);animation:dt-tip-in .12s ease;max-width:220px}@keyframes dt-tip-in{0%{opacity:0;transform:translate(-50%) translateY(calc(-100% + 4px))}to{opacity:1;transform:translate(-50%) translateY(-100%)}}.dt-actions-cell{display:flex;align-items:center;justify-content:center}.dt-bulk-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;align-self:flex-start;padding:10px 14px;margin-bottom:8px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:8px}.dt-bulk-count{font-size:.875rem;font-weight:600;color:#1e40af;white-space:nowrap;flex-shrink:0}.dt-bulk-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;flex:1;min-width:0}.dt-bulk-actions ui-select{max-width:180px;min-width:120px}.dt-bulk-hint{font-size:.8125rem;line-height:1.35;color:#475569}.dt-card-cb{display:flex;align-items:center;padding:0 0 6px}.dt-card-selected{background:#eff6ff!important;border-color:#bfdbfe!important}.dt-th-cb{width:44px;padding:0 10px!important;text-align:center!important;border-right:1px solid #e2e8f0;background:#f8fafc}.dt-td-cb{width:44px;padding:0 10px!important;text-align:center!important;border-right:1px solid #f1f5f9}.dt-row-selected{background:#eff6ff!important}.dt-row-selected:hover{background:#dbeafe!important}.dt-state-cell{padding:0!important;border:none!important;background:#fff!important}@media(max-width:1024px){th{padding:10px 12px}td{padding:11px 12px}.dt-sort-btn{padding:4px 0}.dt-td-actions{padding:6px}.dt-bulk-bar{align-self:stretch}}@media(max-width:768px){th{padding:9px 10px;font-size:.8125rem}td{padding:10px;font-size:.8125rem}.dt-sk-search{width:100%}}@media(max-width:640px){.dt-header{flex-direction:column;align-items:stretch}.dt-header-left,.dt-header-right{width:100%}.dt-table-wrap{display:none}.dt-sk-search{width:100%}.dt-sk-toolbar{flex-direction:column;align-items:stretch;gap:8px}.dt-sk-toolbar-right{align-self:flex-end}.dt-bulk-bar{align-self:stretch;padding:10px 12px;row-gap:8px}.dt-bulk-count{flex:1}.dt-bulk-actions{width:100%}.dt-bulk-hint{flex-basis:100%}.dt-bulk-actions ui-select{max-width:100%;flex:1}}.dt-confirm-msg{margin:0;font-size:.9375rem;color:#334155;line-height:1.5;overflow-wrap:anywhere;word-break:break-word;white-space:pre-line}.dt-confirm-details{margin:10px 0 0;padding-left:20px;font-size:.875rem;color:#64748b;line-height:1.5;overflow-wrap:anywhere;word-break:break-word}.dt-confirm-details li+li{margin-top:4px}ui-pagination{flex-shrink:0}.dt-phone-controls{display:flex;flex-direction:column;gap:8px;margin-bottom:8px;flex-shrink:0}.dt-phone-sort{display:flex;align-items:center;gap:8px}.dt-phone-sort-label{font-size:.8125rem;font-weight:600;color:#64748b;flex-shrink:0}.dt-phone-sort-select{flex:1;min-width:0;min-height:44px;box-sizing:border-box;padding:0 12px;font-family:inherit;font-size:1rem;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px}.dt-phone-filters{display:flex;flex-wrap:wrap;gap:8px}.dt-card-list{display:none;flex-direction:column;gap:8px;flex:1;min-height:0;overflow-y:auto}@media(max-width:640px){.dt-card-list{display:flex;padding-bottom:8px}}.dt-card{background:#fff;border:1px solid #e2e8f0;border-radius:10px;contain:layout style;padding:14px 16px;display:flex;flex-direction:column;gap:10px;transition:background .1s}.dt-card:has(.mm-dropdown){position:relative;z-index:1}.dt-card-clickable{cursor:pointer}.dt-card-clickable:active{background:#f8fafc}.dt-card-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.dt-card-header{display:flex;align-items:center;gap:10px}.dt-card-title{display:flex;align-items:center;gap:10px;flex:1;min-width:0}.dt-card-name{min-width:0;font-weight:600;color:#1e293b;font-size:.9375rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dt-card-name-plain{flex:1}.dt-card-actions{margin-left:auto;flex-shrink:0}.dt-card-badges{display:flex;flex-wrap:wrap;gap:6px}.dt-card-tags{display:flex;flex-wrap:wrap;gap:4px}.dt-card-details{display:flex;flex-direction:column;gap:5px}.dt-card-detail-row{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:.8125rem}.dt-card-detail-label{color:#64748b;flex-shrink:0}.dt-card-detail-value{color:#334155;font-weight:500;text-align:right;min-width:0;overflow-wrap:anywhere;word-break:break-word}.dt-card-sk{gap:12px}.dt-card-sk-header{display:flex;align-items:center;gap:10px}.dt-card-sk-badges{display:flex;gap:6px}.dt-card-sk-rows{display:flex;flex-direction:column;gap:8px}\n"]
9905
+ styles: [":host{display:flex;flex-direction:column;flex:1;min-height:0}.dt-host{display:flex;flex-direction:column;height:100%;min-height:0}.dt-header{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap;justify-content:space-between;position:relative;z-index:10}.dt-header-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}.dt-header-right{display:flex;align-items:center;gap:8px;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end}.dt-sk-shimmer{position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-shimmer:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}@keyframes dt-shimmer{to{transform:translate(200%)}}.dt-sk-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px}.dt-sk-toolbar-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.dt-sk-toolbar-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.dt-sk-search{display:flex;align-items:center;gap:10px;width:380px;height:36px;padding:0 12px;border:1px solid #e2e8f0;border-radius:6px;background:#f8fafc;box-sizing:border-box}.dt-sk-search-icon{width:16px;height:16px;border-radius:50%;flex-shrink:0}.dt-sk-search-text{flex:1;height:11px;border-radius:4px}.dt-sk-tab-strip{display:flex;gap:2px;padding:3px;background:#f1f5f9;border-radius:8px}.dt-sk-tab{height:28px;width:70px;border-radius:6px}.dt-sk-icon-btn{width:32px;height:32px;border-radius:6px}.dt-skeleton{border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dt-sk-header{display:flex;gap:24px;padding:12px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.dt-sk-row{display:flex;gap:24px;padding:13px 16px;border-bottom:1px solid #f1f5f9}.dt-sk-row:last-child{border-bottom:none}.dt-sk-cell{flex:1;height:13px;border-radius:4px;position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-cell:first-child{max-width:100px}.dt-sk-cell:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}.dt-sk-head{height:10px}.dt-table-wrap{flex:1;min-height:0;overflow:auto;border:1px solid #e2e8f0;border-radius:10px 10px 0 0}.dt-sk-reload-row td{padding:10px 14px;border-bottom:1px solid #f1f5f9}table{width:100%;border-collapse:collapse;font-size:.875rem}thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}thead{position:sticky;top:0;z-index:2}th{padding:10px 14px;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;border-right:1px solid #e2e8f0;text-align:center;background:#f8fafc}th:last-child{border-right:none}th.dt-th-sorted{background:#f1f5f9}th.dt-th-actions{width:48px}.dt-th-inner{display:flex;align-items:center;justify-content:center;gap:4px}.dt-sort-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:none;cursor:pointer;font-size:inherit;font-weight:inherit;color:inherit;font-family:inherit;padding:0;text-transform:inherit;letter-spacing:inherit}.dt-sort-btn:hover{color:#1e293b}.dt-sort-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:2px}@media(pointer:coarse){.dt-sort-btn{position:relative}.dt-sort-btn:after{content:\"\";position:absolute;left:-4px;right:-4px;top:50%;height:44px;transform:translateY(-50%)}}.dt-sort-icon{transition:transform .15s}.dt-sort-desc{transform:rotate(180deg)}.dt-sort-inactive{opacity:.4}tbody tr{border-bottom:1px solid #f1f5f9;background:#fff;transition:background .1s}tbody tr:last-child{border-bottom:none}tbody tr:hover{background:#f8fafc}.dt-row-clickable{cursor:pointer}.dt-row-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}td{padding:10px 14px;color:#334155;vertical-align:middle;white-space:nowrap;border-right:1px solid #f1f5f9}td:last-child{border-right:none}.dt-td-actions{text-align:center;padding:6px 8px}.dt-td-width{overflow:hidden;text-overflow:ellipsis}.dt-img{display:inline-block;vertical-align:middle;object-fit:cover;border:1px solid #e2e8f0;background:#f1f5f9;flex-shrink:0}.dt-img-ph{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;color:#94a3b8;background:#f1f5f9;border:1px solid #e2e8f0;flex-shrink:0}.dt-img-ph svg{width:55%;height:55%}.dt-img-circle-md{width:40px;height:40px;border-radius:50%}.dt-img-circle-sm{width:28px;height:28px;border-radius:50%}.dt-img-rounded-md{width:48px;height:32px;border-radius:6px}.dt-img-rounded-sm{width:36px;height:24px;border-radius:5px}.dt-avatar-name{display:flex;align-items:center;gap:8px}.dt-name-text{color:#1e293b}.dt-overdue{color:#dc2626;font-weight:500}.dt-none{color:#94a3b8}.dt-tags{display:flex;align-items:center;gap:4px}.dt-tags-more{font-size:.75rem;font-weight:600;color:#475569;background:#f1f5f9;border-radius:999px;padding:2px 7px;cursor:default;-webkit-user-select:none;user-select:none;border:1px solid #e2e8f0}.dt-tags-more:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:999px}.dt-tag-tooltip{position:fixed;z-index:9999;pointer-events:none;background:#1e293b;border-radius:10px;padding:8px 10px;display:flex;flex-direction:column;gap:5px;box-shadow:0 4px 6px #0000000f,0 10px 24px #00000024;transform:translate(-50%) translateY(-100%);animation:dt-tip-in .12s ease;max-width:220px}@keyframes dt-tip-in{0%{opacity:0;transform:translate(-50%) translateY(calc(-100% + 4px))}to{opacity:1;transform:translate(-50%) translateY(-100%)}}.dt-actions-cell{display:flex;align-items:center;justify-content:center}.dt-bulk-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;align-self:flex-start;padding:10px 14px;margin-bottom:8px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:8px}.dt-bulk-count{font-size:.875rem;font-weight:600;color:#1e40af;white-space:nowrap;flex-shrink:0}.dt-bulk-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;flex:1;min-width:0}.dt-bulk-actions ui-select{max-width:180px;min-width:120px}.dt-bulk-hint{font-size:.8125rem;line-height:1.35;color:#475569}.dt-card-cb{display:flex;align-items:center;padding:0 0 6px}.dt-card-selected{background:#eff6ff!important;border-color:#bfdbfe!important}.dt-th-cb{width:44px;padding:0 10px!important;text-align:center!important;border-right:1px solid #e2e8f0;background:#f8fafc}.dt-td-cb{width:44px;padding:0 10px!important;text-align:center!important;border-right:1px solid #f1f5f9}.dt-row-selected{background:#eff6ff!important}.dt-row-selected:hover{background:#dbeafe!important}.dt-state-cell{padding:0!important;border:none!important;background:#fff!important}@media(max-width:1024px){th{padding:10px 12px}td{padding:11px 12px}.dt-sort-btn{padding:4px 0}.dt-td-actions{padding:6px}.dt-bulk-bar{align-self:stretch}}@media(max-width:768px){th{padding:9px 10px;font-size:.8125rem}td{padding:10px;font-size:.8125rem}.dt-sk-search{width:100%}}@media(max-width:640px){.dt-header{flex-direction:column;align-items:stretch}.dt-header-left,.dt-header-right{width:100%}.dt-table-wrap{display:none}.dt-sk-search{width:100%}.dt-sk-toolbar{flex-direction:column;align-items:stretch;gap:8px}.dt-sk-toolbar-right{align-self:flex-end}.dt-bulk-bar{align-self:stretch;padding:10px 12px;row-gap:8px}.dt-bulk-count{flex:1}.dt-bulk-actions{width:100%}.dt-bulk-hint{flex-basis:100%}.dt-bulk-actions ui-select{max-width:100%;flex:1}}.dt-confirm-msg{margin:0;font-size:.9375rem;color:#334155;line-height:1.5;overflow-wrap:anywhere;word-break:break-word;white-space:pre-line}.dt-confirm-details{margin:10px 0 0;padding-left:20px;font-size:.875rem;color:#64748b;line-height:1.5;overflow-wrap:anywhere;word-break:break-word}.dt-confirm-details li+li{margin-top:4px}ui-pagination{flex-shrink:0}.dt-phone-controls{display:flex;flex-direction:column;gap:8px;margin-bottom:8px;flex-shrink:0}.dt-phone-sort{display:flex;align-items:center;gap:8px}.dt-phone-sort-label{font-size:.8125rem;font-weight:600;color:#64748b;flex-shrink:0}.dt-phone-sort-select{flex:1;min-width:0;min-height:44px;box-sizing:border-box;padding:0 12px;font-family:inherit;font-size:1rem;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px}.dt-phone-filters{display:flex;flex-wrap:wrap;gap:8px}.dt-card-list{display:none;flex-direction:column;gap:8px;flex:1;min-height:0;overflow-y:auto}@media(max-width:640px){.dt-card-list{display:flex;padding-bottom:8px}}.dt-card{background:#fff;border:1px solid #e2e8f0;border-radius:10px;contain:layout style;padding:14px 16px;display:flex;flex-direction:column;gap:10px;transition:background .1s}.dt-card:has(.mm-dropdown){position:relative;z-index:1}.dt-card-clickable{cursor:pointer}.dt-card-clickable:active{background:#f8fafc}.dt-card-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.dt-card-header{display:flex;align-items:center;gap:10px}.dt-card-title{display:flex;align-items:center;gap:10px;flex:1;min-width:0}.dt-card-name{min-width:0;font-weight:600;color:#1e293b;font-size:.9375rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dt-card-name-plain{flex:1}.dt-card-actions{margin-left:auto;flex-shrink:0}.dt-card-badges{display:flex;flex-wrap:wrap;gap:6px}.dt-card-tags{display:flex;flex-wrap:wrap;gap:4px}.dt-card-details{display:flex;flex-direction:column;gap:5px}.dt-card-detail-row{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:.8125rem}.dt-card-detail-label{color:#64748b;flex-shrink:0}.dt-card-detail-value{color:#334155;font-weight:500;text-align:right;min-width:0;overflow-wrap:anywhere;word-break:break-word}.dt-card-sk{gap:12px}.dt-card-sk-header{display:flex;align-items:center;gap:10px}.dt-card-sk-badges{display:flex;gap:6px}.dt-card-sk-rows{display:flex;flex-direction:column;gap:8px}\n"]
9463
9906
  }]
9464
9907
  }],
9465
9908
  ctorParameters: () => [],
@@ -9939,7 +10382,7 @@ var SidePanelComponent = class SidePanelComponent {
9939
10382
  }
9940
10383
  `,
9941
10384
  isInline: true,
9942
- styles: [".sp-backdrop{position:fixed;inset:0;background:#0000004d;z-index:90;animation:sp-fade .2s ease}.sp-panel{position:fixed;top:0;right:0;bottom:var(--ui-kb, 0px);width:480px;max-width:100vw;max-height:var(--ui-vvh, 100dvh);background:#fff;z-index:100;box-shadow:-4px 0 20px #0000001a;display:flex;flex-direction:column;animation:sp-slide .25s ease}.sp-panel:focus{outline:none}.sp-wide{width:620px}.sp-extra-wide{width:760px}.sp-header{display:flex;justify-content:space-between;align-items:center;padding:24px 24px 20px;gap:12px;flex-shrink:0;background:linear-gradient(135deg,#1e293b,#334155)}.sp-header-text{flex:1;min-width:0}.sp-title{font-size:1.125rem;font-weight:700;color:#fff;margin:0}.sp-subtitle{font-size:.8125rem;color:#94a3b8;margin:4px 0 0}.sp-close{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:36px;height:36px;border-radius:8px;border:1px solid rgba(255,255,255,.2);background:#ffffff1a;cursor:pointer;color:#cbd5e1;transition:background .15s,border-color .15s}.sp-close:hover{background:#fff3;border-color:#ffffff4d;color:#fff}.sp-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-body{padding:20px 24px 24px;flex:1;overflow-y:auto;overflow-x:hidden}.sp-footer{display:flex;align-items:center;justify-content:space-between;flex-shrink:0;padding:14px 24px calc(14px + env(safe-area-inset-bottom,0px));border-top:1px solid #e2e8f0;background:#f8fafc}.sp-btn{display:inline-flex;align-items:center;gap:7px;padding:8px 18px;border-radius:7px;font-size:.875rem;font-weight:500;font-family:inherit;cursor:pointer;white-space:nowrap;transition:background .1s,border-color .1s,opacity .1s}.sp-btn:disabled{opacity:.5;cursor:default}.sp-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-btn-cancel{background:#fff;border:1px solid #e2e8f0;color:#475569}.sp-btn-cancel:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.sp-btn-primary{background:#3b82f6;border:1px solid #3b82f6;color:#fff}.sp-btn-primary:hover:not(:disabled){background:#2563eb;border-color:#2563eb}.sp-btn-danger{background:#dc2626;border:1px solid #dc2626;color:#fff}.sp-btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.sp-btn-warning{background:#d97706;border:1px solid #d97706;color:#fff}.sp-btn-warning:hover:not(:disabled){background:#b45309;border-color:#b45309}.sp-spinner{display:inline-block;width:13px;height:13px;border-radius:50%;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;animation:sp-spin .55s linear infinite;flex-shrink:0}@media(max-width:768px){.sp-panel,.sp-wide,.sp-extra-wide{width:100vw}}@media(max-width:480px){.sp-panel,.sp-wide,.sp-extra-wide{inset:auto 0 0;width:100vw;max-height:min(90dvh,var(--ui-vvh, 100dvh));border-radius:16px 16px 0 0;box-shadow:0 -4px 24px #00000026;animation:sp-up .25s ease}.sp-header{padding:16px 16px 14px}.sp-body{padding:16px}.sp-footer{padding:12px 16px calc(12px + env(safe-area-inset-bottom,0px))}}@keyframes sp-slide{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes sp-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes sp-fade{0%{opacity:0}to{opacity:1}}@keyframes sp-spin{to{transform:rotate(360deg)}}\n"],
10385
+ styles: [".sp-backdrop{position:fixed;inset:0;background:#0000004d;z-index:90;animation:sp-fade .2s ease}.sp-panel{position:fixed;top:0;right:0;bottom:var(--ui-kb, 0px);width:480px;max-width:100vw;max-height:var(--ui-vvh, 100dvh);background:#fff;z-index:100;box-shadow:-4px 0 20px #0000001a;display:flex;flex-direction:column;animation:sp-slide .25s ease}.sp-panel:focus{outline:none}.sp-wide{width:620px}.sp-extra-wide{width:760px}.sp-header{display:flex;justify-content:space-between;align-items:center;padding:24px 24px 20px;gap:12px;flex-shrink:0;background:linear-gradient(135deg,#1e293b,#334155)}.sp-header-text{flex:1;min-width:0}.sp-title{font-size:1.125rem;font-weight:700;color:#fff;margin:0}.sp-subtitle{font-size:.8125rem;color:#94a3b8;margin:4px 0 0}.sp-close{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:36px;height:36px;border-radius:8px;border:1px solid rgba(255,255,255,.2);background:#ffffff1a;cursor:pointer;color:#cbd5e1;transition:background .15s,border-color .15s}.sp-close:hover{background:#fff3;border-color:#ffffff4d;color:#fff}.sp-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-body{padding:20px 24px 24px;flex:1;overflow-y:auto;overflow-x:hidden}.sp-footer{display:flex;align-items:center;justify-content:space-between;flex-shrink:0;padding:14px 24px calc(14px + env(safe-area-inset-bottom,0px));border-top:1px solid #e2e8f0;background:#f8fafc}.sp-btn{display:inline-flex;align-items:center;gap:7px;padding:8px 18px;border-radius:7px;font-size:.875rem;font-weight:500;font-family:inherit;cursor:pointer;white-space:nowrap;transition:background .1s,border-color .1s,opacity .1s}.sp-btn:disabled{opacity:.5;cursor:default}.sp-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-btn-cancel{background:#fff;border:1px solid #e2e8f0;color:#475569}.sp-btn-cancel:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.sp-btn-primary{background:#3b82f6;border:1px solid #3b82f6;color:#fff}.sp-btn-primary:hover:not(:disabled){background:#2563eb;border-color:#2563eb}.sp-btn-danger{background:#dc2626;border:1px solid #dc2626;color:#fff}.sp-btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.sp-btn-warning{background:#d97706;border:1px solid #d97706;color:#fff}.sp-btn-warning:hover:not(:disabled){background:#b45309;border-color:#b45309}.sp-spinner{display:inline-block;width:13px;height:13px;border-radius:50%;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;animation:sp-spin .55s linear infinite;flex-shrink:0}@media(max-width:768px){.sp-panel,.sp-wide,.sp-extra-wide{width:100vw}}@media(max-width:480px){.sp-panel,.sp-wide,.sp-extra-wide{inset:auto 0 0;width:100vw;max-height:min(90dvh,var(--ui-vvh, 100dvh));border-radius:16px 16px 0 0;box-shadow:0 -4px 24px #00000026;animation:sp-up .25s ease}.sp-header{padding:16px 16px 14px}.sp-body{padding:16px}.sp-footer{padding:12px 16px calc(12px + env(safe-area-inset-bottom,0px))}}@media(pointer:coarse),(max-width:480px){.sp-close{position:relative}.sp-close:after{content:\"\";position:absolute;inset:-5px}.sp-btn{min-height:44px;justify-content:center}}@keyframes sp-slide{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes sp-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes sp-fade{0%{opacity:0}to{opacity:1}}@keyframes sp-spin{to{transform:rotate(360deg)}}\n"],
9943
10386
  changeDetection: i0.ChangeDetectionStrategy.OnPush
9944
10387
  });
9945
10388
  }
@@ -10021,7 +10464,7 @@ i0.ɵɵngDeclareClassMetadata({
10021
10464
  </aside>
10022
10465
  }
10023
10466
  `,
10024
- styles: [".sp-backdrop{position:fixed;inset:0;background:#0000004d;z-index:90;animation:sp-fade .2s ease}.sp-panel{position:fixed;top:0;right:0;bottom:var(--ui-kb, 0px);width:480px;max-width:100vw;max-height:var(--ui-vvh, 100dvh);background:#fff;z-index:100;box-shadow:-4px 0 20px #0000001a;display:flex;flex-direction:column;animation:sp-slide .25s ease}.sp-panel:focus{outline:none}.sp-wide{width:620px}.sp-extra-wide{width:760px}.sp-header{display:flex;justify-content:space-between;align-items:center;padding:24px 24px 20px;gap:12px;flex-shrink:0;background:linear-gradient(135deg,#1e293b,#334155)}.sp-header-text{flex:1;min-width:0}.sp-title{font-size:1.125rem;font-weight:700;color:#fff;margin:0}.sp-subtitle{font-size:.8125rem;color:#94a3b8;margin:4px 0 0}.sp-close{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:36px;height:36px;border-radius:8px;border:1px solid rgba(255,255,255,.2);background:#ffffff1a;cursor:pointer;color:#cbd5e1;transition:background .15s,border-color .15s}.sp-close:hover{background:#fff3;border-color:#ffffff4d;color:#fff}.sp-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-body{padding:20px 24px 24px;flex:1;overflow-y:auto;overflow-x:hidden}.sp-footer{display:flex;align-items:center;justify-content:space-between;flex-shrink:0;padding:14px 24px calc(14px + env(safe-area-inset-bottom,0px));border-top:1px solid #e2e8f0;background:#f8fafc}.sp-btn{display:inline-flex;align-items:center;gap:7px;padding:8px 18px;border-radius:7px;font-size:.875rem;font-weight:500;font-family:inherit;cursor:pointer;white-space:nowrap;transition:background .1s,border-color .1s,opacity .1s}.sp-btn:disabled{opacity:.5;cursor:default}.sp-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-btn-cancel{background:#fff;border:1px solid #e2e8f0;color:#475569}.sp-btn-cancel:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.sp-btn-primary{background:#3b82f6;border:1px solid #3b82f6;color:#fff}.sp-btn-primary:hover:not(:disabled){background:#2563eb;border-color:#2563eb}.sp-btn-danger{background:#dc2626;border:1px solid #dc2626;color:#fff}.sp-btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.sp-btn-warning{background:#d97706;border:1px solid #d97706;color:#fff}.sp-btn-warning:hover:not(:disabled){background:#b45309;border-color:#b45309}.sp-spinner{display:inline-block;width:13px;height:13px;border-radius:50%;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;animation:sp-spin .55s linear infinite;flex-shrink:0}@media(max-width:768px){.sp-panel,.sp-wide,.sp-extra-wide{width:100vw}}@media(max-width:480px){.sp-panel,.sp-wide,.sp-extra-wide{inset:auto 0 0;width:100vw;max-height:min(90dvh,var(--ui-vvh, 100dvh));border-radius:16px 16px 0 0;box-shadow:0 -4px 24px #00000026;animation:sp-up .25s ease}.sp-header{padding:16px 16px 14px}.sp-body{padding:16px}.sp-footer{padding:12px 16px calc(12px + env(safe-area-inset-bottom,0px))}}@keyframes sp-slide{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes sp-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes sp-fade{0%{opacity:0}to{opacity:1}}@keyframes sp-spin{to{transform:rotate(360deg)}}\n"]
10467
+ styles: [".sp-backdrop{position:fixed;inset:0;background:#0000004d;z-index:90;animation:sp-fade .2s ease}.sp-panel{position:fixed;top:0;right:0;bottom:var(--ui-kb, 0px);width:480px;max-width:100vw;max-height:var(--ui-vvh, 100dvh);background:#fff;z-index:100;box-shadow:-4px 0 20px #0000001a;display:flex;flex-direction:column;animation:sp-slide .25s ease}.sp-panel:focus{outline:none}.sp-wide{width:620px}.sp-extra-wide{width:760px}.sp-header{display:flex;justify-content:space-between;align-items:center;padding:24px 24px 20px;gap:12px;flex-shrink:0;background:linear-gradient(135deg,#1e293b,#334155)}.sp-header-text{flex:1;min-width:0}.sp-title{font-size:1.125rem;font-weight:700;color:#fff;margin:0}.sp-subtitle{font-size:.8125rem;color:#94a3b8;margin:4px 0 0}.sp-close{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:36px;height:36px;border-radius:8px;border:1px solid rgba(255,255,255,.2);background:#ffffff1a;cursor:pointer;color:#cbd5e1;transition:background .15s,border-color .15s}.sp-close:hover{background:#fff3;border-color:#ffffff4d;color:#fff}.sp-close:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-body{padding:20px 24px 24px;flex:1;overflow-y:auto;overflow-x:hidden}.sp-footer{display:flex;align-items:center;justify-content:space-between;flex-shrink:0;padding:14px 24px calc(14px + env(safe-area-inset-bottom,0px));border-top:1px solid #e2e8f0;background:#f8fafc}.sp-btn{display:inline-flex;align-items:center;gap:7px;padding:8px 18px;border-radius:7px;font-size:.875rem;font-weight:500;font-family:inherit;cursor:pointer;white-space:nowrap;transition:background .1s,border-color .1s,opacity .1s}.sp-btn:disabled{opacity:.5;cursor:default}.sp-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.sp-btn-cancel{background:#fff;border:1px solid #e2e8f0;color:#475569}.sp-btn-cancel:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.sp-btn-primary{background:#3b82f6;border:1px solid #3b82f6;color:#fff}.sp-btn-primary:hover:not(:disabled){background:#2563eb;border-color:#2563eb}.sp-btn-danger{background:#dc2626;border:1px solid #dc2626;color:#fff}.sp-btn-danger:hover:not(:disabled){background:#b91c1c;border-color:#b91c1c}.sp-btn-warning{background:#d97706;border:1px solid #d97706;color:#fff}.sp-btn-warning:hover:not(:disabled){background:#b45309;border-color:#b45309}.sp-spinner{display:inline-block;width:13px;height:13px;border-radius:50%;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;animation:sp-spin .55s linear infinite;flex-shrink:0}@media(max-width:768px){.sp-panel,.sp-wide,.sp-extra-wide{width:100vw}}@media(max-width:480px){.sp-panel,.sp-wide,.sp-extra-wide{inset:auto 0 0;width:100vw;max-height:min(90dvh,var(--ui-vvh, 100dvh));border-radius:16px 16px 0 0;box-shadow:0 -4px 24px #00000026;animation:sp-up .25s ease}.sp-header{padding:16px 16px 14px}.sp-body{padding:16px}.sp-footer{padding:12px 16px calc(12px + env(safe-area-inset-bottom,0px))}}@media(pointer:coarse),(max-width:480px){.sp-close{position:relative}.sp-close:after{content:\"\";position:absolute;inset:-5px}.sp-btn{min-height:44px;justify-content:center}}@keyframes sp-slide{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes sp-up{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes sp-fade{0%{opacity:0}to{opacity:1}}@keyframes sp-spin{to{transform:rotate(360deg)}}\n"]
10025
10468
  }]
10026
10469
  }],
10027
10470
  ctorParameters: () => [],
@@ -10116,30 +10559,120 @@ i0.ɵɵngDeclareClassMetadata({
10116
10559
  }]
10117
10560
  }
10118
10561
  });
10119
- var ToggleBadgeComponent = class ToggleBadgeComponent {
10562
+ const KEY_STEP = 2;
10563
+ const KEY_STEP_BIG = 10;
10564
+ const clamp = (n) => Math.min(100, Math.max(0, Math.round(n)));
10565
+ var ImageRepositionComponent = class ImageRepositionComponent {
10120
10566
  constructor() {
10121
- this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
10122
- this.active = input(false, ...ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []);
10123
- this.toggle = output();
10567
+ this.hintId = `ui-image-reposition-hint-${ImageRepositionComponent.nextId++}`;
10568
+ this.host = inject(ElementRef).nativeElement;
10569
+ this.src = input(null, ...ngDevMode ? [{ debugName: "src" }] : /* istanbul ignore next */ []);
10570
+ this.alt = input("", ...ngDevMode ? [{ debugName: "alt" }] : /* istanbul ignore next */ []);
10571
+ this.shape = input("circle", ...ngDevMode ? [{ debugName: "shape" }] : /* istanbul ignore next */ []);
10572
+ this.label = input("Photo position", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
10573
+ this.x = model(50, ...ngDevMode ? [{ debugName: "x" }] : /* istanbul ignore next */ []);
10574
+ this.y = model(50, ...ngDevMode ? [{ debugName: "y" }] : /* istanbul ignore next */ []);
10575
+ this.dragging = signal(false, ...ngDevMode ? [{ debugName: "dragging" }] : /* istanbul ignore next */ []);
10576
+ this.natural = null;
10577
+ this.start = null;
10578
+ }
10579
+ static {
10580
+ this.nextId = 0;
10581
+ }
10582
+ onLoad(e) {
10583
+ const img = e.target;
10584
+ this.natural = {
10585
+ w: img.naturalWidth,
10586
+ h: img.naturalHeight
10587
+ };
10588
+ }
10589
+ overflow(frame) {
10590
+ if (!this.natural || !this.natural.w || !this.natural.h) return {
10591
+ x: 0,
10592
+ y: 0
10593
+ };
10594
+ const scale = Math.max(frame.width / this.natural.w, frame.height / this.natural.h);
10595
+ return {
10596
+ x: Math.max(0, this.natural.w * scale - frame.width),
10597
+ y: Math.max(0, this.natural.h * scale - frame.height)
10598
+ };
10599
+ }
10600
+ onPointerDown(e) {
10601
+ if (!this.src() || e.pointerType === "mouse" && e.button !== 0) return;
10602
+ e.currentTarget.setPointerCapture?.(e.pointerId);
10603
+ this.start = {
10604
+ px: e.clientX,
10605
+ py: e.clientY,
10606
+ x: this.x(),
10607
+ y: this.y()
10608
+ };
10609
+ this.dragging.set(true);
10610
+ }
10611
+ onPointerMove(e) {
10612
+ if (!this.start) return;
10613
+ const frame = e.currentTarget.getBoundingClientRect();
10614
+ const o = this.overflow(frame);
10615
+ if (o.x > 0) this.x.set(clamp(this.start.x - (e.clientX - this.start.px) / o.x * 100));
10616
+ if (o.y > 0) this.y.set(clamp(this.start.y - (e.clientY - this.start.py) / o.y * 100));
10617
+ }
10618
+ endDrag(e) {
10619
+ if (!this.start) return;
10620
+ e.currentTarget.releasePointerCapture?.(e.pointerId);
10621
+ this.start = null;
10622
+ this.dragging.set(false);
10623
+ }
10624
+ onKeydown(e) {
10625
+ if (!this.src()) return;
10626
+ const step = e.shiftKey ? KEY_STEP_BIG : KEY_STEP;
10627
+ const frame = this.host.querySelector(".ir-frame").getBoundingClientRect();
10628
+ const o = this.overflow(frame);
10629
+ let handled = true;
10630
+ if (e.key === "ArrowLeft" && o.x > 0) this.x.set(clamp(this.x() + step));
10631
+ else if (e.key === "ArrowRight" && o.x > 0) this.x.set(clamp(this.x() - step));
10632
+ else if (e.key === "ArrowUp" && o.y > 0) this.y.set(clamp(this.y() + step));
10633
+ else if (e.key === "ArrowDown" && o.y > 0) this.y.set(clamp(this.y() - step));
10634
+ else handled = e.key.startsWith("Arrow");
10635
+ if (handled) e.preventDefault();
10124
10636
  }
10125
10637
  static {
10126
10638
  this.ɵfac = i0.ɵɵngDeclareFactory({
10127
10639
  minVersion: "12.0.0",
10128
10640
  version: "22.2.2",
10129
10641
  ngImport: i0,
10130
- type: ToggleBadgeComponent,
10642
+ type: ImageRepositionComponent,
10131
10643
  deps: [],
10132
10644
  target: i0.ɵɵFactoryTarget.Component
10133
10645
  });
10134
10646
  }
10135
10647
  static {
10136
10648
  this.ɵcmp = i0.ɵɵngDeclareComponent({
10137
- minVersion: "17.1.0",
10649
+ minVersion: "17.0.0",
10138
10650
  version: "22.2.2",
10139
- type: ToggleBadgeComponent,
10651
+ type: ImageRepositionComponent,
10140
10652
  isStandalone: true,
10141
- selector: "ui-toggle-badge",
10653
+ selector: "ui-image-reposition",
10142
10654
  inputs: {
10655
+ src: {
10656
+ classPropertyName: "src",
10657
+ publicName: "src",
10658
+ isSignal: true,
10659
+ isRequired: false,
10660
+ transformFunction: null
10661
+ },
10662
+ alt: {
10663
+ classPropertyName: "alt",
10664
+ publicName: "alt",
10665
+ isSignal: true,
10666
+ isRequired: false,
10667
+ transformFunction: null
10668
+ },
10669
+ shape: {
10670
+ classPropertyName: "shape",
10671
+ publicName: "shape",
10672
+ isSignal: true,
10673
+ isRequired: false,
10674
+ transformFunction: null
10675
+ },
10143
10676
  label: {
10144
10677
  classPropertyName: "label",
10145
10678
  publicName: "label",
@@ -10147,24 +10680,41 @@ var ToggleBadgeComponent = class ToggleBadgeComponent {
10147
10680
  isRequired: false,
10148
10681
  transformFunction: null
10149
10682
  },
10150
- active: {
10151
- classPropertyName: "active",
10152
- publicName: "active",
10683
+ x: {
10684
+ classPropertyName: "x",
10685
+ publicName: "x",
10686
+ isSignal: true,
10687
+ isRequired: false,
10688
+ transformFunction: null
10689
+ },
10690
+ y: {
10691
+ classPropertyName: "y",
10692
+ publicName: "y",
10153
10693
  isSignal: true,
10154
10694
  isRequired: false,
10155
10695
  transformFunction: null
10156
10696
  }
10157
10697
  },
10158
- outputs: { toggle: "toggle" },
10698
+ outputs: {
10699
+ x: "xChange",
10700
+ y: "yChange"
10701
+ },
10159
10702
  ngImport: i0,
10160
10703
  template: `
10161
- <button class="toggle-badge" [class.active]="active()" (click)="toggle.emit()">
10162
- <ng-content />
10163
- {{ label() }}
10164
- </button>
10704
+ <div class="ir-frame" [class.ir-circle]="shape() === 'circle'" [class.ir-dragging]="dragging()"
10705
+ role="group" tabindex="0" data-testid="image-reposition-frame"
10706
+ [attr.aria-label]="label()" [attr.aria-describedby]="hintId"
10707
+ (pointerdown)="onPointerDown($event)" (pointermove)="onPointerMove($event)"
10708
+ (pointerup)="endDrag($event)" (pointercancel)="endDrag($event)" (keydown)="onKeydown($event)">
10709
+ @if (src()) {
10710
+ <img class="ir-img" [src]="src()" [attr.alt]="alt()" draggable="false"
10711
+ [style.object-position]="x() + '% ' + y() + '%'" (load)="onLoad($event)" />
10712
+ }
10713
+ </div>
10714
+ <span class="ir-hint" [id]="hintId">Drag the photo, or use the arrow keys, to center it in the frame.</span>
10165
10715
  `,
10166
10716
  isInline: true,
10167
- styles: [".toggle-badge{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:.75rem;font-weight:500;color:#64748b;cursor:pointer;font-family:inherit;transition:all .15s ease;line-height:1}.toggle-badge:hover{background:#f8fafc;border-color:#94a3b8}.toggle-badge.active{background:#1e293b;color:#fff;border-color:#1e293b}.toggle-badge:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}\n"],
10717
+ styles: [":host{display:inline-flex;flex-direction:column;gap:6px;max-width:100%}.ir-frame{width:160px;height:160px;border-radius:12px;overflow:hidden;border:1px solid #e2e8f0;background:#f1f5f9;cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;box-sizing:border-box;flex-shrink:0}.ir-frame:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.ir-circle{border-radius:50%}.ir-dragging{cursor:grabbing}.ir-img{display:block;width:100%;height:100%;object-fit:cover;pointer-events:none}.ir-hint{font-size:.75rem;color:#64748b}\n"],
10168
10718
  changeDetection: i0.ChangeDetectionStrategy.OnPush
10169
10719
  });
10170
10720
  }
@@ -10173,23 +10723,54 @@ i0.ɵɵngDeclareClassMetadata({
10173
10723
  minVersion: "12.0.0",
10174
10724
  version: "22.2.2",
10175
10725
  ngImport: i0,
10176
- type: ToggleBadgeComponent,
10726
+ type: ImageRepositionComponent,
10177
10727
  decorators: [{
10178
10728
  type: Component,
10179
10729
  args: [{
10180
- selector: "ui-toggle-badge",
10730
+ selector: "ui-image-reposition",
10181
10731
  standalone: true,
10182
10732
  changeDetection: ChangeDetectionStrategy.OnPush,
10183
10733
  template: `
10184
- <button class="toggle-badge" [class.active]="active()" (click)="toggle.emit()">
10185
- <ng-content />
10186
- {{ label() }}
10187
- </button>
10734
+ <div class="ir-frame" [class.ir-circle]="shape() === 'circle'" [class.ir-dragging]="dragging()"
10735
+ role="group" tabindex="0" data-testid="image-reposition-frame"
10736
+ [attr.aria-label]="label()" [attr.aria-describedby]="hintId"
10737
+ (pointerdown)="onPointerDown($event)" (pointermove)="onPointerMove($event)"
10738
+ (pointerup)="endDrag($event)" (pointercancel)="endDrag($event)" (keydown)="onKeydown($event)">
10739
+ @if (src()) {
10740
+ <img class="ir-img" [src]="src()" [attr.alt]="alt()" draggable="false"
10741
+ [style.object-position]="x() + '% ' + y() + '%'" (load)="onLoad($event)" />
10742
+ }
10743
+ </div>
10744
+ <span class="ir-hint" [id]="hintId">Drag the photo, or use the arrow keys, to center it in the frame.</span>
10188
10745
  `,
10189
- styles: [".toggle-badge{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:.75rem;font-weight:500;color:#64748b;cursor:pointer;font-family:inherit;transition:all .15s ease;line-height:1}.toggle-badge:hover{background:#f8fafc;border-color:#94a3b8}.toggle-badge.active{background:#1e293b;color:#fff;border-color:#1e293b}.toggle-badge:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}\n"]
10746
+ styles: [":host{display:inline-flex;flex-direction:column;gap:6px;max-width:100%}.ir-frame{width:160px;height:160px;border-radius:12px;overflow:hidden;border:1px solid #e2e8f0;background:#f1f5f9;cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;box-sizing:border-box;flex-shrink:0}.ir-frame:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.ir-circle{border-radius:50%}.ir-dragging{cursor:grabbing}.ir-img{display:block;width:100%;height:100%;object-fit:cover;pointer-events:none}.ir-hint{font-size:.75rem;color:#64748b}\n"]
10190
10747
  }]
10191
10748
  }],
10192
10749
  propDecorators: {
10750
+ src: [{
10751
+ type: i0.Input,
10752
+ args: [{
10753
+ isSignal: true,
10754
+ alias: "src",
10755
+ required: false
10756
+ }]
10757
+ }],
10758
+ alt: [{
10759
+ type: i0.Input,
10760
+ args: [{
10761
+ isSignal: true,
10762
+ alias: "alt",
10763
+ required: false
10764
+ }]
10765
+ }],
10766
+ shape: [{
10767
+ type: i0.Input,
10768
+ args: [{
10769
+ isSignal: true,
10770
+ alias: "shape",
10771
+ required: false
10772
+ }]
10773
+ }],
10193
10774
  label: [{
10194
10775
  type: i0.Input,
10195
10776
  args: [{
@@ -10198,21 +10779,127 @@ i0.ɵɵngDeclareClassMetadata({
10198
10779
  required: false
10199
10780
  }]
10200
10781
  }],
10201
- active: [{
10782
+ x: [{
10202
10783
  type: i0.Input,
10203
10784
  args: [{
10204
10785
  isSignal: true,
10205
- alias: "active",
10786
+ alias: "x",
10206
10787
  required: false
10207
10788
  }]
10789
+ }, {
10790
+ type: i0.Output,
10791
+ args: ["xChange"]
10208
10792
  }],
10209
- toggle: [{
10793
+ y: [{
10794
+ type: i0.Input,
10795
+ args: [{
10796
+ isSignal: true,
10797
+ alias: "y",
10798
+ required: false
10799
+ }]
10800
+ }, {
10210
10801
  type: i0.Output,
10211
- args: ["toggle"]
10802
+ args: ["yChange"]
10212
10803
  }]
10213
10804
  }
10214
10805
  });
10215
- var PillTabsComponent = class PillTabsComponent {
10806
+ var ToggleBadgeComponent = class ToggleBadgeComponent {
10807
+ constructor() {
10808
+ this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
10809
+ this.active = input(false, ...ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []);
10810
+ this.toggle = output();
10811
+ }
10812
+ static {
10813
+ this.ɵfac = i0.ɵɵngDeclareFactory({
10814
+ minVersion: "12.0.0",
10815
+ version: "22.2.2",
10816
+ ngImport: i0,
10817
+ type: ToggleBadgeComponent,
10818
+ deps: [],
10819
+ target: i0.ɵɵFactoryTarget.Component
10820
+ });
10821
+ }
10822
+ static {
10823
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
10824
+ minVersion: "17.1.0",
10825
+ version: "22.2.2",
10826
+ type: ToggleBadgeComponent,
10827
+ isStandalone: true,
10828
+ selector: "ui-toggle-badge",
10829
+ inputs: {
10830
+ label: {
10831
+ classPropertyName: "label",
10832
+ publicName: "label",
10833
+ isSignal: true,
10834
+ isRequired: false,
10835
+ transformFunction: null
10836
+ },
10837
+ active: {
10838
+ classPropertyName: "active",
10839
+ publicName: "active",
10840
+ isSignal: true,
10841
+ isRequired: false,
10842
+ transformFunction: null
10843
+ }
10844
+ },
10845
+ outputs: { toggle: "toggle" },
10846
+ ngImport: i0,
10847
+ template: `
10848
+ <button class="toggle-badge" [class.active]="active()" (click)="toggle.emit()">
10849
+ <ng-content />
10850
+ {{ label() }}
10851
+ </button>
10852
+ `,
10853
+ isInline: true,
10854
+ styles: [".toggle-badge{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:.75rem;font-weight:500;color:#64748b;cursor:pointer;font-family:inherit;transition:all .15s ease;line-height:1}.toggle-badge:hover{background:#f8fafc;border-color:#94a3b8}.toggle-badge.active{background:#1e293b;color:#fff;border-color:#1e293b}.toggle-badge:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}\n"],
10855
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
10856
+ });
10857
+ }
10858
+ };
10859
+ i0.ɵɵngDeclareClassMetadata({
10860
+ minVersion: "12.0.0",
10861
+ version: "22.2.2",
10862
+ ngImport: i0,
10863
+ type: ToggleBadgeComponent,
10864
+ decorators: [{
10865
+ type: Component,
10866
+ args: [{
10867
+ selector: "ui-toggle-badge",
10868
+ standalone: true,
10869
+ changeDetection: ChangeDetectionStrategy.OnPush,
10870
+ template: `
10871
+ <button class="toggle-badge" [class.active]="active()" (click)="toggle.emit()">
10872
+ <ng-content />
10873
+ {{ label() }}
10874
+ </button>
10875
+ `,
10876
+ styles: [".toggle-badge{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:.75rem;font-weight:500;color:#64748b;cursor:pointer;font-family:inherit;transition:all .15s ease;line-height:1}.toggle-badge:hover{background:#f8fafc;border-color:#94a3b8}.toggle-badge.active{background:#1e293b;color:#fff;border-color:#1e293b}.toggle-badge:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}\n"]
10877
+ }]
10878
+ }],
10879
+ propDecorators: {
10880
+ label: [{
10881
+ type: i0.Input,
10882
+ args: [{
10883
+ isSignal: true,
10884
+ alias: "label",
10885
+ required: false
10886
+ }]
10887
+ }],
10888
+ active: [{
10889
+ type: i0.Input,
10890
+ args: [{
10891
+ isSignal: true,
10892
+ alias: "active",
10893
+ required: false
10894
+ }]
10895
+ }],
10896
+ toggle: [{
10897
+ type: i0.Output,
10898
+ args: ["toggle"]
10899
+ }]
10900
+ }
10901
+ });
10902
+ var PillTabsComponent = class PillTabsComponent {
10216
10903
  constructor() {
10217
10904
  this.host = inject(ElementRef);
10218
10905
  this.tabs = input([], ...ngDevMode ? [{ debugName: "tabs" }] : /* istanbul ignore next */ []);
@@ -10348,7 +11035,7 @@ var PillTabsComponent = class PillTabsComponent {
10348
11035
  </div>
10349
11036
  `,
10350
11037
  isInline: true,
10351
- styles: [".pill-wrap{position:relative}.pill-fade{position:absolute;top:0;bottom:0;width:28px;pointer-events:none;opacity:0;transition:opacity .15s}.pill-fade.visible{opacity:1}.pill-fade--start{left:0;background:linear-gradient(to right,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-fade--end{right:0;background:linear-gradient(to left,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-tabs{display:flex;gap:8px;flex-wrap:wrap}@media(max-width:768px){.pill-tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:2px;scrollbar-width:none}.pill-tabs::-webkit-scrollbar{display:none}}.pill-tab{position:relative;display:inline-flex;align-items:center;gap:6px;padding:7px 16px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;transition:all .15s;font-family:inherit}.pill-tab:hover:not(.disabled):not(.active){background:#f8fafc;border-color:#94a3b8}.pill-tab:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pill-tab .pill-count{background:#e2e8f0;color:#475569;font-size:.7rem;font-weight:600;padding:1px 6px;border-radius:999px;line-height:1.4}.pill-tab.active{background:#1e293b;color:#fff;border-color:#1e293b}.pill-tab.active .pill-count{background:#fff3;color:#fff}.pill-tab.active:hover{background:#1e293b;color:#fff}.pill-tab.disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.pill-tab .pill-info-icon{flex-shrink:0;opacity:.7}.pill-tab:hover .pill-info-icon,.pill-tab:focus-visible .pill-info-icon{opacity:1}.pill-tab .pill-info-tip{position:absolute;left:0;top:calc(100% + 8px);z-index:20;width:max-content;max-width:280px;padding:8px 12px;border-radius:8px;background:#1e293b;color:#fff;font-size:.75rem;font-weight:400;line-height:1.45;text-align:left;white-space:normal;box-shadow:0 4px 12px #0f172a40;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .12s,visibility .12s}.pill-tab:hover .pill-info-tip,.pill-tab:focus-visible .pill-info-tip{opacity:1;visibility:visible}\n"],
11038
+ styles: [".pill-wrap{position:relative}.pill-fade{position:absolute;top:0;bottom:0;width:28px;pointer-events:none;opacity:0;transition:opacity .15s}.pill-fade.visible{opacity:1}.pill-fade--start{left:0;background:linear-gradient(to right,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-fade--end{right:0;background:linear-gradient(to left,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-tabs{display:flex;gap:8px;flex-wrap:wrap}@media(max-width:768px){.pill-tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:2px;scrollbar-width:none}.pill-tabs::-webkit-scrollbar{display:none}}.pill-tab{position:relative;display:inline-flex;align-items:center;gap:6px;padding:7px 16px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;transition:all .15s;font-family:inherit}.pill-tab:hover:not(.disabled):not(.active){background:#f8fafc;border-color:#94a3b8}.pill-tab:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pill-tab .pill-count{background:#e2e8f0;color:#475569;font-size:.7rem;font-weight:600;padding:1px 6px;border-radius:999px;line-height:1.4}.pill-tab.active{background:#1e293b;color:#fff;border-color:#1e293b}.pill-tab.active .pill-count{background:#fff3;color:#fff}.pill-tab.active:hover{background:#1e293b;color:#fff}.pill-tab.disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.pill-tab .pill-info-icon{flex-shrink:0;opacity:.7}.pill-tab:hover .pill-info-icon,.pill-tab:focus-visible .pill-info-icon{opacity:1}.pill-tab .pill-info-tip{position:absolute;left:0;top:calc(100% + 8px);z-index:20;width:max-content;max-width:280px;padding:8px 12px;border-radius:8px;background:#1e293b;color:#fff;font-size:.75rem;font-weight:400;line-height:1.45;text-align:left;white-space:normal;box-shadow:0 4px 12px #0f172a40;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .12s,visibility .12s}.pill-tab:hover .pill-info-tip,.pill-tab:focus-visible .pill-info-tip{opacity:1;visibility:visible}@media(pointer:coarse),(max-width:480px){.pill-tab{min-height:44px}}\n"],
10352
11039
  changeDetection: i0.ChangeDetectionStrategy.OnPush
10353
11040
  });
10354
11041
  }
@@ -10394,7 +11081,7 @@ i0.ɵɵngDeclareClassMetadata({
10394
11081
  <span class="pill-fade pill-fade--end" [class.visible]="canScrollEnd()" aria-hidden="true" data-testid="pill-fade-end"></span>
10395
11082
  </div>
10396
11083
  `,
10397
- styles: [".pill-wrap{position:relative}.pill-fade{position:absolute;top:0;bottom:0;width:28px;pointer-events:none;opacity:0;transition:opacity .15s}.pill-fade.visible{opacity:1}.pill-fade--start{left:0;background:linear-gradient(to right,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-fade--end{right:0;background:linear-gradient(to left,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-tabs{display:flex;gap:8px;flex-wrap:wrap}@media(max-width:768px){.pill-tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:2px;scrollbar-width:none}.pill-tabs::-webkit-scrollbar{display:none}}.pill-tab{position:relative;display:inline-flex;align-items:center;gap:6px;padding:7px 16px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;transition:all .15s;font-family:inherit}.pill-tab:hover:not(.disabled):not(.active){background:#f8fafc;border-color:#94a3b8}.pill-tab:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pill-tab .pill-count{background:#e2e8f0;color:#475569;font-size:.7rem;font-weight:600;padding:1px 6px;border-radius:999px;line-height:1.4}.pill-tab.active{background:#1e293b;color:#fff;border-color:#1e293b}.pill-tab.active .pill-count{background:#fff3;color:#fff}.pill-tab.active:hover{background:#1e293b;color:#fff}.pill-tab.disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.pill-tab .pill-info-icon{flex-shrink:0;opacity:.7}.pill-tab:hover .pill-info-icon,.pill-tab:focus-visible .pill-info-icon{opacity:1}.pill-tab .pill-info-tip{position:absolute;left:0;top:calc(100% + 8px);z-index:20;width:max-content;max-width:280px;padding:8px 12px;border-radius:8px;background:#1e293b;color:#fff;font-size:.75rem;font-weight:400;line-height:1.45;text-align:left;white-space:normal;box-shadow:0 4px 12px #0f172a40;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .12s,visibility .12s}.pill-tab:hover .pill-info-tip,.pill-tab:focus-visible .pill-info-tip{opacity:1;visibility:visible}\n"]
11084
+ styles: [".pill-wrap{position:relative}.pill-fade{position:absolute;top:0;bottom:0;width:28px;pointer-events:none;opacity:0;transition:opacity .15s}.pill-fade.visible{opacity:1}.pill-fade--start{left:0;background:linear-gradient(to right,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-fade--end{right:0;background:linear-gradient(to left,var(--ui-pill-tabs-fade, #fff),transparent)}.pill-tabs{display:flex;gap:8px;flex-wrap:wrap}@media(max-width:768px){.pill-tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;padding-bottom:2px;scrollbar-width:none}.pill-tabs::-webkit-scrollbar{display:none}}.pill-tab{position:relative;display:inline-flex;align-items:center;gap:6px;padding:7px 16px;border-radius:999px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;transition:all .15s;font-family:inherit}.pill-tab:hover:not(.disabled):not(.active){background:#f8fafc;border-color:#94a3b8}.pill-tab:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pill-tab .pill-count{background:#e2e8f0;color:#475569;font-size:.7rem;font-weight:600;padding:1px 6px;border-radius:999px;line-height:1.4}.pill-tab.active{background:#1e293b;color:#fff;border-color:#1e293b}.pill-tab.active .pill-count{background:#fff3;color:#fff}.pill-tab.active:hover{background:#1e293b;color:#fff}.pill-tab.disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.pill-tab .pill-info-icon{flex-shrink:0;opacity:.7}.pill-tab:hover .pill-info-icon,.pill-tab:focus-visible .pill-info-icon{opacity:1}.pill-tab .pill-info-tip{position:absolute;left:0;top:calc(100% + 8px);z-index:20;width:max-content;max-width:280px;padding:8px 12px;border-radius:8px;background:#1e293b;color:#fff;font-size:.75rem;font-weight:400;line-height:1.45;text-align:left;white-space:normal;box-shadow:0 4px 12px #0f172a40;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .12s,visibility .12s}.pill-tab:hover .pill-info-tip,.pill-tab:focus-visible .pill-info-tip{opacity:1;visibility:visible}@media(pointer:coarse),(max-width:480px){.pill-tab{min-height:44px}}\n"]
10398
11085
  }]
10399
11086
  }],
10400
11087
  ctorParameters: () => [],
@@ -10933,7 +11620,7 @@ var ContactPickerComponent = class ContactPickerComponent {
10933
11620
  </div>
10934
11621
  `,
10935
11622
  isInline: true,
10936
- styles: [".picker-wrapper{position:relative;overflow:visible}.picker-label{display:block;font-size:.8125rem;font-weight:600;color:#374151;margin-bottom:6px}.picker-req{color:#ef4444}.picker-hint{margin:6px 0 0;font-size:.75rem;line-height:1.4;color:#64748b}.picker-input{width:100%;padding:9px 12px;border:1px solid #e2e8f0;border-radius:8px;font-size:.875rem;color:#1e293b;font-family:inherit;outline:none;box-sizing:border-box}.picker-input::placeholder{color:#94a3b8}.picker-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.picker-input:focus-visible{outline:2px solid transparent}@media(max-width:480px){.picker-input{font-size:1rem}}.picker-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.picker-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:9999;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 6px 16px #0000001a;max-height:240px;overflow-y:auto}@media(pointer:coarse),(max-width:480px){.picker-input{min-height:44px}.picker-dropdown{max-height:min(240px,40vh);overscroll-behavior:contain}.picker-option{min-height:44px;justify-content:center;box-sizing:border-box}.picker-option--check{min-height:44px}.chip-remove{position:relative}.chip-remove:after{content:\"\";position:absolute;inset:-13px}}.picker-option{display:flex;flex-direction:column;gap:2px;width:100%;padding:10px 12px;border:none;background:none;text-align:left;cursor:pointer;font-family:inherit}.picker-option:hover,.picker-option.picker-option--active{background:#f8fafc}.picker-option:first-child{border-radius:8px 8px 0 0}.picker-option:last-child{border-radius:0 0 8px 8px}.picker-option--check{flex-direction:row;align-items:center;gap:10px}.picker-option--check .option-body{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1}.picker-option--check .option-name,.picker-option--check .option-detail{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.option-check{display:flex;pointer-events:none}.option-name{font-size:.875rem;font-weight:600;color:#1e293b;overflow-wrap:anywhere}.option-detail{font-size:.75rem;color:#94a3b8;overflow-wrap:anywhere}.picker-loading,.picker-empty{padding:12px;font-size:.8125rem;color:#94a3b8;text-align:center}.selected-input{display:flex;align-items:center;justify-content:space-between;padding:9px 12px;border:1px solid #e2e8f0;border-radius:8px;background:#f8fafc;font-size:.875rem;font-weight:600;color:#1e293b;gap:8px;overflow-wrap:anywhere;min-width:0}.selected-input:focus{outline:none}.selected-input:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.clear-btn{width:18px;height:18px;border:none;background:#e2e8f0;border-radius:50%;cursor:pointer;font-size:.75rem;color:#64748b;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.clear-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.clear-btn:hover{background:#cbd5e1;color:#1e293b}.clear-btn:after{content:\"\";position:absolute;inset:-13px}.recipient-details{margin-top:16px}.details-label{display:block;font-size:.6875rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.05em;margin-bottom:8px}.details-card{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.detail-row{display:flex;justify-content:space-between;align-items:center;padding:10px 14px;border-bottom:1px solid #f1f5f9}.detail-row.last{border-bottom:none}.detail-row:nth-child(2n){background:#f8fafc}.detail-key{font-size:.8125rem;color:#94a3b8;font-weight:500}.detail-val{font-size:.875rem;color:#1e293b;font-weight:600}.multi-chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.multi-chip{display:inline-flex;align-items:center;gap:4px;padding:4px 8px 4px 10px;background:#dbeafe;border-radius:20px;font-size:.8125rem;font-weight:500;color:#1e40af}.chip-remove{width:18px;height:18px;border:none;background:#1e40af26;border-radius:50%;cursor:pointer;font-size:.875rem;line-height:1;color:#1e40af;display:flex;align-items:center;justify-content:center;flex-shrink:0}.chip-remove:hover{background:#1e40af4d}.chip-remove:focus-visible{outline:2px solid #1e40af;outline-offset:2px}@media(forced-colors:active){.picker-input:focus{outline:2px solid Highlight;outline-offset:1px}.picker-option--active{outline:2px solid Highlight;outline-offset:-2px}}\n"],
11623
+ styles: [".picker-wrapper{position:relative;overflow:visible}.picker-label{display:block;font-size:.8125rem;font-weight:600;color:#374151;margin-bottom:6px}.picker-req{color:#ef4444}.picker-hint{margin:6px 0 0;font-size:.75rem;line-height:1.4;color:#64748b}.picker-input{width:100%;padding:9px 12px;border:1px solid #e2e8f0;border-radius:8px;font-size:.875rem;color:#1e293b;font-family:inherit;outline:none;box-sizing:border-box}.picker-input::placeholder{color:#94a3b8}.picker-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.picker-input:focus-visible{outline:2px solid transparent}@media(max-width:480px){.picker-input{font-size:1rem}}.picker-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.picker-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:9999;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 6px 16px #0000001a;max-height:240px;overflow-y:auto}@media(pointer:coarse),(max-width:480px){.picker-input{min-height:44px}.picker-dropdown{max-height:min(240px,40vh);overscroll-behavior:contain}.picker-option{min-height:44px;justify-content:center;box-sizing:border-box}.picker-option--check{min-height:44px}.chip-remove{position:relative}.chip-remove:after{content:\"\";position:absolute;inset:-13px}}@media(max-width:480px){:host-context(.m-body) .picker-dropdown{position:static;margin-top:4px;max-height:min(240px,calc(var(--ui-vvh, 100dvh) * .3))}}.picker-option{display:flex;flex-direction:column;gap:2px;width:100%;padding:10px 12px;border:none;background:none;text-align:left;cursor:pointer;font-family:inherit}.picker-option:hover,.picker-option.picker-option--active{background:#f8fafc}.picker-option:first-child{border-radius:8px 8px 0 0}.picker-option:last-child{border-radius:0 0 8px 8px}.picker-option--check{flex-direction:row;align-items:center;gap:10px}.picker-option--check .option-body{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1}.picker-option--check .option-name,.picker-option--check .option-detail{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.option-check{display:flex;pointer-events:none}.option-name{font-size:.875rem;font-weight:600;color:#1e293b;overflow-wrap:anywhere}.option-detail{font-size:.75rem;color:#94a3b8;overflow-wrap:anywhere}.picker-loading,.picker-empty{padding:12px;font-size:.8125rem;color:#94a3b8;text-align:center}.selected-input{display:flex;align-items:center;justify-content:space-between;padding:9px 12px;border:1px solid #e2e8f0;border-radius:8px;background:#f8fafc;font-size:.875rem;font-weight:600;color:#1e293b;gap:8px;overflow-wrap:anywhere;min-width:0}.selected-input:focus{outline:none}.selected-input:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.clear-btn{width:18px;height:18px;border:none;background:#e2e8f0;border-radius:50%;cursor:pointer;font-size:.75rem;color:#64748b;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.clear-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.clear-btn:hover{background:#cbd5e1;color:#1e293b}.clear-btn:after{content:\"\";position:absolute;inset:-13px}.recipient-details{margin-top:16px}.details-label{display:block;font-size:.6875rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.05em;margin-bottom:8px}.details-card{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.detail-row{display:flex;justify-content:space-between;align-items:center;padding:10px 14px;border-bottom:1px solid #f1f5f9}.detail-row.last{border-bottom:none}.detail-row:nth-child(2n){background:#f8fafc}.detail-key{font-size:.8125rem;color:#94a3b8;font-weight:500}.detail-val{font-size:.875rem;color:#1e293b;font-weight:600}.multi-chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.multi-chip{display:inline-flex;align-items:center;gap:4px;padding:4px 8px 4px 10px;background:#dbeafe;border-radius:20px;font-size:.8125rem;font-weight:500;color:#1e40af}.chip-remove{width:18px;height:18px;border:none;background:#1e40af26;border-radius:50%;cursor:pointer;font-size:.875rem;line-height:1;color:#1e40af;display:flex;align-items:center;justify-content:center;flex-shrink:0}.chip-remove:hover{background:#1e40af4d}.chip-remove:focus-visible{outline:2px solid #1e40af;outline-offset:2px}@media(forced-colors:active){.picker-input:focus{outline:2px solid Highlight;outline-offset:1px}.picker-option--active{outline:2px solid Highlight;outline-offset:-2px}}\n"],
10937
11624
  dependencies: [
10938
11625
  {
10939
11626
  kind: "ngmodule",
@@ -10971,9 +11658,14 @@ var ContactPickerComponent = class ContactPickerComponent {
10971
11658
  "ariaLabel",
10972
11659
  "indeterminate",
10973
11660
  "checked",
11661
+ "required",
11662
+ "requiredMessage",
11663
+ "hint",
11664
+ "error",
11665
+ "showErrors",
10974
11666
  "disabled"
10975
11667
  ],
10976
- outputs: ["checkedChange"]
11668
+ outputs: ["checkedChange", "invalidChange"]
10977
11669
  }
10978
11670
  ],
10979
11671
  changeDetection: i0.ChangeDetectionStrategy.OnPush
@@ -11156,7 +11848,7 @@ i0.ɵɵngDeclareClassMetadata({
11156
11848
  }
11157
11849
  </div>
11158
11850
  `,
11159
- styles: [".picker-wrapper{position:relative;overflow:visible}.picker-label{display:block;font-size:.8125rem;font-weight:600;color:#374151;margin-bottom:6px}.picker-req{color:#ef4444}.picker-hint{margin:6px 0 0;font-size:.75rem;line-height:1.4;color:#64748b}.picker-input{width:100%;padding:9px 12px;border:1px solid #e2e8f0;border-radius:8px;font-size:.875rem;color:#1e293b;font-family:inherit;outline:none;box-sizing:border-box}.picker-input::placeholder{color:#94a3b8}.picker-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.picker-input:focus-visible{outline:2px solid transparent}@media(max-width:480px){.picker-input{font-size:1rem}}.picker-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.picker-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:9999;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 6px 16px #0000001a;max-height:240px;overflow-y:auto}@media(pointer:coarse),(max-width:480px){.picker-input{min-height:44px}.picker-dropdown{max-height:min(240px,40vh);overscroll-behavior:contain}.picker-option{min-height:44px;justify-content:center;box-sizing:border-box}.picker-option--check{min-height:44px}.chip-remove{position:relative}.chip-remove:after{content:\"\";position:absolute;inset:-13px}}.picker-option{display:flex;flex-direction:column;gap:2px;width:100%;padding:10px 12px;border:none;background:none;text-align:left;cursor:pointer;font-family:inherit}.picker-option:hover,.picker-option.picker-option--active{background:#f8fafc}.picker-option:first-child{border-radius:8px 8px 0 0}.picker-option:last-child{border-radius:0 0 8px 8px}.picker-option--check{flex-direction:row;align-items:center;gap:10px}.picker-option--check .option-body{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1}.picker-option--check .option-name,.picker-option--check .option-detail{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.option-check{display:flex;pointer-events:none}.option-name{font-size:.875rem;font-weight:600;color:#1e293b;overflow-wrap:anywhere}.option-detail{font-size:.75rem;color:#94a3b8;overflow-wrap:anywhere}.picker-loading,.picker-empty{padding:12px;font-size:.8125rem;color:#94a3b8;text-align:center}.selected-input{display:flex;align-items:center;justify-content:space-between;padding:9px 12px;border:1px solid #e2e8f0;border-radius:8px;background:#f8fafc;font-size:.875rem;font-weight:600;color:#1e293b;gap:8px;overflow-wrap:anywhere;min-width:0}.selected-input:focus{outline:none}.selected-input:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.clear-btn{width:18px;height:18px;border:none;background:#e2e8f0;border-radius:50%;cursor:pointer;font-size:.75rem;color:#64748b;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.clear-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.clear-btn:hover{background:#cbd5e1;color:#1e293b}.clear-btn:after{content:\"\";position:absolute;inset:-13px}.recipient-details{margin-top:16px}.details-label{display:block;font-size:.6875rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.05em;margin-bottom:8px}.details-card{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.detail-row{display:flex;justify-content:space-between;align-items:center;padding:10px 14px;border-bottom:1px solid #f1f5f9}.detail-row.last{border-bottom:none}.detail-row:nth-child(2n){background:#f8fafc}.detail-key{font-size:.8125rem;color:#94a3b8;font-weight:500}.detail-val{font-size:.875rem;color:#1e293b;font-weight:600}.multi-chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.multi-chip{display:inline-flex;align-items:center;gap:4px;padding:4px 8px 4px 10px;background:#dbeafe;border-radius:20px;font-size:.8125rem;font-weight:500;color:#1e40af}.chip-remove{width:18px;height:18px;border:none;background:#1e40af26;border-radius:50%;cursor:pointer;font-size:.875rem;line-height:1;color:#1e40af;display:flex;align-items:center;justify-content:center;flex-shrink:0}.chip-remove:hover{background:#1e40af4d}.chip-remove:focus-visible{outline:2px solid #1e40af;outline-offset:2px}@media(forced-colors:active){.picker-input:focus{outline:2px solid Highlight;outline-offset:1px}.picker-option--active{outline:2px solid Highlight;outline-offset:-2px}}\n"]
11851
+ styles: [".picker-wrapper{position:relative;overflow:visible}.picker-label{display:block;font-size:.8125rem;font-weight:600;color:#374151;margin-bottom:6px}.picker-req{color:#ef4444}.picker-hint{margin:6px 0 0;font-size:.75rem;line-height:1.4;color:#64748b}.picker-input{width:100%;padding:9px 12px;border:1px solid #e2e8f0;border-radius:8px;font-size:.875rem;color:#1e293b;font-family:inherit;outline:none;box-sizing:border-box}.picker-input::placeholder{color:#94a3b8}.picker-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.picker-input:focus-visible{outline:2px solid transparent}@media(max-width:480px){.picker-input{font-size:1rem}}.picker-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.picker-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:9999;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 6px 16px #0000001a;max-height:240px;overflow-y:auto}@media(pointer:coarse),(max-width:480px){.picker-input{min-height:44px}.picker-dropdown{max-height:min(240px,40vh);overscroll-behavior:contain}.picker-option{min-height:44px;justify-content:center;box-sizing:border-box}.picker-option--check{min-height:44px}.chip-remove{position:relative}.chip-remove:after{content:\"\";position:absolute;inset:-13px}}@media(max-width:480px){:host-context(.m-body) .picker-dropdown{position:static;margin-top:4px;max-height:min(240px,calc(var(--ui-vvh, 100dvh) * .3))}}.picker-option{display:flex;flex-direction:column;gap:2px;width:100%;padding:10px 12px;border:none;background:none;text-align:left;cursor:pointer;font-family:inherit}.picker-option:hover,.picker-option.picker-option--active{background:#f8fafc}.picker-option:first-child{border-radius:8px 8px 0 0}.picker-option:last-child{border-radius:0 0 8px 8px}.picker-option--check{flex-direction:row;align-items:center;gap:10px}.picker-option--check .option-body{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1}.picker-option--check .option-name,.picker-option--check .option-detail{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.option-check{display:flex;pointer-events:none}.option-name{font-size:.875rem;font-weight:600;color:#1e293b;overflow-wrap:anywhere}.option-detail{font-size:.75rem;color:#94a3b8;overflow-wrap:anywhere}.picker-loading,.picker-empty{padding:12px;font-size:.8125rem;color:#94a3b8;text-align:center}.selected-input{display:flex;align-items:center;justify-content:space-between;padding:9px 12px;border:1px solid #e2e8f0;border-radius:8px;background:#f8fafc;font-size:.875rem;font-weight:600;color:#1e293b;gap:8px;overflow-wrap:anywhere;min-width:0}.selected-input:focus{outline:none}.selected-input:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.clear-btn{width:18px;height:18px;border:none;background:#e2e8f0;border-radius:50%;cursor:pointer;font-size:.75rem;color:#64748b;display:flex;align-items:center;justify-content:center;position:relative;flex-shrink:0}.clear-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.clear-btn:hover{background:#cbd5e1;color:#1e293b}.clear-btn:after{content:\"\";position:absolute;inset:-13px}.recipient-details{margin-top:16px}.details-label{display:block;font-size:.6875rem;font-weight:600;color:#94a3b8;text-transform:uppercase;letter-spacing:.05em;margin-bottom:8px}.details-card{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.detail-row{display:flex;justify-content:space-between;align-items:center;padding:10px 14px;border-bottom:1px solid #f1f5f9}.detail-row.last{border-bottom:none}.detail-row:nth-child(2n){background:#f8fafc}.detail-key{font-size:.8125rem;color:#94a3b8;font-weight:500}.detail-val{font-size:.875rem;color:#1e293b;font-weight:600}.multi-chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.multi-chip{display:inline-flex;align-items:center;gap:4px;padding:4px 8px 4px 10px;background:#dbeafe;border-radius:20px;font-size:.8125rem;font-weight:500;color:#1e40af}.chip-remove{width:18px;height:18px;border:none;background:#1e40af26;border-radius:50%;cursor:pointer;font-size:.875rem;line-height:1;color:#1e40af;display:flex;align-items:center;justify-content:center;flex-shrink:0}.chip-remove:hover{background:#1e40af4d}.chip-remove:focus-visible{outline:2px solid #1e40af;outline-offset:2px}@media(forced-colors:active){.picker-input:focus{outline:2px solid Highlight;outline-offset:1px}.picker-option--active{outline:2px solid Highlight;outline-offset:-2px}}\n"]
11160
11852
  }]
11161
11853
  }],
11162
11854
  ctorParameters: () => [],
@@ -13151,6 +13843,11 @@ function getErrorMessage(error, fallbackContext, action) {
13151
13843
  if (typeof error === "string") return error;
13152
13844
  return `${failed} Please try again.`;
13153
13845
  }
13846
+ function serverMessage(err) {
13847
+ if (!(err instanceof HttpErrorResponse)) return "";
13848
+ const m = err.error?.message;
13849
+ return typeof m === "string" ? m.trim() : "";
13850
+ }
13154
13851
  var TextareaInputComponent = class TextareaInputComponent {
13155
13852
  constructor() {
13156
13853
  this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
@@ -13170,6 +13867,7 @@ var TextareaInputComponent = class TextareaInputComponent {
13170
13867
  this._cvaDisabled = signal(false, ...ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []);
13171
13868
  this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
13172
13869
  this._value = signal("", ...ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []);
13870
+ this._unlabelledHint = computed(() => !this.label() && !!this.hint(), ...ngDevMode ? [{ debugName: "_unlabelledHint" }] : /* istanbul ignore next */ []);
13173
13871
  this._reveal = createFieldReveal(this.showErrors);
13174
13872
  this._issue = computed(() => this._check(this._value()), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
13175
13873
  this.invalid = computed(() => !!this.error() || !!this._issue(), ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
@@ -13357,10 +14055,13 @@ var TextareaInputComponent = class TextareaInputComponent {
13357
14055
  [attr.required]="required() || null"
13358
14056
  [attr.aria-label]="ariaLabel() || null"
13359
14057
  [attr.aria-invalid]="_activeError() ? 'true' : null"
13360
- [attr.aria-describedby]="_activeError() ? _inputId + '-desc' : null"
14058
+ [attr.aria-describedby]="_activeError() ? _inputId + '-desc' : (_unlabelledHint() ? _inputId + '-hint' : null)"
13361
14059
  (input)="onInput($event)"
13362
14060
  (blur)="onBlur()"
13363
14061
  ></textarea>
14062
+ @if (!_activeError() && _unlabelledHint()) {
14063
+ <p class="ta-desc" [id]="_inputId + '-hint'">{{ hint() }}</p>
14064
+ }
13364
14065
  @if (_activeError()) {
13365
14066
  <p class="ta-desc ta-desc-error" [id]="_inputId + '-desc'" role="alert">{{ _activeError() }}</p>
13366
14067
  }
@@ -13420,10 +14121,13 @@ i0.ɵɵngDeclareClassMetadata({
13420
14121
  [attr.required]="required() || null"
13421
14122
  [attr.aria-label]="ariaLabel() || null"
13422
14123
  [attr.aria-invalid]="_activeError() ? 'true' : null"
13423
- [attr.aria-describedby]="_activeError() ? _inputId + '-desc' : null"
14124
+ [attr.aria-describedby]="_activeError() ? _inputId + '-desc' : (_unlabelledHint() ? _inputId + '-hint' : null)"
13424
14125
  (input)="onInput($event)"
13425
14126
  (blur)="onBlur()"
13426
14127
  ></textarea>
14128
+ @if (!_activeError() && _unlabelledHint()) {
14129
+ <p class="ta-desc" [id]="_inputId + '-hint'">{{ hint() }}</p>
14130
+ }
13427
14131
  @if (_activeError()) {
13428
14132
  <p class="ta-desc ta-desc-error" [id]="_inputId + '-desc'" role="alert">{{ _activeError() }}</p>
13429
14133
  }
@@ -14097,7 +14801,7 @@ var ChipComponent = class ChipComponent {
14097
14801
  </button>
14098
14802
  `,
14099
14803
  isInline: true,
14100
- styles: [":host{display:contents}.chip{display:inline-flex;align-items:center;gap:5px;border-radius:999px;border:1.5px solid #d1d5db;background:#f9fafb;color:#374151;font-weight:500;font-family:inherit;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;transition:background .15s,border-color .15s,color .15s}.chip:hover:not(:disabled){border-color:#3b82f6;color:#3b82f6;background:#eff6ff}.chip:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.chip:disabled{opacity:.5;cursor:default}.chip--sm{padding:2px 10px;font-size:.75rem}.chip--lg{padding:6px 16px;font-size:.875rem}.chip--sm.chip--dismissible{padding-right:6px}.chip--lg.chip--dismissible{padding-right:10px}@media(pointer:coarse){.chip{min-height:44px}.chip--sm{min-height:40px;padding:6px 14px}.chip--lg{padding-left:18px;padding-right:18px}.chip--sm.chip--dismissible{padding-right:8px}.chip--lg.chip--dismissible{padding-right:12px}.chip-dismiss{width:24px;height:24px}}.chip--active{background:#3b82f6;border-color:#3b82f6;color:#fff}.chip--active:hover:not(:disabled){background:#2563eb;border-color:#2563eb;color:#fff}.chip-dismiss{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;border-radius:50%;background:#0000001f;flex-shrink:0;transition:background .15s}.chip-dismiss:hover{background:#00000040}.chip--active .chip-dismiss{background:#ffffff4d}.chip--active .chip-dismiss:hover{background:#ffffff80}\n"],
14804
+ styles: [":host{display:contents}.chip{display:inline-flex;align-items:center;gap:5px;border-radius:999px;border:1.5px solid #d1d5db;background:#f9fafb;color:#374151;font-weight:500;font-family:inherit;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;transition:background .15s,border-color .15s,color .15s}.chip:hover:not(:disabled){border-color:#3b82f6;color:#3b82f6;background:#eff6ff}.chip:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.chip:disabled{opacity:.5;cursor:default}.chip--sm{padding:2px 10px;font-size:.75rem}.chip--lg{padding:6px 16px;font-size:.875rem}.chip--sm.chip--dismissible{padding-right:6px}.chip--lg.chip--dismissible{padding-right:10px}.chip--active{background:#3b82f6;border-color:#3b82f6;color:#fff}.chip--active:hover:not(:disabled){background:#2563eb;border-color:#2563eb;color:#fff}.chip-dismiss{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;border-radius:50%;background:#0000001f;flex-shrink:0;transition:background .15s}.chip-dismiss:hover{background:#00000040}.chip--active .chip-dismiss{background:#ffffff4d}.chip--active .chip-dismiss:hover{background:#ffffff80}@media(pointer:coarse){.chip{min-height:44px}.chip--sm{min-height:40px;padding:6px 14px}.chip--lg{padding-left:18px;padding-right:18px}.chip--sm.chip--dismissible{padding-right:8px}.chip--lg.chip--dismissible{padding-right:12px}.chip-dismiss{width:24px;height:24px;position:relative}.chip-dismiss:after{content:\"\";position:absolute;inset:-10px}}@media(max-width:480px)and (pointer:fine){.chip-dismiss{position:relative}.chip-dismiss:after{content:\"\";position:absolute;inset:-15px}}\n"],
14101
14805
  changeDetection: i0.ChangeDetectionStrategy.OnPush
14102
14806
  });
14103
14807
  }
@@ -14146,7 +14850,7 @@ i0.ɵɵngDeclareClassMetadata({
14146
14850
  }
14147
14851
  </button>
14148
14852
  `,
14149
- styles: [":host{display:contents}.chip{display:inline-flex;align-items:center;gap:5px;border-radius:999px;border:1.5px solid #d1d5db;background:#f9fafb;color:#374151;font-weight:500;font-family:inherit;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;transition:background .15s,border-color .15s,color .15s}.chip:hover:not(:disabled){border-color:#3b82f6;color:#3b82f6;background:#eff6ff}.chip:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.chip:disabled{opacity:.5;cursor:default}.chip--sm{padding:2px 10px;font-size:.75rem}.chip--lg{padding:6px 16px;font-size:.875rem}.chip--sm.chip--dismissible{padding-right:6px}.chip--lg.chip--dismissible{padding-right:10px}@media(pointer:coarse){.chip{min-height:44px}.chip--sm{min-height:40px;padding:6px 14px}.chip--lg{padding-left:18px;padding-right:18px}.chip--sm.chip--dismissible{padding-right:8px}.chip--lg.chip--dismissible{padding-right:12px}.chip-dismiss{width:24px;height:24px}}.chip--active{background:#3b82f6;border-color:#3b82f6;color:#fff}.chip--active:hover:not(:disabled){background:#2563eb;border-color:#2563eb;color:#fff}.chip-dismiss{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;border-radius:50%;background:#0000001f;flex-shrink:0;transition:background .15s}.chip-dismiss:hover{background:#00000040}.chip--active .chip-dismiss{background:#ffffff4d}.chip--active .chip-dismiss:hover{background:#ffffff80}\n"]
14853
+ styles: [":host{display:contents}.chip{display:inline-flex;align-items:center;gap:5px;border-radius:999px;border:1.5px solid #d1d5db;background:#f9fafb;color:#374151;font-weight:500;font-family:inherit;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;transition:background .15s,border-color .15s,color .15s}.chip:hover:not(:disabled){border-color:#3b82f6;color:#3b82f6;background:#eff6ff}.chip:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.chip:disabled{opacity:.5;cursor:default}.chip--sm{padding:2px 10px;font-size:.75rem}.chip--lg{padding:6px 16px;font-size:.875rem}.chip--sm.chip--dismissible{padding-right:6px}.chip--lg.chip--dismissible{padding-right:10px}.chip--active{background:#3b82f6;border-color:#3b82f6;color:#fff}.chip--active:hover:not(:disabled){background:#2563eb;border-color:#2563eb;color:#fff}.chip-dismiss{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;border-radius:50%;background:#0000001f;flex-shrink:0;transition:background .15s}.chip-dismiss:hover{background:#00000040}.chip--active .chip-dismiss{background:#ffffff4d}.chip--active .chip-dismiss:hover{background:#ffffff80}@media(pointer:coarse){.chip{min-height:44px}.chip--sm{min-height:40px;padding:6px 14px}.chip--lg{padding-left:18px;padding-right:18px}.chip--sm.chip--dismissible{padding-right:8px}.chip--lg.chip--dismissible{padding-right:12px}.chip-dismiss{width:24px;height:24px;position:relative}.chip-dismiss:after{content:\"\";position:absolute;inset:-10px}}@media(max-width:480px)and (pointer:fine){.chip-dismiss{position:relative}.chip-dismiss:after{content:\"\";position:absolute;inset:-15px}}\n"]
14150
14854
  }]
14151
14855
  }],
14152
14856
  propDecorators: {
@@ -14990,6 +15694,8 @@ var SendEmailComponent = class SendEmailComponent {
14990
15694
  this._suggestedSubject = "";
14991
15695
  this.previewHtml = messagePreviewHtml;
14992
15696
  this.docsRemovedNote = "";
15697
+ this.MAX_SUBJECT = 255;
15698
+ this.MAX_BODY = 1e4;
14993
15699
  effect(() => {
14994
15700
  this.contactName();
14995
15701
  this.contactEmail();
@@ -15058,7 +15764,17 @@ var SendEmailComponent = class SendEmailComponent {
15058
15764
  this.documentsInvalid = bad;
15059
15765
  this.notifyValid();
15060
15766
  }
15767
+ get bodyLengthError() {
15768
+ return this.resolvedBody.length > this.MAX_BODY ? `Message is too long (${this.resolvedBody.length.toLocaleString("en-US")} of ${this.MAX_BODY.toLocaleString("en-US")} characters).` : "";
15769
+ }
15770
+ get subjectLengthError() {
15771
+ return this.resolvedSubject.length > this.MAX_SUBJECT ? `Subject is too long (${this.resolvedSubject.length.toLocaleString("en-US")} of ${this.MAX_SUBJECT} characters).` : "";
15772
+ }
15773
+ get sendLengthError() {
15774
+ return this.subjectLengthError || (this.mode === "compose" ? "" : this.bodyLengthError);
15775
+ }
15061
15776
  get canSend() {
15777
+ if (this.bodyLengthError || this.subjectLengthError) return false;
15062
15778
  if (this.ccError || this.documents() && this.documentsInvalid) return false;
15063
15779
  const hasContent = !!this.subject.trim() && !!this.body.trim() && this.unresolvedVars.length === 0 && !hasLeftoverTags(this.resolvedSubject) && !hasLeftoverTags(this.resolvedBody);
15064
15780
  if (this.showSchedule) return hasContent && !!this.scheduledAt && new Date(this.scheduledAt).getTime() > Date.now();
@@ -15286,7 +16002,7 @@ var SendEmailComponent = class SendEmailComponent {
15286
16002
  this.cdr.markForCheck();
15287
16003
  },
15288
16004
  error: (err) => {
15289
- this.toast.error(custom || docs ? getErrorMessage(err, "email", "send") : "Failed to send email");
16005
+ this.toast.error(custom || docs ? getErrorMessage(err, "email", "send") : serverMessage(err) || "Failed to send email");
15290
16006
  this.loading = false;
15291
16007
  this.cdr.markForCheck();
15292
16008
  }
@@ -15477,6 +16193,7 @@ var SendEmailComponent = class SendEmailComponent {
15477
16193
  label="Subject"
15478
16194
  [required]="true"
15479
16195
  placeholder="Email subject..."
16196
+ [maxlength]="MAX_SUBJECT"
15480
16197
  [(ngModel)]="subject"
15481
16198
  (ngModelChange)="notifyValid()" />
15482
16199
  <ui-textarea-input
@@ -15485,7 +16202,7 @@ var SendEmailComponent = class SendEmailComponent {
15485
16202
  placeholder="Write your message..."
15486
16203
  [rows]="8"
15487
16204
  [(ngModel)]="body"
15488
- [error]="composeTagError"
16205
+ [error]="composeTagError || bodyLengthError"
15489
16206
  (ngModelChange)="notifyValid()" />
15490
16207
 
15491
16208
  @if (!hasDocuments && attachmentsAndScheduling()) {
@@ -15598,6 +16315,9 @@ var SendEmailComponent = class SendEmailComponent {
15598
16315
  </div>
15599
16316
  }
15600
16317
 
16318
+ <!-- Why Send is disabled for length, in every mode (compose shows the message error inline on the editor itself). -->
16319
+ <ui-error errorId="sm-length-error" [message]="sendLengthError" />
16320
+
15601
16321
  @if (showReceiptOption() === true) {
15602
16322
  <ui-checkbox
15603
16323
  class="sm-receipt-option"
@@ -15654,6 +16374,12 @@ var SendEmailComponent = class SendEmailComponent {
15654
16374
  selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",
15655
16375
  inputs: ["required"]
15656
16376
  },
16377
+ {
16378
+ kind: "directive",
16379
+ type: i1.MaxLengthValidator,
16380
+ selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]",
16381
+ inputs: ["maxlength"]
16382
+ },
15657
16383
  {
15658
16384
  kind: "directive",
15659
16385
  type: i1.NgModel,
@@ -15683,6 +16409,7 @@ var SendEmailComponent = class SendEmailComponent {
15683
16409
  "ariaLabel",
15684
16410
  "ariaExpanded",
15685
16411
  "ariaPressed",
16412
+ "ariaDescribedBy",
15686
16413
  "modal-footer-left",
15687
16414
  "modal-footer-right"
15688
16415
  ]
@@ -15696,9 +16423,14 @@ var SendEmailComponent = class SendEmailComponent {
15696
16423
  "ariaLabel",
15697
16424
  "indeterminate",
15698
16425
  "checked",
16426
+ "required",
16427
+ "requiredMessage",
16428
+ "hint",
16429
+ "error",
16430
+ "showErrors",
15699
16431
  "disabled"
15700
16432
  ],
15701
- outputs: ["checkedChange"]
16433
+ outputs: ["checkedChange", "invalidChange"]
15702
16434
  },
15703
16435
  {
15704
16436
  kind: "component",
@@ -15822,6 +16554,12 @@ var SendEmailComponent = class SendEmailComponent {
15822
16554
  "initialDocuments"
15823
16555
  ],
15824
16556
  outputs: ["valueChange", "invalidChange"]
16557
+ },
16558
+ {
16559
+ kind: "component",
16560
+ type: ErrorComponent,
16561
+ selector: "ui-error",
16562
+ inputs: ["message", "errorId"]
15825
16563
  }
15826
16564
  ],
15827
16565
  changeDetection: i0.ChangeDetectionStrategy.OnPush
@@ -15850,7 +16588,8 @@ i0.ɵɵngDeclareClassMetadata({
15850
16588
  TextareaInputComponent,
15851
16589
  DatetimeInputComponent,
15852
16590
  FormSectionComponent,
15853
- DocumentSendOptionsComponent
16591
+ DocumentSendOptionsComponent,
16592
+ ErrorComponent
15854
16593
  ],
15855
16594
  template: `
15856
16595
  <!-- Missing email guard -->
@@ -15900,6 +16639,7 @@ i0.ɵɵngDeclareClassMetadata({
15900
16639
  label="Subject"
15901
16640
  [required]="true"
15902
16641
  placeholder="Email subject..."
16642
+ [maxlength]="MAX_SUBJECT"
15903
16643
  [(ngModel)]="subject"
15904
16644
  (ngModelChange)="notifyValid()" />
15905
16645
  <ui-textarea-input
@@ -15908,7 +16648,7 @@ i0.ɵɵngDeclareClassMetadata({
15908
16648
  placeholder="Write your message..."
15909
16649
  [rows]="8"
15910
16650
  [(ngModel)]="body"
15911
- [error]="composeTagError"
16651
+ [error]="composeTagError || bodyLengthError"
15912
16652
  (ngModelChange)="notifyValid()" />
15913
16653
 
15914
16654
  @if (!hasDocuments && attachmentsAndScheduling()) {
@@ -16021,6 +16761,9 @@ i0.ɵɵngDeclareClassMetadata({
16021
16761
  </div>
16022
16762
  }
16023
16763
 
16764
+ <!-- Why Send is disabled for length, in every mode (compose shows the message error inline on the editor itself). -->
16765
+ <ui-error errorId="sm-length-error" [message]="sendLengthError" />
16766
+
16024
16767
  @if (showReceiptOption() === true) {
16025
16768
  <ui-checkbox
16026
16769
  class="sm-receipt-option"
@@ -16523,7 +17266,7 @@ var SendTextComponent = class SendTextComponent {
16523
17266
  this.cdr.detectChanges();
16524
17267
  },
16525
17268
  error: (err) => {
16526
- this.toast.error(custom || docs ? getErrorMessage(err, "text message", "send") : "Failed to send text message");
17269
+ this.toast.error(custom || docs ? getErrorMessage(err, "text message", "send") : serverMessage(err) || "Failed to send text message");
16527
17270
  this.loading = false;
16528
17271
  this.cdr.detectChanges();
16529
17272
  }
@@ -16886,6 +17629,7 @@ var SendTextComponent = class SendTextComponent {
16886
17629
  "ariaLabel",
16887
17630
  "ariaExpanded",
16888
17631
  "ariaPressed",
17632
+ "ariaDescribedBy",
16889
17633
  "modal-footer-left",
16890
17634
  "modal-footer-right"
16891
17635
  ]
@@ -16899,9 +17643,14 @@ var SendTextComponent = class SendTextComponent {
16899
17643
  "ariaLabel",
16900
17644
  "indeterminate",
16901
17645
  "checked",
17646
+ "required",
17647
+ "requiredMessage",
17648
+ "hint",
17649
+ "error",
17650
+ "showErrors",
16902
17651
  "disabled"
16903
17652
  ],
16904
- outputs: ["checkedChange"]
17653
+ outputs: ["checkedChange", "invalidChange"]
16905
17654
  },
16906
17655
  {
16907
17656
  kind: "component",
@@ -19420,11 +20169,13 @@ i0.ɵɵngDeclareClassMetadata({
19420
20169
  var TimeInputComponent = class TimeInputComponent {
19421
20170
  constructor() {
19422
20171
  this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
20172
+ this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
19423
20173
  this.required = input(false, ...ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []);
19424
20174
  this.min = input("", ...ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []);
19425
20175
  this.max = input("", ...ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []);
19426
20176
  this.hint = input("", ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
19427
20177
  this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
20178
+ this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
19428
20179
  this._disabledInput = input(false, {
19429
20180
  ...ngDevMode ? { debugName: "_disabledInput" } : /* istanbul ignore next */ {},
19430
20181
  alias: "disabled"
@@ -19433,8 +20184,28 @@ var TimeInputComponent = class TimeInputComponent {
19433
20184
  this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
19434
20185
  this._value = signal("", ...ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []);
19435
20186
  this._inputId = `tmi-${Math.random().toString(36).slice(2, 8)}`;
20187
+ this._reveal = createFieldReveal(this.showErrors);
20188
+ this._issue = computed(() => this._check(this._value()), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
20189
+ this.invalid = computed(() => !!this.error() || !!this._issue(), ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
20190
+ this.errorMessage = computed(() => this._issue()?.message ?? "", ...ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []);
20191
+ this.invalidChange = output();
20192
+ this._activeError = computed(() => this.error() || (this._reveal.revealed() ? this.errorMessage() : ""), ...ngDevMode ? [{ debugName: "_activeError" }] : /* istanbul ignore next */ []);
20193
+ this._onValidatorChange = () => {};
19436
20194
  this._onChange = (_) => {};
19437
20195
  this._onTouched = () => {};
20196
+ effect(() => {
20197
+ this.invalidChange.emit(this.invalid());
20198
+ });
20199
+ }
20200
+ ngOnChanges() {
20201
+ this._onValidatorChange();
20202
+ }
20203
+ validate(control) {
20204
+ const v = control.value;
20205
+ return issueToErrors(this._check(v == null ? "" : String(v)));
20206
+ }
20207
+ registerOnValidatorChange(fn) {
20208
+ this._onValidatorChange = fn;
19438
20209
  }
19439
20210
  writeValue(val) {
19440
20211
  this._value.set(val ?? "");
@@ -19455,6 +20226,40 @@ var TimeInputComponent = class TimeInputComponent {
19455
20226
  }
19456
20227
  onBlur() {
19457
20228
  this._onTouched();
20229
+ this._reveal.touched.set(true);
20230
+ }
20231
+ _check(value) {
20232
+ if (this.disabled()) return null;
20233
+ const text = value.trim();
20234
+ if (!text) return this.required() ? requiredIssue(this.label() || this.ariaLabel()) : null;
20235
+ const t = parseTime(text);
20236
+ if (t == null) return {
20237
+ key: "time",
20238
+ message: "Please enter a valid time."
20239
+ };
20240
+ let min = this.min() ? parseTime(this.min()) : null;
20241
+ let max = this.max() ? parseTime(this.max()) : null;
20242
+ if (min != null && max != null && max < min) {
20243
+ min = null;
20244
+ max = null;
20245
+ }
20246
+ if (min != null && t < min) return {
20247
+ key: "min",
20248
+ message: `Must be at or after ${formatTime(this.min())}`,
20249
+ value: {
20250
+ min: this.min(),
20251
+ actual: text
20252
+ }
20253
+ };
20254
+ if (max != null && t > max) return {
20255
+ key: "max",
20256
+ message: `Must be at or before ${formatTime(this.max())}`,
20257
+ value: {
20258
+ max: this.max(),
20259
+ actual: text
20260
+ }
20261
+ };
20262
+ return null;
19458
20263
  }
19459
20264
  static {
19460
20265
  this.ɵfac = i0.ɵɵngDeclareFactory({
@@ -19481,6 +20286,13 @@ var TimeInputComponent = class TimeInputComponent {
19481
20286
  isRequired: false,
19482
20287
  transformFunction: null
19483
20288
  },
20289
+ ariaLabel: {
20290
+ classPropertyName: "ariaLabel",
20291
+ publicName: "ariaLabel",
20292
+ isSignal: true,
20293
+ isRequired: false,
20294
+ transformFunction: null
20295
+ },
19484
20296
  required: {
19485
20297
  classPropertyName: "required",
19486
20298
  publicName: "required",
@@ -19516,6 +20328,13 @@ var TimeInputComponent = class TimeInputComponent {
19516
20328
  isRequired: false,
19517
20329
  transformFunction: null
19518
20330
  },
20331
+ showErrors: {
20332
+ classPropertyName: "showErrors",
20333
+ publicName: "showErrors",
20334
+ isSignal: true,
20335
+ isRequired: false,
20336
+ transformFunction: null
20337
+ },
19519
20338
  _disabledInput: {
19520
20339
  classPropertyName: "_disabledInput",
19521
20340
  publicName: "disabled",
@@ -19524,14 +20343,27 @@ var TimeInputComponent = class TimeInputComponent {
19524
20343
  transformFunction: null
19525
20344
  }
19526
20345
  },
19527
- providers: [{
19528
- provide: NG_VALUE_ACCESSOR,
19529
- useExisting: forwardRef(() => TimeInputComponent),
19530
- multi: true
19531
- }],
20346
+ outputs: { invalidChange: "invalidChange" },
20347
+ providers: [
20348
+ {
20349
+ provide: NG_VALUE_ACCESSOR,
20350
+ useExisting: forwardRef(() => TimeInputComponent),
20351
+ multi: true
20352
+ },
20353
+ {
20354
+ provide: NG_VALIDATORS,
20355
+ useExisting: forwardRef(() => TimeInputComponent),
20356
+ multi: true
20357
+ },
20358
+ {
20359
+ provide: UiFieldValidity,
20360
+ useExisting: forwardRef(() => TimeInputComponent)
20361
+ }
20362
+ ],
20363
+ usesOnChanges: true,
19532
20364
  ngImport: i0,
19533
20365
  template: `
19534
- <div class="tmi-field" [class.tmi-error]="error()" [class.tmi-disabled]="disabled()">
20366
+ <div class="tmi-field" [class.tmi-error]="_activeError()" [class.tmi-disabled]="disabled()">
19535
20367
  @if (label()) {
19536
20368
  <label class="tmi-label" [for]="_inputId">
19537
20369
  {{ label() }}
@@ -19547,13 +20379,15 @@ var TimeInputComponent = class TimeInputComponent {
19547
20379
  [attr.min]="min() || null"
19548
20380
  [attr.max]="max() || null"
19549
20381
  [attr.required]="required() || null"
19550
- [attr.aria-invalid]="error() ? 'true' : null"
19551
- [attr.aria-describedby]="(error() || hint()) ? _inputId + '-desc' : null"
20382
+ [attr.aria-label]="ariaLabel() || label() || null"
20383
+ [attr.aria-required]="required() ? 'true' : null"
20384
+ [attr.aria-invalid]="_activeError() ? 'true' : null"
20385
+ [attr.aria-describedby]="(_activeError() || hint()) ? _inputId + '-desc' : null"
19552
20386
  (change)="onChange($event)"
19553
20387
  (blur)="onBlur()"
19554
20388
  />
19555
- @if (error()) {
19556
- <p class="tmi-desc tmi-desc-error" [id]="_inputId + '-desc'" role="alert">{{ error() }}</p>
20389
+ @if (_activeError()) {
20390
+ <p class="tmi-desc tmi-desc-error" [id]="_inputId + '-desc'" role="alert">{{ _activeError() }}</p>
19557
20391
  } @else if (hint()) {
19558
20392
  <p class="tmi-desc" [id]="_inputId + '-desc'">{{ hint() }}</p>
19559
20393
  }
@@ -19576,13 +20410,24 @@ i0.ɵɵngDeclareClassMetadata({
19576
20410
  selector: "ui-time-input",
19577
20411
  standalone: true,
19578
20412
  changeDetection: ChangeDetectionStrategy.OnPush,
19579
- providers: [{
19580
- provide: NG_VALUE_ACCESSOR,
19581
- useExisting: forwardRef(() => TimeInputComponent),
19582
- multi: true
19583
- }],
20413
+ providers: [
20414
+ {
20415
+ provide: NG_VALUE_ACCESSOR,
20416
+ useExisting: forwardRef(() => TimeInputComponent),
20417
+ multi: true
20418
+ },
20419
+ {
20420
+ provide: NG_VALIDATORS,
20421
+ useExisting: forwardRef(() => TimeInputComponent),
20422
+ multi: true
20423
+ },
20424
+ {
20425
+ provide: UiFieldValidity,
20426
+ useExisting: forwardRef(() => TimeInputComponent)
20427
+ }
20428
+ ],
19584
20429
  template: `
19585
- <div class="tmi-field" [class.tmi-error]="error()" [class.tmi-disabled]="disabled()">
20430
+ <div class="tmi-field" [class.tmi-error]="_activeError()" [class.tmi-disabled]="disabled()">
19586
20431
  @if (label()) {
19587
20432
  <label class="tmi-label" [for]="_inputId">
19588
20433
  {{ label() }}
@@ -19598,13 +20443,15 @@ i0.ɵɵngDeclareClassMetadata({
19598
20443
  [attr.min]="min() || null"
19599
20444
  [attr.max]="max() || null"
19600
20445
  [attr.required]="required() || null"
19601
- [attr.aria-invalid]="error() ? 'true' : null"
19602
- [attr.aria-describedby]="(error() || hint()) ? _inputId + '-desc' : null"
20446
+ [attr.aria-label]="ariaLabel() || label() || null"
20447
+ [attr.aria-required]="required() ? 'true' : null"
20448
+ [attr.aria-invalid]="_activeError() ? 'true' : null"
20449
+ [attr.aria-describedby]="(_activeError() || hint()) ? _inputId + '-desc' : null"
19603
20450
  (change)="onChange($event)"
19604
20451
  (blur)="onBlur()"
19605
20452
  />
19606
- @if (error()) {
19607
- <p class="tmi-desc tmi-desc-error" [id]="_inputId + '-desc'" role="alert">{{ error() }}</p>
20453
+ @if (_activeError()) {
20454
+ <p class="tmi-desc tmi-desc-error" [id]="_inputId + '-desc'" role="alert">{{ _activeError() }}</p>
19608
20455
  } @else if (hint()) {
19609
20456
  <p class="tmi-desc" [id]="_inputId + '-desc'">{{ hint() }}</p>
19610
20457
  }
@@ -19613,6 +20460,7 @@ i0.ɵɵngDeclareClassMetadata({
19613
20460
  styles: [":host{display:block}.tmi-field{display:flex;flex-direction:column;gap:6px}.tmi-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.tmi-required{color:#ef4444;margin-left:2px}.tmi-input{width:100%;box-sizing:border-box;padding:8px 12px;font-size:.875rem;font-family:inherit;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px;outline:none;transition:border-color .15s,box-shadow .15s;appearance:none}.tmi-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.tmi-error .tmi-input{border-color:#ef4444}.tmi-error .tmi-input:focus{box-shadow:0 0 0 3px #ef44441f}.tmi-disabled .tmi-input{opacity:.5;cursor:not-allowed}.tmi-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.tmi-desc-error{color:#ef4444}@media(max-width:480px){.tmi-input{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.tmi-input{min-height:44px}}\n"]
19614
20461
  }]
19615
20462
  }],
20463
+ ctorParameters: () => [],
19616
20464
  propDecorators: {
19617
20465
  label: [{
19618
20466
  type: i0.Input,
@@ -19622,6 +20470,14 @@ i0.ɵɵngDeclareClassMetadata({
19622
20470
  required: false
19623
20471
  }]
19624
20472
  }],
20473
+ ariaLabel: [{
20474
+ type: i0.Input,
20475
+ args: [{
20476
+ isSignal: true,
20477
+ alias: "ariaLabel",
20478
+ required: false
20479
+ }]
20480
+ }],
19625
20481
  required: [{
19626
20482
  type: i0.Input,
19627
20483
  args: [{
@@ -19662,6 +20518,14 @@ i0.ɵɵngDeclareClassMetadata({
19662
20518
  required: false
19663
20519
  }]
19664
20520
  }],
20521
+ showErrors: [{
20522
+ type: i0.Input,
20523
+ args: [{
20524
+ isSignal: true,
20525
+ alias: "showErrors",
20526
+ required: false
20527
+ }]
20528
+ }],
19665
20529
  _disabledInput: [{
19666
20530
  type: i0.Input,
19667
20531
  args: [{
@@ -19669,6 +20533,10 @@ i0.ɵɵngDeclareClassMetadata({
19669
20533
  alias: "disabled",
19670
20534
  required: false
19671
20535
  }]
20536
+ }],
20537
+ invalidChange: [{
20538
+ type: i0.Output,
20539
+ args: ["invalidChange"]
19672
20540
  }]
19673
20541
  }
19674
20542
  });
@@ -19924,9 +20792,14 @@ var MultiSelectComponent = class MultiSelectComponent {
19924
20792
  "ariaLabel",
19925
20793
  "indeterminate",
19926
20794
  "checked",
20795
+ "required",
20796
+ "requiredMessage",
20797
+ "hint",
20798
+ "error",
20799
+ "showErrors",
19927
20800
  "disabled"
19928
20801
  ],
19929
- outputs: ["checkedChange"]
20802
+ outputs: ["checkedChange", "invalidChange"]
19930
20803
  }],
19931
20804
  changeDetection: i0.ChangeDetectionStrategy.OnPush
19932
20805
  });
@@ -20235,9 +21108,14 @@ var DiscountSelectorComponent = class DiscountSelectorComponent {
20235
21108
  "ariaLabel",
20236
21109
  "indeterminate",
20237
21110
  "checked",
21111
+ "required",
21112
+ "requiredMessage",
21113
+ "hint",
21114
+ "error",
21115
+ "showErrors",
20238
21116
  "disabled"
20239
21117
  ],
20240
- outputs: ["checkedChange"]
21118
+ outputs: ["checkedChange", "invalidChange"]
20241
21119
  }],
20242
21120
  changeDetection: i0.ChangeDetectionStrategy.OnPush
20243
21121
  });
@@ -21784,6 +22662,7 @@ var QrCodeComponent = class QrCodeComponent {
21784
22662
  "ariaLabel",
21785
22663
  "ariaExpanded",
21786
22664
  "ariaPressed",
22665
+ "ariaDescribedBy",
21787
22666
  "modal-footer-left",
21788
22667
  "modal-footer-right"
21789
22668
  ]
@@ -22051,6 +22930,7 @@ var PanelInfoListComponent = class PanelInfoListComponent {
22051
22930
  "ariaLabel",
22052
22931
  "ariaExpanded",
22053
22932
  "ariaPressed",
22933
+ "ariaDescribedBy",
22054
22934
  "modal-footer-left",
22055
22935
  "modal-footer-right"
22056
22936
  ]
@@ -23292,9 +24172,12 @@ var ImagePreviewComponent = class ImagePreviewComponent {
23292
24172
  this.size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
23293
24173
  this.placeholder = input("image", ...ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []);
23294
24174
  this.loading = input("lazy", ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
24175
+ this.positionX = input(50, ...ngDevMode ? [{ debugName: "positionX" }] : /* istanbul ignore next */ []);
24176
+ this.positionY = input(50, ...ngDevMode ? [{ debugName: "positionY" }] : /* istanbul ignore next */ []);
23295
24177
  this.retryKey = input(null, ...ngDevMode ? [{ debugName: "retryKey" }] : /* istanbul ignore next */ []);
23296
24178
  this._failed = signal(false, ...ngDevMode ? [{ debugName: "_failed" }] : /* istanbul ignore next */ []);
23297
24179
  this._url = computed(() => this.src()?.trim() || null, ...ngDevMode ? [{ debugName: "_url" }] : /* istanbul ignore next */ []);
24180
+ this._objectPosition = computed(() => `${this.positionX() ?? 50}% ${this.positionY() ?? 50}%`, ...ngDevMode ? [{ debugName: "_objectPosition" }] : /* istanbul ignore next */ []);
23298
24181
  this._cls = computed(() => `ip-${this.shape()}-${this.size()}`, ...ngDevMode ? [{ debugName: "_cls" }] : /* istanbul ignore next */ []);
23299
24182
  effect(() => {
23300
24183
  this.src();
@@ -23368,8 +24251,22 @@ var ImagePreviewComponent = class ImagePreviewComponent {
23368
24251
  isRequired: false,
23369
24252
  transformFunction: null
23370
24253
  },
23371
- retryKey: {
23372
- classPropertyName: "retryKey",
24254
+ positionX: {
24255
+ classPropertyName: "positionX",
24256
+ publicName: "positionX",
24257
+ isSignal: true,
24258
+ isRequired: false,
24259
+ transformFunction: null
24260
+ },
24261
+ positionY: {
24262
+ classPropertyName: "positionY",
24263
+ publicName: "positionY",
24264
+ isSignal: true,
24265
+ isRequired: false,
24266
+ transformFunction: null
24267
+ },
24268
+ retryKey: {
24269
+ classPropertyName: "retryKey",
23373
24270
  publicName: "retryKey",
23374
24271
  isSignal: true,
23375
24272
  isRequired: false,
@@ -23379,7 +24276,7 @@ var ImagePreviewComponent = class ImagePreviewComponent {
23379
24276
  ngImport: i0,
23380
24277
  template: `
23381
24278
  @if (_url() && !_failed()) {
23382
- <img class="ip-img" [class]="_cls()" [src]="_url()" [attr.alt]="alt()" [attr.loading]="loading()" decoding="async" (error)="_onError()" />
24279
+ <img class="ip-img" [class]="_cls()" [src]="_url()" [attr.alt]="alt()" [attr.loading]="loading()" [style.object-position]="_objectPosition()" decoding="async" (error)="_onError()" />
23383
24280
  } @else {
23384
24281
  <span class="ip-img ip-ph" [class]="_cls()" aria-hidden="true">
23385
24282
  @if (placeholder() === 'person') {
@@ -23409,7 +24306,7 @@ i0.ɵɵngDeclareClassMetadata({
23409
24306
  changeDetection: ChangeDetectionStrategy.OnPush,
23410
24307
  template: `
23411
24308
  @if (_url() && !_failed()) {
23412
- <img class="ip-img" [class]="_cls()" [src]="_url()" [attr.alt]="alt()" [attr.loading]="loading()" decoding="async" (error)="_onError()" />
24309
+ <img class="ip-img" [class]="_cls()" [src]="_url()" [attr.alt]="alt()" [attr.loading]="loading()" [style.object-position]="_objectPosition()" decoding="async" (error)="_onError()" />
23413
24310
  } @else {
23414
24311
  <span class="ip-img ip-ph" [class]="_cls()" aria-hidden="true">
23415
24312
  @if (placeholder() === 'person') {
@@ -23473,6 +24370,22 @@ i0.ɵɵngDeclareClassMetadata({
23473
24370
  required: false
23474
24371
  }]
23475
24372
  }],
24373
+ positionX: [{
24374
+ type: i0.Input,
24375
+ args: [{
24376
+ isSignal: true,
24377
+ alias: "positionX",
24378
+ required: false
24379
+ }]
24380
+ }],
24381
+ positionY: [{
24382
+ type: i0.Input,
24383
+ args: [{
24384
+ isSignal: true,
24385
+ alias: "positionY",
24386
+ required: false
24387
+ }]
24388
+ }],
23476
24389
  retryKey: [{
23477
24390
  type: i0.Input,
23478
24391
  args: [{
@@ -23918,6 +24831,7 @@ var DateRangePickerComponent = class DateRangePickerComponent {
23918
24831
  "ariaLabel",
23919
24832
  "ariaExpanded",
23920
24833
  "ariaPressed",
24834
+ "ariaDescribedBy",
23921
24835
  "modal-footer-left",
23922
24836
  "modal-footer-right"
23923
24837
  ]
@@ -25099,7 +26013,7 @@ var RichTextEditorComponent = class RichTextEditorComponent {
25099
26013
  </div>
25100
26014
  `,
25101
26015
  isInline: true,
25102
- styles: [":host{display:block}.rte-field{display:flex;flex-direction:column;gap:6px}.rte-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.rte-required{color:#ef4444;margin-left:2px}.rte-hint-inline{font-size:.75rem;color:#94a3b8;font-weight:400;margin-left:4px}.rte-box{border:1px solid #e2e8f0;border-radius:8px;background:#fff;transition:border-color .15s,box-shadow .15s}.rte-box:focus-within{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.rte-error .rte-box{border-color:#ef4444}.rte-error .rte-box:focus-within{box-shadow:0 0 0 3px #ef44441f}.rte-disabled .rte-box{opacity:.5;cursor:not-allowed}.rte-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:2px;padding:6px 8px;background:#f8fafc;border-bottom:1px solid #e2e8f0;border-radius:8px 8px 0 0}.rte-divider{width:1px;height:20px;background:#cbd5e1;margin:0 4px}.rte-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:4px;background:none;color:#64748b;cursor:pointer;transition:background .15s,color .15s}.rte-btn svg{width:16px;height:16px}.rte-btn:hover:not(:disabled){background:#e2e8f0;color:#1e293b}.rte-btn:focus-visible,.rte-btn:focus-within{outline:2px solid #3b82f6;outline-offset:1px}.rte-btn.active{background:#dbeafe;color:#2563eb}.rte-btn:disabled,.rte-btn-disabled{cursor:not-allowed;opacity:.5}.rte-menu-wrap{position:relative;display:inline-flex}.rte-menu-btn{width:auto;padding:0 6px;gap:3px}.rte-menu-btn .rte-chevron{width:10px;height:10px;color:#94a3b8;flex-shrink:0}.rte-dropdown{position:absolute;top:calc(100% + 4px);left:0;z-index:100;background:#fff;border:1px solid #e2e8f0;border-radius:6px;box-shadow:0 4px 12px #0000001f;padding:4px;overflow-y:auto;max-height:260px}.rte-font-panel{min-width:180px}.rte-item{display:block;width:100%;text-align:left;padding:5px 10px;font-size:12px;color:#374151;border:none;background:none;border-radius:4px;cursor:pointer;white-space:nowrap}.rte-item:hover{background:#f1f5f9}.rte-item.selected{background:#dbeafe;color:#2563eb;font-weight:600}.rte-group-label{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#94a3b8;padding:6px 10px 2px}.di-h1{font-size:18px;font-weight:700}.di-h2{font-size:15px;font-weight:600}.di-h3{font-size:13px;font-weight:600}.rte-color{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}.rte-editor{padding:12px;outline:none;overflow-y:auto;box-sizing:border-box;font-size:.875rem;line-height:1.6;color:#1e293b;background:#fff;border-radius:0 0 8px 8px;word-break:break-word}.rte-editor[data-empty=true]:before{content:attr(data-placeholder);color:#94a3b8;pointer-events:none;float:left;height:0}.rte-editor ul,.rte-editor ol{padding-left:1.5em;margin:.25em 0}.rte-editor li{margin:.15em 0}.rte-editor h1{font-size:1.75em;font-weight:700;margin:.5em 0 .25em}.rte-editor h2{font-size:1.4em;font-weight:600;margin:.5em 0 .25em}.rte-editor h3{font-size:1.15em;font-weight:600;margin:.5em 0 .25em}.rte-editor a{color:#2563eb;text-decoration:underline}.rte-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.rte-desc-error{color:#ef4444}@media(max-width:480px){.rte-editor{font-size:1rem}}\n"],
26016
+ styles: [":host{display:block}.rte-field{display:flex;flex-direction:column;gap:6px}.rte-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.rte-required{color:#ef4444;margin-left:2px}.rte-hint-inline{font-size:.75rem;color:#94a3b8;font-weight:400;margin-left:4px}.rte-box{border:1px solid #e2e8f0;border-radius:8px;background:#fff;transition:border-color .15s,box-shadow .15s}.rte-box:focus-within{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.rte-error .rte-box{border-color:#ef4444}.rte-error .rte-box:focus-within{box-shadow:0 0 0 3px #ef44441f}.rte-disabled .rte-box{opacity:.5;cursor:not-allowed}.rte-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:2px;padding:6px 8px;background:#f8fafc;border-bottom:1px solid #e2e8f0;border-radius:8px 8px 0 0}.rte-divider{width:1px;height:20px;background:#cbd5e1;margin:0 4px}.rte-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:4px;background:none;color:#64748b;cursor:pointer;transition:background .15s,color .15s}.rte-btn svg{width:16px;height:16px}.rte-btn:hover:not(:disabled){background:#e2e8f0;color:#1e293b}.rte-btn:focus-visible,.rte-btn:focus-within{outline:2px solid #3b82f6;outline-offset:1px}.rte-btn.active{background:#dbeafe;color:#2563eb}.rte-btn:disabled,.rte-btn-disabled{cursor:not-allowed;opacity:.5}.rte-menu-wrap{position:relative;display:inline-flex}.rte-menu-btn{width:auto;padding:0 6px;gap:3px}.rte-menu-btn .rte-chevron{width:10px;height:10px;color:#94a3b8;flex-shrink:0}.rte-dropdown{position:absolute;top:calc(100% + 4px);left:0;z-index:100;background:#fff;border:1px solid #e2e8f0;border-radius:6px;box-shadow:0 4px 12px #0000001f;padding:4px;overflow-y:auto;max-height:260px}.rte-font-panel{min-width:180px}.rte-item{display:block;width:100%;text-align:left;padding:5px 10px;font-size:12px;color:#374151;border:none;background:none;border-radius:4px;cursor:pointer;white-space:nowrap}.rte-item:hover{background:#f1f5f9}.rte-item.selected{background:#dbeafe;color:#2563eb;font-weight:600}.rte-group-label{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#94a3b8;padding:6px 10px 2px}.di-h1{font-size:18px;font-weight:700}.di-h2{font-size:15px;font-weight:600}.di-h3{font-size:13px;font-weight:600}.rte-color{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}.rte-editor{padding:12px;outline:none;overflow-y:auto;box-sizing:border-box;font-size:.875rem;line-height:1.6;color:#1e293b;background:#fff;border-radius:0 0 8px 8px;word-break:break-word}.rte-editor[data-empty=true]:before{content:attr(data-placeholder);color:#94a3b8;pointer-events:none;float:left;height:0}.rte-editor ul,.rte-editor ol{padding-left:1.5em;margin:.25em 0}.rte-editor li{margin:.15em 0}.rte-editor h1{font-size:1.75em;font-weight:700;margin:.5em 0 .25em}.rte-editor h2{font-size:1.4em;font-weight:600;margin:.5em 0 .25em}.rte-editor h3{font-size:1.15em;font-weight:600;margin:.5em 0 .25em}.rte-editor a{color:#2563eb;text-decoration:underline}.rte-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.rte-desc-error{color:#ef4444}@media(max-width:480px){.rte-editor{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.rte-btn{width:44px;height:44px}.rte-menu-btn{width:auto;min-width:44px}.rte-divider{height:28px}}\n"],
25103
26017
  changeDetection: i0.ChangeDetectionStrategy.OnPush
25104
26018
  });
25105
26019
  }
@@ -25336,7 +26250,7 @@ i0.ɵɵngDeclareClassMetadata({
25336
26250
  }
25337
26251
  </div>
25338
26252
  `,
25339
- styles: [":host{display:block}.rte-field{display:flex;flex-direction:column;gap:6px}.rte-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.rte-required{color:#ef4444;margin-left:2px}.rte-hint-inline{font-size:.75rem;color:#94a3b8;font-weight:400;margin-left:4px}.rte-box{border:1px solid #e2e8f0;border-radius:8px;background:#fff;transition:border-color .15s,box-shadow .15s}.rte-box:focus-within{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.rte-error .rte-box{border-color:#ef4444}.rte-error .rte-box:focus-within{box-shadow:0 0 0 3px #ef44441f}.rte-disabled .rte-box{opacity:.5;cursor:not-allowed}.rte-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:2px;padding:6px 8px;background:#f8fafc;border-bottom:1px solid #e2e8f0;border-radius:8px 8px 0 0}.rte-divider{width:1px;height:20px;background:#cbd5e1;margin:0 4px}.rte-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:4px;background:none;color:#64748b;cursor:pointer;transition:background .15s,color .15s}.rte-btn svg{width:16px;height:16px}.rte-btn:hover:not(:disabled){background:#e2e8f0;color:#1e293b}.rte-btn:focus-visible,.rte-btn:focus-within{outline:2px solid #3b82f6;outline-offset:1px}.rte-btn.active{background:#dbeafe;color:#2563eb}.rte-btn:disabled,.rte-btn-disabled{cursor:not-allowed;opacity:.5}.rte-menu-wrap{position:relative;display:inline-flex}.rte-menu-btn{width:auto;padding:0 6px;gap:3px}.rte-menu-btn .rte-chevron{width:10px;height:10px;color:#94a3b8;flex-shrink:0}.rte-dropdown{position:absolute;top:calc(100% + 4px);left:0;z-index:100;background:#fff;border:1px solid #e2e8f0;border-radius:6px;box-shadow:0 4px 12px #0000001f;padding:4px;overflow-y:auto;max-height:260px}.rte-font-panel{min-width:180px}.rte-item{display:block;width:100%;text-align:left;padding:5px 10px;font-size:12px;color:#374151;border:none;background:none;border-radius:4px;cursor:pointer;white-space:nowrap}.rte-item:hover{background:#f1f5f9}.rte-item.selected{background:#dbeafe;color:#2563eb;font-weight:600}.rte-group-label{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#94a3b8;padding:6px 10px 2px}.di-h1{font-size:18px;font-weight:700}.di-h2{font-size:15px;font-weight:600}.di-h3{font-size:13px;font-weight:600}.rte-color{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}.rte-editor{padding:12px;outline:none;overflow-y:auto;box-sizing:border-box;font-size:.875rem;line-height:1.6;color:#1e293b;background:#fff;border-radius:0 0 8px 8px;word-break:break-word}.rte-editor[data-empty=true]:before{content:attr(data-placeholder);color:#94a3b8;pointer-events:none;float:left;height:0}.rte-editor ul,.rte-editor ol{padding-left:1.5em;margin:.25em 0}.rte-editor li{margin:.15em 0}.rte-editor h1{font-size:1.75em;font-weight:700;margin:.5em 0 .25em}.rte-editor h2{font-size:1.4em;font-weight:600;margin:.5em 0 .25em}.rte-editor h3{font-size:1.15em;font-weight:600;margin:.5em 0 .25em}.rte-editor a{color:#2563eb;text-decoration:underline}.rte-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.rte-desc-error{color:#ef4444}@media(max-width:480px){.rte-editor{font-size:1rem}}\n"]
26253
+ styles: [":host{display:block}.rte-field{display:flex;flex-direction:column;gap:6px}.rte-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.rte-required{color:#ef4444;margin-left:2px}.rte-hint-inline{font-size:.75rem;color:#94a3b8;font-weight:400;margin-left:4px}.rte-box{border:1px solid #e2e8f0;border-radius:8px;background:#fff;transition:border-color .15s,box-shadow .15s}.rte-box:focus-within{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.rte-error .rte-box{border-color:#ef4444}.rte-error .rte-box:focus-within{box-shadow:0 0 0 3px #ef44441f}.rte-disabled .rte-box{opacity:.5;cursor:not-allowed}.rte-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:2px;padding:6px 8px;background:#f8fafc;border-bottom:1px solid #e2e8f0;border-radius:8px 8px 0 0}.rte-divider{width:1px;height:20px;background:#cbd5e1;margin:0 4px}.rte-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:none;border-radius:4px;background:none;color:#64748b;cursor:pointer;transition:background .15s,color .15s}.rte-btn svg{width:16px;height:16px}.rte-btn:hover:not(:disabled){background:#e2e8f0;color:#1e293b}.rte-btn:focus-visible,.rte-btn:focus-within{outline:2px solid #3b82f6;outline-offset:1px}.rte-btn.active{background:#dbeafe;color:#2563eb}.rte-btn:disabled,.rte-btn-disabled{cursor:not-allowed;opacity:.5}.rte-menu-wrap{position:relative;display:inline-flex}.rte-menu-btn{width:auto;padding:0 6px;gap:3px}.rte-menu-btn .rte-chevron{width:10px;height:10px;color:#94a3b8;flex-shrink:0}.rte-dropdown{position:absolute;top:calc(100% + 4px);left:0;z-index:100;background:#fff;border:1px solid #e2e8f0;border-radius:6px;box-shadow:0 4px 12px #0000001f;padding:4px;overflow-y:auto;max-height:260px}.rte-font-panel{min-width:180px}.rte-item{display:block;width:100%;text-align:left;padding:5px 10px;font-size:12px;color:#374151;border:none;background:none;border-radius:4px;cursor:pointer;white-space:nowrap}.rte-item:hover{background:#f1f5f9}.rte-item.selected{background:#dbeafe;color:#2563eb;font-weight:600}.rte-group-label{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#94a3b8;padding:6px 10px 2px}.di-h1{font-size:18px;font-weight:700}.di-h2{font-size:15px;font-weight:600}.di-h3{font-size:13px;font-weight:600}.rte-color{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}.rte-editor{padding:12px;outline:none;overflow-y:auto;box-sizing:border-box;font-size:.875rem;line-height:1.6;color:#1e293b;background:#fff;border-radius:0 0 8px 8px;word-break:break-word}.rte-editor[data-empty=true]:before{content:attr(data-placeholder);color:#94a3b8;pointer-events:none;float:left;height:0}.rte-editor ul,.rte-editor ol{padding-left:1.5em;margin:.25em 0}.rte-editor li{margin:.15em 0}.rte-editor h1{font-size:1.75em;font-weight:700;margin:.5em 0 .25em}.rte-editor h2{font-size:1.4em;font-weight:600;margin:.5em 0 .25em}.rte-editor h3{font-size:1.15em;font-weight:600;margin:.5em 0 .25em}.rte-editor a{color:#2563eb;text-decoration:underline}.rte-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.rte-desc-error{color:#ef4444}@media(max-width:480px){.rte-editor{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.rte-btn{width:44px;height:44px}.rte-menu-btn{width:auto;min-width:44px}.rte-divider{height:28px}}\n"]
25340
26254
  }]
25341
26255
  }],
25342
26256
  ctorParameters: () => [],
@@ -25435,6 +26349,1542 @@ i0.ɵɵngDeclareClassMetadata({
25435
26349
  }]
25436
26350
  }
25437
26351
  });
25438
- export { AlertComponent, AppShellComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BulkMessagePanelComponent, ButtonComponent, CheckboxComponent, ChipComponent, ChipGroupComponent, ColumnFilterComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, DEFAULT_DOCUMENT_SUBJECT, DOCUMENT_PURPOSE_OPTIONS, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DiscountSelectorComponent, DocumentSendOptionsComponent, DropdownComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FileInputComponent, FormRowComponent, FormSectionComponent, HintComponent, ImagePreviewComponent, ImportExportComponent, KpiCardComponent, ListItemComponent, MAX_CC, ModalComponent, MoreMenuComponent, MultiSelectComponent, PaginationComponent, PanelInfoListComponent, PillTabsComponent, ProgressBarComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SearchInputComponent, SelectComponent, SendMessagePanelComponent, SidePanelComponent, SkeletonComponent, TableToolbarComponent, TemplatePickerComponent, TextInputComponent, TextareaInputComponent, TimeInputComponent, ToastComponent, ToastService, ToggleBadgeComponent, US_STATES, UiFieldValidity, VideoPickerComponent, appShellGroupsStorageKey, autoVariant, builtInActionIcon, createFieldReveal, errorContextInterceptor, formatIsoDate, formatIsoDateTime, getEligibleIds, getEligibleOptions, getErrorMessage, humanReadableMessage, isoKey, issueToErrors, maxLengthIssue, messagePreviewHtml, parseCcList, parseIso, pluralize, requiredIssue, resolvePreset, suggestDocumentSubject };
26352
+ var RadioComponent = class RadioComponent {
26353
+ constructor() {
26354
+ this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
26355
+ this.description = input("", ...ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []);
26356
+ this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
26357
+ this.value = input("", ...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
26358
+ this.name = input("", ...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
26359
+ this.checked = input(false, ...ngDevMode ? [{ debugName: "checked" }] : /* istanbul ignore next */ []);
26360
+ this.invalid = input(false, ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
26361
+ this.describedBy = input("", ...ngDevMode ? [{ debugName: "describedBy" }] : /* istanbul ignore next */ []);
26362
+ this._disabledInput = input(false, {
26363
+ ...ngDevMode ? { debugName: "_disabledInput" } : /* istanbul ignore next */ {},
26364
+ alias: "disabled"
26365
+ });
26366
+ this.disabled = this._disabledInput;
26367
+ this._labelId = `rd-${Math.random().toString(36).slice(2, 8)}-label`;
26368
+ this._labelledBy = computed(() => this.label() && this.description() && !this.ariaLabel() ? this._labelId : null, ...ngDevMode ? [{ debugName: "_labelledBy" }] : /* istanbul ignore next */ []);
26369
+ this._descriptionId = `rd-${Math.random().toString(36).slice(2, 8)}-desc`;
26370
+ this._describedByIds = computed(() => {
26371
+ return [this.describedBy(), this.description() ? this._descriptionId : ""].filter(Boolean).join(" ") || null;
26372
+ }, ...ngDevMode ? [{ debugName: "_describedByIds" }] : /* istanbul ignore next */ []);
26373
+ this.selected = output();
26374
+ }
26375
+ onChange(event) {
26376
+ if (event.target.checked) this.selected.emit(this.value());
26377
+ }
26378
+ static {
26379
+ this.ɵfac = i0.ɵɵngDeclareFactory({
26380
+ minVersion: "12.0.0",
26381
+ version: "22.2.2",
26382
+ ngImport: i0,
26383
+ type: RadioComponent,
26384
+ deps: [],
26385
+ target: i0.ɵɵFactoryTarget.Component
26386
+ });
26387
+ }
26388
+ static {
26389
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
26390
+ minVersion: "17.0.0",
26391
+ version: "22.2.2",
26392
+ type: RadioComponent,
26393
+ isStandalone: true,
26394
+ selector: "ui-radio",
26395
+ inputs: {
26396
+ label: {
26397
+ classPropertyName: "label",
26398
+ publicName: "label",
26399
+ isSignal: true,
26400
+ isRequired: false,
26401
+ transformFunction: null
26402
+ },
26403
+ description: {
26404
+ classPropertyName: "description",
26405
+ publicName: "description",
26406
+ isSignal: true,
26407
+ isRequired: false,
26408
+ transformFunction: null
26409
+ },
26410
+ ariaLabel: {
26411
+ classPropertyName: "ariaLabel",
26412
+ publicName: "ariaLabel",
26413
+ isSignal: true,
26414
+ isRequired: false,
26415
+ transformFunction: null
26416
+ },
26417
+ value: {
26418
+ classPropertyName: "value",
26419
+ publicName: "value",
26420
+ isSignal: true,
26421
+ isRequired: false,
26422
+ transformFunction: null
26423
+ },
26424
+ name: {
26425
+ classPropertyName: "name",
26426
+ publicName: "name",
26427
+ isSignal: true,
26428
+ isRequired: false,
26429
+ transformFunction: null
26430
+ },
26431
+ checked: {
26432
+ classPropertyName: "checked",
26433
+ publicName: "checked",
26434
+ isSignal: true,
26435
+ isRequired: false,
26436
+ transformFunction: null
26437
+ },
26438
+ invalid: {
26439
+ classPropertyName: "invalid",
26440
+ publicName: "invalid",
26441
+ isSignal: true,
26442
+ isRequired: false,
26443
+ transformFunction: null
26444
+ },
26445
+ describedBy: {
26446
+ classPropertyName: "describedBy",
26447
+ publicName: "describedBy",
26448
+ isSignal: true,
26449
+ isRequired: false,
26450
+ transformFunction: null
26451
+ },
26452
+ _disabledInput: {
26453
+ classPropertyName: "_disabledInput",
26454
+ publicName: "disabled",
26455
+ isSignal: true,
26456
+ isRequired: false,
26457
+ transformFunction: null
26458
+ }
26459
+ },
26460
+ outputs: { selected: "selected" },
26461
+ ngImport: i0,
26462
+ template: `
26463
+ <label class="rd-wrap" [class.rd-disabled]="disabled()">
26464
+ <span class="rd-dot" [class.rd-checked]="checked()" [class.rd-invalid]="invalid()" [class.rd-disabled]="disabled()">
26465
+ @if (checked()) { <span class="rd-core"></span> }
26466
+ </span>
26467
+ <input
26468
+ type="radio"
26469
+ class="rd-hidden"
26470
+ [name]="name()"
26471
+ [value]="value()"
26472
+ [checked]="checked()"
26473
+ [disabled]="disabled()"
26474
+ [attr.aria-label]="ariaLabel() || null"
26475
+ [attr.aria-labelledby]="_labelledBy()"
26476
+ [attr.aria-invalid]="invalid() ? 'true' : null"
26477
+ [attr.aria-describedby]="_describedByIds()"
26478
+ (change)="onChange($event)"
26479
+ />
26480
+ <span class="rd-text">
26481
+ @if (label()) { <span class="rd-label" [id]="_labelId">{{ label() }}</span> }
26482
+ @if (description()) { <span class="rd-description" [id]="_descriptionId">{{ description() }}</span> }
26483
+ <ng-content />
26484
+ </span>
26485
+ </label>
26486
+ `,
26487
+ isInline: true,
26488
+ styles: [":host{display:block}.rd-wrap{display:inline-flex;align-items:flex-start;gap:9px;cursor:pointer;-webkit-user-select:none;user-select:none}.rd-wrap.rd-disabled{cursor:not-allowed;opacity:.5}.rd-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rd-wrap:has(.rd-hidden:focus-visible) .rd-dot{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.rd-wrap{position:relative}.rd-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:-2px;opacity:0;cursor:pointer;z-index:1}.rd-wrap.rd-disabled .rd-hidden{cursor:not-allowed}}.rd-dot{flex-shrink:0;width:20px;height:20px;box-sizing:border-box;border:2px solid #cbd5e1;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.rd-dot.rd-checked{background:#3b82f6;border-color:#3b82f6}.rd-dot.rd-invalid:not(.rd-checked){border-color:#ef4444}.rd-wrap:hover .rd-dot:not(.rd-checked):not(.rd-disabled){border-color:#3b82f6}.rd-core{width:8px;height:8px;border-radius:50%;background:#fff}@media(max-width:640px),(pointer:coarse){.rd-dot{position:relative}.rd-dot:after{content:\"\";position:absolute;inset:-12px}}.rd-text{display:flex;flex-direction:column;gap:2px}.rd-label{font-size:.875rem;color:#334155;line-height:1.4}.rd-description{font-size:.75rem;color:#64748b;line-height:1.4}\n"],
26489
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
26490
+ });
26491
+ }
26492
+ };
26493
+ i0.ɵɵngDeclareClassMetadata({
26494
+ minVersion: "12.0.0",
26495
+ version: "22.2.2",
26496
+ ngImport: i0,
26497
+ type: RadioComponent,
26498
+ decorators: [{
26499
+ type: Component,
26500
+ args: [{
26501
+ selector: "ui-radio",
26502
+ standalone: true,
26503
+ changeDetection: ChangeDetectionStrategy.OnPush,
26504
+ template: `
26505
+ <label class="rd-wrap" [class.rd-disabled]="disabled()">
26506
+ <span class="rd-dot" [class.rd-checked]="checked()" [class.rd-invalid]="invalid()" [class.rd-disabled]="disabled()">
26507
+ @if (checked()) { <span class="rd-core"></span> }
26508
+ </span>
26509
+ <input
26510
+ type="radio"
26511
+ class="rd-hidden"
26512
+ [name]="name()"
26513
+ [value]="value()"
26514
+ [checked]="checked()"
26515
+ [disabled]="disabled()"
26516
+ [attr.aria-label]="ariaLabel() || null"
26517
+ [attr.aria-labelledby]="_labelledBy()"
26518
+ [attr.aria-invalid]="invalid() ? 'true' : null"
26519
+ [attr.aria-describedby]="_describedByIds()"
26520
+ (change)="onChange($event)"
26521
+ />
26522
+ <span class="rd-text">
26523
+ @if (label()) { <span class="rd-label" [id]="_labelId">{{ label() }}</span> }
26524
+ @if (description()) { <span class="rd-description" [id]="_descriptionId">{{ description() }}</span> }
26525
+ <ng-content />
26526
+ </span>
26527
+ </label>
26528
+ `,
26529
+ styles: [":host{display:block}.rd-wrap{display:inline-flex;align-items:flex-start;gap:9px;cursor:pointer;-webkit-user-select:none;user-select:none}.rd-wrap.rd-disabled{cursor:not-allowed;opacity:.5}.rd-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rd-wrap:has(.rd-hidden:focus-visible) .rd-dot{outline:2px solid #3b82f6;outline-offset:2px}@media(pointer:coarse),(max-width:480px){.rd-wrap{position:relative}.rd-hidden{width:44px;height:44px;margin:0;clip:auto;overflow:visible;left:-12px;top:-2px;opacity:0;cursor:pointer;z-index:1}.rd-wrap.rd-disabled .rd-hidden{cursor:not-allowed}}.rd-dot{flex-shrink:0;width:20px;height:20px;box-sizing:border-box;border:2px solid #cbd5e1;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s}.rd-dot.rd-checked{background:#3b82f6;border-color:#3b82f6}.rd-dot.rd-invalid:not(.rd-checked){border-color:#ef4444}.rd-wrap:hover .rd-dot:not(.rd-checked):not(.rd-disabled){border-color:#3b82f6}.rd-core{width:8px;height:8px;border-radius:50%;background:#fff}@media(max-width:640px),(pointer:coarse){.rd-dot{position:relative}.rd-dot:after{content:\"\";position:absolute;inset:-12px}}.rd-text{display:flex;flex-direction:column;gap:2px}.rd-label{font-size:.875rem;color:#334155;line-height:1.4}.rd-description{font-size:.75rem;color:#64748b;line-height:1.4}\n"]
26530
+ }]
26531
+ }],
26532
+ propDecorators: {
26533
+ label: [{
26534
+ type: i0.Input,
26535
+ args: [{
26536
+ isSignal: true,
26537
+ alias: "label",
26538
+ required: false
26539
+ }]
26540
+ }],
26541
+ description: [{
26542
+ type: i0.Input,
26543
+ args: [{
26544
+ isSignal: true,
26545
+ alias: "description",
26546
+ required: false
26547
+ }]
26548
+ }],
26549
+ ariaLabel: [{
26550
+ type: i0.Input,
26551
+ args: [{
26552
+ isSignal: true,
26553
+ alias: "ariaLabel",
26554
+ required: false
26555
+ }]
26556
+ }],
26557
+ value: [{
26558
+ type: i0.Input,
26559
+ args: [{
26560
+ isSignal: true,
26561
+ alias: "value",
26562
+ required: false
26563
+ }]
26564
+ }],
26565
+ name: [{
26566
+ type: i0.Input,
26567
+ args: [{
26568
+ isSignal: true,
26569
+ alias: "name",
26570
+ required: false
26571
+ }]
26572
+ }],
26573
+ checked: [{
26574
+ type: i0.Input,
26575
+ args: [{
26576
+ isSignal: true,
26577
+ alias: "checked",
26578
+ required: false
26579
+ }]
26580
+ }],
26581
+ invalid: [{
26582
+ type: i0.Input,
26583
+ args: [{
26584
+ isSignal: true,
26585
+ alias: "invalid",
26586
+ required: false
26587
+ }]
26588
+ }],
26589
+ describedBy: [{
26590
+ type: i0.Input,
26591
+ args: [{
26592
+ isSignal: true,
26593
+ alias: "describedBy",
26594
+ required: false
26595
+ }]
26596
+ }],
26597
+ _disabledInput: [{
26598
+ type: i0.Input,
26599
+ args: [{
26600
+ isSignal: true,
26601
+ alias: "disabled",
26602
+ required: false
26603
+ }]
26604
+ }],
26605
+ selected: [{
26606
+ type: i0.Output,
26607
+ args: ["selected"]
26608
+ }]
26609
+ }
26610
+ });
26611
+ var RadioGroupComponent = class RadioGroupComponent {
26612
+ get _name() {
26613
+ return this.name() || this._generatedName;
26614
+ }
26615
+ constructor() {
26616
+ this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
26617
+ this.options = input([], ...ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []);
26618
+ this.required = input(false, ...ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []);
26619
+ this.hint = input("", ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
26620
+ this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
26621
+ this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
26622
+ this.orientation = input("vertical", ...ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []);
26623
+ this.name = input("", ...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
26624
+ this._disabledInput = input(false, {
26625
+ ...ngDevMode ? { debugName: "_disabledInput" } : /* istanbul ignore next */ {},
26626
+ alias: "disabled"
26627
+ });
26628
+ this._cvaDisabled = signal(false, ...ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []);
26629
+ this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
26630
+ this._generatedName = `rg-${Math.random().toString(36).slice(2, 8)}`;
26631
+ this._descId = `${this._generatedName}-desc`;
26632
+ this._value = signal("", ...ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []);
26633
+ this._reveal = createFieldReveal(this.showErrors);
26634
+ this._issue = computed(() => this._check(this._value()), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
26635
+ this.invalid = computed(() => !!this.error() || !!this._issue(), ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
26636
+ this.errorMessage = computed(() => this._issue()?.message ?? "", ...ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []);
26637
+ this.invalidChange = output();
26638
+ this._activeError = computed(() => this.error() || (this._reveal.revealed() ? this.errorMessage() : ""), ...ngDevMode ? [{ debugName: "_activeError" }] : /* istanbul ignore next */ []);
26639
+ this._onValidatorChange = () => {};
26640
+ this._onChange = (_) => {};
26641
+ this._onTouched = () => {};
26642
+ effect(() => {
26643
+ this.invalidChange.emit(this.invalid());
26644
+ });
26645
+ }
26646
+ ngOnChanges() {
26647
+ this._onValidatorChange();
26648
+ }
26649
+ validate(control) {
26650
+ const v = control.value;
26651
+ return issueToErrors(this._check(v == null ? "" : String(v)));
26652
+ }
26653
+ registerOnValidatorChange(fn) {
26654
+ this._onValidatorChange = fn;
26655
+ }
26656
+ writeValue(val) {
26657
+ this._value.set(val ?? "");
26658
+ }
26659
+ registerOnChange(fn) {
26660
+ this._onChange = fn;
26661
+ }
26662
+ registerOnTouched(fn) {
26663
+ this._onTouched = fn;
26664
+ }
26665
+ setDisabledState(d) {
26666
+ this._cvaDisabled.set(d);
26667
+ }
26668
+ onSelect(value) {
26669
+ this._value.set(value);
26670
+ this._onChange(value);
26671
+ }
26672
+ onFocusOut(event) {
26673
+ const next = event.relatedTarget;
26674
+ if (next && event.currentTarget.contains(next)) return;
26675
+ this._onTouched();
26676
+ this._reveal.touched.set(true);
26677
+ }
26678
+ _check(value) {
26679
+ if (this.disabled()) return null;
26680
+ if (!value) return this.required() ? requiredIssue(this.label()) : null;
26681
+ const opts = this.options();
26682
+ if (opts.length > 0 && !opts.some((o) => o.value === value)) return {
26683
+ key: "option",
26684
+ message: "Select a valid option."
26685
+ };
26686
+ return null;
26687
+ }
26688
+ static {
26689
+ this.ɵfac = i0.ɵɵngDeclareFactory({
26690
+ minVersion: "12.0.0",
26691
+ version: "22.2.2",
26692
+ ngImport: i0,
26693
+ type: RadioGroupComponent,
26694
+ deps: [],
26695
+ target: i0.ɵɵFactoryTarget.Component
26696
+ });
26697
+ }
26698
+ static {
26699
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
26700
+ minVersion: "17.0.0",
26701
+ version: "22.2.2",
26702
+ type: RadioGroupComponent,
26703
+ isStandalone: true,
26704
+ selector: "ui-radio-group",
26705
+ inputs: {
26706
+ label: {
26707
+ classPropertyName: "label",
26708
+ publicName: "label",
26709
+ isSignal: true,
26710
+ isRequired: false,
26711
+ transformFunction: null
26712
+ },
26713
+ options: {
26714
+ classPropertyName: "options",
26715
+ publicName: "options",
26716
+ isSignal: true,
26717
+ isRequired: false,
26718
+ transformFunction: null
26719
+ },
26720
+ required: {
26721
+ classPropertyName: "required",
26722
+ publicName: "required",
26723
+ isSignal: true,
26724
+ isRequired: false,
26725
+ transformFunction: null
26726
+ },
26727
+ hint: {
26728
+ classPropertyName: "hint",
26729
+ publicName: "hint",
26730
+ isSignal: true,
26731
+ isRequired: false,
26732
+ transformFunction: null
26733
+ },
26734
+ error: {
26735
+ classPropertyName: "error",
26736
+ publicName: "error",
26737
+ isSignal: true,
26738
+ isRequired: false,
26739
+ transformFunction: null
26740
+ },
26741
+ showErrors: {
26742
+ classPropertyName: "showErrors",
26743
+ publicName: "showErrors",
26744
+ isSignal: true,
26745
+ isRequired: false,
26746
+ transformFunction: null
26747
+ },
26748
+ orientation: {
26749
+ classPropertyName: "orientation",
26750
+ publicName: "orientation",
26751
+ isSignal: true,
26752
+ isRequired: false,
26753
+ transformFunction: null
26754
+ },
26755
+ name: {
26756
+ classPropertyName: "name",
26757
+ publicName: "name",
26758
+ isSignal: true,
26759
+ isRequired: false,
26760
+ transformFunction: null
26761
+ },
26762
+ _disabledInput: {
26763
+ classPropertyName: "_disabledInput",
26764
+ publicName: "disabled",
26765
+ isSignal: true,
26766
+ isRequired: false,
26767
+ transformFunction: null
26768
+ }
26769
+ },
26770
+ outputs: { invalidChange: "invalidChange" },
26771
+ providers: [
26772
+ {
26773
+ provide: NG_VALUE_ACCESSOR,
26774
+ useExisting: forwardRef(() => RadioGroupComponent),
26775
+ multi: true
26776
+ },
26777
+ {
26778
+ provide: NG_VALIDATORS,
26779
+ useExisting: forwardRef(() => RadioGroupComponent),
26780
+ multi: true
26781
+ },
26782
+ {
26783
+ provide: UiFieldValidity,
26784
+ useExisting: forwardRef(() => RadioGroupComponent)
26785
+ }
26786
+ ],
26787
+ usesOnChanges: true,
26788
+ ngImport: i0,
26789
+ template: `
26790
+ <fieldset
26791
+ class="rg-field"
26792
+ role="radiogroup"
26793
+ [class.rg-error]="_activeError()"
26794
+ [class.rg-disabled]="disabled()"
26795
+ [disabled]="disabled()"
26796
+ [attr.aria-required]="required() ? 'true' : null"
26797
+ [attr.aria-invalid]="_activeError() ? 'true' : null"
26798
+ [attr.aria-describedby]="(_activeError() || hint()) ? _descId : null"
26799
+ (focusout)="onFocusOut($event)">
26800
+ @if (label()) {
26801
+ <legend class="rg-label">
26802
+ {{ label() }}
26803
+ @if (required()) { <span class="rg-required" aria-hidden="true">*</span> }
26804
+ </legend>
26805
+ }
26806
+ <div class="rg-options" [class.rg-horizontal]="orientation() === 'horizontal'">
26807
+ @for (opt of options(); track opt.value) {
26808
+ <ui-radio
26809
+ [name]="_name"
26810
+ [value]="opt.value"
26811
+ [label]="opt.label"
26812
+ [description]="opt.description ?? ''"
26813
+ [checked]="_value() === opt.value"
26814
+ [disabled]="disabled() || !!opt.disabled"
26815
+ [invalid]="!!_activeError()"
26816
+ [describedBy]="(_activeError() || hint()) ? _descId : ''"
26817
+ (selected)="onSelect($event)" />
26818
+ }
26819
+ </div>
26820
+ @if (_activeError()) {
26821
+ <p class="rg-desc rg-desc-error" [id]="_descId" role="alert">{{ _activeError() }}</p>
26822
+ } @else if (hint()) {
26823
+ <p class="rg-desc" [id]="_descId">{{ hint() }}</p>
26824
+ }
26825
+ </fieldset>
26826
+ `,
26827
+ isInline: true,
26828
+ styles: [":host{display:block}.rg-field{display:flex;flex-direction:column;gap:6px;border:0;margin:0;padding:0;min-width:0}.rg-label{padding:0;margin-bottom:6px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.rg-required{color:#ef4444;margin-left:2px}.rg-options{display:flex;flex-direction:column;gap:10px}.rg-options.rg-horizontal{flex-direction:row;flex-wrap:wrap;gap:8px 20px}.rg-disabled{cursor:not-allowed}.rg-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.rg-desc-error{color:#ef4444}@media(pointer:coarse),(max-width:480px){.rg-options{gap:4px}}\n"],
26829
+ dependencies: [{
26830
+ kind: "component",
26831
+ type: RadioComponent,
26832
+ selector: "ui-radio",
26833
+ inputs: [
26834
+ "label",
26835
+ "description",
26836
+ "ariaLabel",
26837
+ "value",
26838
+ "name",
26839
+ "checked",
26840
+ "invalid",
26841
+ "describedBy",
26842
+ "disabled"
26843
+ ],
26844
+ outputs: ["selected"]
26845
+ }],
26846
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
26847
+ });
26848
+ }
26849
+ };
26850
+ i0.ɵɵngDeclareClassMetadata({
26851
+ minVersion: "12.0.0",
26852
+ version: "22.2.2",
26853
+ ngImport: i0,
26854
+ type: RadioGroupComponent,
26855
+ decorators: [{
26856
+ type: Component,
26857
+ args: [{
26858
+ selector: "ui-radio-group",
26859
+ standalone: true,
26860
+ imports: [RadioComponent],
26861
+ changeDetection: ChangeDetectionStrategy.OnPush,
26862
+ providers: [
26863
+ {
26864
+ provide: NG_VALUE_ACCESSOR,
26865
+ useExisting: forwardRef(() => RadioGroupComponent),
26866
+ multi: true
26867
+ },
26868
+ {
26869
+ provide: NG_VALIDATORS,
26870
+ useExisting: forwardRef(() => RadioGroupComponent),
26871
+ multi: true
26872
+ },
26873
+ {
26874
+ provide: UiFieldValidity,
26875
+ useExisting: forwardRef(() => RadioGroupComponent)
26876
+ }
26877
+ ],
26878
+ template: `
26879
+ <fieldset
26880
+ class="rg-field"
26881
+ role="radiogroup"
26882
+ [class.rg-error]="_activeError()"
26883
+ [class.rg-disabled]="disabled()"
26884
+ [disabled]="disabled()"
26885
+ [attr.aria-required]="required() ? 'true' : null"
26886
+ [attr.aria-invalid]="_activeError() ? 'true' : null"
26887
+ [attr.aria-describedby]="(_activeError() || hint()) ? _descId : null"
26888
+ (focusout)="onFocusOut($event)">
26889
+ @if (label()) {
26890
+ <legend class="rg-label">
26891
+ {{ label() }}
26892
+ @if (required()) { <span class="rg-required" aria-hidden="true">*</span> }
26893
+ </legend>
26894
+ }
26895
+ <div class="rg-options" [class.rg-horizontal]="orientation() === 'horizontal'">
26896
+ @for (opt of options(); track opt.value) {
26897
+ <ui-radio
26898
+ [name]="_name"
26899
+ [value]="opt.value"
26900
+ [label]="opt.label"
26901
+ [description]="opt.description ?? ''"
26902
+ [checked]="_value() === opt.value"
26903
+ [disabled]="disabled() || !!opt.disabled"
26904
+ [invalid]="!!_activeError()"
26905
+ [describedBy]="(_activeError() || hint()) ? _descId : ''"
26906
+ (selected)="onSelect($event)" />
26907
+ }
26908
+ </div>
26909
+ @if (_activeError()) {
26910
+ <p class="rg-desc rg-desc-error" [id]="_descId" role="alert">{{ _activeError() }}</p>
26911
+ } @else if (hint()) {
26912
+ <p class="rg-desc" [id]="_descId">{{ hint() }}</p>
26913
+ }
26914
+ </fieldset>
26915
+ `,
26916
+ styles: [":host{display:block}.rg-field{display:flex;flex-direction:column;gap:6px;border:0;margin:0;padding:0;min-width:0}.rg-label{padding:0;margin-bottom:6px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.rg-required{color:#ef4444;margin-left:2px}.rg-options{display:flex;flex-direction:column;gap:10px}.rg-options.rg-horizontal{flex-direction:row;flex-wrap:wrap;gap:8px 20px}.rg-disabled{cursor:not-allowed}.rg-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.rg-desc-error{color:#ef4444}@media(pointer:coarse),(max-width:480px){.rg-options{gap:4px}}\n"]
26917
+ }]
26918
+ }],
26919
+ ctorParameters: () => [],
26920
+ propDecorators: {
26921
+ label: [{
26922
+ type: i0.Input,
26923
+ args: [{
26924
+ isSignal: true,
26925
+ alias: "label",
26926
+ required: false
26927
+ }]
26928
+ }],
26929
+ options: [{
26930
+ type: i0.Input,
26931
+ args: [{
26932
+ isSignal: true,
26933
+ alias: "options",
26934
+ required: false
26935
+ }]
26936
+ }],
26937
+ required: [{
26938
+ type: i0.Input,
26939
+ args: [{
26940
+ isSignal: true,
26941
+ alias: "required",
26942
+ required: false
26943
+ }]
26944
+ }],
26945
+ hint: [{
26946
+ type: i0.Input,
26947
+ args: [{
26948
+ isSignal: true,
26949
+ alias: "hint",
26950
+ required: false
26951
+ }]
26952
+ }],
26953
+ error: [{
26954
+ type: i0.Input,
26955
+ args: [{
26956
+ isSignal: true,
26957
+ alias: "error",
26958
+ required: false
26959
+ }]
26960
+ }],
26961
+ showErrors: [{
26962
+ type: i0.Input,
26963
+ args: [{
26964
+ isSignal: true,
26965
+ alias: "showErrors",
26966
+ required: false
26967
+ }]
26968
+ }],
26969
+ orientation: [{
26970
+ type: i0.Input,
26971
+ args: [{
26972
+ isSignal: true,
26973
+ alias: "orientation",
26974
+ required: false
26975
+ }]
26976
+ }],
26977
+ name: [{
26978
+ type: i0.Input,
26979
+ args: [{
26980
+ isSignal: true,
26981
+ alias: "name",
26982
+ required: false
26983
+ }]
26984
+ }],
26985
+ _disabledInput: [{
26986
+ type: i0.Input,
26987
+ args: [{
26988
+ isSignal: true,
26989
+ alias: "disabled",
26990
+ required: false
26991
+ }]
26992
+ }],
26993
+ invalidChange: [{
26994
+ type: i0.Output,
26995
+ args: ["invalidChange"]
26996
+ }]
26997
+ }
26998
+ });
26999
+ var RadioMatrixComponent = class RadioMatrixComponent {
27000
+ get _name() {
27001
+ return this.name() || this._generatedName;
27002
+ }
27003
+ constructor() {
27004
+ this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
27005
+ this.rowHeader = input("", ...ngDevMode ? [{ debugName: "rowHeader" }] : /* istanbul ignore next */ []);
27006
+ this.rows = input([], ...ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []);
27007
+ this.columns = input([], ...ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []);
27008
+ this.required = input(false, ...ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []);
27009
+ this.hint = input("", ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
27010
+ this.error = input("", ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
27011
+ this.showErrors = input(false, ...ngDevMode ? [{ debugName: "showErrors" }] : /* istanbul ignore next */ []);
27012
+ this.name = input("", ...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
27013
+ this._disabledInput = input(false, {
27014
+ ...ngDevMode ? { debugName: "_disabledInput" } : /* istanbul ignore next */ {},
27015
+ alias: "disabled"
27016
+ });
27017
+ this._cvaDisabled = signal(false, ...ngDevMode ? [{ debugName: "_cvaDisabled" }] : /* istanbul ignore next */ []);
27018
+ this.disabled = computed(() => this._disabledInput() || this._cvaDisabled(), ...ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []);
27019
+ this._generatedName = `rm-${Math.random().toString(36).slice(2, 8)}`;
27020
+ this._descId = `${this._generatedName}-desc`;
27021
+ this._value = signal({}, ...ngDevMode ? [{ debugName: "_value" }] : /* istanbul ignore next */ []);
27022
+ this._reveal = createFieldReveal(this.showErrors);
27023
+ this._issue = computed(() => this._check(this._value()), ...ngDevMode ? [{ debugName: "_issue" }] : /* istanbul ignore next */ []);
27024
+ this.invalid = computed(() => !!this.error() || !!this._issue(), ...ngDevMode ? [{ debugName: "invalid" }] : /* istanbul ignore next */ []);
27025
+ this.errorMessage = computed(() => this._issue()?.message ?? "", ...ngDevMode ? [{ debugName: "errorMessage" }] : /* istanbul ignore next */ []);
27026
+ this.invalidChange = output();
27027
+ this._activeError = computed(() => this.error() || (this._reveal.revealed() ? this.errorMessage() : ""), ...ngDevMode ? [{ debugName: "_activeError" }] : /* istanbul ignore next */ []);
27028
+ this._onValidatorChange = () => {};
27029
+ this._onChange = (_) => {};
27030
+ this._onTouched = () => {};
27031
+ effect(() => {
27032
+ this.invalidChange.emit(this.invalid());
27033
+ });
27034
+ }
27035
+ ngOnChanges() {
27036
+ this._onValidatorChange();
27037
+ }
27038
+ validate(control) {
27039
+ return issueToErrors(this._check(this._toRecord(control.value)));
27040
+ }
27041
+ registerOnValidatorChange(fn) {
27042
+ this._onValidatorChange = fn;
27043
+ }
27044
+ writeValue(val) {
27045
+ this._value.set(this._toRecord(val));
27046
+ }
27047
+ registerOnChange(fn) {
27048
+ this._onChange = fn;
27049
+ }
27050
+ registerOnTouched(fn) {
27051
+ this._onTouched = fn;
27052
+ }
27053
+ setDisabledState(d) {
27054
+ this._cvaDisabled.set(d);
27055
+ }
27056
+ onSelect(row, column) {
27057
+ const next = {
27058
+ ...this._value(),
27059
+ [row]: column
27060
+ };
27061
+ this._value.set(next);
27062
+ this._onChange(next);
27063
+ }
27064
+ _rowInvalid(row) {
27065
+ if (this.disabled() || row.disabled || !this._reveal.revealed()) return false;
27066
+ const v = this._value()[row.value] ?? "";
27067
+ return v ? !this.columns().some((c) => c.value === v) : this.required();
27068
+ }
27069
+ onFocusOut(event) {
27070
+ const next = event.relatedTarget;
27071
+ if (next && event.currentTarget.contains(next)) return;
27072
+ this._onTouched();
27073
+ this._reveal.touched.set(true);
27074
+ }
27075
+ _toRecord(val) {
27076
+ return val && typeof val === "object" ? { ...val } : {};
27077
+ }
27078
+ _check(value) {
27079
+ if (this.disabled()) return null;
27080
+ const cols = this.columns();
27081
+ const rows = this.rows().filter((r) => !r.disabled);
27082
+ if (cols.length > 0 && rows.some((r) => value[r.value] && !cols.some((c) => c.value === value[r.value]))) return {
27083
+ key: "option",
27084
+ message: "Select a valid option."
27085
+ };
27086
+ if (this.required() && rows.some((r) => !value[r.value])) {
27087
+ const label = this.label().trim();
27088
+ return {
27089
+ key: "required",
27090
+ message: label ? `${label}: choose an option in every row.` : "Choose an option in every row."
27091
+ };
27092
+ }
27093
+ return null;
27094
+ }
27095
+ static {
27096
+ this.ɵfac = i0.ɵɵngDeclareFactory({
27097
+ minVersion: "12.0.0",
27098
+ version: "22.2.2",
27099
+ ngImport: i0,
27100
+ type: RadioMatrixComponent,
27101
+ deps: [],
27102
+ target: i0.ɵɵFactoryTarget.Component
27103
+ });
27104
+ }
27105
+ static {
27106
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
27107
+ minVersion: "17.0.0",
27108
+ version: "22.2.2",
27109
+ type: RadioMatrixComponent,
27110
+ isStandalone: true,
27111
+ selector: "ui-radio-matrix",
27112
+ inputs: {
27113
+ label: {
27114
+ classPropertyName: "label",
27115
+ publicName: "label",
27116
+ isSignal: true,
27117
+ isRequired: false,
27118
+ transformFunction: null
27119
+ },
27120
+ rowHeader: {
27121
+ classPropertyName: "rowHeader",
27122
+ publicName: "rowHeader",
27123
+ isSignal: true,
27124
+ isRequired: false,
27125
+ transformFunction: null
27126
+ },
27127
+ rows: {
27128
+ classPropertyName: "rows",
27129
+ publicName: "rows",
27130
+ isSignal: true,
27131
+ isRequired: false,
27132
+ transformFunction: null
27133
+ },
27134
+ columns: {
27135
+ classPropertyName: "columns",
27136
+ publicName: "columns",
27137
+ isSignal: true,
27138
+ isRequired: false,
27139
+ transformFunction: null
27140
+ },
27141
+ required: {
27142
+ classPropertyName: "required",
27143
+ publicName: "required",
27144
+ isSignal: true,
27145
+ isRequired: false,
27146
+ transformFunction: null
27147
+ },
27148
+ hint: {
27149
+ classPropertyName: "hint",
27150
+ publicName: "hint",
27151
+ isSignal: true,
27152
+ isRequired: false,
27153
+ transformFunction: null
27154
+ },
27155
+ error: {
27156
+ classPropertyName: "error",
27157
+ publicName: "error",
27158
+ isSignal: true,
27159
+ isRequired: false,
27160
+ transformFunction: null
27161
+ },
27162
+ showErrors: {
27163
+ classPropertyName: "showErrors",
27164
+ publicName: "showErrors",
27165
+ isSignal: true,
27166
+ isRequired: false,
27167
+ transformFunction: null
27168
+ },
27169
+ name: {
27170
+ classPropertyName: "name",
27171
+ publicName: "name",
27172
+ isSignal: true,
27173
+ isRequired: false,
27174
+ transformFunction: null
27175
+ },
27176
+ _disabledInput: {
27177
+ classPropertyName: "_disabledInput",
27178
+ publicName: "disabled",
27179
+ isSignal: true,
27180
+ isRequired: false,
27181
+ transformFunction: null
27182
+ }
27183
+ },
27184
+ outputs: { invalidChange: "invalidChange" },
27185
+ providers: [
27186
+ {
27187
+ provide: NG_VALUE_ACCESSOR,
27188
+ useExisting: forwardRef(() => RadioMatrixComponent),
27189
+ multi: true
27190
+ },
27191
+ {
27192
+ provide: NG_VALIDATORS,
27193
+ useExisting: forwardRef(() => RadioMatrixComponent),
27194
+ multi: true
27195
+ },
27196
+ {
27197
+ provide: UiFieldValidity,
27198
+ useExisting: forwardRef(() => RadioMatrixComponent)
27199
+ }
27200
+ ],
27201
+ usesOnChanges: true,
27202
+ ngImport: i0,
27203
+ template: `
27204
+ <fieldset
27205
+ class="rm-field"
27206
+ [class.rm-error]="_activeError()"
27207
+ [class.rm-disabled]="disabled()"
27208
+ [disabled]="disabled()"
27209
+ [attr.aria-required]="required() ? 'true' : null"
27210
+ [attr.aria-invalid]="_activeError() ? 'true' : null"
27211
+ [attr.aria-describedby]="(_activeError() || hint()) ? _descId : null"
27212
+ (focusout)="onFocusOut($event)">
27213
+ @if (label()) {
27214
+ <legend class="rm-label">
27215
+ {{ label() }}
27216
+ @if (required()) { <span class="rm-required" aria-hidden="true">*</span> }
27217
+ </legend>
27218
+ }
27219
+ <div class="rm-scroll">
27220
+ <table class="rm-table">
27221
+ <thead>
27222
+ <tr>
27223
+ <th scope="col" class="rm-corner">{{ rowHeader() }}</th>
27224
+ @for (col of columns(); track col.value) {
27225
+ <th scope="col" class="rm-col">{{ col.label }}</th>
27226
+ }
27227
+ </tr>
27228
+ </thead>
27229
+ <tbody>
27230
+ @for (row of rows(); track row.value) {
27231
+ <tr class="rm-row" [class.rm-row-missing]="_rowInvalid(row)">
27232
+ <th scope="row" class="rm-row-label">{{ row.label }}</th>
27233
+ @for (col of columns(); track col.value) {
27234
+ <td class="rm-cell">
27235
+ <ui-radio
27236
+ [name]="_name + '-' + row.value"
27237
+ [value]="col.value"
27238
+ [ariaLabel]="row.label + ': ' + col.label"
27239
+ [checked]="_value()[row.value] === col.value"
27240
+ [disabled]="disabled() || !!row.disabled || !!col.disabled"
27241
+ [invalid]="_rowInvalid(row)"
27242
+ [describedBy]="(_activeError() || hint()) ? _descId : ''"
27243
+ (selected)="onSelect(row.value, $event)" />
27244
+ </td>
27245
+ }
27246
+ </tr>
27247
+ }
27248
+ </tbody>
27249
+ </table>
27250
+ </div>
27251
+ @if (_activeError()) {
27252
+ <p class="rm-desc rm-desc-error" [id]="_descId" role="alert">{{ _activeError() }}</p>
27253
+ } @else if (hint()) {
27254
+ <p class="rm-desc" [id]="_descId">{{ hint() }}</p>
27255
+ }
27256
+ </fieldset>
27257
+ `,
27258
+ isInline: true,
27259
+ styles: [":host{display:block}.rm-field{display:flex;flex-direction:column;gap:6px;border:0;margin:0;padding:0;min-width:0}.rm-label{padding:0;margin-bottom:6px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.rm-required{color:#ef4444;margin-left:2px}.rm-scroll{overflow-x:auto;border:1px solid #e2e8f0;border-radius:8px}.rm-table{width:100%;border-collapse:collapse;font-size:.875rem}.rm-table th,.rm-table td{padding:8px 12px;border-bottom:1px solid #f1f5f9;text-align:left}.rm-table tbody tr:last-child th,.rm-table tbody tr:last-child td{border-bottom:0}.rm-table thead th{position:sticky;top:0;background:#f8fafc;font-size:.75rem;font-weight:600;color:#475569;text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.rm-col,.rm-cell{text-align:center!important;width:1%;white-space:nowrap}.rm-cell ui-radio{display:inline-block}.rm-row-label{font-weight:500;color:#1e293b}.rm-row:hover{background:#f8fafc}.rm-row-missing .rm-row-label{color:#b91c1c}.rm-disabled .rm-scroll{opacity:.6}.rm-error .rm-scroll{border-color:#ef4444}.rm-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.rm-desc-error{color:#ef4444}@media(max-width:480px){.rm-table th,.rm-table td{padding:6px 8px}.rm-table thead th{font-size:.6875rem}}\n"],
27260
+ dependencies: [{
27261
+ kind: "component",
27262
+ type: RadioComponent,
27263
+ selector: "ui-radio",
27264
+ inputs: [
27265
+ "label",
27266
+ "description",
27267
+ "ariaLabel",
27268
+ "value",
27269
+ "name",
27270
+ "checked",
27271
+ "invalid",
27272
+ "describedBy",
27273
+ "disabled"
27274
+ ],
27275
+ outputs: ["selected"]
27276
+ }],
27277
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
27278
+ });
27279
+ }
27280
+ };
27281
+ i0.ɵɵngDeclareClassMetadata({
27282
+ minVersion: "12.0.0",
27283
+ version: "22.2.2",
27284
+ ngImport: i0,
27285
+ type: RadioMatrixComponent,
27286
+ decorators: [{
27287
+ type: Component,
27288
+ args: [{
27289
+ selector: "ui-radio-matrix",
27290
+ standalone: true,
27291
+ imports: [RadioComponent],
27292
+ changeDetection: ChangeDetectionStrategy.OnPush,
27293
+ providers: [
27294
+ {
27295
+ provide: NG_VALUE_ACCESSOR,
27296
+ useExisting: forwardRef(() => RadioMatrixComponent),
27297
+ multi: true
27298
+ },
27299
+ {
27300
+ provide: NG_VALIDATORS,
27301
+ useExisting: forwardRef(() => RadioMatrixComponent),
27302
+ multi: true
27303
+ },
27304
+ {
27305
+ provide: UiFieldValidity,
27306
+ useExisting: forwardRef(() => RadioMatrixComponent)
27307
+ }
27308
+ ],
27309
+ template: `
27310
+ <fieldset
27311
+ class="rm-field"
27312
+ [class.rm-error]="_activeError()"
27313
+ [class.rm-disabled]="disabled()"
27314
+ [disabled]="disabled()"
27315
+ [attr.aria-required]="required() ? 'true' : null"
27316
+ [attr.aria-invalid]="_activeError() ? 'true' : null"
27317
+ [attr.aria-describedby]="(_activeError() || hint()) ? _descId : null"
27318
+ (focusout)="onFocusOut($event)">
27319
+ @if (label()) {
27320
+ <legend class="rm-label">
27321
+ {{ label() }}
27322
+ @if (required()) { <span class="rm-required" aria-hidden="true">*</span> }
27323
+ </legend>
27324
+ }
27325
+ <div class="rm-scroll">
27326
+ <table class="rm-table">
27327
+ <thead>
27328
+ <tr>
27329
+ <th scope="col" class="rm-corner">{{ rowHeader() }}</th>
27330
+ @for (col of columns(); track col.value) {
27331
+ <th scope="col" class="rm-col">{{ col.label }}</th>
27332
+ }
27333
+ </tr>
27334
+ </thead>
27335
+ <tbody>
27336
+ @for (row of rows(); track row.value) {
27337
+ <tr class="rm-row" [class.rm-row-missing]="_rowInvalid(row)">
27338
+ <th scope="row" class="rm-row-label">{{ row.label }}</th>
27339
+ @for (col of columns(); track col.value) {
27340
+ <td class="rm-cell">
27341
+ <ui-radio
27342
+ [name]="_name + '-' + row.value"
27343
+ [value]="col.value"
27344
+ [ariaLabel]="row.label + ': ' + col.label"
27345
+ [checked]="_value()[row.value] === col.value"
27346
+ [disabled]="disabled() || !!row.disabled || !!col.disabled"
27347
+ [invalid]="_rowInvalid(row)"
27348
+ [describedBy]="(_activeError() || hint()) ? _descId : ''"
27349
+ (selected)="onSelect(row.value, $event)" />
27350
+ </td>
27351
+ }
27352
+ </tr>
27353
+ }
27354
+ </tbody>
27355
+ </table>
27356
+ </div>
27357
+ @if (_activeError()) {
27358
+ <p class="rm-desc rm-desc-error" [id]="_descId" role="alert">{{ _activeError() }}</p>
27359
+ } @else if (hint()) {
27360
+ <p class="rm-desc" [id]="_descId">{{ hint() }}</p>
27361
+ }
27362
+ </fieldset>
27363
+ `,
27364
+ styles: [":host{display:block}.rm-field{display:flex;flex-direction:column;gap:6px;border:0;margin:0;padding:0;min-width:0}.rm-label{padding:0;margin-bottom:6px;font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.rm-required{color:#ef4444;margin-left:2px}.rm-scroll{overflow-x:auto;border:1px solid #e2e8f0;border-radius:8px}.rm-table{width:100%;border-collapse:collapse;font-size:.875rem}.rm-table th,.rm-table td{padding:8px 12px;border-bottom:1px solid #f1f5f9;text-align:left}.rm-table tbody tr:last-child th,.rm-table tbody tr:last-child td{border-bottom:0}.rm-table thead th{position:sticky;top:0;background:#f8fafc;font-size:.75rem;font-weight:600;color:#475569;text-transform:uppercase;letter-spacing:.03em;white-space:nowrap}.rm-col,.rm-cell{text-align:center!important;width:1%;white-space:nowrap}.rm-cell ui-radio{display:inline-block}.rm-row-label{font-weight:500;color:#1e293b}.rm-row:hover{background:#f8fafc}.rm-row-missing .rm-row-label{color:#b91c1c}.rm-disabled .rm-scroll{opacity:.6}.rm-error .rm-scroll{border-color:#ef4444}.rm-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.rm-desc-error{color:#ef4444}@media(max-width:480px){.rm-table th,.rm-table td{padding:6px 8px}.rm-table thead th{font-size:.6875rem}}\n"]
27365
+ }]
27366
+ }],
27367
+ ctorParameters: () => [],
27368
+ propDecorators: {
27369
+ label: [{
27370
+ type: i0.Input,
27371
+ args: [{
27372
+ isSignal: true,
27373
+ alias: "label",
27374
+ required: false
27375
+ }]
27376
+ }],
27377
+ rowHeader: [{
27378
+ type: i0.Input,
27379
+ args: [{
27380
+ isSignal: true,
27381
+ alias: "rowHeader",
27382
+ required: false
27383
+ }]
27384
+ }],
27385
+ rows: [{
27386
+ type: i0.Input,
27387
+ args: [{
27388
+ isSignal: true,
27389
+ alias: "rows",
27390
+ required: false
27391
+ }]
27392
+ }],
27393
+ columns: [{
27394
+ type: i0.Input,
27395
+ args: [{
27396
+ isSignal: true,
27397
+ alias: "columns",
27398
+ required: false
27399
+ }]
27400
+ }],
27401
+ required: [{
27402
+ type: i0.Input,
27403
+ args: [{
27404
+ isSignal: true,
27405
+ alias: "required",
27406
+ required: false
27407
+ }]
27408
+ }],
27409
+ hint: [{
27410
+ type: i0.Input,
27411
+ args: [{
27412
+ isSignal: true,
27413
+ alias: "hint",
27414
+ required: false
27415
+ }]
27416
+ }],
27417
+ error: [{
27418
+ type: i0.Input,
27419
+ args: [{
27420
+ isSignal: true,
27421
+ alias: "error",
27422
+ required: false
27423
+ }]
27424
+ }],
27425
+ showErrors: [{
27426
+ type: i0.Input,
27427
+ args: [{
27428
+ isSignal: true,
27429
+ alias: "showErrors",
27430
+ required: false
27431
+ }]
27432
+ }],
27433
+ name: [{
27434
+ type: i0.Input,
27435
+ args: [{
27436
+ isSignal: true,
27437
+ alias: "name",
27438
+ required: false
27439
+ }]
27440
+ }],
27441
+ _disabledInput: [{
27442
+ type: i0.Input,
27443
+ args: [{
27444
+ isSignal: true,
27445
+ alias: "disabled",
27446
+ required: false
27447
+ }]
27448
+ }],
27449
+ invalidChange: [{
27450
+ type: i0.Output,
27451
+ args: ["invalidChange"]
27452
+ }]
27453
+ }
27454
+ });
27455
+ var DetailCardComponent = class DetailCardComponent {
27456
+ constructor() {
27457
+ this.title = input("", ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
27458
+ this.headingLevel = input(null, ...ngDevMode ? [{ debugName: "headingLevel" }] : /* istanbul ignore next */ []);
27459
+ this.titleId = input("", ...ngDevMode ? [{ debugName: "titleId" }] : /* istanbul ignore next */ []);
27460
+ this.subtitle = input("", ...ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []);
27461
+ this.showHeader = input(true, ...ngDevMode ? [{ debugName: "showHeader" }] : /* istanbul ignore next */ []);
27462
+ this.collapsible = input(true, ...ngDevMode ? [{ debugName: "collapsible" }] : /* istanbul ignore next */ []);
27463
+ this.expanded = model(true, ...ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []);
27464
+ this.showEdit = input(false, ...ngDevMode ? [{ debugName: "showEdit" }] : /* istanbul ignore next */ []);
27465
+ this.editLabel = input("Edit", ...ngDevMode ? [{ debugName: "editLabel" }] : /* istanbul ignore next */ []);
27466
+ this.editClick = output();
27467
+ }
27468
+ isOpen() {
27469
+ return !(this.showHeader() && this.collapsible()) || this.expanded();
27470
+ }
27471
+ toggle() {
27472
+ this.expanded.set(!this.expanded());
27473
+ }
27474
+ onHeaderClick(event) {
27475
+ if (!this.showHeader() || !this.collapsible()) return;
27476
+ if (event.target?.closest("button, a, input, select, textarea, label, [role=\"button\"], [role=\"link\"], [tabindex]:not([tabindex=\"-1\"])")?.closest(".dc-header")) return;
27477
+ this.toggle();
27478
+ }
27479
+ static {
27480
+ this.ɵfac = i0.ɵɵngDeclareFactory({
27481
+ minVersion: "12.0.0",
27482
+ version: "22.2.2",
27483
+ ngImport: i0,
27484
+ type: DetailCardComponent,
27485
+ deps: [],
27486
+ target: i0.ɵɵFactoryTarget.Component
27487
+ });
27488
+ }
27489
+ static {
27490
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
27491
+ minVersion: "17.0.0",
27492
+ version: "22.2.2",
27493
+ type: DetailCardComponent,
27494
+ isStandalone: true,
27495
+ selector: "ui-detail-card",
27496
+ inputs: {
27497
+ title: {
27498
+ classPropertyName: "title",
27499
+ publicName: "title",
27500
+ isSignal: true,
27501
+ isRequired: false,
27502
+ transformFunction: null
27503
+ },
27504
+ headingLevel: {
27505
+ classPropertyName: "headingLevel",
27506
+ publicName: "headingLevel",
27507
+ isSignal: true,
27508
+ isRequired: false,
27509
+ transformFunction: null
27510
+ },
27511
+ titleId: {
27512
+ classPropertyName: "titleId",
27513
+ publicName: "titleId",
27514
+ isSignal: true,
27515
+ isRequired: false,
27516
+ transformFunction: null
27517
+ },
27518
+ subtitle: {
27519
+ classPropertyName: "subtitle",
27520
+ publicName: "subtitle",
27521
+ isSignal: true,
27522
+ isRequired: false,
27523
+ transformFunction: null
27524
+ },
27525
+ showHeader: {
27526
+ classPropertyName: "showHeader",
27527
+ publicName: "showHeader",
27528
+ isSignal: true,
27529
+ isRequired: false,
27530
+ transformFunction: null
27531
+ },
27532
+ collapsible: {
27533
+ classPropertyName: "collapsible",
27534
+ publicName: "collapsible",
27535
+ isSignal: true,
27536
+ isRequired: false,
27537
+ transformFunction: null
27538
+ },
27539
+ expanded: {
27540
+ classPropertyName: "expanded",
27541
+ publicName: "expanded",
27542
+ isSignal: true,
27543
+ isRequired: false,
27544
+ transformFunction: null
27545
+ },
27546
+ showEdit: {
27547
+ classPropertyName: "showEdit",
27548
+ publicName: "showEdit",
27549
+ isSignal: true,
27550
+ isRequired: false,
27551
+ transformFunction: null
27552
+ },
27553
+ editLabel: {
27554
+ classPropertyName: "editLabel",
27555
+ publicName: "editLabel",
27556
+ isSignal: true,
27557
+ isRequired: false,
27558
+ transformFunction: null
27559
+ }
27560
+ },
27561
+ outputs: {
27562
+ expanded: "expandedChange",
27563
+ editClick: "editClick"
27564
+ },
27565
+ host: {
27566
+ attributes: { "role": "group" },
27567
+ properties: {
27568
+ "attr.aria-labelledby": "showHeader() && title() && titleId() ? titleId() : null",
27569
+ "attr.aria-label": "showHeader() && title() && !titleId() ? title() : null"
27570
+ }
27571
+ },
27572
+ ngImport: i0,
27573
+ template: `
27574
+ <div class="dc">
27575
+ @if (showHeader()) {
27576
+ <div class="dc-header" [class.collapsible]="collapsible()" [class.open]="isOpen()" (click)="onHeaderClick($event)">
27577
+ @if (collapsible()) {
27578
+ <ui-button class="dc-chevron" variant="icon" size="sm"
27579
+ [ariaLabel]="title() || 'Toggle section'"
27580
+ [ariaExpanded]="isOpen()"
27581
+ (click)="$event.stopPropagation(); toggle()">
27582
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"
27583
+ stroke-linecap="round" stroke-linejoin="round" [class.rotated]="!isOpen()" aria-hidden="true">
27584
+ <path d="M6 9l6 6 6-6"/>
27585
+ </svg>
27586
+ </ui-button>
27587
+ }
27588
+ <ng-content select="[card-header-leading]" />
27589
+ <div class="dc-header-text">
27590
+ @if (title()) { <span class="dc-title" [attr.id]="titleId() || null" [attr.role]="headingLevel() ? 'heading' : null" [attr.aria-level]="headingLevel() || null">{{ title() }}</span> }
27591
+ @if (subtitle()) { <span class="dc-subtitle">{{ subtitle() }}</span> }
27592
+ <ng-content select="[card-header]" />
27593
+ </div>
27594
+ @if (showEdit()) {
27595
+ <ui-button class="dc-edit" variant="secondary" size="xs" (click)="$event.stopPropagation(); editClick.emit()">
27596
+ <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
27597
+ <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/>
27598
+ <path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/>
27599
+ </svg>
27600
+ {{ editLabel() }}
27601
+ </ui-button>
27602
+ }
27603
+ <ng-content select="[card-header-action]" />
27604
+ </div>
27605
+ }
27606
+ <div class="dc-body-wrap" [class.collapsed]="!isOpen()" [attr.inert]="isOpen() ? null : ''" [attr.aria-hidden]="isOpen() ? null : 'true'">
27607
+ <div class="dc-body">
27608
+ <ng-content />
27609
+ </div>
27610
+ </div>
27611
+ </div>
27612
+ `,
27613
+ isInline: true,
27614
+ styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom:0}.dc{background:#fff;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dc-header{display:flex;align-items:center;flex-wrap:wrap;gap:8px 10px;padding:14px 18px}.dc-header.open{border-bottom:1px solid #f1f5f9}.dc-header.collapsible{cursor:pointer;-webkit-user-select:none;user-select:none}@media(hover:hover){.dc-header.collapsible:hover{background:#f8fafc}}.dc-chevron{flex-shrink:0;color:#94a3b8}.dc-chevron svg{transition:transform .2s}.dc-chevron svg.rotated{transform:rotate(-90deg)}.dc-header-text{display:flex;flex-direction:column;gap:2px;flex:1 1 160px;min-width:0;word-break:break-word;overflow-wrap:anywhere}.dc-title{font-size:.8125rem;font-weight:800;letter-spacing:.07em;color:#1e293b;line-height:1.3;text-transform:uppercase}.dc-subtitle{font-size:.75rem;color:#94a3b8}.dc-edit{flex-shrink:0;margin-left:auto}.dc-edit ::ng-deep button{font-size:.8rem;font-weight:500;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;gap:5px}.dc-edit ::ng-deep button:hover{background:#f1f5f9;color:#1e293b}.dc-body-wrap{display:grid;grid-template-rows:1fr;transition:grid-template-rows .25s ease}.dc-body-wrap.collapsed{grid-template-rows:0fr}.dc-body{padding:0;min-height:0;overflow:hidden}@media(max-width:480px){.dc-header{padding:12px 14px}.dc-edit{margin-left:0}}@media(prefers-reduced-motion:reduce){.dc-body-wrap,.dc-chevron svg{transition:none}}\n"],
27615
+ dependencies: [{
27616
+ kind: "component",
27617
+ type: ButtonComponent,
27618
+ selector: "ui-button",
27619
+ inputs: [
27620
+ "variant",
27621
+ "color",
27622
+ "active",
27623
+ "size",
27624
+ "type",
27625
+ "disabled",
27626
+ "loading",
27627
+ "fullWidth",
27628
+ "ariaLabel",
27629
+ "ariaExpanded",
27630
+ "ariaPressed",
27631
+ "ariaDescribedBy",
27632
+ "modal-footer-left",
27633
+ "modal-footer-right"
27634
+ ]
27635
+ }],
27636
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
27637
+ });
27638
+ }
27639
+ };
27640
+ i0.ɵɵngDeclareClassMetadata({
27641
+ minVersion: "12.0.0",
27642
+ version: "22.2.2",
27643
+ ngImport: i0,
27644
+ type: DetailCardComponent,
27645
+ decorators: [{
27646
+ type: Component,
27647
+ args: [{
27648
+ selector: "ui-detail-card",
27649
+ standalone: true,
27650
+ changeDetection: ChangeDetectionStrategy.OnPush,
27651
+ imports: [ButtonComponent],
27652
+ host: {
27653
+ "role": "group",
27654
+ "[attr.aria-labelledby]": "showHeader() && title() && titleId() ? titleId() : null",
27655
+ "[attr.aria-label]": "showHeader() && title() && !titleId() ? title() : null"
27656
+ },
27657
+ template: `
27658
+ <div class="dc">
27659
+ @if (showHeader()) {
27660
+ <div class="dc-header" [class.collapsible]="collapsible()" [class.open]="isOpen()" (click)="onHeaderClick($event)">
27661
+ @if (collapsible()) {
27662
+ <ui-button class="dc-chevron" variant="icon" size="sm"
27663
+ [ariaLabel]="title() || 'Toggle section'"
27664
+ [ariaExpanded]="isOpen()"
27665
+ (click)="$event.stopPropagation(); toggle()">
27666
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"
27667
+ stroke-linecap="round" stroke-linejoin="round" [class.rotated]="!isOpen()" aria-hidden="true">
27668
+ <path d="M6 9l6 6 6-6"/>
27669
+ </svg>
27670
+ </ui-button>
27671
+ }
27672
+ <ng-content select="[card-header-leading]" />
27673
+ <div class="dc-header-text">
27674
+ @if (title()) { <span class="dc-title" [attr.id]="titleId() || null" [attr.role]="headingLevel() ? 'heading' : null" [attr.aria-level]="headingLevel() || null">{{ title() }}</span> }
27675
+ @if (subtitle()) { <span class="dc-subtitle">{{ subtitle() }}</span> }
27676
+ <ng-content select="[card-header]" />
27677
+ </div>
27678
+ @if (showEdit()) {
27679
+ <ui-button class="dc-edit" variant="secondary" size="xs" (click)="$event.stopPropagation(); editClick.emit()">
27680
+ <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
27681
+ <path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/>
27682
+ <path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/>
27683
+ </svg>
27684
+ {{ editLabel() }}
27685
+ </ui-button>
27686
+ }
27687
+ <ng-content select="[card-header-action]" />
27688
+ </div>
27689
+ }
27690
+ <div class="dc-body-wrap" [class.collapsed]="!isOpen()" [attr.inert]="isOpen() ? null : ''" [attr.aria-hidden]="isOpen() ? null : 'true'">
27691
+ <div class="dc-body">
27692
+ <ng-content />
27693
+ </div>
27694
+ </div>
27695
+ </div>
27696
+ `,
27697
+ styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom:0}.dc{background:#fff;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dc-header{display:flex;align-items:center;flex-wrap:wrap;gap:8px 10px;padding:14px 18px}.dc-header.open{border-bottom:1px solid #f1f5f9}.dc-header.collapsible{cursor:pointer;-webkit-user-select:none;user-select:none}@media(hover:hover){.dc-header.collapsible:hover{background:#f8fafc}}.dc-chevron{flex-shrink:0;color:#94a3b8}.dc-chevron svg{transition:transform .2s}.dc-chevron svg.rotated{transform:rotate(-90deg)}.dc-header-text{display:flex;flex-direction:column;gap:2px;flex:1 1 160px;min-width:0;word-break:break-word;overflow-wrap:anywhere}.dc-title{font-size:.8125rem;font-weight:800;letter-spacing:.07em;color:#1e293b;line-height:1.3;text-transform:uppercase}.dc-subtitle{font-size:.75rem;color:#94a3b8}.dc-edit{flex-shrink:0;margin-left:auto}.dc-edit ::ng-deep button{font-size:.8rem;font-weight:500;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;gap:5px}.dc-edit ::ng-deep button:hover{background:#f1f5f9;color:#1e293b}.dc-body-wrap{display:grid;grid-template-rows:1fr;transition:grid-template-rows .25s ease}.dc-body-wrap.collapsed{grid-template-rows:0fr}.dc-body{padding:0;min-height:0;overflow:hidden}@media(max-width:480px){.dc-header{padding:12px 14px}.dc-edit{margin-left:0}}@media(prefers-reduced-motion:reduce){.dc-body-wrap,.dc-chevron svg{transition:none}}\n"]
27698
+ }]
27699
+ }],
27700
+ propDecorators: {
27701
+ title: [{
27702
+ type: i0.Input,
27703
+ args: [{
27704
+ isSignal: true,
27705
+ alias: "title",
27706
+ required: false
27707
+ }]
27708
+ }],
27709
+ headingLevel: [{
27710
+ type: i0.Input,
27711
+ args: [{
27712
+ isSignal: true,
27713
+ alias: "headingLevel",
27714
+ required: false
27715
+ }]
27716
+ }],
27717
+ titleId: [{
27718
+ type: i0.Input,
27719
+ args: [{
27720
+ isSignal: true,
27721
+ alias: "titleId",
27722
+ required: false
27723
+ }]
27724
+ }],
27725
+ subtitle: [{
27726
+ type: i0.Input,
27727
+ args: [{
27728
+ isSignal: true,
27729
+ alias: "subtitle",
27730
+ required: false
27731
+ }]
27732
+ }],
27733
+ showHeader: [{
27734
+ type: i0.Input,
27735
+ args: [{
27736
+ isSignal: true,
27737
+ alias: "showHeader",
27738
+ required: false
27739
+ }]
27740
+ }],
27741
+ collapsible: [{
27742
+ type: i0.Input,
27743
+ args: [{
27744
+ isSignal: true,
27745
+ alias: "collapsible",
27746
+ required: false
27747
+ }]
27748
+ }],
27749
+ expanded: [{
27750
+ type: i0.Input,
27751
+ args: [{
27752
+ isSignal: true,
27753
+ alias: "expanded",
27754
+ required: false
27755
+ }]
27756
+ }, {
27757
+ type: i0.Output,
27758
+ args: ["expandedChange"]
27759
+ }],
27760
+ showEdit: [{
27761
+ type: i0.Input,
27762
+ args: [{
27763
+ isSignal: true,
27764
+ alias: "showEdit",
27765
+ required: false
27766
+ }]
27767
+ }],
27768
+ editLabel: [{
27769
+ type: i0.Input,
27770
+ args: [{
27771
+ isSignal: true,
27772
+ alias: "editLabel",
27773
+ required: false
27774
+ }]
27775
+ }],
27776
+ editClick: [{
27777
+ type: i0.Output,
27778
+ args: ["editClick"]
27779
+ }]
27780
+ }
27781
+ });
27782
+ const SPACE_PX = {
27783
+ none: 0,
27784
+ sm: 8,
27785
+ md: 16,
27786
+ lg: 24
27787
+ };
27788
+ var DividerComponent = class DividerComponent {
27789
+ constructor() {
27790
+ this.spaceAbove = input("none", ...ngDevMode ? [{ debugName: "spaceAbove" }] : /* istanbul ignore next */ []);
27791
+ this.spaceBelow = input("md", ...ngDevMode ? [{ debugName: "spaceBelow" }] : /* istanbul ignore next */ []);
27792
+ this.decorative = input(false, ...ngDevMode ? [{ debugName: "decorative" }] : /* istanbul ignore next */ []);
27793
+ this.above = computed(() => SPACE_PX[this.spaceAbove()] ?? 0, ...ngDevMode ? [{ debugName: "above" }] : /* istanbul ignore next */ []);
27794
+ this.below = computed(() => SPACE_PX[this.spaceBelow()] ?? 0, ...ngDevMode ? [{ debugName: "below" }] : /* istanbul ignore next */ []);
27795
+ }
27796
+ static {
27797
+ this.ɵfac = i0.ɵɵngDeclareFactory({
27798
+ minVersion: "12.0.0",
27799
+ version: "22.2.2",
27800
+ ngImport: i0,
27801
+ type: DividerComponent,
27802
+ deps: [],
27803
+ target: i0.ɵɵFactoryTarget.Component
27804
+ });
27805
+ }
27806
+ static {
27807
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
27808
+ minVersion: "17.1.0",
27809
+ version: "22.2.2",
27810
+ type: DividerComponent,
27811
+ isStandalone: true,
27812
+ selector: "ui-divider",
27813
+ inputs: {
27814
+ spaceAbove: {
27815
+ classPropertyName: "spaceAbove",
27816
+ publicName: "spaceAbove",
27817
+ isSignal: true,
27818
+ isRequired: false,
27819
+ transformFunction: null
27820
+ },
27821
+ spaceBelow: {
27822
+ classPropertyName: "spaceBelow",
27823
+ publicName: "spaceBelow",
27824
+ isSignal: true,
27825
+ isRequired: false,
27826
+ transformFunction: null
27827
+ },
27828
+ decorative: {
27829
+ classPropertyName: "decorative",
27830
+ publicName: "decorative",
27831
+ isSignal: true,
27832
+ isRequired: false,
27833
+ transformFunction: null
27834
+ }
27835
+ },
27836
+ ngImport: i0,
27837
+ template: `<hr class="ui-divider" [style.margin-top.px]="above()" [style.margin-bottom.px]="below()"
27838
+ [attr.aria-hidden]="decorative() ? 'true' : null" [attr.role]="decorative() ? 'presentation' : null" />`,
27839
+ isInline: true,
27840
+ styles: [":host{display:block}.ui-divider{display:block;width:100%;height:0;border:0;border-top:1px solid #e2e8f0;padding:0}\n"],
27841
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
27842
+ });
27843
+ }
27844
+ };
27845
+ i0.ɵɵngDeclareClassMetadata({
27846
+ minVersion: "12.0.0",
27847
+ version: "22.2.2",
27848
+ ngImport: i0,
27849
+ type: DividerComponent,
27850
+ decorators: [{
27851
+ type: Component,
27852
+ args: [{
27853
+ selector: "ui-divider",
27854
+ standalone: true,
27855
+ changeDetection: ChangeDetectionStrategy.OnPush,
27856
+ template: `<hr class="ui-divider" [style.margin-top.px]="above()" [style.margin-bottom.px]="below()"
27857
+ [attr.aria-hidden]="decorative() ? 'true' : null" [attr.role]="decorative() ? 'presentation' : null" />`,
27858
+ styles: [":host{display:block}.ui-divider{display:block;width:100%;height:0;border:0;border-top:1px solid #e2e8f0;padding:0}\n"]
27859
+ }]
27860
+ }],
27861
+ propDecorators: {
27862
+ spaceAbove: [{
27863
+ type: i0.Input,
27864
+ args: [{
27865
+ isSignal: true,
27866
+ alias: "spaceAbove",
27867
+ required: false
27868
+ }]
27869
+ }],
27870
+ spaceBelow: [{
27871
+ type: i0.Input,
27872
+ args: [{
27873
+ isSignal: true,
27874
+ alias: "spaceBelow",
27875
+ required: false
27876
+ }]
27877
+ }],
27878
+ decorative: [{
27879
+ type: i0.Input,
27880
+ args: [{
27881
+ isSignal: true,
27882
+ alias: "decorative",
27883
+ required: false
27884
+ }]
27885
+ }]
27886
+ }
27887
+ });
27888
+ export { AlertComponent, AppShellComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BulkMessagePanelComponent, ButtonComponent, CheckboxComponent, ChipComponent, ChipGroupComponent, ColumnFilterComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, DEFAULT_DOCUMENT_SUBJECT, DOCUMENT_PURPOSE_OPTIONS, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DocumentSendOptionsComponent, DropdownComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FileInputComponent, FormRowComponent, FormSectionComponent, HintComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, KpiCardComponent, ListItemComponent, MAX_CC, ModalComponent, MoreMenuComponent, MultiSelectComponent, PaginationComponent, PanelInfoListComponent, PillTabsComponent, ProgressBarComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SearchInputComponent, SelectComponent, SendMessagePanelComponent, SidePanelComponent, SkeletonComponent, TableToolbarComponent, TemplatePickerComponent, TextInputComponent, TextareaInputComponent, TimeInputComponent, ToastComponent, ToastService, ToggleBadgeComponent, TooltipDirective, US_STATES, UiFieldValidity, VideoPickerComponent, appShellGroupsStorageKey, autoVariant, builtInActionIcon, createFieldReveal, decodeFilterValues, encodeFilterValue, encodeFilterValues, errorContextInterceptor, formatIsoDate, formatIsoDateTime, formatTime, getEligibleIds, getEligibleOptions, getErrorMessage, humanReadableMessage, isoKey, issueToErrors, maxLengthIssue, messagePreviewHtml, parseCcList, parseIso, parseTime, pluralize, requiredIssue, resolvePreset, suggestDocumentSubject };
25439
27889
 
25440
27890
  //# sourceMappingURL=forgeroute-ui.mjs.map