@forgeroute/ui 0.4.20 → 0.4.22

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"]
@@ -1472,9 +1494,33 @@ var AvatarComponent = class AvatarComponent {
1472
1494
  this.initials = input.required(...ngDevMode ? [{ debugName: "initials" }] : /* istanbul ignore next */ []);
1473
1495
  this.name = input("", ...ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []);
1474
1496
  this.size = input(32, ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
1497
+ this.imageUrl = input(void 0, ...ngDevMode ? [{ debugName: "imageUrl" }] : /* istanbul ignore next */ []);
1498
+ this.editable = input(false, ...ngDevMode ? [{ debugName: "editable" }] : /* istanbul ignore next */ []);
1499
+ this.editLabel = input("Change photo", ...ngDevMode ? [{ debugName: "editLabel" }] : /* istanbul ignore next */ []);
1500
+ this.busy = input(false, ...ngDevMode ? [{ debugName: "busy" }] : /* istanbul ignore next */ []);
1501
+ this.editClick = output();
1502
+ this.imageError = output();
1503
+ this.failedUrl = signal(null, ...ngDevMode ? [{ debugName: "failedUrl" }] : /* istanbul ignore next */ []);
1504
+ this.showImage = computed(() => {
1505
+ const url = this.imageUrl();
1506
+ return !!url && this.failedUrl() !== url;
1507
+ }, ...ngDevMode ? [{ debugName: "showImage" }] : /* istanbul ignore next */ []);
1508
+ this.badgeSize = computed(() => Math.max(18, Math.round(this.size() * .3)), ...ngDevMode ? [{ debugName: "badgeSize" }] : /* istanbul ignore next */ []);
1475
1509
  this.bg = computed(() => BG_PALETTE[colorIndex(this.initials())], ...ngDevMode ? [{ debugName: "bg" }] : /* istanbul ignore next */ []);
1476
1510
  this.color = computed(() => COLOR_PALETTE[colorIndex(this.initials())], ...ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []);
1477
1511
  }
1512
+ onImageError() {
1513
+ this.failedUrl.set(this.imageUrl() ?? null);
1514
+ this.imageError.emit();
1515
+ }
1516
+ onEdit() {
1517
+ if (this.busy()) return;
1518
+ this.editClick.emit();
1519
+ }
1520
+ onKey(event) {
1521
+ event.preventDefault();
1522
+ this.onEdit();
1523
+ }
1478
1524
  static {
1479
1525
  this.ɵfac = i0.ɵɵngDeclareFactory({
1480
1526
  minVersion: "12.0.0",
@@ -1487,7 +1533,7 @@ var AvatarComponent = class AvatarComponent {
1487
1533
  }
1488
1534
  static {
1489
1535
  this.ɵcmp = i0.ɵɵngDeclareComponent({
1490
- minVersion: "17.1.0",
1536
+ minVersion: "17.0.0",
1491
1537
  version: "22.2.2",
1492
1538
  type: AvatarComponent,
1493
1539
  isStandalone: true,
@@ -1513,24 +1559,91 @@ var AvatarComponent = class AvatarComponent {
1513
1559
  isSignal: true,
1514
1560
  isRequired: false,
1515
1561
  transformFunction: null
1562
+ },
1563
+ imageUrl: {
1564
+ classPropertyName: "imageUrl",
1565
+ publicName: "imageUrl",
1566
+ isSignal: true,
1567
+ isRequired: false,
1568
+ transformFunction: null
1569
+ },
1570
+ editable: {
1571
+ classPropertyName: "editable",
1572
+ publicName: "editable",
1573
+ isSignal: true,
1574
+ isRequired: false,
1575
+ transformFunction: null
1576
+ },
1577
+ editLabel: {
1578
+ classPropertyName: "editLabel",
1579
+ publicName: "editLabel",
1580
+ isSignal: true,
1581
+ isRequired: false,
1582
+ transformFunction: null
1583
+ },
1584
+ busy: {
1585
+ classPropertyName: "busy",
1586
+ publicName: "busy",
1587
+ isSignal: true,
1588
+ isRequired: false,
1589
+ transformFunction: null
1516
1590
  }
1517
1591
  },
1592
+ outputs: {
1593
+ editClick: "editClick",
1594
+ imageError: "imageError"
1595
+ },
1518
1596
  ngImport: i0,
1519
1597
  template: `
1520
- <span
1521
- class="avatar"
1522
- role="img"
1523
- [style.width.px]="size()"
1524
- [style.height.px]="size()"
1525
- [style.font-size.px]="size() * 0.38"
1526
- [style.background]="bg()"
1527
- [style.color]="color()"
1528
- [attr.aria-label]="name() || initials()">
1529
- {{ initials() }}
1530
- </span>
1598
+ @if (editable()) {
1599
+ <span class="av-edit" role="button" [attr.tabindex]="busy() ? -1 : 0" [attr.aria-label]="editLabel()" [attr.title]="editLabel()"
1600
+ [attr.aria-busy]="busy() ? 'true' : null" [attr.aria-disabled]="busy() ? 'true' : null" [class.av-busy]="busy()"
1601
+ [style.width.px]="size()" [style.height.px]="size()"
1602
+ (click)="onEdit()" (keydown.enter)="onKey($event)" (keydown.space)="onKey($event)">
1603
+ <ng-container [ngTemplateOutlet]="face" />
1604
+ <span class="av-badge" aria-hidden="true" [style.width.px]="badgeSize()" [style.height.px]="badgeSize()">
1605
+ @if (busy()) {
1606
+ <span class="av-spinner" [style.width.px]="badgeSize() * 0.6" [style.height.px]="badgeSize() * 0.6"></span>
1607
+ } @else {
1608
+ <svg [attr.width]="badgeSize() * 0.6" [attr.height]="badgeSize() * 0.6" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"/><circle cx="12" cy="13" r="4"/></svg>
1609
+ }
1610
+ </span>
1611
+ </span>
1612
+ } @else {
1613
+ <ng-container [ngTemplateOutlet]="face" />
1614
+ }
1615
+ <ng-template #face>
1616
+ @if (showImage()) {
1617
+ <img class="avatar avatar-img" [src]="imageUrl()" [attr.alt]="editable() ? '' : (name() || initials())"
1618
+ [style.width.px]="size()" [style.height.px]="size()" (error)="onImageError()" />
1619
+ } @else {
1620
+ <span
1621
+ class="avatar"
1622
+ [attr.role]="editable() ? null : 'img'"
1623
+ [attr.aria-hidden]="editable() ? 'true' : null"
1624
+ [style.width.px]="size()"
1625
+ [style.height.px]="size()"
1626
+ [style.font-size.px]="size() * 0.38"
1627
+ [style.background]="bg()"
1628
+ [style.color]="color()"
1629
+ [attr.aria-label]="editable() ? null : (name() || initials())">
1630
+ {{ initials() }}
1631
+ </span>
1632
+ }
1633
+ </ng-template>
1531
1634
  `,
1532
1635
  isInline: true,
1533
- styles: [":host{display:inline-flex;flex-shrink:0}.avatar{border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:600;text-transform:uppercase;letter-spacing:.02em;-webkit-user-select:none;user-select:none;flex-shrink:0}\n"],
1636
+ styles: [":host{display:inline-flex;flex-shrink:0}.avatar{border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:600;text-transform:uppercase;letter-spacing:.02em;-webkit-user-select:none;user-select:none;flex-shrink:0}.avatar-img{display:block;object-fit:cover}.av-edit{position:relative;display:inline-flex;flex-shrink:0;border-radius:50%;cursor:pointer}.av-edit:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.av-edit.av-busy{cursor:progress}.av-edit.av-busy .avatar{opacity:.55}.av-badge{position:absolute;right:-2px;bottom:-2px;box-sizing:border-box;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#fff;color:#475569;border:1px solid #cbd5e1;box-shadow:0 1px 2px #0f172a1f}@media(hover:hover){.av-edit:hover:not(.av-busy) .av-badge{color:#0f172a;border-color:#94a3b8}}.av-spinner{display:block;box-sizing:border-box;border:2px solid rgba(100,116,139,.3);border-top-color:currentColor;border-radius:50%;animation:av-spin .6s linear infinite}@keyframes av-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.av-spinner{animation-duration:2s}}@media(pointer:coarse){.av-edit:after{content:\"\";position:absolute;inset:-6px}}\n"],
1637
+ dependencies: [{
1638
+ kind: "directive",
1639
+ type: NgTemplateOutlet,
1640
+ selector: "[ngTemplateOutlet]",
1641
+ inputs: [
1642
+ "ngTemplateOutletContext",
1643
+ "ngTemplateOutlet",
1644
+ "ngTemplateOutletInjector"
1645
+ ]
1646
+ }],
1534
1647
  changeDetection: i0.ChangeDetectionStrategy.OnPush
1535
1648
  });
1536
1649
  }
@@ -1545,21 +1658,47 @@ i0.ɵɵngDeclareClassMetadata({
1545
1658
  args: [{
1546
1659
  selector: "ui-avatar",
1547
1660
  standalone: true,
1661
+ imports: [NgTemplateOutlet],
1548
1662
  changeDetection: ChangeDetectionStrategy.OnPush,
1549
1663
  template: `
1550
- <span
1551
- class="avatar"
1552
- role="img"
1553
- [style.width.px]="size()"
1554
- [style.height.px]="size()"
1555
- [style.font-size.px]="size() * 0.38"
1556
- [style.background]="bg()"
1557
- [style.color]="color()"
1558
- [attr.aria-label]="name() || initials()">
1559
- {{ initials() }}
1560
- </span>
1664
+ @if (editable()) {
1665
+ <span class="av-edit" role="button" [attr.tabindex]="busy() ? -1 : 0" [attr.aria-label]="editLabel()" [attr.title]="editLabel()"
1666
+ [attr.aria-busy]="busy() ? 'true' : null" [attr.aria-disabled]="busy() ? 'true' : null" [class.av-busy]="busy()"
1667
+ [style.width.px]="size()" [style.height.px]="size()"
1668
+ (click)="onEdit()" (keydown.enter)="onKey($event)" (keydown.space)="onKey($event)">
1669
+ <ng-container [ngTemplateOutlet]="face" />
1670
+ <span class="av-badge" aria-hidden="true" [style.width.px]="badgeSize()" [style.height.px]="badgeSize()">
1671
+ @if (busy()) {
1672
+ <span class="av-spinner" [style.width.px]="badgeSize() * 0.6" [style.height.px]="badgeSize() * 0.6"></span>
1673
+ } @else {
1674
+ <svg [attr.width]="badgeSize() * 0.6" [attr.height]="badgeSize() * 0.6" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" focusable="false"><path d="M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z"/><circle cx="12" cy="13" r="4"/></svg>
1675
+ }
1676
+ </span>
1677
+ </span>
1678
+ } @else {
1679
+ <ng-container [ngTemplateOutlet]="face" />
1680
+ }
1681
+ <ng-template #face>
1682
+ @if (showImage()) {
1683
+ <img class="avatar avatar-img" [src]="imageUrl()" [attr.alt]="editable() ? '' : (name() || initials())"
1684
+ [style.width.px]="size()" [style.height.px]="size()" (error)="onImageError()" />
1685
+ } @else {
1686
+ <span
1687
+ class="avatar"
1688
+ [attr.role]="editable() ? null : 'img'"
1689
+ [attr.aria-hidden]="editable() ? 'true' : null"
1690
+ [style.width.px]="size()"
1691
+ [style.height.px]="size()"
1692
+ [style.font-size.px]="size() * 0.38"
1693
+ [style.background]="bg()"
1694
+ [style.color]="color()"
1695
+ [attr.aria-label]="editable() ? null : (name() || initials())">
1696
+ {{ initials() }}
1697
+ </span>
1698
+ }
1699
+ </ng-template>
1561
1700
  `,
1562
- styles: [":host{display:inline-flex;flex-shrink:0}.avatar{border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:600;text-transform:uppercase;letter-spacing:.02em;-webkit-user-select:none;user-select:none;flex-shrink:0}\n"]
1701
+ styles: [":host{display:inline-flex;flex-shrink:0}.avatar{border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:600;text-transform:uppercase;letter-spacing:.02em;-webkit-user-select:none;user-select:none;flex-shrink:0}.avatar-img{display:block;object-fit:cover}.av-edit{position:relative;display:inline-flex;flex-shrink:0;border-radius:50%;cursor:pointer}.av-edit:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.av-edit.av-busy{cursor:progress}.av-edit.av-busy .avatar{opacity:.55}.av-badge{position:absolute;right:-2px;bottom:-2px;box-sizing:border-box;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#fff;color:#475569;border:1px solid #cbd5e1;box-shadow:0 1px 2px #0f172a1f}@media(hover:hover){.av-edit:hover:not(.av-busy) .av-badge{color:#0f172a;border-color:#94a3b8}}.av-spinner{display:block;box-sizing:border-box;border:2px solid rgba(100,116,139,.3);border-top-color:currentColor;border-radius:50%;animation:av-spin .6s linear infinite}@keyframes av-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.av-spinner{animation-duration:2s}}@media(pointer:coarse){.av-edit:after{content:\"\";position:absolute;inset:-6px}}\n"]
1563
1702
  }]
1564
1703
  }],
1565
1704
  propDecorators: {
@@ -1586,6 +1725,46 @@ i0.ɵɵngDeclareClassMetadata({
1586
1725
  alias: "size",
1587
1726
  required: false
1588
1727
  }]
1728
+ }],
1729
+ imageUrl: [{
1730
+ type: i0.Input,
1731
+ args: [{
1732
+ isSignal: true,
1733
+ alias: "imageUrl",
1734
+ required: false
1735
+ }]
1736
+ }],
1737
+ editable: [{
1738
+ type: i0.Input,
1739
+ args: [{
1740
+ isSignal: true,
1741
+ alias: "editable",
1742
+ required: false
1743
+ }]
1744
+ }],
1745
+ editLabel: [{
1746
+ type: i0.Input,
1747
+ args: [{
1748
+ isSignal: true,
1749
+ alias: "editLabel",
1750
+ required: false
1751
+ }]
1752
+ }],
1753
+ busy: [{
1754
+ type: i0.Input,
1755
+ args: [{
1756
+ isSignal: true,
1757
+ alias: "busy",
1758
+ required: false
1759
+ }]
1760
+ }],
1761
+ editClick: [{
1762
+ type: i0.Output,
1763
+ args: ["editClick"]
1764
+ }],
1765
+ imageError: [{
1766
+ type: i0.Output,
1767
+ args: ["imageError"]
1589
1768
  }]
1590
1769
  }
1591
1770
  });
@@ -4316,6 +4495,9 @@ const EXTRA_ICONS = {
4316
4495
  "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
4496
  "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
4497
  "refund": "M3 10h10a8 8 0 0 1 8 8v2 M3 10l6 6 M3 10l6-6",
4498
+ "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",
4499
+ "chart": "M18 20V10 M12 20V4 M6 20v-6",
4500
+ "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
4501
  "bank": "M3 21h18 M3 10h18 M5 6l7-3 7 3 M4 10v11 M20 10v11 M8 14v3 M12 14v3 M16 14v3"
4320
4502
  };
