@forgeroute/ui 0.4.66 → 0.4.68

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.
@@ -830,7 +830,12 @@ var QuickFilterTabsComponent = class QuickFilterTabsComponent {
830
830
 
831
831
  <!-- More button (inside scrollable .tabs for layout) -->
832
832
  @if (overflowTabs().length) {
833
- <button class="tab more-btn" [class.active]="overflowActive()"
833
+ <!-- role="tab" (not a bare button): a tablist may only own tab children. The trigger is the tab for the
834
+ overflow group: aria-selected mirrors "the active tab lives in the overflow", and aria-haspopup /
835
+ aria-expanded describe the listbox it opens. -->
836
+ <button class="tab more-btn" role="tab" aria-haspopup="listbox" [class.active]="overflowActive()"
837
+ [attr.aria-selected]="overflowActive()"
838
+ [attr.aria-expanded]="dropdownOpen()"
834
839
  (click)="toggleDropdown($event)">
835
840
  @if (overflowActive()) {
836
841
  {{ activeOverflowLabel() }}
@@ -864,7 +869,7 @@ var QuickFilterTabsComponent = class QuickFilterTabsComponent {
864
869
  </div>
865
870
  `,
866
871
  isInline: true,
867
- styles: [":host{display:block;min-width:0}.tabs-outer{position:relative;display:inline-flex;align-items:center;max-width:100%;min-width:0}.tabs{display:flex;align-items:center;gap:2px;background:#f1f5f9;border-radius:8px;padding:3px;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch;min-width:0;max-width:100%}.tabs::-webkit-scrollbar{display:none}.tab{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:6px;border:none;background:transparent;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;font-family:inherit;transition:background .1s,color .1s;white-space:nowrap;flex-shrink:0}.tab:hover{color:#1e293b}.tab.active{background:#fff;color:#1e293b;box-shadow:0 1px 3px #00000014}.tab:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}.tab.tab-disabled{opacity:.45;cursor:default;pointer-events:none}.tab-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:999px;font-size:.6875rem;font-weight:700;background:#e2e8f0;color:#475569;line-height:1}.active .tab-count,.active-count{background:#1e293b;color:#fff}.more-btn{gap:4px}.more-dropdown{position:absolute;top:calc(100% + 4px);right:0;z-index:100;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;min-width:180px;padding:4px;max-height:260px;overflow-y:auto}.more-option{display:flex;align-items:center;justify-content:space-between;width:100%;padding:8px 12px;background:none;border:none;cursor:pointer;font-size:.875rem;color:#334155;font-family:inherit;border-radius:5px;transition:background .1s;text-align:left;gap:12px}.more-option:hover{background:#f8fafc}.more-option.more-option-active{background:#f1f5f9;color:#1e293b;font-weight:500}.more-option:focus-visible{outline:2px solid #60a5fa;outline-offset:-2px}.more-option-label{flex:1}.more-option-count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:999px;font-size:.6875rem;font-weight:700;line-height:1;background:#e2e8f0;color:#475569}.more-option-active .more-option-count{background:#1e293b;color:#fff}@media(max-width:1024px){.tab{padding:7px 12px}}@media(pointer:coarse){.tab{min-height:44px}}@media(max-width:640px){:host{align-self:flex-start;max-width:100%}.tab{padding:10px 12px;font-size:.8125rem;min-height:44px}.more-option{padding:12px 14px}}\n"],
872
+ styles: [":host{display:block;min-width:0}.tabs-outer{position:relative;display:inline-flex;align-items:center;max-width:100%;min-width:0}.tabs{display:flex;align-items:center;gap:2px;background:#f1f5f9;border-radius:8px;padding:3px;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch;min-width:0;max-width:100%}.tabs::-webkit-scrollbar{display:none}.tab{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:6px;border:none;background:transparent;font-size:.8125rem;font-weight:500;color:#475569;cursor:pointer;font-family:inherit;transition:background .1s,color .1s;white-space:nowrap;flex-shrink:0}.tab:hover{color:#1e293b}.tab.active{background:#fff;color:#1e293b;box-shadow:0 1px 3px #00000014}.tab:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}.tab.tab-disabled{opacity:.45;cursor:default;pointer-events:none}.tab-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:999px;font-size:.6875rem;font-weight:700;background:#e2e8f0;color:#475569;line-height:1}.active .tab-count,.active-count{background:#1e293b;color:#fff}.more-btn{gap:4px}.more-dropdown{position:absolute;top:calc(100% + 4px);right:0;z-index:100;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;min-width:180px;padding:4px;max-height:260px;overflow-y:auto}.more-option{display:flex;align-items:center;justify-content:space-between;width:100%;padding:8px 12px;background:none;border:none;cursor:pointer;font-size:.875rem;color:#334155;font-family:inherit;border-radius:5px;transition:background .1s;text-align:left;gap:12px}.more-option:hover{background:#f8fafc}.more-option.more-option-active{background:#f1f5f9;color:#1e293b;font-weight:500}.more-option:focus-visible{outline:2px solid #60a5fa;outline-offset:-2px}.more-option-label{flex:1}.more-option-count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:999px;font-size:.6875rem;font-weight:700;line-height:1;background:#e2e8f0;color:#475569}.more-option-active .more-option-count{background:#1e293b;color:#fff}@media(max-width:1024px){.tab{padding:7px 12px}}@media(pointer:coarse){.tab{min-height:44px}}@media(max-width:640px){:host{align-self:flex-start;max-width:100%}.tab{padding:10px 12px;font-size:.8125rem;min-height:44px}.more-option{padding:12px 14px}}\n"],
868
873
  dependencies: [{
869
874
  kind: "pipe",
870
875
  type: DecimalPipe,
@@ -921,7 +926,12 @@ i0.ɵɵngDeclareClassMetadata({
921
926
 
922
927
  <!-- More button (inside scrollable .tabs for layout) -->
923
928
  @if (overflowTabs().length) {
924
- <button class="tab more-btn" [class.active]="overflowActive()"
929
+ <!-- role="tab" (not a bare button): a tablist may only own tab children. The trigger is the tab for the
930
+ overflow group: aria-selected mirrors "the active tab lives in the overflow", and aria-haspopup /
931
+ aria-expanded describe the listbox it opens. -->
932
+ <button class="tab more-btn" role="tab" aria-haspopup="listbox" [class.active]="overflowActive()"
933
+ [attr.aria-selected]="overflowActive()"
934
+ [attr.aria-expanded]="dropdownOpen()"
925
935
  (click)="toggleDropdown($event)">
926
936
  @if (overflowActive()) {
927
937
  {{ activeOverflowLabel() }}
@@ -954,7 +964,7 @@ i0.ɵɵngDeclareClassMetadata({
954
964
  }
955
965
  </div>
956
966
  `,
957
- styles: [":host{display:block;min-width:0}.tabs-outer{position:relative;display:inline-flex;align-items:center;max-width:100%;min-width:0}.tabs{display:flex;align-items:center;gap:2px;background:#f1f5f9;border-radius:8px;padding:3px;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch;min-width:0;max-width:100%}.tabs::-webkit-scrollbar{display:none}.tab{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:6px;border:none;background:transparent;font-size:.8125rem;font-weight:500;color:#64748b;cursor:pointer;font-family:inherit;transition:background .1s,color .1s;white-space:nowrap;flex-shrink:0}.tab:hover{color:#1e293b}.tab.active{background:#fff;color:#1e293b;box-shadow:0 1px 3px #00000014}.tab:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}.tab.tab-disabled{opacity:.45;cursor:default;pointer-events:none}.tab-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:999px;font-size:.6875rem;font-weight:700;background:#e2e8f0;color:#475569;line-height:1}.active .tab-count,.active-count{background:#1e293b;color:#fff}.more-btn{gap:4px}.more-dropdown{position:absolute;top:calc(100% + 4px);right:0;z-index:100;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;min-width:180px;padding:4px;max-height:260px;overflow-y:auto}.more-option{display:flex;align-items:center;justify-content:space-between;width:100%;padding:8px 12px;background:none;border:none;cursor:pointer;font-size:.875rem;color:#334155;font-family:inherit;border-radius:5px;transition:background .1s;text-align:left;gap:12px}.more-option:hover{background:#f8fafc}.more-option.more-option-active{background:#f1f5f9;color:#1e293b;font-weight:500}.more-option:focus-visible{outline:2px solid #60a5fa;outline-offset:-2px}.more-option-label{flex:1}.more-option-count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:999px;font-size:.6875rem;font-weight:700;line-height:1;background:#e2e8f0;color:#475569}.more-option-active .more-option-count{background:#1e293b;color:#fff}@media(max-width:1024px){.tab{padding:7px 12px}}@media(pointer:coarse){.tab{min-height:44px}}@media(max-width:640px){:host{align-self:flex-start;max-width:100%}.tab{padding:10px 12px;font-size:.8125rem;min-height:44px}.more-option{padding:12px 14px}}\n"]
967
+ styles: [":host{display:block;min-width:0}.tabs-outer{position:relative;display:inline-flex;align-items:center;max-width:100%;min-width:0}.tabs{display:flex;align-items:center;gap:2px;background:#f1f5f9;border-radius:8px;padding:3px;overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch;min-width:0;max-width:100%}.tabs::-webkit-scrollbar{display:none}.tab{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:6px;border:none;background:transparent;font-size:.8125rem;font-weight:500;color:#475569;cursor:pointer;font-family:inherit;transition:background .1s,color .1s;white-space:nowrap;flex-shrink:0}.tab:hover{color:#1e293b}.tab.active{background:#fff;color:#1e293b;box-shadow:0 1px 3px #00000014}.tab:focus-visible{outline:2px solid #60a5fa;outline-offset:2px}.tab.tab-disabled{opacity:.45;cursor:default;pointer-events:none}.tab-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:999px;font-size:.6875rem;font-weight:700;background:#e2e8f0;color:#475569;line-height:1}.active .tab-count,.active-count{background:#1e293b;color:#fff}.more-btn{gap:4px}.more-dropdown{position:absolute;top:calc(100% + 4px);right:0;z-index:100;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;min-width:180px;padding:4px;max-height:260px;overflow-y:auto}.more-option{display:flex;align-items:center;justify-content:space-between;width:100%;padding:8px 12px;background:none;border:none;cursor:pointer;font-size:.875rem;color:#334155;font-family:inherit;border-radius:5px;transition:background .1s;text-align:left;gap:12px}.more-option:hover{background:#f8fafc}.more-option.more-option-active{background:#f1f5f9;color:#1e293b;font-weight:500}.more-option:focus-visible{outline:2px solid #60a5fa;outline-offset:-2px}.more-option-label{flex:1}.more-option-count{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:999px;font-size:.6875rem;font-weight:700;line-height:1;background:#e2e8f0;color:#475569}.more-option-active .more-option-count{background:#1e293b;color:#fff}@media(max-width:1024px){.tab{padding:7px 12px}}@media(pointer:coarse){.tab{min-height:44px}}@media(max-width:640px){:host{align-self:flex-start;max-width:100%}.tab{padding:10px 12px;font-size:.8125rem;min-height:44px}.more-option{padding:12px 14px}}\n"]
958
968
  }]
959
969
  }],
960
970
  ctorParameters: () => [],
@@ -1243,7 +1253,7 @@ var ColumnFilterComponent = class ColumnFilterComponent {
1243
1253
  </div>
1244
1254
  `,
1245
1255
  isInline: true,
1246
- 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;font-weight:400;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 #7c8ba1;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}}@media(prefers-reduced-motion:reduce){.cf-dropdown{animation:none}}\n"],
1256
+ 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;font-weight:400;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 #7c8ba1;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:#475569;border-radius:999px;padding:2px 7px;min-width:22px;text-align:center}.cf-option.cf-selected .cf-count{background:#dbeafe;color:#1d4ed8}.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}}@media(prefers-reduced-motion:reduce){.cf-dropdown{animation:none}}\n"],
1247
1257
  changeDetection: i0.ChangeDetectionStrategy.OnPush
1248
1258
  });
1249
1259
  }
@@ -1332,7 +1342,7 @@ i0.ɵɵngDeclareClassMetadata({
1332
1342
  }
1333
1343
  </div>
1334
1344
  `,
1335
- 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;font-weight:400;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 #7c8ba1;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}}@media(prefers-reduced-motion:reduce){.cf-dropdown{animation:none}}\n"]
1345
+ 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;font-weight:400;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 #7c8ba1;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:#475569;border-radius:999px;padding:2px 7px;min-width:22px;text-align:center}.cf-option.cf-selected .cf-count{background:#dbeafe;color:#1d4ed8}.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}}@media(prefers-reduced-motion:reduce){.cf-dropdown{animation:none}}\n"]
1336
1346
  }]
1337
1347
  }],
1338
1348
  ctorParameters: () => [],
@@ -11892,6 +11902,7 @@ var DataTableComponent = class DataTableComponent {
11892
11902
  }))];
11893
11903
  }, ...ngDevMode ? [{ debugName: "_effectiveTabs" }] : /* istanbul ignore next */ []);
11894
11904
  this._error = signal(null, ...ngDevMode ? [{ debugName: "_error" }] : /* istanbul ignore next */ []);
11905
+ this._cardListHasItems = computed(() => this._loading() || !this._error() && this._items().length > 0, ...ngDevMode ? [{ debugName: "_cardListHasItems" }] : /* istanbul ignore next */ []);
11895
11906
  this._loadFailed = signal(false, ...ngDevMode ? [{ debugName: "_loadFailed" }] : /* istanbul ignore next */ []);
11896
11907
  this.loadFailed = this._loadFailed.asReadonly();
11897
11908
  this._search = signal("", ...ngDevMode ? [{ debugName: "_search" }] : /* istanbul ignore next */ []);
@@ -13460,7 +13471,8 @@ var DataTableComponent = class DataTableComponent {
13460
13471
  }
13461
13472
  </div>
13462
13473
  }
13463
- <div class="dt-card-list" role="list" [attr.aria-label]="tableLabel()">
13474
+ <!-- role=list only while it holds listitems (cards or skeleton cards); empty / error / no-match states are not an empty list -->
13475
+ <div class="dt-card-list" [attr.role]="_cardListHasItems() ? 'list' : null" [attr.aria-label]="_cardListHasItems() ? tableLabel() : null">
13464
13476
 
