@forgeroute/ui 0.4.19 → 0.4.21

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.
@@ -496,6 +496,7 @@ var PaginationComponent = class PaginationComponent {
496
496
  this.pageSize = input(25, ...ngDevMode ? [{ debugName: "pageSize" }] : /* istanbul ignore next */ []);
497
497
  this.totalItems = input(0, ...ngDevMode ? [{ debugName: "totalItems" }] : /* istanbul ignore next */ []);
498
498
  this.detached = input(false, ...ngDevMode ? [{ debugName: "detached" }] : /* istanbul ignore next */ []);
499
+ this.embedded = input(false, ...ngDevMode ? [{ debugName: "embedded" }] : /* istanbul ignore next */ []);
499
500
  this.pageChange = output();
500
501
  this.totalPages = computed(() => Math.ceil(this.totalItems() / this.pageSize()) || 1, ...ngDevMode ? [{ debugName: "totalPages" }] : /* istanbul ignore next */ []);
501
502
  this.startItem = computed(() => (this.page() - 1) * this.pageSize() + 1, ...ngDevMode ? [{ debugName: "startItem" }] : /* istanbul ignore next */ []);
@@ -561,10 +562,20 @@ var PaginationComponent = class PaginationComponent {
561
562
  isSignal: true,
562
563
  isRequired: false,
563
564
  transformFunction: null
565
+ },
566
+ embedded: {
567
+ classPropertyName: "embedded",
568
+ publicName: "embedded",
569
+ isSignal: true,
570
+ isRequired: false,
571
+ transformFunction: null
564
572
  }
565
573
  },
566
574
  outputs: { pageChange: "pageChange" },
567
- host: { properties: { "class.pagination-detached": "detached()" } },
575
+ host: { properties: {
576
+ "class.pagination-detached": "detached()",
577
+ "class.pagination-embedded": "embedded()"
578
+ } },
568
579
  ngImport: i0,
569
580
  template: `
570
581
  @if (totalItems() > pageSize()) {
@@ -589,7 +600,7 @@ var PaginationComponent = class PaginationComponent {
589
600
  }
590
601
  `,
591
602
  isInline: true,
592
- styles: [".pagination{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;gap:12px;flex-wrap:wrap;background:#fff;border:1px solid #e2e8f0;border-top:none;border-radius:0 0 10px 10px}:host(.pagination-detached) .pagination{border:1px solid #e2e8f0;border-radius:10px;margin-top:4px}.pagination-info{font-size:.8125rem;color:#64748b}.pagination-controls{display:flex;align-items:center;gap:4px}.pagination-nav{width:32px;height:32px;border-radius:8px;border:1px solid #e2e8f0;background:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#334155;font-family:inherit;transition:background .1s}.pagination-nav:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.pagination-nav:disabled{opacity:.4;cursor:default}.pagination-nav:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pagination-page{min-width:32px;height:32px;border-radius:8px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#334155;cursor:pointer;display:flex;align-items:center;justify-content:center;font-family:inherit;transition:background .1s,border-color .1s}.pagination-page:hover{background:#f8fafc;border-color:#cbd5e1}.pagination-page.active{background:#3b82f6;color:#fff;border-color:#3b82f6}.pagination-page:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pagination-ellipsis{padding:0 4px;color:#94a3b8;font-size:.8125rem}@media(max-width:640px),(pointer:coarse){.pagination-controls{flex-wrap:wrap;justify-content:center}.pagination-nav{width:44px;height:44px}.pagination-page{min-width:44px;height:44px}}@media(max-width:480px){.pagination{justify-content:center;padding:10px 12px}.pagination-info{width:100%;text-align:center}}\n"],
603
+ styles: [".pagination{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;gap:12px;flex-wrap:wrap;background:#fff;border:1px solid #e2e8f0;border-top:none;border-radius:0 0 10px 10px}:host(.pagination-detached) .pagination{border:1px solid #e2e8f0;border-radius:10px;margin-top:4px}:host(.pagination-embedded) .pagination{background:transparent;border:none;border-radius:0;padding:0;margin-top:0}.pagination-info{font-size:.8125rem;color:#64748b}.pagination-controls{display:flex;align-items:center;gap:4px}.pagination-nav{width:32px;height:32px;border-radius:8px;border:1px solid #e2e8f0;background:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#334155;font-family:inherit;transition:background .1s}.pagination-nav:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.pagination-nav:disabled{opacity:.4;cursor:default}.pagination-nav:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pagination-page{min-width:32px;height:32px;border-radius:8px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#334155;cursor:pointer;display:flex;align-items:center;justify-content:center;font-family:inherit;transition:background .1s,border-color .1s}.pagination-page:hover{background:#f8fafc;border-color:#cbd5e1}.pagination-page.active{background:#3b82f6;color:#fff;border-color:#3b82f6}.pagination-page:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pagination-ellipsis{padding:0 4px;color:#94a3b8;font-size:.8125rem}@media(max-width:640px),(pointer:coarse){.pagination-controls{flex-wrap:wrap;justify-content:center}.pagination-nav{width:44px;height:44px}.pagination-page{min-width:44px;height:44px}}@media(max-width:480px){.pagination{justify-content:center;padding:10px 12px}.pagination-info{width:100%;text-align:center}}\n"],
593
604
  changeDetection: i0.ChangeDetectionStrategy.OnPush
594
605
  });
595
606
  }
@@ -605,7 +616,10 @@ i0.ɵɵngDeclareClassMetadata({
605
616
  selector: "ui-pagination",
606
617
  standalone: true,
607
618
  changeDetection: ChangeDetectionStrategy.OnPush,
608
- host: { "[class.pagination-detached]": "detached()" },
619
+ host: {
620
+ "[class.pagination-detached]": "detached()",
621
+ "[class.pagination-embedded]": "embedded()"
622
+ },
609
623
  template: `
610
624
  @if (totalItems() > pageSize()) {
611
625
  <nav class="pagination" role="navigation" aria-label="Pagination">
@@ -628,7 +642,7 @@ i0.ɵɵngDeclareClassMetadata({
628
642
  </nav>
629
643
  }
630
644
  `,
631
- styles: [".pagination{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;gap:12px;flex-wrap:wrap;background:#fff;border:1px solid #e2e8f0;border-top:none;border-radius:0 0 10px 10px}:host(.pagination-detached) .pagination{border:1px solid #e2e8f0;border-radius:10px;margin-top:4px}.pagination-info{font-size:.8125rem;color:#64748b}.pagination-controls{display:flex;align-items:center;gap:4px}.pagination-nav{width:32px;height:32px;border-radius:8px;border:1px solid #e2e8f0;background:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#334155;font-family:inherit;transition:background .1s}.pagination-nav:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.pagination-nav:disabled{opacity:.4;cursor:default}.pagination-nav:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pagination-page{min-width:32px;height:32px;border-radius:8px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#334155;cursor:pointer;display:flex;align-items:center;justify-content:center;font-family:inherit;transition:background .1s,border-color .1s}.pagination-page:hover{background:#f8fafc;border-color:#cbd5e1}.pagination-page.active{background:#3b82f6;color:#fff;border-color:#3b82f6}.pagination-page:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pagination-ellipsis{padding:0 4px;color:#94a3b8;font-size:.8125rem}@media(max-width:640px),(pointer:coarse){.pagination-controls{flex-wrap:wrap;justify-content:center}.pagination-nav{width:44px;height:44px}.pagination-page{min-width:44px;height:44px}}@media(max-width:480px){.pagination{justify-content:center;padding:10px 12px}.pagination-info{width:100%;text-align:center}}\n"]
645
+ styles: [".pagination{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;gap:12px;flex-wrap:wrap;background:#fff;border:1px solid #e2e8f0;border-top:none;border-radius:0 0 10px 10px}:host(.pagination-detached) .pagination{border:1px solid #e2e8f0;border-radius:10px;margin-top:4px}:host(.pagination-embedded) .pagination{background:transparent;border:none;border-radius:0;padding:0;margin-top:0}.pagination-info{font-size:.8125rem;color:#64748b}.pagination-controls{display:flex;align-items:center;gap:4px}.pagination-nav{width:32px;height:32px;border-radius:8px;border:1px solid #e2e8f0;background:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#334155;font-family:inherit;transition:background .1s}.pagination-nav:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1}.pagination-nav:disabled{opacity:.4;cursor:default}.pagination-nav:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pagination-page{min-width:32px;height:32px;border-radius:8px;border:1px solid #e2e8f0;background:#fff;font-size:.8125rem;font-weight:500;color:#334155;cursor:pointer;display:flex;align-items:center;justify-content:center;font-family:inherit;transition:background .1s,border-color .1s}.pagination-page:hover{background:#f8fafc;border-color:#cbd5e1}.pagination-page.active{background:#3b82f6;color:#fff;border-color:#3b82f6}.pagination-page:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.pagination-ellipsis{padding:0 4px;color:#94a3b8;font-size:.8125rem}@media(max-width:640px),(pointer:coarse){.pagination-controls{flex-wrap:wrap;justify-content:center}.pagination-nav{width:44px;height:44px}.pagination-page{min-width:44px;height:44px}}@media(max-width:480px){.pagination{justify-content:center;padding:10px 12px}.pagination-info{width:100%;text-align:center}}\n"]
632
646
  }]
633
647
  }],
634
648
  propDecorators: {
@@ -664,6 +678,14 @@ i0.ɵɵngDeclareClassMetadata({
664
678
  required: false
665
679
  }]
666
680
  }],