4321
4503
  function iconPath(name) {
@@ -7333,7 +7515,7 @@ var SelectComponent = class SelectComponent {
7333
7515
  <option value="" [disabled]="true" [selected]="_value() === ''">{{ placeholder() }}</option>
7334
7516
  }
7335
7517
  @for (opt of options(); track opt.value; let i = $index) {
7336
- <option [value]="_key(opt)" [selected]="i === _selectedIndex()" [attr.title]="opt.description || null">{{ opt.badge ? opt.label + ' — ' + opt.badge : opt.label }}</option>
7518
+ <option [value]="_key(opt)" [selected]="i === _selectedIndex()" [disabled]="!!opt.disabled" [attr.title]="opt.description || null">{{ opt.badge ? opt.label + ' — ' + opt.badge : opt.label }}</option>
7337
7519
  }
7338
7520
  </select>
7339
7521
  <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>
@@ -7404,7 +7586,7 @@ i0.ɵɵngDeclareClassMetadata({
7404
7586
  <option value="" [disabled]="true" [selected]="_value() === ''">{{ placeholder() }}</option>
7405
7587
  }
7406
7588
  @for (opt of options(); track opt.value; let i = $index) {
7407
- <option [value]="_key(opt)" [selected]="i === _selectedIndex()" [attr.title]="opt.description || null">{{ opt.badge ? opt.label + ' — ' + opt.badge : opt.label }}</option>
7589
+ <option [value]="_key(opt)" [selected]="i === _selectedIndex()" [disabled]="!!opt.disabled" [attr.title]="opt.description || null">{{ opt.badge ? opt.label + ' — ' + opt.badge : opt.label }}</option>
7408
7590
  }
7409
7591
  </select>
7410
7592
  <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>
@@ -9231,6 +9413,15 @@ var EmptyStateComponent = class EmptyStateComponent {
9231
9413
  @case ('shield') {
9232
9414
  <svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>
9233
9415
  }
9416
+ @case ('pipeline') {
9417
+ <svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 4h18l-7 8.5V19l-4 2v-8.5z"/></svg>
9418
+ }
9419
+ @case ('property') {
9420
+ <svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16"/><path d="M16 11h2a2 2 0 0 1 2 2v8"/><path d="M2 21h20"/><path d="M8 7h4M8 11h4M8 15h4"/></svg>
9421
+ }
9422
+ @case ('clipboard') {
9423
+ <svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="5" y="4" width="14" height="18" rx="2"/><path d="M9 2h6v4H9z"/><path d="m8.5 12 1.5 1.5 2.5-3"/><path d="M14.5 12.5H16M8.5 18H16"/></svg>
9424
+ }
9234
9425
  @default {
9235
9426
  <svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg>
9236
9427
  }
@@ -9305,6 +9496,15 @@ i0.ɵɵngDeclareClassMetadata({
9305
9496
  @case ('shield') {
9306
9497
  <svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>
9307
9498
  }
9499
+ @case ('pipeline') {
9500
+ <svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 4h18l-7 8.5V19l-4 2v-8.5z"/></svg>
9501
+ }
9502
+ @case ('property') {
9503
+ <svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16"/><path d="M16 11h2a2 2 0 0 1 2 2v8"/><path d="M2 21h20"/><path d="M8 7h4M8 11h4M8 15h4"/></svg>
9504
+ }
9505
+ @case ('clipboard') {
9506
+ <svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="5" y="4" width="14" height="18" rx="2"/><path d="M9 2h6v4H9z"/><path d="m8.5 12 1.5 1.5 2.5-3"/><path d="M14.5 12.5H16M8.5 18H16"/></svg>
9507
+ }
9308
9508
  @default {
9309
9509
  <svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg>
9310
9510
  }
@@ -9985,7 +10185,8 @@ var DataTableComponent = class DataTableComponent {
9985
10185
  this.showMoreActions = input(true, ...ngDevMode ? [{ debugName: "showMoreActions" }] : /* istanbul ignore next */ []);
9986
10186
  this.showSearch = input(true, ...ngDevMode ? [{ debugName: "showSearch" }] : /* istanbul ignore next */ []);
9987
10187
  this.showQuickTabs = input(true, ...ngDevMode ? [{ debugName: "showQuickTabs" }] : /* istanbul ignore next */ []);
9988
- this._showHeader = computed(() => this.showSearch() || this.showToolbar() || this._effectiveTabs().length > 0, ...ngDevMode ? [{ debugName: "_showHeader" }] : /* istanbul ignore next */ []);
10188
+ this.tableTitle = input("", ...ngDevMode ? [{ debugName: "tableTitle" }] : /* istanbul ignore next */ []);
10189
+ this._showHeader = computed(() => !!this.tableTitle() || this.showSearch() || this.showToolbar() || this._effectiveTabs().length > 0, ...ngDevMode ? [{ debugName: "_showHeader" }] : /* istanbul ignore next */ []);
9989
10190
  this.countsEndpoint = input("", ...ngDevMode ? [{ debugName: "countsEndpoint" }] : /* istanbul ignore next */ []);
9990
10191
  this.params = input(null, ...ngDevMode ? [{ debugName: "params" }] : /* istanbul ignore next */ []);
9991
10192
  this.tableButtons = input([], ...ngDevMode ? [{ debugName: "tableButtons" }] : /* istanbul ignore next */ []);
@@ -10964,6 +11165,13 @@ var DataTableComponent = class DataTableComponent {
10964
11165
  isRequired: false,
10965
11166
  transformFunction: null
10966
11167
  },
11168
+ tableTitle: {
11169
+ classPropertyName: "tableTitle",
11170
+ publicName: "tableTitle",
11171
+ isSignal: true,
11172
+ isRequired: false,
11173
+ transformFunction: null
11174
+ },
10967
11175
  countsEndpoint: {
10968
11176
  classPropertyName: "countsEndpoint",
10969
11177
  publicName: "countsEndpoint",
@@ -11099,6 +11307,9 @@ var DataTableComponent = class DataTableComponent {
11099
11307
  @if (_showHeader()) {
11100
11308
  <div class="dt-sk-toolbar">
11101
11309
  <div class="dt-sk-toolbar-left">
11310
+ @if (tableTitle()) {
11311
+ <h3 class="dt-title">{{ tableTitle() }}</h3>
11312
+ }
11102
11313
  @if (showSearch()) {
11103
11314
  <div class="dt-sk-search">
11104
11315
  <div class="dt-sk-shimmer dt-sk-search-icon"></div>
@@ -11124,6 +11335,9 @@ var DataTableComponent = class DataTableComponent {
11124
11335
  } @else if (_showHeader()) {
11125
11336
  <div class="dt-header alive-header">
11126
11337
  <div class="dt-header-left">
11338
+ @if (tableTitle()) {
11339
+ <h3 class="dt-title">{{ tableTitle() }}</h3>
11340
+ }
11127
11341
  @if (showSearch() && !_emptyUnfiltered()) {
11128
11342
  <ui-search-input
11129
11343
  [value]="_search()"
@@ -11767,7 +11981,7 @@ var DataTableComponent = class DataTableComponent {
11767
11981
  </div>
11768
11982
  `,
11769
11983
  isInline: true,
11770
- 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"],
11984
+ 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"],
11771
11985
  dependencies: [
11772
11986
  {
11773
11987
  kind: "directive",
@@ -11805,7 +12019,8 @@ var DataTableComponent = class DataTableComponent {
11805
12019
  "page",
11806
12020
  "pageSize",
11807
12021
  "totalItems",
11808
- "detached"
12022
+ "detached",
12023
+ "embedded"
11809
12024
  ],
11810
12025
  outputs: ["pageChange"]
11811
12026
  },
@@ -11903,8 +12118,13 @@ var DataTableComponent = class DataTableComponent {
11903
12118
  inputs: [
11904
12119
  "initials",
11905
12120
  "name",
11906
- "size"
11907
- ]
12121
+ "size",
12122
+ "imageUrl",
12123
+ "editable",
12124
+ "editLabel",
12125
+ "busy"
12126
+ ],
12127
+ outputs: ["editClick", "imageError"]
11908
12128
  },
11909
12129
  {
11910
12130
  kind: "component",
@@ -12153,6 +12373,9 @@ i0.ɵɵngDeclareClassMetadata({
12153
12373
  @if (_showHeader()) {
12154
12374
  <div class="dt-sk-toolbar">
12155
12375
  <div class="dt-sk-toolbar-left">
12376
+ @if (tableTitle()) {
12377
+ <h3 class="dt-title">{{ tableTitle() }}</h3>
12378
+ }
12156
12379
  @if (showSearch()) {
12157
12380
  <div class="dt-sk-search">
12158
12381
  <div class="dt-sk-shimmer dt-sk-search-icon"></div>
@@ -12178,6 +12401,9 @@ i0.ɵɵngDeclareClassMetadata({
12178
12401
  } @else if (_showHeader()) {
12179
12402
  <div class="dt-header alive-header">
12180
12403
  <div class="dt-header-left">
12404
+ @if (tableTitle()) {
12405
+ <h3 class="dt-title">{{ tableTitle() }}</h3>
12406
+ }
12181
12407
  @if (showSearch() && !_emptyUnfiltered()) {
12182
12408
  <ui-search-input
12183
12409
  [value]="_search()"
@@ -12820,7 +13046,7 @@ i0.ɵɵngDeclareClassMetadata({
12820
13046
  }
12821
13047
  </div>
12822
13048
  `,
12823
- 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"]
13049
+ 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"]
12824
13050
  }]
12825
13051
  }],
12826
13052
  ctorParameters: () => [],
@@ -12937,6 +13163,14 @@ i0.ɵɵngDeclareClassMetadata({
12937
13163
  required: false
12938
13164
  }]
12939
13165
  }],
13166
+ tableTitle: [{
13167
+ type: i0.Input,
13168
+ args: [{
13169
+ isSignal: true,
13170
+ alias: "tableTitle",
13171
+ required: false
13172
+ }]
13173
+ }],
12940
13174
  countsEndpoint: [{
12941
13175
  type: i0.Input,
12942
13176
  args: [{
@@ -24823,6 +25057,976 @@ i0.ɵɵngDeclareClassMetadata({
24823
25057
  }]
24824
25058
  }
24825
25059
  });
25060
+ const ICON_PATHS = {
25061
+ 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",
25062
+ 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",
25063
+ sms: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z",
25064
+ 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",
25065
+ doc: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z M14 2v6h6",
25066
+ money: "M12 1v22 M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6",
25067
+ deal: "M22 7l-8.5 8.5-5-5L2 17 M16 7h6v6",
25068
+ 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",
25069
+ property: "M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z M9 22V12h6v10",
25070
+ search: "M11 3a8 8 0 1 0 0 16 8 8 0 0 0 0-16z M21 21l-4.35-4.35",
25071
+ 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",
25072
+ 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",
25073
+ 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"
25074
+ };
25075
+ 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";
25076
+ 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";
25077
+ const INDICATOR_LABEL = {
25078
+ high: "High priority",
25079
+ medium: "Medium priority",
25080
+ low: "Low priority"
25081
+ };
25082
+ var CardListItemComponent = class CardListItemComponent {
25083
+ constructor() {
25084
+ this.title = input("", ...ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []);
25085
+ this.description = input(void 0, ...ngDevMode ? [{ debugName: "description" }] : /* istanbul ignore next */ []);
25086
+ this.date = input(void 0, ...ngDevMode ? [{ debugName: "date" }] : /* istanbul ignore next */ []);
25087
+ this.type = input(void 0, ...ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []);
25088
+ this.typeVariant = input("gray", ...ngDevMode ? [{ debugName: "typeVariant" }] : /* istanbul ignore next */ []);
25089
+ this.status = input(void 0, ...ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []);
25090
+ this.statusVariant = input(void 0, ...ngDevMode ? [{ debugName: "statusVariant" }] : /* istanbul ignore next */ []);
25091
+ this.indicator = input("none", ...ngDevMode ? [{ debugName: "indicator" }] : /* istanbul ignore next */ []);
25092
+ this.icon = input(void 0, ...ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []);
25093
+ this.editButton = input(false, ...ngDevMode ? [{ debugName: "editButton" }] : /* istanbul ignore next */ []);
25094
+ this.viewButton = input(false, ...ngDevMode ? [{ debugName: "viewButton" }] : /* istanbul ignore next */ []);
25095
+ this.editAriaLabel = input("", ...ngDevMode ? [{ debugName: "editAriaLabel" }] : /* istanbul ignore next */ []);
25096
+ this.viewAriaLabel = input("", ...ngDevMode ? [{ debugName: "viewAriaLabel" }] : /* istanbul ignore next */ []);
25097
+ this.editClick = output();
25098
+ this.viewClick = output();
25099
+ this.calendarPath = CALENDAR_PATH;
25100
+ this.editPath = EDIT_PATH;
25101
+ this.iconPath = computed(() => {
25102
+ const i = this.icon();
25103
+ return i ? ICON_PATHS[i] ?? null : null;
25104
+ }, ...ngDevMode ? [{ debugName: "iconPath" }] : /* istanbul ignore next */ []);
25105
+ this.indicatorLabel = computed(() => INDICATOR_LABEL[this.indicator()] ?? "", ...ngDevMode ? [{ debugName: "indicatorLabel" }] : /* istanbul ignore next */ []);
25106
+ }
25107
+ static {
25108
+ this.ɵfac = i0.ɵɵngDeclareFactory({
25109
+ minVersion: "12.0.0",
25110
+ version: "22.2.2",
25111
+ ngImport: i0,
25112
+ type: CardListItemComponent,
25113
+ deps: [],
25114
+ target: i0.ɵɵFactoryTarget.Component
25115
+ });
25116
+ }
25117
+ static {
25118
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
25119
+ minVersion: "17.0.0",
25120
+ version: "22.2.2",
25121
+ type: CardListItemComponent,
25122
+ isStandalone: true,
25123
+ selector: "ui-card-list-item",
25124
+ inputs: {
25125
+ title: {
25126
+ classPropertyName: "title",
25127
+ publicName: "title",
25128
+ isSignal: true,
25129
+ isRequired: false,
25130
+ transformFunction: null
25131
+ },
25132
+ description: {
25133
+ classPropertyName: "description",
25134
+ publicName: "description",
25135
+ isSignal: true,
25136
+ isRequired: false,
25137
+ transformFunction: null
25138
+ },
25139
+ date: {
25140
+ classPropertyName: "date",
25141
+ publicName: "date",
25142
+ isSignal: true,
25143
+ isRequired: false,
25144
+ transformFunction: null
25145
+ },
25146
+ type: {
25147
+ classPropertyName: "type",
25148
+ publicName: "type",
25149
+ isSignal: true,
25150
+ isRequired: false,
25151
+ transformFunction: null
25152
+ },
25153
+ typeVariant: {
25154
+ classPropertyName: "typeVariant",
25155
+ publicName: "typeVariant",
25156
+ isSignal: true,
25157
+ isRequired: false,
25158
+ transformFunction: null
25159
+ },
25160
+ status: {
25161
+ classPropertyName: "status",
25162
+ publicName: "status",
25163
+ isSignal: true,
25164
+ isRequired: false,
25165
+ transformFunction: null
25166
+ },
25167
+ statusVariant: {
25168
+ classPropertyName: "statusVariant",
25169
+ publicName: "statusVariant",
25170
+ isSignal: true,
25171
+ isRequired: false,
25172
+ transformFunction: null
25173
+ },
25174
+ indicator: {
25175
+ classPropertyName: "indicator",
25176
+ publicName: "indicator",
25177
+ isSignal: true,
25178
+ isRequired: false,
25179
+ transformFunction: null
25180
+ },
25181
+ icon: {
25182
+ classPropertyName: "icon",
25183
+ publicName: "icon",
25184
+ isSignal: true,
25185
+ isRequired: false,
25186
+ transformFunction: null
25187
+ },
25188
+ editButton: {
25189
+ classPropertyName: "editButton",
25190
+ publicName: "editButton",
25191
+ isSignal: true,
25192
+ isRequired: false,
25193
+ transformFunction: null
25194
+ },
25195
+ viewButton: {
25196
+ classPropertyName: "viewButton",
25197
+ publicName: "viewButton",
25198
+ isSignal: true,
25199
+ isRequired: false,
25200
+ transformFunction: null
25201
+ },
25202
+ editAriaLabel: {
25203
+ classPropertyName: "editAriaLabel",
25204
+ publicName: "editAriaLabel",
25205
+ isSignal: true,
25206
+ isRequired: false,
25207
+ transformFunction: null
25208
+ },
25209
+ viewAriaLabel: {
25210
+ classPropertyName: "viewAriaLabel",
25211
+ publicName: "viewAriaLabel",
25212
+ isSignal: true,
25213
+ isRequired: false,
25214
+ transformFunction: null
25215
+ }
25216
+ },
25217
+ outputs: {
25218
+ editClick: "editClick",
25219
+ viewClick: "viewClick"
25220
+ },
25221
+ ngImport: i0,
25222
+ template: `
25223
+ <div class="cli-row">
25224
+ @if (iconPath(); as d) {
25225
+ <div class="cli-icon-circle" [class]="'cli-icon-circle cli-icon-circle--' + icon()" aria-hidden="true">
25226
+ <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>
25227
+ </div>
25228
+ } @else if (indicator() !== 'none') {
25229
+ @if (indicatorLabel(); as label) {
25230
+ <div class="cli-dot" [class]="'cli-dot cli-dot--' + indicator()" [uiTooltip]="label" tabindex="0" role="img" [attr.aria-label]="label"></div>
25231
+ } @else {
25232
+ <div class="cli-dot" [class]="'cli-dot cli-dot--' + indicator()" aria-hidden="true"></div>
25233
+ }
25234
+ }
25235
+
25236
+ <div class="cli-body">
25237
+ <div class="cli-title-row">
25238
+ <span class="cli-title">{{ title() }}</span>
25239
+ @if (type()) { <ui-badge [label]="type()!" [variant]="typeVariant()" /> }
25240
+ @if (status() && statusVariant()) { <ui-badge [label]="status()!" [variant]="statusVariant()!" /> }
25241
+ </div>
25242
+ <div class="cli-desc-row">
25243
+ @if (description()) { <span class="cli-description">{{ description() }}</span> }
25244
+ <ng-content select="[card-list-inline]" />
25245
+ </div>
25246
+ @if (date()) {
25247
+ <span class="cli-date">
25248
+ <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>
25249
+ {{ date() }}
25250
+ </span>
25251
+ }
25252
+ </div>
25253
+
25254
+ @if (editButton()) {
25255
+ <button class="cli-chip cli-chip--edit" type="button" [attr.aria-label]="editAriaLabel() || null" (click)="editClick.emit()">
25256
+ <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>
25257
+ Edit
25258
+ </button>
25259
+ }
25260
+ @if (viewButton()) {
25261
+ <button class="cli-chip cli-chip--view" type="button" [attr.aria-label]="viewAriaLabel() || null" (click)="viewClick.emit()">View</button>
25262
+ }
25263
+ <ng-content select="[card-list-action]" />
25264
+ <ng-content />
25265
+ </div>
25266
+ <ng-content select="[card-stats]" />
25267
+ <ng-content select="[card-detail]" />
25268
+ `,
25269
+ isInline: true,
25270
+ 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"],
25271
+ dependencies: [{
25272
+ kind: "component",
25273
+ type: BadgeComponent,
25274
+ selector: "ui-badge",
25275
+ inputs: ["label", "variant"]
25276
+ }, {
25277
+ kind: "directive",
25278
+ type: TooltipDirective,
25279
+ selector: "[uiTooltip]",
25280
+ inputs: ["uiTooltip", "tooltipPosition"]
25281
+ }],
25282
+ changeDetection: i0.ChangeDetectionStrategy.OnPush,
25283
+ encapsulation: i0.ViewEncapsulation.None
25284
+ });
25285
+ }
25286
+ };
25287
+ i0.ɵɵngDeclareClassMetadata({
25288
+ minVersion: "12.0.0",
25289
+ version: "22.2.2",
25290
+ ngImport: i0,
25291
+ type: CardListItemComponent,
25292
+ decorators: [{
25293
+ type: Component,
25294
+ args: [{
25295
+ selector: "ui-card-list-item",
25296
+ standalone: true,
25297
+ changeDetection: ChangeDetectionStrategy.OnPush,
25298
+ encapsulation: ViewEncapsulation.None,
25299
+ imports: [BadgeComponent, TooltipDirective],
25300
+ template: `
25301
+ <div class="cli-row">
25302
+ @if (iconPath(); as d) {
25303
+ <div class="cli-icon-circle" [class]="'cli-icon-circle cli-icon-circle--' + icon()" aria-hidden="true">
25304
+ <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>
25305
+ </div>
25306
+ } @else if (indicator() !== 'none') {
25307
+ @if (indicatorLabel(); as label) {
25308
+ <div class="cli-dot" [class]="'cli-dot cli-dot--' + indicator()" [uiTooltip]="label" tabindex="0" role="img" [attr.aria-label]="label"></div>
25309
+ } @else {
25310
+ <div class="cli-dot" [class]="'cli-dot cli-dot--' + indicator()" aria-hidden="true"></div>
25311
+ }
25312
+ }
25313
+
25314
+ <div class="cli-body">
25315
+ <div class="cli-title-row">
25316
+ <span class="cli-title">{{ title() }}</span>
25317
+ @if (type()) { <ui-badge [label]="type()!" [variant]="typeVariant()" /> }
25318
+ @if (status() && statusVariant()) { <ui-badge [label]="status()!" [variant]="statusVariant()!" /> }
25319
+ </div>
25320
+ <div class="cli-desc-row">
25321
+ @if (description()) { <span class="cli-description">{{ description() }}</span> }
25322
+ <ng-content select="[card-list-inline]" />
25323
+ </div>
25324
+ @if (date()) {
25325
+ <span class="cli-date">
25326
+ <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>
25327
+ {{ date() }}
25328
+ </span>
25329
+ }
25330
+ </div>
25331
+
25332
+ @if (editButton()) {
25333
+ <button class="cli-chip cli-chip--edit" type="button" [attr.aria-label]="editAriaLabel() || null" (click)="editClick.emit()">
25334
+ <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>
25335
+ Edit
25336
+ </button>
25337
+ }
25338
+ @if (viewButton()) {
25339
+ <button class="cli-chip cli-chip--view" type="button" [attr.aria-label]="viewAriaLabel() || null" (click)="viewClick.emit()">View</button>
25340
+ }
25341
+ <ng-content select="[card-list-action]" />
25342
+ <ng-content />
25343
+ </div>
25344
+ <ng-content select="[card-stats]" />
25345
+ <ng-content select="[card-detail]" />
25346
+ `,
25347
+ 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"]
25348
+ }]
25349
+ }],
25350
+ propDecorators: {
25351
+ title: [{
25352
+ type: i0.Input,
25353
+ args: [{
25354
+ isSignal: true,
25355
+ alias: "title",
25356
+ required: false
25357
+ }]
25358
+ }],
25359
+ description: [{
25360
+ type: i0.Input,
25361
+ args: [{
25362
+ isSignal: true,
25363
+ alias: "description",
25364
+ required: false
25365
+ }]
25366
+ }],
25367
+ date: [{
25368
+ type: i0.Input,
25369
+ args: [{
25370
+ isSignal: true,
25371
+ alias: "date",
25372
+ required: false
25373
+ }]
25374
+ }],
25375
+ type: [{
25376
+ type: i0.Input,
25377
+ args: [{
25378
+ isSignal: true,
25379
+ alias: "type",
25380
+ required: false
25381
+ }]
25382
+ }],
25383
+ typeVariant: [{
25384
+ type: i0.Input,
25385
+ args: [{
25386
+ isSignal: true,
25387
+ alias: "typeVariant",
25388
+ required: false
25389
+ }]
25390
+ }],
25391
+ status: [{
25392
+ type: i0.Input,
25393
+ args: [{
25394
+ isSignal: true,
25395
+ alias: "status",
25396
+ required: false
25397
+ }]
25398
+ }],
25399
+ statusVariant: [{
25400
+ type: i0.Input,
25401
+ args: [{
25402
+ isSignal: true,
25403
+ alias: "statusVariant",
25404
+ required: false
25405
+ }]
25406
+ }],
25407
+ indicator: [{
25408
+ type: i0.Input,
25409
+ args: [{
25410
+ isSignal: true,
25411
+ alias: "indicator",
25412
+ required: false
25413
+ }]
25414
+ }],
25415
+ icon: [{
25416
+ type: i0.Input,
25417
+ args: [{
25418
+ isSignal: true,
25419
+ alias: "icon",
25420
+ required: false
25421
+ }]
25422
+ }],
25423
+ editButton: [{
25424
+ type: i0.Input,
25425
+ args: [{
25426
+ isSignal: true,
25427
+ alias: "editButton",
25428
+ required: false
25429
+ }]
25430
+ }],
25431
+ viewButton: [{
25432
+ type: i0.Input,
25433
+ args: [{
25434
+ isSignal: true,
25435
+ alias: "viewButton",
25436
+ required: false
25437
+ }]
25438
+ }],
25439
+ editAriaLabel: [{
25440
+ type: i0.Input,
25441
+ args: [{
25442
+ isSignal: true,
25443
+ alias: "editAriaLabel",
25444
+ required: false
25445
+ }]
25446
+ }],
25447
+ viewAriaLabel: [{
25448
+ type: i0.Input,
25449
+ args: [{
25450
+ isSignal: true,
25451
+ alias: "viewAriaLabel",
25452
+ required: false
25453
+ }]
25454
+ }],
25455
+ editClick: [{
25456
+ type: i0.Output,
25457
+ args: ["editClick"]
25458
+ }],
25459
+ viewClick: [{
25460
+ type: i0.Output,
25461
+ args: ["viewClick"]
25462
+ }]
25463
+ }
25464
+ });
25465
+ const ACTION_VERB = {
25466
+ load: "loading",
25467
+ save: "saving",
25468
+ create: "creating",
25469
+ update: "updating",
25470
+ delete: "deleting",
25471
+ send: "sending",
25472
+ export: "exporting",
25473
+ import: "importing",
25474
+ upload: "uploading",
25475
+ download: "downloading"
25476
+ };
25477
+ const ACTION_PERMISSION_VERB = {
25478
+ load: "access",
25479
+ save: "save",
25480
+ create: "create",
25481
+ update: "update",
25482
+ delete: "delete",
25483
+ send: "send",
25484
+ export: "export",
25485
+ import: "import",
25486
+ upload: "upload",
25487
+ download: "download"
25488
+ };
25489
+ const REQUEST_METHOD = "__forgerouteRequestMethod";
25490
+ const errorContextInterceptor = (req, next) => next(req).pipe(catchError$1((err) => {
25491
+ if (err instanceof HttpErrorResponse && !(REQUEST_METHOD in err)) Object.defineProperty(err, REQUEST_METHOD, {
25492
+ value: req.method.toUpperCase(),
25493
+ enumerable: false
25494
+ });
25495
+ return throwError(() => err);
25496
+ }));
25497
+ function actionFromMethod(error) {
25498
+ switch (error[REQUEST_METHOD]) {
25499
+ case "POST":
25500
+ case "PUT":
25501
+ case "PATCH": return "save";
25502
+ case "DELETE": return "delete";
25503
+ default: return "load";
25504
+ }
25505
+ }
25506
+ function withoutLeadingArticle(ctx) {
25507
+ return ctx.replace(/^(?:the|an?)\s+/i, "") || ctx;
25508
+ }
25509
+ function getErrorMessage(error, fallbackContext, action) {
25510
+ const ctx = fallbackContext?.trim() || "data";
25511
+ const act = action ?? (error instanceof HttpErrorResponse ? actionFromMethod(error) : "load");
25512
+ const failed = `There was an error ${ACTION_VERB[act]} ${ctx}.`;
25513
+ if (error instanceof HttpErrorResponse) {
25514
+ if (error.error?.message) return error.error.message;
25515
+ if (typeof error.error === "string" && error.error.length < 200) return error.error;
25516
+ switch (error.status) {
25517
+ case 0: return `${failed} Please check your connection and try again.`;
25518
+ case 401: return "Your session has expired. Please log in again.";
25519
+ case 403: return `You don't have permission to ${ACTION_PERMISSION_VERB[act]} ${ctx}.`;
25520
+ case 404: return `The ${withoutLeadingArticle(ctx)} you're looking for could not be found.`;
25521
+ case 408: return `${failed} The request timed out — please try again.`;
25522
+ case 422: return "The data you submitted is invalid. Please check your input and try again.";
25523
+ case 429: return `${failed} Too many requests — please wait a moment and try again.`;
25524
+ case 502:
25525
+ case 503:
25526
+ case 504: return `${failed} Please try again in a few minutes.`;
25527
+ default: return `${failed} Please try again.`;
25528
+ }
25529
+ }
25530
+ if (error instanceof Error) return error.message;
25531
+ if (typeof error === "string") return error;
25532
+ return `${failed} Please try again.`;
25533
+ }
25534
+ const NOTES_MAX_LENGTH = 1e4;
25535
+ const NOTES_PAGE_SIZE = 5;
25536
+ var NotesComponent = class NotesComponent {
25537
+ initials(name) {
25538
+ const parts = (name || "You").trim().split(/\s+/).filter(Boolean);
25539
+ return ((parts[0]?.[0] ?? "") + (parts.length > 1 ? parts[parts.length - 1][0] : "")).toUpperCase();
25540
+ }
25541
+ tooLong(text) {
25542
+ return text.trim().length > NOTES_MAX_LENGTH;
25543
+ }
25544
+ validBody(text) {
25545
+ const n = text.trim().length;
25546
+ return n > 0 && n <= 1e4;
25547
+ }
25548
+ get listUrl() {
25549
+ return `${this.apiBase}/notes/${this.resourceType()}/${this.resourceId()}`;
25550
+ }
25551
+ constructor() {
25552
+ this.resourceType = input("", ...ngDevMode ? [{ debugName: "resourceType" }] : /* istanbul ignore next */ []);
25553
+ this.resourceId = input("", ...ngDevMode ? [{ debugName: "resourceId" }] : /* istanbul ignore next */ []);
25554
+ this.readOnly = input(false, ...ngDevMode ? [{ debugName: "readOnly" }] : /* istanbul ignore next */ []);
25555
+ this.totalChange = output();
25556
+ this.http = inject(HttpClient);
25557
+ this.toast = inject(ToastService);
25558
+ this.destroyRef = inject(DestroyRef);
25559
+ this.apiBase = inject(FORGEROUTE_CONFIG, { optional: true })?.baseUrl ?? "/api";
25560
+ this.pageSize = NOTES_PAGE_SIZE;
25561
+ this.maxLength = NOTES_MAX_LENGTH;
25562
+ this.notes = signal([], ...ngDevMode ? [{ debugName: "notes" }] : /* istanbul ignore next */ []);
25563
+ this.loading = signal(false, ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
25564
+ this.saving = signal(false, ...ngDevMode ? [{ debugName: "saving" }] : /* istanbul ignore next */ []);
25565
+ this.page = signal(0, ...ngDevMode ? [{ debugName: "page" }] : /* istanbul ignore next */ []);
25566
+ this.totalElements = signal(0, ...ngDevMode ? [{ debugName: "totalElements" }] : /* istanbul ignore next */ []);
25567
+ this.editingId = signal(null, ...ngDevMode ? [{ debugName: "editingId" }] : /* istanbul ignore next */ []);
25568
+ this.deletingId = signal(null, ...ngDevMode ? [{ debugName: "deletingId" }] : /* istanbul ignore next */ []);
25569
+ this.newBody = "";
25570
+ this.editBody = "";
25571
+ effect(() => {
25572
+ const id = this.resourceId();
25573
+ const type = this.resourceType();
25574
+ if (id && type) untracked(() => this.loadPage(0));
25575
+ });
25576
+ }
25577
+ loadPage(p) {
25578
+ if (!this.resourceType() || !this.resourceId()) return;
25579
+ this.loading.set(true);
25580
+ this.http.get(`${this.listUrl}?page=${p}&size=${this.pageSize}`).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
25581
+ next: (res) => {
25582
+ this.notes.set(res.content);
25583
+ this.page.set(res.page);
25584
+ this.totalElements.set(res.totalElements);
25585
+ this.loading.set(false);
25586
+ this.totalChange.emit(res.totalElements);
25587
+ },
25588
+ error: (err) => {
25589
+ this.loading.set(false);
25590
+ this.toast.error(getErrorMessage(err, "notes"));
25591
+ }
25592
+ });
25593
+ }
25594
+ addNote() {
25595
+ if (this.readOnly() || !this.validBody(this.newBody) || this.saving()) return;
25596
+ this.saving.set(true);
25597
+ this.http.post(this.listUrl, { body: this.newBody.trim() }).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
25598
+ next: () => {
25599
+ this.newBody = "";
25600
+ this.saving.set(false);
25601
+ this.loadPage(0);
25602
+ },
25603
+ error: (err) => {
25604
+ this.saving.set(false);
25605
+ this.toast.error(getErrorMessage(err, "note", "create"));
25606
+ }
25607
+ });
25608
+ }
25609
+ startEdit(note) {
25610
+ if (this.readOnly()) return;
25611
+ this.editingId.set(note.id);
25612
+ this.editBody = note.body;
25613
+ }
25614
+ cancelEdit() {
25615
+ this.editingId.set(null);
25616
+ this.editBody = "";
25617
+ }
25618
+ saveEdit(noteId) {
25619
+ if (this.readOnly() || !this.validBody(this.editBody) || this.saving()) return;
25620
+ this.saving.set(true);
25621
+ this.http.put(`${this.apiBase}/notes/${noteId}`, { body: this.editBody.trim() }).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
25622
+ next: (updated) => {
25623
+ this.notes.update((arr) => arr.map((n) => n.id === noteId ? updated : n));
25624
+ this.editingId.set(null);
25625
+ this.saving.set(false);
25626
+ },
25627
+ error: (err) => {
25628
+ this.saving.set(false);
25629
+ this.toast.error(getErrorMessage(err, "note", "update"));
25630
+ }
25631
+ });
25632
+ }
25633
+ confirmDelete(id) {
25634
+ if (this.readOnly()) return;
25635
+ this.deletingId.set(id);
25636
+ }
25637
+ deleteNote() {
25638
+ const id = this.deletingId();
25639
+ if (this.readOnly() || !id || this.saving()) return;
25640
+ this.saving.set(true);
25641
+ this.http.delete(`${this.apiBase}/notes/${id}`).pipe(takeUntilDestroyed(this.destroyRef)).subscribe({
25642
+ next: () => {
25643
+ this.deletingId.set(null);
25644
+ this.saving.set(false);
25645
+ this.loadPage(this.notes().length === 1 && this.page() > 0 ? this.page() - 1 : this.page());
25646
+ },
25647
+ error: (err) => {
25648
+ this.deletingId.set(null);
25649
+ this.saving.set(false);
25650
+ this.toast.error(getErrorMessage(err, "note", "delete"));
25651
+ }
25652
+ });
25653
+ }
25654
+ static {
25655
+ this.ɵfac = i0.ɵɵngDeclareFactory({
25656
+ minVersion: "12.0.0",
25657
+ version: "22.2.2",
25658
+ ngImport: i0,
25659
+ type: NotesComponent,
25660
+ deps: [],
25661
+ target: i0.ɵɵFactoryTarget.Component
25662
+ });
25663
+ }
25664
+ static {
25665
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
25666
+ minVersion: "17.0.0",
25667
+ version: "22.2.2",
25668
+ type: NotesComponent,
25669
+ isStandalone: true,
25670
+ selector: "ui-notes",
25671
+ inputs: {
25672
+ resourceType: {
25673
+ classPropertyName: "resourceType",
25674
+ publicName: "resourceType",
25675
+ isSignal: true,
25676
+ isRequired: false,
25677
+ transformFunction: null
25678
+ },
25679
+ resourceId: {
25680
+ classPropertyName: "resourceId",
25681
+ publicName: "resourceId",
25682
+ isSignal: true,
25683
+ isRequired: false,
25684
+ transformFunction: null
25685
+ },
25686
+ readOnly: {
25687
+ classPropertyName: "readOnly",
25688
+ publicName: "readOnly",
25689
+ isSignal: true,
25690
+ isRequired: false,
25691
+ transformFunction: null
25692
+ }
25693
+ },
25694
+ outputs: { totalChange: "totalChange" },
25695
+ ngImport: i0,
25696
+ template: `
25697
+ @if (!readOnly()) {
25698
+ <div class="note-add">
25699
+ <ui-textarea-input ariaLabel="Add a note" placeholder="Add a note..." [rows]="3" [maxlength]="maxLength" [showErrors]="tooLong(newBody)" [disabled]="saving()" [(ngModel)]="newBody"
25700
+ (keydown.meta.enter)="addNote()" (keydown.control.enter)="addNote()" />
25701
+ <div class="note-add-footer">
25702
+ <ui-button variant="primary" size="sm" data-testid="note-add-btn" [loading]="saving()" [disabled]="!validBody(newBody)" (click)="addNote()">Add Note</ui-button>
25703
+ </div>
25704
+ </div>
25705
+ }
25706
+
25707
+ @if (loading() && notes().length === 0) {
25708
+ <div class="note-loading" role="status">Loading notes...</div>
25709
+ } @else if (notes().length === 0) {
25710
+ <ui-empty-state iconType="person" title="No notes yet" [message]="readOnly() ? 'No notes have been added.' : 'Add your first note above.'" />
25711
+ } @else {
25712
+ <ul class="note-list" aria-label="Notes">
25713
+ @for (note of notes(); track note.id) {
25714
+ <li class="note-item" [class.editing]="editingId() === note.id">
25715
+ <ui-avatar class="note-avatar" [initials]="initials(note.createdByName)" [name]="note.createdByName || 'You'" [size]="32" />
25716
+ <div class="note-main">
25717
+ <div class="note-head">
25718
+ <span class="note-author">{{ note.createdByName || 'You' }}</span>
25719
+ <span class="note-dot" aria-hidden="true">·</span>
25720
+ <time class="note-date" [attr.datetime]="note.createdAt">{{ note.createdAt | date:'MMM d, yyyy h:mm a' }}</time>
25721
+ @if (note.updatedAt !== note.createdAt) {
25722
+ <span class="note-edited">edited</span>
25723
+ }
25724
+ @if (!readOnly() && editingId() !== note.id) {
25725
+ <div class="note-actions">
25726
+ <ui-icon name="edit" [size]="14" tooltip="Edit note" (iconClick)="startEdit(note)" />
25727
+ <ui-icon name="delete" variant="danger" [size]="14" tooltip="Delete note" (iconClick)="confirmDelete(note.id)" />
25728
+ </div>
25729
+ }
25730
+ </div>
25731
+ @if (editingId() === note.id) {
25732
+ <ui-textarea-input ariaLabel="Edit note" [rows]="3" [maxlength]="maxLength" [showErrors]="tooLong(editBody)" [disabled]="saving()" [(ngModel)]="editBody" />
25733
+ <div class="note-item-footer">
25734
+ <ui-button variant="secondary" size="sm" (click)="cancelEdit()">Cancel</ui-button>
25735
+ <ui-button variant="primary" size="sm" [loading]="saving()" [disabled]="!validBody(editBody)" (click)="saveEdit(note.id)">Save</ui-button>
25736
+ </div>
25737
+ } @else {
25738
+ <p class="note-body">{{ note.body }}</p>
25739
+ }
25740
+ </div>
25741
+ </li>
25742
+ }
25743
+ </ul>
25744
+ <ui-pagination [page]="page() + 1" [pageSize]="pageSize" [totalItems]="totalElements()" (pageChange)="loadPage($event - 1)" />
25745
+ }
25746
+
25747
+ <ui-modal [open]="!!deletingId()" title="Delete Note" maxWidth="420px" dialogTestId="delete-note-modal" (close)="deletingId.set(null)">
25748
+ <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>
25749
+ <ui-button modal-footer-left variant="secondary" size="sm" data-testid="delete-note-cancel" (click)="deletingId.set(null)">Cancel</ui-button>
25750
+ <ui-button modal-footer-right variant="danger" size="sm" data-testid="delete-note-confirm" [loading]="saving()" (click)="deleteNote()">Delete Note</ui-button>
25751
+ </ui-modal>
25752
+ `,
25753
+ isInline: true,
25754
+ 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"],
25755
+ dependencies: [
25756
+ {
25757
+ kind: "ngmodule",
25758
+ type: FormsModule
25759
+ },
25760
+ {
25761
+ kind: "directive",
25762
+ type: i1.NgControlStatus,
25763
+ selector: "[formControlName],[ngModel],[formControl]"
25764
+ },
25765
+ {
25766
+ kind: "directive",
25767
+ type: i1.MaxLengthValidator,
25768
+ selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]",
25769
+ inputs: ["maxlength"]
25770
+ },
25771
+ {
25772
+ kind: "directive",
25773
+ type: i1.NgModel,
25774
+ selector: "[ngModel]:not([formControlName]):not([formControl])",
25775
+ inputs: [
25776
+ "name",
25777
+ "disabled",
25778
+ "ngModel",
25779
+ "ngModelOptions"
25780
+ ],
25781
+ outputs: ["ngModelChange"],
25782
+ exportAs: ["ngModel"]
25783
+ },
25784
+ {
25785
+ kind: "component",
25786
+ type: ButtonComponent,
25787
+ selector: "ui-button",
25788
+ inputs: [
25789
+ "variant",
25790
+ "routerLink",
25791
+ "queryParams",
25792
+ "fragment",
25793
+ "state",
25794
+ "href",
25795
+ "target",
25796
+ "rel",
25797
+ "shortLabel",
25798
+ "shortBelow",
25799
+ "color",
25800
+ "active",
25801
+ "size",
25802
+ "type",
25803
+ "disabled",
25804
+ "loading",
25805
+ "fullWidth",
25806
+ "ariaLabel",
25807
+ "ariaExpanded",
25808
+ "ariaPressed",
25809
+ "ariaDescribedBy",
25810
+ "modal-footer-left",
25811
+ "modal-footer-right"
25812
+ ]
25813
+ },
25814
+ {
25815
+ kind: "component",
25816
+ type: ModalComponent,
25817
+ selector: "ui-modal",
25818
+ inputs: [
25819
+ "open",
25820
+ "title",
25821
+ "description",
25822
+ "maxWidth",
25823
+ "bodyOverflow",
25824
+ "dialogTestId",
25825
+ "hideClose",
25826
+ "closable",
25827
+ "returnFocusTo"
25828
+ ],
25829
+ outputs: ["close"]
25830
+ },
25831
+ {
25832
+ kind: "component",
25833
+ type: EmptyStateComponent,
25834
+ selector: "ui-empty-state",
25835
+ inputs: [
25836
+ "message",
25837
+ "title",
25838
+ "iconType"
25839
+ ]
25840
+ },
25841
+ {
25842
+ kind: "component",
25843
+ type: PaginationComponent,
25844
+ selector: "ui-pagination",
25845
+ inputs: [
25846
+ "page",
25847
+ "pageSize",
25848
+ "totalItems",
25849
+ "detached",
25850
+ "embedded"
25851
+ ],
25852
+ outputs: ["pageChange"]
25853
+ },
25854
+ {
25855
+ kind: "component",
25856
+ type: TextareaInputComponent,
25857
+ selector: "ui-textarea-input",
25858
+ inputs: [
25859
+ "label",
25860
+ "ariaLabel",
25861
+ "placeholder",
25862
+ "rows",
25863
+ "maxlength",
25864
+ "required",
25865
+ "readonly",
25866
+ "hint",
25867
+ "hintAsDescription",
25868
+ "error",
25869
+ "monospace",
25870
+ "showErrors",
25871
+ "disabled"
25872
+ ],
25873
+ outputs: ["invalidChange"]
25874
+ },
25875
+ {
25876
+ kind: "component",
25877
+ type: IconComponent,
25878
+ selector: "ui-icon",
25879
+ inputs: [
25880
+ "name",
25881
+ "tooltip",
25882
+ "ariaLabel",
25883
+ "size",
25884
+ "variant",
25885
+ "disabled",
25886
+ "loading",
25887
+ "interactive"
25888
+ ],
25889
+ outputs: ["iconClick"]
25890
+ },
25891
+ {
25892
+ kind: "component",
25893
+ type: AvatarComponent,
25894
+ selector: "ui-avatar",
25895
+ inputs: [
25896
+ "initials",
25897
+ "name",
25898
+ "size",
25899
+ "imageUrl",
25900
+ "editable",
25901
+ "editLabel",
25902
+ "busy"
25903
+ ],
25904
+ outputs: ["editClick", "imageError"]
25905
+ },
25906
+ {
25907
+ kind: "pipe",
25908
+ type: DatePipe,
25909
+ name: "date"
25910
+ }
25911
+ ],
25912
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
25913
+ });
25914
+ }
25915
+ };
25916
+ i0.ɵɵngDeclareClassMetadata({
25917
+ minVersion: "12.0.0",
25918
+ version: "22.2.2",
25919
+ ngImport: i0,
25920
+ type: NotesComponent,
25921
+ decorators: [{
25922
+ type: Component,
25923
+ args: [{
25924
+ selector: "ui-notes",
25925
+ standalone: true,
25926
+ changeDetection: ChangeDetectionStrategy.OnPush,
25927
+ imports: [
25928
+ DatePipe,
25929
+ FormsModule,
25930
+ ButtonComponent,
25931
+ ModalComponent,
25932
+ EmptyStateComponent,
25933
+ PaginationComponent,
25934
+ TextareaInputComponent,
25935
+ IconComponent,
25936
+ AvatarComponent
25937
+ ],
25938
+ template: `
25939
+ @if (!readOnly()) {
25940
+ <div class="note-add">
25941
+ <ui-textarea-input ariaLabel="Add a note" placeholder="Add a note..." [rows]="3" [maxlength]="maxLength" [showErrors]="tooLong(newBody)" [disabled]="saving()" [(ngModel)]="newBody"
25942
+ (keydown.meta.enter)="addNote()" (keydown.control.enter)="addNote()" />
25943
+ <div class="note-add-footer">
25944
+ <ui-button variant="primary" size="sm" data-testid="note-add-btn" [loading]="saving()" [disabled]="!validBody(newBody)" (click)="addNote()">Add Note</ui-button>
25945
+ </div>
25946
+ </div>
25947
+ }
25948
+
25949
+ @if (loading() && notes().length === 0) {
25950
+ <div class="note-loading" role="status">Loading notes...</div>
25951
+ } @else if (notes().length === 0) {
25952
+ <ui-empty-state iconType="person" title="No notes yet" [message]="readOnly() ? 'No notes have been added.' : 'Add your first note above.'" />
25953
+ } @else {
25954
+ <ul class="note-list" aria-label="Notes">
25955
+ @for (note of notes(); track note.id) {
25956
+ <li class="note-item" [class.editing]="editingId() === note.id">
25957
+ <ui-avatar class="note-avatar" [initials]="initials(note.createdByName)" [name]="note.createdByName || 'You'" [size]="32" />
25958
+ <div class="note-main">
25959
+ <div class="note-head">
25960
+ <span class="note-author">{{ note.createdByName || 'You' }}</span>
25961
+ <span class="note-dot" aria-hidden="true">·</span>
25962
+ <time class="note-date" [attr.datetime]="note.createdAt">{{ note.createdAt | date:'MMM d, yyyy h:mm a' }}</time>
25963
+ @if (note.updatedAt !== note.createdAt) {
25964
+ <span class="note-edited">edited</span>
25965
+ }
25966
+ @if (!readOnly() && editingId() !== note.id) {
25967
+ <div class="note-actions">
25968
+ <ui-icon name="edit" [size]="14" tooltip="Edit note" (iconClick)="startEdit(note)" />
25969
+ <ui-icon name="delete" variant="danger" [size]="14" tooltip="Delete note" (iconClick)="confirmDelete(note.id)" />
25970
+ </div>
25971
+ }
25972
+ </div>
25973
+ @if (editingId() === note.id) {
25974
+ <ui-textarea-input ariaLabel="Edit note" [rows]="3" [maxlength]="maxLength" [showErrors]="tooLong(editBody)" [disabled]="saving()" [(ngModel)]="editBody" />
25975
+ <div class="note-item-footer">
25976
+ <ui-button variant="secondary" size="sm" (click)="cancelEdit()">Cancel</ui-button>
25977
+ <ui-button variant="primary" size="sm" [loading]="saving()" [disabled]="!validBody(editBody)" (click)="saveEdit(note.id)">Save</ui-button>
25978
+ </div>
25979
+ } @else {
25980
+ <p class="note-body">{{ note.body }}</p>
25981
+ }
25982
+ </div>
25983
+ </li>
25984
+ }
25985
+ </ul>
25986
+ <ui-pagination [page]="page() + 1" [pageSize]="pageSize" [totalItems]="totalElements()" (pageChange)="loadPage($event - 1)" />
25987
+ }
25988
+
25989
+ <ui-modal [open]="!!deletingId()" title="Delete Note" maxWidth="420px" dialogTestId="delete-note-modal" (close)="deletingId.set(null)">
25990
+ <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>
25991
+ <ui-button modal-footer-left variant="secondary" size="sm" data-testid="delete-note-cancel" (click)="deletingId.set(null)">Cancel</ui-button>
25992
+ <ui-button modal-footer-right variant="danger" size="sm" data-testid="delete-note-confirm" [loading]="saving()" (click)="deleteNote()">Delete Note</ui-button>
25993
+ </ui-modal>
25994
+ `,
25995
+ 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"]
25996
+ }]
25997
+ }],
25998
+ ctorParameters: () => [],
25999
+ propDecorators: {
26000
+ resourceType: [{
26001
+ type: i0.Input,
26002
+ args: [{
26003
+ isSignal: true,
26004
+ alias: "resourceType",
26005
+ required: false
26006
+ }]
26007
+ }],
26008
+ resourceId: [{
26009
+ type: i0.Input,
26010
+ args: [{
26011
+ isSignal: true,
26012
+ alias: "resourceId",
26013
+ required: false
26014
+ }]
26015
+ }],
26016
+ readOnly: [{
26017
+ type: i0.Input,
26018
+ args: [{
26019
+ isSignal: true,
26020
+ alias: "readOnly",
26021
+ required: false
26022
+ }]
26023
+ }],
26024
+ totalChange: [{
26025
+ type: i0.Output,
26026
+ args: ["totalChange"]
26027
+ }]
26028
+ }
26029
+ });
24826
26030
  function provideForgerouteToast(options = {}) {
24827
26031
  return makeEnvironmentProviders([provideEnvironmentInitializer(() => {
24828
26032
  if (options.dismissible) inject(ToastService).dismissible.set(true);
@@ -24847,11 +26051,11 @@ const LAYOUT_GAP_PX = {
24847
26051
  lg: 24,
24848
26052
  xl: 32
24849
26053
  };
24850
- const CSS_LENGTH = /^(?:0|-?(?:\d+\.?\d*|\.\d+)(?:px|rem|em|%|vh|vw|ch)|(?:calc|var)\([^;{}]*\))$/i;
26054
+ const CSS_LENGTH$1 = /^(?:0|-?(?:\d+\.?\d*|\.\d+)(?:px|rem|em|%|vh|vw|ch)|(?:calc|var)\([^;{}]*\))$/i;
24851
26055
  function resolveLayoutGap(gap, fallback) {
24852
26056
  const v = (gap ?? "").trim();
24853
26057
  if (Object.prototype.hasOwnProperty.call(LAYOUT_GAP_PX, v)) return `${LAYOUT_GAP_PX[v]}px`;
24854
- if (v && CSS_LENGTH.test(v)) return v;
26058
+ if (v && CSS_LENGTH$1.test(v)) return v;
24855
26059
  return `${LAYOUT_GAP_PX[fallback]}px`;
24856
26060
  }
24857
26061
  function reorderItems(items, order) {
@@ -26845,6 +28049,7 @@ var PanelInfoListComponent = class PanelInfoListComponent {
26845
28049
  this.sections = input([], ...ngDevMode ? [{ debugName: "sections" }] : /* istanbul ignore next */ []);
26846
28050
  this.showEmptyState = input(false, ...ngDevMode ? [{ debugName: "showEmptyState" }] : /* istanbul ignore next */ []);
26847
28051
  this.labelColon = input(false, ...ngDevMode ? [{ debugName: "labelColon" }] : /* istanbul ignore next */ []);
28052
+ this.fill = input(false, ...ngDevMode ? [{ debugName: "fill" }] : /* istanbul ignore next */ []);
26848
28053
  this.displaySections = computed(() => this.showEmptyState() ? this.sections() : this.sections().filter((s) => s.items.some((i) => !i.hidden)), ...ngDevMode ? [{ debugName: "displaySections" }] : /* istanbul ignore next */ []);
26849
28054
  }
26850
28055
  hrefOf(item) {
@@ -26910,8 +28115,16 @@ var PanelInfoListComponent = class PanelInfoListComponent {
26910
28115
  isSignal: true,
26911
28116
  isRequired: false,
26912
28117
  transformFunction: null
28118
+ },
28119
+ fill: {
28120
+ classPropertyName: "fill",
28121
+ publicName: "fill",
28122
+ isSignal: true,
28123
+ isRequired: false,
28124
+ transformFunction: null
26913
28125
  }
26914
28126
  },
28127
+ host: { properties: { "class.pil-fill": "fill()" } },
26915
28128
  ngImport: i0,
26916
28129
  template: `
26917
28130
  @for (section of displaySections(); track section.title ?? $index) {
@@ -26969,11 +28182,7 @@ var PanelInfoListComponent = class PanelInfoListComponent {
26969
28182
  <span [class.pil-muted]="item.muted" [class.pil-danger]="item.danger" [class.pil-multiline]="item.multiline">{{ item.value || '—' }}</span>
26970
28183
  }
26971
28184
  @if (item.editAction) {
26972
- <ui-button class="pil-edit-btn" variant="icon" size="xs"
26973
- [ariaLabel]="item.editTooltip ?? 'Edit'" [attr.title]="item.editTooltip ?? 'Edit'"
26974
- (click)="item.editAction!()">
26975
- <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>
26976
- </ui-button>
28185
+ <ui-icon class="pil-edit-btn" name="edit" [size]="14" [tooltip]="item.editTooltip ?? 'Edit'" (iconClick)="item.editAction!()" />
26977
28186
  }
26978
28187
  </span>
26979
28188
  </div>
@@ -26983,7 +28192,7 @@ var PanelInfoListComponent = class PanelInfoListComponent {
26983
28192
  }
26984
28193
  `,
26985
28194
  isInline: true,
26986
- styles: [":host{display:flex;flex-direction:column;gap:12px}.pil-section{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.pil-section-label{display:flex;justify-content:space-between;align-items:center;font-size:.6875rem;font-weight:700;letter-spacing:.07em;color:#94a3b8;text-transform:uppercase;padding:8px 14px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.pil-header-link{font-size:.75rem;font-weight:500;color:#2563eb;text-decoration:none;text-transform:none;letter-spacing:0}.pil-header-link:hover{text-decoration:underline}.pil-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:9px 14px;border-bottom:1px solid #f1f5f9}.pil-row:last-child{border-bottom:none}.pil-row--inline{justify-content:flex-start}.pil-row--inline .pil-value{text-align:left;justify-content:flex-start;flex-wrap:wrap;min-width:0;overflow-wrap:anywhere;word-break:break-word}.pil-label{font-size:.8125rem;color:#64748b;flex-shrink:0}.pil-value{font-size:.875rem;font-weight:500;color:#1e293b;text-align:right;display:flex;align-items:center;justify-content:flex-end}.pil-multiline{white-space:pre-line;overflow-wrap:anywhere;word-break:break-word}.pil-strong .pil-label,.pil-strong .pil-value,.pil-strong .pil-muted{font-weight:700;color:#0f172a}.pil-badges{display:flex;align-items:center;gap:4px;flex-wrap:wrap;justify-content:flex-end}.pil-edit-btn{margin-left:4px;flex-shrink:0}ui-empty-state{padding:12px 0}.pil-muted{color:#1e293b;font-weight:400}.pil-danger{color:#ef4444;font-weight:600}.pil-link{font-size:.875rem;font-weight:500;color:#2563eb;text-decoration:none}.pil-link:hover{text-decoration:underline}.pil-link--href{overflow-wrap:anywhere;word-break:break-word}.pil-link:focus-visible,.pil-header-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:2px}.pil-link-icon{display:inline-flex;align-items:center;gap:5px;font-size:.875rem;font-weight:500;color:#1e293b;text-decoration:none}.pil-link-icon svg{color:#94a3b8;flex-shrink:0}.pil-grid-2{display:grid;grid-template-columns:1fr 1fr}.pil-grid-cell{display:flex;flex-direction:column;gap:3px;padding:10px 14px;border-right:1px solid #f1f5f9}.pil-grid-cell:last-child{border-right:none}.pil-value--block{text-align:left;justify-content:flex-start}\n"],
28195
+ styles: [":host{display:flex;flex-direction:column;gap:12px}:host(.pil-fill){flex:1;min-height:0}:host(.pil-fill) .pil-section{flex:1}.pil-section{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.pil-section-label{display:flex;justify-content:space-between;align-items:center;font-size:.6875rem;font-weight:700;letter-spacing:.07em;color:#94a3b8;text-transform:uppercase;padding:8px 14px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.pil-header-link{font-size:.75rem;font-weight:500;color:#2563eb;text-decoration:none;text-transform:none;letter-spacing:0}.pil-header-link:hover{text-decoration:underline}.pil-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:9px 14px;border-bottom:1px solid #f1f5f9}.pil-row:last-child{border-bottom:none}.pil-row--inline{justify-content:flex-start}.pil-row--inline .pil-value{text-align:left;justify-content:flex-start;flex-wrap:wrap;min-width:0;overflow-wrap:anywhere;word-break:break-word}.pil-label{font-size:.8125rem;color:#64748b;flex-shrink:0}.pil-value{font-size:.875rem;font-weight:500;color:#1e293b;text-align:right;display:flex;align-items:center;justify-content:flex-end}.pil-multiline{white-space:pre-line;overflow-wrap:anywhere;word-break:break-word}.pil-strong .pil-label,.pil-strong .pil-value,.pil-strong .pil-muted{font-weight:700;color:#0f172a}.pil-badges{display:flex;align-items:center;gap:4px;flex-wrap:wrap;justify-content:flex-end}.pil-edit-btn{margin-left:4px;flex-shrink:0}ui-empty-state{padding:12px 0}.pil-muted{color:#1e293b;font-weight:400}.pil-danger{color:#ef4444;font-weight:600}.pil-link{font-size:.875rem;font-weight:500;color:#2563eb;text-decoration:none}.pil-link:hover{text-decoration:underline}.pil-link--href{overflow-wrap:anywhere;word-break:break-word}.pil-link:focus-visible,.pil-header-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:2px}.pil-link-icon{display:inline-flex;align-items:center;gap:5px;font-size:.875rem;font-weight:500;color:#1e293b;text-decoration:none}.pil-link-icon svg{color:#94a3b8;flex-shrink:0}.pil-grid-2{display:grid;grid-template-columns:1fr 1fr}.pil-grid-cell{display:flex;flex-direction:column;gap:3px;padding:10px 14px;border-right:1px solid #f1f5f9}.pil-grid-cell:last-child{border-right:none}.pil-value--block{text-align:left;justify-content:flex-start}\n"],
26987
28196
  dependencies: [
26988
28197
  {
26989
28198
  kind: "component",
@@ -27022,33 +28231,19 @@ var PanelInfoListComponent = class PanelInfoListComponent {
27022
28231
  },
27023
28232
  {
27024
28233
  kind: "component",
27025
- type: ButtonComponent,
27026
- selector: "ui-button",
28234
+ type: IconComponent,
28235
+ selector: "ui-icon",
27027
28236
  inputs: [
27028
- "variant",
27029
- "routerLink",
27030
- "queryParams",
27031
- "fragment",
27032
- "state",
27033
- "href",
27034
- "target",
27035
- "rel",
27036
- "shortLabel",
27037
- "shortBelow",
27038
- "color",
27039
- "active",
28237
+ "name",
28238
+ "tooltip",
28239
+ "ariaLabel",
27040
28240
  "size",
27041
- "type",
28241
+ "variant",
27042
28242
  "disabled",
27043
28243
  "loading",
27044
- "fullWidth",
27045
- "ariaLabel",
27046
- "ariaExpanded",
27047
- "ariaPressed",
27048
- "ariaDescribedBy",
27049
- "modal-footer-left",
27050
- "modal-footer-right"
27051
- ]
28244
+ "interactive"
28245
+ ],
28246
+ outputs: ["iconClick"]
27052
28247
  }
27053
28248
  ],
27054
28249
  changeDetection: i0.ChangeDetectionStrategy.OnPush
@@ -27070,8 +28265,9 @@ i0.ɵɵngDeclareClassMetadata({
27070
28265
  BadgeComponent,
27071
28266
  RouterLink,
27072
28267
  EmptyStateComponent,
27073
- ButtonComponent
28268
+ IconComponent
27074
28269
  ],
28270
+ host: { "[class.pil-fill]": "fill()" },
27075
28271
  template: `
27076
28272
  @for (section of displaySections(); track section.title ?? $index) {
27077
28273
  <div class="pil-section">
@@ -27128,11 +28324,7 @@ i0.ɵɵngDeclareClassMetadata({
27128
28324
  <span [class.pil-muted]="item.muted" [class.pil-danger]="item.danger" [class.pil-multiline]="item.multiline">{{ item.value || '—' }}</span>
27129
28325
  }
27130
28326
  @if (item.editAction) {
27131
- <ui-button class="pil-edit-btn" variant="icon" size="xs"
27132
- [ariaLabel]="item.editTooltip ?? 'Edit'" [attr.title]="item.editTooltip ?? 'Edit'"
27133
- (click)="item.editAction!()">
27134
- <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>
27135
- </ui-button>
28327
+ <ui-icon class="pil-edit-btn" name="edit" [size]="14" [tooltip]="item.editTooltip ?? 'Edit'" (iconClick)="item.editAction!()" />
27136
28328
  }
27137
28329
  </span>
27138
28330
  </div>
@@ -27141,7 +28333,7 @@ i0.ɵɵngDeclareClassMetadata({
27141
28333
  </div>
27142
28334
  }
27143
28335
  `,
27144
- styles: [":host{display:flex;flex-direction:column;gap:12px}.pil-section{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.pil-section-label{display:flex;justify-content:space-between;align-items:center;font-size:.6875rem;font-weight:700;letter-spacing:.07em;color:#94a3b8;text-transform:uppercase;padding:8px 14px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.pil-header-link{font-size:.75rem;font-weight:500;color:#2563eb;text-decoration:none;text-transform:none;letter-spacing:0}.pil-header-link:hover{text-decoration:underline}.pil-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:9px 14px;border-bottom:1px solid #f1f5f9}.pil-row:last-child{border-bottom:none}.pil-row--inline{justify-content:flex-start}.pil-row--inline .pil-value{text-align:left;justify-content:flex-start;flex-wrap:wrap;min-width:0;overflow-wrap:anywhere;word-break:break-word}.pil-label{font-size:.8125rem;color:#64748b;flex-shrink:0}.pil-value{font-size:.875rem;font-weight:500;color:#1e293b;text-align:right;display:flex;align-items:center;justify-content:flex-end}.pil-multiline{white-space:pre-line;overflow-wrap:anywhere;word-break:break-word}.pil-strong .pil-label,.pil-strong .pil-value,.pil-strong .pil-muted{font-weight:700;color:#0f172a}.pil-badges{display:flex;align-items:center;gap:4px;flex-wrap:wrap;justify-content:flex-end}.pil-edit-btn{margin-left:4px;flex-shrink:0}ui-empty-state{padding:12px 0}.pil-muted{color:#1e293b;font-weight:400}.pil-danger{color:#ef4444;font-weight:600}.pil-link{font-size:.875rem;font-weight:500;color:#2563eb;text-decoration:none}.pil-link:hover{text-decoration:underline}.pil-link--href{overflow-wrap:anywhere;word-break:break-word}.pil-link:focus-visible,.pil-header-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:2px}.pil-link-icon{display:inline-flex;align-items:center;gap:5px;font-size:.875rem;font-weight:500;color:#1e293b;text-decoration:none}.pil-link-icon svg{color:#94a3b8;flex-shrink:0}.pil-grid-2{display:grid;grid-template-columns:1fr 1fr}.pil-grid-cell{display:flex;flex-direction:column;gap:3px;padding:10px 14px;border-right:1px solid #f1f5f9}.pil-grid-cell:last-child{border-right:none}.pil-value--block{text-align:left;justify-content:flex-start}\n"]
28336
+ styles: [":host{display:flex;flex-direction:column;gap:12px}:host(.pil-fill){flex:1;min-height:0}:host(.pil-fill) .pil-section{flex:1}.pil-section{border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.pil-section-label{display:flex;justify-content:space-between;align-items:center;font-size:.6875rem;font-weight:700;letter-spacing:.07em;color:#94a3b8;text-transform:uppercase;padding:8px 14px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.pil-header-link{font-size:.75rem;font-weight:500;color:#2563eb;text-decoration:none;text-transform:none;letter-spacing:0}.pil-header-link:hover{text-decoration:underline}.pil-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:9px 14px;border-bottom:1px solid #f1f5f9}.pil-row:last-child{border-bottom:none}.pil-row--inline{justify-content:flex-start}.pil-row--inline .pil-value{text-align:left;justify-content:flex-start;flex-wrap:wrap;min-width:0;overflow-wrap:anywhere;word-break:break-word}.pil-label{font-size:.8125rem;color:#64748b;flex-shrink:0}.pil-value{font-size:.875rem;font-weight:500;color:#1e293b;text-align:right;display:flex;align-items:center;justify-content:flex-end}.pil-multiline{white-space:pre-line;overflow-wrap:anywhere;word-break:break-word}.pil-strong .pil-label,.pil-strong .pil-value,.pil-strong .pil-muted{font-weight:700;color:#0f172a}.pil-badges{display:flex;align-items:center;gap:4px;flex-wrap:wrap;justify-content:flex-end}.pil-edit-btn{margin-left:4px;flex-shrink:0}ui-empty-state{padding:12px 0}.pil-muted{color:#1e293b;font-weight:400}.pil-danger{color:#ef4444;font-weight:600}.pil-link{font-size:.875rem;font-weight:500;color:#2563eb;text-decoration:none}.pil-link:hover{text-decoration:underline}.pil-link--href{overflow-wrap:anywhere;word-break:break-word}.pil-link:focus-visible,.pil-header-link:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:2px}.pil-link-icon{display:inline-flex;align-items:center;gap:5px;font-size:.875rem;font-weight:500;color:#1e293b;text-decoration:none}.pil-link-icon svg{color:#94a3b8;flex-shrink:0}.pil-grid-2{display:grid;grid-template-columns:1fr 1fr}.pil-grid-cell{display:flex;flex-direction:column;gap:3px;padding:10px 14px;border-right:1px solid #f1f5f9}.pil-grid-cell:last-child{border-right:none}.pil-value--block{text-align:left;justify-content:flex-start}\n"]
27145
28337
  }]
27146
28338
  }],
27147
28339
  propDecorators: {
@@ -27168,6 +28360,14 @@ i0.ɵɵngDeclareClassMetadata({
27168
28360
  alias: "labelColon",
27169
28361
  required: false
27170
28362
  }]
28363
+ }],
28364
+ fill: [{
28365
+ type: i0.Input,
28366
+ args: [{
28367
+ isSignal: true,
28368
+ alias: "fill",
28369
+ required: false
28370
+ }]
27171
28371
  }]
27172
28372
  }
27173
28373
  });