13465
13477
  @if (_loading()) {
13466
13478
  @for (_ of skeletonRows(); track $index) {
@@ -13544,7 +13556,7 @@ var DataTableComponent = class DataTableComponent {
13544
13556
  @if (tc.starFn?.(item); as starTip) {
13545
13557
  <ui-star class="dt-cell-star" [tooltip]="starTip" />
13546
13558
  }
13547
- {{ tc.render ? tc.render(item) : (item[tc.key] ?? '—') }}
13559
+ {{ tc.render ? tc.render(item) : cardCellText(tc, item) }}
13548
13560
  </span>
13549
13561
  }
13550
13562
  }
@@ -13688,7 +13700,7 @@ var DataTableComponent = class DataTableComponent {
13688
13700
  </div>
13689
13701
  `,
13690
13702
  isInline: true,
13691
- 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-title{margin:0;font-size:.8125rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:#64748b;overflow-wrap:anywhere}.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-sticky-actions th.dt-th-actions,.dt-sticky-actions td.dt-td-actions{position:sticky;right:0;box-shadow:-1px 0 #e2e8f0}.dt-sticky-actions th.dt-th-actions{z-index:3;background:#f8fafc}.dt-sticky-actions td.dt-td-actions{z-index:1;background:#fff}.dt-sticky-actions td.dt-td-actions:focus-within,.dt-sticky-actions td.dt-td-actions:has(.mm-dropdown){z-index:2}.dt-sticky-actions tbody tr:hover td.dt-td-actions{background:#f8fafc}.dt-sticky-actions tbody tr.dt-row-selected td.dt-td-actions{background:#eff6ff}.dt-sticky-actions tbody tr.dt-row-selected:hover td.dt-td-actions{background:#dbeafe}.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-link{position:relative;display:inline-block;max-width:100%;padding:1px 2px;vertical-align:bottom;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#2563eb;text-decoration:none;border-radius:3px;cursor:pointer}.dt-link:hover{text-decoration:underline;color:#1d4ed8}.dt-link:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px;text-decoration:underline}.dt-card-detail-value .dt-link,.dt-card-name .dt-link{white-space:normal;overflow-wrap:anywhere}.dt-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.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-cell-star{margin-right:6px}.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-th-grip{width:36px;padding:0!important;border-right:1px solid #e2e8f0;background:#f8fafc}.dt-td-grip{width:36px;padding:0!important;text-align:center!important;border-right:1px solid #f1f5f9}.dt-grip{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#64748b;cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.dt-grip:hover{background:#f1f5f9;color:#334155}.dt-grip:active{cursor:grabbing}.dt-grip:focus-visible{outline:2px solid #3b82f6;outline-offset:1px}.dt-grip-off{color:#cbd5e1;cursor:not-allowed}.dt-grip-off:hover{background:none;color:#cbd5e1}.dt-row-move{display:none}@media(pointer:coarse){.dt-grip{display:none}.dt-row-move{display:inline-flex;flex-direction:column;align-items:center}.dt-th-grip,.dt-td-grip{width:56px}}.dt-row-dragging{opacity:.45}.dt-row-over-before>td{box-shadow:inset 0 2px #3b82f6}.dt-row-over-after>td{box-shadow:inset 0 -2px #3b82f6}.dt-card-move{display:inline-flex;align-items:center;gap:2px;flex-shrink:0}@media(forced-colors:active){.dt-row-over-before>td{box-shadow:inset 0 2px 0 Highlight}.dt-row-over-after>td{box-shadow:inset 0 -2px 0 Highlight}.dt-grip:focus-visible{outline-color:Highlight}}.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:820px){.dt-header-left{flex-basis:100%}.dt-header-right{flex-basis:100%;justify-content:flex-start}}@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;flex-wrap:nowrap;flex-shrink:0;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 1 100%}.dt-bulk-actions{flex:1 1 auto;width:auto}.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;--ui-pagination-bg: #f8fafc}.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 36px 0 12px;font-family:inherit;font-size:1rem;color:#1e293b;border:1px solid #7c8ba1;border-radius:8px;-webkit-appearance:none;appearance:none;background:#fff url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M1 1.5l5 5 5-5'/%3E%3C/svg%3E\") no-repeat right 12px center}.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;overflow-wrap:anywhere;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;line-clamp:3}.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}@media(prefers-reduced-motion:reduce){.dt-sk-shimmer:after,.dt-sk-cell:after{animation:none;transform:none;opacity:0}.dt-tag-tooltip{animation:none}.dt-sort-icon{transition:none}}\n"],
13703
+ 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-title{margin:0;font-size:.8125rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:#64748b;overflow-wrap:anywhere}.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-sticky-actions th.dt-th-actions,.dt-sticky-actions td.dt-td-actions{position:sticky;right:0;box-shadow:-1px 0 #e2e8f0}.dt-sticky-actions th.dt-th-actions{z-index:3;background:#f8fafc}.dt-sticky-actions td.dt-td-actions{z-index:1;background:#fff}.dt-sticky-actions td.dt-td-actions:focus-within,.dt-sticky-actions td.dt-td-actions:has(.mm-dropdown){z-index:2}.dt-sticky-actions tbody tr:hover td.dt-td-actions{background:#f8fafc}.dt-sticky-actions tbody tr.dt-row-selected td.dt-td-actions{background:#eff6ff}.dt-sticky-actions tbody tr.dt-row-selected:hover td.dt-td-actions{background:#dbeafe}.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:#64748b}.dt-link{position:relative;display:inline-block;max-width:100%;padding:1px 2px;vertical-align:bottom;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#2563eb;text-decoration:none;border-radius:3px;cursor:pointer}.dt-link:hover{text-decoration:underline;color:#1d4ed8}.dt-link:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px;text-decoration:underline}.dt-card-detail-value .dt-link,.dt-card-name .dt-link{white-space:normal;overflow-wrap:anywhere}.dt-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.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-cell-star{margin-right:6px}.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-th-grip{width:36px;padding:0!important;border-right:1px solid #e2e8f0;background:#f8fafc}.dt-td-grip{width:36px;padding:0!important;text-align:center!important;border-right:1px solid #f1f5f9}.dt-grip{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#64748b;cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.dt-grip:hover{background:#f1f5f9;color:#334155}.dt-grip:active{cursor:grabbing}.dt-grip:focus-visible{outline:2px solid #3b82f6;outline-offset:1px}.dt-grip-off{color:#cbd5e1;cursor:not-allowed}.dt-grip-off:hover{background:none;color:#cbd5e1}.dt-row-move{display:none}@media(pointer:coarse){.dt-grip{display:none}.dt-row-move{display:inline-flex;flex-direction:column;align-items:center}.dt-th-grip,.dt-td-grip{width:56px}}.dt-row-dragging{opacity:.45}.dt-row-over-before>td{box-shadow:inset 0 2px #3b82f6}.dt-row-over-after>td{box-shadow:inset 0 -2px #3b82f6}.dt-card-move{display:inline-flex;align-items:center;gap:2px;flex-shrink:0}@media(forced-colors:active){.dt-row-over-before>td{box-shadow:inset 0 2px 0 Highlight}.dt-row-over-after>td{box-shadow:inset 0 -2px 0 Highlight}.dt-grip:focus-visible{outline-color:Highlight}}.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:820px){.dt-header-left{flex-basis:100%}.dt-header-right{flex-basis:100%;justify-content:flex-start}}@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;flex-wrap:nowrap;flex-shrink:0;align-items:stretch}.dt-header-left,.dt-header-right{width:100%;flex-basis:auto}.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 1 100%}.dt-bulk-actions{flex:1 1 auto;width:auto}.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;--ui-pagination-bg: #f8fafc}.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:#475569;flex-shrink:0}.dt-phone-sort-select{flex:1;min-width:0;min-height:44px;box-sizing:border-box;padding:0 36px 0 12px;font-family:inherit;font-size:1rem;color:#1e293b;border:1px solid #7c8ba1;border-radius:8px;-webkit-appearance:none;appearance:none;background:#fff url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M1 1.5l5 5 5-5'/%3E%3C/svg%3E\") no-repeat right 12px center}.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;overflow-wrap:anywhere;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;line-clamp:3}.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}@media(prefers-reduced-motion:reduce){.dt-sk-shimmer:after,.dt-sk-cell:after{animation:none;transform:none;opacity:0}.dt-tag-tooltip{animation:none}.dt-sort-icon{transition:none}}\n"],
13692
13704
  dependencies: [
13693
13705
  {
13694
13706
  kind: "directive",
@@ -14533,7 +14545,8 @@ i0.ɵɵngDeclareClassMetadata({
14533
14545
  }
14534
14546
  </div>
14535
14547
  }
14536
- <div class="dt-card-list" role="list" [attr.aria-label]="tableLabel()">
14548
+ <!-- role=list only while it holds listitems (cards or skeleton cards); empty / error / no-match states are not an empty list -->
14549
+ <div class="dt-card-list" [attr.role]="_cardListHasItems() ? 'list' : null" [attr.aria-label]="_cardListHasItems() ? tableLabel() : null">
14537
14550
 
14538
14551
  @if (_loading()) {
14539
14552
  @for (_ of skeletonRows(); track $index) {
@@ -14617,7 +14630,7 @@ i0.ɵɵngDeclareClassMetadata({
14617
14630
  @if (tc.starFn?.(item); as starTip) {
14618
14631
  <ui-star class="dt-cell-star" [tooltip]="starTip" />
14619
14632
  }
14620
- {{ tc.render ? tc.render(item) : (item[tc.key] ?? '—') }}
14633
+ {{ tc.render ? tc.render(item) : cardCellText(tc, item) }}
14621
14634
  </span>
14622
14635
  }
14623
14636
  }
@@ -14760,7 +14773,7 @@ i0.ɵɵngDeclareClassMetadata({
14760
14773
  }
14761
14774
  </div>
14762
14775
  `,
14763
- 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-title{margin:0;font-size:.8125rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:#64748b;overflow-wrap:anywhere}.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-sticky-actions th.dt-th-actions,.dt-sticky-actions td.dt-td-actions{position:sticky;right:0;box-shadow:-1px 0 #e2e8f0}.dt-sticky-actions th.dt-th-actions{z-index:3;background:#f8fafc}.dt-sticky-actions td.dt-td-actions{z-index:1;background:#fff}.dt-sticky-actions td.dt-td-actions:focus-within,.dt-sticky-actions td.dt-td-actions:has(.mm-dropdown){z-index:2}.dt-sticky-actions tbody tr:hover td.dt-td-actions{background:#f8fafc}.dt-sticky-actions tbody tr.dt-row-selected td.dt-td-actions{background:#eff6ff}.dt-sticky-actions tbody tr.dt-row-selected:hover td.dt-td-actions{background:#dbeafe}.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-link{position:relative;display:inline-block;max-width:100%;padding:1px 2px;vertical-align:bottom;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#2563eb;text-decoration:none;border-radius:3px;cursor:pointer}.dt-link:hover{text-decoration:underline;color:#1d4ed8}.dt-link:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px;text-decoration:underline}.dt-card-detail-value .dt-link,.dt-card-name .dt-link{white-space:normal;overflow-wrap:anywhere}.dt-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.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-cell-star{margin-right:6px}.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-th-grip{width:36px;padding:0!important;border-right:1px solid #e2e8f0;background:#f8fafc}.dt-td-grip{width:36px;padding:0!important;text-align:center!important;border-right:1px solid #f1f5f9}.dt-grip{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#64748b;cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.dt-grip:hover{background:#f1f5f9;color:#334155}.dt-grip:active{cursor:grabbing}.dt-grip:focus-visible{outline:2px solid #3b82f6;outline-offset:1px}.dt-grip-off{color:#cbd5e1;cursor:not-allowed}.dt-grip-off:hover{background:none;color:#cbd5e1}.dt-row-move{display:none}@media(pointer:coarse){.dt-grip{display:none}.dt-row-move{display:inline-flex;flex-direction:column;align-items:center}.dt-th-grip,.dt-td-grip{width:56px}}.dt-row-dragging{opacity:.45}.dt-row-over-before>td{box-shadow:inset 0 2px #3b82f6}.dt-row-over-after>td{box-shadow:inset 0 -2px #3b82f6}.dt-card-move{display:inline-flex;align-items:center;gap:2px;flex-shrink:0}@media(forced-colors:active){.dt-row-over-before>td{box-shadow:inset 0 2px 0 Highlight}.dt-row-over-after>td{box-shadow:inset 0 -2px 0 Highlight}.dt-grip:focus-visible{outline-color:Highlight}}.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:820px){.dt-header-left{flex-basis:100%}.dt-header-right{flex-basis:100%;justify-content:flex-start}}@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;flex-wrap:nowrap;flex-shrink:0;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 1 100%}.dt-bulk-actions{flex:1 1 auto;width:auto}.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;--ui-pagination-bg: #f8fafc}.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 36px 0 12px;font-family:inherit;font-size:1rem;color:#1e293b;border:1px solid #7c8ba1;border-radius:8px;-webkit-appearance:none;appearance:none;background:#fff url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M1 1.5l5 5 5-5'/%3E%3C/svg%3E\") no-repeat right 12px center}.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;overflow-wrap:anywhere;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;line-clamp:3}.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}@media(prefers-reduced-motion:reduce){.dt-sk-shimmer:after,.dt-sk-cell:after{animation:none;transform:none;opacity:0}.dt-tag-tooltip{animation:none}.dt-sort-icon{transition:none}}\n"]
14776
+ 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-title{margin:0;font-size:.8125rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:#64748b;overflow-wrap:anywhere}.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-sticky-actions th.dt-th-actions,.dt-sticky-actions td.dt-td-actions{position:sticky;right:0;box-shadow:-1px 0 #e2e8f0}.dt-sticky-actions th.dt-th-actions{z-index:3;background:#f8fafc}.dt-sticky-actions td.dt-td-actions{z-index:1;background:#fff}.dt-sticky-actions td.dt-td-actions:focus-within,.dt-sticky-actions td.dt-td-actions:has(.mm-dropdown){z-index:2}.dt-sticky-actions tbody tr:hover td.dt-td-actions{background:#f8fafc}.dt-sticky-actions tbody tr.dt-row-selected td.dt-td-actions{background:#eff6ff}.dt-sticky-actions tbody tr.dt-row-selected:hover td.dt-td-actions{background:#dbeafe}.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:#64748b}.dt-link{position:relative;display:inline-block;max-width:100%;padding:1px 2px;vertical-align:bottom;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#2563eb;text-decoration:none;border-radius:3px;cursor:pointer}.dt-link:hover{text-decoration:underline;color:#1d4ed8}.dt-link:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px;text-decoration:underline}.dt-card-detail-value .dt-link,.dt-card-name .dt-link{white-space:normal;overflow-wrap:anywhere}.dt-sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.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-cell-star{margin-right:6px}.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-th-grip{width:36px;padding:0!important;border-right:1px solid #e2e8f0;background:#f8fafc}.dt-td-grip{width:36px;padding:0!important;text-align:center!important;border-right:1px solid #f1f5f9}.dt-grip{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:6px;color:#64748b;cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.dt-grip:hover{background:#f1f5f9;color:#334155}.dt-grip:active{cursor:grabbing}.dt-grip:focus-visible{outline:2px solid #3b82f6;outline-offset:1px}.dt-grip-off{color:#cbd5e1;cursor:not-allowed}.dt-grip-off:hover{background:none;color:#cbd5e1}.dt-row-move{display:none}@media(pointer:coarse){.dt-grip{display:none}.dt-row-move{display:inline-flex;flex-direction:column;align-items:center}.dt-th-grip,.dt-td-grip{width:56px}}.dt-row-dragging{opacity:.45}.dt-row-over-before>td{box-shadow:inset 0 2px #3b82f6}.dt-row-over-after>td{box-shadow:inset 0 -2px #3b82f6}.dt-card-move{display:inline-flex;align-items:center;gap:2px;flex-shrink:0}@media(forced-colors:active){.dt-row-over-before>td{box-shadow:inset 0 2px 0 Highlight}.dt-row-over-after>td{box-shadow:inset 0 -2px 0 Highlight}.dt-grip:focus-visible{outline-color:Highlight}}.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:820px){.dt-header-left{flex-basis:100%}.dt-header-right{flex-basis:100%;justify-content:flex-start}}@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;flex-wrap:nowrap;flex-shrink:0;align-items:stretch}.dt-header-left,.dt-header-right{width:100%;flex-basis:auto}.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 1 100%}.dt-bulk-actions{flex:1 1 auto;width:auto}.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;--ui-pagination-bg: #f8fafc}.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:#475569;flex-shrink:0}.dt-phone-sort-select{flex:1;min-width:0;min-height:44px;box-sizing:border-box;padding:0 36px 0 12px;font-family:inherit;font-size:1rem;color:#1e293b;border:1px solid #7c8ba1;border-radius:8px;-webkit-appearance:none;appearance:none;background:#fff url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M1 1.5l5 5 5-5'/%3E%3C/svg%3E\") no-repeat right 12px center}.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;overflow-wrap:anywhere;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;line-clamp:3}.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}@media(prefers-reduced-motion:reduce){.dt-sk-shimmer:after,.dt-sk-cell:after{animation:none;transform:none;opacity:0}.dt-tag-tooltip{animation:none}.dt-sort-icon{transition:none}}\n"]
14764
14777
  }]
14765
14778
  }],
14766
14779
  ctorParameters: () => [],
@@ -26808,6 +26821,7 @@ var DropdownComponent = class DropdownComponent {
26808
26821
  this._typeahead = "";
26809
26822
  this._typeaheadTimer = null;
26810
26823
  this._destroyed = false;
26824
+ this._loadToken = 0;
26811
26825
  this.triggerId = `ui-dd-trigger-${this._id}`;
26812
26826
  this.menuId = `ui-dd-menu-${this._id}`;
26813
26827
  this._ariaLabel = computed(() => this.ariaLabel().trim() || null, ...ngDevMode ? [{ debugName: "_ariaLabel" }] : /* istanbul ignore next */ []);
@@ -26815,29 +26829,39 @@ var DropdownComponent = class DropdownComponent {
26815
26829
  inject(DestroyRef).onDestroy(() => {
26816
26830
  this._destroyed = true;
26817
26831
  if (this._typeaheadTimer) clearTimeout(this._typeaheadTimer);
26832
+ if (_activeDropdownId() === this._id) _activeDropdownId.set("");
26818
26833
  });
26819
26834
  effect(() => {
26820
- if (_activeDropdownId() !== this._id) untracked(() => {
26821
- if (this.open()) this.open.set(false);
26822
- });
26835
+ if (_activeDropdownId() !== this._id) untracked(() => this.close());
26823
26836
  });
26824
26837
  effect(() => {
26825
26838
  const isOpen = this.open();
26826
26839
  const loader = this.loader();
26827
26840
  if (!loader) return;
26828
26841
  if (isOpen && untracked(() => this._loaded()) === null) {
26842
+ const token = ++this._loadToken;
26829
26843
  this.loading.set(true);
26830
- loader().then((items) => {
26844
+ const done = (items) => {
26845
+ if (this._destroyed || token !== this._loadToken) return;
26831
26846
  this._loaded.set(items);
26832
26847
  this.loading.set(false);
26833
- if (!this._destroyed && this._pendingFocus && this.open()) this._focusPending();
26834
- });
26835
- } else if (!isOpen) this._loaded.set(null);
26848
+ if (this.open()) {
26849
+ afterNextRender(() => this._place(), { injector: this._injector });
26850
+ if (this._pendingFocus) this._focusPending();
26851
+ }
26852
+ };
26853
+ new Promise((resolve) => resolve(loader())).then(done, () => done([]));
26854
+ } else if (!isOpen) {
26855
+ this._loadToken++;
26856
+ this.loading.set(false);
26857
+ this._loaded.set(null);
26858
+ }
26836
26859
  });
26837
26860
  }
26838
26861
  toggle(event) {
26839
26862
  event.stopPropagation();
26840
26863
  this._setOpen(!this.open());
26864
+ this._focusTrigger();
26841
26865
  }