681
+ embedded: [{
682
+ type: i0.Input,
683
+ args: [{
684
+ isSignal: true,
685
+ alias: "embedded",
686
+ required: false
687
+ }]
688
+ }],
667
689
  pageChange: [{
668
690
  type: i0.Output,
669
691
  args: ["pageChange"]
@@ -4316,6 +4338,9 @@ const EXTRA_ICONS = {
4316
4338
  "card": "M3 4h18a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z M1 10h22",
4317
4339
  "view-off": "M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z M12 9a3 3 0 1 0 0 6 3 3 0 0 0 0-6z M3 3l18 18",
4318
4340
  "refund": "M3 10h10a8 8 0 0 1 8 8v2 M3 10l6 6 M3 10l6-6",
4341
+ "link": "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71 M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71",
4342
+ "chart": "M18 20V10 M12 20V4 M6 20v-6",
4343
+ "save": "M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z M17 21v-8H7v8 M7 3v5h8",
4319
4344
  "bank": "M3 21h18 M3 10h18 M5 6l7-3 7 3 M4 10v11 M20 10v11 M8 14v3 M12 14v3 M16 14v3"
4320
4345
  };
4321
4346
  function iconPath(name) {
@@ -4742,6 +4767,7 @@ var TextInputComponent = class TextInputComponent {
4742
4767
  constructor() {
4743
4768
  this.label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
4744
4769
  this.ariaLabel = input("", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
4770
+ this.inputTestId = input("", ...ngDevMode ? [{ debugName: "inputTestId" }] : /* istanbul ignore next */ []);
4745
4771
  this.placeholder = input("", ...ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []);
4746
4772
  this.prefix = input("", ...ngDevMode ? [{ debugName: "prefix" }] : /* istanbul ignore next */ []);
4747
4773
  this.revealable = input(false, ...ngDevMode ? [{ debugName: "revealable" }] : /* istanbul ignore next */ []);
@@ -4973,6 +4999,13 @@ var TextInputComponent = class TextInputComponent {
4973
4999
  isRequired: false,
4974
5000
  transformFunction: null
4975
5001
  },
5002
+ inputTestId: {
5003
+ classPropertyName: "inputTestId",
5004
+ publicName: "inputTestId",
5005
+ isSignal: true,
5006
+ isRequired: false,
5007
+ transformFunction: null
5008
+ },
4976
5009
  placeholder: {
4977
5010
  classPropertyName: "placeholder",
4978
5011
  publicName: "placeholder",
@@ -5163,16 +5196,20 @@ var TextInputComponent = class TextInputComponent {
5163
5196
  <div class="ti-field" [class.ti-error]="_activeError()" [class.ti-disabled]="disabled()"
5164
5197
  [class.ti-prefixed]="!!prefix() || _revealable()" [style.--ti-input-row]="(prefix() || _revealable()) ? (label() ? 2 : 1) : null">
5165
5198
  @if (label()) {
5166
- <label class="ti-label" [for]="_inputId">
5167
- {{ label() }}
5168
- @if (required()) { <span class="ti-required" aria-hidden="true">*</span> }
5169
- </label>
5199
+ <div class="ti-label-row">
5200
+ <label class="ti-label" [for]="_inputId">
5201
+ {{ label() }}
5202
+ @if (required()) { <span class="ti-required" aria-hidden="true">*</span> }
5203
+ </label>
5204
+ <ng-content select="[uiLabelEnd]" />
5205
+ </div>
5170
5206
  }
5171
5207
  <input
5172
5208
  class="ti-input"
5173
5209
  [style.padding-left]="_prefixPadding()"
5174
5210
  [style.padding-right]="_revealable() ? '44px' : null"
5175
5211
  [id]="_inputId"
5212
+ [attr.data-testid]="inputTestId() || null"
5176
5213
  [type]="_inputType()"
5177
5214
  [attr.inputmode]="inputmode() || (type() === 'tel' ? 'tel' : integer() ? 'numeric' : null)"
5178
5215
  [placeholder]="placeholder()"
@@ -5214,7 +5251,7 @@ var TextInputComponent = class TextInputComponent {
5214
5251
  </div>
5215
5252
  `,
5216
5253
  isInline: true,
5217
- styles: [":host{display:block}.ti-field{display:flex;flex-direction:column;gap:6px}.ti-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ti-required{color:#dc2626;margin-left:2px}.ti-prefixed{display:grid;grid-template-columns:minmax(0,1fr)}.ti-prefixed .ti-input{grid-row:var(--ti-input-row);grid-column:1}.ti-prefix{grid-row:var(--ti-input-row);grid-column:1;justify-self:start;align-self:center;margin-left:12px;font-size:.875rem;line-height:1;color:#64748b;pointer-events:none}@media(max-width:480px){.ti-prefix{font-size:1rem}}.ti-disabled .ti-prefix{opacity:.5}.ti-reveal{grid-row:var(--ti-input-row);grid-column:1;justify-self:end;align-self:center;margin-right:6px;position:relative;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:0;border-radius:6px;background:transparent;color:#64748b;cursor:pointer}.ti-reveal:hover:not(:disabled){color:#1e293b;background:#f1f5f9}.ti-reveal:focus-visible{outline:2px solid #3b82f6;outline-offset:0}.ti-reveal:disabled{opacity:.5;cursor:not-allowed}@media(pointer:coarse),(max-width:480px){.ti-reveal{width:44px;height:44px;margin-right:0}}.ti-input{width:100%;box-sizing:border-box;padding:9px 12px;font-size:.875rem;font-family:inherit;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px;outline:none;transition:border-color .15s,box-shadow .15s}.ti-input::placeholder{color:#94a3b8}.ti-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ti-input:read-only{background:#f8fafc;cursor:default}.ti-error .ti-input{border-color:#ef4444}.ti-error .ti-input:focus{box-shadow:0 0 0 3px #ef44441f}.ti-disabled .ti-input{opacity:.5;cursor:not-allowed}.ti-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ti-desc-error{color:#dc2626}@media(max-width:480px){.ti-input{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.ti-input{min-height:44px}}\n"],
5254
+ styles: [":host{display:block}.ti-field{display:flex;flex-direction:column;gap:6px}.ti-label-row{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.ti-label-row>[uiLabelEnd]{margin-left:auto}.ti-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ti-required{color:#dc2626;margin-left:2px}.ti-prefixed{display:grid;grid-template-columns:minmax(0,1fr)}.ti-prefixed .ti-input{grid-row:var(--ti-input-row);grid-column:1}.ti-prefix{grid-row:var(--ti-input-row);grid-column:1;justify-self:start;align-self:center;margin-left:12px;font-size:.875rem;line-height:1;color:#64748b;pointer-events:none}@media(max-width:480px){.ti-prefix{font-size:1rem}}.ti-disabled .ti-prefix{opacity:.5}.ti-reveal{grid-row:var(--ti-input-row);grid-column:1;justify-self:end;align-self:center;margin-right:6px;position:relative;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:0;border-radius:6px;background:transparent;color:#64748b;cursor:pointer}.ti-reveal:hover:not(:disabled){color:#1e293b;background:#f1f5f9}.ti-reveal:focus-visible{outline:2px solid #3b82f6;outline-offset:0}.ti-reveal:disabled{opacity:.5;cursor:not-allowed}@media(pointer:coarse),(max-width:480px){.ti-reveal{width:44px;height:44px;margin-right:0}}.ti-input{width:100%;box-sizing:border-box;padding:9px 12px;font-size:.875rem;font-family:inherit;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px;outline:none;transition:border-color .15s,box-shadow .15s}.ti-input::placeholder{color:#94a3b8}.ti-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ti-input:read-only{background:#f8fafc;cursor:default}.ti-error .ti-input{border-color:#ef4444}.ti-error .ti-input:focus{box-shadow:0 0 0 3px #ef44441f}.ti-disabled .ti-input{opacity:.5;cursor:not-allowed}.ti-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ti-desc-error{color:#dc2626}@media(max-width:480px){.ti-input{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.ti-input{min-height:44px}}\n"],
5218
5255
  dependencies: [{
5219
5256
  kind: "component",
5220
5257
  type: PasswordRequirementsComponent,
@@ -5261,16 +5298,20 @@ i0.ɵɵngDeclareClassMetadata({
5261
5298
  <div class="ti-field" [class.ti-error]="_activeError()" [class.ti-disabled]="disabled()"
5262
5299
  [class.ti-prefixed]="!!prefix() || _revealable()" [style.--ti-input-row]="(prefix() || _revealable()) ? (label() ? 2 : 1) : null">
5263
5300
  @if (label()) {
5264
- <label class="ti-label" [for]="_inputId">
5265
- {{ label() }}
5266
- @if (required()) { <span class="ti-required" aria-hidden="true">*</span> }
5267
- </label>
5301
+ <div class="ti-label-row">
5302
+ <label class="ti-label" [for]="_inputId">
5303
+ {{ label() }}
5304
+ @if (required()) { <span class="ti-required" aria-hidden="true">*</span> }
5305
+ </label>
5306
+ <ng-content select="[uiLabelEnd]" />
5307
+ </div>
5268
5308
  }
5269
5309
  <input
5270
5310
  class="ti-input"
5271
5311
  [style.padding-left]="_prefixPadding()"
5272
5312
  [style.padding-right]="_revealable() ? '44px' : null"
5273
5313
  [id]="_inputId"
5314
+ [attr.data-testid]="inputTestId() || null"
5274
5315
  [type]="_inputType()"
5275
5316
  [attr.inputmode]="inputmode() || (type() === 'tel' ? 'tel' : integer() ? 'numeric' : null)"
5276
5317
  [placeholder]="placeholder()"
@@ -5311,7 +5352,7 @@ i0.ɵɵngDeclareClassMetadata({
5311
5352
  }
5312
5353
  </div>
5313
5354
  `,
5314
- styles: [":host{display:block}.ti-field{display:flex;flex-direction:column;gap:6px}.ti-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ti-required{color:#dc2626;margin-left:2px}.ti-prefixed{display:grid;grid-template-columns:minmax(0,1fr)}.ti-prefixed .ti-input{grid-row:var(--ti-input-row);grid-column:1}.ti-prefix{grid-row:var(--ti-input-row);grid-column:1;justify-self:start;align-self:center;margin-left:12px;font-size:.875rem;line-height:1;color:#64748b;pointer-events:none}@media(max-width:480px){.ti-prefix{font-size:1rem}}.ti-disabled .ti-prefix{opacity:.5}.ti-reveal{grid-row:var(--ti-input-row);grid-column:1;justify-self:end;align-self:center;margin-right:6px;position:relative;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:0;border-radius:6px;background:transparent;color:#64748b;cursor:pointer}.ti-reveal:hover:not(:disabled){color:#1e293b;background:#f1f5f9}.ti-reveal:focus-visible{outline:2px solid #3b82f6;outline-offset:0}.ti-reveal:disabled{opacity:.5;cursor:not-allowed}@media(pointer:coarse),(max-width:480px){.ti-reveal{width:44px;height:44px;margin-right:0}}.ti-input{width:100%;box-sizing:border-box;padding:9px 12px;font-size:.875rem;font-family:inherit;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px;outline:none;transition:border-color .15s,box-shadow .15s}.ti-input::placeholder{color:#94a3b8}.ti-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ti-input:read-only{background:#f8fafc;cursor:default}.ti-error .ti-input{border-color:#ef4444}.ti-error .ti-input:focus{box-shadow:0 0 0 3px #ef44441f}.ti-disabled .ti-input{opacity:.5;cursor:not-allowed}.ti-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ti-desc-error{color:#dc2626}@media(max-width:480px){.ti-input{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.ti-input{min-height:44px}}\n"]
5355
+ styles: [":host{display:block}.ti-field{display:flex;flex-direction:column;gap:6px}.ti-label-row{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.ti-label-row>[uiLabelEnd]{margin-left:auto}.ti-label{font-size:.8125rem;font-weight:600;color:#374151;line-height:1}.ti-required{color:#dc2626;margin-left:2px}.ti-prefixed{display:grid;grid-template-columns:minmax(0,1fr)}.ti-prefixed .ti-input{grid-row:var(--ti-input-row);grid-column:1}.ti-prefix{grid-row:var(--ti-input-row);grid-column:1;justify-self:start;align-self:center;margin-left:12px;font-size:.875rem;line-height:1;color:#64748b;pointer-events:none}@media(max-width:480px){.ti-prefix{font-size:1rem}}.ti-disabled .ti-prefix{opacity:.5}.ti-reveal{grid-row:var(--ti-input-row);grid-column:1;justify-self:end;align-self:center;margin-right:6px;position:relative;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:0;border-radius:6px;background:transparent;color:#64748b;cursor:pointer}.ti-reveal:hover:not(:disabled){color:#1e293b;background:#f1f5f9}.ti-reveal:focus-visible{outline:2px solid #3b82f6;outline-offset:0}.ti-reveal:disabled{opacity:.5;cursor:not-allowed}@media(pointer:coarse),(max-width:480px){.ti-reveal{width:44px;height:44px;margin-right:0}}.ti-input{width:100%;box-sizing:border-box;padding:9px 12px;font-size:.875rem;font-family:inherit;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px;outline:none;transition:border-color .15s,box-shadow .15s}.ti-input::placeholder{color:#94a3b8}.ti-input:focus{border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61f}.ti-input:read-only{background:#f8fafc;cursor:default}.ti-error .ti-input{border-color:#ef4444}.ti-error .ti-input:focus{box-shadow:0 0 0 3px #ef44441f}.ti-disabled .ti-input{opacity:.5;cursor:not-allowed}.ti-desc{margin:0;font-size:.75rem;line-height:1.4;color:#64748b}.ti-desc-error{color:#dc2626}@media(max-width:480px){.ti-input{font-size:1rem}}@media(pointer:coarse),(max-width:480px){.ti-input{min-height:44px}}\n"]
5315
5356
  }]
5316
5357
  }],
5317
5358
  ctorParameters: () => [],
@@ -5332,6 +5373,14 @@ i0.ɵɵngDeclareClassMetadata({
5332
5373
  required: false
5333
5374
  }]
5334
5375
  }],
5376
+ inputTestId: [{
5377
+ type: i0.Input,
5378
+ args: [{
5379
+ isSignal: true,
5380
+ alias: "inputTestId",
5381
+ required: false
5382
+ }]
5383
+ }],
5335
5384
  placeholder: [{
5336
5385
  type: i0.Input,
5337
5386
  args: [{
@@ -5987,6 +6036,7 @@ var TableToolbarComponent = class TableToolbarComponent {
5987
6036
  inputs: [
5988
6037
  "label",
5989
6038
  "ariaLabel",
6039
+ "inputTestId",
5990
6040
  "placeholder",
5991
6041
  "prefix",
5992
6042
  "revealable",
@@ -7308,7 +7358,7 @@ var SelectComponent = class SelectComponent {
7308
7358
  <option value="" [disabled]="true" [selected]="_value() === ''">{{ placeholder() }}</option>
7309
7359
  }
7310
7360
  @for (opt of options(); track opt.value; let i = $index) {
7311
- <option [value]="_key(opt)" [selected]="i === _selectedIndex()" [attr.title]="opt.description || null">{{ opt.badge ? opt.label + ' — ' + opt.badge : opt.label }}</option>
7361
+ <option [value]="_key(opt)" [selected]="i === _selectedIndex()" [disabled]="!!opt.disabled" [attr.title]="opt.description || null">{{ opt.badge ? opt.label + ' — ' + opt.badge : opt.label }}</option>
7312
7362
  }
7313
7363
  </select>
7314
7364
  <svg class="sl-chevron" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>
@@ -7379,7 +7429,7 @@ i0.ɵɵngDeclareClassMetadata({
7379
7429
  <option value="" [disabled]="true" [selected]="_value() === ''">{{ placeholder() }}</option>
7380
7430
  }
7381
7431
  @for (opt of options(); track opt.value; let i = $index) {
7382
- <option [value]="_key(opt)" [selected]="i === _selectedIndex()" [attr.title]="opt.description || null">{{ opt.badge ? opt.label + ' — ' + opt.badge : opt.label }}</option>
7432
+ <option [value]="_key(opt)" [selected]="i === _selectedIndex()" [disabled]="!!opt.disabled" [attr.title]="opt.description || null">{{ opt.badge ? opt.label + ' — ' + opt.badge : opt.label }}</option>
7383
7433
  }
7384
7434
  </select>
7385
7435
  <svg class="sl-chevron" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>
@@ -9960,7 +10010,8 @@ var DataTableComponent = class DataTableComponent {
9960
10010
  this.showMoreActions = input(true, ...ngDevMode ? [{ debugName: "showMoreActions" }] : /* istanbul ignore next */ []);
9961
10011
  this.showSearch = input(true, ...ngDevMode ? [{ debugName: "showSearch" }] : /* istanbul ignore next */ []);
9962
10012
  this.showQuickTabs = input(true, ...ngDevMode ? [{ debugName: "showQuickTabs" }] : /* istanbul ignore next */ []);
9963
- this._showHeader = computed(() => this.showSearch() || this.showToolbar() || this._effectiveTabs().length > 0, ...ngDevMode ? [{ debugName: "_showHeader" }] : /* istanbul ignore next */ []);
10013
+ this.tableTitle = input("", ...ngDevMode ? [{ debugName: "tableTitle" }] : /* istanbul ignore next */ []);
10014
+ this._showHeader = computed(() => !!this.tableTitle() || this.showSearch() || this.showToolbar() || this._effectiveTabs().length > 0, ...ngDevMode ? [{ debugName: "_showHeader" }] : /* istanbul ignore next */ []);
9964
10015
  this.countsEndpoint = input("", ...ngDevMode ? [{ debugName: "countsEndpoint" }] : /* istanbul ignore next */ []);
9965
10016
  this.params = input(null, ...ngDevMode ? [{ debugName: "params" }] : /* istanbul ignore next */ []);
9966
10017
  this.tableButtons = input([], ...ngDevMode ? [{ debugName: "tableButtons" }] : /* istanbul ignore next */ []);
@@ -10939,6 +10990,13 @@ var DataTableComponent = class DataTableComponent {
10939
10990
  isRequired: false,
10940
10991
  transformFunction: null
10941
10992
  },
10993
+ tableTitle: {
10994
+ classPropertyName: "tableTitle",
10995
+ publicName: "tableTitle",
10996
+ isSignal: true,
10997
+ isRequired: false,
10998
+ transformFunction: null
10999
+ },
10942
11000
  countsEndpoint: {
10943
11001
  classPropertyName: "countsEndpoint",
10944
11002
  publicName: "countsEndpoint",
@@ -11074,6 +11132,9 @@ var DataTableComponent = class DataTableComponent {
11074
11132
  @if (_showHeader()) {
11075
11133
  <div class="dt-sk-toolbar">
11076
11134
  <div class="dt-sk-toolbar-left">
11135
+ @if (tableTitle()) {
11136
+ <h3 class="dt-title">{{ tableTitle() }}</h3>
11137
+ }
11077
11138
  @if (showSearch()) {
11078
11139
  <div class="dt-sk-search">
11079
11140
  <div class="dt-sk-shimmer dt-sk-search-icon"></div>
@@ -11099,6 +11160,9 @@ var DataTableComponent = class DataTableComponent {
11099
11160
  } @else if (_showHeader()) {
11100
11161
  <div class="dt-header alive-header">
11101
11162
  <div class="dt-header-left">
11163
+ @if (tableTitle()) {
11164
+ <h3 class="dt-title">{{ tableTitle() }}</h3>
11165
+ }
11102
11166
  @if (showSearch() && !_emptyUnfiltered()) {
11103
11167
  <ui-search-input
11104
11168
  [value]="_search()"
@@ -11742,7 +11806,7 @@ var DataTableComponent = class DataTableComponent {
11742
11806
  </div>
11743
11807
  `,
11744
11808
  isInline: true,
11745
- styles: [":host{display:flex;flex-direction:column;flex:1;min-height:0}.dt-host{display:flex;flex-direction:column;height:100%;min-height:0}.dt-header{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap;justify-content:space-between;position:relative;z-index:10}.dt-header-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}.dt-header-right{display:flex;align-items:center;gap:8px;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end}.dt-sk-shimmer{position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-shimmer:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}@keyframes dt-shimmer{to{transform:translate(200%)}}.dt-sk-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px}.dt-sk-toolbar-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.dt-sk-toolbar-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.dt-sk-search{display:flex;align-items:center;gap:10px;width:380px;height:36px;padding:0 12px;border:1px solid #e2e8f0;border-radius:6px;background:#f8fafc;box-sizing:border-box}.dt-sk-search-icon{width:16px;height:16px;border-radius:50%;flex-shrink:0}.dt-sk-search-text{flex:1;height:11px;border-radius:4px}.dt-sk-tab-strip{display:flex;gap:2px;padding:3px;background:#f1f5f9;border-radius:8px}.dt-sk-tab{height:28px;width:70px;border-radius:6px}.dt-sk-icon-btn{width:32px;height:32px;border-radius:6px}.dt-skeleton{border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dt-sk-header{display:flex;gap:24px;padding:12px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.dt-sk-row{display:flex;gap:24px;padding:13px 16px;border-bottom:1px solid #f1f5f9}.dt-sk-row:last-child{border-bottom:none}.dt-sk-cell{flex:1;height:13px;border-radius:4px;position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-cell:first-child{max-width:100px}.dt-sk-cell:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}.dt-sk-head{height:10px}.dt-table-wrap{flex:1;min-height:0;overflow:auto;border:1px solid #e2e8f0;border-radius:10px 10px 0 0}.dt-sk-reload-row td{padding:10px 14px;border-bottom:1px solid #f1f5f9}table{width:100%;border-collapse:collapse;font-size:.875rem}thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}thead{position:sticky;top:0;z-index:2}th{padding:10px 14px;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;border-right:1px solid #e2e8f0;text-align:center;background:#f8fafc}th:last-child{border-right:none}th.dt-th-sorted{background:#f1f5f9}th.dt-th-actions{width:48px}.dt-th-inner{display:flex;align-items:center;justify-content:center;gap:4px}.dt-sort-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:none;cursor:pointer;font-size:inherit;font-weight:inherit;color:inherit;font-family:inherit;padding:0;text-transform:inherit;letter-spacing:inherit}.dt-sort-btn:hover{color:#1e293b}.dt-sort-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:2px}@media(pointer:coarse){.dt-sort-btn{position:relative}.dt-sort-btn:after{content:\"\";position:absolute;left:-4px;right:-4px;top:50%;height:44px;transform:translateY(-50%)}}.dt-sort-icon{transition:transform .15s}.dt-sort-desc{transform:rotate(180deg)}.dt-sort-inactive{opacity:.4}tbody tr{border-bottom:1px solid #f1f5f9;background:#fff;transition:background .1s}tbody tr:last-child{border-bottom:none}tbody tr:hover{background:#f8fafc}.dt-row-clickable{cursor:pointer}.dt-row-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}td{padding:10px 14px;color:#334155;vertical-align:middle;white-space:nowrap;border-right:1px solid #f1f5f9}td:last-child{border-right:none}.dt-td-actions{text-align:center;padding:6px 8px}.dt-td-width{overflow:hidden;text-overflow:ellipsis}.dt-img{display:inline-block;vertical-align:middle;object-fit:cover;border:1px solid #e2e8f0;background:#f1f5f9;flex-shrink:0}.dt-img-ph{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;color:#94a3b8;background:#f1f5f9;border:1px solid #e2e8f0;flex-shrink:0}.dt-img-ph svg{width:55%;height:55%}.dt-img-circle-md{width:40px;height:40px;border-radius:50%}.dt-img-circle-sm{width:28px;height:28px;border-radius:50%}.dt-img-rounded-md{width:48px;height:32px;border-radius:6px}.dt-img-rounded-sm{width:36px;height:24px;border-radius:5px}.dt-avatar-name{display:flex;align-items:center;gap:8px}.dt-name-text{color:#1e293b}.dt-overdue{color:#dc2626;font-weight:500}.dt-none{color:#94a3b8}.dt-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;align-items:stretch}.dt-header-left,.dt-header-right{width:100%}.dt-table-wrap{display:none}.dt-sk-search{width:100%}.dt-sk-toolbar{flex-direction:column;align-items:stretch;gap:8px}.dt-sk-toolbar-right{align-self:flex-end}.dt-bulk-bar{align-self:stretch;padding:10px 12px;row-gap:8px}.dt-bulk-count{flex:1}.dt-bulk-actions{width:100%}.dt-bulk-hint{flex-basis:100%}.dt-bulk-actions ui-select{max-width:100%;flex:1}}.dt-confirm-msg{margin:0;font-size:.9375rem;color:#334155;line-height:1.5;overflow-wrap:anywhere;word-break:break-word;white-space:pre-line}.dt-confirm-details{margin:10px 0 0;padding-left:20px;font-size:.875rem;color:#64748b;line-height:1.5;overflow-wrap:anywhere;word-break:break-word}.dt-confirm-details li+li{margin-top:4px}ui-pagination{flex-shrink:0}.dt-phone-controls{display:flex;flex-direction:column;gap:8px;margin-bottom:8px;flex-shrink:0}.dt-phone-sort{display:flex;align-items:center;gap:8px}.dt-phone-sort-label{font-size:.8125rem;font-weight:600;color:#64748b;flex-shrink:0}.dt-phone-sort-select{flex:1;min-width:0;min-height:44px;box-sizing:border-box;padding:0 12px;font-family:inherit;font-size:1rem;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px}.dt-phone-filters{display:flex;flex-wrap:wrap;gap:8px}.dt-card-list{display:none;flex-direction:column;gap:8px;flex:1;min-height:0;overflow-y:auto}@media(max-width:640px){.dt-card-list{display:flex;padding-bottom:8px}}.dt-card{background:#fff;border:1px solid #e2e8f0;border-radius:10px;contain:layout style;padding:14px 16px;display:flex;flex-direction:column;gap:10px;transition:background .1s}.dt-card:has(.mm-dropdown){position:relative;z-index:1}.dt-card-clickable{cursor:pointer}.dt-card-clickable:active{background:#f8fafc}.dt-card-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.dt-card-header{display:flex;align-items:center;gap:10px}.dt-card-title{display:flex;align-items:center;gap:10px;flex:1;min-width:0}.dt-card-name{min-width:0;font-weight:600;color:#1e293b;font-size:.9375rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dt-card-name-plain{flex:1}.dt-card-actions{margin-left:auto;flex-shrink:0}.dt-card-badges{display:flex;flex-wrap:wrap;gap:6px}.dt-card-tags{display:flex;flex-wrap:wrap;gap:4px}.dt-card-details{display:flex;flex-direction:column;gap:5px}.dt-card-detail-row{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:.8125rem}.dt-card-detail-label{color:#64748b;flex-shrink:0}.dt-card-detail-value{color:#334155;font-weight:500;text-align:right;min-width:0;overflow-wrap:anywhere;word-break:break-word}.dt-card-sk{gap:12px}.dt-card-sk-header{display:flex;align-items:center;gap:10px}.dt-card-sk-badges{display:flex;gap:6px}.dt-card-sk-rows{display:flex;flex-direction:column;gap:8px}\n"],
11809
+ 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-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;align-items:stretch}.dt-header-left,.dt-header-right{width:100%}.dt-table-wrap{display:none}.dt-sk-search{width:100%}.dt-sk-toolbar{flex-direction:column;align-items:stretch;gap:8px}.dt-sk-toolbar-right{align-self:flex-end}.dt-bulk-bar{align-self:stretch;padding:10px 12px;row-gap:8px}.dt-bulk-count{flex:1}.dt-bulk-actions{width:100%}.dt-bulk-hint{flex-basis:100%}.dt-bulk-actions ui-select{max-width:100%;flex:1}}.dt-confirm-msg{margin:0;font-size:.9375rem;color:#334155;line-height:1.5;overflow-wrap:anywhere;word-break:break-word;white-space:pre-line}.dt-confirm-details{margin:10px 0 0;padding-left:20px;font-size:.875rem;color:#64748b;line-height:1.5;overflow-wrap:anywhere;word-break:break-word}.dt-confirm-details li+li{margin-top:4px}ui-pagination{flex-shrink:0}.dt-phone-controls{display:flex;flex-direction:column;gap:8px;margin-bottom:8px;flex-shrink:0}.dt-phone-sort{display:flex;align-items:center;gap:8px}.dt-phone-sort-label{font-size:.8125rem;font-weight:600;color:#64748b;flex-shrink:0}.dt-phone-sort-select{flex:1;min-width:0;min-height:44px;box-sizing:border-box;padding:0 12px;font-family:inherit;font-size:1rem;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px}.dt-phone-filters{display:flex;flex-wrap:wrap;gap:8px}.dt-card-list{display:none;flex-direction:column;gap:8px;flex:1;min-height:0;overflow-y:auto}@media(max-width:640px){.dt-card-list{display:flex;padding-bottom:8px}}.dt-card{background:#fff;border:1px solid #e2e8f0;border-radius:10px;contain:layout style;padding:14px 16px;display:flex;flex-direction:column;gap:10px;transition:background .1s}.dt-card:has(.mm-dropdown){position:relative;z-index:1}.dt-card-clickable{cursor:pointer}.dt-card-clickable:active{background:#f8fafc}.dt-card-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.dt-card-header{display:flex;align-items:center;gap:10px}.dt-card-title{display:flex;align-items:center;gap:10px;flex:1;min-width:0}.dt-card-name{min-width:0;font-weight:600;color:#1e293b;font-size:.9375rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dt-card-name-plain{flex:1}.dt-card-actions{margin-left:auto;flex-shrink:0}.dt-card-badges{display:flex;flex-wrap:wrap;gap:6px}.dt-card-tags{display:flex;flex-wrap:wrap;gap:4px}.dt-card-details{display:flex;flex-direction:column;gap:5px}.dt-card-detail-row{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:.8125rem}.dt-card-detail-label{color:#64748b;flex-shrink:0}.dt-card-detail-value{color:#334155;font-weight:500;text-align:right;min-width:0;overflow-wrap:anywhere;word-break:break-word}.dt-card-sk{gap:12px}.dt-card-sk-header{display:flex;align-items:center;gap:10px}.dt-card-sk-badges{display:flex;gap:6px}.dt-card-sk-rows{display:flex;flex-direction:column;gap:8px}\n"],
11746
11810
  dependencies: [
11747
11811
  {
11748
11812
  kind: "directive",
@@ -11780,7 +11844,8 @@ var DataTableComponent = class DataTableComponent {
11780
11844
  "page",
11781
11845
  "pageSize",
11782
11846
  "totalItems",
11783
- "detached"
11847
+ "detached",
11848
+ "embedded"
11784
11849
  ],
11785
11850
  outputs: ["pageChange"]
11786
11851
  },
@@ -12128,6 +12193,9 @@ i0.ɵɵngDeclareClassMetadata({
12128
12193
  @if (_showHeader()) {
12129
12194
  <div class="dt-sk-toolbar">
12130
12195
  <div class="dt-sk-toolbar-left">
12196
+ @if (tableTitle()) {
12197
+ <h3 class="dt-title">{{ tableTitle() }}</h3>
12198
+ }
12131
12199
  @if (showSearch()) {
12132
12200
  <div class="dt-sk-search">
12133
12201
  <div class="dt-sk-shimmer dt-sk-search-icon"></div>
@@ -12153,6 +12221,9 @@ i0.ɵɵngDeclareClassMetadata({
12153
12221
  } @else if (_showHeader()) {
12154
12222
  <div class="dt-header alive-header">
12155
12223
  <div class="dt-header-left">
12224
+ @if (tableTitle()) {
12225
+ <h3 class="dt-title">{{ tableTitle() }}</h3>
12226
+ }
12156
12227
  @if (showSearch() && !_emptyUnfiltered()) {
12157
12228
  <ui-search-input
12158
12229
  [value]="_search()"
@@ -12795,7 +12866,7 @@ i0.ɵɵngDeclareClassMetadata({
12795
12866
  }
12796
12867
  </div>
12797
12868
  `,
12798
- styles: [":host{display:flex;flex-direction:column;flex:1;min-height:0}.dt-host{display:flex;flex-direction:column;height:100%;min-height:0}.dt-header{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap;justify-content:space-between;position:relative;z-index:10}.dt-header-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap;flex:1;min-width:0}.dt-header-right{display:flex;align-items:center;gap:8px;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end}.dt-sk-shimmer{position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-shimmer:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}@keyframes dt-shimmer{to{transform:translate(200%)}}.dt-sk-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px}.dt-sk-toolbar-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.dt-sk-toolbar-right{display:flex;align-items:center;gap:8px;flex-shrink:0}.dt-sk-search{display:flex;align-items:center;gap:10px;width:380px;height:36px;padding:0 12px;border:1px solid #e2e8f0;border-radius:6px;background:#f8fafc;box-sizing:border-box}.dt-sk-search-icon{width:16px;height:16px;border-radius:50%;flex-shrink:0}.dt-sk-search-text{flex:1;height:11px;border-radius:4px}.dt-sk-tab-strip{display:flex;gap:2px;padding:3px;background:#f1f5f9;border-radius:8px}.dt-sk-tab{height:28px;width:70px;border-radius:6px}.dt-sk-icon-btn{width:32px;height:32px;border-radius:6px}.dt-skeleton{border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dt-sk-header{display:flex;gap:24px;padding:12px 16px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.dt-sk-row{display:flex;gap:24px;padding:13px 16px;border-bottom:1px solid #f1f5f9}.dt-sk-row:last-child{border-bottom:none}.dt-sk-cell{flex:1;height:13px;border-radius:4px;position:relative;overflow:hidden;background:#f1f5f9}.dt-sk-cell:first-child{max-width:100px}.dt-sk-cell:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,transparent 25%,rgba(255,255,255,.65) 50%,transparent 75%);transform:translate(-100%);animation:dt-shimmer 1.4s ease-in-out infinite}.dt-sk-head{height:10px}.dt-table-wrap{flex:1;min-height:0;overflow:auto;border:1px solid #e2e8f0;border-radius:10px 10px 0 0}.dt-sk-reload-row td{padding:10px 14px;border-bottom:1px solid #f1f5f9}table{width:100%;border-collapse:collapse;font-size:.875rem}thead tr{background:#f8fafc;border-bottom:1px solid #e2e8f0}thead{position:sticky;top:0;z-index:2}th{padding:10px 14px;font-size:.75rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;border-right:1px solid #e2e8f0;text-align:center;background:#f8fafc}th:last-child{border-right:none}th.dt-th-sorted{background:#f1f5f9}th.dt-th-actions{width:48px}.dt-th-inner{display:flex;align-items:center;justify-content:center;gap:4px}.dt-sort-btn{display:inline-flex;align-items:center;gap:4px;background:none;border:none;cursor:pointer;font-size:inherit;font-weight:inherit;color:inherit;font-family:inherit;padding:0;text-transform:inherit;letter-spacing:inherit}.dt-sort-btn:hover{color:#1e293b}.dt-sort-btn:focus-visible{outline:2px solid #60a5fa;outline-offset:2px;border-radius:2px}@media(pointer:coarse){.dt-sort-btn{position:relative}.dt-sort-btn:after{content:\"\";position:absolute;left:-4px;right:-4px;top:50%;height:44px;transform:translateY(-50%)}}.dt-sort-icon{transition:transform .15s}.dt-sort-desc{transform:rotate(180deg)}.dt-sort-inactive{opacity:.4}tbody tr{border-bottom:1px solid #f1f5f9;background:#fff;transition:background .1s}tbody tr:last-child{border-bottom:none}tbody tr:hover{background:#f8fafc}.dt-row-clickable{cursor:pointer}.dt-row-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:-2px}td{padding:10px 14px;color:#334155;vertical-align:middle;white-space:nowrap;border-right:1px solid #f1f5f9}td:last-child{border-right:none}.dt-td-actions{text-align:center;padding:6px 8px}.dt-td-width{overflow:hidden;text-overflow:ellipsis}.dt-img{display:inline-block;vertical-align:middle;object-fit:cover;border:1px solid #e2e8f0;background:#f1f5f9;flex-shrink:0}.dt-img-ph{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;color:#94a3b8;background:#f1f5f9;border:1px solid #e2e8f0;flex-shrink:0}.dt-img-ph svg{width:55%;height:55%}.dt-img-circle-md{width:40px;height:40px;border-radius:50%}.dt-img-circle-sm{width:28px;height:28px;border-radius:50%}.dt-img-rounded-md{width:48px;height:32px;border-radius:6px}.dt-img-rounded-sm{width:36px;height:24px;border-radius:5px}.dt-avatar-name{display:flex;align-items:center;gap:8px}.dt-name-text{color:#1e293b}.dt-overdue{color:#dc2626;font-weight:500}.dt-none{color:#94a3b8}.dt-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;align-items:stretch}.dt-header-left,.dt-header-right{width:100%}.dt-table-wrap{display:none}.dt-sk-search{width:100%}.dt-sk-toolbar{flex-direction:column;align-items:stretch;gap:8px}.dt-sk-toolbar-right{align-self:flex-end}.dt-bulk-bar{align-self:stretch;padding:10px 12px;row-gap:8px}.dt-bulk-count{flex:1}.dt-bulk-actions{width:100%}.dt-bulk-hint{flex-basis:100%}.dt-bulk-actions ui-select{max-width:100%;flex:1}}.dt-confirm-msg{margin:0;font-size:.9375rem;color:#334155;line-height:1.5;overflow-wrap:anywhere;word-break:break-word;white-space:pre-line}.dt-confirm-details{margin:10px 0 0;padding-left:20px;font-size:.875rem;color:#64748b;line-height:1.5;overflow-wrap:anywhere;word-break:break-word}.dt-confirm-details li+li{margin-top:4px}ui-pagination{flex-shrink:0}.dt-phone-controls{display:flex;flex-direction:column;gap:8px;margin-bottom:8px;flex-shrink:0}.dt-phone-sort{display:flex;align-items:center;gap:8px}.dt-phone-sort-label{font-size:.8125rem;font-weight:600;color:#64748b;flex-shrink:0}.dt-phone-sort-select{flex:1;min-width:0;min-height:44px;box-sizing:border-box;padding:0 12px;font-family:inherit;font-size:1rem;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px}.dt-phone-filters{display:flex;flex-wrap:wrap;gap:8px}.dt-card-list{display:none;flex-direction:column;gap:8px;flex:1;min-height:0;overflow-y:auto}@media(max-width:640px){.dt-card-list{display:flex;padding-bottom:8px}}.dt-card{background:#fff;border:1px solid #e2e8f0;border-radius:10px;contain:layout style;padding:14px 16px;display:flex;flex-direction:column;gap:10px;transition:background .1s}.dt-card:has(.mm-dropdown){position:relative;z-index:1}.dt-card-clickable{cursor:pointer}.dt-card-clickable:active{background:#f8fafc}.dt-card-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.dt-card-header{display:flex;align-items:center;gap:10px}.dt-card-title{display:flex;align-items:center;gap:10px;flex:1;min-width:0}.dt-card-name{min-width:0;font-weight:600;color:#1e293b;font-size:.9375rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dt-card-name-plain{flex:1}.dt-card-actions{margin-left:auto;flex-shrink:0}.dt-card-badges{display:flex;flex-wrap:wrap;gap:6px}.dt-card-tags{display:flex;flex-wrap:wrap;gap:4px}.dt-card-details{display:flex;flex-direction:column;gap:5px}.dt-card-detail-row{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:.8125rem}.dt-card-detail-label{color:#64748b;flex-shrink:0}.dt-card-detail-value{color:#334155;font-weight:500;text-align:right;min-width:0;overflow-wrap:anywhere;word-break:break-word}.dt-card-sk{gap:12px}.dt-card-sk-header{display:flex;align-items:center;gap:10px}.dt-card-sk-badges{display:flex;gap:6px}.dt-card-sk-rows{display:flex;flex-direction:column;gap:8px}\n"]
12869
+ 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-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;align-items:stretch}.dt-header-left,.dt-header-right{width:100%}.dt-table-wrap{display:none}.dt-sk-search{width:100%}.dt-sk-toolbar{flex-direction:column;align-items:stretch;gap:8px}.dt-sk-toolbar-right{align-self:flex-end}.dt-bulk-bar{align-self:stretch;padding:10px 12px;row-gap:8px}.dt-bulk-count{flex:1}.dt-bulk-actions{width:100%}.dt-bulk-hint{flex-basis:100%}.dt-bulk-actions ui-select{max-width:100%;flex:1}}.dt-confirm-msg{margin:0;font-size:.9375rem;color:#334155;line-height:1.5;overflow-wrap:anywhere;word-break:break-word;white-space:pre-line}.dt-confirm-details{margin:10px 0 0;padding-left:20px;font-size:.875rem;color:#64748b;line-height:1.5;overflow-wrap:anywhere;word-break:break-word}.dt-confirm-details li+li{margin-top:4px}ui-pagination{flex-shrink:0}.dt-phone-controls{display:flex;flex-direction:column;gap:8px;margin-bottom:8px;flex-shrink:0}.dt-phone-sort{display:flex;align-items:center;gap:8px}.dt-phone-sort-label{font-size:.8125rem;font-weight:600;color:#64748b;flex-shrink:0}.dt-phone-sort-select{flex:1;min-width:0;min-height:44px;box-sizing:border-box;padding:0 12px;font-family:inherit;font-size:1rem;color:#1e293b;background:#fff;border:1px solid #e2e8f0;border-radius:8px}.dt-phone-filters{display:flex;flex-wrap:wrap;gap:8px}.dt-card-list{display:none;flex-direction:column;gap:8px;flex:1;min-height:0;overflow-y:auto}@media(max-width:640px){.dt-card-list{display:flex;padding-bottom:8px}}.dt-card{background:#fff;border:1px solid #e2e8f0;border-radius:10px;contain:layout style;padding:14px 16px;display:flex;flex-direction:column;gap:10px;transition:background .1s}.dt-card:has(.mm-dropdown){position:relative;z-index:1}.dt-card-clickable{cursor:pointer}.dt-card-clickable:active{background:#f8fafc}.dt-card-clickable:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.dt-card-header{display:flex;align-items:center;gap:10px}.dt-card-title{display:flex;align-items:center;gap:10px;flex:1;min-width:0}.dt-card-name{min-width:0;font-weight:600;color:#1e293b;font-size:.9375rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dt-card-name-plain{flex:1}.dt-card-actions{margin-left:auto;flex-shrink:0}.dt-card-badges{display:flex;flex-wrap:wrap;gap:6px}.dt-card-tags{display:flex;flex-wrap:wrap;gap:4px}.dt-card-details{display:flex;flex-direction:column;gap:5px}.dt-card-detail-row{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:.8125rem}.dt-card-detail-label{color:#64748b;flex-shrink:0}.dt-card-detail-value{color:#334155;font-weight:500;text-align:right;min-width:0;overflow-wrap:anywhere;word-break:break-word}.dt-card-sk{gap:12px}.dt-card-sk-header{display:flex;align-items:center;gap:10px}.dt-card-sk-badges{display:flex;gap:6px}.dt-card-sk-rows{display:flex;flex-direction:column;gap:8px}\n"]
12799
12870
  }]
12800
12871
  }],
12801
12872
  ctorParameters: () => [],
@@ -12912,6 +12983,14 @@ i0.ɵɵngDeclareClassMetadata({
12912
12983
  required: false
12913
12984
  }]
12914
12985
  }],
12986
+ tableTitle: [{
12987
+ type: i0.Input,
12988
+ args: [{
12989
+ isSignal: true,
12990
+ alias: "tableTitle",
12991
+ required: false
12992
+ }]
12993
+ }],
12915
12994
  countsEndpoint: [{
12916
12995
  type: i0.Input,
12917
12996
  args: [{
@@ -17205,6 +17284,7 @@ var PhoneNumberPickerComponent = class PhoneNumberPickerComponent {
17205
17284
  inputs: [
17206
17285
  "label",
17207
17286
  "ariaLabel",
17287
+ "inputTestId",
17208
17288
  "placeholder",
17209
17289
  "prefix",
17210
17290
  "revealable",
@@ -19349,6 +19429,7 @@ var BulkMessagePanelComponent = class BulkMessagePanelComponent {
19349
19429
  inputs: [
19350
19430
  "label",
19351
19431
  "ariaLabel",
19432
+ "inputTestId",
19352
19433
  "placeholder",
19353
19434
  "prefix",
19354
19435
  "revealable",
@@ -24562,7 +24643,7 @@ var ListItemComponent = class ListItemComponent {
24562
24643
  </div>
24563
24644
  `,
24564
24645
  isInline: true,
24565
- styles: ["ui-list-item{display:block}ui-list-item(.li-bordered){border:1px solid var(--border, #e2e8f0);border-radius:12px;overflow:hidden;background:var(--surface, #fff);margin-bottom:8px;&:last-child{margin-bottom:0}}.li-row{display:flex;align-items:flex-start;gap:12px;padding:12px 16px;border-bottom:1px solid var(--border, #e2e8f0);transition:background .12s;ui-list-item(.li-bordered) &{border-bottom:none}}.li-row:last-child{border-bottom:none}.li-row:hover{background:var(--surface-hover, #f8fafc)}.li-row.li-row--highlighted{background:#f0fdf4}.li-row.li-row--highlighted:hover{background:#dcfce7}.li-row.li-row--static:hover{background:transparent}.li-row.li-row--static.li-row--highlighted,.li-row.li-row--static.li-row--highlighted:hover{background:#f0fdf4}.li-body.li-body--static{cursor:default}.li-row [list-item-action],.li-row [li-action]{flex-shrink:0;align-self:center}.li-input{margin-top:3px;flex-shrink:0;accent-color:#16a34a;width:1rem;height:1rem;cursor:pointer}.li-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:10px}.li-icon--slate{background:#f1f5f9;color:#475569}.li-icon--amber{background:#fef3c7;color:#b45309}.li-icon--orange{background:#ffedd5;color:#c2410c}.li-icon--red{background:#fee2e2;color:#b91c1c}.li-icon--blue{background:#dbeafe;color:#1d4ed8}.li-icon--green{background:#dcfce7;color:#15803d}.li-icon--purple{background:#f3e8ff;color:#7e22ce}.li-icon--teal{background:#ccfbf1;color:#0f766e}.li-body{flex:1;min-width:0;cursor:pointer;display:flex;flex-direction:column;gap:4px}.li-title-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.li-title{font-size:.9375rem;font-weight:600;line-height:1.35;color:var(--text-primary, #0f172a)}.li-row--wrap .li-title{min-width:0;word-break:break-word;overflow-wrap:anywhere}.li-details{display:flex;flex-direction:column;gap:2px;font-size:.8125rem;line-height:1.4;color:var(--text-secondary, #64748b)}.li-detail{display:flex;align-items:center;gap:6px;min-width:0}.li-detail-icon{flex:0 0 auto;color:#94a3b8}.li-detail--warning,.li-detail--warning .li-detail-icon{color:#b45309}.li-detail--danger,.li-detail--danger .li-detail-icon{color:#b91c1c}.li-row--wrap .li-detail-text{min-width:0;word-break:break-word;overflow-wrap:anywhere}\n"],
24646
+ styles: ["ui-list-item{display:block}ui-list-item.li-bordered{border:1px solid var(--border, #e2e8f0);border-radius:12px;overflow:hidden;background:var(--surface, #fff);box-shadow:0 1px 2px #0f172a0a;margin-bottom:8px;transition:border-color .15s ease,box-shadow .15s ease}ui-list-item.li-bordered:last-child{margin-bottom:0}ui-list-item.li-bordered:hover{border-color:#cbd5e1;box-shadow:0 2px 6px #0f172a12}@media(prefers-reduced-motion:reduce){ui-list-item.li-bordered{transition:none}}.li-row{display:flex;align-items:flex-start;gap:14px;padding:12px 16px;border-bottom:1px solid var(--border, #e2e8f0);transition:background .12s}.li-row:last-child{border-bottom:none}.li-row:hover{background:var(--surface-hover, #f8fafc)}ui-list-item.li-bordered .li-row{border-bottom:none;padding:14px 16px}.li-row.li-row--highlighted{background:#f0fdf4}.li-row.li-row--highlighted:hover{background:#dcfce7}.li-row.li-row--static:hover{background:transparent}.li-row.li-row--static.li-row--highlighted,.li-row.li-row--static.li-row--highlighted:hover{background:#f0fdf4}.li-body.li-body--static{cursor:default}.li-row [list-item-action],.li-row [li-action]{flex-shrink:0;align-self:center}.li-input{margin-top:3px;flex-shrink:0;accent-color:#16a34a;width:1rem;height:1rem;cursor:pointer}.li-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:12px}.li-icon--slate{background:#f1f5f9;color:#475569}.li-icon--amber{background:#fef3c7;color:#b45309}.li-icon--orange{background:#ffedd5;color:#c2410c}.li-icon--red{background:#fee2e2;color:#b91c1c}.li-icon--blue{background:#dbeafe;color:#1d4ed8}.li-icon--green{background:#dcfce7;color:#15803d}.li-icon--purple{background:#f3e8ff;color:#7e22ce}.li-icon--teal{background:#ccfbf1;color:#0f766e}.li-body{flex:1;min-width:0;cursor:pointer;display:flex;flex-direction:column;gap:6px}.li-title-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.li-title{font-size:.9375rem;font-weight:600;line-height:1.4;letter-spacing:-.005em;color:var(--text-primary, #0f172a)}.li-row--wrap .li-title{min-width:0;word-break:break-word;overflow-wrap:anywhere}.li-details{display:flex;flex-direction:column;gap:3px;font-size:.8125rem;line-height:1.4;color:var(--text-secondary, #64748b)}.li-detail{display:flex;align-items:center;gap:6px;min-width:0}.li-detail-icon{flex:0 0 auto;color:#94a3b8}.li-detail--warning,.li-detail--warning .li-detail-icon{color:#b45309}.li-detail--danger,.li-detail--danger .li-detail-icon{color:#b91c1c}.li-row--wrap .li-detail-text{min-width:0;word-break:break-word;overflow-wrap:anywhere}\n"],
24566
24647
  dependencies: [{
24567
24648
  kind: "component",
24568
24649
  type: BadgeComponent,
@@ -24662,7 +24743,7 @@ i0.ɵɵngDeclareClassMetadata({
24662
24743
 
24663
24744
  </div>
24664
24745
  `,
24665
- styles: ["ui-list-item{display:block}ui-list-item(.li-bordered){border:1px solid var(--border, #e2e8f0);border-radius:12px;overflow:hidden;background:var(--surface, #fff);margin-bottom:8px;&:last-child{margin-bottom:0}}.li-row{display:flex;align-items:flex-start;gap:12px;padding:12px 16px;border-bottom:1px solid var(--border, #e2e8f0);transition:background .12s;ui-list-item(.li-bordered) &{border-bottom:none}}.li-row:last-child{border-bottom:none}.li-row:hover{background:var(--surface-hover, #f8fafc)}.li-row.li-row--highlighted{background:#f0fdf4}.li-row.li-row--highlighted:hover{background:#dcfce7}.li-row.li-row--static:hover{background:transparent}.li-row.li-row--static.li-row--highlighted,.li-row.li-row--static.li-row--highlighted:hover{background:#f0fdf4}.li-body.li-body--static{cursor:default}.li-row [list-item-action],.li-row [li-action]{flex-shrink:0;align-self:center}.li-input{margin-top:3px;flex-shrink:0;accent-color:#16a34a;width:1rem;height:1rem;cursor:pointer}.li-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:10px}.li-icon--slate{background:#f1f5f9;color:#475569}.li-icon--amber{background:#fef3c7;color:#b45309}.li-icon--orange{background:#ffedd5;color:#c2410c}.li-icon--red{background:#fee2e2;color:#b91c1c}.li-icon--blue{background:#dbeafe;color:#1d4ed8}.li-icon--green{background:#dcfce7;color:#15803d}.li-icon--purple{background:#f3e8ff;color:#7e22ce}.li-icon--teal{background:#ccfbf1;color:#0f766e}.li-body{flex:1;min-width:0;cursor:pointer;display:flex;flex-direction:column;gap:4px}.li-title-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.li-title{font-size:.9375rem;font-weight:600;line-height:1.35;color:var(--text-primary, #0f172a)}.li-row--wrap .li-title{min-width:0;word-break:break-word;overflow-wrap:anywhere}.li-details{display:flex;flex-direction:column;gap:2px;font-size:.8125rem;line-height:1.4;color:var(--text-secondary, #64748b)}.li-detail{display:flex;align-items:center;gap:6px;min-width:0}.li-detail-icon{flex:0 0 auto;color:#94a3b8}.li-detail--warning,.li-detail--warning .li-detail-icon{color:#b45309}.li-detail--danger,.li-detail--danger .li-detail-icon{color:#b91c1c}.li-row--wrap .li-detail-text{min-width:0;word-break:break-word;overflow-wrap:anywhere}\n"]
24746
+ styles: ["ui-list-item{display:block}ui-list-item.li-bordered{border:1px solid var(--border, #e2e8f0);border-radius:12px;overflow:hidden;background:var(--surface, #fff);box-shadow:0 1px 2px #0f172a0a;margin-bottom:8px;transition:border-color .15s ease,box-shadow .15s ease}ui-list-item.li-bordered:last-child{margin-bottom:0}ui-list-item.li-bordered:hover{border-color:#cbd5e1;box-shadow:0 2px 6px #0f172a12}@media(prefers-reduced-motion:reduce){ui-list-item.li-bordered{transition:none}}.li-row{display:flex;align-items:flex-start;gap:14px;padding:12px 16px;border-bottom:1px solid var(--border, #e2e8f0);transition:background .12s}.li-row:last-child{border-bottom:none}.li-row:hover{background:var(--surface-hover, #f8fafc)}ui-list-item.li-bordered .li-row{border-bottom:none;padding:14px 16px}.li-row.li-row--highlighted{background:#f0fdf4}.li-row.li-row--highlighted:hover{background:#dcfce7}.li-row.li-row--static:hover{background:transparent}.li-row.li-row--static.li-row--highlighted,.li-row.li-row--static.li-row--highlighted:hover{background:#f0fdf4}.li-body.li-body--static{cursor:default}.li-row [list-item-action],.li-row [li-action]{flex-shrink:0;align-self:center}.li-input{margin-top:3px;flex-shrink:0;accent-color:#16a34a;width:1rem;height:1rem;cursor:pointer}.li-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:12px}.li-icon--slate{background:#f1f5f9;color:#475569}.li-icon--amber{background:#fef3c7;color:#b45309}.li-icon--orange{background:#ffedd5;color:#c2410c}.li-icon--red{background:#fee2e2;color:#b91c1c}.li-icon--blue{background:#dbeafe;color:#1d4ed8}.li-icon--green{background:#dcfce7;color:#15803d}.li-icon--purple{background:#f3e8ff;color:#7e22ce}.li-icon--teal{background:#ccfbf1;color:#0f766e}.li-body{flex:1;min-width:0;cursor:pointer;display:flex;flex-direction:column;gap:6px}.li-title-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.li-title{font-size:.9375rem;font-weight:600;line-height:1.4;letter-spacing:-.005em;color:var(--text-primary, #0f172a)}.li-row--wrap .li-title{min-width:0;word-break:break-word;overflow-wrap:anywhere}.li-details{display:flex;flex-direction:column;gap:3px;font-size:.8125rem;line-height:1.4;color:var(--text-secondary, #64748b)}.li-detail{display:flex;align-items:center;gap:6px;min-width:0}.li-detail-icon{flex:0 0 auto;color:#94a3b8}.li-detail--warning,.li-detail--warning .li-detail-icon{color:#b45309}.li-detail--danger,.li-detail--danger .li-detail-icon{color:#b91c1c}.li-row--wrap .li-detail-text{min-width:0;word-break:break-word;overflow-wrap:anywhere}\n"]
24666
24747
  }]
24667
24748
  }],
24668
24749
  propDecorators: {
@@ -24796,6 +24877,954 @@ i0.ɵɵngDeclareClassMetadata({
24796
24877
  }]
24797
24878
  }
24798
24879
  });
24880
+ const ICON_PATHS = {
24881
+ call: "M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07A19.5 19.5 0 0 1 4.69 12a19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 3.6 1.27h3a2 2 0 0 1 2 1.72c.127.96.361 1.903.7 2.81a2 2 0 0 1-.45 2.11L7.91 8.91a16 16 0 0 0 6 6l1-1a2 2 0 0 1 2.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0 1 22 16.92z",
24882
+ email: "M4 4h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z M22 7l-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7",
24883
+ sms: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",
24884
+ task: "M9 11l3 3L22 4 M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11",
24885
+ doc: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z M14 2v6h6",
24886
+ money: "M12 1v22 M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6",
24887
+ deal: "M22 7l-8.5 8.5-5-5L2 17 M16 7h6v6",
24888
+ survey: "M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2 M10 3h4a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z M9 12h6 M9 16h4",
24889
+ property: "M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z M9 22V12h6v10",
24890
+ search: "M11 3a8 8 0 1 0 0 16 8 8 0 0 0 0-16z M21 21l-4.35-4.35",
24891
+ heart: "M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z",
24892
+ calc: "M6 2h12a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2z M8 6h8 M8 10h2 M14 10h2 M8 14h2 M14 14h2 M8 18h2 M14 18h2",
24893
+ repeat: "M17 1l4 4-4 4 M3 11V9a4 4 0 0 1 4-4h14 M7 23l-4-4 4-4 M21 13v2a4 4 0 0 1-4 4H3"
24894
+ };
24895
+ const CALENDAR_PATH = "M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z M16 2v4 M8 2v4 M3 10h18";
24896
+ const EDIT_PATH = "M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7 M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z";
24897
+ const INDICATOR_LABEL = {
24898
+ high: "High priority",
24899
+ medium: "Medium priority",
24900
+ low: "Low priority"
24901
+ };
24902
+ var CardListItemComponent = class CardListItemComponent {
24903
+ constructor() {
24904
+ this.title = input("", ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
24905
+ this.description = input(void 0, ...ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []);
24906
+ this.date = input(void 0, ...ngDevMode ? [{ debugName: "date" }] : /* istanbul ignore next */ []);
24907
+ this.type = input(void 0, ...ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []);
24908
+ this.typeVariant = input("gray", ...ngDevMode ? [{ debugName: "typeVariant" }] : /* istanbul ignore next */ []);
24909
+ this.status = input(void 0, ...ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []);
24910
+ this.statusVariant = input(void 0, ...ngDevMode ? [{ debugName: "statusVariant" }] : /* istanbul ignore next */ []);
24911
+ this.indicator = input("none", ...ngDevMode ? [{ debugName: "indicator" }] : /* istanbul ignore next */ []);
24912
+ this.icon = input(void 0, ...ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []);
24913
+ this.editButton = input(false, ...ngDevMode ? [{ debugName: "editButton" }] : /* istanbul ignore next */ []);
24914
+ this.viewButton = input(false, ...ngDevMode ? [{ debugName: "viewButton" }] : /* istanbul ignore next */ []);
24915
+ this.editAriaLabel = input("", ...ngDevMode ? [{ debugName: "editAriaLabel" }] : /* istanbul ignore next */ []);
24916
+ this.viewAriaLabel = input("", ...ngDevMode ? [{ debugName: "viewAriaLabel" }] : /* istanbul ignore next */ []);
24917
+ this.editClick = output();
24918
+ this.viewClick = output();
24919
+ this.calendarPath = CALENDAR_PATH;
24920
+ this.editPath = EDIT_PATH;
24921
+ this.iconPath = computed(() => {
24922
+ const i = this.icon();
24923
+ return i ? ICON_PATHS[i] ?? null : null;
24924
+ }, ...ngDevMode ? [{ debugName: "iconPath" }] : /* istanbul ignore next */ []);
24925
+ this.indicatorLabel = computed(() => INDICATOR_LABEL[this.indicator()] ?? "", ...ngDevMode ? [{ debugName: "indicatorLabel" }] : /* istanbul ignore next */ []);
24926
+ }
24927
+ static {
24928
+ this.ɵfac = i0.ɵɵngDeclareFactory({
24929
+ minVersion: "12.0.0",
24930
+ version: "22.2.2",
24931
+ ngImport: i0,
24932
+ type: CardListItemComponent,
24933
+ deps: [],
24934
+ target: i0.ɵɵFactoryTarget.Component
24935
+ });
24936
+ }
24937
+ static {
24938
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
24939
+ minVersion: "17.0.0",
24940
+ version: "22.2.2",
24941
+ type: CardListItemComponent,
24942
+ isStandalone: true,
24943
+ selector: "ui-card-list-item",
24944
+ inputs: {
24945
+ title: {
24946
+ classPropertyName: "title",
24947
+ publicName: "title",
24948
+ isSignal: true,
24949
+ isRequired: false,
24950
+ transformFunction: null
24951
+ },
24952
+ description: {
24953
+ classPropertyName: "description",
24954
+ publicName: "description",
24955
+ isSignal: true,
24956
+ isRequired: false,
24957
+ transformFunction: null
24958
+ },
24959
+ date: {
24960
+ classPropertyName: "date",
24961
+ publicName: "date",
24962
+ isSignal: true,
24963
+ isRequired: false,
24964
+ transformFunction: null
24965
+ },
24966
+ type: {
24967
+ classPropertyName: "type",
24968
+ publicName: "type",
24969
+ isSignal: true,
24970
+ isRequired: false,
24971
+ transformFunction: null
24972
+ },
24973
+ typeVariant: {
24974
+ classPropertyName: "typeVariant",
24975
+ publicName: "typeVariant",
24976
+ isSignal: true,
24977
+ isRequired: false,
24978
+ transformFunction: null
24979
+ },
24980
+ status: {
24981
+ classPropertyName: "status",
24982
+ publicName: "status",
24983
+ isSignal: true,
24984
+ isRequired: false,
24985
+ transformFunction: null
24986
+ },
24987
+ statusVariant: {
24988
+ classPropertyName: "statusVariant",
24989
+ publicName: "statusVariant",
24990
+ isSignal: true,
24991
+ isRequired: false,
24992
+ transformFunction: null
24993
+ },
24994
+ indicator: {
24995
+ classPropertyName: "indicator",
24996
+ publicName: "indicator",
24997
+ isSignal: true,
24998
+ isRequired: false,
24999
+ transformFunction: null
25000
+ },
25001
+ icon: {
25002
+ classPropertyName: "icon",
25003
+ publicName: "icon",
25004
+ isSignal: true,
25005
+ isRequired: false,
25006
+ transformFunction: null
25007
+ },
25008
+ editButton: {
25009
+ classPropertyName: "editButton",
25010
+ publicName: "editButton",
25011
+ isSignal: true,
25012
+ isRequired: false,
25013
+ transformFunction: null
25014
+ },
25015
+ viewButton: {
25016
+ classPropertyName: "viewButton",
25017
+ publicName: "viewButton",
25018
+ isSignal: true,
25019
+ isRequired: false,
25020
+ transformFunction: null
25021
+ },
25022
+ editAriaLabel: {
25023
+ classPropertyName: "editAriaLabel",
25024
+ publicName: "editAriaLabel",
25025
+ isSignal: true,
25026
+ isRequired: false,
25027
+ transformFunction: null
25028
+ },
25029
+ viewAriaLabel: {
25030
+ classPropertyName: "viewAriaLabel",
25031
+ publicName: "viewAriaLabel",
25032
+ isSignal: true,
25033
+ isRequired: false,
25034
+ transformFunction: null
25035
+ }
25036
+ },
25037
+ outputs: {
25038
+ editClick: "editClick",
25039
+ viewClick: "viewClick"
25040
+ },
25041
+ ngImport: i0,
25042
+ template: `
25043
+ <div class="cli-row">
25044
+ @if (iconPath(); as d) {
25045
+ <div class="cli-icon-circle" [class]="'cli-icon-circle cli-icon-circle--' + icon()" aria-hidden="true">
25046
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path [attr.d]="d" /></svg>
25047
+ </div>
25048
+ } @else if (indicator() !== 'none') {
25049
+ @if (indicatorLabel(); as label) {
25050
+ <div class="cli-dot" [class]="'cli-dot cli-dot--' + indicator()" [uiTooltip]="label" tabindex="0" role="img" [attr.aria-label]="label"></div>
25051
+ } @else {
25052
+ <div class="cli-dot" [class]="'cli-dot cli-dot--' + indicator()" aria-hidden="true"></div>
25053
+ }
25054
+ }
25055
+
25056
+ <div class="cli-body">
25057
+ <div class="cli-title-row">
25058
+ <span class="cli-title">{{ title() }}</span>
25059
+ @if (type()) { <ui-badge [label]="type()!" [variant]="typeVariant()" /> }
25060
+ @if (status() && statusVariant()) { <ui-badge [label]="status()!" [variant]="statusVariant()!" /> }
25061
+ </div>
25062
+ <div class="cli-desc-row">
25063
+ @if (description()) { <span class="cli-description">{{ description() }}</span> }
25064
+ <ng-content select="[card-list-inline]" />
25065
+ </div>
25066
+ @if (date()) {
25067
+ <span class="cli-date">
25068
+ <svg width="11" height="11" 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]="calendarPath" /></svg>
25069
+ {{ date() }}
25070
+ </span>
25071
+ }
25072
+ </div>
25073
+
25074
+ @if (editButton()) {
25075
+ <button class="cli-chip cli-chip--edit" type="button" [attr.aria-label]="editAriaLabel() || null" (click)="editClick.emit()">
25076
+ <svg width="13" height="13" 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]="editPath" /></svg>
25077
+ Edit
25078
+ </button>
25079
+ }
25080
+ @if (viewButton()) {
25081
+ <button class="cli-chip cli-chip--view" type="button" [attr.aria-label]="viewAriaLabel() || null" (click)="viewClick.emit()">View</button>
25082
+ }
25083
+ <ng-content select="[card-list-action]" />
25084
+ <ng-content />
25085
+ </div>
25086
+ <ng-content select="[card-stats]" />
25087
+ <ng-content select="[card-detail]" />
25088
+ `,
25089
+ isInline: true,
25090
+ styles: ["ui-card-list-item{display:block;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden;margin-bottom:8px}ui-card-list-item:last-child{margin-bottom:0}ui-card-list-item .cli-row{display:flex;align-items:flex-start;gap:12px;padding:13px 18px;transition:background .12s}ui-card-list-item .cli-row:hover{background:#f8fafc}@media(prefers-reduced-motion:reduce){ui-card-list-item .cli-row{transition:none}}ui-card-list-item .cli-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;margin-top:5px}ui-card-list-item .cli-dot:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-dot--high{background:#ef4444}ui-card-list-item .cli-dot--medium{background:#f59e0b}ui-card-list-item .cli-dot--low{background:#94a3b8}ui-card-list-item .cli-dot--blue{background:#3b82f6}ui-card-list-item .cli-dot--green{background:#22c55e}ui-card-list-item .cli-icon-circle{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}ui-card-list-item .cli-icon-circle--call{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--email{background:#dcfce7;color:#16a34a}ui-card-list-item .cli-icon-circle--sms{background:#fef9c3;color:#ca8a04}ui-card-list-item .cli-icon-circle--task{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--doc{background:#ffedd5;color:#ea580c}ui-card-list-item .cli-icon-circle--money{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--deal{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--survey{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--property{background:#fef3c7;color:#d97706}ui-card-list-item .cli-icon-circle--search{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--heart{background:#fce7f3;color:#db2777}ui-card-list-item .cli-icon-circle--calc{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--repeat{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px;overflow-wrap:anywhere;word-break:break-word}ui-card-list-item .cli-title-row{display:flex;align-items:center;gap:7px;flex-wrap:wrap}ui-card-list-item .cli-title{font-size:.875rem;font-weight:600;color:#1e293b}ui-card-list-item .cli-desc-row{display:flex;align-items:center;gap:8px}ui-card-list-item .cli-desc-row:empty{display:none}ui-card-list-item .cli-description{font-size:.8125rem;color:#64748b;min-width:0}ui-card-list-item .cli-date{display:flex;align-items:center;gap:4px;font-size:.75rem;color:#64748b}ui-card-list-item .cli-chip{flex-shrink:0;display:inline-flex;align-items:center;gap:5px;align-self:center;box-sizing:border-box;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;background:none;cursor:pointer;padding:4px 10px;border-radius:6px;text-decoration:none;transition:background .15s,color .15s,border-color .15s}ui-card-list-item .cli-chip--edit{color:#64748b;border:1px solid #e2e8f0}ui-card-list-item .cli-chip--edit:hover{background:#f1f5f9;color:#1e293b}ui-card-list-item .cli-chip--view{color:#2563eb;border:1px solid #dbeafe}ui-card-list-item .cli-chip--view:hover{background:#eff6ff;border-color:#bfdbfe;color:#1d4ed8}ui-card-list-item .cli-chip:focus-visible,ui-card-list-item .cli-inline-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-inline-link{flex-shrink:0;margin-left:auto;display:inline-flex;align-items:center;gap:4px;font-size:.8rem;font-weight:500;color:#2563eb;text-decoration:none;transition:color .15s}ui-card-list-item .cli-inline-link:hover{color:#1d4ed8}@media(pointer:coarse),(max-width:480px){ui-card-list-item .cli-chip{min-height:44px;padding:4px 14px}}ui-card-list-item [card-stats]{display:flex;align-items:stretch;background:#f8fafc;border-top:1px solid #f1f5f9}ui-card-list-item [card-detail]{background:#f8fafc;border-top:1px solid #e2e8f0}ui-card-list-item .cli-stat{flex:1;display:flex;flex-direction:column;gap:2px;padding:10px 14px}ui-card-list-item .cli-stat-label{font-size:.6875rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:#64748b}ui-card-list-item .cli-stat-value{font-size:.9375rem;font-weight:600;color:#0f172a}ui-card-list-item .cli-stat-divider{width:1px;background:#e2e8f0;margin:8px 0}\n"],
25091
+ dependencies: [{
25092
+ kind: "component",
25093
+ type: BadgeComponent,
25094
+ selector: "ui-badge",
25095
+ inputs: ["label", "variant"]
25096
+ }, {
25097
+ kind: "directive",
25098
+ type: TooltipDirective,
25099
+ selector: "[uiTooltip]",
25100
+ inputs: ["uiTooltip", "tooltipPosition"]
25101
+ }],
25102
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
25103
+ encapsulation: i0.ViewEncapsulation.None
25104
+ });
25105
+ }
25106
+ };
25107
+ i0.ɵɵngDeclareClassMetadata({
25108
+ minVersion: "12.0.0",
25109
+ version: "22.2.2",
25110
+ ngImport: i0,
25111
+ type: CardListItemComponent,
25112
+ decorators: [{
25113
+ type: Component,
25114
+ args: [{
25115
+ selector: "ui-card-list-item",
25116
+ standalone: true,
25117
+ changeDetection: ChangeDetectionStrategy.OnPush,
25118
+ encapsulation: ViewEncapsulation.None,
25119
+ imports: [BadgeComponent, TooltipDirective],
25120
+ template: `
25121
+ <div class="cli-row">
25122
+ @if (iconPath(); as d) {
25123
+ <div class="cli-icon-circle" [class]="'cli-icon-circle cli-icon-circle--' + icon()" aria-hidden="true">
25124
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path [attr.d]="d" /></svg>
25125
+ </div>
25126
+ } @else if (indicator() !== 'none') {
25127
+ @if (indicatorLabel(); as label) {
25128
+ <div class="cli-dot" [class]="'cli-dot cli-dot--' + indicator()" [uiTooltip]="label" tabindex="0" role="img" [attr.aria-label]="label"></div>
25129
+ } @else {
25130
+ <div class="cli-dot" [class]="'cli-dot cli-dot--' + indicator()" aria-hidden="true"></div>
25131
+ }
25132
+ }
25133
+
25134
+ <div class="cli-body">
25135
+ <div class="cli-title-row">
25136
+ <span class="cli-title">{{ title() }}</span>
25137
+ @if (type()) { <ui-badge [label]="type()!" [variant]="typeVariant()" /> }
25138
+ @if (status() && statusVariant()) { <ui-badge [label]="status()!" [variant]="statusVariant()!" /> }
25139
+ </div>
25140
+ <div class="cli-desc-row">
25141
+ @if (description()) { <span class="cli-description">{{ description() }}</span> }
25142
+ <ng-content select="[card-list-inline]" />
25143
+ </div>
25144
+ @if (date()) {
25145
+ <span class="cli-date">
25146
+ <svg width="11" height="11" 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]="calendarPath" /></svg>
25147
+ {{ date() }}
25148
+ </span>
25149
+ }
25150
+ </div>
25151
+
25152
+ @if (editButton()) {
25153
+ <button class="cli-chip cli-chip--edit" type="button" [attr.aria-label]="editAriaLabel() || null" (click)="editClick.emit()">
25154
+ <svg width="13" height="13" 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]="editPath" /></svg>
25155
+ Edit
25156
+ </button>
25157
+ }
25158
+ @if (viewButton()) {
25159
+ <button class="cli-chip cli-chip--view" type="button" [attr.aria-label]="viewAriaLabel() || null" (click)="viewClick.emit()">View</button>
25160
+ }
25161
+ <ng-content select="[card-list-action]" />
25162
+ <ng-content />
25163
+ </div>
25164
+ <ng-content select="[card-stats]" />
25165
+ <ng-content select="[card-detail]" />
25166
+ `,
25167
+ styles: ["ui-card-list-item{display:block;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden;margin-bottom:8px}ui-card-list-item:last-child{margin-bottom:0}ui-card-list-item .cli-row{display:flex;align-items:flex-start;gap:12px;padding:13px 18px;transition:background .12s}ui-card-list-item .cli-row:hover{background:#f8fafc}@media(prefers-reduced-motion:reduce){ui-card-list-item .cli-row{transition:none}}ui-card-list-item .cli-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0;margin-top:5px}ui-card-list-item .cli-dot:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-dot--high{background:#ef4444}ui-card-list-item .cli-dot--medium{background:#f59e0b}ui-card-list-item .cli-dot--low{background:#94a3b8}ui-card-list-item .cli-dot--blue{background:#3b82f6}ui-card-list-item .cli-dot--green{background:#22c55e}ui-card-list-item .cli-icon-circle{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}ui-card-list-item .cli-icon-circle--call{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--email{background:#dcfce7;color:#16a34a}ui-card-list-item .cli-icon-circle--sms{background:#fef9c3;color:#ca8a04}ui-card-list-item .cli-icon-circle--task{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--doc{background:#ffedd5;color:#ea580c}ui-card-list-item .cli-icon-circle--money{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--deal{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--survey{background:#dbeafe;color:#2563eb}ui-card-list-item .cli-icon-circle--property{background:#fef3c7;color:#d97706}ui-card-list-item .cli-icon-circle--search{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-icon-circle--heart{background:#fce7f3;color:#db2777}ui-card-list-item .cli-icon-circle--calc{background:#d1fae5;color:#059669}ui-card-list-item .cli-icon-circle--repeat{background:#e0f2fe;color:#0284c7}ui-card-list-item .cli-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px;overflow-wrap:anywhere;word-break:break-word}ui-card-list-item .cli-title-row{display:flex;align-items:center;gap:7px;flex-wrap:wrap}ui-card-list-item .cli-title{font-size:.875rem;font-weight:600;color:#1e293b}ui-card-list-item .cli-desc-row{display:flex;align-items:center;gap:8px}ui-card-list-item .cli-desc-row:empty{display:none}ui-card-list-item .cli-description{font-size:.8125rem;color:#64748b;min-width:0}ui-card-list-item .cli-date{display:flex;align-items:center;gap:4px;font-size:.75rem;color:#64748b}ui-card-list-item .cli-chip{flex-shrink:0;display:inline-flex;align-items:center;gap:5px;align-self:center;box-sizing:border-box;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;background:none;cursor:pointer;padding:4px 10px;border-radius:6px;text-decoration:none;transition:background .15s,color .15s,border-color .15s}ui-card-list-item .cli-chip--edit{color:#64748b;border:1px solid #e2e8f0}ui-card-list-item .cli-chip--edit:hover{background:#f1f5f9;color:#1e293b}ui-card-list-item .cli-chip--view{color:#2563eb;border:1px solid #dbeafe}ui-card-list-item .cli-chip--view:hover{background:#eff6ff;border-color:#bfdbfe;color:#1d4ed8}ui-card-list-item .cli-chip:focus-visible,ui-card-list-item .cli-inline-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}ui-card-list-item .cli-inline-link{flex-shrink:0;margin-left:auto;display:inline-flex;align-items:center;gap:4px;font-size:.8rem;font-weight:500;color:#2563eb;text-decoration:none;transition:color .15s}ui-card-list-item .cli-inline-link:hover{color:#1d4ed8}@media(pointer:coarse),(max-width:480px){ui-card-list-item .cli-chip{min-height:44px;padding:4px 14px}}ui-card-list-item [card-stats]{display:flex;align-items:stretch;background:#f8fafc;border-top:1px solid #f1f5f9}ui-card-list-item [card-detail]{background:#f8fafc;border-top:1px solid #e2e8f0}ui-card-list-item .cli-stat{flex:1;display:flex;flex-direction:column;gap:2px;padding:10px 14px}ui-card-list-item .cli-stat-label{font-size:.6875rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:#64748b}ui-card-list-item .cli-stat-value{font-size:.9375rem;font-weight:600;color:#0f172a}ui-card-list-item .cli-stat-divider{width:1px;background:#e2e8f0;margin:8px 0}\n"]
25168
+ }]
25169
+ }],
25170
+ propDecorators: {
25171
+ title: [{
25172
+ type: i0.Input,
25173
+ args: [{
25174
+ isSignal: true,
25175
+ alias: "title",
25176
+ required: false
25177
+ }]
25178
+ }],
25179
+ description: [{
25180
+ type: i0.Input,
25181
+ args: [{
25182
+ isSignal: true,
25183
+ alias: "description",
25184
+ required: false
25185
+ }]
25186
+ }],
25187
+ date: [{
25188
+ type: i0.Input,
25189
+ args: [{
25190
+ isSignal: true,
25191
+ alias: "date",
25192
+ required: false
25193
+ }]
25194
+ }],
25195
+ type: [{
25196
+ type: i0.Input,
25197
+ args: [{
25198
+ isSignal: true,
25199
+ alias: "type",
25200
+ required: false
25201
+ }]
25202
+ }],
25203
+ typeVariant: [{
25204
+ type: i0.Input,
25205
+ args: [{
25206
+ isSignal: true,
25207
+ alias: "typeVariant",
25208
+ required: false
25209
+ }]
25210
+ }],
25211
+ status: [{
25212
+ type: i0.Input,
25213
+ args: [{
25214
+ isSignal: true,
25215
+ alias: "status",
25216
+ required: false
25217
+ }]
25218
+ }],
25219
+ statusVariant: [{
25220
+ type: i0.Input,
25221
+ args: [{
25222
+ isSignal: true,
25223
+ alias: "statusVariant",
25224
+ required: false
25225
+ }]
25226
+ }],
25227
+ indicator: [{
25228
+ type: i0.Input,
25229
+ args: [{
25230
+ isSignal: true,
25231
+ alias: "indicator",
25232
+ required: false
25233
+ }]
25234
+ }],
25235
+ icon: [{
25236
+ type: i0.Input,
25237
+ args: [{
25238
+ isSignal: true,
25239
+ alias: "icon",
25240
+ required: false
25241
+ }]
25242
+ }],
25243
+ editButton: [{
25244
+ type: i0.Input,
25245
+ args: [{
25246
+ isSignal: true,
25247
+ alias: "editButton",
25248
+ required: false
25249
+ }]
25250
+ }],
25251
+ viewButton: [{
25252
+ type: i0.Input,
25253
+ args: [{
25254
+ isSignal: true,
25255
+ alias: "viewButton",
25256
+ required: false
25257
+ }]
25258
+ }],
25259
+ editAriaLabel: [{
25260
+ type: i0.Input,
25261
+ args: [{
25262
+ isSignal: true,
25263
+ alias: "editAriaLabel",
25264
+ required: false
25265
+ }]
25266
+ }],
25267
+ viewAriaLabel: [{
25268
+ type: i0.Input,
25269
+ args: [{
25270
+ isSignal: true,
25271
+ alias: "viewAriaLabel",
25272
+ required: false
25273
+ }]
25274
+ }],
25275
+ editClick: [{
25276
+ type: i0.Output,
25277
+ args: ["editClick"]
25278
+ }],
25279
+ viewClick: [{
25280
+ type: i0.Output,
25281
+ args: ["viewClick"]
25282
+ }]
25283
+ }
25284
+ });
25285
+ const ACTION_VERB = {
25286
+ load: "loading",
25287
+ save: "saving",
25288
+ create: "creating",
25289
+ update: "updating",
25290
+ delete: "deleting",
25291
+ send: "sending",
25292
+ export: "exporting",
25293
+ import: "importing",
25294
+ upload: "uploading",
25295
+ download: "downloading"
25296
+ };
25297
+ const ACTION_PERMISSION_VERB = {
25298
+ load: "access",
25299
+ save: "save",
25300
+ create: "create",
25301
+ update: "update",
25302
+ delete: "delete",
25303
+ send: "send",
25304
+ export: "export",
25305
+ import: "import",
25306
+ upload: "upload",
25307
+ download: "download"
25308
+ };
25309
+ const REQUEST_METHOD = "__forgerouteRequestMethod";
25310
+ const errorContextInterceptor = (req, next) => next(req).pipe(catchError$1((err) => {
25311
+ if (err instanceof HttpErrorResponse && !(REQUEST_METHOD in err)) Object.defineProperty(err, REQUEST_METHOD, {
25312
+ value: req.method.toUpperCase(),
25313
+ enumerable: false
25314
+ });
25315
+ return throwError(() => err);
25316
+ }));
25317
+ function actionFromMethod(error) {
25318
+ switch (error[REQUEST_METHOD]) {
25319
+ case "POST":
25320
+ case "PUT":
25321
+ case "PATCH": return "save";
25322
+ case "DELETE": return "delete";
25323
+ default: return "load";
25324
+ }
25325
+ }
25326
+ function withoutLeadingArticle(ctx) {
25327
+ return ctx.replace(/^(?:the|an?)\s+/i, "") || ctx;
25328
+ }
25329
+ function getErrorMessage(error, fallbackContext, action) {
25330
+ const ctx = fallbackContext?.trim() || "data";
25331
+ const act = action ?? (error instanceof HttpErrorResponse ? actionFromMethod(error) : "load");
25332
+ const failed = `There was an error ${ACTION_VERB[act]} ${ctx}.`;
25333
+ if (error instanceof HttpErrorResponse) {
25334
+ if (error.error?.message) return error.error.message;
25335
+ if (typeof error.error === "string" && error.error.length < 200) return error.error;
25336
+ switch (error.status) {
25337
+ case 0: return `${failed} Please check your connection and try again.`;
25338
+ case 401: return "Your session has expired. Please log in again.";
25339
+ case 403: return `You don't have permission to ${ACTION_PERMISSION_VERB[act]} ${ctx}.`;
25340
+ case 404: return `The ${withoutLeadingArticle(ctx)} you're looking for could not be found.`;
25341
+ case 408: return `${failed} The request timed out — please try again.`;
25342
+ case 422: return "The data you submitted is invalid. Please check your input and try again.";
25343
+ case 429: return `${failed} Too many requests — please wait a moment and try again.`;
25344
+ case 502:
25345
+ case 503:
25346
+ case 504: return `${failed} Please try again in a few minutes.`;
25347
+ default: return `${failed} Please try again.`;
25348
+ }
25349
+ }
25350
+ if (error instanceof Error) return error.message;
25351
+ if (typeof error === "string") return error;
25352
+ return `${failed} Please try again.`;
25353
+ }
25354
+ const NOTES_PAGE_SIZE = 5;
25355
+ var NotesComponent = class NotesComponent {
25356
+ initials(name) {
25357
+ const parts = (name || "You").trim().split(/\s+/).filter(Boolean);
25358
+ return ((parts[0]?.[0] ?? "") + (parts.length > 1 ? parts[parts.length - 1][0] : "")).toUpperCase();
25359
+ }
25360
+ get listUrl() {
25361
+ return `${this.apiBase}/notes/${this.resourceType()}/${this.resourceId()}`;
25362
+ }
25363
+ constructor() {
25364
+ this.resourceType = input("", ...ngDevMode ? [{ debugName: "resourceType" }] : /* istanbul ignore next */ []);
25365
+ this.resourceId = input("", ...ngDevMode ? [{ debugName: "resourceId" }] : /* istanbul ignore next */ []);
25366
+ this.readOnly = input(false, ...ngDevMode ? [{ debugName: "readOnly" }] : /* istanbul ignore next */ []);
25367
+ this.totalChange = output();
25368
+ this.http = inject(HttpClient);
25369
+ this.toast = inject(ToastService);
25370
+ this.destroyRef = inject(DestroyRef);
25371
+ this.apiBase = inject(FORGEROUTE_CONFIG, { optional: true })?.baseUrl ?? "/api";
25372
+ this.pageSize = NOTES_PAGE_SIZE;
25373
+ this.notes = signal([], ...ngDevMode ? [{ debugName: "notes" }] : /* istanbul ignore next */ []);
25374
+ this.loading = signal(false, ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
25375
+ this.saving = signal(false, ...ngDevMode ? [{ debugName: "saving" }] : /* istanbul ignore next */ []);
25376
+ this.page = signal(0, ...ngDevMode ? [{ debugName: "page" }] : /* istanbul ignore next */ []);
25377
+ this.totalElements = signal(0, ...ngDevMode ? [{ debugName: "totalElements" }] : /* istanbul ignore next */ []);
25378
+ this.editingId = signal(null, ...ngDevMode ? [{ debugName: "editingId" }] : /* istanbul ignore next */ []);
25379
+ this.deletingId = signal(null, ...ngDevMode ? [{ debugName: "deletingId" }] : /* istanbul ignore next */ []);
25380
+ this.newBody = "";
25381
+ this.editBody = "";
25382
+ effect(() => {
25383
+ const id = this.resourceId();
25384
+ const type = this.resourceType();
25385
+ if (id && type) untracked(() => this.loadPage(0));
25386
+ });
25387
+ }
25388
+ loadPage(p) {
25389
+ if (!this.resourceType() || !this.resourceId()) return;
25390
+ this.loading.set(true);
25391
+ this.http.get(`${this.listUrl}?page=${p}&size=${this.pageSize}`).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
25392
+ next: (res) => {
25393
+ this.notes.set(res.content);
25394
+ this.page.set(res.page);
25395
+ this.totalElements.set(res.totalElements);
25396
+ this.loading.set(false);
25397
+ this.totalChange.emit(res.totalElements);
25398
+ },
25399
+ error: (err) => {
25400
+ this.loading.set(false);
25401
+ this.toast.error(getErrorMessage(err, "notes"));
25402
+ }
25403
+ });
25404
+ }
25405
+ addNote() {
25406
+ if (this.readOnly() || !this.newBody.trim() || this.saving()) return;
25407
+ this.saving.set(true);
25408
+ this.http.post(this.listUrl, { body: this.newBody.trim() }).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
25409
+ next: () => {
25410
+ this.newBody = "";
25411
+ this.saving.set(false);
25412
+ this.loadPage(0);
25413
+ },
25414
+ error: (err) => {
25415
+ this.saving.set(false);
25416
+ this.toast.error(getErrorMessage(err, "note", "create"));
25417
+ }
25418
+ });
25419
+ }
25420
+ startEdit(note) {
25421
+ if (this.readOnly()) return;
25422
+ this.editingId.set(note.id);
25423
+ this.editBody = note.body;
25424
+ }
25425
+ cancelEdit() {
25426
+ this.editingId.set(null);
25427
+ this.editBody = "";
25428
+ }
25429
+ saveEdit(noteId) {
25430
+ if (this.readOnly() || !this.editBody.trim() || this.saving()) return;
25431
+ this.saving.set(true);
25432
+ this.http.put(`${this.apiBase}/notes/${noteId}`, { body: this.editBody.trim() }).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
25433
+ next: (updated) => {
25434
+ this.notes.update((arr) => arr.map((n) => n.id === noteId ? updated : n));
25435
+ this.editingId.set(null);
25436
+ this.saving.set(false);
25437
+ },
25438
+ error: (err) => {
25439
+ this.saving.set(false);
25440
+ this.toast.error(getErrorMessage(err, "note", "update"));
25441
+ }
25442
+ });
25443
+ }
25444
+ confirmDelete(id) {
25445
+ if (this.readOnly()) return;
25446
+ this.deletingId.set(id);
25447
+ }
25448
+ deleteNote() {
25449
+ const id = this.deletingId();
25450
+ if (this.readOnly() || !id || this.saving()) return;
25451
+ this.saving.set(true);
25452
+ this.http.delete(`${this.apiBase}/notes/${id}`).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
25453
+ next: () => {
25454
+ this.deletingId.set(null);
25455
+ this.saving.set(false);
25456
+ this.loadPage(this.notes().length === 1 && this.page() > 0 ? this.page() - 1 : this.page());
25457
+ },
25458
+ error: (err) => {
25459
+ this.deletingId.set(null);
25460
+ this.saving.set(false);
25461
+ this.toast.error(getErrorMessage(err, "note", "delete"));
25462
+ }
25463
+ });
25464
+ }
25465
+ static {
25466
+ this.ɵfac = i0.ɵɵngDeclareFactory({
25467
+ minVersion: "12.0.0",
25468
+ version: "22.2.2",
25469
+ ngImport: i0,
25470
+ type: NotesComponent,
25471
+ deps: [],
25472
+ target: i0.ɵɵFactoryTarget.Component
25473
+ });
25474
+ }
25475
+ static {
25476
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
25477
+ minVersion: "17.0.0",
25478
+ version: "22.2.2",
25479
+ type: NotesComponent,
25480
+ isStandalone: true,
25481
+ selector: "ui-notes",
25482
+ inputs: {
25483
+ resourceType: {
25484
+ classPropertyName: "resourceType",
25485
+ publicName: "resourceType",
25486
+ isSignal: true,
25487
+ isRequired: false,
25488
+ transformFunction: null
25489
+ },
25490
+ resourceId: {
25491
+ classPropertyName: "resourceId",
25492
+ publicName: "resourceId",
25493
+ isSignal: true,
25494
+ isRequired: false,
25495
+ transformFunction: null
25496
+ },
25497
+ readOnly: {
25498
+ classPropertyName: "readOnly",
25499
+ publicName: "readOnly",
25500
+ isSignal: true,
25501
+ isRequired: false,
25502
+ transformFunction: null
25503
+ }
25504
+ },
25505
+ outputs: { totalChange: "totalChange" },
25506
+ ngImport: i0,
25507
+ template: `
25508
+ @if (!readOnly()) {
25509
+ <div class="note-add">
25510
+ <ui-textarea-input ariaLabel="Add a note" placeholder="Add a note..." [rows]="3" [disabled]="saving()" [(ngModel)]="newBody"
25511
+ (keydown.meta.enter)="addNote()" (keydown.control.enter)="addNote()" />
25512
+ <div class="note-add-footer">
25513
+ <ui-button variant="primary" size="sm" data-testid="note-add-btn" [loading]="saving()" [disabled]="!newBody.trim()" (click)="addNote()">Add Note</ui-button>
25514
+ </div>
25515
+ </div>
25516
+ }
25517
+
25518
+ @if (loading() && notes().length === 0) {
25519
+ <div class="note-loading" role="status">Loading notes...</div>
25520
+ } @else if (notes().length === 0) {
25521
+ <ui-empty-state iconType="person" title="No notes yet" [message]="readOnly() ? 'No notes have been added.' : 'Add your first note above.'" />
25522
+ } @else {
25523
+ <ul class="note-list" aria-label="Notes">
25524
+ @for (note of notes(); track note.id) {
25525
+ <li class="note-item" [class.editing]="editingId() === note.id">
25526
+ <ui-avatar class="note-avatar" [initials]="initials(note.createdByName)" [name]="note.createdByName || 'You'" [size]="32" />
25527
+ <div class="note-main">
25528
+ <div class="note-head">
25529
+ <span class="note-author">{{ note.createdByName || 'You' }}</span>
25530
+ <span class="note-dot" aria-hidden="true">·</span>
25531
+ <time class="note-date" [attr.datetime]="note.createdAt">{{ note.createdAt | date:'MMM d, yyyy h:mm a' }}</time>
25532
+ @if (note.updatedAt !== note.createdAt) {
25533
+ <span class="note-edited">edited</span>
25534
+ }
25535
+ @if (!readOnly() && editingId() !== note.id) {
25536
+ <div class="note-actions">
25537
+ <ui-button variant="icon" size="xs" ariaLabel="Edit note" uiTooltip="Edit note" (click)="startEdit(note)">
25538
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/></svg>
25539
+ </ui-button>
25540
+ <ui-button variant="icon-danger" size="xs" ariaLabel="Delete note" uiTooltip="Delete note" (click)="confirmDelete(note.id)">
25541
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><polyline points="3 6 5 6 21 6"/><path d="M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"/><path d="M10 11v6"/><path d="M14 11v6"/></svg>
25542
+ </ui-button>
25543
+ </div>
25544
+ }
25545
+ </div>
25546
+ @if (editingId() === note.id) {
25547
+ <ui-textarea-input ariaLabel="Edit note" [rows]="3" [disabled]="saving()" [(ngModel)]="editBody" />
25548
+ <div class="note-item-footer">
25549
+ <ui-button variant="secondary" size="sm" (click)="cancelEdit()">Cancel</ui-button>
25550
+ <ui-button variant="primary" size="sm" [loading]="saving()" [disabled]="!editBody.trim()" (click)="saveEdit(note.id)">Save</ui-button>
25551
+ </div>
25552
+ } @else {
25553
+ <p class="note-body">{{ note.body }}</p>
25554
+ }
25555
+ </div>
25556
+ </li>
25557
+ }
25558
+ </ul>
25559
+ <ui-pagination [page]="page() + 1" [pageSize]="pageSize" [totalItems]="totalElements()" (pageChange)="loadPage($event - 1)" />
25560
+ }
25561
+
25562
+ <ui-modal [open]="!!deletingId()" title="Delete Note" maxWidth="420px" dialogTestId="delete-note-modal" (close)="deletingId.set(null)">
25563
+ <p class="note-delete-msg" data-testid="delete-note-message">Delete this note? It is permanently removed from this record and cannot be undone.</p>
25564
+ <ui-button modal-footer-left variant="secondary" size="sm" data-testid="delete-note-cancel" (click)="deletingId.set(null)">Cancel</ui-button>
25565
+ <ui-button modal-footer-right variant="danger" size="sm" data-testid="delete-note-confirm" [loading]="saving()" (click)="deleteNote()">Delete Note</ui-button>
25566
+ </ui-modal>
25567
+ `,
25568
+ isInline: true,
25569
+ styles: [":host{display:block}.note-add{padding:14px;margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px}.note-add-footer{display:flex;justify-content:flex-end;margin-top:10px}.note-loading{padding:24px 0;font-size:.875rem;color:#64748b;text-align:center}.note-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}.note-item{display:flex;gap:12px;padding:14px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;transition:border-color .15s,box-shadow .15s}@media(hover:hover){.note-item:hover{border-color:#cbd5e1;box-shadow:0 1px 3px #0f172a0f}}.note-item.editing{background:#f8fafc;border-color:#bfdbfe}@media(prefers-reduced-motion:reduce){.note-item{transition:none}}.note-avatar{flex-shrink:0}.note-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}.note-head{display:flex;align-items:center;flex-wrap:wrap;gap:2px 6px;min-height:28px}.note-author{font-size:.875rem;font-weight:600;color:#0f172a}.note-dot{color:#94a3b8;font-size:.75rem}.note-date{font-size:.75rem;color:#64748b}.note-edited{font-size:.75rem;font-style:italic;color:#64748b}.note-actions{display:flex;align-items:center;gap:2px;margin-left:auto}.note-body{margin:0;font-size:.9375rem;line-height:1.6;color:#1e293b;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word}.note-item-footer{display:flex;justify-content:flex-end;gap:8px;margin-top:4px}.note-delete-msg{margin:0;font-size:.9375rem;line-height:1.5;color:#334155}@media(max-width:480px){.note-item{padding:12px;gap:10px}.note-add{padding:12px}}\n"],
25570
+ dependencies: [
25571
+ {
25572
+ kind: "ngmodule",
25573
+ type: FormsModule
25574
+ },
25575
+ {
25576
+ kind: "directive",
25577
+ type: i1.NgControlStatus,
25578
+ selector: "[formControlName],[ngModel],[formControl]"
25579
+ },
25580
+ {
25581
+ kind: "directive",
25582
+ type: i1.NgModel,
25583
+ selector: "[ngModel]:not([formControlName]):not([formControl])",
25584
+ inputs: [
25585
+ "name",
25586
+ "disabled",
25587
+ "ngModel",
25588
+ "ngModelOptions"
25589
+ ],
25590
+ outputs: ["ngModelChange"],
25591
+ exportAs: ["ngModel"]
25592
+ },
25593
+ {
25594
+ kind: "component",
25595
+ type: ButtonComponent,
25596
+ selector: "ui-button",
25597
+ inputs: [
25598
+ "variant",
25599
+ "routerLink",
25600
+ "queryParams",
25601
+ "fragment",
25602
+ "state",
25603
+ "href",
25604
+ "target",
25605
+ "rel",
25606
+ "shortLabel",
25607
+ "shortBelow",
25608
+ "color",
25609
+ "active",
25610
+ "size",
25611
+ "type",
25612
+ "disabled",
25613
+ "loading",
25614
+ "fullWidth",
25615
+ "ariaLabel",
25616
+ "ariaExpanded",
25617
+ "ariaPressed",
25618
+ "ariaDescribedBy",
25619
+ "modal-footer-left",
25620
+ "modal-footer-right"
25621
+ ]
25622
+ },
25623
+ {
25624
+ kind: "component",
25625
+ type: ModalComponent,
25626
+ selector: "ui-modal",
25627
+ inputs: [
25628
+ "open",
25629
+ "title",
25630
+ "description",
25631
+ "maxWidth",
25632
+ "bodyOverflow",
25633
+ "dialogTestId",
25634
+ "hideClose",
25635
+ "closable",
25636
+ "returnFocusTo"
25637
+ ],
25638
+ outputs: ["close"]
25639
+ },
25640
+ {
25641
+ kind: "component",
25642
+ type: EmptyStateComponent,
25643
+ selector: "ui-empty-state",
25644
+ inputs: [
25645
+ "message",
25646
+ "title",
25647
+ "iconType"
25648
+ ]
25649
+ },
25650
+ {
25651
+ kind: "component",
25652
+ type: PaginationComponent,
25653
+ selector: "ui-pagination",
25654
+ inputs: [
25655
+ "page",
25656
+ "pageSize",
25657
+ "totalItems",
25658
+ "detached",
25659
+ "embedded"
25660
+ ],
25661
+ outputs: ["pageChange"]
25662
+ },
25663
+ {
25664
+ kind: "component",
25665
+ type: TextareaInputComponent,
25666
+ selector: "ui-textarea-input",
25667
+ inputs: [
25668
+ "label",
25669
+ "ariaLabel",
25670
+ "placeholder",
25671
+ "rows",
25672
+ "maxlength",
25673
+ "required",
25674
+ "readonly",
25675
+ "hint",
25676
+ "hintAsDescription",
25677
+ "error",
25678
+ "monospace",
25679
+ "showErrors",
25680
+ "disabled"
25681
+ ],
25682
+ outputs: ["invalidChange"]
25683
+ },
25684
+ {
25685
+ kind: "directive",
25686
+ type: TooltipDirective,
25687
+ selector: "[uiTooltip]",
25688
+ inputs: ["uiTooltip", "tooltipPosition"]
25689
+ },
25690
+ {
25691
+ kind: "component",
25692
+ type: AvatarComponent,
25693
+ selector: "ui-avatar",
25694
+ inputs: [
25695
+ "initials",
25696
+ "name",
25697
+ "size"
25698
+ ]
25699
+ },
25700
+ {
25701
+ kind: "pipe",
25702
+ type: DatePipe,
25703
+ name: "date"
25704
+ }
25705
+ ],
25706
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
25707
+ });
25708
+ }
25709
+ };
25710
+ i0.ɵɵngDeclareClassMetadata({
25711
+ minVersion: "12.0.0",
25712
+ version: "22.2.2",
25713
+ ngImport: i0,
25714
+ type: NotesComponent,
25715
+ decorators: [{
25716
+ type: Component,
25717
+ args: [{
25718
+ selector: "ui-notes",
25719
+ standalone: true,
25720
+ changeDetection: ChangeDetectionStrategy.OnPush,
25721
+ imports: [
25722
+ DatePipe,
25723
+ FormsModule,
25724
+ ButtonComponent,
25725
+ ModalComponent,
25726
+ EmptyStateComponent,
25727
+ PaginationComponent,
25728
+ TextareaInputComponent,
25729
+ TooltipDirective,
25730
+ AvatarComponent
25731
+ ],
25732
+ template: `
25733
+ @if (!readOnly()) {
25734
+ <div class="note-add">
25735
+ <ui-textarea-input ariaLabel="Add a note" placeholder="Add a note..." [rows]="3" [disabled]="saving()" [(ngModel)]="newBody"
25736
+ (keydown.meta.enter)="addNote()" (keydown.control.enter)="addNote()" />
25737
+ <div class="note-add-footer">
25738
+ <ui-button variant="primary" size="sm" data-testid="note-add-btn" [loading]="saving()" [disabled]="!newBody.trim()" (click)="addNote()">Add Note</ui-button>
25739
+ </div>
25740
+ </div>
25741
+ }
25742
+
25743
+ @if (loading() && notes().length === 0) {
25744
+ <div class="note-loading" role="status">Loading notes...</div>
25745
+ } @else if (notes().length === 0) {
25746
+ <ui-empty-state iconType="person" title="No notes yet" [message]="readOnly() ? 'No notes have been added.' : 'Add your first note above.'" />
25747
+ } @else {
25748
+ <ul class="note-list" aria-label="Notes">
25749
+ @for (note of notes(); track note.id) {
25750
+ <li class="note-item" [class.editing]="editingId() === note.id">
25751
+ <ui-avatar class="note-avatar" [initials]="initials(note.createdByName)" [name]="note.createdByName || 'You'" [size]="32" />
25752
+ <div class="note-main">
25753
+ <div class="note-head">
25754
+ <span class="note-author">{{ note.createdByName || 'You' }}</span>
25755
+ <span class="note-dot" aria-hidden="true">·</span>
25756
+ <time class="note-date" [attr.datetime]="note.createdAt">{{ note.createdAt | date:'MMM d, yyyy h:mm a' }}</time>
25757
+ @if (note.updatedAt !== note.createdAt) {
25758
+ <span class="note-edited">edited</span>
25759
+ }
25760
+ @if (!readOnly() && editingId() !== note.id) {
25761
+ <div class="note-actions">
25762
+ <ui-button variant="icon" size="xs" ariaLabel="Edit note" uiTooltip="Edit note" (click)="startEdit(note)">
25763
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/></svg>
25764
+ </ui-button>
25765
+ <ui-button variant="icon-danger" size="xs" ariaLabel="Delete note" uiTooltip="Delete note" (click)="confirmDelete(note.id)">
25766
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><polyline points="3 6 5 6 21 6"/><path d="M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"/><path d="M10 11v6"/><path d="M14 11v6"/></svg>
25767
+ </ui-button>
25768
+ </div>
25769
+ }
25770
+ </div>
25771
+ @if (editingId() === note.id) {
25772
+ <ui-textarea-input ariaLabel="Edit note" [rows]="3" [disabled]="saving()" [(ngModel)]="editBody" />
25773
+ <div class="note-item-footer">
25774
+ <ui-button variant="secondary" size="sm" (click)="cancelEdit()">Cancel</ui-button>
25775
+ <ui-button variant="primary" size="sm" [loading]="saving()" [disabled]="!editBody.trim()" (click)="saveEdit(note.id)">Save</ui-button>
25776
+ </div>
25777
+ } @else {
25778
+ <p class="note-body">{{ note.body }}</p>
25779
+ }
25780
+ </div>
25781
+ </li>
25782
+ }
25783
+ </ul>
25784
+ <ui-pagination [page]="page() + 1" [pageSize]="pageSize" [totalItems]="totalElements()" (pageChange)="loadPage($event - 1)" />
25785
+ }
25786
+
25787
+ <ui-modal [open]="!!deletingId()" title="Delete Note" maxWidth="420px" dialogTestId="delete-note-modal" (close)="deletingId.set(null)">
25788
+ <p class="note-delete-msg" data-testid="delete-note-message">Delete this note? It is permanently removed from this record and cannot be undone.</p>
25789
+ <ui-button modal-footer-left variant="secondary" size="sm" data-testid="delete-note-cancel" (click)="deletingId.set(null)">Cancel</ui-button>
25790
+ <ui-button modal-footer-right variant="danger" size="sm" data-testid="delete-note-confirm" [loading]="saving()" (click)="deleteNote()">Delete Note</ui-button>
25791
+ </ui-modal>
25792
+ `,
25793
+ styles: [":host{display:block}.note-add{padding:14px;margin-bottom:18px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:12px}.note-add-footer{display:flex;justify-content:flex-end;margin-top:10px}.note-loading{padding:24px 0;font-size:.875rem;color:#64748b;text-align:center}.note-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}.note-item{display:flex;gap:12px;padding:14px;background:#fff;border:1px solid #e2e8f0;border-radius:12px;transition:border-color .15s,box-shadow .15s}@media(hover:hover){.note-item:hover{border-color:#cbd5e1;box-shadow:0 1px 3px #0f172a0f}}.note-item.editing{background:#f8fafc;border-color:#bfdbfe}@media(prefers-reduced-motion:reduce){.note-item{transition:none}}.note-avatar{flex-shrink:0}.note-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}.note-head{display:flex;align-items:center;flex-wrap:wrap;gap:2px 6px;min-height:28px}.note-author{font-size:.875rem;font-weight:600;color:#0f172a}.note-dot{color:#94a3b8;font-size:.75rem}.note-date{font-size:.75rem;color:#64748b}.note-edited{font-size:.75rem;font-style:italic;color:#64748b}.note-actions{display:flex;align-items:center;gap:2px;margin-left:auto}.note-body{margin:0;font-size:.9375rem;line-height:1.6;color:#1e293b;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word}.note-item-footer{display:flex;justify-content:flex-end;gap:8px;margin-top:4px}.note-delete-msg{margin:0;font-size:.9375rem;line-height:1.5;color:#334155}@media(max-width:480px){.note-item{padding:12px;gap:10px}.note-add{padding:12px}}\n"]
25794
+ }]
25795
+ }],
25796
+ ctorParameters: () => [],
25797
+ propDecorators: {
25798
+ resourceType: [{
25799
+ type: i0.Input,
25800
+ args: [{
25801
+ isSignal: true,
25802
+ alias: "resourceType",
25803
+ required: false
25804
+ }]
25805
+ }],
25806
+ resourceId: [{
25807
+ type: i0.Input,
25808
+ args: [{
25809
+ isSignal: true,
25810
+ alias: "resourceId",
25811
+ required: false
25812
+ }]
25813
+ }],
25814
+ readOnly: [{
25815
+ type: i0.Input,
25816
+ args: [{
25817
+ isSignal: true,
25818
+ alias: "readOnly",
25819
+ required: false
25820
+ }]
25821
+ }],
25822
+ totalChange: [{
25823
+ type: i0.Output,
25824
+ args: ["totalChange"]
25825
+ }]
25826
+ }
25827
+ });
24799
25828
  function provideForgerouteToast(options = {}) {
24800
25829
  return makeEnvironmentProviders([provideEnvironmentInitializer(() => {
24801
25830
  if (options.dismissible) inject(ToastService).dismissible.set(true);
@@ -25346,7 +26375,7 @@ var ListComponent = class ListComponent {
25346
26375
  }
25347
26376
  `,
25348
26377
  isInline: true,
25349
- styles: ["ui-list{display:block;min-width:0}.ul-list{margin:0;padding:0;min-width:0}.ul-list--unordered{list-style:none}.ul-list--ordered{list-style:decimal;-webkit-padding-start:1.75rem;padding-inline-start:1.75rem}.ul-list--ordered>.ul-item::marker{color:var(--text-secondary, #64748b);font-size:.875rem}.ul-item{min-width:0;transition:background-color .4s ease}.ul-item.ul-item--moved{background-color:var(--surface-hover, #f1f5f9)}.ul-list:not(.ul-list--grid)>.ul-item+.ul-item{margin-top:var(--ul-gap, 0px)}.ul-row{display:flex;align-items:center;gap:8px;min-width:0}.ul-content{flex:1 1 auto;min-width:0;word-break:break-word;overflow-wrap:anywhere}.ul-controls{display:flex;flex:0 0 auto;align-items:center;gap:2px}.ul-item--nav{cursor:pointer;border-radius:10px;transition:background-color .12s ease}.ul-item--nav:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.ul-item--nav:hover{background:var(--surface-hover, #f8fafc)}.ul-item--nav>.ul-row{padding-inline-end:16px}.ul-item--nav:hover .ul-chevron{color:#0f172a}.ul-chevron{flex:0 0 auto;color:#94a3b8;transition:color .15s ease}@media(prefers-reduced-motion:reduce){.ul-chevron{transition:none}}.ul-list.ul-list--grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--ul-min, 130px),100%),1fr));gap:var(--ul-gap, 12px);list-style:none;-webkit-padding-start:0;padding-inline-start:0}.ul-list--grid>.ul-item>.ul-row{flex-direction:column;align-items:stretch;gap:6px}.ul-list--grid>.ul-item>.ul-row>.ul-controls{align-self:center}@media(pointer:coarse),(max-width:480px){.ul-controls{gap:16px}}.ul-item--draggable{-webkit-user-select:none;user-select:none;-webkit-user-drag:element}@media(hover:hover)and (pointer:fine){.ul-item--draggable{cursor:grab}.ul-item--draggable:active{cursor:grabbing}}.ul-item--draggable:focus{outline:2px solid #3b82f6;outline-offset:2px;border-radius:6px}.ul-item--draggable:focus:not(:focus-visible){outline:none}ui-list .ul-item--draggable img,ui-list .ul-item--draggable ui-image-preview{pointer-events:none;-webkit-user-drag:none}.ul-item--dragging{opacity:.5}.ul-item--over{outline:2px dashed #3b82f6;outline-offset:2px;border-radius:6px}@media(prefers-reduced-motion:reduce){.ul-item{transition:none}}@media(forced-colors:active){.ul-item.ul-item--moved{outline:2px solid Highlight;outline-offset:-2px}}@media(forced-colors:active){.ul-item.ul-item--dragging{outline:2px dotted Highlight;outline-offset:2px}.ul-item.ul-item--over{outline:2px dashed Highlight;outline-offset:2px}.ul-item--draggable:focus{outline:2px solid Highlight;outline-offset:2px}}.ul-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"],
26378
+ styles: ["ui-list{display:block;min-width:0}.ul-list{margin:0;padding:0;min-width:0}.ul-list--unordered{list-style:none}.ul-list--ordered{list-style:decimal;-webkit-padding-start:1.75rem;padding-inline-start:1.75rem}.ul-list--ordered>.ul-item::marker{color:var(--text-secondary, #64748b);font-size:.875rem}.ul-item{min-width:0;transition:background-color .4s ease}.ul-item.ul-item--moved{background-color:var(--surface-hover, #f1f5f9)}.ul-list:not(.ul-list--grid)>.ul-item+.ul-item{margin-top:var(--ul-gap, 0px)}.ul-row{display:flex;align-items:center;gap:8px;min-width:0}.ul-content{flex:1 1 auto;min-width:0;word-break:break-word;overflow-wrap:anywhere}.ul-controls{display:flex;flex:0 0 auto;align-items:center;gap:2px}.ul-item--nav{cursor:pointer;border-radius:10px;transition:background-color .12s ease}.ul-item--nav:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.ul-item--nav:hover{background:var(--surface-hover, #f8fafc)}.ul-item--nav:hover:has(>.ul-row>.ul-content>ui-list-item.li-bordered){background:transparent}.ul-item--nav>.ul-row{padding-inline-end:8px}.ul-item--nav:hover .ul-chevron{color:#0f172a;transform:translate(2px)}.ul-chevron{flex:0 0 auto;color:#94a3b8;transition:color .15s ease,transform .15s ease}@media(prefers-reduced-motion:reduce){.ul-chevron{transition:none;transform:none!important}}.ul-list.ul-list--grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--ul-min, 130px),100%),1fr));gap:var(--ul-gap, 12px);list-style:none;-webkit-padding-start:0;padding-inline-start:0}.ul-list--grid>.ul-item>.ul-row{flex-direction:column;align-items:stretch;gap:6px}.ul-list--grid>.ul-item>.ul-row>.ul-controls{align-self:center}@media(pointer:coarse),(max-width:480px){.ul-controls{gap:16px}}.ul-item--draggable{-webkit-user-select:none;user-select:none;-webkit-user-drag:element}@media(hover:hover)and (pointer:fine){.ul-item--draggable{cursor:grab}.ul-item--draggable:active{cursor:grabbing}}.ul-item--draggable:focus{outline:2px solid #3b82f6;outline-offset:2px;border-radius:6px}.ul-item--draggable:focus:not(:focus-visible){outline:none}ui-list .ul-item--draggable img,ui-list .ul-item--draggable ui-image-preview{pointer-events:none;-webkit-user-drag:none}.ul-item--dragging{opacity:.5}.ul-item--over{outline:2px dashed #3b82f6;outline-offset:2px;border-radius:6px}@media(prefers-reduced-motion:reduce){.ul-item{transition:none}}@media(forced-colors:active){.ul-item.ul-item--moved{outline:2px solid Highlight;outline-offset:-2px}}@media(forced-colors:active){.ul-item.ul-item--dragging{outline:2px dotted Highlight;outline-offset:2px}.ul-item.ul-item--over{outline:2px dashed Highlight;outline-offset:2px}.ul-item--draggable:focus{outline:2px solid Highlight;outline-offset:2px}}.ul-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"],
25350
26379
  dependencies: [{
25351
26380
  kind: "directive",
25352
26381
  type: NgTemplateOutlet,
@@ -25474,7 +26503,7 @@ i0.ɵɵngDeclareClassMetadata({
25474
26503
  <div class="ul-sr" role="status" aria-live="polite" aria-atomic="true">{{ announcement() }}</div>
25475
26504
  }
25476
26505
  `,
25477
- styles: ["ui-list{display:block;min-width:0}.ul-list{margin:0;padding:0;min-width:0}.ul-list--unordered{list-style:none}.ul-list--ordered{list-style:decimal;-webkit-padding-start:1.75rem;padding-inline-start:1.75rem}.ul-list--ordered>.ul-item::marker{color:var(--text-secondary, #64748b);font-size:.875rem}.ul-item{min-width:0;transition:background-color .4s ease}.ul-item.ul-item--moved{background-color:var(--surface-hover, #f1f5f9)}.ul-list:not(.ul-list--grid)>.ul-item+.ul-item{margin-top:var(--ul-gap, 0px)}.ul-row{display:flex;align-items:center;gap:8px;min-width:0}.ul-content{flex:1 1 auto;min-width:0;word-break:break-word;overflow-wrap:anywhere}.ul-controls{display:flex;flex:0 0 auto;align-items:center;gap:2px}.ul-item--nav{cursor:pointer;border-radius:10px;transition:background-color .12s ease}.ul-item--nav:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.ul-item--nav:hover{background:var(--surface-hover, #f8fafc)}.ul-item--nav>.ul-row{padding-inline-end:16px}.ul-item--nav:hover .ul-chevron{color:#0f172a}.ul-chevron{flex:0 0 auto;color:#94a3b8;transition:color .15s ease}@media(prefers-reduced-motion:reduce){.ul-chevron{transition:none}}.ul-list.ul-list--grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--ul-min, 130px),100%),1fr));gap:var(--ul-gap, 12px);list-style:none;-webkit-padding-start:0;padding-inline-start:0}.ul-list--grid>.ul-item>.ul-row{flex-direction:column;align-items:stretch;gap:6px}.ul-list--grid>.ul-item>.ul-row>.ul-controls{align-self:center}@media(pointer:coarse),(max-width:480px){.ul-controls{gap:16px}}.ul-item--draggable{-webkit-user-select:none;user-select:none;-webkit-user-drag:element}@media(hover:hover)and (pointer:fine){.ul-item--draggable{cursor:grab}.ul-item--draggable:active{cursor:grabbing}}.ul-item--draggable:focus{outline:2px solid #3b82f6;outline-offset:2px;border-radius:6px}.ul-item--draggable:focus:not(:focus-visible){outline:none}ui-list .ul-item--draggable img,ui-list .ul-item--draggable ui-image-preview{pointer-events:none;-webkit-user-drag:none}.ul-item--dragging{opacity:.5}.ul-item--over{outline:2px dashed #3b82f6;outline-offset:2px;border-radius:6px}@media(prefers-reduced-motion:reduce){.ul-item{transition:none}}@media(forced-colors:active){.ul-item.ul-item--moved{outline:2px solid Highlight;outline-offset:-2px}}@media(forced-colors:active){.ul-item.ul-item--dragging{outline:2px dotted Highlight;outline-offset:2px}.ul-item.ul-item--over{outline:2px dashed Highlight;outline-offset:2px}.ul-item--draggable:focus{outline:2px solid Highlight;outline-offset:2px}}.ul-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"]
26506
+ styles: ["ui-list{display:block;min-width:0}.ul-list{margin:0;padding:0;min-width:0}.ul-list--unordered{list-style:none}.ul-list--ordered{list-style:decimal;-webkit-padding-start:1.75rem;padding-inline-start:1.75rem}.ul-list--ordered>.ul-item::marker{color:var(--text-secondary, #64748b);font-size:.875rem}.ul-item{min-width:0;transition:background-color .4s ease}.ul-item.ul-item--moved{background-color:var(--surface-hover, #f1f5f9)}.ul-list:not(.ul-list--grid)>.ul-item+.ul-item{margin-top:var(--ul-gap, 0px)}.ul-row{display:flex;align-items:center;gap:8px;min-width:0}.ul-content{flex:1 1 auto;min-width:0;word-break:break-word;overflow-wrap:anywhere}.ul-controls{display:flex;flex:0 0 auto;align-items:center;gap:2px}.ul-item--nav{cursor:pointer;border-radius:10px;transition:background-color .12s ease}.ul-item--nav:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.ul-item--nav:hover{background:var(--surface-hover, #f8fafc)}.ul-item--nav:hover:has(>.ul-row>.ul-content>ui-list-item.li-bordered){background:transparent}.ul-item--nav>.ul-row{padding-inline-end:8px}.ul-item--nav:hover .ul-chevron{color:#0f172a;transform:translate(2px)}.ul-chevron{flex:0 0 auto;color:#94a3b8;transition:color .15s ease,transform .15s ease}@media(prefers-reduced-motion:reduce){.ul-chevron{transition:none;transform:none!important}}.ul-list.ul-list--grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--ul-min, 130px),100%),1fr));gap:var(--ul-gap, 12px);list-style:none;-webkit-padding-start:0;padding-inline-start:0}.ul-list--grid>.ul-item>.ul-row{flex-direction:column;align-items:stretch;gap:6px}.ul-list--grid>.ul-item>.ul-row>.ul-controls{align-self:center}@media(pointer:coarse),(max-width:480px){.ul-controls{gap:16px}}.ul-item--draggable{-webkit-user-select:none;user-select:none;-webkit-user-drag:element}@media(hover:hover)and (pointer:fine){.ul-item--draggable{cursor:grab}.ul-item--draggable:active{cursor:grabbing}}.ul-item--draggable:focus{outline:2px solid #3b82f6;outline-offset:2px;border-radius:6px}.ul-item--draggable:focus:not(:focus-visible){outline:none}ui-list .ul-item--draggable img,ui-list .ul-item--draggable ui-image-preview{pointer-events:none;-webkit-user-drag:none}.ul-item--dragging{opacity:.5}.ul-item--over{outline:2px dashed #3b82f6;outline-offset:2px;border-radius:6px}@media(prefers-reduced-motion:reduce){.ul-item{transition:none}}@media(forced-colors:active){.ul-item.ul-item--moved{outline:2px solid Highlight;outline-offset:-2px}}@media(forced-colors:active){.ul-item.ul-item--dragging{outline:2px dotted Highlight;outline-offset:2px}.ul-item.ul-item--over{outline:2px dashed Highlight;outline-offset:2px}.ul-item--draggable:focus{outline:2px solid Highlight;outline-offset:2px}}.ul-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"]
25478
26507
  }]
25479
26508
  }],
25480
26509
  propDecorators: {
@@ -26942,11 +27971,7 @@ var PanelInfoListComponent = class PanelInfoListComponent {
26942
27971
  <span [class.pil-muted]="item.muted" [class.pil-danger]="item.danger" [class.pil-multiline]="item.multiline">{{ item.value || '—' }}</span>
26943
27972
  }
26944
27973
  @if (item.editAction) {
26945
- <ui-button class="pil-edit-btn" variant="icon" size="xs"
26946
- [ariaLabel]="item.editTooltip ?? 'Edit'" [attr.title]="item.editTooltip ?? 'Edit'"
26947
- (click)="item.editAction!()">
26948
- <svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/></svg>
26949
- </ui-button>
27974
+ <ui-icon class="pil-edit-btn" name="edit" [size]="14" [tooltip]="item.editTooltip ?? 'Edit'" (iconClick)="item.editAction!()" />
26950
27975
  }
26951
27976
  </span>
26952
27977
  </div>
@@ -26995,33 +28020,19 @@ var PanelInfoListComponent = class PanelInfoListComponent {
26995
28020
  },
26996
28021
  {
26997
28022
  kind: "component",
26998
- type: ButtonComponent,
26999
- selector: "ui-button",
28023
+ type: IconComponent,
28024
+ selector: "ui-icon",
27000
28025
  inputs: [
27001
- "variant",
27002
- "routerLink",
27003
- "queryParams",
27004
- "fragment",
27005
- "state",
27006
- "href",
27007
- "target",
27008
- "rel",
27009
- "shortLabel",
27010
- "shortBelow",
27011
- "color",
27012
- "active",
28026
+ "name",
28027
+ "tooltip",
28028
+ "ariaLabel",
27013
28029
  "size",
27014
- "type",
28030
+ "variant",
27015
28031
  "disabled",
27016
28032
  "loading",
27017
- "fullWidth",
27018
- "ariaLabel",
27019
- "ariaExpanded",
27020
- "ariaPressed",
27021
- "ariaDescribedBy",
27022
- "modal-footer-left",
27023
- "modal-footer-right"
27024
- ]
28033
+ "interactive"
28034
+ ],
28035
+ outputs: ["iconClick"]
27025
28036
  }
27026
28037
  ],
27027
28038
  changeDetection: i0.ChangeDetectionStrategy.OnPush
@@ -27043,7 +28054,7 @@ i0.ɵɵngDeclareClassMetadata({
27043
28054
  BadgeComponent,
27044
28055
  RouterLink,
27045
28056
  EmptyStateComponent,
27046
- ButtonComponent
28057
+ IconComponent
27047
28058
  ],
27048
28059
  template: `
27049
28060
  @for (section of displaySections(); track section.title ?? $index) {
@@ -27101,11 +28112,7 @@ i0.ɵɵngDeclareClassMetadata({
27101
28112
  <span [class.pil-muted]="item.muted" [class.pil-danger]="item.danger" [class.pil-multiline]="item.multiline">{{ item.value || '—' }}</span>
27102
28113
  }
27103
28114
  @if (item.editAction) {
27104
- <ui-button class="pil-edit-btn" variant="icon" size="xs"
27105
- [ariaLabel]="item.editTooltip ?? 'Edit'" [attr.title]="item.editTooltip ?? 'Edit'"
27106
- (click)="item.editAction!()">
27107
- <svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/></svg>
27108
- </ui-button>
28115
+ <ui-icon class="pil-edit-btn" name="edit" [size]="14" [tooltip]="item.editTooltip ?? 'Edit'" (iconClick)="item.editAction!()" />
27109
28116
  }
27110
28117
  </span>
27111
28118
  </div>
@@ -27271,75 +28278,6 @@ i0.ɵɵngDeclareClassMetadata({
27271
28278
  }]
27272
28279
  }
27273
28280
  });
27274
- const ACTION_VERB = {
27275
- load: "loading",
27276
- save: "saving",
27277
- create: "creating",
27278
- update: "updating",
27279
- delete: "deleting",
27280
- send: "sending",
27281
- export: "exporting",
27282
- import: "importing",
27283
- upload: "uploading",
27284
- download: "downloading"
27285
- };
27286
- const ACTION_PERMISSION_VERB = {
27287
- load: "access",
27288
- save: "save",
27289
- create: "create",
27290
- update: "update",
27291
- delete: "delete",
27292
- send: "send",
27293
- export: "export",
27294
- import: "import",
27295
- upload: "upload",
27296
- download: "download"
27297
- };
27298
- const REQUEST_METHOD = "__forgerouteRequestMethod";
27299
- const errorContextInterceptor = (req, next) => next(req).pipe(catchError$1((err) => {
27300
- if (err instanceof HttpErrorResponse && !(REQUEST_METHOD in err)) Object.defineProperty(err, REQUEST_METHOD, {
27301
- value: req.method.toUpperCase(),
27302
- enumerable: false
27303
- });
27304
- return throwError(() => err);
27305
- }));
27306
- function actionFromMethod(error) {
27307
- switch (error[REQUEST_METHOD]) {
27308
- case "POST":
27309
- case "PUT":
27310
- case "PATCH": return "save";
27311
- case "DELETE": return "delete";
27312
- default: return "load";
27313
- }
27314
- }
27315
- function withoutLeadingArticle(ctx) {
27316
- return ctx.replace(/^(?:the|an?)\s+/i, "") || ctx;
27317
- }
27318
- function getErrorMessage(error, fallbackContext, action) {
27319
- const ctx = fallbackContext?.trim() || "data";
27320
- const act = action ?? (error instanceof HttpErrorResponse ? actionFromMethod(error) : "load");
27321
- const failed = `There was an error ${ACTION_VERB[act]} ${ctx}.`;
27322
- if (error instanceof HttpErrorResponse) {
27323
- if (error.error?.message) return error.error.message;
27324
- if (typeof error.error === "string" && error.error.length < 200) return error.error;
27325
- switch (error.status) {
27326
- case 0: return `${failed} Please check your connection and try again.`;
27327
- case 401: return "Your session has expired. Please log in again.";
27328
- case 403: return `You don't have permission to ${ACTION_PERMISSION_VERB[act]} ${ctx}.`;
27329
- case 404: return `The ${withoutLeadingArticle(ctx)} you're looking for could not be found.`;
27330
- case 408: return `${failed} The request timed out — please try again.`;
27331
- case 422: return "The data you submitted is invalid. Please check your input and try again.";
27332
- case 429: return `${failed} Too many requests — please wait a moment and try again.`;
27333
- case 502:
27334
- case 503:
27335
- case 504: return `${failed} Please try again in a few minutes.`;
27336
- default: return `${failed} Please try again.`;
27337
- }
27338
- }
27339
- if (error instanceof Error) return error.message;
27340
- if (typeof error === "string") return error;
27341
- return `${failed} Please try again.`;
27342
- }
27343
28281
  const US_STATES = [
27344
28282
  {
27345
28283
  value: "AL",
@@ -33278,6 +34216,7 @@ var DetailCardComponent = class DetailCardComponent {
33278
34216
  this.subtitle = input("", ...ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []);
33279
34217
  this.background = input("", ...ngDevMode ? [{ debugName: "background" }] : /* istanbul ignore next */ []);
33280
34218
  this.headerBackground = input("", ...ngDevMode ? [{ debugName: "headerBackground" }] : /* istanbul ignore next */ []);
34219
+ this.footerBackground = input("", ...ngDevMode ? [{ debugName: "footerBackground" }] : /* istanbul ignore next */ []);
33281
34220
  this.textColor = input("", ...ngDevMode ? [{ debugName: "textColor" }] : /* istanbul ignore next */ []);
33282
34221
  this.showHeader = input(true, ...ngDevMode ? [{ debugName: "showHeader" }] : /* istanbul ignore next */ []);
33283
34222
  this.collapsible = input(true, ...ngDevMode ? [{ debugName: "collapsible" }] : /* istanbul ignore next */ []);
@@ -33394,6 +34333,13 @@ var DetailCardComponent = class DetailCardComponent {
33394
34333
  isRequired: false,
33395
34334
  transformFunction: null
33396
34335
  },
34336
+ footerBackground: {
34337
+ classPropertyName: "footerBackground",
34338
+ publicName: "footerBackground",
34339
+ isSignal: true,
34340
+ isRequired: false,
34341
+ transformFunction: null
34342
+ },
33397
34343
  textColor: {
33398
34344
  classPropertyName: "textColor",
33399
34345
  publicName: "textColor",
@@ -33509,7 +34455,7 @@ var DetailCardComponent = class DetailCardComponent {
33509
34455
  },
33510
34456
  ngImport: i0,
33511
34457
  template: `
33512
- <div class="dc" [class.dc-fill]="fill()" [class.dc-has-text-color]="!!textColor()" [class.dc-selectable]="selectable()" [class.dc-selected]="selectable() && selected()"
34458
+ <div class="dc" [class.dc-fill]="fill()" [class.dc-has-text-color]="!!textColor()" [class.dc-has-bg]="!!((selectable() && selected() && selectedBackground()) || background())" [class.dc-selectable]="selectable()" [class.dc-selected]="selectable() && selected()"
33513
34459
  [style.outline-color]="selectable() && selected() ? selectedColor() : null"
33514
34460
  [style.background]="(selectable() && selected() && selectedBackground()) || background() || null" (click)="onCardClick($event)"
33515
34461
  [style.color]="textColor() || null" [style.--dc-text]="textColor() || null">
@@ -33551,10 +34497,11 @@ var DetailCardComponent = class DetailCardComponent {
33551
34497
  <ng-content />
33552
34498
  </div>
33553
34499
  </div>
34500
+ <div class="dc-footer" [class.dc-footer--hidden]="!isOpen()" [style.background]="footerBackground() || null"><ng-content select="[card-footer]" /></div>
33554
34501
  </div>
33555
34502
  `,
33556
34503
  isInline: true,
33557
- styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom:0}:host(.dc-fill-host){height:100%;margin-bottom:0}.dc.dc-fill{height:100%;box-sizing:border-box;display:flex;flex-direction:column}.dc.dc-fill .dc-body-wrap{flex:1 1 auto;min-height:0}.dc.dc-fill .dc-body{display:flex;flex-direction:column}.dc-selectable{cursor:pointer}.dc-selected{outline:2px solid #3b82f6;outline-offset:-1px}.dc{background:#fff;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dc-header{display:flex;align-items:center;flex-wrap:wrap;gap:8px 10px;padding:14px 18px}.dc-header.open{border-bottom:1px solid #f1f5f9}.dc-header.collapsible{cursor:pointer;-webkit-user-select:none;user-select:none}@media(hover:hover){.dc-header.collapsible:hover{background:#f8fafc}}.dc-chevron{flex-shrink:0;color:var(--dc-text, #64748b)}.dc-chevron svg{transition:transform .2s}.dc-chevron svg.rotated{transform:rotate(-90deg)}.dc-header-text{display:flex;flex-direction:column;gap:2px;flex:1 1 160px;min-width:0;word-break:break-word;overflow-wrap:anywhere}.dc-title{font-size:.8125rem;font-weight:800;letter-spacing:.07em;color:var(--dc-text, #1e293b);line-height:1.3;text-transform:uppercase}.dc-title--as-written{text-transform:none}.dc-subtitle{font-size:.75rem;color:var(--dc-text, #475569)}.dc-has-text-color .dc-subtitle{opacity:.8}.dc-has-text-color .dc-header.open{border-bottom-color:#94a3b859}.dc-edit{flex-shrink:0;margin-left:auto}.dc-edit-action{display:inline-flex;align-items:center;justify-content:center;gap:5px;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;cursor:pointer;white-space:nowrap;transition:background-color .15s ease,color .15s ease}.dc-edit-action:hover{background:#f1f5f9;color:#1e293b}.dc-edit-action:focus-visible{outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}@media(pointer:coarse),(max-width:480px){.dc-edit-action{min-height:44px}}.dc-body-wrap{display:grid;grid-template-rows:1fr;transition:grid-template-rows .25s ease}.dc-body-wrap.collapsed{grid-template-rows:0fr}.dc-body{padding:16px 18px;min-height:0;overflow:hidden}@media(max-width:480px){.dc-header{padding:12px 14px}.dc-body{padding:14px}.dc-edit{margin-left:0}}@media(prefers-reduced-motion:reduce){.dc-body-wrap,.dc-chevron svg{transition:none}}\n"],
34504
+ styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom:0}:host(.dc-fill-host){height:100%;margin-bottom:0}.dc.dc-fill{height:100%;box-sizing:border-box;display:flex;flex-direction:column}.dc.dc-fill .dc-body-wrap{flex:1 1 auto;min-height:0}.dc.dc-fill .dc-body{display:flex;flex-direction:column}.dc-selectable{cursor:pointer}.dc-selected{outline:2px solid #3b82f6;outline-offset:-1px}.dc{background:#fff;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dc-header{display:flex;align-items:center;flex-wrap:wrap;gap:8px 10px;padding:14px 18px}.dc-header.open{border-bottom:1px solid #f1f5f9}.dc-has-bg .dc-header.open{border-bottom-color:#94a3b859}.dc-header.collapsible{cursor:pointer;-webkit-user-select:none;user-select:none}@media(hover:hover){.dc-header.collapsible:hover{background:#f8fafc}}.dc-chevron{flex-shrink:0;color:var(--dc-text, #64748b)}.dc-chevron svg{transition:transform .2s}.dc-chevron svg.rotated{transform:rotate(-90deg)}.dc-header-text{display:flex;flex-direction:column;gap:2px;flex:1 1 160px;min-width:0;word-break:break-word;overflow-wrap:anywhere}.dc-title{font-size:.8125rem;font-weight:800;letter-spacing:.07em;color:var(--dc-text, #1e293b);line-height:1.3;text-transform:uppercase}.dc-title--as-written{text-transform:none}.dc-subtitle{font-size:.8125rem;color:var(--dc-text, #475569)}.dc-has-text-color .dc-subtitle{opacity:.8}.dc-has-text-color .dc-header.open{border-bottom-color:#94a3b859}.dc-edit{flex-shrink:0;margin-left:auto}.dc-edit-action{display:inline-flex;align-items:center;justify-content:center;gap:5px;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;cursor:pointer;white-space:nowrap;transition:background-color .15s ease,color .15s ease}.dc-edit-action:hover{background:#f1f5f9;color:#1e293b}.dc-edit-action:focus-visible{outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}@media(pointer:coarse),(max-width:480px){.dc-edit-action{min-height:44px}}.dc-body-wrap{display:grid;grid-template-rows:1fr;transition:grid-template-rows .25s ease}.dc-body-wrap.collapsed{grid-template-rows:0fr}.dc-body{padding:16px 18px;min-height:0;overflow:hidden}.dc-footer{padding:10px 18px;border-top:1px solid #f1f5f9}.dc-footer:empty,.dc-footer.dc-footer--hidden{display:none}.dc-has-bg .dc-footer{border-top-color:#94a3b859}@media(max-width:480px){.dc-footer{padding:10px 14px}.dc-header{padding:12px 14px}.dc-body{padding:14px}.dc-edit{margin-left:0}}@media(prefers-reduced-motion:reduce){.dc-body-wrap,.dc-chevron svg{transition:none}}\n"],
33558
34505
  dependencies: [{
33559
34506
  kind: "component",
33560
34507
  type: ButtonComponent,
@@ -33609,7 +34556,7 @@ i0.ɵɵngDeclareClassMetadata({
33609
34556
  "[attr.aria-label]": "groupLabel()"
33610
34557
  },
33611
34558
  template: `
33612
- <div class="dc" [class.dc-fill]="fill()" [class.dc-has-text-color]="!!textColor()" [class.dc-selectable]="selectable()" [class.dc-selected]="selectable() && selected()"
34559
+ <div class="dc" [class.dc-fill]="fill()" [class.dc-has-text-color]="!!textColor()" [class.dc-has-bg]="!!((selectable() && selected() && selectedBackground()) || background())" [class.dc-selectable]="selectable()" [class.dc-selected]="selectable() && selected()"
33613
34560
  [style.outline-color]="selectable() && selected() ? selectedColor() : null"
33614
34561
  [style.background]="(selectable() && selected() && selectedBackground()) || background() || null" (click)="onCardClick($event)"
33615
34562
  [style.color]="textColor() || null" [style.--dc-text]="textColor() || null">
@@ -33651,9 +34598,10 @@ i0.ɵɵngDeclareClassMetadata({
33651
34598
  <ng-content />
33652
34599
  </div>
33653
34600
  </div>
34601
+ <div class="dc-footer" [class.dc-footer--hidden]="!isOpen()" [style.background]="footerBackground() || null"><ng-content select="[card-footer]" /></div>
33654
34602
  </div>
33655
34603
  `,
33656
- styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom:0}:host(.dc-fill-host){height:100%;margin-bottom:0}.dc.dc-fill{height:100%;box-sizing:border-box;display:flex;flex-direction:column}.dc.dc-fill .dc-body-wrap{flex:1 1 auto;min-height:0}.dc.dc-fill .dc-body{display:flex;flex-direction:column}.dc-selectable{cursor:pointer}.dc-selected{outline:2px solid #3b82f6;outline-offset:-1px}.dc{background:#fff;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dc-header{display:flex;align-items:center;flex-wrap:wrap;gap:8px 10px;padding:14px 18px}.dc-header.open{border-bottom:1px solid #f1f5f9}.dc-header.collapsible{cursor:pointer;-webkit-user-select:none;user-select:none}@media(hover:hover){.dc-header.collapsible:hover{background:#f8fafc}}.dc-chevron{flex-shrink:0;color:var(--dc-text, #64748b)}.dc-chevron svg{transition:transform .2s}.dc-chevron svg.rotated{transform:rotate(-90deg)}.dc-header-text{display:flex;flex-direction:column;gap:2px;flex:1 1 160px;min-width:0;word-break:break-word;overflow-wrap:anywhere}.dc-title{font-size:.8125rem;font-weight:800;letter-spacing:.07em;color:var(--dc-text, #1e293b);line-height:1.3;text-transform:uppercase}.dc-title--as-written{text-transform:none}.dc-subtitle{font-size:.75rem;color:var(--dc-text, #475569)}.dc-has-text-color .dc-subtitle{opacity:.8}.dc-has-text-color .dc-header.open{border-bottom-color:#94a3b859}.dc-edit{flex-shrink:0;margin-left:auto}.dc-edit-action{display:inline-flex;align-items:center;justify-content:center;gap:5px;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;cursor:pointer;white-space:nowrap;transition:background-color .15s ease,color .15s ease}.dc-edit-action:hover{background:#f1f5f9;color:#1e293b}.dc-edit-action:focus-visible{outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}@media(pointer:coarse),(max-width:480px){.dc-edit-action{min-height:44px}}.dc-body-wrap{display:grid;grid-template-rows:1fr;transition:grid-template-rows .25s ease}.dc-body-wrap.collapsed{grid-template-rows:0fr}.dc-body{padding:16px 18px;min-height:0;overflow:hidden}@media(max-width:480px){.dc-header{padding:12px 14px}.dc-body{padding:14px}.dc-edit{margin-left:0}}@media(prefers-reduced-motion:reduce){.dc-body-wrap,.dc-chevron svg{transition:none}}\n"]
34604
+ styles: [":host{display:block;margin-bottom:16px}:host(:last-child){margin-bottom:0}:host(.dc-fill-host){height:100%;margin-bottom:0}.dc.dc-fill{height:100%;box-sizing:border-box;display:flex;flex-direction:column}.dc.dc-fill .dc-body-wrap{flex:1 1 auto;min-height:0}.dc.dc-fill .dc-body{display:flex;flex-direction:column}.dc-selectable{cursor:pointer}.dc-selected{outline:2px solid #3b82f6;outline-offset:-1px}.dc{background:#fff;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden}.dc-header{display:flex;align-items:center;flex-wrap:wrap;gap:8px 10px;padding:14px 18px}.dc-header.open{border-bottom:1px solid #f1f5f9}.dc-has-bg .dc-header.open{border-bottom-color:#94a3b859}.dc-header.collapsible{cursor:pointer;-webkit-user-select:none;user-select:none}@media(hover:hover){.dc-header.collapsible:hover{background:#f8fafc}}.dc-chevron{flex-shrink:0;color:var(--dc-text, #64748b)}.dc-chevron svg{transition:transform .2s}.dc-chevron svg.rotated{transform:rotate(-90deg)}.dc-header-text{display:flex;flex-direction:column;gap:2px;flex:1 1 160px;min-width:0;word-break:break-word;overflow-wrap:anywhere}.dc-title{font-size:.8125rem;font-weight:800;letter-spacing:.07em;color:var(--dc-text, #1e293b);line-height:1.3;text-transform:uppercase}.dc-title--as-written{text-transform:none}.dc-subtitle{font-size:.8125rem;color:var(--dc-text, #475569)}.dc-has-text-color .dc-subtitle{opacity:.8}.dc-has-text-color .dc-header.open{border-bottom-color:#94a3b859}.dc-edit{flex-shrink:0;margin-left:auto}.dc-edit-action{display:inline-flex;align-items:center;justify-content:center;gap:5px;font-family:inherit;font-size:.8rem;font-weight:500;line-height:1.4;color:#64748b;background:none;border:1px solid #e2e8f0;border-radius:6px;padding:4px 10px;cursor:pointer;white-space:nowrap;transition:background-color .15s ease,color .15s ease}.dc-edit-action:hover{background:#f1f5f9;color:#1e293b}.dc-edit-action:focus-visible{outline:2px solid var(--ui-focus, #3b82f6);outline-offset:2px}@media(pointer:coarse),(max-width:480px){.dc-edit-action{min-height:44px}}.dc-body-wrap{display:grid;grid-template-rows:1fr;transition:grid-template-rows .25s ease}.dc-body-wrap.collapsed{grid-template-rows:0fr}.dc-body{padding:16px 18px;min-height:0;overflow:hidden}.dc-footer{padding:10px 18px;border-top:1px solid #f1f5f9}.dc-footer:empty,.dc-footer.dc-footer--hidden{display:none}.dc-has-bg .dc-footer{border-top-color:#94a3b859}@media(max-width:480px){.dc-footer{padding:10px 14px}.dc-header{padding:12px 14px}.dc-body{padding:14px}.dc-edit{margin-left:0}}@media(prefers-reduced-motion:reduce){.dc-body-wrap,.dc-chevron svg{transition:none}}\n"]
33657
34605
  }]
33658
34606
  }],
33659
34607
  propDecorators: {
@@ -33721,6 +34669,14 @@ i0.ɵɵngDeclareClassMetadata({
33721
34669
  required: false
33722
34670
  }]
33723
34671
  }],
34672
+ footerBackground: [{
34673
+ type: i0.Input,
34674
+ args: [{
34675
+ isSignal: true,
34676
+ alias: "footerBackground",
34677
+ required: false
34678
+ }]
34679
+ }],
33724
34680
  textColor: [{
33725
34681
  type: i0.Input,
33726
34682
  args: [{
@@ -33951,6 +34907,697 @@ i0.ɵɵngDeclareClassMetadata({
33951
34907
  }]
33952
34908
  }
33953
34909
  });
34910
+ var BoardCardDirective = class BoardCardDirective {
34911
+ constructor() {
34912
+ this.template = inject(TemplateRef);
34913
+ }
34914
+ static ngTemplateContextGuard(_dir, _ctx) {
34915
+ return true;
34916
+ }
34917
+ static {
34918
+ this.ɵfac = i0.ɵɵngDeclareFactory({
34919
+ minVersion: "12.0.0",
34920
+ version: "22.2.2",
34921
+ ngImport: i0,
34922
+ type: BoardCardDirective,
34923
+ deps: [],
34924
+ target: i0.ɵɵFactoryTarget.Directive
34925
+ });
34926
+ }
34927
+ static {
34928
+ this.ɵdir = i0.ɵɵngDeclareDirective({
34929
+ minVersion: "14.0.0",
34930
+ version: "22.2.2",
34931
+ type: BoardCardDirective,
34932
+ isStandalone: true,
34933
+ selector: "ng-template[uiBoardCard]",
34934
+ ngImport: i0
34935
+ });
34936
+ }
34937
+ };
34938
+ i0.ɵɵngDeclareClassMetadata({
34939
+ minVersion: "12.0.0",
34940
+ version: "22.2.2",
34941
+ ngImport: i0,
34942
+ type: BoardCardDirective,
34943
+ decorators: [{
34944
+ type: Directive,
34945
+ args: [{
34946
+ selector: "ng-template[uiBoardCard]",
34947
+ standalone: true
34948
+ }]
34949
+ }]
34950
+ });
34951
+ const DOT_COLORS = {
34952
+ blue: "#3b82f6",
34953
+ cyan: "#06b6d4",
34954
+ green: "#22c55e",
34955
+ teal: "#14b8a6",
34956
+ amber: "#f59e0b",
34957
+ orange: "#f97316",
34958
+ red: "#ef4444",
34959
+ pink: "#ec4899",
34960
+ slate: "#64748b",
34961
+ gray: "#6b7280"
34962
+ };
34963
+ var BoardComponent = class BoardComponent {
34964
+ constructor() {
34965
+ this.columns = input.required(...ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []);
34966
+ this.itemKey = input.required(...ngDevMode ? [{ debugName: "itemKey" }] : /* istanbul ignore next */ []);
34967
+ this.itemLabel = input.required(...ngDevMode ? [{ debugName: "itemLabel" }] : /* istanbul ignore next */ []);
34968
+ this.cardActions = input([], ...ngDevMode ? [{ debugName: "cardActions" }] : /* istanbul ignore next */ []);
34969
+ this.loading = input(false, ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
34970
+ this.error = input(null, ...ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []);
34971
+ this.readOnly = input(false, ...ngDevMode ? [{ debugName: "readOnly" }] : /* istanbul ignore next */ []);
34972
+ this.moveDisabled = input(false, ...ngDevMode ? [{ debugName: "moveDisabled" }] : /* istanbul ignore next */ []);
34973
+ this.canMove = input(null, ...ngDevMode ? [{ debugName: "canMove" }] : /* istanbul ignore next */ []);
34974
+ this.ariaLabel = input("Board", ...ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []);
34975
+ this.emptyMessage = input("Nothing to show.", ...ngDevMode ? [{ debugName: "emptyMessage" }] : /* istanbul ignore next */ []);
34976
+ this.emptyColumnText = input("Nothing here yet", ...ngDevMode ? [{ debugName: "emptyColumnText" }] : /* istanbul ignore next */ []);
34977
+ this.itemNoun = input("item", ...ngDevMode ? [{ debugName: "itemNoun" }] : /* istanbul ignore next */ []);
34978
+ this.itemNounPlural = input("items", ...ngDevMode ? [{ debugName: "itemNounPlural" }] : /* istanbul ignore next */ []);
34979
+ this.retryLabel = input("Retry", ...ngDevMode ? [{ debugName: "retryLabel" }] : /* istanbul ignore next */ []);
34980
+ this.cardClick = output();
34981
+ this.cardAction = output();
34982
+ this.itemMove = output();
34983
+ this.retry = output();
34984
+ this.card = contentChild(BoardCardDirective, ...ngDevMode ? [{ debugName: "card" }] : /* istanbul ignore next */ []);
34985
+ this.cols = linkedSignal(() => this.columns(), ...ngDevMode ? [{ debugName: "cols" }] : /* istanbul ignore next */ []);
34986
+ this.overKey = signal(null, ...ngDevMode ? [{ debugName: "overKey" }] : /* istanbul ignore next */ []);
34987
+ this.draggingKey = signal(null, ...ngDevMode ? [{ debugName: "draggingKey" }] : /* istanbul ignore next */ []);
34988
+ this.announcement = signal("", ...ngDevMode ? [{ debugName: "announcement" }] : /* istanbul ignore next */ []);
34989
+ this.host = inject(ElementRef);
34990
+ this.drag = null;
34991
+ this.skeletonColumns = computed(() => Array.from({ length: Math.max(this.columns().length, 4) }, (_, i) => i), ...ngDevMode ? [{ debugName: "skeletonColumns" }] : /* istanbul ignore next */ []);
34992
+ this.canDrag = computed(() => !this.readOnly() && !this.moveDisabled(), ...ngDevMode ? [{ debugName: "canDrag" }] : /* istanbul ignore next */ []);
34993
+ this.canMoveAny = this.canDrag;
34994
+ }
34995
+ dot(color) {
34996
+ return color && DOT_COLORS[color] || color || "#3b82f6";
34997
+ }
34998
+ onDragStart(event, item, col) {
34999
+ if (!this.canDrag()) {
35000
+ event.preventDefault();
35001
+ return;
35002
+ }
35003
+ this.drag = {
35004
+ item,
35005
+ from: col.key
35006
+ };
35007
+ this.draggingKey.set(this.itemKey()(item));
35008
+ if (event.dataTransfer) {
35009
+ event.dataTransfer.effectAllowed = "move";
35010
+ event.dataTransfer.setData("text/plain", this.itemKey()(item));
35011
+ }
35012
+ }
35013
+ onDragEnd() {
35014
+ this.drag = null;
35015
+ this.draggingKey.set(null);
35016
+ this.overKey.set(null);
35017
+ }
35018
+ onDragOver(event, col) {
35019
+ if (!this.drag || !this.accepts(this.drag.item, this.drag.from, col)) {
35020
+ if (event.dataTransfer) event.dataTransfer.dropEffect = "none";
35021
+ return;
35022
+ }
35023
+ event.preventDefault();
35024
+ if (event.dataTransfer) event.dataTransfer.dropEffect = "move";
35025
+ if (this.overKey() !== col.key) this.overKey.set(col.key);
35026
+ }
35027
+ onDragLeave(event, col) {
35028
+ const related = event.relatedTarget;
35029
+ if ((!related || !event.currentTarget.contains(related)) && this.overKey() === col.key) this.overKey.set(null);
35030
+ }
35031
+ onDrop(event, col) {
35032
+ event.preventDefault();
35033
+ const drag = this.drag;
35034
+ this.onDragEnd();
35035
+ if (drag && this.accepts(drag.item, drag.from, col)) this.move(drag.item, drag.from, col.key);
35036
+ }
35037
+ onCardKey(event, item, col) {
35038
+ if (event.target !== event.currentTarget) return;
35039
+ if (event.key === "Enter" || event.key === " ") {
35040
+ event.preventDefault();
35041
+ this.cardClick.emit(item);
35042
+ return;
35043
+ }
35044
+ if (!event.shiftKey || event.key !== "ArrowLeft" && event.key !== "ArrowRight") return;
35045
+ event.preventDefault();
35046
+ if (!this.canDrag()) return;
35047
+ const cols = this.cols();
35048
+ const step = event.key === "ArrowRight" ? 1 : -1;
35049
+ for (let i = cols.findIndex((c) => c.key === col.key) + step; i >= 0 && i < cols.length; i += step) if (this.accepts(item, col.key, cols[i])) {
35050
+ this.move(item, col.key, cols[i].key);
35051
+ this.announcement.set(`${this.itemLabel()(item)} moved to ${cols[i].label}`);
35052
+ const key = this.itemKey()(item);
35053
+ setTimeout(() => {
35054
+ const cards = this.host.nativeElement.querySelectorAll(".ub-card");
35055
+ Array.from(cards).find((c) => c.dataset["boardKey"] === key)?.focus();
35056
+ });
35057
+ return;
35058
+ }
35059
+ }
35060
+ accepts(item, from, to) {
35061
+ if (from === to.key || to.dropDisabled || this.moveDisabled() || this.readOnly()) return false;
35062
+ const rule = this.canMove();
35063
+ return !rule || rule(item, from, to.key);
35064
+ }
35065
+ move(item, from, to) {
35066
+ const before = this.cols();
35067
+ const key = this.itemKey()(item);
35068
+ this.cols.set(before.map((c) => {
35069
+ if (c.key === from) return {
35070
+ ...c,
35071
+ items: c.items.filter((i) => this.itemKey()(i) !== key)
35072
+ };
35073
+ if (c.key === to) return {
35074
+ ...c,
35075
+ items: [item, ...c.items]
35076
+ };
35077
+ return c;
35078
+ }));
35079
+ this.itemMove.emit({
35080
+ item,
35081
+ from,
35082
+ to,
35083
+ revert: () => this.cols.set(before)
35084
+ });
35085
+ }
35086
+ static {
35087
+ this.ɵfac = i0.ɵɵngDeclareFactory({
35088
+ minVersion: "12.0.0",
35089
+ version: "22.2.2",
35090
+ ngImport: i0,
35091
+ type: BoardComponent,
35092
+ deps: [],
35093
+ target: i0.ɵɵFactoryTarget.Component
35094
+ });
35095
+ }
35096
+ static {
35097
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
35098
+ minVersion: "17.0.0",
35099
+ version: "22.2.2",
35100
+ type: BoardComponent,
35101
+ isStandalone: true,
35102
+ selector: "ui-board",
35103
+ inputs: {
35104
+ columns: {
35105
+ classPropertyName: "columns",
35106
+ publicName: "columns",
35107
+ isSignal: true,
35108
+ isRequired: true,
35109
+ transformFunction: null
35110
+ },
35111
+ itemKey: {
35112
+ classPropertyName: "itemKey",
35113
+ publicName: "itemKey",
35114
+ isSignal: true,
35115
+ isRequired: true,
35116
+ transformFunction: null
35117
+ },
35118
+ itemLabel: {
35119
+ classPropertyName: "itemLabel",
35120
+ publicName: "itemLabel",
35121
+ isSignal: true,
35122
+ isRequired: true,
35123
+ transformFunction: null
35124
+ },
35125
+ cardActions: {
35126
+ classPropertyName: "cardActions",
35127
+ publicName: "cardActions",
35128
+ isSignal: true,
35129
+ isRequired: false,
35130
+ transformFunction: null
35131
+ },
35132
+ loading: {
35133
+ classPropertyName: "loading",
35134
+ publicName: "loading",
35135
+ isSignal: true,
35136
+ isRequired: false,
35137
+ transformFunction: null
35138
+ },
35139
+ error: {
35140
+ classPropertyName: "error",
35141
+ publicName: "error",
35142
+ isSignal: true,
35143
+ isRequired: false,
35144
+ transformFunction: null
35145
+ },
35146
+ readOnly: {
35147
+ classPropertyName: "readOnly",
35148
+ publicName: "readOnly",
35149
+ isSignal: true,
35150
+ isRequired: false,
35151
+ transformFunction: null
35152
+ },
35153
+ moveDisabled: {
35154
+ classPropertyName: "moveDisabled",
35155
+ publicName: "moveDisabled",
35156
+ isSignal: true,
35157
+ isRequired: false,
35158
+ transformFunction: null
35159
+ },
35160
+ canMove: {
35161
+ classPropertyName: "canMove",
35162
+ publicName: "canMove",
35163
+ isSignal: true,
35164
+ isRequired: false,
35165
+ transformFunction: null
35166
+ },
35167
+ ariaLabel: {
35168
+ classPropertyName: "ariaLabel",
35169
+ publicName: "ariaLabel",
35170
+ isSignal: true,
35171
+ isRequired: false,
35172
+ transformFunction: null
35173
+ },
35174
+ emptyMessage: {
35175
+ classPropertyName: "emptyMessage",
35176
+ publicName: "emptyMessage",
35177
+ isSignal: true,
35178
+ isRequired: false,
35179
+ transformFunction: null
35180
+ },
35181
+ emptyColumnText: {
35182
+ classPropertyName: "emptyColumnText",
35183
+ publicName: "emptyColumnText",
35184
+ isSignal: true,
35185
+ isRequired: false,
35186
+ transformFunction: null
35187
+ },
35188
+ itemNoun: {
35189
+ classPropertyName: "itemNoun",
35190
+ publicName: "itemNoun",
35191
+ isSignal: true,
35192
+ isRequired: false,
35193
+ transformFunction: null
35194
+ },
35195
+ itemNounPlural: {
35196
+ classPropertyName: "itemNounPlural",
35197
+ publicName: "itemNounPlural",
35198
+ isSignal: true,
35199
+ isRequired: false,
35200
+ transformFunction: null
35201
+ },
35202
+ retryLabel: {
35203
+ classPropertyName: "retryLabel",
35204
+ publicName: "retryLabel",
35205
+ isSignal: true,
35206
+ isRequired: false,
35207
+ transformFunction: null
35208
+ }
35209
+ },
35210
+ outputs: {
35211
+ cardClick: "cardClick",
35212
+ cardAction: "cardAction",
35213
+ itemMove: "itemMove",
35214
+ retry: "retry"
35215
+ },
35216
+ queries: [{
35217
+ propertyName: "card",
35218
+ first: true,
35219
+ predicate: BoardCardDirective,
35220
+ descendants: true,
35221
+ isSignal: true
35222
+ }],
35223
+ ngImport: i0,
35224
+ template: `
35225
+ <!-- The card's "⋮" menu. Place it in the card's top row: <ng-container [ngTemplateOutlet]="menu" [ngTemplateOutletContext]="{ $implicit: item }" /> -->
35226
+ <ng-template #menuTpl let-item>
35227
+ @if (cardActions().length) {
35228
+ <div class="ub-card__top-right" (click)="$event.stopPropagation()" (keydown)="$event.stopPropagation()">
35229
+ <ui-more-menu [actions]="cardActions()" [ariaLabel]="'Actions for ' + itemLabel()(item)"
35230
+ (actionClick)="cardAction.emit({ type: $event, item })" />
35231
+ </div>
35232
+ }
35233
+ </ng-template>
35234
+ <div class="ub-wrap">
35235
+ @if (loading()) {
35236
+ <div class="ub-skeleton" role="status" [attr.aria-label]="'Loading ' + ariaLabel()">
35237
+ @for (n of skeletonColumns(); track n) {
35238
+ <div class="ub-col-skeleton" aria-hidden="true">
35239
+ <div class="ub-col-skeleton__header"></div>
35240
+ @for (c of [1, 2, 3]; track c) { <div class="ub-col-skeleton__card"></div> }
35241
+ </div>
35242
+ }
35243
+ </div>
35244
+ } @else if (error()) {
35245
+ <div class="ub-message" role="alert">
35246
+ <p>{{ error() }}</p>
35247
+ <ui-button variant="secondary" size="sm" (click)="retry.emit()">{{ retryLabel() }}</ui-button>
35248
+ </div>
35249
+ } @else if (cols().length === 0) {
35250
+ <div class="ub-message" role="status"><p>{{ emptyMessage() }}</p></div>
35251
+ } @else {
35252
+ <div class="ub-board" role="region" [attr.aria-label]="ariaLabel()">
35253
+ @for (col of cols(); track col.key) {
35254
+ <div class="ub-col"
35255
+ [class.ub-col--over]="overKey() === col.key"
35256
+ [class.ub-col--success]="col.tone === 'success'"
35257
+ role="group"
35258
+ [attr.aria-label]="col.label + ' — ' + col.items.length + ' ' + (col.items.length === 1 ? itemNoun() : itemNounPlural())"
35259
+ (dragover)="onDragOver($event, col)"
35260
+ (dragleave)="onDragLeave($event, col)"
35261
+ (drop)="onDrop($event, col)">
35262
+ <div class="ub-col__header">
35263
+ <div class="ub-col__title">
35264
+ <span class="ub-col__dot" [style.background]="dot(col.color)" aria-hidden="true"></span>
35265
+ <span class="ub-col__label">{{ col.label }}</span>
35266
+ <span class="ub-col__count" aria-hidden="true">{{ col.items.length }}</span>
35267
+ </div>
35268
+ @if (col.summary) {
35269
+ <div class="ub-col__summary" [attr.aria-label]="col.summaryLabel || col.summary">{{ col.summary }}</div>
35270
+ }
35271
+ </div>
35272
+ <div class="ub-col__cards" role="list">
35273
+ @for (item of col.items; track itemKey()(item)) {
35274
+ <div class="ub-card"
35275
+ [class.ub-card--success]="col.tone === 'success'"
35276
+ [class.ub-card--dragging]="draggingKey() === itemKey()(item)"
35277
+ role="listitem"
35278
+ tabindex="0"
35279
+ [attr.data-board-key]="itemKey()(item)"
35280
+ [attr.aria-label]="itemLabel()(item)"
35281
+ [attr.aria-keyshortcuts]="canMoveAny() ? 'Shift+ArrowLeft Shift+ArrowRight' : null"
35282
+ [attr.draggable]="canDrag() ? 'true' : null"
35283
+ (dragstart)="onDragStart($event, item, col)"
35284
+ (dragend)="onDragEnd()"
35285
+ (click)="cardClick.emit(item)"
35286
+ (keydown)="onCardKey($event, item, col)">
35287
+ @if (card(); as tpl) {
35288
+ <ng-container [ngTemplateOutlet]="tpl.template" [ngTemplateOutletContext]="{ $implicit: item, column: col, menu: menuTpl }" />
35289
+ }
35290
+ </div>
35291
+ }
35292
+ @if (col.items.length === 0) {
35293
+ <div class="ub-col__empty" role="status">{{ col.emptyText || emptyColumnText() }}</div>
35294
+ }
35295
+ </div>
35296
+ </div>
35297
+ }
35298
+ </div>
35299
+ <div class="ub-sr-only" role="status" aria-live="polite">{{ announcement() }}</div>
35300
+ }
35301
+ </div>
35302
+ `,
35303
+ isInline: true,
35304
+ styles: ["ui-board{display:flex;flex-direction:column;flex:1;min-height:0}.ub-wrap{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column}.ub-board{display:flex;gap:12px;padding:0 0 16px;overflow-x:auto;overflow-y:hidden;height:100%;align-items:flex-start}.ub-board::-webkit-scrollbar{height:6px}.ub-board::-webkit-scrollbar-track{background:#f1f5f9;border-radius:3px}.ub-board::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}.ub-col{flex:0 0 280px;min-width:280px;max-width:280px;display:flex;flex-direction:column;background:#f8fafc;border:1.5px solid #e2e8f0;border-radius:10px;max-height:calc(100vh - 200px);transition:border-color .15s,background .15s}.ub-col--over{border-color:#3b82f6;background:#eff6ff}.ub-col--success{background:#f0fdf4;border-color:#bbf7d0}.ub-col--success.ub-col--over{border-color:#22c55e;background:#dcfce7}.ub-col__header{padding:12px 14px 10px;border-bottom:1px solid #e2e8f0;flex-shrink:0}.ub-col__title{display:flex;align-items:center;gap:7px;margin-bottom:2px}.ub-col__dot{width:9px;height:9px;border-radius:50%;flex-shrink:0}.ub-col__label{font-size:12px;font-weight:700;color:#374151;text-transform:uppercase;letter-spacing:.04em;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ub-col__count{font-size:11px;font-weight:600;color:#fff;background:#94a3b8;border-radius:10px;padding:1px 7px;flex-shrink:0}.ub-col__summary{font-size:11px;color:#64748b;font-weight:500;margin-top:2px}.ub-col__cards{flex:1;overflow-y:auto;padding:10px;display:flex;flex-direction:column;gap:8px;min-height:60px}.ub-col__cards::-webkit-scrollbar{width:4px}.ub-col__cards::-webkit-scrollbar-track{background:transparent}.ub-col__cards::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:2px}.ub-col__empty{text-align:center;padding:24px 12px;color:#94a3b8;font-size:12px;border:1.5px dashed #e2e8f0;border-radius:8px;margin:4px 0}.ub-card{position:relative;background:#fff;border:1.5px solid #e2e8f0;border-radius:8px;padding:11px 12px;cursor:pointer;-webkit-user-select:none;user-select:none;transition:box-shadow .12s,border-color .12s,opacity .12s,transform .12s}.ub-card[draggable=true]{cursor:grab}.ub-card[draggable=true]:active{cursor:grabbing}.ub-card:hover{border-color:#94a3b8;box-shadow:0 2px 8px #00000012}.ub-card:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.ub-card--dragging{opacity:.4;transform:scale(.98);box-shadow:none}.ub-card--success{border-left:3px solid #22c55e}.ub-card__top{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;margin-bottom:4px}.ub-card__title{font-size:13px;font-weight:600;color:#1e293b;line-height:1.35;flex:1;min-width:0;word-break:break-word}.ub-card:hover .ub-card__title{color:#2563eb}.ub-card__top-right{flex-shrink:0;margin-top:-2px}.ub-card__status-row{margin-bottom:5px}.ub-card__contact{font-size:12px;color:#475569;margin-bottom:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ub-card__property{font-size:11px;color:#94a3b8;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ub-card__next-step{display:flex;align-items:flex-start;gap:4px;font-size:11px;color:#64748b;margin-bottom:6px;line-height:1.4}.ub-card__next-step svg{flex-shrink:0;margin-top:1px;color:#94a3b8}.ub-card__footer{display:flex;align-items:center;justify-content:space-between;margin-top:6px;padding-top:6px;border-top:1px solid #f1f5f9}.ub-card__value{font-size:12px;font-weight:700;color:#0f172a}.ub-card__activity{font-size:11px;color:#94a3b8}.ub-card__activity--stale{color:#d97706;font-weight:600}.ub-skeleton{display:flex;gap:12px;padding-bottom:16px}.ub-col-skeleton{flex:0 0 280px;background:#f8fafc;border:1.5px solid #e2e8f0;border-radius:10px;padding:12px;display:flex;flex-direction:column;gap:10px}.ub-col-skeleton__header,.ub-col-skeleton__card{background:linear-gradient(90deg,#e2e8f0 25%,#f1f5f9,#e2e8f0 75%);background-size:200% 100%;animation:ub-shimmer 1.4s infinite}.ub-col-skeleton__header{height:32px;border-radius:6px}.ub-col-skeleton__card{height:90px;border-radius:8px}@keyframes ub-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media(prefers-reduced-motion:reduce){.ub-col-skeleton__header,.ub-col-skeleton__card{animation:none}}.ub-message{display:flex;flex-direction:column;align-items:center;gap:12px;padding:48px;color:#64748b;font-size:14px;text-align:center}.ub-message p{margin:0}.ub-sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}@media(max-width:640px){.ub-board{flex-direction:column;overflow-x:hidden;overflow-y:auto;height:auto;align-items:stretch}.ub-col{flex:none;min-width:0;max-width:100%;width:100%;max-height:none}.ub-skeleton{flex-direction:column}.ub-col-skeleton{flex:none;width:100%}}\n"],
35305
+ dependencies: [
35306
+ {
35307
+ kind: "directive",
35308
+ type: NgTemplateOutlet,
35309
+ selector: "[ngTemplateOutlet]",
35310
+ inputs: [
35311
+ "ngTemplateOutletContext",
35312
+ "ngTemplateOutlet",
35313
+ "ngTemplateOutletInjector"
35314
+ ]
35315
+ },
35316
+ {
35317
+ kind: "component",
35318
+ type: ButtonComponent,
35319
+ selector: "ui-button",
35320
+ inputs: [
35321
+ "variant",
35322
+ "routerLink",
35323
+ "queryParams",
35324
+ "fragment",
35325
+ "state",
35326
+ "href",
35327
+ "target",
35328
+ "rel",
35329
+ "shortLabel",
35330
+ "shortBelow",
35331
+ "color",
35332
+ "active",
35333
+ "size",
35334
+ "type",
35335
+ "disabled",
35336
+ "loading",
35337
+ "fullWidth",
35338
+ "ariaLabel",
35339
+ "ariaExpanded",
35340
+ "ariaPressed",
35341
+ "ariaDescribedBy",
35342
+ "modal-footer-left",
35343
+ "modal-footer-right"
35344
+ ]
35345
+ },
35346
+ {
35347
+ kind: "component",
35348
+ type: MoreMenuComponent,
35349
+ selector: "ui-more-menu",
35350
+ inputs: ["ariaLabel", "actions"],
35351
+ outputs: ["actionClick"]
35352
+ }
35353
+ ],
35354
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
35355
+ encapsulation: i0.ViewEncapsulation.None
35356
+ });
35357
+ }
35358
+ };
35359
+ i0.ɵɵngDeclareClassMetadata({
35360
+ minVersion: "12.0.0",
35361
+ version: "22.2.2",
35362
+ ngImport: i0,
35363
+ type: BoardComponent,
35364
+ decorators: [{
35365
+ type: Component,
35366
+ args: [{
35367
+ selector: "ui-board",
35368
+ standalone: true,
35369
+ changeDetection: ChangeDetectionStrategy.OnPush,
35370
+ encapsulation: ViewEncapsulation.None,
35371
+ imports: [
35372
+ NgTemplateOutlet,
35373
+ ButtonComponent,
35374
+ MoreMenuComponent
35375
+ ],
35376
+ template: `
35377
+ <!-- The card's "⋮" menu. Place it in the card's top row: <ng-container [ngTemplateOutlet]="menu" [ngTemplateOutletContext]="{ $implicit: item }" /> -->
35378
+ <ng-template #menuTpl let-item>
35379
+ @if (cardActions().length) {
35380
+ <div class="ub-card__top-right" (click)="$event.stopPropagation()" (keydown)="$event.stopPropagation()">
35381
+ <ui-more-menu [actions]="cardActions()" [ariaLabel]="'Actions for ' + itemLabel()(item)"
35382
+ (actionClick)="cardAction.emit({ type: $event, item })" />
35383
+ </div>
35384
+ }
35385
+ </ng-template>
35386
+ <div class="ub-wrap">
35387
+ @if (loading()) {
35388
+ <div class="ub-skeleton" role="status" [attr.aria-label]="'Loading ' + ariaLabel()">
35389
+ @for (n of skeletonColumns(); track n) {
35390
+ <div class="ub-col-skeleton" aria-hidden="true">
35391
+ <div class="ub-col-skeleton__header"></div>
35392
+ @for (c of [1, 2, 3]; track c) { <div class="ub-col-skeleton__card"></div> }
35393
+ </div>
35394
+ }
35395
+ </div>
35396
+ } @else if (error()) {
35397
+ <div class="ub-message" role="alert">
35398
+ <p>{{ error() }}</p>
35399
+ <ui-button variant="secondary" size="sm" (click)="retry.emit()">{{ retryLabel() }}</ui-button>
35400
+ </div>
35401
+ } @else if (cols().length === 0) {
35402
+ <div class="ub-message" role="status"><p>{{ emptyMessage() }}</p></div>
35403
+ } @else {
35404
+ <div class="ub-board" role="region" [attr.aria-label]="ariaLabel()">
35405
+ @for (col of cols(); track col.key) {
35406
+ <div class="ub-col"
35407
+ [class.ub-col--over]="overKey() === col.key"
35408
+ [class.ub-col--success]="col.tone === 'success'"
35409
+ role="group"
35410
+ [attr.aria-label]="col.label + ' — ' + col.items.length + ' ' + (col.items.length === 1 ? itemNoun() : itemNounPlural())"
35411
+ (dragover)="onDragOver($event, col)"
35412
+ (dragleave)="onDragLeave($event, col)"
35413
+ (drop)="onDrop($event, col)">
35414
+ <div class="ub-col__header">
35415
+ <div class="ub-col__title">
35416
+ <span class="ub-col__dot" [style.background]="dot(col.color)" aria-hidden="true"></span>
35417
+ <span class="ub-col__label">{{ col.label }}</span>
35418
+ <span class="ub-col__count" aria-hidden="true">{{ col.items.length }}</span>
35419
+ </div>
35420
+ @if (col.summary) {
35421
+ <div class="ub-col__summary" [attr.aria-label]="col.summaryLabel || col.summary">{{ col.summary }}</div>
35422
+ }
35423
+ </div>
35424
+ <div class="ub-col__cards" role="list">
35425
+ @for (item of col.items; track itemKey()(item)) {
35426
+ <div class="ub-card"
35427
+ [class.ub-card--success]="col.tone === 'success'"
35428
+ [class.ub-card--dragging]="draggingKey() === itemKey()(item)"
35429
+ role="listitem"
35430
+ tabindex="0"
35431
+ [attr.data-board-key]="itemKey()(item)"
35432
+ [attr.aria-label]="itemLabel()(item)"
35433
+ [attr.aria-keyshortcuts]="canMoveAny() ? 'Shift+ArrowLeft Shift+ArrowRight' : null"
35434
+ [attr.draggable]="canDrag() ? 'true' : null"
35435
+ (dragstart)="onDragStart($event, item, col)"
35436
+ (dragend)="onDragEnd()"
35437
+ (click)="cardClick.emit(item)"
35438
+ (keydown)="onCardKey($event, item, col)">
35439
+ @if (card(); as tpl) {
35440
+ <ng-container [ngTemplateOutlet]="tpl.template" [ngTemplateOutletContext]="{ $implicit: item, column: col, menu: menuTpl }" />
35441
+ }
35442
+ </div>
35443
+ }
35444
+ @if (col.items.length === 0) {
35445
+ <div class="ub-col__empty" role="status">{{ col.emptyText || emptyColumnText() }}</div>
35446
+ }
35447
+ </div>
35448
+ </div>
35449
+ }
35450
+ </div>
35451
+ <div class="ub-sr-only" role="status" aria-live="polite">{{ announcement() }}</div>
35452
+ }
35453
+ </div>
35454
+ `,
35455
+ styles: ["ui-board{display:flex;flex-direction:column;flex:1;min-height:0}.ub-wrap{flex:1;min-height:0;overflow:hidden;display:flex;flex-direction:column}.ub-board{display:flex;gap:12px;padding:0 0 16px;overflow-x:auto;overflow-y:hidden;height:100%;align-items:flex-start}.ub-board::-webkit-scrollbar{height:6px}.ub-board::-webkit-scrollbar-track{background:#f1f5f9;border-radius:3px}.ub-board::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}.ub-col{flex:0 0 280px;min-width:280px;max-width:280px;display:flex;flex-direction:column;background:#f8fafc;border:1.5px solid #e2e8f0;border-radius:10px;max-height:calc(100vh - 200px);transition:border-color .15s,background .15s}.ub-col--over{border-color:#3b82f6;background:#eff6ff}.ub-col--success{background:#f0fdf4;border-color:#bbf7d0}.ub-col--success.ub-col--over{border-color:#22c55e;background:#dcfce7}.ub-col__header{padding:12px 14px 10px;border-bottom:1px solid #e2e8f0;flex-shrink:0}.ub-col__title{display:flex;align-items:center;gap:7px;margin-bottom:2px}.ub-col__dot{width:9px;height:9px;border-radius:50%;flex-shrink:0}.ub-col__label{font-size:12px;font-weight:700;color:#374151;text-transform:uppercase;letter-spacing:.04em;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ub-col__count{font-size:11px;font-weight:600;color:#fff;background:#94a3b8;border-radius:10px;padding:1px 7px;flex-shrink:0}.ub-col__summary{font-size:11px;color:#64748b;font-weight:500;margin-top:2px}.ub-col__cards{flex:1;overflow-y:auto;padding:10px;display:flex;flex-direction:column;gap:8px;min-height:60px}.ub-col__cards::-webkit-scrollbar{width:4px}.ub-col__cards::-webkit-scrollbar-track{background:transparent}.ub-col__cards::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:2px}.ub-col__empty{text-align:center;padding:24px 12px;color:#94a3b8;font-size:12px;border:1.5px dashed #e2e8f0;border-radius:8px;margin:4px 0}.ub-card{position:relative;background:#fff;border:1.5px solid #e2e8f0;border-radius:8px;padding:11px 12px;cursor:pointer;-webkit-user-select:none;user-select:none;transition:box-shadow .12s,border-color .12s,opacity .12s,transform .12s}.ub-card[draggable=true]{cursor:grab}.ub-card[draggable=true]:active{cursor:grabbing}.ub-card:hover{border-color:#94a3b8;box-shadow:0 2px 8px #00000012}.ub-card:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.ub-card--dragging{opacity:.4;transform:scale(.98);box-shadow:none}.ub-card--success{border-left:3px solid #22c55e}.ub-card__top{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;margin-bottom:4px}.ub-card__title{font-size:13px;font-weight:600;color:#1e293b;line-height:1.35;flex:1;min-width:0;word-break:break-word}.ub-card:hover .ub-card__title{color:#2563eb}.ub-card__top-right{flex-shrink:0;margin-top:-2px}.ub-card__status-row{margin-bottom:5px}.ub-card__contact{font-size:12px;color:#475569;margin-bottom:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ub-card__property{font-size:11px;color:#94a3b8;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ub-card__next-step{display:flex;align-items:flex-start;gap:4px;font-size:11px;color:#64748b;margin-bottom:6px;line-height:1.4}.ub-card__next-step svg{flex-shrink:0;margin-top:1px;color:#94a3b8}.ub-card__footer{display:flex;align-items:center;justify-content:space-between;margin-top:6px;padding-top:6px;border-top:1px solid #f1f5f9}.ub-card__value{font-size:12px;font-weight:700;color:#0f172a}.ub-card__activity{font-size:11px;color:#94a3b8}.ub-card__activity--stale{color:#d97706;font-weight:600}.ub-skeleton{display:flex;gap:12px;padding-bottom:16px}.ub-col-skeleton{flex:0 0 280px;background:#f8fafc;border:1.5px solid #e2e8f0;border-radius:10px;padding:12px;display:flex;flex-direction:column;gap:10px}.ub-col-skeleton__header,.ub-col-skeleton__card{background:linear-gradient(90deg,#e2e8f0 25%,#f1f5f9,#e2e8f0 75%);background-size:200% 100%;animation:ub-shimmer 1.4s infinite}.ub-col-skeleton__header{height:32px;border-radius:6px}.ub-col-skeleton__card{height:90px;border-radius:8px}@keyframes ub-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media(prefers-reduced-motion:reduce){.ub-col-skeleton__header,.ub-col-skeleton__card{animation:none}}.ub-message{display:flex;flex-direction:column;align-items:center;gap:12px;padding:48px;color:#64748b;font-size:14px;text-align:center}.ub-message p{margin:0}.ub-sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}@media(max-width:640px){.ub-board{flex-direction:column;overflow-x:hidden;overflow-y:auto;height:auto;align-items:stretch}.ub-col{flex:none;min-width:0;max-width:100%;width:100%;max-height:none}.ub-skeleton{flex-direction:column}.ub-col-skeleton{flex:none;width:100%}}\n"]
35456
+ }]
35457
+ }],
35458
+ propDecorators: {
35459
+ columns: [{
35460
+ type: i0.Input,
35461
+ args: [{
35462
+ isSignal: true,
35463
+ alias: "columns",
35464
+ required: true
35465
+ }]
35466
+ }],
35467
+ itemKey: [{
35468
+ type: i0.Input,
35469
+ args: [{
35470
+ isSignal: true,
35471
+ alias: "itemKey",
35472
+ required: true
35473
+ }]
35474
+ }],
35475
+ itemLabel: [{
35476
+ type: i0.Input,
35477
+ args: [{
35478
+ isSignal: true,
35479
+ alias: "itemLabel",
35480
+ required: true
35481
+ }]
35482
+ }],
35483
+ cardActions: [{
35484
+ type: i0.Input,
35485
+ args: [{
35486
+ isSignal: true,
35487
+ alias: "cardActions",
35488
+ required: false
35489
+ }]
35490
+ }],
35491
+ loading: [{
35492
+ type: i0.Input,
35493
+ args: [{
35494
+ isSignal: true,
35495
+ alias: "loading",
35496
+ required: false
35497
+ }]
35498
+ }],
35499
+ error: [{
35500
+ type: i0.Input,
35501
+ args: [{
35502
+ isSignal: true,
35503
+ alias: "error",
35504
+ required: false
35505
+ }]
35506
+ }],
35507
+ readOnly: [{
35508
+ type: i0.Input,
35509
+ args: [{
35510
+ isSignal: true,
35511
+ alias: "readOnly",
35512
+ required: false
35513
+ }]
35514
+ }],
35515
+ moveDisabled: [{
35516
+ type: i0.Input,
35517
+ args: [{
35518
+ isSignal: true,
35519
+ alias: "moveDisabled",
35520
+ required: false
35521
+ }]
35522
+ }],
35523
+ canMove: [{
35524
+ type: i0.Input,
35525
+ args: [{
35526
+ isSignal: true,
35527
+ alias: "canMove",
35528
+ required: false
35529
+ }]
35530
+ }],
35531
+ ariaLabel: [{
35532
+ type: i0.Input,
35533
+ args: [{
35534
+ isSignal: true,
35535
+ alias: "ariaLabel",
35536
+ required: false
35537
+ }]
35538
+ }],
35539
+ emptyMessage: [{
35540
+ type: i0.Input,
35541
+ args: [{
35542
+ isSignal: true,
35543
+ alias: "emptyMessage",
35544
+ required: false
35545
+ }]
35546
+ }],
35547
+ emptyColumnText: [{
35548
+ type: i0.Input,
35549
+ args: [{
35550
+ isSignal: true,
35551
+ alias: "emptyColumnText",
35552
+ required: false
35553
+ }]
35554
+ }],
35555
+ itemNoun: [{
35556
+ type: i0.Input,
35557
+ args: [{
35558
+ isSignal: true,
35559
+ alias: "itemNoun",
35560
+ required: false
35561
+ }]
35562
+ }],
35563
+ itemNounPlural: [{
35564
+ type: i0.Input,
35565
+ args: [{
35566
+ isSignal: true,
35567
+ alias: "itemNounPlural",
35568
+ required: false
35569
+ }]
35570
+ }],
35571
+ retryLabel: [{
35572
+ type: i0.Input,
35573
+ args: [{
35574
+ isSignal: true,
35575
+ alias: "retryLabel",
35576
+ required: false
35577
+ }]
35578
+ }],
35579
+ cardClick: [{
35580
+ type: i0.Output,
35581
+ args: ["cardClick"]
35582
+ }],
35583
+ cardAction: [{
35584
+ type: i0.Output,
35585
+ args: ["cardAction"]
35586
+ }],
35587
+ itemMove: [{
35588
+ type: i0.Output,
35589
+ args: ["itemMove"]
35590
+ }],
35591
+ retry: [{
35592
+ type: i0.Output,
35593
+ args: ["retry"]
35594
+ }],
35595
+ card: [{
35596
+ type: i0.ContentChild,
35597
+ args: [i0.forwardRef(() => BoardCardDirective), { isSignal: true }]
35598
+ }]
35599
+ }
35600
+ });
33954
35601
  let nextId = 0;
33955
35602
  var ReadonlyFieldsetComponent = class ReadonlyFieldsetComponent {
33956
35603
  constructor() {
@@ -37781,6 +39428,6 @@ i0.ɵɵngDeclareClassMetadata({
37781
39428
  }]
37782
39429
  }
37783
39430
  });
37784
- export { ActionBarComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BarRowComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, CalendarComponent, CheckboxComponent, CheckboxTrailingDirective, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, DEFAULT_PASSWORD_RULES, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DropdownComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FadeComponent, FileInputComponent, FormColSpanDirective, FormComponent, FormRowComponent, FormSectionComponent, HintComponent, IconComponent, ImageComponent, ImageGalleryComponent, ImageGalleryDialogComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, KpiCardComponent, LAYOUT_GAP_PX, ListComponent, ListItemComponent, LiveRegionComponent, ModalComponent, MoreMenuComponent, MultiSelectComponent, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PageComponent, PaginationComponent, PanelInfoListComponent, PasswordRequirementsComponent, PdfHotspotComponent, PhoneNumberPickerComponent, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, RadioOptionContentDirective, ReadonlyFieldsetComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SearchInputComponent, SectionHeaderComponent, SelectComponent, ShowComponent, SidePanelComponent, SignaturePadComponent, SkeletonComponent, StackComponent, StarComponent, StepperComponent, TableToolbarComponent, TextComponent, TextInputComponent, TextareaInputComponent, TimeInputComponent, TimelineComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_STATES, UiFieldValidity, acceptLabel, appShellGroupsStorageKey, autoVariant, buildDefaultSchedule, builtInActionIcon, businessTimeOptions, createFieldReveal, decodeFilterValues, digitsOnly, downloadBlob, encodeFilterValue, encodeFilterValues, errorContextInterceptor, fileMatchesAccept, formatAddress, formatCurrency, formatFileSize, formatIsoDate, formatIsoDateTime, formatTime, getEligibleIds, getEligibleOptions, getErrorMessage, humanReadableMessage, iconPath, isoKey, issueToErrors, maxLengthIssue, normalizeHexColor, parseBizHours, parseIso, parseTime, passwordMeetsRules, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, serializeBizHours };
39431
+ export { ActionBarComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BarRowComponent, BoardCardDirective, BoardComponent, BulkMessagePanelComponent, BusinessHoursComponent, ButtonComponent, CalendarComponent, CardListItemComponent, CheckboxComponent, CheckboxTrailingDirective, ChipComponent, ChipGroupComponent, ColorInputComponent, ColumnFilterComponent, ColumnsComponent, ComboboxComponent, ConfirmOutletComponent, ConfirmService, ContactPickerComponent, DEFAULT_PASSWORD_RULES, DROPDOWN_GROUP, DataTableComponent, DateInputComponent, DateRangePickerComponent, DatetimeInputComponent, DetailCardComponent, DiscountSelectorComponent, DividerComponent, DropdownComponent, EmptyStateComponent, ErrorComponent, ErrorStateComponent, FORGEROUTE_CONFIG, FadeComponent, FileInputComponent, FormColSpanDirective, FormComponent, FormRowComponent, FormSectionComponent, HintComponent, IconComponent, ImageComponent, ImageGalleryComponent, ImageGalleryDialogComponent, ImagePreviewComponent, ImageRepositionComponent, ImportExportComponent, KpiCardComponent, LAYOUT_GAP_PX, ListComponent, ListItemComponent, LiveRegionComponent, ModalComponent, MoreMenuComponent, MultiSelectComponent, NotesComponent, PHONE_NUMBER_AREA_CODE_LENGTH, PHONE_NUMBER_ZIP_LENGTH, PageComponent, PaginationComponent, PanelInfoListComponent, PasswordRequirementsComponent, PdfHotspotComponent, PhoneNumberPickerComponent, PillTabsComponent, ProgressBarComponent, ProgressRingComponent, QrCodeComponent, QuickFilterTabsComponent, RICH_TEXT_OPTIONS, RadioComponent, RadioGroupComponent, RadioMatrixComponent, RadioOptionContentDirective, ReadonlyFieldsetComponent, RichTextEditorComponent, SEMANTIC_BADGE_MAP, SearchInputComponent, SectionHeaderComponent, SelectComponent, ShowComponent, SidePanelComponent, SignaturePadComponent, SkeletonComponent, StackComponent, StarComponent, StepperComponent, TableToolbarComponent, TextComponent, TextInputComponent, TextareaInputComponent, TimeInputComponent, TimelineComponent, ToastComponent, ToastService, ToggleBadgeComponent, ToggleComponent, TooltipDirective, US_STATES, UiFieldValidity, acceptLabel, appShellGroupsStorageKey, autoVariant, buildDefaultSchedule, builtInActionIcon, businessTimeOptions, createFieldReveal, decodeFilterValues, digitsOnly, downloadBlob, encodeFilterValue, encodeFilterValues, errorContextInterceptor, fileMatchesAccept, formatAddress, formatCurrency, formatFileSize, formatIsoDate, formatIsoDateTime, formatTime, getEligibleIds, getEligibleOptions, getErrorMessage, humanReadableMessage, iconPath, isoKey, issueToErrors, maxLengthIssue, normalizeHexColor, parseBizHours, parseIso, parseTime, passwordMeetsRules, pluralize, provideForgerouteToast, reorderItems, requiredIssue, resolveLayoutGap, resolvePreset, serializeBizHours };
37785
39432
 
37786
39433
  //# sourceMappingURL=forgeroute-ui.mjs.map