@@ -27298,75 +28498,6 @@ i0.ɵɵngDeclareClassMetadata({
27298
28498
  }]
27299
28499
  }
27300
28500
  });
27301
- const ACTION_VERB = {
27302
- load: "loading",
27303
- save: "saving",
27304
- create: "creating",
27305
- update: "updating",
27306
- delete: "deleting",
27307
- send: "sending",
27308
- export: "exporting",
27309
- import: "importing",
27310
- upload: "uploading",
27311
- download: "downloading"
27312
- };
27313
- const ACTION_PERMISSION_VERB = {
27314
- load: "access",
27315
- save: "save",
27316
- create: "create",
27317
- update: "update",
27318
- delete: "delete",
27319
- send: "send",
27320
- export: "export",
27321
- import: "import",
27322
- upload: "upload",
27323
- download: "download"
27324
- };
27325
- const REQUEST_METHOD = "__forgerouteRequestMethod";
27326
- const errorContextInterceptor = (req, next) => next(req).pipe(catchError$1((err) => {
27327
- if (err instanceof HttpErrorResponse && !(REQUEST_METHOD in err)) Object.defineProperty(err, REQUEST_METHOD, {
27328
- value: req.method.toUpperCase(),
27329
- enumerable: false
27330
- });
27331
- return throwError(() => err);
27332
- }));
27333
- function actionFromMethod(error) {
27334
- switch (error[REQUEST_METHOD]) {
27335
- case "POST":
27336
- case "PUT":
27337
- case "PATCH": return "save";
27338
- case "DELETE": return "delete";
27339
- default: return "load";
27340
- }
27341
- }
27342
- function withoutLeadingArticle(ctx) {
27343
- return ctx.replace(/^(?:the|an?)\s+/i, "") || ctx;
27344
- }
27345
- function getErrorMessage(error, fallbackContext, action) {
27346
- const ctx = fallbackContext?.trim() || "data";
27347
- const act = action ?? (error instanceof HttpErrorResponse ? actionFromMethod(error) : "load");
27348
- const failed = `There was an error ${ACTION_VERB[act]} ${ctx}.`;
27349
- if (error instanceof HttpErrorResponse) {
27350
- if (error.error?.message) return error.error.message;
27351
- if (typeof error.error === "string" && error.error.length < 200) return error.error;
27352
- switch (error.status) {
27353
- case 0: return `${failed} Please check your connection and try again.`;
27354
- case 401: return "Your session has expired. Please log in again.";
27355
- case 403: return `You don't have permission to ${ACTION_PERMISSION_VERB[act]} ${ctx}.`;
27356
- case 404: return `The ${withoutLeadingArticle(ctx)} you're looking for could not be found.`;
27357
- case 408: return `${failed} The request timed out — please try again.`;
27358
- case 422: return "The data you submitted is invalid. Please check your input and try again.";
27359
- case 429: return `${failed} Too many requests — please wait a moment and try again.`;
27360
- case 502:
27361
- case 503:
27362
- case 504: return `${failed} Please try again in a few minutes.`;
27363
- default: return `${failed} Please try again.`;
27364
- }
27365
- }
27366
- if (error instanceof Error) return error.message;
27367
- if (typeof error === "string") return error;
27368
- return `${failed} Please try again.`;
27369
- }
27370
28501
  const US_STATES = [
27371
28502
  {
27372
28503
  value: "AL",
@@ -28416,6 +29547,98 @@ var TimelineComponent = class TimelineComponent {
28416
29547
  this.emptyMessage = input("", ...ngDevMode ? [{ debugName: "emptyMessage" }] : /* istanbul ignore next */ []);
28417
29548
  this.maxHeight = input("", ...ngDevMode ? [{ debugName: "maxHeight" }] : /* istanbul ignore next */ []);
28418
29549
  this.timePosition = input("below", ...ngDevMode ? [{ debugName: "timePosition" }] : /* istanbul ignore next */ []);
29550
+ this.groupByDay = input(false, ...ngDevMode ? [{ debugName: "groupByDay" }] : /* istanbul ignore next */ []);
29551
+ this.timeZone = input("", ...ngDevMode ? [{ debugName: "timeZone" }] : /* istanbul ignore next */ []);
29552
+ this.now = input(null, ...ngDevMode ? [{ debugName: "now" }] : /* istanbul ignore next */ []);
29553
+ this.dayHeadingLevel = input(3, ...ngDevMode ? [{ debugName: "dayHeadingLevel" }] : /* istanbul ignore next */ []);
29554
+ this.headingLevel = computed(() => {
29555
+ const n = this.dayHeadingLevel();
29556
+ return Number.isInteger(n) && n >= 1 && n <= 6 ? n : 3;
29557
+ }, ...ngDevMode ? [{ debugName: "headingLevel" }] : /* istanbul ignore next */ []);
29558
+ this.groups = computed(() => {
29559
+ if (!this.groupByDay()) return [];
29560
+ const zone = this.timeZone() || void 0;
29561
+ let fmt;
29562
+ try {
29563
+ fmt = new Intl.DateTimeFormat("en-US", {
29564
+ timeZone: zone,
29565
+ year: "numeric",
29566
+ month: "2-digit",
29567
+ day: "2-digit"
29568
+ });
29569
+ } catch {
29570
+ fmt = new Intl.DateTimeFormat("en-US", {
29571
+ year: "numeric",
29572
+ month: "2-digit",
29573
+ day: "2-digit"
29574
+ });
29575
+ }
29576
+ const parts = (d) => {
29577
+ const p = fmt.formatToParts(d);
29578
+ const get = (t) => Number(p.find((x) => x.type === t)?.value);
29579
+ return {
29580
+ y: get("year"),
29581
+ m: get("month"),
29582
+ d: get("day")
29583
+ };
29584
+ };
29585
+ const keyOf = (v) => `${v.y}-${String(v.m).padStart(2, "0")}-${String(v.d).padStart(2, "0")}`;
29586
+ const nowRaw = this.now();
29587
+ let nowDate = nowRaw == null ? /* @__PURE__ */ new Date() : new Date(nowRaw);
29588
+ if (isNaN(nowDate.getTime())) nowDate = /* @__PURE__ */ new Date();
29589
+ const t = parts(nowDate);
29590
+ const todayKey = keyOf(t);
29591
+ const yd = new Date(Date.UTC(t.y, t.m - 1, t.d - 1));
29592
+ const yesterdayKey = keyOf({
29593
+ y: yd.getUTCFullYear(),
29594
+ m: yd.getUTCMonth() + 1,
29595
+ d: yd.getUTCDate()
29596
+ });
29597
+ const labelFmt = (withYear, tz) => new Intl.DateTimeFormat("en-US", {
29598
+ timeZone: tz,
29599
+ month: "short",
29600
+ day: "numeric",
29601
+ ...withYear ? { year: "numeric" } : {}
29602
+ });
29603
+ const label = (v) => keyOf(v) === todayKey ? "Today" : keyOf(v) === yesterdayKey ? "Yesterday" : labelFmt(v.y !== t.y, "UTC").format(new Date(Date.UTC(v.y, v.m - 1, v.d)));
29604
+ const dayOf = (iso) => {
29605
+ const m = iso ? /^(\d{4})-(\d{2})-(\d{2})(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.\d+)?)?(Z|[+-]\d{2}:?\d{2})?)?$/.exec(iso) : null;
29606
+ if (!m) return null;
29607
+ const y = Number(m[1]), mo = Number(m[2]), d = Number(m[3]);
29608
+ const probe = new Date(Date.UTC(y, mo - 1, d));
29609
+ if (probe.getUTCFullYear() !== y || probe.getUTCMonth() !== mo - 1 || probe.getUTCDate() !== d) return null;
29610
+ if (m[4] !== void 0 && (Number(m[4]) > 23 || Number(m[5]) > 59 || m[6] !== void 0 && Number(m[6]) > 59)) return null;
29611
+ if (m[7] === void 0) return {
29612
+ y,
29613
+ m: mo,
29614
+ d
29615
+ };
29616
+ const inst = new Date(iso.replace(/([+-]\d{2})(\d{2})$/, "$1:$2"));
29617
+ return isNaN(inst.getTime()) ? null : parts(inst);
29618
+ };
29619
+ const groups = [];
29620
+ for (const item of this.items()) {
29621
+ const v = dayOf(item.dateTime);
29622
+ const last = groups[groups.length - 1];
29623
+ if (!v) {
29624
+ if (last) last.items.push(item);
29625
+ else groups.push({
29626
+ key: "",
29627
+ label: "",
29628
+ items: [item]
29629
+ });
29630
+ continue;
29631
+ }
29632
+ const key = keyOf(v);
29633
+ if (last && last.key === key) last.items.push(item);
29634
+ else groups.push({
29635
+ key,
29636
+ label: label(v),
29637
+ items: [item]
29638
+ });
29639
+ }
29640
+ return groups;
29641
+ }, ...ngDevMode ? [{ debugName: "groups" }] : /* istanbul ignore next */ []);
28419
29642
  }