26842
26866
  select(item) {
26843
26867
  if (item.disabled) return;
@@ -27104,18 +27128,18 @@ var DropdownComponent = class DropdownComponent {
27104
27128
  template: `
27105
27129
  <div class="dd-wrapper">
27106
27130
  @if (variant() === 'badge') {
27107
- <button class="dd-trigger dd-trigger-badge" [class.dd-active]="active()" [class.dd-open]="open()" [attr.id]="triggerId" [attr.aria-label]="_ariaLabel()" [attr.aria-expanded]="open()" aria-haspopup="menu" [attr.aria-controls]="open() ? menuId : null" (click)="toggle($event)" (keydown)="onTriggerKeydown($event)" (keyup)="onTriggerKeyup($event)">
27131
+ <button type="button" class="dd-trigger dd-trigger-badge" [class.dd-active]="active()" [class.dd-open]="open()" [attr.id]="triggerId" [attr.aria-label]="_ariaLabel()" [attr.aria-expanded]="open()" aria-haspopup="menu" [attr.aria-controls]="open() ? menuId : null" (click)="toggle($event)" (keydown)="onTriggerKeydown($event)" (keyup)="onTriggerKeyup($event)">
27108
27132
  <span class="dd-text">{{ label() }}</span>
27109
27133
  <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>
27110
27134
  </button>
27111
27135
  } @else {
27112
- <button class="dd-trigger dd-trigger-btn" [class.dd-trigger-md]="size() === 'md'" [class.dd-active]="active()" [class.dd-open]="open()" [attr.id]="triggerId" [attr.aria-label]="_ariaLabel()" [attr.aria-expanded]="open()" aria-haspopup="menu" [attr.aria-controls]="open() ? menuId : null" (click)="toggle($event)" (keydown)="onTriggerKeydown($event)" (keyup)="onTriggerKeyup($event)">
27136
+ <button type="button" class="dd-trigger dd-trigger-btn" [class.dd-trigger-md]="size() === 'md'" [class.dd-active]="active()" [class.dd-open]="open()" [attr.id]="triggerId" [attr.aria-label]="_ariaLabel()" [attr.aria-expanded]="open()" aria-haspopup="menu" [attr.aria-controls]="open() ? menuId : null" (click)="toggle($event)" (keydown)="onTriggerKeydown($event)" (keyup)="onTriggerKeyup($event)">
27113
27137
  <span class="dd-text">{{ label() }}</span>
27114
27138
  <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>
27115
27139
  </button>
27116
27140
  }
27117
27141
  @if (open()) {
27118
- <div class="dd-menu" role="menu" [attr.id]="menuId" [attr.aria-label]="_ariaLabel()" [attr.aria-labelledby]="_ariaLabel() ? null : triggerId" [style.min-width]="menuWidth()" [class.dd-menu-end]="alignEnd()" [class.dd-menu-up]="openUp()" [style.max-height.px]="menuMaxHeight()" (click)="$event.stopPropagation()" (keydown)="onMenuKeydown($event)">
27142
+ <div class="dd-menu" role="menu" [attr.id]="menuId" [attr.aria-label]="_ariaLabel()" [attr.aria-labelledby]="_ariaLabel() ? null : triggerId" [style.min-width]="menuWidth()" [class.dd-menu-end]="alignEnd()" [class.dd-menu-up]="openUp()" [style.max-height.px]="menuMaxHeight()" [attr.aria-busy]="loading() ? 'true' : null" (click)="$event.stopPropagation()" (keydown)="onMenuKeydown($event)">
27119
27143
  @if (loading()) {
27120
27144
  <div class="dd-loading">
27121
27145
  <span class="dd-spinner"></span>
@@ -27123,7 +27147,7 @@ var DropdownComponent = class DropdownComponent {
27123
27147
  </div>
27124
27148
  } @else {
27125
27149
  @for (item of displayItems(); track item.value) {
27126
- <button type="button" class="dd-item" role="menuitem" tabindex="-1" [disabled]="item.disabled === true" [class.dd-item-active]="activeValue() === item.value" (click)="select(item)">
27150
+ <button type="button" class="dd-item" role="menuitem" tabindex="-1" [disabled]="item.disabled === true" [class.dd-item-active]="activeValue() === item.value" [attr.aria-current]="activeValue() === item.value ? 'true' : null" (click)="select(item)">
27127
27151
  @if (item.icon) {
27128
27152
  <svg class="dd-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path [attr.d]="item.icon" /></svg>
27129
27153
  }
@@ -27164,18 +27188,18 @@ i0.ɵɵngDeclareClassMetadata({
27164
27188
  template: `
27165
27189
  <div class="dd-wrapper">
27166
27190
  @if (variant() === 'badge') {
27167
- <button class="dd-trigger dd-trigger-badge" [class.dd-active]="active()" [class.dd-open]="open()" [attr.id]="triggerId" [attr.aria-label]="_ariaLabel()" [attr.aria-expanded]="open()" aria-haspopup="menu" [attr.aria-controls]="open() ? menuId : null" (click)="toggle($event)" (keydown)="onTriggerKeydown($event)" (keyup)="onTriggerKeyup($event)">
27191
+ <button type="button" class="dd-trigger dd-trigger-badge" [class.dd-active]="active()" [class.dd-open]="open()" [attr.id]="triggerId" [attr.aria-label]="_ariaLabel()" [attr.aria-expanded]="open()" aria-haspopup="menu" [attr.aria-controls]="open() ? menuId : null" (click)="toggle($event)" (keydown)="onTriggerKeydown($event)" (keyup)="onTriggerKeyup($event)">
27168
27192
  <span class="dd-text">{{ label() }}</span>
27169
27193
  <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>
27170
27194
  </button>
27171
27195
  } @else {
27172
- <button class="dd-trigger dd-trigger-btn" [class.dd-trigger-md]="size() === 'md'" [class.dd-active]="active()" [class.dd-open]="open()" [attr.id]="triggerId" [attr.aria-label]="_ariaLabel()" [attr.aria-expanded]="open()" aria-haspopup="menu" [attr.aria-controls]="open() ? menuId : null" (click)="toggle($event)" (keydown)="onTriggerKeydown($event)" (keyup)="onTriggerKeyup($event)">
27196
+ <button type="button" class="dd-trigger dd-trigger-btn" [class.dd-trigger-md]="size() === 'md'" [class.dd-active]="active()" [class.dd-open]="open()" [attr.id]="triggerId" [attr.aria-label]="_ariaLabel()" [attr.aria-expanded]="open()" aria-haspopup="menu" [attr.aria-controls]="open() ? menuId : null" (click)="toggle($event)" (keydown)="onTriggerKeydown($event)" (keyup)="onTriggerKeyup($event)">
27173
27197
  <span class="dd-text">{{ label() }}</span>
27174
27198
  <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>
27175
27199
  </button>
27176
27200
  }
27177
27201
  @if (open()) {
27178
- <div class="dd-menu" role="menu" [attr.id]="menuId" [attr.aria-label]="_ariaLabel()" [attr.aria-labelledby]="_ariaLabel() ? null : triggerId" [style.min-width]="menuWidth()" [class.dd-menu-end]="alignEnd()" [class.dd-menu-up]="openUp()" [style.max-height.px]="menuMaxHeight()" (click)="$event.stopPropagation()" (keydown)="onMenuKeydown($event)">
27202
+ <div class="dd-menu" role="menu" [attr.id]="menuId" [attr.aria-label]="_ariaLabel()" [attr.aria-labelledby]="_ariaLabel() ? null : triggerId" [style.min-width]="menuWidth()" [class.dd-menu-end]="alignEnd()" [class.dd-menu-up]="openUp()" [style.max-height.px]="menuMaxHeight()" [attr.aria-busy]="loading() ? 'true' : null" (click)="$event.stopPropagation()" (keydown)="onMenuKeydown($event)">
27179
27203
  @if (loading()) {
27180
27204
  <div class="dd-loading">
27181
27205
  <span class="dd-spinner"></span>
@@ -27183,7 +27207,7 @@ i0.ɵɵngDeclareClassMetadata({
27183
27207
  </div>
27184
27208
  } @else {
27185
27209
  @for (item of displayItems(); track item.value) {
27186
- <button type="button" class="dd-item" role="menuitem" tabindex="-1" [disabled]="item.disabled === true" [class.dd-item-active]="activeValue() === item.value" (click)="select(item)">
27210
+ <button type="button" class="dd-item" role="menuitem" tabindex="-1" [disabled]="item.disabled === true" [class.dd-item-active]="activeValue() === item.value" [attr.aria-current]="activeValue() === item.value ? 'true' : null" (click)="select(item)">
27187
27211
  @if (item.icon) {
27188
27212
  <svg class="dd-icon" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path [attr.d]="item.icon" /></svg>
27189
27213
  }
@@ -31527,11 +31551,13 @@ var PanelInfoListComponent = class PanelInfoListComponent {
31527
31551
  this.displaySections = computed(() => this.showEmptyState() ? this.sections() : this.sections().filter((s) => s.items.some((i) => !i.hidden)), ...ngDevMode ? [{ debugName: "displaySections" }] : /* istanbul ignore next */ []);
31528
31552
  }
31529
31553
  hrefOf(item) {
31530
- let raw = item.href?.trim() ?? "";
31531
- if (!raw && item.email?.trim()) raw = "mailto:" + item.email.trim();
31554
+ let raw = item.href?.replace(/[\u0000-\u001F]/g, "").trim() ?? "";
31555
+ if (!raw && item.email?.trim()) raw = "mailto:" + item.email.trim().replace(/[?#&%\s<>"]/g, (c) => encodeURIComponent(c));
31532
31556
  if (!raw && item.phone?.trim()) {
31533
- const p = item.phone.trim();
31534
- raw = "tel:" + (p.startsWith("+") ? "+" : "") + p.replace(/\D/g, "");
31557
+ const m = /^(.*?)(?:\s*(?:ext\.?|x|#)\s*(\d+))?\s*$/i.exec(item.phone.trim());
31558
+ const num = m[1];
31559
+ const digits = num.replace(/\D/g, "");
31560
+ if (digits) raw = "tel:" + (num.trim().startsWith("+") ? "+" : "") + digits + (m[2] ? ";ext=" + m[2] : "");
31535
31561
  }
31536
31562
  if (!raw) return null;
31537
31563
  const scheme = /^([a-z][a-z0-9+.\-]*):/i.exec(raw.replace(/[\u0000-\u0020]/g, ""));
@@ -31548,6 +31574,12 @@ var PanelInfoListComponent = class PanelInfoListComponent {
31548
31574
  textOf(item) {
31549
31575
  return item.value || item.email || item.phone || item.href || "";
31550
31576
  }
31577
+ valueOf(item) {
31578
+ return item.value?.trim() ? item.value : "—";
31579
+ }
31580
+ runHeaderAction(ha) {
31581
+ if (!ha.disabled) ha.action();
31582
+ }
31551
31583
  visibleItems(section) {
31552
31584
  return section.items.filter((i) => !i.hidden);
31553
31585
  }
@@ -31601,16 +31633,16 @@ var PanelInfoListComponent = class PanelInfoListComponent {
31601
31633
  host: { properties: { "class.pil-fill": "fill()" } },
31602
31634
  ngImport: i0,
31603
31635
  template: `
31604
- @for (section of displaySections(); track section.title ?? $index) {
31636
+ @for (section of displaySections(); track $index) {
31605
31637
  <div class="pil-section">
31606
- @if (section.title || section.headerAction) {
31638
+ @if (section.title || section.headerAction || section.headerLink) {
31607
31639
  <div class="pil-section-label">
31608
31640
  <span>{{ section.title }}</span>
31609
31641
  @if (section.headerLink) {
31610
31642
  <a class="pil-header-link" [routerLink]="section.headerLink.url">{{ section.headerLink.label }}</a>
31611
31643
  }
31612
31644
  @if (section.headerAction; as ha) {
31613
- <ui-button class="pil-header-action" variant="secondary" size="xs" [disabled]="!!ha.disabled" [ariaLabel]="ha.ariaLabel ?? ha.label" (click)="ha.action()">
31645
+ <ui-button class="pil-header-action" variant="secondary" size="xs" [disabled]="!!ha.disabled" [ariaLabel]="ha.ariaLabel ?? ha.label" (click)="runHeaderAction(ha)">
31614
31646
  @if (ha.icon) {
31615
31647
  <svg class="pil-header-action-icon" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path [attr.d]="ha.icon"/></svg>
31616
31648
  }{{ ha.label }}</ui-button>
@@ -31621,62 +31653,69 @@ var PanelInfoListComponent = class PanelInfoListComponent {
31621
31653
  <ui-empty-state message="No information available." />
31622
31654
  } @else if (section.columns === 2) {
31623
31655
  <div class="pil-grid-2">
31624
- @for (item of visibleItems(section); track item.label) {
31656
+ @for (item of visibleItems(section); track $index) {
31625
31657
  <div class="pil-grid-cell" [class.pil-strong]="item.emphasis">
31626
31658
  <span class="pil-label">{{ item.label }}{{ labelColon() ? ':' : '' }}</span>{{ labelColon() ? ' ' : '' }}
31627
31659
  <span class="pil-value pil-value--block">
31628
- @if (item.badge) {
31629
- <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" />
31630
- } @else if (hrefOf(item); as h) {
31631
- <a class="pil-link pil-link--href" [attr.href]="h" [attr.target]="isWeb(h) ? '_blank' : null" [attr.rel]="isWeb(h) ? 'noopener noreferrer' : null">{{ textOf(item) }}</a>
31632
- } @else {
31633
- <span [class.pil-muted]="item.muted" [class.pil-danger]="item.danger" [class.pil-multiline]="item.multiline">{{ item.value || '—' }}</span>
31634
- }
31660
+ <ng-container *ngTemplateOutlet="valueTpl; context: { $implicit: item }" />
31635
31661
  </span>
31636
31662
  </div>
31637
31663
  }
31638
31664
  </div>
31639
31665
  } @else {
31640
- @for (item of visibleItems(section); track item.label) {
31666
+ @for (item of visibleItems(section); track $index) {
31641
31667
  <div class="pil-row" [class.pil-row--inline]="labelColon()" [class.pil-strong]="item.emphasis">
31642
31668
  <span class="pil-label">{{ item.label }}{{ labelColon() ? ':' : '' }}</span>{{ labelColon() ? ' ' : '' }}
31643
31669
  <span class="pil-value">
31644
- @if (item.badges) {
31645
- <span class="pil-badges">
31646
- @for (b of item.badges; track b.label) {
31647
- <ui-badge [label]="b.label" [variant]="b.variant" />
31648
- }
31649
- </span>
31650
- } @else if (item.badge) {
31651
- <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" />
31652
- } @else if (hrefOf(item); as h) {
31653
- <a class="pil-link pil-link--href" [attr.href]="h" [attr.target]="isWeb(h) ? '_blank' : null" [attr.rel]="isWeb(h) ? 'noopener noreferrer' : null">{{ textOf(item) }}</a>
31654
- } @else if (item.link && item.value && item.linkIcon) {
31655
- <a class="pil-link-icon" [routerLink]="item.link">
31656
- {{ item.value }}
31657
- <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>
31658
- </a>
31659
- } @else if (item.link && item.value) {
31660
- <a class="pil-link" [routerLink]="item.link">{{ item.value }}</a>
31661
- } @else {
31662
- <span [class.pil-muted]="item.muted" [class.pil-danger]="item.danger" [class.pil-multiline]="item.multiline">{{ item.value || '—' }}</span>
31663
- }
31664
- @if (item.editAction) {
31665
- <ui-icon class="pil-edit-btn" name="edit" [size]="14" [tooltip]="item.editTooltip ?? 'Edit'" (iconClick)="item.editAction!()" />
31666
- }
31667
- @if (item.deleteAction) {
31668
- <ui-icon class="pil-edit-btn" name="delete" variant="danger" [size]="14" [tooltip]="item.deleteTooltip ?? 'Delete'" (iconClick)="item.deleteAction!()" />
31669
- }
31670
+ <ng-container *ngTemplateOutlet="valueTpl; context: { $implicit: item }" />
31670
31671
  </span>
31671
31672
  </div>
31672
31673
  }
31673
31674
  }
31674
31675
  </div>
31675
31676
  }
31677
+ <ng-template #valueTpl let-item>
31678
+ @if (item.badges) {
31679
+ <span class="pil-badges">
31680
+ @for (b of item.badges; track $index) {
31681
+ <ui-badge [label]="b.label" [variant]="b.variant" />
31682
+ }
31683
+ </span>
31684
+ } @else if (item.badge) {
31685
+ <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" />
31686
+ } @else if (hrefOf(item); as h) {
31687
+ <a class="pil-link pil-link--href" [attr.href]="h" [attr.target]="isWeb(h) ? '_blank' : null" [attr.rel]="isWeb(h) ? 'noopener noreferrer' : null">{{ textOf(item) }}</a>
31688
+ } @else if (item.link && item.value && item.linkIcon) {
31689
+ <a class="pil-link-icon" [routerLink]="item.link">
31690
+ {{ item.value }}
31691
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true" focusable="false"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>
31692
+ </a>
31693
+ } @else if (item.link && item.value) {
31694
+ <a class="pil-link" [routerLink]="item.link">{{ item.value }}</a>
31695
+ } @else {
31696
+ <span [class.pil-muted]="item.muted" [class.pil-danger]="item.danger" [class.pil-multiline]="item.multiline">{{ valueOf(item) }}</span>
31697
+ }
31698
+ @if (item.editAction) {
31699
+ <ui-icon class="pil-edit-btn" name="edit" [size]="14" [tooltip]="item.editTooltip ?? 'Edit'" (iconClick)="item.editAction()" />
31700
+ }
31701
+ @if (item.deleteAction) {
31702
+ <ui-icon class="pil-edit-btn" name="delete" variant="danger" [size]="14" [tooltip]="item.deleteTooltip ?? 'Delete'" (iconClick)="item.deleteAction()" />
31703
+ }
31704
+ </ng-template>
31676
31705
  `,
31677
31706
  isInline: true,
31678
- styles: [":host{display:flex;flex-direction:column;gap:12px}:host(.pil-fill){flex:1;min-height:0}:host(.pil-fill) .pil-section{flex:1}.pil-section{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.pil-section-label{display:flex;justify-content:space-between;align-items:center;font-size:.6875rem;font-weight:700;letter-spacing:.07em;color:#94a3b8;text-transform:uppercase;padding:8px 14px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.pil-header-action{text-transform:none;letter-spacing:0;margin:-4px 0;flex-shrink:0}.pil-header-action-icon{margin-right:6px;vertical-align:-2px;flex-shrink:0}.pil-header-link{font-size:.75rem;font-weight:500;color:#2563eb;text-decoration:none;text-transform:none;letter-spacing:0}.pil-header-link:hover{text-decoration:underline}.pil-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:9px 14px;border-bottom:1px solid #f1f5f9}.pil-row:last-child{border-bottom:none}.pil-row--inline{justify-content:flex-start}.pil-row--inline .pil-value{text-align:left;justify-content:flex-start;flex-wrap:wrap;min-width:0;overflow-wrap:anywhere;word-break:break-word}.pil-label{font-size:.8125rem;color:#64748b;flex-shrink:0}.pil-value{font-size:.875rem;font-weight:500;color:#1e293b;text-align:right;display:flex;align-items:center;justify-content:flex-end}.pil-multiline{white-space:pre-line;overflow-wrap:anywhere;word-break:break-word}.pil-strong .pil-label,.pil-strong .pil-value,.pil-strong .pil-muted{font-weight:700;color:#0f172a}.pil-badges{display:flex;align-items:center;gap:4px;flex-wrap:wrap;justify-content:flex-end}.pil-edit-btn{margin-left:4px;flex-shrink:0}ui-empty-state{padding:12px 0}.pil-muted{color:#1e293b;font-weight:400}.pil-danger{color:#ef4444;font-weight:600}.pil-link{font-size:.875rem;font-weight:500;color:#2563eb;text-decoration:none}.pil-link:hover{text-decoration:underline}.pil-link,.pil-link-icon,.pil-header-link{position:relative}@media(pointer:coarse),(max-width:480px){.pil-link:after,.pil-link-icon:after,.pil-header-link:after{content:\"\";position:absolute;inset:-14px -4px}}.pil-link--href{overflow-wrap:anywhere;word-break:break-word}.pil-link:focus-visible,.pil-header-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:2px}.pil-link-icon{display:inline-flex;align-items:center;gap:5px;font-size:.875rem;font-weight:500;color:#1e293b;text-decoration:none}.pil-link-icon svg{color:#94a3b8;flex-shrink:0}.pil-grid-2{display:grid;grid-template-columns:1fr 1fr}.pil-grid-cell{display:flex;flex-direction:column;gap:3px;padding:10px 14px;border-right:1px solid #f1f5f9}.pil-grid-cell:last-child{border-right:none}.pil-value--block{text-align:left;justify-content:flex-start}\n"],
31707
+ styles: [":host{display:flex;flex-direction:column;gap:12px}:host(.pil-fill){flex:1;min-height:0}:host(.pil-fill) .pil-section{flex:1}.pil-section{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.pil-section-label{display:flex;justify-content:space-between;align-items:center;font-size:.6875rem;font-weight:700;letter-spacing:.07em;color:#64748b;text-transform:uppercase;padding:8px 14px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.pil-header-action{text-transform:none;letter-spacing:0;margin:-4px 0;flex-shrink:0}.pil-header-action-icon{margin-right:6px;vertical-align:-2px;flex-shrink:0}.pil-header-link{font-size:.75rem;font-weight:500;color:#2563eb;text-decoration:none;text-transform:none;letter-spacing:0}.pil-header-link:hover{text-decoration:underline}.pil-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:9px 14px;border-bottom:1px solid #f1f5f9}.pil-row:last-child{border-bottom:none}.pil-row--inline{justify-content:flex-start}.pil-row--inline .pil-value{text-align:left;justify-content:flex-start;flex-wrap:wrap;min-width:0;overflow-wrap:anywhere;word-break:break-word}.pil-label{font-size:.8125rem;color:#64748b;flex-shrink:0}.pil-value{font-size:.875rem;font-weight:500;color:#1e293b;text-align:right;display:flex;align-items:center;justify-content:flex-end;min-width:0;overflow-wrap:anywhere;word-break:break-word}.pil-multiline{white-space:pre-line;overflow-wrap:anywhere;word-break:break-word}.pil-strong .pil-label,.pil-strong .pil-value,.pil-strong .pil-muted{font-weight:700;color:#0f172a}.pil-badges{display:flex;align-items:center;gap:4px;flex-wrap:wrap;justify-content:flex-end}.pil-edit-btn{margin-left:4px;flex-shrink:0}ui-empty-state{padding:12px 0}.pil-muted{color:#1e293b;font-weight:400}.pil-danger{color:#ef4444;font-weight:600}.pil-link{font-size:.875rem;font-weight:500;color:#2563eb;text-decoration:none}.pil-link:hover{text-decoration:underline}.pil-link,.pil-link-icon,.pil-header-link{position:relative}@media(pointer:coarse),(max-width:480px){.pil-link:after,.pil-link-icon:after,.pil-header-link:after{content:\"\";position:absolute;inset:-14px -4px}}.pil-link--href{overflow-wrap:anywhere;word-break:break-word}.pil-link:focus-visible,.pil-link-icon:focus-visible,.pil-header-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:2px}.pil-link-icon{display:inline-flex;align-items:center;gap:5px;font-size:.875rem;font-weight:500;color:#1e293b;text-decoration:none}.pil-link-icon svg{color:#94a3b8;flex-shrink:0}.pil-grid-2{display:grid;grid-template-columns:1fr 1fr}.pil-grid-cell{display:flex;flex-direction:column;gap:3px;padding:10px 14px;min-width:0;border-right:1px solid #f1f5f9}.pil-grid-cell:last-child{border-right:none}.pil-grid-cell:nth-child(2n){border-right:none}@media(max-width:480px){.pil-grid-2{grid-template-columns:1fr}.pil-grid-cell{border-right:none;border-bottom:1px solid #f1f5f9}.pil-grid-cell:last-child{border-bottom:none}}.pil-value--block{text-align:left;justify-content:flex-start}\n"],
31679
31708
  dependencies: [
31709
+ {
31710
+ kind: "directive",
31711
+ type: NgTemplateOutlet,
31712
+ selector: "[ngTemplateOutlet]",
31713
+ inputs: [
31714
+ "ngTemplateOutletContext",
31715
+ "ngTemplateOutlet",
31716
+ "ngTemplateOutletInjector"
31717
+ ]
31718
+ },
31680
31719
  {
31681
31720
  kind: "component",
31682
31721
  type: BadgeComponent,
@@ -31775,6 +31814,7 @@ i0.ɵɵngDeclareClassMetadata({
31775
31814
  standalone: true,
31776
31815
  changeDetection: ChangeDetectionStrategy.OnPush,
31777
31816
  imports: [
31817
+ NgTemplateOutlet,
31778
31818
  BadgeComponent,
31779
31819
  ButtonComponent,
31780
31820
  RouterLink,
@@ -31783,16 +31823,16 @@ i0.ɵɵngDeclareClassMetadata({
31783
31823
  ],
31784
31824
  host: { "[class.pil-fill]": "fill()" },
31785
31825
  template: `
31786
- @for (section of displaySections(); track section.title ?? $index) {
31826
+ @for (section of displaySections(); track $index) {
31787
31827
  <div class="pil-section">
31788
- @if (section.title || section.headerAction) {
31828
+ @if (section.title || section.headerAction || section.headerLink) {
31789
31829
  <div class="pil-section-label">
31790
31830
  <span>{{ section.title }}</span>
31791
31831
  @if (section.headerLink) {
31792
31832
  <a class="pil-header-link" [routerLink]="section.headerLink.url">{{ section.headerLink.label }}</a>
31793
31833
  }
31794
31834
  @if (section.headerAction; as ha) {
31795
- <ui-button class="pil-header-action" variant="secondary" size="xs" [disabled]="!!ha.disabled" [ariaLabel]="ha.ariaLabel ?? ha.label" (click)="ha.action()">
31835
+ <ui-button class="pil-header-action" variant="secondary" size="xs" [disabled]="!!ha.disabled" [ariaLabel]="ha.ariaLabel ?? ha.label" (click)="runHeaderAction(ha)">
31796
31836
  @if (ha.icon) {
31797
31837
  <svg class="pil-header-action-icon" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path [attr.d]="ha.icon"/></svg>
31798
31838
  }{{ ha.label }}</ui-button>
@@ -31803,60 +31843,57 @@ i0.ɵɵngDeclareClassMetadata({
31803
31843
  <ui-empty-state message="No information available." />
31804
31844
  } @else if (section.columns === 2) {
31805
31845
  <div class="pil-grid-2">
31806
- @for (item of visibleItems(section); track item.label) {
31846
+ @for (item of visibleItems(section); track $index) {
31807
31847
  <div class="pil-grid-cell" [class.pil-strong]="item.emphasis">
31808
31848
  <span class="pil-label">{{ item.label }}{{ labelColon() ? ':' : '' }}</span>{{ labelColon() ? ' ' : '' }}
31809
31849
  <span class="pil-value pil-value--block">
31810
- @if (item.badge) {
31811
- <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" />
31812
- } @else if (hrefOf(item); as h) {
31813
- <a class="pil-link pil-link--href" [attr.href]="h" [attr.target]="isWeb(h) ? '_blank' : null" [attr.rel]="isWeb(h) ? 'noopener noreferrer' : null">{{ textOf(item) }}</a>
31814
- } @else {
31815
- <span [class.pil-muted]="item.muted" [class.pil-danger]="item.danger" [class.pil-multiline]="item.multiline">{{ item.value || '—' }}</span>
31816
- }
31850
+ <ng-container *ngTemplateOutlet="valueTpl; context: { $implicit: item }" />
31817
31851
  </span>
31818
31852
  </div>
31819
31853
  }
31820
31854
  </div>
31821
31855
  } @else {
31822
- @for (item of visibleItems(section); track item.label) {
31856
+ @for (item of visibleItems(section); track $index) {
31823
31857
  <div class="pil-row" [class.pil-row--inline]="labelColon()" [class.pil-strong]="item.emphasis">
31824
31858
  <span class="pil-label">{{ item.label }}{{ labelColon() ? ':' : '' }}</span>{{ labelColon() ? ' ' : '' }}
31825
31859
  <span class="pil-value">
31826
- @if (item.badges) {
31827
- <span class="pil-badges">
31828
- @for (b of item.badges; track b.label) {
31829
- <ui-badge [label]="b.label" [variant]="b.variant" />
31830
- }
31831
- </span>
31832
- } @else if (item.badge) {
31833
- <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" />
31834
- } @else if (hrefOf(item); as h) {
31835
- <a class="pil-link pil-link--href" [attr.href]="h" [attr.target]="isWeb(h) ? '_blank' : null" [attr.rel]="isWeb(h) ? 'noopener noreferrer' : null">{{ textOf(item) }}</a>
31836
- } @else if (item.link && item.value && item.linkIcon) {
31837
- <a class="pil-link-icon" [routerLink]="item.link">
31838
- {{ item.value }}
31839
- <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>
31840
- </a>
31841
- } @else if (item.link && item.value) {
31842
- <a class="pil-link" [routerLink]="item.link">{{ item.value }}</a>
31843
- } @else {
31844
- <span [class.pil-muted]="item.muted" [class.pil-danger]="item.danger" [class.pil-multiline]="item.multiline">{{ item.value || '—' }}</span>
31845
- }
31846
- @if (item.editAction) {
31847
- <ui-icon class="pil-edit-btn" name="edit" [size]="14" [tooltip]="item.editTooltip ?? 'Edit'" (iconClick)="item.editAction!()" />
31848
- }
31849
- @if (item.deleteAction) {
31850
- <ui-icon class="pil-edit-btn" name="delete" variant="danger" [size]="14" [tooltip]="item.deleteTooltip ?? 'Delete'" (iconClick)="item.deleteAction!()" />
31851
- }
31860
+ <ng-container *ngTemplateOutlet="valueTpl; context: { $implicit: item }" />
31852
31861
  </span>
31853
31862
  </div>
31854
31863
  }
31855
31864
  }
31856
31865
  </div>
31857
31866
  }
31867
+ <ng-template #valueTpl let-item>
31868
+ @if (item.badges) {
31869
+ <span class="pil-badges">
31870
+ @for (b of item.badges; track $index) {
31871
+ <ui-badge [label]="b.label" [variant]="b.variant" />
31872
+ }
31873
+ </span>
31874
+ } @else if (item.badge) {
31875
+ <ui-badge [label]="item.badge.label" [variant]="item.badge.variant" />
31876
+ } @else if (hrefOf(item); as h) {
31877
+ <a class="pil-link pil-link--href" [attr.href]="h" [attr.target]="isWeb(h) ? '_blank' : null" [attr.rel]="isWeb(h) ? 'noopener noreferrer' : null">{{ textOf(item) }}</a>
31878
+ } @else if (item.link && item.value && item.linkIcon) {
31879
+ <a class="pil-link-icon" [routerLink]="item.link">
31880
+ {{ item.value }}
31881
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true" focusable="false"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>
31882
+ </a>
31883
+ } @else if (item.link && item.value) {
31884
+ <a class="pil-link" [routerLink]="item.link">{{ item.value }}</a>
31885
+ } @else {
31886
+ <span [class.pil-muted]="item.muted" [class.pil-danger]="item.danger" [class.pil-multiline]="item.multiline">{{ valueOf(item) }}</span>
31887
+ }
31888
+ @if (item.editAction) {
31889
+ <ui-icon class="pil-edit-btn" name="edit" [size]="14" [tooltip]="item.editTooltip ?? 'Edit'" (iconClick)="item.editAction()" />
31890
+ }
31891
+ @if (item.deleteAction) {
31892
+ <ui-icon class="pil-edit-btn" name="delete" variant="danger" [size]="14" [tooltip]="item.deleteTooltip ?? 'Delete'" (iconClick)="item.deleteAction()" />
31893
+ }
31894
+ </ng-template>
31858
31895
  `,
31859
- styles: [":host{display:flex;flex-direction:column;gap:12px}:host(.pil-fill){flex:1;min-height:0}:host(.pil-fill) .pil-section{flex:1}.pil-section{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.pil-section-label{display:flex;justify-content:space-between;align-items:center;font-size:.6875rem;font-weight:700;letter-spacing:.07em;color:#94a3b8;text-transform:uppercase;padding:8px 14px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.pil-header-action{text-transform:none;letter-spacing:0;margin:-4px 0;flex-shrink:0}.pil-header-action-icon{margin-right:6px;vertical-align:-2px;flex-shrink:0}.pil-header-link{font-size:.75rem;font-weight:500;color:#2563eb;text-decoration:none;text-transform:none;letter-spacing:0}.pil-header-link:hover{text-decoration:underline}.pil-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:9px 14px;border-bottom:1px solid #f1f5f9}.pil-row:last-child{border-bottom:none}.pil-row--inline{justify-content:flex-start}.pil-row--inline .pil-value{text-align:left;justify-content:flex-start;flex-wrap:wrap;min-width:0;overflow-wrap:anywhere;word-break:break-word}.pil-label{font-size:.8125rem;color:#64748b;flex-shrink:0}.pil-value{font-size:.875rem;font-weight:500;color:#1e293b;text-align:right;display:flex;align-items:center;justify-content:flex-end}.pil-multiline{white-space:pre-line;overflow-wrap:anywhere;word-break:break-word}.pil-strong .pil-label,.pil-strong .pil-value,.pil-strong .pil-muted{font-weight:700;color:#0f172a}.pil-badges{display:flex;align-items:center;gap:4px;flex-wrap:wrap;justify-content:flex-end}.pil-edit-btn{margin-left:4px;flex-shrink:0}ui-empty-state{padding:12px 0}.pil-muted{color:#1e293b;font-weight:400}.pil-danger{color:#ef4444;font-weight:600}.pil-link{font-size:.875rem;font-weight:500;color:#2563eb;text-decoration:none}.pil-link:hover{text-decoration:underline}.pil-link,.pil-link-icon,.pil-header-link{position:relative}@media(pointer:coarse),(max-width:480px){.pil-link:after,.pil-link-icon:after,.pil-header-link:after{content:\"\";position:absolute;inset:-14px -4px}}.pil-link--href{overflow-wrap:anywhere;word-break:break-word}.pil-link:focus-visible,.pil-header-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:2px}.pil-link-icon{display:inline-flex;align-items:center;gap:5px;font-size:.875rem;font-weight:500;color:#1e293b;text-decoration:none}.pil-link-icon svg{color:#94a3b8;flex-shrink:0}.pil-grid-2{display:grid;grid-template-columns:1fr 1fr}.pil-grid-cell{display:flex;flex-direction:column;gap:3px;padding:10px 14px;border-right:1px solid #f1f5f9}.pil-grid-cell:last-child{border-right:none}.pil-value--block{text-align:left;justify-content:flex-start}\n"]
31896
+ styles: [":host{display:flex;flex-direction:column;gap:12px}:host(.pil-fill){flex:1;min-height:0}:host(.pil-fill) .pil-section{flex:1}.pil-section{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.pil-section-label{display:flex;justify-content:space-between;align-items:center;font-size:.6875rem;font-weight:700;letter-spacing:.07em;color:#64748b;text-transform:uppercase;padding:8px 14px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.pil-header-action{text-transform:none;letter-spacing:0;margin:-4px 0;flex-shrink:0}.pil-header-action-icon{margin-right:6px;vertical-align:-2px;flex-shrink:0}.pil-header-link{font-size:.75rem;font-weight:500;color:#2563eb;text-decoration:none;text-transform:none;letter-spacing:0}.pil-header-link:hover{text-decoration:underline}.pil-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:9px 14px;border-bottom:1px solid #f1f5f9}.pil-row:last-child{border-bottom:none}.pil-row--inline{justify-content:flex-start}.pil-row--inline .pil-value{text-align:left;justify-content:flex-start;flex-wrap:wrap;min-width:0;overflow-wrap:anywhere;word-break:break-word}.pil-label{font-size:.8125rem;color:#64748b;flex-shrink:0}.pil-value{font-size:.875rem;font-weight:500;color:#1e293b;text-align:right;display:flex;align-items:center;justify-content:flex-end;min-width:0;overflow-wrap:anywhere;word-break:break-word}.pil-multiline{white-space:pre-line;overflow-wrap:anywhere;word-break:break-word}.pil-strong .pil-label,.pil-strong .pil-value,.pil-strong .pil-muted{font-weight:700;color:#0f172a}.pil-badges{display:flex;align-items:center;gap:4px;flex-wrap:wrap;justify-content:flex-end}.pil-edit-btn{margin-left:4px;flex-shrink:0}ui-empty-state{padding:12px 0}.pil-muted{color:#1e293b;font-weight:400}.pil-danger{color:#ef4444;font-weight:600}.pil-link{font-size:.875rem;font-weight:500;color:#2563eb;text-decoration:none}.pil-link:hover{text-decoration:underline}.pil-link,.pil-link-icon,.pil-header-link{position:relative}@media(pointer:coarse),(max-width:480px){.pil-link:after,.pil-link-icon:after,.pil-header-link:after{content:\"\";position:absolute;inset:-14px -4px}}.pil-link--href{overflow-wrap:anywhere;word-break:break-word}.pil-link:focus-visible,.pil-link-icon:focus-visible,.pil-header-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:2px}.pil-link-icon{display:inline-flex;align-items:center;gap:5px;font-size:.875rem;font-weight:500;color:#1e293b;text-decoration:none}.pil-link-icon svg{color:#94a3b8;flex-shrink:0}.pil-grid-2{display:grid;grid-template-columns:1fr 1fr}.pil-grid-cell{display:flex;flex-direction:column;gap:3px;padding:10px 14px;min-width:0;border-right:1px solid #f1f5f9}.pil-grid-cell:last-child{border-right:none}.pil-grid-cell:nth-child(2n){border-right:none}@media(max-width:480px){.pil-grid-2{grid-template-columns:1fr}.pil-grid-cell{border-right:none;border-bottom:1px solid #f1f5f9}.pil-grid-cell:last-child{border-bottom:none}}.pil-value--block{text-align:left;justify-content:flex-start}\n"]
31860
31897
  }]
31861
31898
  }],
31862
31899
  propDecorators: {
@@ -32280,6 +32317,7 @@ var AppShellComponent = class AppShellComponent {
32280
32317
  this.router = inject(Router);
32281
32318
  this.navGroups = input([], ...ngDevMode ? [{ debugName: "navGroups" }] : /* istanbul ignore next */ []);
32282
32319
  this.pageTitle = input("", ...ngDevMode ? [{ debugName: "pageTitle" }] : /* istanbul ignore next */ []);
32320
+ this.showToast = input(false, ...ngDevMode ? [{ debugName: "showToast" }] : /* istanbul ignore next */ []);
32283
32321
  this.appName = input("App", ...ngDevMode ? [{ debugName: "appName" }] : /* istanbul ignore next */ []);
32284
32322
  this.user = input(null, ...ngDevMode ? [{ debugName: "user" }] : /* istanbul ignore next */ []);
32285
32323
  this.readOnly = input(false, ...ngDevMode ? [{ debugName: "readOnly" }] : /* istanbul ignore next */ []);
@@ -32289,8 +32327,11 @@ var AppShellComponent = class AppShellComponent {
32289
32327
  this.persistKey = input("", ...ngDevMode ? [{ debugName: "persistKey" }] : /* istanbul ignore next */ []);
32290
32328
  this.logoutClick = output();
32291
32329
  this._sidebarOpen = signal(false, ...ngDevMode ? [{ debugName: "_sidebarOpen" }] : /* istanbul ignore next */ []);
32330
+ this._routeTitle = signal("", ...ngDevMode ? [{ debugName: "_routeTitle" }] : /* istanbul ignore next */ []);
32331
+ this._title = computed(() => this.pageTitle() || this._routeTitle(), ...ngDevMode ? [{ debugName: "_title" }] : /* istanbul ignore next */ []);
32292
32332
  this._collapsed = signal(AppShellComponent._loadCollapsed(), ...ngDevMode ? [{ debugName: "_collapsed" }] : /* istanbul ignore next */ []);
32293
- this._isRail = computed(() => this.collapsible() && this._collapsed(), ...ngDevMode ? [{ debugName: "_isRail" }] : /* istanbul ignore next */ []);
32333
+ this._drawerLayout = signal(false, ...ngDevMode ? [{ debugName: "_drawerLayout" }] : /* istanbul ignore next */ []);
32334
+ this._isRail = computed(() => this.collapsible() && this._collapsed() && !this._drawerLayout(), ...ngDevMode ? [{ debugName: "_isRail" }] : /* istanbul ignore next */ []);
32294
32335
  this._collapsedGroups = signal({}, ...ngDevMode ? [{ debugName: "_collapsedGroups" }] : /* istanbul ignore next */ []);
32295
32336
  this._visibleGroups = computed(() => this.navGroups().filter((g) => g.visible !== false), ...ngDevMode ? [{ debugName: "_visibleGroups" }] : /* istanbul ignore next */ []);
32296
32337
  this._userInitials = computed(() => {
@@ -32302,6 +32343,13 @@ var AppShellComponent = class AppShellComponent {
32302
32343
  return [u?.firstName, u?.lastName].filter(Boolean).join(" ");
32303
32344
  }, ...ngDevMode ? [{ debugName: "_userName" }] : /* istanbul ignore next */ []);
32304
32345
  this._iconCache = /* @__PURE__ */ new Map();
32346
+ this._host = inject(ElementRef);
32347
+ this._injector = inject(Injector);
32348
+ this._document = inject(DOCUMENT, { optional: true });
32349
+ this._onDrawerMqChange = (e) => {
32350
+ this._drawerLayout.set(e.matches);
32351
+ if (!e.matches) this._sidebarOpen.set(false);
32352
+ };
32305
32353
  }
32306
32354
  _safeIcon(svg) {
32307
32355
  let safe = this._iconCache.get(svg);
@@ -32314,8 +32362,11 @@ var AppShellComponent = class AppShellComponent {
32314
32362
  _visibleLinks(group) {
32315
32363
  return group.links.filter((l) => l.visible !== false);
32316
32364
  }
32365
+ _canCollapseGroups() {
32366
+ return this._visibleGroups().length > 1;
32367
+ }
32317
32368
  _isCollapsed(key) {
32318
- return !!this._collapsedGroups()[key];
32369
+ return this._canCollapseGroups() && !!this._collapsedGroups()[key];
32319
32370
  }
32320
32371
  toggleGroup(key) {
32321
32372
  const collapsed = !this._collapsedGroups()[key];
@@ -32364,11 +32415,83 @@ var AppShellComponent = class AppShellComponent {
32364
32415
  return false;
32365
32416
  }
32366
32417
  }
32418
+ static {
32419
+ this._DRAWER_MQ = "not all and (min-width: 1025px)";
32420
+ }
32421
+ static {
32422
+ this._FOCUSABLE = "a[href]:not([tabindex=\"-1\"]), button:not([disabled]):not([tabindex=\"-1\"]), input:not([disabled]):not([type=\"hidden\"]):not([tabindex=\"-1\"]), select:not([disabled]):not([tabindex=\"-1\"]), textarea:not([disabled]):not([tabindex=\"-1\"]), [tabindex]:not([tabindex=\"-1\"]), summary:not([tabindex=\"-1\"]), [contenteditable]:not([contenteditable=\"false\"]):not([tabindex=\"-1\"]), iframe:not([tabindex=\"-1\"]), audio[controls]:not([tabindex=\"-1\"]), video[controls]:not([tabindex=\"-1\"])";
32423
+ }
32424
+ _sidebarFocusables() {
32425
+ const aside = this._host.nativeElement.querySelector(".sidebar");
32426
+ return aside ? Array.from(aside.querySelectorAll(AppShellComponent._FOCUSABLE)).filter((el) => !el.hidden && el.getClientRects().length > 0) : [];
32427
+ }
32428
+ _hamburger() {
32429
+ return this._host.nativeElement.querySelector(".hamburger");
32430
+ }
32367
32431
  toggleSidebar() {
32368
- this._sidebarOpen.update((v) => !v);
32432
+ if (this._sidebarOpen()) this.closeSidebar(true);
32433
+ else this.openSidebar();
32434
+ }
32435
+ openSidebar() {
32436
+ if (!this._drawerLayout()) return;
32437
+ this._sidebarOpen.set(true);
32438
+ afterNextRender(() => this._sidebarFocusables()[0]?.focus(), { injector: this._injector });
32369
32439
  }
32370
- closeSidebar() {
32440
+ closeSidebar(returnFocus = false) {
32441
+ const wasOpen = this._sidebarOpen();
32371
32442
  this._sidebarOpen.set(false);
32443
+ if (!wasOpen) return;
32444
+ const active = this._document?.activeElement ?? null;
32445
+ const focusInSidebar = !!active && !!this._host.nativeElement.querySelector(".sidebar")?.contains(active);
32446
+ if (returnFocus) this._hamburger()?.focus();
32447
+ else if (focusInSidebar) this._host.nativeElement.querySelector("#main-content")?.focus();
32448
+ }
32449
+ onShellKeydown(e) {
32450
+ if (e.defaultPrevented || !this._sidebarOpen() || !this._drawerLayout()) return;
32451
+ if (e.key === "Escape") {
32452
+ e.preventDefault();
32453
+ this.closeSidebar(true);
32454
+ return;
32455
+ }
32456
+ if (e.key !== "Tab" || e.ctrlKey || e.altKey || e.metaKey) return;
32457
+ const items = this._sidebarFocusables();
32458
+ if (!items.length) return;
32459
+ const first = items[0];
32460
+ const last = items[items.length - 1];
32461
+ const active = this._document?.activeElement ?? null;
32462
+ const owner = active ? items.find((el) => el === active || el.contains(active)) : void 0;
32463
+ if (owner) {
32464
+ if (e.shiftKey && owner === first) {
32465
+ e.preventDefault();
32466
+ last.focus();
32467
+ } else if (!e.shiftKey && owner === last) {
32468
+ e.preventDefault();
32469
+ first.focus();
32470
+ }
32471
+ return;
32472
+ }
32473
+ const host = active && active.shadowRoot && this._host.nativeElement.querySelector(".sidebar")?.contains(active) ? active : null;
32474
+ if (host) {
32475
+ const inner = Array.from(host.shadowRoot.querySelectorAll(AppShellComponent._FOCUSABLE)).filter((el) => !el.hidden && el.getClientRects().length > 0);
32476
+ const innerActive = host.shadowRoot.activeElement;
32477
+ const atInnerEdge = !innerActive || !inner.length || innerActive === (e.shiftKey ? inner[0] : inner[inner.length - 1]);
32478
+ const afterAll = items.every((el) => !!(el.compareDocumentPosition(host) & Node.DOCUMENT_POSITION_FOLLOWING));
32479
+ const beforeAll = items.every((el) => !!(el.compareDocumentPosition(host) & Node.DOCUMENT_POSITION_PRECEDING));
32480
+ if (atInnerEdge && !e.shiftKey && afterAll) {
32481
+ e.preventDefault();
32482
+ first.focus();
32483
+ } else if (atInnerEdge && e.shiftKey && beforeAll) {
32484
+ e.preventDefault();
32485
+ last.focus();
32486
+ }
32487
+ return;
32488
+ }
32489
+ e.preventDefault();
32490
+ (e.shiftKey ? last : first).focus();
32491
+ }
32492
+ skipToContent(e) {
32493
+ e.preventDefault();
32494
+ this._host.nativeElement.querySelector("#main-content")?.focus();
32372
32495
  }
32373
32496
  ngOnInit() {
32374
32497
  const initial = {};
@@ -32380,13 +32503,31 @@ var AppShellComponent = class AppShellComponent {
32380
32503
  ...this._readSavedGroups()
32381
32504
  });
32382
32505
  this._routerSub = this.router.events.pipe(filter((e) => e instanceof NavigationEnd)).subscribe((e) => {
32383
- this._sidebarOpen.set(false);
32506
+ this.closeSidebar();
32384
32507
  this._expandActiveGroup(e.urlAfterRedirects);
32508
+ this._routeTitle.set(this._titleOfRoute());
32385
32509
  });
32510
+ if (typeof matchMedia === "function") {
32511
+ this._drawerMq = matchMedia(AppShellComponent._DRAWER_MQ);
32512
+ this._drawerLayout.set(!!this._drawerMq?.matches);
32513
+ this._drawerMq?.addEventListener?.("change", this._onDrawerMqChange);
32514
+ }
32386
32515
  this._expandActiveGroup(this.router.url);
32516
+ this._routeTitle.set(this._titleOfRoute());
32517
+ }
32518
+ _titleOfRoute() {
32519
+ let route = this.router.routerState?.snapshot?.root ?? null;
32520
+ let title = "";
32521
+ while (route) {
32522
+ const t = route.data?.["pageTitle"];
32523
+ if (typeof t === "string" && t) title = t;
32524
+ route = route.firstChild;
32525
+ }
32526
+ return title;
32387
32527
  }
32388
32528
  ngOnDestroy() {
32389
32529
  this._routerSub?.unsubscribe();
32530
+ this._drawerMq?.removeEventListener?.("change", this._onDrawerMqChange);
32390
32531
  this._iconCache.clear();
32391
32532
  }
32392
32533
  _expandActiveGroup(url) {
@@ -32435,6 +32576,13 @@ var AppShellComponent = class AppShellComponent {
32435
32576
  isRequired: false,
32436
32577
  transformFunction: null
32437
32578
  },
32579
+ showToast: {
32580
+ classPropertyName: "showToast",
32581
+ publicName: "showToast",
32582
+ isSignal: true,
32583
+ isRequired: false,
32584
+ transformFunction: null
32585
+ },
32438
32586
  appName: {
32439
32587
  classPropertyName: "appName",
32440
32588
  publicName: "appName",
@@ -32492,11 +32640,15 @@ var AppShellComponent = class AppShellComponent {
32492
32640
  class="shell"
32493
32641
  [class.sidebar-open]="_sidebarOpen()"
32494
32642
  [class.collapsed]="_isRail()"
32643
+ (keydown)="onShellKeydown($event)"
32495
32644
  [style.--shell-bg]="backgroundColor() || null"
32496
32645
  [style.--shell-text]="textColor() || null"
32497
32646
  >
32498
32647
  <ui-shell-projected-styles />
32499
32648
 
32649
+ <!-- Keyboard users jump past the navigation straight to the page content -->
32650
+ <a class="skip-link" href="#main-content" (click)="skipToContent($event)">Skip to main content</a>
32651
+
32500
32652
  <!-- Mobile backdrop -->
32501
32653
  <div
32502
32654
  class="sidebar-backdrop"
@@ -32543,6 +32695,7 @@ var AppShellComponent = class AppShellComponent {
32543
32695
  @for (group of _visibleGroups(); track group.key) {
32544
32696
  <div class="nav-group">
32545
32697
  @if (_isRail()) { <div class="rail-divider" aria-hidden="true"></div> }
32698
+ @if (_canCollapseGroups()) {
32546
32699
  <button
32547
32700
  class="nav-group-label"
32548
32701
  type="button"
@@ -32561,38 +32714,44 @@ var AppShellComponent = class AppShellComponent {
32561
32714
  </svg>
32562
32715
  {{ group.label }}
32563
32716
  </button>
32564
-
32565
- @if (_isRail() || !_isCollapsed(group.key)) {
32566
- <div [id]="'navg-' + group.key" role="list">
32567
- @for (link of _visibleLinks(group); track link.route) {
32568
- <a
32569
- role="listitem"
32570
- [routerLink]="link.route"
32571
- routerLinkActive="active"
32572
- [routerLinkActiveOptions]="{ exact: !!link.exact }"
32573
- #rla="routerLinkActive"
32574
- [attr.aria-current]="rla.isActive ? 'page' : null"
32575
- [attr.title]="_isRail() ? link.label : null"
32576
- [attr.aria-label]="_isRail() ? link.label : null"
32577
- >
32578
- @if (link.icon) {
32579
- <span
32580
- class="nav-icon"
32581
- [innerHTML]="_safeIcon(link.icon)"
32582
- aria-hidden="true"
32583
- ></span>
32584
- }
32585
- <span class="nav-label">{{ link.label }}</span>
32586
- @if (link.badge && link.badge > 0) {
32587
- <span
32588
- class="nav-badge"
32589
- [attr.aria-label]="link.badge + ' unread'"
32590
- >{{ link.badge }}</span>
32591
- }
32592
- </a>
32593
- }
32594
- </div>
32717
+ } @else {
32718
+ <!-- A single group can't be collapsed: hiding it would remove the whole navigation -->
32719
+ <div class="nav-group-label nav-group-label--static" [id]="'navg-label-' + group.key">{{ group.label }}</div>
32595
32720
  }
32721
+
32722
+ <!-- Always rendered so the toggle's aria-controls resolves; [hidden] (plus display:none in the CSS) removes the links of a collapsed group from view and from the tab order -->
32723
+ <div
32724
+ class="nav-group-links"
32725
+ [id]="'navg-' + group.key"
32726
+ [hidden]="!_isRail() && _isCollapsed(group.key)"
32727
+ >
32728
+ @for (link of _visibleLinks(group); track link.route) {
32729
+ <a
32730
+ [routerLink]="link.route"
32731
+ routerLinkActive="active"
32732
+ [routerLinkActiveOptions]="{ exact: !!link.exact }"
32733
+ #rla="routerLinkActive"
32734
+ [attr.aria-current]="rla.isActive ? 'page' : null"
32735
+ [attr.title]="_isRail() ? link.label : null"
32736
+ [attr.aria-label]="_isRail() ? link.label : null"
32737
+ >
32738
+ @if (link.icon) {
32739
+ <span
32740
+ class="nav-icon"
32741
+ [innerHTML]="_safeIcon(link.icon)"
32742
+ aria-hidden="true"
32743
+ ></span>
32744
+ }
32745
+ <span class="nav-label">{{ link.label }}</span>
32746
+ @if (link.badge && link.badge > 0) {
32747
+ <span
32748
+ class="nav-badge"
32749
+ [attr.aria-label]="link.badge + ' unread'"
32750
+ >{{ link.badge }}</span>
32751
+ }
32752
+ </a>
32753
+ }
32754
+ </div>
32596
32755
  </div>
32597
32756
  }
32598
32757
  </nav>
@@ -32649,8 +32808,8 @@ var AppShellComponent = class AppShellComponent {
32649
32808
  </svg>
32650
32809
  </button>
32651
32810
 
32652
- @if (pageTitle()) {
32653
- <h1 class="page-title" id="shell-page-title" tabindex="-1">{{ pageTitle() }}</h1>
32811
+ @if (_title()) {
32812
+ <h1 class="page-title" id="shell-page-title" tabindex="-1">{{ _title() }}</h1>
32654
32813
  }
32655
32814
 
32656
32815
  @if (readOnly()) {
@@ -32674,7 +32833,7 @@ var AppShellComponent = class AppShellComponent {
32674
32833
  <ng-content select="[shell-banners]" />
32675
32834
 
32676
32835
  <!-- Page content -->
32677
- <main class="content" id="main-content" role="main" tabindex="-1" [attr.aria-labelledby]="pageTitle() ? 'shell-page-title' : null">
32836
+ <main class="content" id="main-content" role="main" tabindex="-1" [attr.aria-labelledby]="_title() ? 'shell-page-title' : null">
32678
32837
  <ng-content />
32679
32838
  </main>
32680
32839
  </div>
@@ -32682,9 +32841,13 @@ var AppShellComponent = class AppShellComponent {
32682
32841
 
32683
32842
  <!-- Global confirm overlay — position:fixed so it overlays without affecting layout -->
32684
32843
  <ui-confirm-outlet />
32844
+
32845
+ @if (showToast()) {
32846
+ <ui-toast />
32847
+ }
32685
32848
  `,
32686
32849
  isInline: true,
32687
- styles: [":host{display:contents}.shell{display:flex;height:100vh;height:100dvh;overflow:hidden;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.sidebar-backdrop{display:none;position:fixed;inset:0;background:#00000080;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:199}.sidebar{width:256px;background:var(--shell-bg, linear-gradient(175deg, #0f172a 0%, #111827 100%));display:flex;flex-direction:column;flex-shrink:0;overflow:hidden}.sidebar-header{display:flex;align-items:center;padding:0 20px;min-height:64px;border-bottom:1px solid color-mix(in srgb,var(--shell-text, #fff) 6%,transparent);box-sizing:border-box}.brand-default{display:flex;align-items:center;gap:10px}.brand-text{font-size:1.125rem;font-weight:700;color:var(--shell-text, #fff);letter-spacing:-.01em}.sidebar-nav{padding:6px 0 8px;flex:1;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--shell-text, #fff) 8%,transparent) transparent}.sidebar-nav::-webkit-scrollbar{width:3px}.sidebar-nav::-webkit-scrollbar-track{background:transparent}.sidebar-nav::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--shell-text, #fff) 8%,transparent);border-radius:2px}.nav-group{margin-bottom:6px}.nav-group-label{display:flex;align-items:center;gap:6px;width:100%;padding:8px 16px;font-size:.6875rem;font-weight:700;color:color-mix(in srgb,var(--shell-text, #fff) 80%,transparent);text-transform:uppercase;letter-spacing:.12em;background:none;border:none;cursor:pointer;transition:color .15s;text-align:left;border-radius:6px;background:color-mix(in srgb,var(--shell-text, #fff) 10%,transparent);margin:6px 4px 4px;width:calc(100% - 8px);box-sizing:border-box}.nav-group-label:hover{color:color-mix(in srgb,var(--shell-text, #fff) 100%,transparent)}.nav-group-label:focus-visible{outline:2px solid rgba(96,165,250,.5);outline-offset:-1px}.chevron{flex-shrink:0;transition:transform .2s cubic-bezier(.4,0,.2,1);opacity:.85}.chevron.collapsed{transform:rotate(-90deg)}.sidebar-nav a{display:flex;align-items:center;gap:10px;padding:8px 12px 8px 32px;color:color-mix(in srgb,var(--shell-text, #fff) 95%,transparent);font-size:.9375rem;font-weight:500;text-decoration:none;border-left:2px solid transparent;border-radius:0 8px 8px 0;margin-right:10px;transition:color .15s,background .15s,border-color .15s}.sidebar-nav a:hover{color:color-mix(in srgb,var(--shell-text, #fff) 100%,transparent);background:color-mix(in srgb,var(--shell-text, #fff) 6%,transparent)}.sidebar-nav a.active{color:var(--shell-text, #fff);background:#60a5fa21;border-left-color:#60a5fa;font-weight:600}.sidebar-nav a:focus-visible{outline:2px solid rgba(96,165,250,.5);outline-offset:-2px}.nav-icon{display:flex;align-items:center;flex-shrink:0}.nav-label{flex:1}.nav-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:#ef4444;color:#fff;font-size:.625rem;font-weight:700;margin-left:auto}.sidebar-footer{padding:10px 14px;border-top:1px solid color-mix(in srgb,var(--shell-text, #fff) 6%,transparent)}.user-info{display:flex;align-items:center;gap:10px}.user-avatar{width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,#60a5fa38,#60a5fa14);border:1px solid rgba(96,165,250,.18);color:color-mix(in srgb,var(--shell-text, #fff) 88%,transparent);font-size:.75rem;font-weight:600;display:flex;align-items:center;justify-content:center;flex-shrink:0}.user-details{display:flex;flex-direction:column;min-width:0;flex:1}.user-name{font-size:.8125rem;font-weight:600;color:var(--shell-text, #fff);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.user-role{font-size:.6875rem;color:color-mix(in srgb,var(--shell-text, #fff) 80%,transparent);text-transform:uppercase;letter-spacing:.05em;font-weight:500}.btn-logout{background:none;border:none;cursor:pointer;color:color-mix(in srgb,var(--shell-text, #fff) 85%,transparent);padding:6px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:color .15s,background .15s}.btn-logout:hover{color:#f87171;background:#f871711a}.btn-logout:focus-visible{outline:2px solid rgba(96,165,250,.5);outline-offset:2px}.brand-full{display:flex;align-items:center;min-width:0;flex:1}.brand-mark{display:none}.shell.collapsed .brand-mark{width:36px;height:36px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:1.125rem;color:var(--shell-text, #fff);background:color-mix(in srgb,var(--shell-text, #fff) 15%,transparent)}.rail-toggle{display:none;align-items:center;justify-content:center;width:32px;height:32px;margin-left:auto;flex-shrink:0;border:none;background:none;cursor:pointer;border-radius:8px;color:color-mix(in srgb,var(--shell-text, #fff) 85%,transparent);transition:background .15s,color .15s}.rail-toggle:hover{background:color-mix(in srgb,var(--shell-text, #fff) 12%,transparent);color:var(--shell-text, #fff)}.rail-toggle:focus-visible{outline:2px solid rgba(96,165,250,.5);outline-offset:2px}.rail-divider{display:none}@media(min-width:1025px){.rail-toggle{display:flex}.sidebar{transition:width .2s cubic-bezier(.4,0,.2,1)}.shell.collapsed .sidebar{width:68px}.shell.collapsed .sidebar-header{flex-direction:column;justify-content:center;gap:4px;padding:8px 0}.shell.collapsed .brand-full{flex:none;width:44px;height:44px;overflow:hidden;border-radius:10px;justify-content:center}.shell.collapsed .brand-text{display:none}.shell.collapsed .rail-toggle{margin-left:0}.shell.collapsed .nav-group-label{display:none}.shell.collapsed .rail-divider{display:block;height:1px;margin:8px 14px;background:color-mix(in srgb,var(--shell-text, #fff) 20%,transparent)}.shell.collapsed .nav-group:first-child .rail-divider{display:none}.shell.collapsed .sidebar-nav a{position:relative;justify-content:center;padding:10px 0;margin:0 8px 2px;border-left:none;border-radius:8px}.shell.collapsed .sidebar-nav a.active{box-shadow:inset 3px 0 #60a5fa}.shell.collapsed .nav-label{display:none}.shell.collapsed .nav-badge{position:absolute;top:2px;right:4px;min-width:16px;height:16px;padding:0 4px;font-size:.5625rem;margin:0}.shell.collapsed .sidebar-footer{padding:10px 8px}.shell.collapsed .user-info{flex-direction:column;gap:8px}.shell.collapsed .user-details{display:none}}.main-area{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.top-header{display:flex;align-items:center;gap:8px;padding:0 24px;background:#fff;box-shadow:0 1px 3px #00000012,0 1px #0000000a;min-height:64px;box-sizing:border-box;position:relative;z-index:50}.hamburger{display:none;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:none;cursor:pointer;color:#374151;border-radius:8px;flex-shrink:0;transition:background .15s,color .15s}.hamburger:hover{background:#f3f4f6}.hamburger:focus-visible{outline:2px solid rgba(59,130,246,.5);outline-offset:2px}.page-title{font-size:1.25rem;font-weight:700;color:#111827;margin:0;letter-spacing:-.02em}.page-title:focus{outline:none}.read-only-badge{display:inline-flex;align-items:center;flex-shrink:0;padding:2px 8px;border-radius:9999px;font-size:.6875rem;font-weight:600;letter-spacing:.02em;text-transform:uppercase;background:#fef9c3;color:#854d0e;border:1px solid #fde68a;white-space:nowrap}.header-start{display:flex;align-items:center;min-width:0;margin-left:8px;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.header-start:empty{display:none}.header-start::-webkit-scrollbar{display:none}.header-end{display:flex;align-items:center;margin-left:auto}.content{--shell-content-padding: 24px;flex:1;overflow-y:auto;padding:var(--shell-content-padding);background:#f7f8f6;display:flex;flex-direction:column;box-sizing:border-box;min-height:0}.content>*{flex:1;min-height:0;display:flex;flex-direction:column}@media(max-width:1024px){.hamburger{display:flex}.sidebar{position:fixed;top:0;left:0;bottom:0;z-index:200;transform:translate(-100%);transition:transform .26s cubic-bezier(.4,0,.2,1),box-shadow .26s cubic-bezier(.4,0,.2,1);box-shadow:none}.shell.sidebar-open .sidebar{transform:translate(0);box-shadow:4px 0 32px #0000004d}.shell.sidebar-open .sidebar-backdrop{display:block}.main-area{width:100%}.top-header{padding:0 16px;gap:4px}.content{--shell-content-padding: 16px}}@media(max-width:480px){.page-title{font-size:1.0625rem}.content{--shell-content-padding: 12px}}@media(pointer:coarse),(max-width:480px){.sidebar-nav a,.nav-group-label{min-height:44px}.btn-logout,.hamburger,.rail-toggle{min-width:44px;min-height:44px}}@media(prefers-reduced-motion:reduce){.chevron,.sidebar-nav a,.sidebar{transition:none!important}}\n"],
32850
+ styles: [":host{display:contents}.shell{display:flex;height:100vh;height:100dvh;overflow:hidden;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.sidebar-backdrop{display:none;position:fixed;inset:0;background:#00000080;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:199}.sidebar{width:256px;background:var(--shell-bg, linear-gradient(175deg, #0f172a 0%, #111827 100%));display:flex;flex-direction:column;flex-shrink:0;overflow:hidden}.sidebar-header{display:flex;align-items:center;padding:0 20px;min-height:64px;border-bottom:1px solid color-mix(in srgb,var(--shell-text, #fff) 6%,transparent);box-sizing:border-box}.brand-default{display:flex;align-items:center;gap:10px}.brand-text{font-size:1.125rem;font-weight:700;color:var(--shell-text, #fff);letter-spacing:-.01em}.sidebar-nav{padding:6px 0 8px;flex:1;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--shell-text, #fff) 8%,transparent) transparent}.sidebar-nav::-webkit-scrollbar{width:3px}.sidebar-nav::-webkit-scrollbar-track{background:transparent}.sidebar-nav::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--shell-text, #fff) 8%,transparent);border-radius:2px}.nav-group{margin-bottom:6px}.nav-group-links[hidden]{display:none}.nav-group-label{display:flex;align-items:center;gap:6px;width:100%;padding:8px 16px;font-size:.6875rem;font-weight:700;color:color-mix(in srgb,var(--shell-text, #fff) 80%,transparent);text-transform:uppercase;letter-spacing:.12em;background:none;border:none;cursor:pointer;transition:color .15s;text-align:left;border-radius:6px;background:color-mix(in srgb,var(--shell-text, #fff) 10%,transparent);margin:6px 4px 4px;width:calc(100% - 8px);box-sizing:border-box}.nav-group-label:hover{color:color-mix(in srgb,var(--shell-text, #fff) 100%,transparent)}.nav-group-label:focus-visible{outline:2px solid rgba(96,165,250,.5);outline-offset:-1px}.chevron{flex-shrink:0;transition:transform .2s cubic-bezier(.4,0,.2,1);opacity:.85}.chevron.collapsed{transform:rotate(-90deg)}.sidebar-nav a{display:flex;align-items:center;gap:10px;padding:8px 12px 8px 32px;color:color-mix(in srgb,var(--shell-text, #fff) 95%,transparent);font-size:.9375rem;font-weight:500;text-decoration:none;border-left:2px solid transparent;border-radius:0 8px 8px 0;margin-right:10px;transition:color .15s,background .15s,border-color .15s}.sidebar-nav a:hover{color:color-mix(in srgb,var(--shell-text, #fff) 100%,transparent);background:color-mix(in srgb,var(--shell-text, #fff) 6%,transparent)}.sidebar-nav a.active{color:var(--shell-text, #fff);background:#60a5fa21;border-left-color:#60a5fa;font-weight:600}.sidebar-nav a:focus-visible{outline:2px solid rgba(96,165,250,.5);outline-offset:-2px}.nav-icon{display:flex;align-items:center;flex-shrink:0}.nav-label{flex:1}.nav-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:#ef4444;color:#fff;font-size:.625rem;font-weight:700;margin-left:auto}.sidebar-footer{padding:10px 14px;border-top:1px solid color-mix(in srgb,var(--shell-text, #fff) 6%,transparent)}.user-info{display:flex;align-items:center;gap:10px}.user-avatar{width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,#60a5fa38,#60a5fa14);border:1px solid rgba(96,165,250,.18);color:color-mix(in srgb,var(--shell-text, #fff) 88%,transparent);font-size:.75rem;font-weight:600;display:flex;align-items:center;justify-content:center;flex-shrink:0}.user-details{display:flex;flex-direction:column;min-width:0;flex:1}.user-name{font-size:.8125rem;font-weight:600;color:var(--shell-text, #fff);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.user-role{font-size:.6875rem;color:color-mix(in srgb,var(--shell-text, #fff) 80%,transparent);text-transform:uppercase;letter-spacing:.05em;font-weight:500}.btn-logout{background:none;border:none;cursor:pointer;color:color-mix(in srgb,var(--shell-text, #fff) 85%,transparent);padding:6px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:color .15s,background .15s}.btn-logout:hover{color:#f87171;background:#f871711a}.btn-logout:focus-visible{outline:2px solid rgba(96,165,250,.5);outline-offset:2px}.brand-full{display:flex;align-items:center;min-width:0;flex:1}.brand-mark{display:none}.shell.collapsed .brand-mark{width:36px;height:36px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:1.125rem;color:var(--shell-text, #fff);background:color-mix(in srgb,var(--shell-text, #fff) 15%,transparent)}.rail-toggle{display:none;align-items:center;justify-content:center;width:32px;height:32px;margin-left:auto;flex-shrink:0;border:none;background:none;cursor:pointer;border-radius:8px;color:color-mix(in srgb,var(--shell-text, #fff) 85%,transparent);transition:background .15s,color .15s}.rail-toggle:hover{background:color-mix(in srgb,var(--shell-text, #fff) 12%,transparent);color:var(--shell-text, #fff)}.rail-toggle:focus-visible{outline:2px solid rgba(96,165,250,.5);outline-offset:2px}.rail-divider{display:none}@media(min-width:1025px){.rail-toggle{display:flex}.sidebar{transition:width .2s cubic-bezier(.4,0,.2,1)}.shell.collapsed .sidebar{width:68px}.shell.collapsed .sidebar-header{flex-direction:column;justify-content:center;gap:4px;padding:8px 0}.shell.collapsed .brand-full{flex:none;width:44px;height:44px;overflow:hidden;border-radius:10px;justify-content:center}.shell.collapsed .brand-text{display:none}.shell.collapsed .rail-toggle{margin-left:0}.shell.collapsed .nav-group-label{display:none}.shell.collapsed .rail-divider{display:block;height:1px;margin:8px 14px;background:color-mix(in srgb,var(--shell-text, #fff) 20%,transparent)}.shell.collapsed .nav-group:first-child .rail-divider{display:none}.shell.collapsed .sidebar-nav a{position:relative;justify-content:center;padding:10px 0;margin:0 8px 2px;border-left:none;border-radius:8px}.shell.collapsed .sidebar-nav a.active{box-shadow:inset 3px 0 #60a5fa}.shell.collapsed .nav-label{display:none}.shell.collapsed .nav-badge{position:absolute;top:2px;right:4px;min-width:16px;height:16px;padding:0 4px;font-size:.5625rem;margin:0}.shell.collapsed .sidebar-footer{padding:10px 8px}.shell.collapsed .user-info{flex-direction:column;gap:8px}.shell.collapsed .user-details{display:none}}.main-area{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.top-header{display:flex;align-items:center;gap:8px;padding:0 24px;background:#fff;box-shadow:0 1px 3px #00000012,0 1px #0000000a;min-height:64px;box-sizing:border-box;position:relative;z-index:50}.hamburger{display:none;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:none;cursor:pointer;color:#374151;border-radius:8px;flex-shrink:0;transition:background .15s,color .15s}.hamburger:hover{background:#f3f4f6}.hamburger:focus-visible{outline:2px solid rgba(59,130,246,.5);outline-offset:2px}.page-title{font-size:1.25rem;font-weight:700;color:#111827;margin:0;letter-spacing:-.02em}.page-title:focus{outline:none}.read-only-badge{display:inline-flex;align-items:center;flex-shrink:0;padding:2px 8px;border-radius:9999px;font-size:.6875rem;font-weight:600;letter-spacing:.02em;text-transform:uppercase;background:#fef9c3;color:#854d0e;border:1px solid #fde68a;white-space:nowrap}.header-start{display:flex;align-items:center;min-width:0;margin-left:8px;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.header-start:empty{display:none}.header-start::-webkit-scrollbar{display:none}.header-end{display:flex;align-items:center;margin-left:auto}.content:focus{outline:none}.content{--shell-content-padding: 24px;flex:1;overflow-y:auto;padding:var(--shell-content-padding);background:#f7f8f6;display:flex;flex-direction:column;box-sizing:border-box;min-height:0}.content>*{flex:1;min-height:0;display:flex;flex-direction:column}.skip-link{position:absolute;top:-48px;left:8px;z-index:300;padding:8px 14px;border-radius:6px;background:#fff;color:#1d4ed8;font-size:.875rem;font-weight:600;text-decoration:none;box-shadow:0 2px 10px #00000040}.skip-link:focus{top:8px;outline:2px solid #1d4ed8;outline-offset:2px}.nav-group-label--static{cursor:default}@media(max-width:1024px){.hamburger{display:flex}.sidebar{position:fixed;top:0;left:0;bottom:0;z-index:200;transform:translate(-100%);transition:transform .26s cubic-bezier(.4,0,.2,1),box-shadow .26s cubic-bezier(.4,0,.2,1),visibility 0s linear .26s;visibility:hidden;box-shadow:none}.shell.sidebar-open .sidebar{transform:translate(0);box-shadow:4px 0 32px #0000004d;visibility:visible;transition-delay:0s}.shell.sidebar-open .sidebar-backdrop{display:block}.main-area{width:100%}.top-header{padding:0 16px;gap:4px}.content{--shell-content-padding: 16px}}@media(max-width:480px){.page-title{font-size:1.0625rem}.content{--shell-content-padding: 12px}}@media(pointer:coarse),(max-width:480px){.sidebar-nav a,.nav-group-label{min-height:44px}.btn-logout,.hamburger,.rail-toggle{min-width:44px;min-height:44px}}@media(prefers-reduced-motion:reduce){.chevron,.sidebar-nav a,.sidebar{transition:none!important}}\n"],
32688
32851
  dependencies: [
32689
32852
  {
32690
32853
  kind: "directive",
@@ -32722,6 +32885,12 @@ var AppShellComponent = class AppShellComponent {
32722
32885
  type: ConfirmOutletComponent,
32723
32886
  selector: "ui-confirm-outlet"
32724
32887
  },
32888
+ {
32889
+ kind: "component",
32890
+ type: ToastComponent,
32891
+ selector: "ui-toast",
32892
+ inputs: ["dismissible", "persistentLiveRegion"]
32893
+ },
32725
32894
  {
32726
32895
  kind: "component",
32727
32896
  type: ShellProjectedStylesComponent,
@@ -32747,6 +32916,7 @@ i0.ɵɵngDeclareClassMetadata({
32747
32916
  RouterLink,
32748
32917
  RouterLinkActive,
32749
32918
  ConfirmOutletComponent,
32919
+ ToastComponent,
32750
32920
  ShellProjectedStylesComponent
32751
32921
  ],
32752
32922
  template: `
@@ -32754,11 +32924,15 @@ i0.ɵɵngDeclareClassMetadata({
32754
32924
  class="shell"
32755
32925
  [class.sidebar-open]="_sidebarOpen()"
32756
32926
  [class.collapsed]="_isRail()"
32927
+ (keydown)="onShellKeydown($event)"
32757
32928
  [style.--shell-bg]="backgroundColor() || null"
32758
32929
  [style.--shell-text]="textColor() || null"
32759
32930
  >
32760
32931
  <ui-shell-projected-styles />
32761
32932
 
32933
+ <!-- Keyboard users jump past the navigation straight to the page content -->
32934
+ <a class="skip-link" href="#main-content" (click)="skipToContent($event)">Skip to main content</a>
32935
+
32762
32936
  <!-- Mobile backdrop -->
32763
32937
  <div
32764
32938
  class="sidebar-backdrop"
@@ -32805,6 +32979,7 @@ i0.ɵɵngDeclareClassMetadata({
32805
32979
  @for (group of _visibleGroups(); track group.key) {
32806
32980
  <div class="nav-group">
32807
32981
  @if (_isRail()) { <div class="rail-divider" aria-hidden="true"></div> }
32982
+ @if (_canCollapseGroups()) {
32808
32983
  <button
32809
32984
  class="nav-group-label"
32810
32985
  type="button"
@@ -32823,38 +32998,44 @@ i0.ɵɵngDeclareClassMetadata({
32823
32998
  </svg>
32824
32999
  {{ group.label }}
32825
33000
  </button>
32826
-
32827
- @if (_isRail() || !_isCollapsed(group.key)) {
32828
- <div [id]="'navg-' + group.key" role="list">
32829
- @for (link of _visibleLinks(group); track link.route) {
32830
- <a
32831
- role="listitem"
32832
- [routerLink]="link.route"
32833
- routerLinkActive="active"
32834
- [routerLinkActiveOptions]="{ exact: !!link.exact }"
32835
- #rla="routerLinkActive"
32836
- [attr.aria-current]="rla.isActive ? 'page' : null"
32837
- [attr.title]="_isRail() ? link.label : null"
32838
- [attr.aria-label]="_isRail() ? link.label : null"
32839
- >
32840
- @if (link.icon) {
32841
- <span
32842
- class="nav-icon"
32843
- [innerHTML]="_safeIcon(link.icon)"
32844
- aria-hidden="true"
32845
- ></span>
32846
- }
32847
- <span class="nav-label">{{ link.label }}</span>
32848
- @if (link.badge && link.badge > 0) {
32849
- <span
32850
- class="nav-badge"
32851
- [attr.aria-label]="link.badge + ' unread'"
32852
- >{{ link.badge }}</span>
32853
- }
32854
- </a>
32855
- }
32856
- </div>
33001
+ } @else {
33002
+ <!-- A single group can't be collapsed: hiding it would remove the whole navigation -->
33003
+ <div class="nav-group-label nav-group-label--static" [id]="'navg-label-' + group.key">{{ group.label }}</div>
32857
33004
  }
33005
+
33006
+ <!-- Always rendered so the toggle's aria-controls resolves; [hidden] (plus display:none in the CSS) removes the links of a collapsed group from view and from the tab order -->
33007
+ <div
33008
+ class="nav-group-links"
33009
+ [id]="'navg-' + group.key"
33010
+ [hidden]="!_isRail() && _isCollapsed(group.key)"
33011
+ >
33012
+ @for (link of _visibleLinks(group); track link.route) {
33013
+ <a
33014
+ [routerLink]="link.route"
33015
+ routerLinkActive="active"
33016
+ [routerLinkActiveOptions]="{ exact: !!link.exact }"
33017
+ #rla="routerLinkActive"
33018
+ [attr.aria-current]="rla.isActive ? 'page' : null"
33019
+ [attr.title]="_isRail() ? link.label : null"
33020
+ [attr.aria-label]="_isRail() ? link.label : null"
33021
+ >
33022
+ @if (link.icon) {
33023
+ <span
33024
+ class="nav-icon"
33025
+ [innerHTML]="_safeIcon(link.icon)"
33026
+ aria-hidden="true"
33027
+ ></span>
33028
+ }
33029
+ <span class="nav-label">{{ link.label }}</span>
33030
+ @if (link.badge && link.badge > 0) {
33031
+ <span
33032
+ class="nav-badge"
33033
+ [attr.aria-label]="link.badge + ' unread'"
33034
+ >{{ link.badge }}</span>
33035
+ }
33036
+ </a>
33037
+ }
33038
+ </div>
32858
33039
  </div>
32859
33040
  }
32860
33041
  </nav>
@@ -32911,8 +33092,8 @@ i0.ɵɵngDeclareClassMetadata({
32911
33092
  </svg>
32912
33093
  </button>
32913
33094
 
32914
- @if (pageTitle()) {
32915
- <h1 class="page-title" id="shell-page-title" tabindex="-1">{{ pageTitle() }}</h1>
33095
+ @if (_title()) {
33096
+ <h1 class="page-title" id="shell-page-title" tabindex="-1">{{ _title() }}</h1>
32916
33097
  }
32917
33098
 
32918
33099
  @if (readOnly()) {
@@ -32936,7 +33117,7 @@ i0.ɵɵngDeclareClassMetadata({
32936
33117
  <ng-content select="[shell-banners]" />
32937
33118
 
32938
33119
  <!-- Page content -->
32939
- <main class="content" id="main-content" role="main" tabindex="-1" [attr.aria-labelledby]="pageTitle() ? 'shell-page-title' : null">
33120
+ <main class="content" id="main-content" role="main" tabindex="-1" [attr.aria-labelledby]="_title() ? 'shell-page-title' : null">
32940
33121
  <ng-content />
32941
33122
  </main>
32942
33123
  </div>
@@ -32944,8 +33125,12 @@ i0.ɵɵngDeclareClassMetadata({
32944
33125
 
32945
33126
  <!-- Global confirm overlay — position:fixed so it overlays without affecting layout -->
32946
33127
  <ui-confirm-outlet />
33128
+
33129
+ @if (showToast()) {
33130
+ <ui-toast />
33131
+ }
32947
33132
  `,
32948
- styles: [":host{display:contents}.shell{display:flex;height:100vh;height:100dvh;overflow:hidden;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.sidebar-backdrop{display:none;position:fixed;inset:0;background:#00000080;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:199}.sidebar{width:256px;background:var(--shell-bg, linear-gradient(175deg, #0f172a 0%, #111827 100%));display:flex;flex-direction:column;flex-shrink:0;overflow:hidden}.sidebar-header{display:flex;align-items:center;padding:0 20px;min-height:64px;border-bottom:1px solid color-mix(in srgb,var(--shell-text, #fff) 6%,transparent);box-sizing:border-box}.brand-default{display:flex;align-items:center;gap:10px}.brand-text{font-size:1.125rem;font-weight:700;color:var(--shell-text, #fff);letter-spacing:-.01em}.sidebar-nav{padding:6px 0 8px;flex:1;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--shell-text, #fff) 8%,transparent) transparent}.sidebar-nav::-webkit-scrollbar{width:3px}.sidebar-nav::-webkit-scrollbar-track{background:transparent}.sidebar-nav::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--shell-text, #fff) 8%,transparent);border-radius:2px}.nav-group{margin-bottom:6px}.nav-group-label{display:flex;align-items:center;gap:6px;width:100%;padding:8px 16px;font-size:.6875rem;font-weight:700;color:color-mix(in srgb,var(--shell-text, #fff) 80%,transparent);text-transform:uppercase;letter-spacing:.12em;background:none;border:none;cursor:pointer;transition:color .15s;text-align:left;border-radius:6px;background:color-mix(in srgb,var(--shell-text, #fff) 10%,transparent);margin:6px 4px 4px;width:calc(100% - 8px);box-sizing:border-box}.nav-group-label:hover{color:color-mix(in srgb,var(--shell-text, #fff) 100%,transparent)}.nav-group-label:focus-visible{outline:2px solid rgba(96,165,250,.5);outline-offset:-1px}.chevron{flex-shrink:0;transition:transform .2s cubic-bezier(.4,0,.2,1);opacity:.85}.chevron.collapsed{transform:rotate(-90deg)}.sidebar-nav a{display:flex;align-items:center;gap:10px;padding:8px 12px 8px 32px;color:color-mix(in srgb,var(--shell-text, #fff) 95%,transparent);font-size:.9375rem;font-weight:500;text-decoration:none;border-left:2px solid transparent;border-radius:0 8px 8px 0;margin-right:10px;transition:color .15s,background .15s,border-color .15s}.sidebar-nav a:hover{color:color-mix(in srgb,var(--shell-text, #fff) 100%,transparent);background:color-mix(in srgb,var(--shell-text, #fff) 6%,transparent)}.sidebar-nav a.active{color:var(--shell-text, #fff);background:#60a5fa21;border-left-color:#60a5fa;font-weight:600}.sidebar-nav a:focus-visible{outline:2px solid rgba(96,165,250,.5);outline-offset:-2px}.nav-icon{display:flex;align-items:center;flex-shrink:0}.nav-label{flex:1}.nav-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:#ef4444;color:#fff;font-size:.625rem;font-weight:700;margin-left:auto}.sidebar-footer{padding:10px 14px;border-top:1px solid color-mix(in srgb,var(--shell-text, #fff) 6%,transparent)}.user-info{display:flex;align-items:center;gap:10px}.user-avatar{width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,#60a5fa38,#60a5fa14);border:1px solid rgba(96,165,250,.18);color:color-mix(in srgb,var(--shell-text, #fff) 88%,transparent);font-size:.75rem;font-weight:600;display:flex;align-items:center;justify-content:center;flex-shrink:0}.user-details{display:flex;flex-direction:column;min-width:0;flex:1}.user-name{font-size:.8125rem;font-weight:600;color:var(--shell-text, #fff);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.user-role{font-size:.6875rem;color:color-mix(in srgb,var(--shell-text, #fff) 80%,transparent);text-transform:uppercase;letter-spacing:.05em;font-weight:500}.btn-logout{background:none;border:none;cursor:pointer;color:color-mix(in srgb,var(--shell-text, #fff) 85%,transparent);padding:6px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:color .15s,background .15s}.btn-logout:hover{color:#f87171;background:#f871711a}.btn-logout:focus-visible{outline:2px solid rgba(96,165,250,.5);outline-offset:2px}.brand-full{display:flex;align-items:center;min-width:0;flex:1}.brand-mark{display:none}.shell.collapsed .brand-mark{width:36px;height:36px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:1.125rem;color:var(--shell-text, #fff);background:color-mix(in srgb,var(--shell-text, #fff) 15%,transparent)}.rail-toggle{display:none;align-items:center;justify-content:center;width:32px;height:32px;margin-left:auto;flex-shrink:0;border:none;background:none;cursor:pointer;border-radius:8px;color:color-mix(in srgb,var(--shell-text, #fff) 85%,transparent);transition:background .15s,color .15s}.rail-toggle:hover{background:color-mix(in srgb,var(--shell-text, #fff) 12%,transparent);color:var(--shell-text, #fff)}.rail-toggle:focus-visible{outline:2px solid rgba(96,165,250,.5);outline-offset:2px}.rail-divider{display:none}@media(min-width:1025px){.rail-toggle{display:flex}.sidebar{transition:width .2s cubic-bezier(.4,0,.2,1)}.shell.collapsed .sidebar{width:68px}.shell.collapsed .sidebar-header{flex-direction:column;justify-content:center;gap:4px;padding:8px 0}.shell.collapsed .brand-full{flex:none;width:44px;height:44px;overflow:hidden;border-radius:10px;justify-content:center}.shell.collapsed .brand-text{display:none}.shell.collapsed .rail-toggle{margin-left:0}.shell.collapsed .nav-group-label{display:none}.shell.collapsed .rail-divider{display:block;height:1px;margin:8px 14px;background:color-mix(in srgb,var(--shell-text, #fff) 20%,transparent)}.shell.collapsed .nav-group:first-child .rail-divider{display:none}.shell.collapsed .sidebar-nav a{position:relative;justify-content:center;padding:10px 0;margin:0 8px 2px;border-left:none;border-radius:8px}.shell.collapsed .sidebar-nav a.active{box-shadow:inset 3px 0 #60a5fa}.shell.collapsed .nav-label{display:none}.shell.collapsed .nav-badge{position:absolute;top:2px;right:4px;min-width:16px;height:16px;padding:0 4px;font-size:.5625rem;margin:0}.shell.collapsed .sidebar-footer{padding:10px 8px}.shell.collapsed .user-info{flex-direction:column;gap:8px}.shell.collapsed .user-details{display:none}}.main-area{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.top-header{display:flex;align-items:center;gap:8px;padding:0 24px;background:#fff;box-shadow:0 1px 3px #00000012,0 1px #0000000a;min-height:64px;box-sizing:border-box;position:relative;z-index:50}.hamburger{display:none;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:none;cursor:pointer;color:#374151;border-radius:8px;flex-shrink:0;transition:background .15s,color .15s}.hamburger:hover{background:#f3f4f6}.hamburger:focus-visible{outline:2px solid rgba(59,130,246,.5);outline-offset:2px}.page-title{font-size:1.25rem;font-weight:700;color:#111827;margin:0;letter-spacing:-.02em}.page-title:focus{outline:none}.read-only-badge{display:inline-flex;align-items:center;flex-shrink:0;padding:2px 8px;border-radius:9999px;font-size:.6875rem;font-weight:600;letter-spacing:.02em;text-transform:uppercase;background:#fef9c3;color:#854d0e;border:1px solid #fde68a;white-space:nowrap}.header-start{display:flex;align-items:center;min-width:0;margin-left:8px;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.header-start:empty{display:none}.header-start::-webkit-scrollbar{display:none}.header-end{display:flex;align-items:center;margin-left:auto}.content{--shell-content-padding: 24px;flex:1;overflow-y:auto;padding:var(--shell-content-padding);background:#f7f8f6;display:flex;flex-direction:column;box-sizing:border-box;min-height:0}.content>*{flex:1;min-height:0;display:flex;flex-direction:column}@media(max-width:1024px){.hamburger{display:flex}.sidebar{position:fixed;top:0;left:0;bottom:0;z-index:200;transform:translate(-100%);transition:transform .26s cubic-bezier(.4,0,.2,1),box-shadow .26s cubic-bezier(.4,0,.2,1);box-shadow:none}.shell.sidebar-open .sidebar{transform:translate(0);box-shadow:4px 0 32px #0000004d}.shell.sidebar-open .sidebar-backdrop{display:block}.main-area{width:100%}.top-header{padding:0 16px;gap:4px}.content{--shell-content-padding: 16px}}@media(max-width:480px){.page-title{font-size:1.0625rem}.content{--shell-content-padding: 12px}}@media(pointer:coarse),(max-width:480px){.sidebar-nav a,.nav-group-label{min-height:44px}.btn-logout,.hamburger,.rail-toggle{min-width:44px;min-height:44px}}@media(prefers-reduced-motion:reduce){.chevron,.sidebar-nav a,.sidebar{transition:none!important}}\n"]
33133
+ styles: [":host{display:contents}.shell{display:flex;height:100vh;height:100dvh;overflow:hidden;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}.sidebar-backdrop{display:none;position:fixed;inset:0;background:#00000080;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:199}.sidebar{width:256px;background:var(--shell-bg, linear-gradient(175deg, #0f172a 0%, #111827 100%));display:flex;flex-direction:column;flex-shrink:0;overflow:hidden}.sidebar-header{display:flex;align-items:center;padding:0 20px;min-height:64px;border-bottom:1px solid color-mix(in srgb,var(--shell-text, #fff) 6%,transparent);box-sizing:border-box}.brand-default{display:flex;align-items:center;gap:10px}.brand-text{font-size:1.125rem;font-weight:700;color:var(--shell-text, #fff);letter-spacing:-.01em}.sidebar-nav{padding:6px 0 8px;flex:1;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--shell-text, #fff) 8%,transparent) transparent}.sidebar-nav::-webkit-scrollbar{width:3px}.sidebar-nav::-webkit-scrollbar-track{background:transparent}.sidebar-nav::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--shell-text, #fff) 8%,transparent);border-radius:2px}.nav-group{margin-bottom:6px}.nav-group-links[hidden]{display:none}.nav-group-label{display:flex;align-items:center;gap:6px;width:100%;padding:8px 16px;font-size:.6875rem;font-weight:700;color:color-mix(in srgb,var(--shell-text, #fff) 80%,transparent);text-transform:uppercase;letter-spacing:.12em;background:none;border:none;cursor:pointer;transition:color .15s;text-align:left;border-radius:6px;background:color-mix(in srgb,var(--shell-text, #fff) 10%,transparent);margin:6px 4px 4px;width:calc(100% - 8px);box-sizing:border-box}.nav-group-label:hover{color:color-mix(in srgb,var(--shell-text, #fff) 100%,transparent)}.nav-group-label:focus-visible{outline:2px solid rgba(96,165,250,.5);outline-offset:-1px}.chevron{flex-shrink:0;transition:transform .2s cubic-bezier(.4,0,.2,1);opacity:.85}.chevron.collapsed{transform:rotate(-90deg)}.sidebar-nav a{display:flex;align-items:center;gap:10px;padding:8px 12px 8px 32px;color:color-mix(in srgb,var(--shell-text, #fff) 95%,transparent);font-size:.9375rem;font-weight:500;text-decoration:none;border-left:2px solid transparent;border-radius:0 8px 8px 0;margin-right:10px;transition:color .15s,background .15s,border-color .15s}.sidebar-nav a:hover{color:color-mix(in srgb,var(--shell-text, #fff) 100%,transparent);background:color-mix(in srgb,var(--shell-text, #fff) 6%,transparent)}.sidebar-nav a.active{color:var(--shell-text, #fff);background:#60a5fa21;border-left-color:#60a5fa;font-weight:600}.sidebar-nav a:focus-visible{outline:2px solid rgba(96,165,250,.5);outline-offset:-2px}.nav-icon{display:flex;align-items:center;flex-shrink:0}.nav-label{flex:1}.nav-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:#ef4444;color:#fff;font-size:.625rem;font-weight:700;margin-left:auto}.sidebar-footer{padding:10px 14px;border-top:1px solid color-mix(in srgb,var(--shell-text, #fff) 6%,transparent)}.user-info{display:flex;align-items:center;gap:10px}.user-avatar{width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,#60a5fa38,#60a5fa14);border:1px solid rgba(96,165,250,.18);color:color-mix(in srgb,var(--shell-text, #fff) 88%,transparent);font-size:.75rem;font-weight:600;display:flex;align-items:center;justify-content:center;flex-shrink:0}.user-details{display:flex;flex-direction:column;min-width:0;flex:1}.user-name{font-size:.8125rem;font-weight:600;color:var(--shell-text, #fff);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.user-role{font-size:.6875rem;color:color-mix(in srgb,var(--shell-text, #fff) 80%,transparent);text-transform:uppercase;letter-spacing:.05em;font-weight:500}.btn-logout{background:none;border:none;cursor:pointer;color:color-mix(in srgb,var(--shell-text, #fff) 85%,transparent);padding:6px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:color .15s,background .15s}.btn-logout:hover{color:#f87171;background:#f871711a}.btn-logout:focus-visible{outline:2px solid rgba(96,165,250,.5);outline-offset:2px}.brand-full{display:flex;align-items:center;min-width:0;flex:1}.brand-mark{display:none}.shell.collapsed .brand-mark{width:36px;height:36px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:1.125rem;color:var(--shell-text, #fff);background:color-mix(in srgb,var(--shell-text, #fff) 15%,transparent)}.rail-toggle{display:none;align-items:center;justify-content:center;width:32px;height:32px;margin-left:auto;flex-shrink:0;border:none;background:none;cursor:pointer;border-radius:8px;color:color-mix(in srgb,var(--shell-text, #fff) 85%,transparent);transition:background .15s,color .15s}.rail-toggle:hover{background:color-mix(in srgb,var(--shell-text, #fff) 12%,transparent);color:var(--shell-text, #fff)}.rail-toggle:focus-visible{outline:2px solid rgba(96,165,250,.5);outline-offset:2px}.rail-divider{display:none}@media(min-width:1025px){.rail-toggle{display:flex}.sidebar{transition:width .2s cubic-bezier(.4,0,.2,1)}.shell.collapsed .sidebar{width:68px}.shell.collapsed .sidebar-header{flex-direction:column;justify-content:center;gap:4px;padding:8px 0}.shell.collapsed .brand-full{flex:none;width:44px;height:44px;overflow:hidden;border-radius:10px;justify-content:center}.shell.collapsed .brand-text{display:none}.shell.collapsed .rail-toggle{margin-left:0}.shell.collapsed .nav-group-label{display:none}.shell.collapsed .rail-divider{display:block;height:1px;margin:8px 14px;background:color-mix(in srgb,var(--shell-text, #fff) 20%,transparent)}.shell.collapsed .nav-group:first-child .rail-divider{display:none}.shell.collapsed .sidebar-nav a{position:relative;justify-content:center;padding:10px 0;margin:0 8px 2px;border-left:none;border-radius:8px}.shell.collapsed .sidebar-nav a.active{box-shadow:inset 3px 0 #60a5fa}.shell.collapsed .nav-label{display:none}.shell.collapsed .nav-badge{position:absolute;top:2px;right:4px;min-width:16px;height:16px;padding:0 4px;font-size:.5625rem;margin:0}.shell.collapsed .sidebar-footer{padding:10px 8px}.shell.collapsed .user-info{flex-direction:column;gap:8px}.shell.collapsed .user-details{display:none}}.main-area{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.top-header{display:flex;align-items:center;gap:8px;padding:0 24px;background:#fff;box-shadow:0 1px 3px #00000012,0 1px #0000000a;min-height:64px;box-sizing:border-box;position:relative;z-index:50}.hamburger{display:none;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:none;cursor:pointer;color:#374151;border-radius:8px;flex-shrink:0;transition:background .15s,color .15s}.hamburger:hover{background:#f3f4f6}.hamburger:focus-visible{outline:2px solid rgba(59,130,246,.5);outline-offset:2px}.page-title{font-size:1.25rem;font-weight:700;color:#111827;margin:0;letter-spacing:-.02em}.page-title:focus{outline:none}.read-only-badge{display:inline-flex;align-items:center;flex-shrink:0;padding:2px 8px;border-radius:9999px;font-size:.6875rem;font-weight:600;letter-spacing:.02em;text-transform:uppercase;background:#fef9c3;color:#854d0e;border:1px solid #fde68a;white-space:nowrap}.header-start{display:flex;align-items:center;min-width:0;margin-left:8px;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.header-start:empty{display:none}.header-start::-webkit-scrollbar{display:none}.header-end{display:flex;align-items:center;margin-left:auto}.content:focus{outline:none}.content{--shell-content-padding: 24px;flex:1;overflow-y:auto;padding:var(--shell-content-padding);background:#f7f8f6;display:flex;flex-direction:column;box-sizing:border-box;min-height:0}.content>*{flex:1;min-height:0;display:flex;flex-direction:column}.skip-link{position:absolute;top:-48px;left:8px;z-index:300;padding:8px 14px;border-radius:6px;background:#fff;color:#1d4ed8;font-size:.875rem;font-weight:600;text-decoration:none;box-shadow:0 2px 10px #00000040}.skip-link:focus{top:8px;outline:2px solid #1d4ed8;outline-offset:2px}.nav-group-label--static{cursor:default}@media(max-width:1024px){.hamburger{display:flex}.sidebar{position:fixed;top:0;left:0;bottom:0;z-index:200;transform:translate(-100%);transition:transform .26s cubic-bezier(.4,0,.2,1),box-shadow .26s cubic-bezier(.4,0,.2,1),visibility 0s linear .26s;visibility:hidden;box-shadow:none}.shell.sidebar-open .sidebar{transform:translate(0);box-shadow:4px 0 32px #0000004d;visibility:visible;transition-delay:0s}.shell.sidebar-open .sidebar-backdrop{display:block}.main-area{width:100%}.top-header{padding:0 16px;gap:4px}.content{--shell-content-padding: 16px}}@media(max-width:480px){.page-title{font-size:1.0625rem}.content{--shell-content-padding: 12px}}@media(pointer:coarse),(max-width:480px){.sidebar-nav a,.nav-group-label{min-height:44px}.btn-logout,.hamburger,.rail-toggle{min-width:44px;min-height:44px}}@media(prefers-reduced-motion:reduce){.chevron,.sidebar-nav a,.sidebar{transition:none!important}}\n"]
32949
33134
  }]
32950
33135
  }],
32951
33136
  propDecorators: {
@@ -32965,6 +33150,14 @@ i0.ɵɵngDeclareClassMetadata({
32965
33150
  required: false
32966
33151
  }]
32967
33152
  }],
33153
+ showToast: [{
33154
+ type: i0.Input,
33155
+ args: [{
33156
+ isSignal: true,
33157
+ alias: "showToast",
33158
+ required: false
33159
+ }]
33160
+ }],
32968
33161
  appName: [{
32969
33162
  type: i0.Input,
32970
33163
  args: [{
@@ -41108,6 +41301,69 @@ i0.ɵɵngDeclareClassMetadata({
41108
41301
  }]
41109
41302
  }
41110
41303
  });
41304
+ const MIN_HEIGHT_PX = 240;
41305
+ var FillViewportDirective = class FillViewportDirective {
41306
+ constructor() {
41307
+ this.el = inject(ElementRef).nativeElement;
41308
+ const destroyRef = inject(DestroyRef);
41309
+ afterNextRender(() => {
41310
+ const scroller = this.el.closest("main");
41311
+ if (!scroller) return;
41312
+ let frame = 0;
41313
+ const measure = () => {
41314
+ cancelAnimationFrame(frame);
41315
+ frame = requestAnimationFrame(() => {
41316
+ const padBottom = parseFloat(getComputedStyle(scroller).paddingBottom) || 0;
41317
+ const topInContent = this.el.getBoundingClientRect().top - scroller.getBoundingClientRect().top + scroller.scrollTop;
41318
+ const height = Math.max(MIN_HEIGHT_PX, Math.floor(scroller.clientHeight - padBottom - topInContent));
41319
+ this.el.style.setProperty("--cols-h", `${height}px`);
41320
+ });
41321
+ };
41322
+ const observer = new ResizeObserver(measure);
41323
+ observer.observe(scroller);
41324
+ if (this.el.parentElement) observer.observe(this.el.parentElement);
41325
+ measure();
41326
+ destroyRef.onDestroy(() => {
41327
+ observer.disconnect();
41328
+ cancelAnimationFrame(frame);
41329
+ });
41330
+ });
41331
+ }
41332
+ static {
41333
+ this.ɵfac = i0.ɵɵngDeclareFactory({
41334
+ minVersion: "12.0.0",
41335
+ version: "22.2.2",
41336
+ ngImport: i0,
41337
+ type: FillViewportDirective,
41338
+ deps: [],
41339
+ target: i0.ɵɵFactoryTarget.Directive
41340
+ });
41341
+ }
41342
+ static {
41343
+ this.ɵdir = i0.ɵɵngDeclareDirective({
41344
+ minVersion: "14.0.0",
41345
+ version: "22.2.2",
41346
+ type: FillViewportDirective,
41347
+ isStandalone: true,
41348
+ selector: "[uiFillViewport]",
41349
+ ngImport: i0
41350
+ });
41351
+ }
41352
+ };
41353
+ i0.ɵɵngDeclareClassMetadata({
41354
+ minVersion: "12.0.0",
41355
+ version: "22.2.2",
41356
+ ngImport: i0,
41357
+ type: FillViewportDirective,
41358
+ decorators: [{
41359
+ type: Directive,
41360
+ args: [{
41361
+ selector: "[uiFillViewport]",
41362
+ standalone: true
41363
+ }]
41364
+ }],
41365
+ ctorParameters: () => []
41366
+ });
41111
41367
  const JUSTIFY = {
41112
41368
  start: "flex-start",
41113
41369
  center: "center",
@@ -53301,6 +53557,6 @@ i0.ɵɵngDeclareClassMetadata({
53301
53557
  }]
53302
53558
  }
53303
53559
  });
53304
- export { ActionBarComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BankAccountFormComponent, BarRowComponent, BoardCardDirective, BoardComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, CalendarComponent, CardListItemComponent, CheckboxComponent, CheckboxTrailingDirective, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, ConversationRichBodyComponent, ConversationsComponent, DEFAULT_BANK_ACCOUNT_TYPE_OPTIONS, DEFAULT_BANK_HOLDER_TYPE_OPTIONS, DEFAULT_BANK_MANDATE_TEXT, DEFAULT_EMAIL_TEMPLATE_BLOCK_GROUPS, DEFAULT_EMAIL_TEMPLATE_VARIABLE_GROUPS, DEFAULT_PASSWORD_RULES, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DropdownComponent, EMAIL_BLOCK_DRAG_TYPE, EMAIL_TEMPLATE_MAX_BODY, EMAIL_TEMPLATE_MAX_TEXT, EMAIL_TEMPLATE_START_TEXT, EmailTemplateEditorComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FadeComponent, FileInputComponent, FixedFooterComponent, FormColSpanDirective, FormComponent, FormRowComponent, FormSectionComponent, HintComponent, IDX_BEHAVIOR_SIGNALS, INTEGRATION_CATALOG, INTEGRATION_FIELD_DEFS, INTEGRATION_GROUP_ORDER, INTEGRATION_OPTION_DEFS, IconComponent, ImageComponent, ImageGalleryComponent, ImageGalleryDialogComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, ImportSourceGridComponent, KeypadComponent, KpiCardComponent, LAYOUT_GAP_PX, ListComponent, ListItemComponent, LiveRegionComponent, MAX_EMAIL_ADDRESS_LENGTH, ModalComponent, MoreMenuComponent, MultiSelectComponent, NOTES_MAX_LENGTH, NotesComponent, OfflineBannerComponent, OptionCardComponent, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PageComponent, PaginationComponent, PanelInfoListComponent, PasswordRequirementsComponent, PdfHotspotComponent, PhoneNumberPickerComponent, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, RadioOptionContentDirective, ReadonlyFieldsetComponent, ReminderAlertsComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SETUP_DONE_KEY, SETUP_INTEGRATIONS, SearchInputComponent, SectionHeaderComponent, SelectComponent, SetupWizardComponent, SetupWizardStepDirective, SetupWizardStepHeaderDirective, ShareMenuComponent, ShowComponent, SidePanelComponent, SidebarLayoutComponent, SignaturePadComponent, SkeletonComponent, SnackbarComponent, SnackbarService, StackComponent, StarComponent, StepperComponent, TableToolbarComponent, TextComponent, TextInputComponent, TextTemplatePickerComponent, TextareaInputComponent, TimeInputComponent, TimelineComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_STATES, UiFieldValidity, acceptLabel, appShellGroupsStorageKey, autoVariant, blockHasContent, buildDefaultSchedule, buildPreviewDocument, buildVideoBlockHtml, builtInActionIcon, businessTimeOptions, conversationDateLabel, conversationHtmlToText, conversationInitial, conversationMessageStatusLabel, conversationMessageStatusMark, createFieldReveal, decodeFilterValues, digitsOnly, downloadBlob, emailShareUrl, encodeFilterValue, encodeFilterValues, errorContextInterceptor, escapeHtml, facebookShareUrl, fileMatchesAccept, formatAddress, formatCategoryLabel, formatConversationPhone, formatConversationTime, formatCurrency, formatFileSize, formatIsoDate, formatIsoDateTime, formatMessageTime, formatTime, formatVideoDuration, getEligibleIds, getEligibleOptions, getErrorMessage, gmailShareUrl, groupMessagesByDay, humanReadableMessage, iconPath, insideEditorBlock, integrationPlainText, integrationsForApp, integrationsOnlyFor, isBlockDrag, isValidEmailAddress, isWebUrl, isoKey, issueToErrors, linkedInShareUrl, maxLengthIssue, mergeDescribedBy, normalizeHexColor, outlookShareUrl, parseBizHours, parseIso, parseTime, passwordMeetsRules, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, serializeBizHours, serializedTextLength, setupIntegrations, splitIntro, truncateConversationText, xShareUrl };
53560
+ export { ActionBarComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BankAccountFormComponent, BarRowComponent, BoardCardDirective, BoardComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, CalendarComponent, CardListItemComponent, CheckboxComponent, CheckboxTrailingDirective, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, ConversationRichBodyComponent, ConversationsComponent, DEFAULT_BANK_ACCOUNT_TYPE_OPTIONS, DEFAULT_BANK_HOLDER_TYPE_OPTIONS, DEFAULT_BANK_MANDATE_TEXT, DEFAULT_EMAIL_TEMPLATE_BLOCK_GROUPS, DEFAULT_EMAIL_TEMPLATE_VARIABLE_GROUPS, DEFAULT_PASSWORD_RULES, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DropdownComponent, EMAIL_BLOCK_DRAG_TYPE, EMAIL_TEMPLATE_MAX_BODY, EMAIL_TEMPLATE_MAX_TEXT, EMAIL_TEMPLATE_START_TEXT, EmailTemplateEditorComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FadeComponent, FileInputComponent, FillViewportDirective, FixedFooterComponent, FormColSpanDirective, FormComponent, FormRowComponent, FormSectionComponent, HintComponent, IDX_BEHAVIOR_SIGNALS, INTEGRATION_CATALOG, INTEGRATION_FIELD_DEFS, INTEGRATION_GROUP_ORDER, INTEGRATION_OPTION_DEFS, IconComponent, ImageComponent, ImageGalleryComponent, ImageGalleryDialogComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, ImportSourceGridComponent, KeypadComponent, KpiCardComponent, LAYOUT_GAP_PX, ListComponent, ListItemComponent, LiveRegionComponent, MAX_EMAIL_ADDRESS_LENGTH, ModalComponent, MoreMenuComponent, MultiSelectComponent, NOTES_MAX_LENGTH, NotesComponent, OfflineBannerComponent, OptionCardComponent, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PageComponent, PaginationComponent, PanelInfoListComponent, PasswordRequirementsComponent, PdfHotspotComponent, PhoneNumberPickerComponent, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, RadioOptionContentDirective, ReadonlyFieldsetComponent, ReminderAlertsComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SETUP_DONE_KEY, SETUP_INTEGRATIONS, SearchInputComponent, SectionHeaderComponent, SelectComponent, SetupWizardComponent, SetupWizardStepDirective, SetupWizardStepHeaderDirective, ShareMenuComponent, ShowComponent, SidePanelComponent, SidebarLayoutComponent, SignaturePadComponent, SkeletonComponent, SnackbarComponent, SnackbarService, StackComponent, StarComponent, StepperComponent, TableToolbarComponent, TextComponent, TextInputComponent, TextTemplatePickerComponent, TextareaInputComponent, TimeInputComponent, TimelineComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_STATES, UiFieldValidity, acceptLabel, appShellGroupsStorageKey, autoVariant, blockHasContent, buildDefaultSchedule, buildPreviewDocument, buildVideoBlockHtml, builtInActionIcon, businessTimeOptions, conversationDateLabel, conversationHtmlToText, conversationInitial, conversationMessageStatusLabel, conversationMessageStatusMark, createFieldReveal, decodeFilterValues, digitsOnly, downloadBlob, emailShareUrl, encodeFilterValue, encodeFilterValues, errorContextInterceptor, escapeHtml, facebookShareUrl, fileMatchesAccept, formatAddress, formatCategoryLabel, formatConversationPhone, formatConversationTime, formatCurrency, formatFileSize, formatIsoDate, formatIsoDateTime, formatMessageTime, formatTime, formatVideoDuration, getEligibleIds, getEligibleOptions, getErrorMessage, gmailShareUrl, groupMessagesByDay, humanReadableMessage, iconPath, insideEditorBlock, integrationPlainText, integrationsForApp, integrationsOnlyFor, isBlockDrag, isValidEmailAddress, isWebUrl, isoKey, issueToErrors, linkedInShareUrl, maxLengthIssue, mergeDescribedBy, normalizeHexColor, outlookShareUrl, parseBizHours, parseIso, parseTime, passwordMeetsRules, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, serializeBizHours, serializedTextLength, setupIntegrations, splitIntro, truncateConversationText, xShareUrl };
53305
53561
 
53306
53562
  //# sourceMappingURL=forgeroute-ui.mjs.map