28420
29643
  dotColor(item) {
28421
29644
  return item.dotVariant ? BADGE_VARIANT_STYLES[item.dotVariant]?.color ?? null : null;
@@ -28472,6 +29695,34 @@ var TimelineComponent = class TimelineComponent {
28472
29695
  isSignal: true,
28473
29696
  isRequired: false,
28474
29697
  transformFunction: null
29698
+ },
29699
+ groupByDay: {
29700
+ classPropertyName: "groupByDay",
29701
+ publicName: "groupByDay",
29702
+ isSignal: true,
29703
+ isRequired: false,
29704
+ transformFunction: null
29705
+ },
29706
+ timeZone: {
29707
+ classPropertyName: "timeZone",
29708
+ publicName: "timeZone",
29709
+ isSignal: true,
29710
+ isRequired: false,
29711
+ transformFunction: null
29712
+ },
29713
+ now: {
29714
+ classPropertyName: "now",
29715
+ publicName: "now",
29716
+ isSignal: true,
29717
+ isRequired: false,
29718
+ transformFunction: null
29719
+ },
29720
+ dayHeadingLevel: {
29721
+ classPropertyName: "dayHeadingLevel",
29722
+ publicName: "dayHeadingLevel",
29723
+ isSignal: true,
29724
+ isRequired: false,
29725
+ transformFunction: null
28475
29726
  }
28476
29727
  },
28477
29728
  ngImport: i0,
@@ -28488,29 +29739,47 @@ var TimelineComponent = class TimelineComponent {
28488
29739
  <ui-hint class="tl-empty">{{ emptyMessage() }}</ui-hint>
28489
29740
  }
28490
29741
  <ng-template #listTpl>
28491
- <ol class="tl" [attr.aria-label]="ariaLabel() || null">
28492
- @for (item of items(); track item.id ?? $index) {
28493
- <li [attr.data-testid]="item.testId || null" class="tl-item" [class]="'tl-item tl-item--' + (item.tone ?? 'default')" [class.tl-item--icon]="!!item.icon" [style.--tl-color]="dotColor(item)">
28494
- <span class="tl-marker" aria-hidden="true">
28495
- @if (item.icon) { <ui-icon [name]="item.icon" [interactive]="false" [size]="12" /> }
28496
- </span>
28497
- <div class="tl-content">
28498
- <div class="tl-head">
28499
- <span class="tl-title">{{ item.title }}</span>
28500
- @if (item.badge) { <ng-container [ngTemplateOutlet]="badgeTpl" [ngTemplateOutletContext]="{ $implicit: item.badge }" /> }
28501
- @for (b of item.badges ?? []; track $index) { <ng-container [ngTemplateOutlet]="badgeTpl" [ngTemplateOutletContext]="{ $implicit: b }" /> }
28502
- @if (timePosition() === 'end' && (item.time || item.dateTime)) {
28503
- <time class="tl-time tl-time--end" [attr.datetime]="item.dateTime || null">{{ item.time || item.dateTime }}</time>
29742
+ @if (groupByDay()) {
29743
+ <ol class="tl tl-grouped" [attr.aria-label]="ariaLabel() || null">
29744
+ @for (g of groups(); track $index) {
29745
+ <li class="tl-day-group" [attr.data-day]="g.key || null">
29746
+ @if (g.label) { <div class="tl-day" role="heading" [attr.aria-level]="headingLevel()">{{ g.label }}</div> }
29747
+ <ol class="tl-sub">
29748
+ @for (item of g.items; track item.id ?? $index) {
29749
+ <ng-container [ngTemplateOutlet]="itemTpl" [ngTemplateOutletContext]="{ $implicit: item }" />
28504
29750
  }
28505
- </div>
28506
- @if (item.description) { <p class="tl-description">{{ item.description }}</p> }
28507
- @if (timePosition() !== 'end' && (item.time || item.dateTime)) {
28508
- <time class="tl-time" [attr.datetime]="item.dateTime || null">{{ item.time || item.dateTime }}</time>
28509
- }
28510
- </div>
28511
- </li>
28512
- }
28513
- </ol>
29751
+ </ol>
29752
+ </li>
29753
+ }
29754
+ </ol>
29755
+ } @else {
29756
+ <ol class="tl" [attr.aria-label]="ariaLabel() || null">
29757
+ @for (item of items(); track item.id ?? $index) {
29758
+ <ng-container [ngTemplateOutlet]="itemTpl" [ngTemplateOutletContext]="{ $implicit: item }" />
29759
+ }
29760
+ </ol>
29761
+ }
29762
+ </ng-template>
29763
+ <ng-template #itemTpl let-item>
29764
+ <li [attr.data-testid]="item.testId || null" class="tl-item" [class]="'tl-item tl-item--' + (item.tone ?? 'default')" [class.tl-item--icon]="!!item.icon" [style.--tl-color]="dotColor(item)">
29765
+ <span class="tl-marker" aria-hidden="true">
29766
+ @if (item.icon) { <ui-icon [name]="item.icon" [interactive]="false" [size]="12" /> }
29767
+ </span>
29768
+ <div class="tl-content">
29769
+ <div class="tl-head">
29770
+ <span class="tl-title">{{ item.title }}</span>
29771
+ @if (item.badge) { <ng-container [ngTemplateOutlet]="badgeTpl" [ngTemplateOutletContext]="{ $implicit: item.badge }" /> }
29772
+ @for (b of item.badges ?? []; track $index) { <ng-container [ngTemplateOutlet]="badgeTpl" [ngTemplateOutletContext]="{ $implicit: b }" /> }
29773
+ @if (timePosition() === 'end' && (item.time || item.dateTime)) {
29774
+ <time class="tl-time tl-time--end" [attr.datetime]="item.dateTime || null">{{ item.time || item.dateTime }}</time>
29775
+ }
29776
+ </div>
29777
+ @if (item.description) { <p class="tl-description">{{ item.description }}</p> }
29778
+ @if (timePosition() !== 'end' && (item.time || item.dateTime)) {
29779
+ <time class="tl-time" [attr.datetime]="item.dateTime || null">{{ item.time || item.dateTime }}</time>
29780
+ }
29781
+ </div>
29782
+ </li>
28514
29783
  </ng-template>
28515
29784
  <ng-template #badgeTpl let-b>
28516
29785
  @if (b.tooltip) {
@@ -28521,7 +29790,7 @@ var TimelineComponent = class TimelineComponent {
28521
29790
  </ng-template>
28522
29791
  `,
28523
29792
  isInline: true,
28524
- styles: [":host{display:block}.tl{list-style:none;margin:0;padding:0}.tl-item{position:relative;display:flex;gap:12px;padding-bottom:16px;--tl-color: #475569}.tl-item:last-child{padding-bottom:0}.tl-item:before{content:\"\";position:absolute;left:7px;top:18px;bottom:-2px;width:2px;background:#e2e8f0}.tl-item:last-child:before{display:none}.tl-item--success{--tl-color: #15803d}.tl-item--warning{--tl-color: #b45309}.tl-item--danger{--tl-color: #b91c1c}.tl-marker{flex-shrink:0;box-sizing:border-box;width:16px;height:16px;margin-top:2px;border-radius:50%;background:var(--tl-color);border:3px solid #fff;box-shadow:0 0 0 1px var(--tl-color);display:inline-flex;align-items:center;justify-content:center;position:relative;z-index:1}.tl-item--icon .tl-marker{border:none;box-shadow:none;color:#fff}.tl-content{flex:1;min-width:0;overflow-wrap:anywhere;word-break:break-word}.tl-head{display:flex;align-items:center;flex-wrap:wrap;gap:4px 8px}.tl-badge-tip{display:inline-flex;border-radius:999px}.tl-badge-tip:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.tl-time--end{display:inline;margin:0 0 0 auto;padding-left:8px;white-space:nowrap}.tl-scroll{overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;padding-right:8px}.tl-scroll:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:4px}.tl-title{font-size:.875rem;font-weight:600;color:#1e293b;line-height:1.4}.tl-description{margin:2px 0 0;font-size:.8125rem;line-height:1.5;color:#475569}.tl-time{display:block;margin-top:2px;font-size:.75rem;color:#64748b}\n"],
29793
+ styles: [":host{display:block}.tl,.tl-sub{list-style:none;margin:0;padding:0}.tl-day-group+.tl-day-group{margin-top:16px}.tl-day{margin:0 0 10px;font-size:.6875rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;line-height:1.2;color:#64748b}.tl-item{position:relative;display:flex;gap:12px;padding-bottom:16px;--tl-color: #475569}.tl-item:last-child{padding-bottom:0}.tl-item:before{content:\"\";position:absolute;left:7px;top:18px;bottom:-2px;width:2px;background:#e2e8f0}.tl-item:last-child:before{display:none}.tl-item--success{--tl-color: #15803d}.tl-item--warning{--tl-color: #b45309}.tl-item--danger{--tl-color: #b91c1c}.tl-marker{flex-shrink:0;box-sizing:border-box;width:16px;height:16px;margin-top:2px;border-radius:50%;background:var(--tl-color);border:3px solid #fff;box-shadow:0 0 0 1px var(--tl-color);display:inline-flex;align-items:center;justify-content:center;position:relative;z-index:1}.tl-item--icon .tl-marker{border:none;box-shadow:none;color:#fff}.tl-content{flex:1;min-width:0;overflow-wrap:anywhere;word-break:break-word}.tl-head{display:flex;align-items:center;flex-wrap:wrap;gap:4px 8px}.tl-badge-tip{display:inline-flex;border-radius:999px}.tl-badge-tip:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.tl-time--end{display:inline;margin:0 0 0 auto;padding-left:8px;white-space:nowrap}.tl-scroll{overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;padding-right:8px}.tl-scroll:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:4px}.tl-title{font-size:.875rem;font-weight:600;color:#1e293b;line-height:1.4}.tl-description{margin:2px 0 0;font-size:.8125rem;line-height:1.5;color:#475569}.tl-time{display:block;margin-top:2px;font-size:.75rem;color:#64748b}\n"],
28525
29794
  dependencies: [
28526
29795
  {
28527
29796
  kind: "component",
@@ -28602,29 +29871,47 @@ i0.ɵɵngDeclareClassMetadata({
28602
29871
  <ui-hint class="tl-empty">{{ emptyMessage() }}</ui-hint>
28603
29872
  }
28604
29873
  <ng-template #listTpl>
28605
- <ol class="tl" [attr.aria-label]="ariaLabel() || null">
28606
- @for (item of items(); track item.id ?? $index) {
28607
- <li [attr.data-testid]="item.testId || null" class="tl-item" [class]="'tl-item tl-item--' + (item.tone ?? 'default')" [class.tl-item--icon]="!!item.icon" [style.--tl-color]="dotColor(item)">
28608
- <span class="tl-marker" aria-hidden="true">
28609
- @if (item.icon) { <ui-icon [name]="item.icon" [interactive]="false" [size]="12" /> }
28610
- </span>
28611
- <div class="tl-content">
28612
- <div class="tl-head">
28613
- <span class="tl-title">{{ item.title }}</span>
28614
- @if (item.badge) { <ng-container [ngTemplateOutlet]="badgeTpl" [ngTemplateOutletContext]="{ $implicit: item.badge }" /> }
28615
- @for (b of item.badges ?? []; track $index) { <ng-container [ngTemplateOutlet]="badgeTpl" [ngTemplateOutletContext]="{ $implicit: b }" /> }
28616
- @if (timePosition() === 'end' && (item.time || item.dateTime)) {
28617
- <time class="tl-time tl-time--end" [attr.datetime]="item.dateTime || null">{{ item.time || item.dateTime }}</time>
29874
+ @if (groupByDay()) {
29875
+ <ol class="tl tl-grouped" [attr.aria-label]="ariaLabel() || null">
29876
+ @for (g of groups(); track $index) {
29877
+ <li class="tl-day-group" [attr.data-day]="g.key || null">
29878
+ @if (g.label) { <div class="tl-day" role="heading" [attr.aria-level]="headingLevel()">{{ g.label }}</div> }
29879
+ <ol class="tl-sub">
29880
+ @for (item of g.items; track item.id ?? $index) {
29881
+ <ng-container [ngTemplateOutlet]="itemTpl" [ngTemplateOutletContext]="{ $implicit: item }" />
28618
29882
  }
28619
- </div>
28620
- @if (item.description) { <p class="tl-description">{{ item.description }}</p> }
28621
- @if (timePosition() !== 'end' && (item.time || item.dateTime)) {
28622
- <time class="tl-time" [attr.datetime]="item.dateTime || null">{{ item.time || item.dateTime }}</time>
28623
- }
28624
- </div>
28625
- </li>
28626
- }
28627
- </ol>
29883
+ </ol>
29884
+ </li>
29885
+ }
29886
+ </ol>
29887
+ } @else {
29888
+ <ol class="tl" [attr.aria-label]="ariaLabel() || null">
29889
+ @for (item of items(); track item.id ?? $index) {
29890
+ <ng-container [ngTemplateOutlet]="itemTpl" [ngTemplateOutletContext]="{ $implicit: item }" />
29891
+ }
29892
+ </ol>
29893
+ }
29894
+ </ng-template>
29895
+ <ng-template #itemTpl let-item>
29896
+ <li [attr.data-testid]="item.testId || null" class="tl-item" [class]="'tl-item tl-item--' + (item.tone ?? 'default')" [class.tl-item--icon]="!!item.icon" [style.--tl-color]="dotColor(item)">
29897
+ <span class="tl-marker" aria-hidden="true">
29898
+ @if (item.icon) { <ui-icon [name]="item.icon" [interactive]="false" [size]="12" /> }
29899
+ </span>
29900
+ <div class="tl-content">
29901
+ <div class="tl-head">
29902
+ <span class="tl-title">{{ item.title }}</span>
29903
+ @if (item.badge) { <ng-container [ngTemplateOutlet]="badgeTpl" [ngTemplateOutletContext]="{ $implicit: item.badge }" /> }
29904
+ @for (b of item.badges ?? []; track $index) { <ng-container [ngTemplateOutlet]="badgeTpl" [ngTemplateOutletContext]="{ $implicit: b }" /> }
29905
+ @if (timePosition() === 'end' && (item.time || item.dateTime)) {
29906
+ <time class="tl-time tl-time--end" [attr.datetime]="item.dateTime || null">{{ item.time || item.dateTime }}</time>
29907
+ }
29908
+ </div>
29909
+ @if (item.description) { <p class="tl-description">{{ item.description }}</p> }
29910
+ @if (timePosition() !== 'end' && (item.time || item.dateTime)) {
29911
+ <time class="tl-time" [attr.datetime]="item.dateTime || null">{{ item.time || item.dateTime }}</time>
29912
+ }
29913
+ </div>
29914
+ </li>
28628
29915
  </ng-template>
28629
29916
  <ng-template #badgeTpl let-b>
28630
29917
  @if (b.tooltip) {
@@ -28634,7 +29921,7 @@ i0.ɵɵngDeclareClassMetadata({
28634
29921
  }
28635
29922
  </ng-template>
28636
29923
  `,
28637
- styles: [":host{display:block}.tl{list-style:none;margin:0;padding:0}.tl-item{position:relative;display:flex;gap:12px;padding-bottom:16px;--tl-color: #475569}.tl-item:last-child{padding-bottom:0}.tl-item:before{content:\"\";position:absolute;left:7px;top:18px;bottom:-2px;width:2px;background:#e2e8f0}.tl-item:last-child:before{display:none}.tl-item--success{--tl-color: #15803d}.tl-item--warning{--tl-color: #b45309}.tl-item--danger{--tl-color: #b91c1c}.tl-marker{flex-shrink:0;box-sizing:border-box;width:16px;height:16px;margin-top:2px;border-radius:50%;background:var(--tl-color);border:3px solid #fff;box-shadow:0 0 0 1px var(--tl-color);display:inline-flex;align-items:center;justify-content:center;position:relative;z-index:1}.tl-item--icon .tl-marker{border:none;box-shadow:none;color:#fff}.tl-content{flex:1;min-width:0;overflow-wrap:anywhere;word-break:break-word}.tl-head{display:flex;align-items:center;flex-wrap:wrap;gap:4px 8px}.tl-badge-tip{display:inline-flex;border-radius:999px}.tl-badge-tip:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.tl-time--end{display:inline;margin:0 0 0 auto;padding-left:8px;white-space:nowrap}.tl-scroll{overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;padding-right:8px}.tl-scroll:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:4px}.tl-title{font-size:.875rem;font-weight:600;color:#1e293b;line-height:1.4}.tl-description{margin:2px 0 0;font-size:.8125rem;line-height:1.5;color:#475569}.tl-time{display:block;margin-top:2px;font-size:.75rem;color:#64748b}\n"]
29924
+ styles: [":host{display:block}.tl,.tl-sub{list-style:none;margin:0;padding:0}.tl-day-group+.tl-day-group{margin-top:16px}.tl-day{margin:0 0 10px;font-size:.6875rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;line-height:1.2;color:#64748b}.tl-item{position:relative;display:flex;gap:12px;padding-bottom:16px;--tl-color: #475569}.tl-item:last-child{padding-bottom:0}.tl-item:before{content:\"\";position:absolute;left:7px;top:18px;bottom:-2px;width:2px;background:#e2e8f0}.tl-item:last-child:before{display:none}.tl-item--success{--tl-color: #15803d}.tl-item--warning{--tl-color: #b45309}.tl-item--danger{--tl-color: #b91c1c}.tl-marker{flex-shrink:0;box-sizing:border-box;width:16px;height:16px;margin-top:2px;border-radius:50%;background:var(--tl-color);border:3px solid #fff;box-shadow:0 0 0 1px var(--tl-color);display:inline-flex;align-items:center;justify-content:center;position:relative;z-index:1}.tl-item--icon .tl-marker{border:none;box-shadow:none;color:#fff}.tl-content{flex:1;min-width:0;overflow-wrap:anywhere;word-break:break-word}.tl-head{display:flex;align-items:center;flex-wrap:wrap;gap:4px 8px}.tl-badge-tip{display:inline-flex;border-radius:999px}.tl-badge-tip:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.tl-time--end{display:inline;margin:0 0 0 auto;padding-left:8px;white-space:nowrap}.tl-scroll{overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;padding-right:8px}.tl-scroll:focus-visible{outline:2px solid #3b82f6;outline-offset:2px;border-radius:4px}.tl-title{font-size:.875rem;font-weight:600;color:#1e293b;line-height:1.4}.tl-description{margin:2px 0 0;font-size:.8125rem;line-height:1.5;color:#475569}.tl-time{display:block;margin-top:2px;font-size:.75rem;color:#64748b}\n"]
28638
29925
  }]
28639
29926
  }],
28640
29927
  propDecorators: {
@@ -28677,6 +29964,38 @@ i0.ɵɵngDeclareClassMetadata({
28677
29964
  alias: "timePosition",
28678
29965
  required: false
28679
29966
  }]
29967
+ }],
29968
+ groupByDay: [{
29969
+ type: i0.Input,
29970
+ args: [{
29971
+ isSignal: true,
29972
+ alias: "groupByDay",
29973
+ required: false
29974
+ }]
29975
+ }],
29976
+ timeZone: [{
29977
+ type: i0.Input,
29978
+ args: [{
29979
+ isSignal: true,
29980
+ alias: "timeZone",
29981
+ required: false
29982
+ }]
29983
+ }],
29984
+ now: [{
29985
+ type: i0.Input,
29986
+ args: [{
29987
+ isSignal: true,
29988
+ alias: "now",
29989
+ required: false
29990
+ }]
29991
+ }],
29992
+ dayHeadingLevel: [{
29993
+ type: i0.Input,
29994
+ args: [{
29995
+ isSignal: true,
29996
+ alias: "dayHeadingLevel",
29997
+ required: false
29998
+ }]
28680
29999
  }]
28681
30000
  }
28682
30001
  });
@@ -33305,6 +34624,7 @@ var DetailCardComponent = class DetailCardComponent {
33305
34624
  this.subtitle = input("", ...ngDevMode ? [{ debugName: "subtitle" }] : /* istanbul ignore next */ []);
33306
34625
  this.background = input("", ...ngDevMode ? [{ debugName: "background" }] : /* istanbul ignore next */ []);
33307
34626
  this.headerBackground = input("", ...ngDevMode ? [{ debugName: "headerBackground" }] : /* istanbul ignore next */ []);
34627
+ this.footerBackground = input("", ...ngDevMode ? [{ debugName: "footerBackground" }] : /* istanbul ignore next */ []);
33308
34628
  this.textColor = input("", ...ngDevMode ? [{ debugName: "textColor" }] : /* istanbul ignore next */ []);
33309
34629
  this.showHeader = input(true, ...ngDevMode ? [{ debugName: "showHeader" }] : /* istanbul ignore next */ []);
33310
34630
  this.collapsible = input(true, ...ngDevMode ? [{ debugName: "collapsible" }] : /* istanbul ignore next */ []);
@@ -33421,6 +34741,13 @@ var DetailCardComponent = class DetailCardComponent {
33421
34741
  isRequired: false,
33422
34742
  transformFunction: null
33423
34743
  },
34744
+ footerBackground: {
34745
+ classPropertyName: "footerBackground",
34746
+ publicName: "footerBackground",
34747
+ isSignal: true,
34748
+ isRequired: false,
34749
+ transformFunction: null
34750
+ },
33424
34751
  textColor: {
33425
34752
  classPropertyName: "textColor",
33426
34753
  publicName: "textColor",
@@ -33578,10 +34905,11 @@ var DetailCardComponent = class DetailCardComponent {
33578
34905
  <ng-content />
33579
34906
  </div>
33580
34907
  </div>
34908
+ <div class="dc-footer" [class.dc-footer--hidden]="!isOpen()" [style.background]="footerBackground() || null"><ng-content select="[card-footer]" /></div>
33581
34909
  </div>
33582
34910
  `,
33583
34911
  isInline: true,
33584
- 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:.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"],
34912
+ 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"],
33585
34913
  dependencies: [{
33586
34914
  kind: "component",
33587
34915
  type: ButtonComponent,
@@ -33678,9 +35006,10 @@ i0.ɵɵngDeclareClassMetadata({
33678
35006
  <ng-content />
33679
35007
  </div>
33680
35008
  </div>
35009
+ <div class="dc-footer" [class.dc-footer--hidden]="!isOpen()" [style.background]="footerBackground() || null"><ng-content select="[card-footer]" /></div>
33681
35010
  </div>
33682
35011
  `,
33683
- 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:.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"]
35012
+ 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"]
33684
35013
  }]
33685
35014
  }],
33686
35015
  propDecorators: {
@@ -33748,6 +35077,14 @@ i0.ɵɵngDeclareClassMetadata({
33748
35077
  required: false
33749
35078
  }]
33750
35079
  }],
35080
+ footerBackground: [{
35081
+ type: i0.Input,
35082
+ args: [{
35083
+ isSignal: true,
35084
+ alias: "footerBackground",
35085
+ required: false
35086
+ }]
35087
+ }],
33751
35088
  textColor: [{
33752
35089
  type: i0.Input,
33753
35090
  args: [{
@@ -33980,6 +35317,10 @@ i0.ɵɵngDeclareClassMetadata({
33980
35317
  });
33981
35318
  var BoardCardDirective = class BoardCardDirective {
33982
35319
  constructor() {
35320
+ this.typeFrom = input("", {
35321
+ ...ngDevMode ? { debugName: "typeFrom" } : /* istanbul ignore next */ {},
35322
+ alias: "uiBoardCard"
35323
+ });
33983
35324
  this.template = inject(TemplateRef);
33984
35325
  }
33985
35326
  static ngTemplateContextGuard(_dir, _ctx) {
@@ -33997,11 +35338,18 @@ var BoardCardDirective = class BoardCardDirective {
33997
35338
  }
33998
35339
  static {
33999
35340
  this.ɵdir = i0.ɵɵngDeclareDirective({
34000
- minVersion: "14.0.0",
35341
+ minVersion: "17.1.0",
34001
35342
  version: "22.2.2",
34002
35343
  type: BoardCardDirective,
34003
35344
  isStandalone: true,
34004
35345
  selector: "ng-template[uiBoardCard]",
35346
+ inputs: { typeFrom: {
35347
+ classPropertyName: "typeFrom",
35348
+ publicName: "uiBoardCard",
35349
+ isSignal: true,
35350
+ isRequired: false,
35351
+ transformFunction: null
35352
+ } },
34005
35353
  ngImport: i0
34006
35354
  });
34007
35355
  }
@@ -34017,8 +35365,17 @@ i0.ɵɵngDeclareClassMetadata({
34017
35365
  selector: "ng-template[uiBoardCard]",
34018
35366
  standalone: true
34019
35367
  }]
34020
- }]
35368
+ }],
35369
+ propDecorators: { typeFrom: [{
35370
+ type: i0.Input,
35371
+ args: [{
35372
+ isSignal: true,
35373
+ alias: "uiBoardCard",
35374
+ required: false
35375
+ }]
35376
+ }] }
34021
35377
  });
35378
+ let nextBoardId = 0;
34022
35379
  const DOT_COLORS = {
34023
35380
  blue: "#3b82f6",
34024
35381
  cyan: "#06b6d4",
@@ -34032,6 +35389,25 @@ const DOT_COLORS = {
34032
35389
  gray: "#6b7280"
34033
35390
  };
34034
35391
  var BoardComponent = class BoardComponent {
35392
+ limitOf(col) {
35393
+ const size = this.pageSize() > 0 ? Math.floor(this.pageSize()) : 0;
35394
+ if (!size) return col.items.length;
35395
+ let limit = this.drawn()[col.key] ?? size;
35396
+ const moved = this.movedTo();
35397
+ if (moved?.to === col.key) limit = Math.max(limit, col.items.findIndex((i) => this.itemKey()(i) === moved.key) + 1);
35398
+ return limit;
35399
+ }
35400
+ showMore(key) {
35401
+ const size = Math.floor(this.pageSize());
35402
+ const col = this.cols().find((c) => c.key === key);
35403
+ if (!col || size < 1) return;
35404
+ const limit = Math.min(col.items.length, this.limitOf(col) + size);
35405
+ this.drawn.update((d) => ({
35406
+ ...d,
35407
+ [key]: limit
35408
+ }));
35409
+ this.announcement.set(`Showing ${limit} of ${col.items.length} ${this.itemNounPlural()} in ${col.label}`);
35410
+ }
34035
35411
  constructor() {
34036
35412
  this.columns = input.required(...ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []);
34037
35413
  this.itemKey = input.required(...ngDevMode ? [{ debugName: "itemKey" }] : /* istanbul ignore next */ []);
@@ -34048,12 +35424,29 @@ var BoardComponent = class BoardComponent {
34048
35424
  this.itemNoun = input("item", ...ngDevMode ? [{ debugName: "itemNoun" }] : /* istanbul ignore next */ []);
34049
35425
  this.itemNounPlural = input("items", ...ngDevMode ? [{ debugName: "itemNounPlural" }] : /* istanbul ignore next */ []);
34050
35426
  this.retryLabel = input("Retry", ...ngDevMode ? [{ debugName: "retryLabel" }] : /* istanbul ignore next */ []);
35427
+ this.pageSize = input(50, ...ngDevMode ? [{ debugName: "pageSize" }] : /* istanbul ignore next */ []);
34051
35428
  this.cardClick = output();
34052
35429
  this.cardAction = output();
34053
35430
  this.itemMove = output();
34054
35431
  this.retry = output();
34055
35432
  this.card = contentChild(BoardCardDirective, ...ngDevMode ? [{ debugName: "card" }] : /* istanbul ignore next */ []);
34056
35433
  this.cols = linkedSignal(() => this.columns(), ...ngDevMode ? [{ debugName: "cols" }] : /* istanbul ignore next */ []);
35434
+ this.drawn = signal({}, ...ngDevMode ? [{ debugName: "drawn" }] : /* istanbul ignore next */ []);
35435
+ this.movedTo = signal(null, ...ngDevMode ? [{ debugName: "movedTo" }] : /* istanbul ignore next */ []);
35436
+ this.shownCols = computed(() => {
35437
+ const size = this.pageSize() > 0 ? Math.floor(this.pageSize()) : 0;
35438
+ return this.cols().map((col) => {
35439
+ const limit = this.limitOf(col);
35440
+ const hidden = Math.max(0, col.items.length - limit);
35441
+ return {
35442
+ col,
35443
+ shown: hidden ? col.items.slice(0, limit) : col.items,
35444
+ hidden,
35445
+ next: Math.min(size, hidden)
35446
+ };
35447
+ });
35448
+ }, ...ngDevMode ? [{ debugName: "shownCols" }] : /* istanbul ignore next */ []);
35449
+ this.hintId = `ub-hint-${nextBoardId++}`;
34057
35450
  this.overKey = signal(null, ...ngDevMode ? [{ debugName: "overKey" }] : /* istanbul ignore next */ []);
34058
35451
  this.draggingKey = signal(null, ...ngDevMode ? [{ debugName: "draggingKey" }] : /* istanbul ignore next */ []);
34059
35452
  this.announcement = signal("", ...ngDevMode ? [{ debugName: "announcement" }] : /* istanbul ignore next */ []);
@@ -34061,7 +35454,12 @@ var BoardComponent = class BoardComponent {
34061
35454
  this.drag = null;
34062
35455
  this.skeletonColumns = computed(() => Array.from({ length: Math.max(this.columns().length, 4) }, (_, i) => i), ...ngDevMode ? [{ debugName: "skeletonColumns" }] : /* istanbul ignore next */ []);
34063
35456
  this.canDrag = computed(() => !this.readOnly() && !this.moveDisabled(), ...ngDevMode ? [{ debugName: "canDrag" }] : /* istanbul ignore next */ []);
34064
- this.canMoveAny = this.canDrag;
35457
+ effect(() => {
35458
+ if (this.loading()) {
35459
+ this.drawn.set({});
35460
+ this.movedTo.set(null);
35461
+ }
35462
+ });
34065
35463
  }
34066
35464
  dot(color) {
34067
35465
  return color && DOT_COLORS[color] || color || "#3b82f6";
@@ -34147,11 +35545,18 @@ var BoardComponent = class BoardComponent {
34147
35545
  };
34148
35546
  return c;
34149
35547
  }));
35548
+ this.movedTo.set({
35549
+ key,
35550
+ to
35551
+ });
34150
35552
  this.itemMove.emit({
34151
35553
  item,
34152
35554
  from,
34153
35555
  to,
34154
- revert: () => this.cols.set(before)
35556
+ revert: () => {
35557
+ this.cols.set(before);
35558
+ this.movedTo.set(null);
35559
+ }
34155
35560
  });
34156
35561
  }
34157
35562
  static {
@@ -34276,6 +35681,13 @@ var BoardComponent = class BoardComponent {
34276
35681
  isSignal: true,
34277
35682
  isRequired: false,
34278
35683
  transformFunction: null
35684
+ },
35685
+ pageSize: {
35686
+ classPropertyName: "pageSize",
35687
+ publicName: "pageSize",
35688
+ isSignal: true,
35689
+ isRequired: false,
35690
+ transformFunction: null
34279
35691
  }
34280
35692
  },
34281
35693
  outputs: {
@@ -34320,8 +35732,9 @@ var BoardComponent = class BoardComponent {
34320
35732
  } @else if (cols().length === 0) {
34321
35733
  <div class="ub-message" role="status"><p>{{ emptyMessage() }}</p></div>
34322
35734
  } @else {
34323
- <div class="ub-board" role="region" [attr.aria-label]="ariaLabel()">
34324
- @for (col of cols(); track col.key) {
35735
+ <div class="ub-board" role="region" [attr.aria-label]="ariaLabel()" [attr.aria-describedby]="canDrag() ? hintId : null">
35736
+ @for (view of shownCols(); track view.col.key) {
35737
+ @let col = view.col;
34325
35738
  <div class="ub-col"
34326
35739
  [class.ub-col--over]="overKey() === col.key"
34327
35740
  [class.ub-col--success]="col.tone === 'success'"
@@ -34337,19 +35750,20 @@ var BoardComponent = class BoardComponent {
34337
35750
  <span class="ub-col__count" aria-hidden="true">{{ col.items.length }}</span>
34338
35751
  </div>
34339
35752
  @if (col.summary) {
34340
- <div class="ub-col__summary" [attr.aria-label]="col.summaryLabel || col.summary">{{ col.summary }}</div>
35753
+ <div class="ub-col__summary"><span aria-hidden="true">{{ col.summary }}</span><span class="ub-sr-only">{{ col.summaryLabel || col.summary }}</span></div>
34341
35754
  }
34342
35755
  </div>
34343
- <div class="ub-col__cards" role="list">
34344
- @for (item of col.items; track itemKey()(item)) {
35756
+ <div class="ub-col__cards" [attr.role]="col.items.length ? 'list' : null">
35757
+ @for (item of view.shown; track itemKey()(item)) {
35758
+ @let key = itemKey()(item);
34345
35759
  <div class="ub-card"
34346
35760
  [class.ub-card--success]="col.tone === 'success'"
34347
- [class.ub-card--dragging]="draggingKey() === itemKey()(item)"
35761
+ [class.ub-card--dragging]="draggingKey() === key"
34348
35762
  role="listitem"
34349
35763
  tabindex="0"
34350
- [attr.data-board-key]="itemKey()(item)"
35764
+ [attr.data-board-key]="key"
34351
35765
  [attr.aria-label]="itemLabel()(item)"
34352
- [attr.aria-keyshortcuts]="canMoveAny() ? 'Shift+ArrowLeft Shift+ArrowRight' : null"
35766
+ [attr.aria-keyshortcuts]="canDrag() ? 'Shift+ArrowLeft Shift+ArrowRight' : null"
34353
35767
  [attr.draggable]="canDrag() ? 'true' : null"
34354
35768
  (dragstart)="onDragStart($event, item, col)"
34355
35769
  (dragend)="onDragEnd()"
@@ -34360,6 +35774,11 @@ var BoardComponent = class BoardComponent {
34360
35774
  }
34361
35775
  </div>
34362
35776
  }
35777
+ @if (view.hidden > 0) {
35778
+ <div class="ub-col__more" role="listitem">
35779
+ <button type="button" class="ub-more-btn" [attr.aria-label]="'Show ' + view.next + ' more (' + view.hidden + ' not shown), ' + col.label" (click)="showMore(col.key)">Show {{ view.next }} more ({{ view.hidden }} not shown)</button>
35780
+ </div>
35781
+ }
34363
35782
  @if (col.items.length === 0) {
34364
35783
  <div class="ub-col__empty" role="status">{{ col.emptyText || emptyColumnText() }}</div>
34365
35784
  }
@@ -34367,12 +35786,15 @@ var BoardComponent = class BoardComponent {
34367
35786
  </div>
34368
35787
  }
34369
35788
  </div>
35789
+ @if (canDrag()) {
35790
+ <p class="ub-sr-only" [id]="hintId">Drag a card to another column to move it, or focus a card and press Shift with the Left or Right Arrow key.</p>
35791
+ }
34370
35792
  <div class="ub-sr-only" role="status" aria-live="polite">{{ announcement() }}</div>
34371
35793
  }
34372
35794
  </div>
34373
35795
  `,
34374
35796
  isInline: true,
34375
- 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"],
35797
+ 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:stretch}.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;min-height:0;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:#64748b;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__more{flex-shrink:0}.ub-more-btn{width:100%;padding:8px 10px;font:inherit;font-size:12px;font-weight:600;color:#475569;background:#fff;border:1.5px dashed #cbd5e1;border-radius:8px;cursor:pointer}.ub-more-btn:hover{background:#f1f5f9;border-color:#94a3b8}.ub-more-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.ub-col__empty{text-align:center;padding:24px 12px;color:#64748b;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:#64748b;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:#64748b}.ub-card__activity--stale{color:#b45309;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-card,.ub-col{transition:none}.ub-card--dragging{transform:none}}@media(pointer:coarse){.ub-more-btn{min-height:44px}}.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"],
34376
35798
  dependencies: [
34377
35799
  {
34378
35800
  kind: "directive",
@@ -34472,8 +35894,9 @@ i0.ɵɵngDeclareClassMetadata({
34472
35894
  } @else if (cols().length === 0) {
34473
35895
  <div class="ub-message" role="status"><p>{{ emptyMessage() }}</p></div>
34474
35896
  } @else {
34475
- <div class="ub-board" role="region" [attr.aria-label]="ariaLabel()">
34476
- @for (col of cols(); track col.key) {
35897
+ <div class="ub-board" role="region" [attr.aria-label]="ariaLabel()" [attr.aria-describedby]="canDrag() ? hintId : null">
35898
+ @for (view of shownCols(); track view.col.key) {
35899
+ @let col = view.col;
34477
35900
  <div class="ub-col"
34478
35901
  [class.ub-col--over]="overKey() === col.key"
34479
35902
  [class.ub-col--success]="col.tone === 'success'"
@@ -34489,19 +35912,20 @@ i0.ɵɵngDeclareClassMetadata({
34489
35912
  <span class="ub-col__count" aria-hidden="true">{{ col.items.length }}</span>
34490
35913
  </div>
34491
35914
  @if (col.summary) {
34492
- <div class="ub-col__summary" [attr.aria-label]="col.summaryLabel || col.summary">{{ col.summary }}</div>
35915
+ <div class="ub-col__summary"><span aria-hidden="true">{{ col.summary }}</span><span class="ub-sr-only">{{ col.summaryLabel || col.summary }}</span></div>
34493
35916
  }
34494
35917
  </div>
34495
- <div class="ub-col__cards" role="list">
34496
- @for (item of col.items; track itemKey()(item)) {
35918
+ <div class="ub-col__cards" [attr.role]="col.items.length ? 'list' : null">
35919
+ @for (item of view.shown; track itemKey()(item)) {
35920
+ @let key = itemKey()(item);
34497
35921
  <div class="ub-card"
34498
35922
  [class.ub-card--success]="col.tone === 'success'"
34499
- [class.ub-card--dragging]="draggingKey() === itemKey()(item)"
35923
+ [class.ub-card--dragging]="draggingKey() === key"
34500
35924
  role="listitem"
34501
35925
  tabindex="0"
34502
- [attr.data-board-key]="itemKey()(item)"
35926
+ [attr.data-board-key]="key"
34503
35927
  [attr.aria-label]="itemLabel()(item)"
34504
- [attr.aria-keyshortcuts]="canMoveAny() ? 'Shift+ArrowLeft Shift+ArrowRight' : null"
35928
+ [attr.aria-keyshortcuts]="canDrag() ? 'Shift+ArrowLeft Shift+ArrowRight' : null"
34505
35929
  [attr.draggable]="canDrag() ? 'true' : null"
34506
35930
  (dragstart)="onDragStart($event, item, col)"
34507
35931
  (dragend)="onDragEnd()"
@@ -34512,6 +35936,11 @@ i0.ɵɵngDeclareClassMetadata({
34512
35936
  }
34513
35937
  </div>
34514
35938
  }
35939
+ @if (view.hidden > 0) {
35940
+ <div class="ub-col__more" role="listitem">
35941
+ <button type="button" class="ub-more-btn" [attr.aria-label]="'Show ' + view.next + ' more (' + view.hidden + ' not shown), ' + col.label" (click)="showMore(col.key)">Show {{ view.next }} more ({{ view.hidden }} not shown)</button>
35942
+ </div>
35943
+ }
34515
35944
  @if (col.items.length === 0) {
34516
35945
  <div class="ub-col__empty" role="status">{{ col.emptyText || emptyColumnText() }}</div>
34517
35946
  }
@@ -34519,13 +35948,17 @@ i0.ɵɵngDeclareClassMetadata({
34519
35948
  </div>
34520
35949
  }
34521
35950
  </div>
35951
+ @if (canDrag()) {
35952
+ <p class="ub-sr-only" [id]="hintId">Drag a card to another column to move it, or focus a card and press Shift with the Left or Right Arrow key.</p>
35953
+ }
34522
35954
  <div class="ub-sr-only" role="status" aria-live="polite">{{ announcement() }}</div>
34523
35955
  }
34524
35956
  </div>
34525
35957
  `,
34526
- 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"]
35958
+ 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:stretch}.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;min-height:0;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:#64748b;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__more{flex-shrink:0}.ub-more-btn{width:100%;padding:8px 10px;font:inherit;font-size:12px;font-weight:600;color:#475569;background:#fff;border:1.5px dashed #cbd5e1;border-radius:8px;cursor:pointer}.ub-more-btn:hover{background:#f1f5f9;border-color:#94a3b8}.ub-more-btn:focus-visible{outline:2px solid #3b82f6;outline-offset:2px}.ub-col__empty{text-align:center;padding:24px 12px;color:#64748b;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:#64748b;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:#64748b}.ub-card__activity--stale{color:#b45309;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-card,.ub-col{transition:none}.ub-card--dragging{transform:none}}@media(pointer:coarse){.ub-more-btn{min-height:44px}}.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"]
34527
35959
  }]
34528
35960
  }],
35961
+ ctorParameters: () => [],
34529
35962
  propDecorators: {
34530
35963
  columns: [{
34531
35964
  type: i0.Input,
@@ -34647,6 +36080,14 @@ i0.ɵɵngDeclareClassMetadata({
34647
36080
  required: false
34648
36081
  }]
34649
36082
  }],
36083
+ pageSize: [{
36084
+ type: i0.Input,
36085
+ args: [{
36086
+ isSignal: true,
36087
+ alias: "pageSize",
36088
+ required: false
36089
+ }]
36090
+ }],
34650
36091
  cardClick: [{
34651
36092
  type: i0.Output,
34652
36093
  args: ["cardClick"]
@@ -36061,6 +37502,208 @@ i0.ɵɵngDeclareClassMetadata({
36061
37502
  }]
36062
37503
  }
36063
37504
  });
37505
+ const CSS_LENGTH = /^(?:0|-?(?:\d+\.?\d*|\.\d+)(?:px|rem|em|%|vh|vw|ch)|(?:calc|var)\([^;{}]*\))$/i;
37506
+ function px(v, fallback) {
37507
+ if (v === null || v === void 0 || v === "") return fallback;
37508
+ const n = Number(v);
37509
+ return Number.isFinite(n) && n >= 0 ? n : fallback;
37510
+ }
37511
+ var SidebarLayoutComponent = class SidebarLayoutComponent {
37512
+ constructor() {
37513
+ this.sideWidth = input("320px", ...ngDevMode ? [{ debugName: "sideWidth" }] : /* istanbul ignore next */ []);
37514
+ this.sidePosition = input("end", ...ngDevMode ? [{ debugName: "sidePosition" }] : /* istanbul ignore next */ []);
37515
+ this.gap = input("md", ...ngDevMode ? [{ debugName: "gap" }] : /* istanbul ignore next */ []);
37516
+ this.stickySide = input(true, ...ngDevMode ? [{ debugName: "stickySide" }] : /* istanbul ignore next */ []);
37517
+ this.stickyTop = input(16, ...ngDevMode ? [{ debugName: "stickyTop" }] : /* istanbul ignore next */ []);
37518
+ this.stickyOffset = input(32, ...ngDevMode ? [{ debugName: "stickyOffset" }] : /* istanbul ignore next */ []);
37519
+ this.collapseAt = input("md", ...ngDevMode ? [{ debugName: "collapseAt" }] : /* istanbul ignore next */ []);
37520
+ this.sideFirstWhenCollapsed = input(true, ...ngDevMode ? [{ debugName: "sideFirstWhenCollapsed" }] : /* istanbul ignore next */ []);
37521
+ this.position = computed(() => this.sidePosition() === "start" ? "start" : "end", ...ngDevMode ? [{ debugName: "position" }] : /* istanbul ignore next */ []);
37522
+ this.sideCss = computed(() => {
37523
+ const v = String(this.sideWidth() ?? "").trim();
37524
+ return v && CSS_LENGTH.test(v) ? v : "320px";
37525
+ }, ...ngDevMode ? [{ debugName: "sideCss" }] : /* istanbul ignore next */ []);
37526
+ this.gapCss = computed(() => resolveLayoutGap(this.gap(), "md"), ...ngDevMode ? [{ debugName: "gapCss" }] : /* istanbul ignore next */ []);
37527
+ this.topCss = computed(() => `${px(this.stickyTop(), 16)}px`, ...ngDevMode ? [{ debugName: "topCss" }] : /* istanbul ignore next */ []);
37528
+ this.offCss = computed(() => `${px(this.stickyOffset(), 32)}px`, ...ngDevMode ? [{ debugName: "offCss" }] : /* istanbul ignore next */ []);
37529
+ this.rootClass = computed(() => {
37530
+ const c = this.collapseAt();
37531
+ const collapse = c === "never" ? "" : c === "sm" || c === "lg" ? `sl-c-${c}` : "sl-c-md";
37532
+ return [
37533
+ this.position() === "start" ? "sl-start" : "",
37534
+ this.stickySide() ? "sl-sticky" : "",
37535
+ collapse,
37536
+ collapse && this.sideFirstWhenCollapsed() ? "sl-first" : ""
37537
+ ].filter(Boolean).join(" ");
37538
+ }, ...ngDevMode ? [{ debugName: "rootClass" }] : /* istanbul ignore next */ []);
37539
+ }
37540
+ static {
37541
+ this.ɵfac = i0.ɵɵngDeclareFactory({
37542
+ minVersion: "12.0.0",
37543
+ version: "22.2.2",
37544
+ ngImport: i0,
37545
+ type: SidebarLayoutComponent,
37546
+ deps: [],
37547
+ target: i0.ɵɵFactoryTarget.Component
37548
+ });
37549
+ }
37550
+ static {
37551
+ this.ɵcmp = i0.ɵɵngDeclareComponent({
37552
+ minVersion: "17.1.0",
37553
+ version: "22.2.2",
37554
+ type: SidebarLayoutComponent,
37555
+ isStandalone: true,
37556
+ selector: "ui-sidebar-layout",
37557
+ inputs: {
37558
+ sideWidth: {
37559
+ classPropertyName: "sideWidth",
37560
+ publicName: "sideWidth",
37561
+ isSignal: true,
37562
+ isRequired: false,
37563
+ transformFunction: null
37564
+ },
37565
+ sidePosition: {
37566
+ classPropertyName: "sidePosition",
37567
+ publicName: "sidePosition",
37568
+ isSignal: true,
37569
+ isRequired: false,
37570
+ transformFunction: null
37571
+ },
37572
+ gap: {
37573
+ classPropertyName: "gap",
37574
+ publicName: "gap",
37575
+ isSignal: true,
37576
+ isRequired: false,
37577
+ transformFunction: null
37578
+ },
37579
+ stickySide: {
37580
+ classPropertyName: "stickySide",
37581
+ publicName: "stickySide",
37582
+ isSignal: true,
37583
+ isRequired: false,
37584
+ transformFunction: null
37585
+ },
37586
+ stickyTop: {
37587
+ classPropertyName: "stickyTop",
37588
+ publicName: "stickyTop",
37589
+ isSignal: true,
37590
+ isRequired: false,
37591
+ transformFunction: null
37592
+ },
37593
+ stickyOffset: {
37594
+ classPropertyName: "stickyOffset",
37595
+ publicName: "stickyOffset",
37596
+ isSignal: true,
37597
+ isRequired: false,
37598
+ transformFunction: null
37599
+ },
37600
+ collapseAt: {
37601
+ classPropertyName: "collapseAt",
37602
+ publicName: "collapseAt",
37603
+ isSignal: true,
37604
+ isRequired: false,
37605
+ transformFunction: null
37606
+ },
37607
+ sideFirstWhenCollapsed: {
37608
+ classPropertyName: "sideFirstWhenCollapsed",
37609
+ publicName: "sideFirstWhenCollapsed",
37610
+ isSignal: true,
37611
+ isRequired: false,
37612
+ transformFunction: null
37613
+ }
37614
+ },
37615
+ host: { properties: { "attr.data-side-position": "position()" } },
37616
+ ngImport: i0,
37617
+ template: `<div class="sl" [class]="rootClass()" [style.--sl-side-w]="sideCss()" [style.--sl-gap]="gapCss()" [style.--sl-top]="topCss()" [style.--sl-off]="offCss()" [style.row-gap]="gapCss()"><div class="sl-main"><ng-content select="[layout-main]" /></div><div class="sl-side"><ng-content select="[layout-side]" /></div></div>`,
37618
+ isInline: true,
37619
+ styles: [":host{display:block}.sl{display:grid;grid-template-columns:minmax(0,1fr) auto}.sl-main{grid-column:1;grid-row:1;min-width:0}.sl-side{grid-column:2;grid-row:1;box-sizing:border-box;width:var(--sl-side-w, 320px);max-width:100%;min-width:0;margin-inline-start:var(--sl-gap, 16px)}.sl-side:empty{display:none}.sl.sl-start{grid-template-columns:auto minmax(0,1fr)}.sl.sl-start .sl-main{grid-column:2}.sl.sl-start .sl-side{grid-column:1;margin-inline-start:0;margin-inline-end:var(--sl-gap, 16px)}.sl.sl-sticky .sl-side{position:-webkit-sticky;position:sticky;top:var(--sl-top, 16px);align-self:start;max-height:calc(100vh - (var(--sl-top, 16px) + var(--sl-off, 32px)));max-height:calc(100dvh - (var(--sl-top, 16px) + var(--sl-off, 32px)));overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}@media(max-width:640px){.sl.sl-c-sm{grid-template-columns:minmax(0,1fr)}.sl.sl-c-sm .sl-main{grid-column:1;grid-row:auto}.sl.sl-c-sm .sl-side{grid-column:1;grid-row:auto;width:auto;margin-inline-start:0;margin-inline-end:0;position:static;top:auto;align-self:auto;max-height:none;overflow-y:visible}.sl.sl-c-sm.sl-first .sl-side{order:-1}}@media(max-width:900px){.sl.sl-c-md{grid-template-columns:minmax(0,1fr)}.sl.sl-c-md .sl-main{grid-column:1;grid-row:auto}.sl.sl-c-md .sl-side{grid-column:1;grid-row:auto;width:auto;margin-inline-start:0;margin-inline-end:0;position:static;top:auto;align-self:auto;max-height:none;overflow-y:visible}.sl.sl-c-md.sl-first .sl-side{order:-1}}@media(max-width:1200px){.sl.sl-c-lg{grid-template-columns:minmax(0,1fr)}.sl.sl-c-lg .sl-main{grid-column:1;grid-row:auto}.sl.sl-c-lg .sl-side{grid-column:1;grid-row:auto;width:auto;margin-inline-start:0;margin-inline-end:0;position:static;top:auto;align-self:auto;max-height:none;overflow-y:visible}.sl.sl-c-lg.sl-first .sl-side{order:-1}}\n"],
37620
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
37621
+ });
37622
+ }
37623
+ };
37624
+ i0.ɵɵngDeclareClassMetadata({
37625
+ minVersion: "12.0.0",
37626
+ version: "22.2.2",
37627
+ ngImport: i0,
37628
+ type: SidebarLayoutComponent,
37629
+ decorators: [{
37630
+ type: Component,
37631
+ args: [{
37632
+ selector: "ui-sidebar-layout",
37633
+ standalone: true,
37634
+ changeDetection: ChangeDetectionStrategy.OnPush,
37635
+ host: { "[attr.data-side-position]": "position()" },
37636
+ template: `<div class="sl" [class]="rootClass()" [style.--sl-side-w]="sideCss()" [style.--sl-gap]="gapCss()" [style.--sl-top]="topCss()" [style.--sl-off]="offCss()" [style.row-gap]="gapCss()"><div class="sl-main"><ng-content select="[layout-main]" /></div><div class="sl-side"><ng-content select="[layout-side]" /></div></div>`,
37637
+ styles: [":host{display:block}.sl{display:grid;grid-template-columns:minmax(0,1fr) auto}.sl-main{grid-column:1;grid-row:1;min-width:0}.sl-side{grid-column:2;grid-row:1;box-sizing:border-box;width:var(--sl-side-w, 320px);max-width:100%;min-width:0;margin-inline-start:var(--sl-gap, 16px)}.sl-side:empty{display:none}.sl.sl-start{grid-template-columns:auto minmax(0,1fr)}.sl.sl-start .sl-main{grid-column:2}.sl.sl-start .sl-side{grid-column:1;margin-inline-start:0;margin-inline-end:var(--sl-gap, 16px)}.sl.sl-sticky .sl-side{position:-webkit-sticky;position:sticky;top:var(--sl-top, 16px);align-self:start;max-height:calc(100vh - (var(--sl-top, 16px) + var(--sl-off, 32px)));max-height:calc(100dvh - (var(--sl-top, 16px) + var(--sl-off, 32px)));overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}@media(max-width:640px){.sl.sl-c-sm{grid-template-columns:minmax(0,1fr)}.sl.sl-c-sm .sl-main{grid-column:1;grid-row:auto}.sl.sl-c-sm .sl-side{grid-column:1;grid-row:auto;width:auto;margin-inline-start:0;margin-inline-end:0;position:static;top:auto;align-self:auto;max-height:none;overflow-y:visible}.sl.sl-c-sm.sl-first .sl-side{order:-1}}@media(max-width:900px){.sl.sl-c-md{grid-template-columns:minmax(0,1fr)}.sl.sl-c-md .sl-main{grid-column:1;grid-row:auto}.sl.sl-c-md .sl-side{grid-column:1;grid-row:auto;width:auto;margin-inline-start:0;margin-inline-end:0;position:static;top:auto;align-self:auto;max-height:none;overflow-y:visible}.sl.sl-c-md.sl-first .sl-side{order:-1}}@media(max-width:1200px){.sl.sl-c-lg{grid-template-columns:minmax(0,1fr)}.sl.sl-c-lg .sl-main{grid-column:1;grid-row:auto}.sl.sl-c-lg .sl-side{grid-column:1;grid-row:auto;width:auto;margin-inline-start:0;margin-inline-end:0;position:static;top:auto;align-self:auto;max-height:none;overflow-y:visible}.sl.sl-c-lg.sl-first .sl-side{order:-1}}\n"]
37638
+ }]
37639
+ }],
37640
+ propDecorators: {
37641
+ sideWidth: [{
37642
+ type: i0.Input,
37643
+ args: [{
37644
+ isSignal: true,
37645
+ alias: "sideWidth",
37646
+ required: false
37647
+ }]
37648
+ }],
37649
+ sidePosition: [{
37650
+ type: i0.Input,
37651
+ args: [{
37652
+ isSignal: true,
37653
+ alias: "sidePosition",
37654
+ required: false
37655
+ }]
37656
+ }],
37657
+ gap: [{
37658
+ type: i0.Input,
37659
+ args: [{
37660
+ isSignal: true,
37661
+ alias: "gap",
37662
+ required: false
37663
+ }]
37664
+ }],
37665
+ stickySide: [{
37666
+ type: i0.Input,
37667
+ args: [{
37668
+ isSignal: true,
37669
+ alias: "stickySide",
37670
+ required: false
37671
+ }]
37672
+ }],
37673
+ stickyTop: [{
37674
+ type: i0.Input,
37675
+ args: [{
37676
+ isSignal: true,
37677
+ alias: "stickyTop",
37678
+ required: false
37679
+ }]
37680
+ }],
37681
+ stickyOffset: [{
37682
+ type: i0.Input,
37683
+ args: [{
37684
+ isSignal: true,
37685
+ alias: "stickyOffset",
37686
+ required: false
37687
+ }]
37688
+ }],
37689
+ collapseAt: [{
37690
+ type: i0.Input,
37691
+ args: [{
37692
+ isSignal: true,
37693
+ alias: "collapseAt",
37694
+ required: false
37695
+ }]
37696
+ }],
37697
+ sideFirstWhenCollapsed: [{
37698
+ type: i0.Input,
37699
+ args: [{
37700
+ isSignal: true,
37701
+ alias: "sideFirstWhenCollapsed",
37702
+ required: false
37703
+ }]
37704
+ }]
37705
+ }
37706
+ });
36064
37707
  const JUSTIFY = {
36065
37708
  start: "flex-start",
36066
37709
  center: "center",
@@ -38499,6 +40142,6 @@ i0.ɵɵngDeclareClassMetadata({
38499
40142
  }]
38500
40143
  }
38501
40144
  });
38502
- export { ActionBarComponent, AlertComponent, AppShellComponent, AudioPlayerComponent, AvatarComponent, BADGE_VARIANT_STYLES, BadgeComponent, BarRowComponent, BoardCardDirective, BoardComponent, 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 };
40145
+ 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, NOTES_MAX_LENGTH, 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, SidebarLayoutComponent, 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 };
38503
40146
 
38504
40147
  //# sourceMappingURL=forgeroute-ui.mjs.map