@cdevhub/ngx-tw 0.2.0 → 0.3.0

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.
Files changed (144) hide show
  1. package/README.md +264 -49
  2. package/fesm2022/cdevhub-ngx-tw-accordion.mjs +11 -7
  3. package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
  4. package/fesm2022/cdevhub-ngx-tw-alert.mjs +43 -29
  5. package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -1
  6. package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs +103 -0
  7. package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs.map +1 -0
  8. package/fesm2022/cdevhub-ngx-tw-avatar.mjs +56 -31
  9. package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
  10. package/fesm2022/cdevhub-ngx-tw-badge.mjs +61 -35
  11. package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
  12. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +154 -93
  13. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
  14. package/fesm2022/cdevhub-ngx-tw-button.mjs +35 -22
  15. package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
  16. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +3 -3
  17. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
  18. package/fesm2022/cdevhub-ngx-tw-calendar.mjs +416 -216
  19. package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
  20. package/fesm2022/cdevhub-ngx-tw-card.mjs +33 -24
  21. package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
  22. package/fesm2022/cdevhub-ngx-tw-carousel.mjs +152 -81
  23. package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
  24. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +99 -47
  25. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
  26. package/fesm2022/cdevhub-ngx-tw-code-block.mjs +42 -29
  27. package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
  28. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +46 -29
  29. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
  30. package/fesm2022/cdevhub-ngx-tw-combobox.mjs +205 -110
  31. package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
  32. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +141 -74
  33. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
  34. package/fesm2022/cdevhub-ngx-tw-core.mjs +16 -11
  35. package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
  36. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +395 -149
  37. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
  38. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +305 -150
  39. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
  40. package/fesm2022/cdevhub-ngx-tw-dialog.mjs +56 -43
  41. package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
  42. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +51 -33
  43. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
  44. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +905 -0
  45. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -0
  46. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +49 -26
  47. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
  48. package/fesm2022/cdevhub-ngx-tw-form-field.mjs +133 -74
  49. package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
  50. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +2 -2
  51. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -1
  52. package/fesm2022/cdevhub-ngx-tw-icon.mjs +28 -17
  53. package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
  54. package/fesm2022/cdevhub-ngx-tw-input.mjs +37 -21
  55. package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
  56. package/fesm2022/cdevhub-ngx-tw-item.mjs +33 -24
  57. package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
  58. package/fesm2022/cdevhub-ngx-tw-menu.mjs +63 -48
  59. package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
  60. package/fesm2022/cdevhub-ngx-tw-number-input.mjs +622 -0
  61. package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -0
  62. package/fesm2022/cdevhub-ngx-tw-paginator.mjs +142 -72
  63. package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
  64. package/fesm2022/cdevhub-ngx-tw-popover.mjs +101 -46
  65. package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
  66. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +57 -30
  67. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
  68. package/fesm2022/cdevhub-ngx-tw-radio.mjs +108 -57
  69. package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
  70. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +46 -26
  71. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
  72. package/fesm2022/cdevhub-ngx-tw-select.mjs +227 -122
  73. package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
  74. package/fesm2022/cdevhub-ngx-tw-separator.mjs +21 -12
  75. package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -1
  76. package/fesm2022/cdevhub-ngx-tw-sheet.mjs +58 -44
  77. package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
  78. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +25 -14
  79. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -1
  80. package/fesm2022/cdevhub-ngx-tw-slider.mjs +155 -79
  81. package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
  82. package/fesm2022/cdevhub-ngx-tw-sort.mjs +47 -25
  83. package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
  84. package/fesm2022/cdevhub-ngx-tw-spinner.mjs +29 -16
  85. package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -1
  86. package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -42
  87. package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
  88. package/fesm2022/cdevhub-ngx-tw-stat.mjs +107 -64
  89. package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
  90. package/fesm2022/cdevhub-ngx-tw-stepper.mjs +113 -47
  91. package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
  92. package/fesm2022/cdevhub-ngx-tw-switch.mjs +61 -32
  93. package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
  94. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +88 -42
  95. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
  96. package/fesm2022/cdevhub-ngx-tw-table.mjs +266 -118
  97. package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
  98. package/fesm2022/cdevhub-ngx-tw-tabs.mjs +102 -52
  99. package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
  100. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +798 -0
  101. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -0
  102. package/fesm2022/cdevhub-ngx-tw-textarea.mjs +16 -8
  103. package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
  104. package/fesm2022/cdevhub-ngx-tw-theme.mjs +22 -14
  105. package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
  106. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +243 -95
  107. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
  108. package/fesm2022/cdevhub-ngx-tw-timeline.mjs +149 -82
  109. package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
  110. package/fesm2022/cdevhub-ngx-tw-toast.mjs +100 -55
  111. package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
  112. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +50 -28
  113. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
  114. package/fesm2022/cdevhub-ngx-tw-transfer.mjs +1129 -0
  115. package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -0
  116. package/fesm2022/cdevhub-ngx-tw-tree.mjs +554 -0
  117. package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -0
  118. package/fesm2022/cdevhub-ngx-tw.mjs +7 -0
  119. package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -1
  120. package/package.json +45 -17
  121. package/theme/_dark.css +16 -12
  122. package/theme/_semantic.css +3 -2
  123. package/theme/index.css +10 -2
  124. package/types/cdevhub-ngx-tw-aspect-ratio.d.ts +40 -0
  125. package/types/cdevhub-ngx-tw-calendar.d.ts +39 -8
  126. package/types/cdevhub-ngx-tw-code-block.d.ts +8 -7
  127. package/types/cdevhub-ngx-tw-command-palette.d.ts +7 -0
  128. package/types/cdevhub-ngx-tw-date-picker.d.ts +36 -10
  129. package/types/cdevhub-ngx-tw-file-upload.d.ts +250 -0
  130. package/types/cdevhub-ngx-tw-form-field.d.ts +22 -3
  131. package/types/cdevhub-ngx-tw-icon-lucide.d.ts +21 -3
  132. package/types/cdevhub-ngx-tw-number-input.d.ts +130 -0
  133. package/types/cdevhub-ngx-tw-popover.d.ts +8 -0
  134. package/types/cdevhub-ngx-tw-select.d.ts +1 -1
  135. package/types/cdevhub-ngx-tw-stepper.d.ts +30 -2
  136. package/types/cdevhub-ngx-tw-tab-nav.d.ts +8 -0
  137. package/types/cdevhub-ngx-tw-table.d.ts +30 -1
  138. package/types/cdevhub-ngx-tw-tabs.d.ts +8 -0
  139. package/types/cdevhub-ngx-tw-tags-input.d.ts +217 -0
  140. package/types/cdevhub-ngx-tw-time-picker.d.ts +31 -6
  141. package/types/cdevhub-ngx-tw-toast.d.ts +1 -1
  142. package/types/cdevhub-ngx-tw-transfer.d.ts +330 -0
  143. package/types/cdevhub-ngx-tw-tree.d.ts +189 -0
  144. package/types/cdevhub-ngx-tw.d.ts +7 -0
@@ -3,7 +3,6 @@ import * as i0 from '@angular/core';
3
3
  import { inject, TemplateRef, Directive, input, forwardRef, computed, contentChild, ChangeDetectionStrategy, Component } from '@angular/core';
4
4
  import { tv } from 'tailwind-variants';
5
5
  import { IconComponent } from '@cdevhub/ngx-tw/icon';
6
- import { MenuComponent, MenuItemDirective, MenuTriggerDirective } from '@cdevhub/ngx-tw/menu';
7
6
 
8
7
  // ── tv() config ──
9
8
  const breadcrumbs = tv({
@@ -93,10 +92,10 @@ class BreadcrumbsItemTemplateDirective {
93
92
  static ngTemplateContextGuard(_dir, _ctx) {
94
93
  return true;
95
94
  }
96
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: BreadcrumbsItemTemplateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
97
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: BreadcrumbsItemTemplateDirective, isStandalone: true, selector: "[twBreadcrumbsItem]", ngImport: i0 });
95
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: BreadcrumbsItemTemplateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
96
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: BreadcrumbsItemTemplateDirective, isStandalone: true, selector: "[twBreadcrumbsItem]", ngImport: i0 });
98
97
  }
99
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: BreadcrumbsItemTemplateDirective, decorators: [{
98
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: BreadcrumbsItemTemplateDirective, decorators: [{
100
99
  type: Directive,
101
100
  args: [{
102
101
  selector: '[twBreadcrumbsItem]',
@@ -110,10 +109,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
110
109
  class BreadcrumbsSeparatorTemplateDirective {
111
110
  /** @internal */
112
111
  templateRef = inject(TemplateRef);
113
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: BreadcrumbsSeparatorTemplateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
114
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.14", type: BreadcrumbsSeparatorTemplateDirective, isStandalone: true, selector: "[twBreadcrumbsSeparator]", ngImport: i0 });
112
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: BreadcrumbsSeparatorTemplateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
113
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: BreadcrumbsSeparatorTemplateDirective, isStandalone: true, selector: "[twBreadcrumbsSeparator]", ngImport: i0 });
115
114
  }
116
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: BreadcrumbsSeparatorTemplateDirective, decorators: [{
115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: BreadcrumbsSeparatorTemplateDirective, decorators: [{
117
116
  type: Directive,
118
117
  args: [{
119
118
  selector: '[twBreadcrumbsSeparator]',
@@ -132,9 +131,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
132
131
  */
133
132
  class BreadcrumbsLinkDirective {
134
133
  /** When true, this element is the current page: styled bold and gets `aria-current="page"`. Defaults to `false`. */
135
- current = input(false, ...(ngDevMode ? [{ debugName: "current" }] : /* istanbul ignore next */ []));
134
+ current = input(false, /* @ts-ignore */
135
+ ...(ngDevMode ? [{ debugName: "current" }] : /* istanbul ignore next */ []));
136
136
  /** When true, applies disabled styling (muted, not-allowed cursor). Defaults to `false`. */
137
- disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
137
+ disabled = input(false, /* @ts-ignore */
138
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
138
139
  parent = inject(forwardRef(() => BreadcrumbsComponent));
139
140
  /** @internal Combined classes pulled from the parent component's slot tokens. */
140
141
  classes = computed(() => {
@@ -144,11 +145,12 @@ class BreadcrumbsLinkDirective {
144
145
  if (this.current())
145
146
  return slots.current();
146
147
  return slots.link();
147
- }, ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
148
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: BreadcrumbsLinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
149
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.14", type: BreadcrumbsLinkDirective, isStandalone: true, selector: "[twBreadcrumbsLink]", inputs: { current: { classPropertyName: "current", publicName: "current", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.aria-current": "current() ? \"page\" : null" } }, ngImport: i0 });
148
+ }, /* @ts-ignore */
149
+ ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
150
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: BreadcrumbsLinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
151
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.7", type: BreadcrumbsLinkDirective, isStandalone: true, selector: "[twBreadcrumbsLink]", inputs: { current: { classPropertyName: "current", publicName: "current", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.aria-current": "current() ? \"page\" : null" } }, ngImport: i0 });
150
152
  }
151
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: BreadcrumbsLinkDirective, decorators: [{
153
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: BreadcrumbsLinkDirective, decorators: [{
152
154
  type: Directive,
153
155
  args: [{
154
156
  selector: '[twBreadcrumbsLink]',
@@ -186,41 +188,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
186
188
  */
187
189
  class BreadcrumbsComponent {
188
190
  /** The full breadcrumb trail. The last entry is treated as the current page. Defaults to `[]`. */
189
- items = input([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
191
+ items = input([], /* @ts-ignore */
192
+ ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
190
193
  /** Density of the trail — drives font size, gap, icon size, and the overflow-button square. Defaults to `'md'`. */
191
- size = input('md', ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
194
+ size = input('md', /* @ts-ignore */
195
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
192
196
  /**
193
197
  * When greater than `0`, the trail collapses any middle items past this
194
198
  * threshold behind an overflow menu. The first item and the current (last)
195
199
  * item are always visible. Values `< 2` are clamped to `2`. Defaults to `0`
196
200
  * (no collapsing).
197
201
  */
198
- maxItems = input(0, ...(ngDevMode ? [{ debugName: "maxItems" }] : /* istanbul ignore next */ []));
202
+ maxItems = input(0, /* @ts-ignore */
203
+ ...(ngDevMode ? [{ debugName: "maxItems" }] : /* istanbul ignore next */ []));
199
204
  /**
200
205
  * Lucide icon name used for the default separator between items. Ignored
201
206
  * when a `*twBreadcrumbsSeparator` template is projected. Defaults to
202
207
  * `'chevron-right'`. Requires the consumer to register the icon via
203
208
  * `provideTwLucideIcons({ ChevronRight, ... })`.
204
209
  */
205
- separator = input('chevron-right', ...(ngDevMode ? [{ debugName: "separator" }] : /* istanbul ignore next */ []));
210
+ separator = input('chevron-right', /* @ts-ignore */
211
+ ...(ngDevMode ? [{ debugName: "separator" }] : /* istanbul ignore next */ []));
206
212
  /** Accessible label applied to the `<nav>` landmark. Defaults to `'Breadcrumb'`. Aliased as `aria-label`. */
207
213
  ariaLabel = input('Breadcrumb', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
208
214
  /** Custom per-item template projected via `*twBreadcrumbsItem`. */
209
- itemTemplate = contentChild((BreadcrumbsItemTemplateDirective), ...(ngDevMode ? [{ debugName: "itemTemplate" }] : /* istanbul ignore next */ []));
215
+ itemTemplate = contentChild((BreadcrumbsItemTemplateDirective), /* @ts-ignore */
216
+ ...(ngDevMode ? [{ debugName: "itemTemplate" }] : /* istanbul ignore next */ []));
210
217
  /** Custom separator template projected via `*twBreadcrumbsSeparator`. */
211
- separatorTemplate = contentChild(BreadcrumbsSeparatorTemplateDirective, ...(ngDevMode ? [{ debugName: "separatorTemplate" }] : /* istanbul ignore next */ []));
218
+ separatorTemplate = contentChild(BreadcrumbsSeparatorTemplateDirective, /* @ts-ignore */
219
+ ...(ngDevMode ? [{ debugName: "separatorTemplate" }] : /* istanbul ignore next */ []));
212
220
  /** @internal Materialised tv() slot result; exposed so `BreadcrumbsLinkDirective` can pull link/current/disabled classes. */
213
- slotResult = computed(() => breadcrumbs({ size: this.size() }), ...(ngDevMode ? [{ debugName: "slotResult" }] : /* istanbul ignore next */ []));
221
+ slotResult = computed(() => breadcrumbs({ size: this.size() }), /* @ts-ignore */
222
+ ...(ngDevMode ? [{ debugName: "slotResult" }] : /* istanbul ignore next */ []));
214
223
  /** @internal Icon size for the default chevron separator. */
215
- iconSize = computed(() => ICON_SIZE_FOR_BREADCRUMB[this.size()], ...(ngDevMode ? [{ debugName: "iconSize" }] : /* istanbul ignore next */ []));
224
+ iconSize = computed(() => ICON_SIZE_FOR_BREADCRUMB[this.size()], /* @ts-ignore */
225
+ ...(ngDevMode ? [{ debugName: "iconSize" }] : /* istanbul ignore next */ []));
216
226
  /** @internal Class strings per slot, memoised. */
217
- listClasses = computed(() => this.slotResult().list(), ...(ngDevMode ? [{ debugName: "listClasses" }] : /* istanbul ignore next */ []));
218
- itemClasses = computed(() => this.slotResult().item(), ...(ngDevMode ? [{ debugName: "itemClasses" }] : /* istanbul ignore next */ []));
219
- linkClasses = computed(() => this.slotResult().link(), ...(ngDevMode ? [{ debugName: "linkClasses" }] : /* istanbul ignore next */ []));
220
- currentClasses = computed(() => this.slotResult().current(), ...(ngDevMode ? [{ debugName: "currentClasses" }] : /* istanbul ignore next */ []));
221
- disabledClasses = computed(() => this.slotResult().disabled(), ...(ngDevMode ? [{ debugName: "disabledClasses" }] : /* istanbul ignore next */ []));
222
- separatorClasses = computed(() => this.slotResult().separator(), ...(ngDevMode ? [{ debugName: "separatorClasses" }] : /* istanbul ignore next */ []));
223
- overflowTriggerClasses = computed(() => this.slotResult().overflowTrigger(), ...(ngDevMode ? [{ debugName: "overflowTriggerClasses" }] : /* istanbul ignore next */ []));
227
+ listClasses = computed(() => this.slotResult().list(), /* @ts-ignore */
228
+ ...(ngDevMode ? [{ debugName: "listClasses" }] : /* istanbul ignore next */ []));
229
+ itemClasses = computed(() => this.slotResult().item(), /* @ts-ignore */
230
+ ...(ngDevMode ? [{ debugName: "itemClasses" }] : /* istanbul ignore next */ []));
231
+ linkClasses = computed(() => this.slotResult().link(), /* @ts-ignore */
232
+ ...(ngDevMode ? [{ debugName: "linkClasses" }] : /* istanbul ignore next */ []));
233
+ currentClasses = computed(() => this.slotResult().current(), /* @ts-ignore */
234
+ ...(ngDevMode ? [{ debugName: "currentClasses" }] : /* istanbul ignore next */ []));
235
+ disabledClasses = computed(() => this.slotResult().disabled(), /* @ts-ignore */
236
+ ...(ngDevMode ? [{ debugName: "disabledClasses" }] : /* istanbul ignore next */ []));
237
+ separatorClasses = computed(() => this.slotResult().separator(), /* @ts-ignore */
238
+ ...(ngDevMode ? [{ debugName: "separatorClasses" }] : /* istanbul ignore next */ []));
239
+ overflowTriggerClasses = computed(() => this.slotResult().overflowTrigger(), /* @ts-ignore */
240
+ ...(ngDevMode ? [{ debugName: "overflowTriggerClasses" }] : /* istanbul ignore next */ []));
224
241
  /** @internal Items hidden behind the overflow menu. Empty when no collapsing is active. */
225
242
  collapsedItems = computed(() => {
226
243
  const all = this.items();
@@ -233,7 +250,8 @@ class BreadcrumbsComponent {
233
250
  const tailCount = effectiveMax - 1;
234
251
  const hiddenEnd = all.length - tailCount;
235
252
  return all.slice(1, hiddenEnd);
236
- }, ...(ngDevMode ? [{ debugName: "collapsedItems" }] : /* istanbul ignore next */ []));
253
+ }, /* @ts-ignore */
254
+ ...(ngDevMode ? [{ debugName: "collapsedItems" }] : /* istanbul ignore next */ []));
237
255
  /** @internal Flat sequence of items + separators + overflow used by the template's @for. */
238
256
  renderedEntries = computed(() => {
239
257
  const all = this.items();
@@ -287,9 +305,10 @@ class BreadcrumbsComponent {
287
305
  });
288
306
  }
289
307
  return entries;
290
- }, ...(ngDevMode ? [{ debugName: "renderedEntries" }] : /* istanbul ignore next */ []));
291
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: BreadcrumbsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
292
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: BreadcrumbsComponent, isStandalone: true, selector: "tw-breadcrumbs", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, maxItems: { classPropertyName: "maxItems", publicName: "maxItems", isSignal: true, isRequired: false, transformFunction: null }, separator: { classPropertyName: "separator", publicName: "separator", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "block min-w-0" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: (BreadcrumbsItemTemplateDirective), descendants: true, isSignal: true }, { propertyName: "separatorTemplate", first: true, predicate: BreadcrumbsSeparatorTemplateDirective, descendants: true, isSignal: true }], ngImport: i0, template: `
308
+ }, /* @ts-ignore */
309
+ ...(ngDevMode ? [{ debugName: "renderedEntries" }] : /* istanbul ignore next */ []));
310
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: BreadcrumbsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
311
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: BreadcrumbsComponent, isStandalone: true, selector: "tw-breadcrumbs", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, maxItems: { classPropertyName: "maxItems", publicName: "maxItems", isSignal: true, isRequired: false, transformFunction: null }, separator: { classPropertyName: "separator", publicName: "separator", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "block min-w-0" }, queries: [{ propertyName: "itemTemplate", first: true, predicate: (BreadcrumbsItemTemplateDirective), descendants: true, isSignal: true }, { propertyName: "separatorTemplate", first: true, predicate: BreadcrumbsSeparatorTemplateDirective, descendants: true, isSignal: true }], ngImport: i0, template: `
293
312
  <nav [attr.aria-label]="ariaLabel()">
294
313
  <ol [class]="listClasses()">
295
314
  @for (entry of renderedEntries(); track entry.key) {
@@ -329,52 +348,76 @@ class BreadcrumbsComponent {
329
348
  </li>
330
349
  } @else {
331
350
  <li [class]="itemClasses()">
332
- <button
333
- type="button"
334
- [class]="overflowTriggerClasses()"
335
- [twMenuTrigger]="overflowMenuTpl"
336
- aria-label="Show more breadcrumbs"
337
- >
338
- <span aria-hidden="true">&hellip;</span>
339
- </button>
340
- <ng-template #overflowMenuTpl>
341
- <tw-menu aria-label="Hidden breadcrumb items">
342
- @for (hidden of collapsedItems(); track hidden) {
343
- @if (hidden.disabled || !hidden.href) {
344
- <span twMenuItem [attr.aria-disabled]="hidden.disabled ? 'true' : null">
345
- {{ hidden.label }}
346
- </span>
347
- } @else {
348
- <a twMenuItem [attr.href]="hidden.href">{{ hidden.label }}</a>
351
+ <!--
352
+ The overflow menu pulls in tw-menu + @angular/cdk/menu (overlay,
353
+ focus-trap). @defer keeps that weight in a lazy chunk so a plain
354
+ breadcrumb trail (the common case, maxItems=0) never bundles it;
355
+ the chunk loads when the trigger scrolls into view and is
356
+ prefetched on idle to keep the first click responsive. The
357
+ @placeholder mirrors the trigger so layout and a11y are stable.
358
+ -->
359
+ @defer (on viewport; prefetch on idle) {
360
+ <button
361
+ type="button"
362
+ [class]="overflowTriggerClasses()"
363
+ [twMenuTrigger]="overflowMenuTpl"
364
+ aria-label="Show more breadcrumbs"
365
+ >
366
+ <span aria-hidden="true">&hellip;</span>
367
+ </button>
368
+ <ng-template #overflowMenuTpl>
369
+ <tw-menu aria-label="Hidden breadcrumb items">
370
+ @for (hidden of collapsedItems(); track hidden) {
371
+ @if (hidden.disabled || !hidden.href) {
372
+ <span twMenuItem [attr.aria-disabled]="hidden.disabled ? 'true' : null">
373
+ {{ hidden.label }}
374
+ </span>
375
+ } @else {
376
+ <a twMenuItem [attr.href]="hidden.href">{{ hidden.label }}</a>
377
+ }
349
378
  }
350
- }
351
- </tw-menu>
352
- </ng-template>
379
+ </tw-menu>
380
+ </ng-template>
381
+ } @placeholder {
382
+ <button
383
+ type="button"
384
+ [class]="overflowTriggerClasses()"
385
+ aria-label="Show more breadcrumbs"
386
+ >
387
+ <span aria-hidden="true">&hellip;</span>
388
+ </button>
389
+ }
353
390
  </li>
354
391
  }
355
392
  }
356
393
  </ol>
357
394
  </nav>
358
- `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: IconComponent, selector: "tw-icon", inputs: ["name", "img", "color", "size", "ariaLabel", "svg"] }, { kind: "component", type: MenuComponent, selector: "tw-menu", inputs: ["size", "aria-label", "aria-labelledby"] }, { kind: "directive", type: MenuItemDirective, selector: "[twMenuItem]", inputs: ["color", "disabled"] }, { kind: "directive", type: MenuTriggerDirective, selector: "[twMenuTrigger]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
395
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: IconComponent, selector: "tw-icon", inputs: ["name", "img", "color", "size", "ariaLabel", "svg"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, deferBlockDependencies: [() => [/* @ts-ignore */
396
+ import('@cdevhub/ngx-tw/menu').then(m => m.MenuComponent), /* @ts-ignore */
397
+ import('@cdevhub/ngx-tw/menu').then(m => m.MenuItemDirective), /* @ts-ignore */
398
+ import('@cdevhub/ngx-tw/menu').then(m => m.MenuTriggerDirective)]] });
359
399
  }
360
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: BreadcrumbsComponent, decorators: [{
361
- type: Component,
362
- args: [{
363
- selector: 'tw-breadcrumbs',
364
- changeDetection: ChangeDetectionStrategy.OnPush,
365
- imports: [
366
- NgTemplateOutlet,
367
- IconComponent,
368
- MenuComponent,
369
- MenuItemDirective,
370
- MenuTriggerDirective,
371
- ],
372
- host: {
373
- // Custom elements default to inline; force a block layout so the trail
374
- // behaves predictably inside flex / grid containers.
375
- class: 'block min-w-0',
376
- },
377
- template: `
400
+ i0.ɵɵngDeclareClassMetadataAsync({ minVersion: "18.0.0", version: "22.0.7", ngImport: i0, type: BreadcrumbsComponent, resolveDeferredDeps: () => [/* @ts-ignore */
401
+ import('@cdevhub/ngx-tw/menu').then(m => m.MenuComponent), /* @ts-ignore */
402
+ import('@cdevhub/ngx-tw/menu').then(m => m.MenuItemDirective), /* @ts-ignore */
403
+ import('@cdevhub/ngx-tw/menu').then(m => m.MenuTriggerDirective)], resolveMetadata: (MenuComponent, MenuItemDirective, MenuTriggerDirective) => ({ decorators: [{
404
+ type: Component,
405
+ args: [{
406
+ selector: 'tw-breadcrumbs',
407
+ changeDetection: ChangeDetectionStrategy.OnPush,
408
+ imports: [
409
+ NgTemplateOutlet,
410
+ IconComponent,
411
+ MenuComponent,
412
+ MenuItemDirective,
413
+ MenuTriggerDirective,
414
+ ],
415
+ host: {
416
+ // Custom elements default to inline; force a block layout so the trail
417
+ // behaves predictably inside flex / grid containers.
418
+ class: 'block min-w-0',
419
+ },
420
+ template: `
378
421
  <nav [attr.aria-label]="ariaLabel()">
379
422
  <ol [class]="listClasses()">
380
423
  @for (entry of renderedEntries(); track entry.key) {
@@ -414,35 +457,53 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
414
457
  </li>
415
458
  } @else {
416
459
  <li [class]="itemClasses()">
417
- <button
418
- type="button"
419
- [class]="overflowTriggerClasses()"
420
- [twMenuTrigger]="overflowMenuTpl"
421
- aria-label="Show more breadcrumbs"
422
- >
423
- <span aria-hidden="true">&hellip;</span>
424
- </button>
425
- <ng-template #overflowMenuTpl>
426
- <tw-menu aria-label="Hidden breadcrumb items">
427
- @for (hidden of collapsedItems(); track hidden) {
428
- @if (hidden.disabled || !hidden.href) {
429
- <span twMenuItem [attr.aria-disabled]="hidden.disabled ? 'true' : null">
430
- {{ hidden.label }}
431
- </span>
432
- } @else {
433
- <a twMenuItem [attr.href]="hidden.href">{{ hidden.label }}</a>
460
+ <!--
461
+ The overflow menu pulls in tw-menu + @angular/cdk/menu (overlay,
462
+ focus-trap). @defer keeps that weight in a lazy chunk so a plain
463
+ breadcrumb trail (the common case, maxItems=0) never bundles it;
464
+ the chunk loads when the trigger scrolls into view and is
465
+ prefetched on idle to keep the first click responsive. The
466
+ @placeholder mirrors the trigger so layout and a11y are stable.
467
+ -->
468
+ @defer (on viewport; prefetch on idle) {
469
+ <button
470
+ type="button"
471
+ [class]="overflowTriggerClasses()"
472
+ [twMenuTrigger]="overflowMenuTpl"
473
+ aria-label="Show more breadcrumbs"
474
+ >
475
+ <span aria-hidden="true">&hellip;</span>
476
+ </button>
477
+ <ng-template #overflowMenuTpl>
478
+ <tw-menu aria-label="Hidden breadcrumb items">
479
+ @for (hidden of collapsedItems(); track hidden) {
480
+ @if (hidden.disabled || !hidden.href) {
481
+ <span twMenuItem [attr.aria-disabled]="hidden.disabled ? 'true' : null">
482
+ {{ hidden.label }}
483
+ </span>
484
+ } @else {
485
+ <a twMenuItem [attr.href]="hidden.href">{{ hidden.label }}</a>
486
+ }
434
487
  }
435
- }
436
- </tw-menu>
437
- </ng-template>
488
+ </tw-menu>
489
+ </ng-template>
490
+ } @placeholder {
491
+ <button
492
+ type="button"
493
+ [class]="overflowTriggerClasses()"
494
+ aria-label="Show more breadcrumbs"
495
+ >
496
+ <span aria-hidden="true">&hellip;</span>
497
+ </button>
498
+ }
438
499
  </li>
439
500
  }
440
501
  }
441
502
  </ol>
442
503
  </nav>
443
504
  `,
444
- }]
445
- }], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], maxItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxItems", required: false }] }], separator: [{ type: i0.Input, args: [{ isSignal: true, alias: "separator", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], itemTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => BreadcrumbsItemTemplateDirective), { isSignal: true }] }], separatorTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => BreadcrumbsSeparatorTemplateDirective), { isSignal: true }] }] } });
505
+ }]
506
+ }], ctorParameters: null, propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], maxItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxItems", required: false }] }], separator: [{ type: i0.Input, args: [{ isSignal: true, alias: "separator", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], itemTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => BreadcrumbsItemTemplateDirective), { isSignal: true }] }], separatorTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => BreadcrumbsSeparatorTemplateDirective), { isSignal: true }] }] } }) });
446
507
 
447
508
  /**
448
509
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"cdevhub-ngx-tw-breadcrumbs.mjs","sources":["../../../projects/ngx-tw/breadcrumbs/breadcrumbs.ts","../../../projects/ngx-tw/breadcrumbs/cdevhub-ngx-tw-breadcrumbs.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Directive,\n TemplateRef,\n computed,\n contentChild,\n forwardRef,\n inject,\n input,\n} from '@angular/core';\nimport { tv } from 'tailwind-variants';\nimport type { TwSize } from '@cdevhub/ngx-tw/core';\nimport { IconComponent } from '@cdevhub/ngx-tw/icon';\nimport {\n MenuComponent,\n MenuItemDirective,\n MenuTriggerDirective,\n} from '@cdevhub/ngx-tw/menu';\n\n// ── Public types ──\n\n/**\n * Describes a single hop in a breadcrumb trail. The last entry in `items` is\n * always treated as the current page (rendered with `aria-current=\"page\"`,\n * never as an anchor).\n *\n * The generic `T` types the optional `data` payload — useful for forwarding\n * routerLink commands or any other consumer-defined metadata to the custom\n * item template without unsafe casts.\n */\nexport interface TwBreadcrumbsItem<T = unknown> {\n /** Visible label shown for this hop. */\n label: string;\n /**\n * Optional href used to render the default anchor. Omit on the current item\n * (the last entry). Ignored when a custom `*twBreadcrumbsItem` template is\n * projected — the consumer owns the anchor in that case.\n */\n href?: string;\n /**\n * Opaque payload forwarded to the consumer's `*twBreadcrumbsItem` template\n * via the template context. Use this to carry router commands or any other\n * data your template needs.\n */\n data?: T;\n /**\n * When true, the item renders as muted text without an anchor (even if\n * `href` is set). Receives `aria-disabled=\"true\"`.\n */\n disabled?: boolean;\n}\n\n/**\n * Template context passed to `*twBreadcrumbsItem` for each rendered item.\n */\nexport interface TwBreadcrumbsItemContext<T = unknown> {\n /** The item record (also exposed via `let-item=\"$implicit\"`). */\n $implicit: TwBreadcrumbsItem<T>;\n /** Same as `$implicit`. Available via `let-item=\"item\"` for readability. */\n item: TwBreadcrumbsItem<T>;\n /** Zero-based index of this item in the original `items` input. */\n index: number;\n /** `true` only for the last entry — the current page. */\n isCurrent: boolean;\n}\n\n// ── tv() config ──\n\nconst breadcrumbs = tv(\n {\n slots: {\n // The host outer element (<tw-breadcrumbs>) is a custom element; we wrap\n // the actual landmark <nav> inside the template. The list is a real <ol>\n // so the trail keeps its semantic ordering for assistive tech.\n list: 'flex flex-wrap items-center m-0 p-0 list-none min-w-0',\n item: 'inline-flex items-center min-w-0',\n link:\n 'inline-flex items-center text-fg-muted hover:text-fg transition-colors duration-200 motion-reduce:transition-none ' +\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500 rounded-md no-underline truncate',\n current: 'inline-flex items-center text-fg font-medium truncate',\n disabled:\n 'inline-flex items-center text-fg-subtle opacity-50 cursor-not-allowed truncate',\n // Separator carries rtl:rotate-180 so the chevron flips for RTL layouts;\n // requires a `dir=\"rtl\"` ancestor for Tailwind's rtl: variant to match.\n separator:\n 'inline-flex items-center text-fg-subtle shrink-0 select-none rtl:rotate-180',\n overflowTrigger:\n 'inline-flex items-center justify-center rounded-md text-fg-muted hover:text-fg hover:bg-surface-muted ' +\n 'transition-colors duration-200 motion-reduce:transition-none ' +\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500 cursor-pointer',\n },\n variants: {\n size: {\n xs: {\n list: 'gap-1',\n link: 'text-xs',\n current: 'text-xs',\n disabled: 'text-xs',\n separator: 'text-xs',\n overflowTrigger: 'size-6 text-xs',\n },\n sm: {\n list: 'gap-1',\n link: 'text-sm',\n current: 'text-sm',\n disabled: 'text-sm',\n separator: 'text-sm',\n overflowTrigger: 'size-7 text-sm',\n },\n md: {\n list: 'gap-1.5',\n link: 'text-sm',\n current: 'text-sm',\n disabled: 'text-sm',\n separator: 'text-sm',\n overflowTrigger: 'size-8 text-sm',\n },\n lg: {\n list: 'gap-2',\n link: 'text-base',\n current: 'text-base',\n disabled: 'text-base',\n separator: 'text-base',\n overflowTrigger: 'size-9 text-base',\n },\n xl: {\n list: 'gap-2',\n link: 'text-base',\n current: 'text-base',\n disabled: 'text-base',\n separator: 'text-base',\n overflowTrigger: 'size-9 text-base',\n },\n },\n },\n defaultVariants: { size: 'md' },\n },\n { twMerge: true },\n);\n\n// Separator glyph size mirrors the menu-item icon scale: keep the chevron one\n// step below the text-size step so it reads as a quiet hint, not a glyph.\nconst ICON_SIZE_FOR_BREADCRUMB: Record<TwSize, TwSize> = {\n xs: 'xs',\n sm: 'sm',\n md: 'sm',\n lg: 'md',\n xl: 'md',\n};\n\n// ── Template slot directives ──\n\n/**\n * Structural directive applied to an `<ng-template>` projected into\n * `tw-breadcrumbs`. Replaces the default per-item rendering so consumers can\n * wire their own anchors (typically `routerLink`-bound). The template receives\n * `$implicit` (the item), `item`, `index`, and `isCurrent` in its context.\n */\n@Directive({\n selector: '[twBreadcrumbsItem]',\n})\nexport class BreadcrumbsItemTemplateDirective<T = unknown> {\n /** @internal */\n readonly templateRef = inject<TemplateRef<TwBreadcrumbsItemContext<T>>>(TemplateRef);\n\n /** Type-narrows the template context for `let-` destructuring in templates. */\n static ngTemplateContextGuard<T>(\n _dir: BreadcrumbsItemTemplateDirective<T>,\n _ctx: unknown,\n ): _ctx is TwBreadcrumbsItemContext<T> {\n return true;\n }\n}\n\n/**\n * Structural directive applied to an `<ng-template>` projected into\n * `tw-breadcrumbs`. Replaces the default chevron separator with custom\n * content (any element — icon, text, dot, etc.).\n */\n@Directive({\n selector: '[twBreadcrumbsSeparator]',\n})\nexport class BreadcrumbsSeparatorTemplateDirective {\n /** @internal */\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n\n// ── Link styling directive ──\n\n/**\n * Applies the parent `tw-breadcrumbs` link / current / disabled styling to a\n * consumer-projected anchor (or span) inside `*twBreadcrumbsItem`. Without\n * this directive, projected content renders unstyled — only the layout `<li>`\n * is provided by the component.\n *\n * The directive sets `aria-current=\"page\"` when `current` is true. It does\n * NOT itself swap the element tag; the consumer should still pick `<a>` for\n * link items and `<span>` for the current item.\n */\n@Directive({\n selector: '[twBreadcrumbsLink]',\n host: {\n '[class]': 'classes()',\n '[attr.aria-current]': 'current() ? \"page\" : null',\n },\n})\nexport class BreadcrumbsLinkDirective {\n /** When true, this element is the current page: styled bold and gets `aria-current=\"page\"`. Defaults to `false`. */\n readonly current = input(false);\n\n /** When true, applies disabled styling (muted, not-allowed cursor). Defaults to `false`. */\n readonly disabled = input(false);\n\n private readonly parent = inject<BreadcrumbsComponent<unknown>>(\n forwardRef(() => BreadcrumbsComponent),\n );\n\n /** @internal Combined classes pulled from the parent component's slot tokens. */\n readonly classes = computed(() => {\n const slots = this.parent.slotResult();\n if (this.disabled()) return slots.disabled();\n if (this.current()) return slots.current();\n return slots.link();\n });\n}\n\n// ── Rendered entry types (internal) ──\n\ninterface RenderedItem<T> {\n readonly kind: 'item';\n readonly item: TwBreadcrumbsItem<T>;\n readonly index: number;\n readonly isCurrent: boolean;\n readonly key: string;\n}\n\ninterface RenderedSeparator {\n readonly kind: 'separator';\n readonly key: string;\n}\n\ninterface RenderedOverflow {\n readonly kind: 'overflow';\n readonly key: string;\n}\n\ntype RenderedEntry<T> = RenderedItem<T> | RenderedSeparator | RenderedOverflow;\n\n// ── BreadcrumbsComponent ──\n\n/**\n * Breadcrumb trail rendered as a `<nav>` landmark with an ordered list of\n * navigation hops. The last entry in `items` is the current page (gets\n * `aria-current=\"page\"`, never an anchor). Items beyond `maxItems` are\n * collapsed behind an ellipsis trigger that opens an overflow menu.\n *\n * Customize per-item rendering with `*twBreadcrumbsItem` (consumer projects\n * router-aware anchors), and the separator with `*twBreadcrumbsSeparator` or\n * the `separator` input (Lucide icon name).\n *\n * @example\n * ```html\n * <tw-breadcrumbs [items]=\"trail\" />\n *\n * <tw-breadcrumbs [items]=\"trail\" [maxItems]=\"3\" separator=\"slash\">\n * <ng-template twBreadcrumbsItem let-item let-isCurrent=\"isCurrent\">\n * @if (isCurrent) {\n * <span twBreadcrumbsLink [current]=\"true\">{{ item.label }}</span>\n * } @else {\n * <a twBreadcrumbsLink [routerLink]=\"item.data?.routerLink\">{{ item.label }}</a>\n * }\n * </ng-template>\n * </tw-breadcrumbs>\n * ```\n */\n@Component({\n selector: 'tw-breadcrumbs',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgTemplateOutlet,\n IconComponent,\n MenuComponent,\n MenuItemDirective,\n MenuTriggerDirective,\n ],\n host: {\n // Custom elements default to inline; force a block layout so the trail\n // behaves predictably inside flex / grid containers.\n class: 'block min-w-0',\n },\n template: `\n <nav [attr.aria-label]=\"ariaLabel()\">\n <ol [class]=\"listClasses()\">\n @for (entry of renderedEntries(); track entry.key) {\n @if (entry.kind === 'item') {\n <li [class]=\"itemClasses()\">\n @if (itemTemplate(); as tpl) {\n <ng-container\n *ngTemplateOutlet=\"\n tpl.templateRef;\n context: {\n $implicit: entry.item,\n item: entry.item,\n index: entry.index,\n isCurrent: entry.isCurrent\n }\n \"\n />\n } @else {\n @if (entry.isCurrent) {\n <span [class]=\"currentClasses()\" aria-current=\"page\">{{ entry.item.label }}</span>\n } @else if (entry.item.disabled) {\n <span [class]=\"disabledClasses()\" aria-disabled=\"true\">{{ entry.item.label }}</span>\n } @else if (entry.item.href) {\n <a [class]=\"linkClasses()\" [attr.href]=\"entry.item.href\">{{ entry.item.label }}</a>\n } @else {\n <span [class]=\"linkClasses()\">{{ entry.item.label }}</span>\n }\n }\n </li>\n } @else if (entry.kind === 'separator') {\n <li [class]=\"separatorClasses()\" aria-hidden=\"true\">\n @if (separatorTemplate(); as sepTpl) {\n <ng-container *ngTemplateOutlet=\"sepTpl.templateRef\" />\n } @else {\n <tw-icon [name]=\"separator()\" [size]=\"iconSize()\" />\n }\n </li>\n } @else {\n <li [class]=\"itemClasses()\">\n <button\n type=\"button\"\n [class]=\"overflowTriggerClasses()\"\n [twMenuTrigger]=\"overflowMenuTpl\"\n aria-label=\"Show more breadcrumbs\"\n >\n <span aria-hidden=\"true\">&hellip;</span>\n </button>\n <ng-template #overflowMenuTpl>\n <tw-menu aria-label=\"Hidden breadcrumb items\">\n @for (hidden of collapsedItems(); track hidden) {\n @if (hidden.disabled || !hidden.href) {\n <span twMenuItem [attr.aria-disabled]=\"hidden.disabled ? 'true' : null\">\n {{ hidden.label }}\n </span>\n } @else {\n <a twMenuItem [attr.href]=\"hidden.href\">{{ hidden.label }}</a>\n }\n }\n </tw-menu>\n </ng-template>\n </li>\n }\n }\n </ol>\n </nav>\n `,\n})\nexport class BreadcrumbsComponent<T = unknown> {\n /** The full breadcrumb trail. The last entry is treated as the current page. Defaults to `[]`. */\n readonly items = input<readonly TwBreadcrumbsItem<T>[]>([]);\n\n /** Density of the trail — drives font size, gap, icon size, and the overflow-button square. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /**\n * When greater than `0`, the trail collapses any middle items past this\n * threshold behind an overflow menu. The first item and the current (last)\n * item are always visible. Values `< 2` are clamped to `2`. Defaults to `0`\n * (no collapsing).\n */\n readonly maxItems = input<number>(0);\n\n /**\n * Lucide icon name used for the default separator between items. Ignored\n * when a `*twBreadcrumbsSeparator` template is projected. Defaults to\n * `'chevron-right'`. Requires the consumer to register the icon via\n * `provideTwLucideIcons({ ChevronRight, ... })`.\n */\n readonly separator = input<string>('chevron-right');\n\n /** Accessible label applied to the `<nav>` landmark. Defaults to `'Breadcrumb'`. Aliased as `aria-label`. */\n readonly ariaLabel = input<string>('Breadcrumb', { alias: 'aria-label' });\n\n /** Custom per-item template projected via `*twBreadcrumbsItem`. */\n readonly itemTemplate = contentChild(BreadcrumbsItemTemplateDirective<T>);\n\n /** Custom separator template projected via `*twBreadcrumbsSeparator`. */\n readonly separatorTemplate = contentChild(BreadcrumbsSeparatorTemplateDirective);\n\n /** @internal Materialised tv() slot result; exposed so `BreadcrumbsLinkDirective` can pull link/current/disabled classes. */\n readonly slotResult = computed(() => breadcrumbs({ size: this.size() }));\n\n /** @internal Icon size for the default chevron separator. */\n readonly iconSize = computed(() => ICON_SIZE_FOR_BREADCRUMB[this.size()]);\n\n /** @internal Class strings per slot, memoised. */\n readonly listClasses = computed(() => this.slotResult().list());\n readonly itemClasses = computed(() => this.slotResult().item());\n readonly linkClasses = computed(() => this.slotResult().link());\n readonly currentClasses = computed(() => this.slotResult().current());\n readonly disabledClasses = computed(() => this.slotResult().disabled());\n readonly separatorClasses = computed(() => this.slotResult().separator());\n readonly overflowTriggerClasses = computed(() => this.slotResult().overflowTrigger());\n\n /** @internal Items hidden behind the overflow menu. Empty when no collapsing is active. */\n readonly collapsedItems = computed<readonly TwBreadcrumbsItem<T>[]>(() => {\n const all = this.items();\n const max = this.maxItems();\n if (max <= 0 || all.length <= 2 || all.length <= max) return [];\n const effectiveMax = Math.max(max, 2);\n if (all.length <= effectiveMax) return [];\n const tailCount = effectiveMax - 1;\n const hiddenEnd = all.length - tailCount;\n return all.slice(1, hiddenEnd);\n });\n\n /** @internal Flat sequence of items + separators + overflow used by the template's @for. */\n readonly renderedEntries = computed<RenderedEntry<T>[]>(() => {\n const all = this.items();\n const max = this.maxItems();\n if (all.length === 0) return [];\n\n const entries: RenderedEntry<T>[] = [];\n const lastIndex = all.length - 1;\n const pushSeparator = (key: string) =>\n entries.push({ kind: 'separator', key: `sep-${key}` });\n\n const collapsing = max > 0 && all.length > 2 && all.length > max;\n const effectiveMax = Math.max(max, 2);\n const shouldCollapse = collapsing && all.length > effectiveMax;\n\n if (!shouldCollapse) {\n for (let i = 0; i < all.length; i++) {\n if (i > 0) pushSeparator(`${i}`);\n entries.push({\n kind: 'item',\n item: all[i],\n index: i,\n isCurrent: i === lastIndex,\n key: `item-${i}`,\n });\n }\n return entries;\n }\n\n const tailCount = effectiveMax - 1;\n const tailStart = all.length - tailCount;\n\n // First item.\n entries.push({\n kind: 'item',\n item: all[0],\n index: 0,\n isCurrent: lastIndex === 0,\n key: 'item-0',\n });\n pushSeparator('after-first');\n\n // Overflow trigger.\n entries.push({ kind: 'overflow', key: 'overflow' });\n pushSeparator('after-overflow');\n\n // Tail items.\n for (let i = tailStart; i < all.length; i++) {\n if (i > tailStart) pushSeparator(`${i}`);\n entries.push({\n kind: 'item',\n item: all[i],\n index: i,\n isCurrent: i === lastIndex,\n key: `item-${i}`,\n });\n }\n\n return entries;\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cdevhub-ngx-tw-breadcrumbs.mjs","sources":["../../../projects/ngx-tw/breadcrumbs/breadcrumbs.ts","../../../projects/ngx-tw/breadcrumbs/cdevhub-ngx-tw-breadcrumbs.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n Directive,\n TemplateRef,\n computed,\n contentChild,\n forwardRef,\n inject,\n input,\n} from '@angular/core';\nimport { tv } from 'tailwind-variants';\nimport type { TwSize } from '@cdevhub/ngx-tw/core';\nimport { IconComponent } from '@cdevhub/ngx-tw/icon';\nimport {\n MenuComponent,\n MenuItemDirective,\n MenuTriggerDirective,\n} from '@cdevhub/ngx-tw/menu';\n\n// ── Public types ──\n\n/**\n * Describes a single hop in a breadcrumb trail. The last entry in `items` is\n * always treated as the current page (rendered with `aria-current=\"page\"`,\n * never as an anchor).\n *\n * The generic `T` types the optional `data` payload — useful for forwarding\n * routerLink commands or any other consumer-defined metadata to the custom\n * item template without unsafe casts.\n */\nexport interface TwBreadcrumbsItem<T = unknown> {\n /** Visible label shown for this hop. */\n label: string;\n /**\n * Optional href used to render the default anchor. Omit on the current item\n * (the last entry). Ignored when a custom `*twBreadcrumbsItem` template is\n * projected — the consumer owns the anchor in that case.\n */\n href?: string;\n /**\n * Opaque payload forwarded to the consumer's `*twBreadcrumbsItem` template\n * via the template context. Use this to carry router commands or any other\n * data your template needs.\n */\n data?: T;\n /**\n * When true, the item renders as muted text without an anchor (even if\n * `href` is set). Receives `aria-disabled=\"true\"`.\n */\n disabled?: boolean;\n}\n\n/**\n * Template context passed to `*twBreadcrumbsItem` for each rendered item.\n */\nexport interface TwBreadcrumbsItemContext<T = unknown> {\n /** The item record (also exposed via `let-item=\"$implicit\"`). */\n $implicit: TwBreadcrumbsItem<T>;\n /** Same as `$implicit`. Available via `let-item=\"item\"` for readability. */\n item: TwBreadcrumbsItem<T>;\n /** Zero-based index of this item in the original `items` input. */\n index: number;\n /** `true` only for the last entry — the current page. */\n isCurrent: boolean;\n}\n\n// ── tv() config ──\n\nconst breadcrumbs = tv(\n {\n slots: {\n // The host outer element (<tw-breadcrumbs>) is a custom element; we wrap\n // the actual landmark <nav> inside the template. The list is a real <ol>\n // so the trail keeps its semantic ordering for assistive tech.\n list: 'flex flex-wrap items-center m-0 p-0 list-none min-w-0',\n item: 'inline-flex items-center min-w-0',\n link:\n 'inline-flex items-center text-fg-muted hover:text-fg transition-colors duration-200 motion-reduce:transition-none ' +\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500 rounded-md no-underline truncate',\n current: 'inline-flex items-center text-fg font-medium truncate',\n disabled:\n 'inline-flex items-center text-fg-subtle opacity-50 cursor-not-allowed truncate',\n // Separator carries rtl:rotate-180 so the chevron flips for RTL layouts;\n // requires a `dir=\"rtl\"` ancestor for Tailwind's rtl: variant to match.\n separator:\n 'inline-flex items-center text-fg-subtle shrink-0 select-none rtl:rotate-180',\n overflowTrigger:\n 'inline-flex items-center justify-center rounded-md text-fg-muted hover:text-fg hover:bg-surface-muted ' +\n 'transition-colors duration-200 motion-reduce:transition-none ' +\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500 cursor-pointer',\n },\n variants: {\n size: {\n xs: {\n list: 'gap-1',\n link: 'text-xs',\n current: 'text-xs',\n disabled: 'text-xs',\n separator: 'text-xs',\n overflowTrigger: 'size-6 text-xs',\n },\n sm: {\n list: 'gap-1',\n link: 'text-sm',\n current: 'text-sm',\n disabled: 'text-sm',\n separator: 'text-sm',\n overflowTrigger: 'size-7 text-sm',\n },\n md: {\n list: 'gap-1.5',\n link: 'text-sm',\n current: 'text-sm',\n disabled: 'text-sm',\n separator: 'text-sm',\n overflowTrigger: 'size-8 text-sm',\n },\n lg: {\n list: 'gap-2',\n link: 'text-base',\n current: 'text-base',\n disabled: 'text-base',\n separator: 'text-base',\n overflowTrigger: 'size-9 text-base',\n },\n xl: {\n list: 'gap-2',\n link: 'text-base',\n current: 'text-base',\n disabled: 'text-base',\n separator: 'text-base',\n overflowTrigger: 'size-9 text-base',\n },\n },\n },\n defaultVariants: { size: 'md' },\n },\n { twMerge: true },\n);\n\n// Separator glyph size mirrors the menu-item icon scale: keep the chevron one\n// step below the text-size step so it reads as a quiet hint, not a glyph.\nconst ICON_SIZE_FOR_BREADCRUMB: Record<TwSize, TwSize> = {\n xs: 'xs',\n sm: 'sm',\n md: 'sm',\n lg: 'md',\n xl: 'md',\n};\n\n// ── Template slot directives ──\n\n/**\n * Structural directive applied to an `<ng-template>` projected into\n * `tw-breadcrumbs`. Replaces the default per-item rendering so consumers can\n * wire their own anchors (typically `routerLink`-bound). The template receives\n * `$implicit` (the item), `item`, `index`, and `isCurrent` in its context.\n */\n@Directive({\n selector: '[twBreadcrumbsItem]',\n})\nexport class BreadcrumbsItemTemplateDirective<T = unknown> {\n /** @internal */\n readonly templateRef = inject<TemplateRef<TwBreadcrumbsItemContext<T>>>(TemplateRef);\n\n /** Type-narrows the template context for `let-` destructuring in templates. */\n static ngTemplateContextGuard<T>(\n _dir: BreadcrumbsItemTemplateDirective<T>,\n _ctx: unknown,\n ): _ctx is TwBreadcrumbsItemContext<T> {\n return true;\n }\n}\n\n/**\n * Structural directive applied to an `<ng-template>` projected into\n * `tw-breadcrumbs`. Replaces the default chevron separator with custom\n * content (any element — icon, text, dot, etc.).\n */\n@Directive({\n selector: '[twBreadcrumbsSeparator]',\n})\nexport class BreadcrumbsSeparatorTemplateDirective {\n /** @internal */\n readonly templateRef = inject<TemplateRef<unknown>>(TemplateRef);\n}\n\n// ── Link styling directive ──\n\n/**\n * Applies the parent `tw-breadcrumbs` link / current / disabled styling to a\n * consumer-projected anchor (or span) inside `*twBreadcrumbsItem`. Without\n * this directive, projected content renders unstyled — only the layout `<li>`\n * is provided by the component.\n *\n * The directive sets `aria-current=\"page\"` when `current` is true. It does\n * NOT itself swap the element tag; the consumer should still pick `<a>` for\n * link items and `<span>` for the current item.\n */\n@Directive({\n selector: '[twBreadcrumbsLink]',\n host: {\n '[class]': 'classes()',\n '[attr.aria-current]': 'current() ? \"page\" : null',\n },\n})\nexport class BreadcrumbsLinkDirective {\n /** When true, this element is the current page: styled bold and gets `aria-current=\"page\"`. Defaults to `false`. */\n readonly current = input(false);\n\n /** When true, applies disabled styling (muted, not-allowed cursor). Defaults to `false`. */\n readonly disabled = input(false);\n\n private readonly parent = inject<BreadcrumbsComponent<unknown>>(\n forwardRef(() => BreadcrumbsComponent),\n );\n\n /** @internal Combined classes pulled from the parent component's slot tokens. */\n readonly classes = computed(() => {\n const slots = this.parent.slotResult();\n if (this.disabled()) return slots.disabled();\n if (this.current()) return slots.current();\n return slots.link();\n });\n}\n\n// ── Rendered entry types (internal) ──\n\ninterface RenderedItem<T> {\n readonly kind: 'item';\n readonly item: TwBreadcrumbsItem<T>;\n readonly index: number;\n readonly isCurrent: boolean;\n readonly key: string;\n}\n\ninterface RenderedSeparator {\n readonly kind: 'separator';\n readonly key: string;\n}\n\ninterface RenderedOverflow {\n readonly kind: 'overflow';\n readonly key: string;\n}\n\ntype RenderedEntry<T> = RenderedItem<T> | RenderedSeparator | RenderedOverflow;\n\n// ── BreadcrumbsComponent ──\n\n/**\n * Breadcrumb trail rendered as a `<nav>` landmark with an ordered list of\n * navigation hops. The last entry in `items` is the current page (gets\n * `aria-current=\"page\"`, never an anchor). Items beyond `maxItems` are\n * collapsed behind an ellipsis trigger that opens an overflow menu.\n *\n * Customize per-item rendering with `*twBreadcrumbsItem` (consumer projects\n * router-aware anchors), and the separator with `*twBreadcrumbsSeparator` or\n * the `separator` input (Lucide icon name).\n *\n * @example\n * ```html\n * <tw-breadcrumbs [items]=\"trail\" />\n *\n * <tw-breadcrumbs [items]=\"trail\" [maxItems]=\"3\" separator=\"slash\">\n * <ng-template twBreadcrumbsItem let-item let-isCurrent=\"isCurrent\">\n * @if (isCurrent) {\n * <span twBreadcrumbsLink [current]=\"true\">{{ item.label }}</span>\n * } @else {\n * <a twBreadcrumbsLink [routerLink]=\"item.data?.routerLink\">{{ item.label }}</a>\n * }\n * </ng-template>\n * </tw-breadcrumbs>\n * ```\n */\n@Component({\n selector: 'tw-breadcrumbs',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgTemplateOutlet,\n IconComponent,\n MenuComponent,\n MenuItemDirective,\n MenuTriggerDirective,\n ],\n host: {\n // Custom elements default to inline; force a block layout so the trail\n // behaves predictably inside flex / grid containers.\n class: 'block min-w-0',\n },\n template: `\n <nav [attr.aria-label]=\"ariaLabel()\">\n <ol [class]=\"listClasses()\">\n @for (entry of renderedEntries(); track entry.key) {\n @if (entry.kind === 'item') {\n <li [class]=\"itemClasses()\">\n @if (itemTemplate(); as tpl) {\n <ng-container\n *ngTemplateOutlet=\"\n tpl.templateRef;\n context: {\n $implicit: entry.item,\n item: entry.item,\n index: entry.index,\n isCurrent: entry.isCurrent\n }\n \"\n />\n } @else {\n @if (entry.isCurrent) {\n <span [class]=\"currentClasses()\" aria-current=\"page\">{{ entry.item.label }}</span>\n } @else if (entry.item.disabled) {\n <span [class]=\"disabledClasses()\" aria-disabled=\"true\">{{ entry.item.label }}</span>\n } @else if (entry.item.href) {\n <a [class]=\"linkClasses()\" [attr.href]=\"entry.item.href\">{{ entry.item.label }}</a>\n } @else {\n <span [class]=\"linkClasses()\">{{ entry.item.label }}</span>\n }\n }\n </li>\n } @else if (entry.kind === 'separator') {\n <li [class]=\"separatorClasses()\" aria-hidden=\"true\">\n @if (separatorTemplate(); as sepTpl) {\n <ng-container *ngTemplateOutlet=\"sepTpl.templateRef\" />\n } @else {\n <tw-icon [name]=\"separator()\" [size]=\"iconSize()\" />\n }\n </li>\n } @else {\n <li [class]=\"itemClasses()\">\n <!--\n The overflow menu pulls in tw-menu + @angular/cdk/menu (overlay,\n focus-trap). @defer keeps that weight in a lazy chunk so a plain\n breadcrumb trail (the common case, maxItems=0) never bundles it;\n the chunk loads when the trigger scrolls into view and is\n prefetched on idle to keep the first click responsive. The\n @placeholder mirrors the trigger so layout and a11y are stable.\n -->\n @defer (on viewport; prefetch on idle) {\n <button\n type=\"button\"\n [class]=\"overflowTriggerClasses()\"\n [twMenuTrigger]=\"overflowMenuTpl\"\n aria-label=\"Show more breadcrumbs\"\n >\n <span aria-hidden=\"true\">&hellip;</span>\n </button>\n <ng-template #overflowMenuTpl>\n <tw-menu aria-label=\"Hidden breadcrumb items\">\n @for (hidden of collapsedItems(); track hidden) {\n @if (hidden.disabled || !hidden.href) {\n <span twMenuItem [attr.aria-disabled]=\"hidden.disabled ? 'true' : null\">\n {{ hidden.label }}\n </span>\n } @else {\n <a twMenuItem [attr.href]=\"hidden.href\">{{ hidden.label }}</a>\n }\n }\n </tw-menu>\n </ng-template>\n } @placeholder {\n <button\n type=\"button\"\n [class]=\"overflowTriggerClasses()\"\n aria-label=\"Show more breadcrumbs\"\n >\n <span aria-hidden=\"true\">&hellip;</span>\n </button>\n }\n </li>\n }\n }\n </ol>\n </nav>\n `,\n})\nexport class BreadcrumbsComponent<T = unknown> {\n /** The full breadcrumb trail. The last entry is treated as the current page. Defaults to `[]`. */\n readonly items = input<readonly TwBreadcrumbsItem<T>[]>([]);\n\n /** Density of the trail — drives font size, gap, icon size, and the overflow-button square. Defaults to `'md'`. */\n readonly size = input<TwSize>('md');\n\n /**\n * When greater than `0`, the trail collapses any middle items past this\n * threshold behind an overflow menu. The first item and the current (last)\n * item are always visible. Values `< 2` are clamped to `2`. Defaults to `0`\n * (no collapsing).\n */\n readonly maxItems = input<number>(0);\n\n /**\n * Lucide icon name used for the default separator between items. Ignored\n * when a `*twBreadcrumbsSeparator` template is projected. Defaults to\n * `'chevron-right'`. Requires the consumer to register the icon via\n * `provideTwLucideIcons({ ChevronRight, ... })`.\n */\n readonly separator = input<string>('chevron-right');\n\n /** Accessible label applied to the `<nav>` landmark. Defaults to `'Breadcrumb'`. Aliased as `aria-label`. */\n readonly ariaLabel = input<string>('Breadcrumb', { alias: 'aria-label' });\n\n /** Custom per-item template projected via `*twBreadcrumbsItem`. */\n readonly itemTemplate = contentChild(BreadcrumbsItemTemplateDirective<T>);\n\n /** Custom separator template projected via `*twBreadcrumbsSeparator`. */\n readonly separatorTemplate = contentChild(BreadcrumbsSeparatorTemplateDirective);\n\n /** @internal Materialised tv() slot result; exposed so `BreadcrumbsLinkDirective` can pull link/current/disabled classes. */\n readonly slotResult = computed(() => breadcrumbs({ size: this.size() }));\n\n /** @internal Icon size for the default chevron separator. */\n readonly iconSize = computed(() => ICON_SIZE_FOR_BREADCRUMB[this.size()]);\n\n /** @internal Class strings per slot, memoised. */\n readonly listClasses = computed(() => this.slotResult().list());\n readonly itemClasses = computed(() => this.slotResult().item());\n readonly linkClasses = computed(() => this.slotResult().link());\n readonly currentClasses = computed(() => this.slotResult().current());\n readonly disabledClasses = computed(() => this.slotResult().disabled());\n readonly separatorClasses = computed(() => this.slotResult().separator());\n readonly overflowTriggerClasses = computed(() => this.slotResult().overflowTrigger());\n\n /** @internal Items hidden behind the overflow menu. Empty when no collapsing is active. */\n readonly collapsedItems = computed<readonly TwBreadcrumbsItem<T>[]>(() => {\n const all = this.items();\n const max = this.maxItems();\n if (max <= 0 || all.length <= 2 || all.length <= max) return [];\n const effectiveMax = Math.max(max, 2);\n if (all.length <= effectiveMax) return [];\n const tailCount = effectiveMax - 1;\n const hiddenEnd = all.length - tailCount;\n return all.slice(1, hiddenEnd);\n });\n\n /** @internal Flat sequence of items + separators + overflow used by the template's @for. */\n readonly renderedEntries = computed<RenderedEntry<T>[]>(() => {\n const all = this.items();\n const max = this.maxItems();\n if (all.length === 0) return [];\n\n const entries: RenderedEntry<T>[] = [];\n const lastIndex = all.length - 1;\n const pushSeparator = (key: string) =>\n entries.push({ kind: 'separator', key: `sep-${key}` });\n\n const collapsing = max > 0 && all.length > 2 && all.length > max;\n const effectiveMax = Math.max(max, 2);\n const shouldCollapse = collapsing && all.length > effectiveMax;\n\n if (!shouldCollapse) {\n for (let i = 0; i < all.length; i++) {\n if (i > 0) pushSeparator(`${i}`);\n entries.push({\n kind: 'item',\n item: all[i],\n index: i,\n isCurrent: i === lastIndex,\n key: `item-${i}`,\n });\n }\n return entries;\n }\n\n const tailCount = effectiveMax - 1;\n const tailStart = all.length - tailCount;\n\n // First item.\n entries.push({\n kind: 'item',\n item: all[0],\n index: 0,\n isCurrent: lastIndex === 0,\n key: 'item-0',\n });\n pushSeparator('after-first');\n\n // Overflow trigger.\n entries.push({ kind: 'overflow', key: 'overflow' });\n pushSeparator('after-overflow');\n\n // Tail items.\n for (let i = tailStart; i < all.length; i++) {\n if (i > tailStart) pushSeparator(`${i}`);\n entries.push({\n kind: 'item',\n item: all[i],\n index: i,\n isCurrent: i === lastIndex,\n key: `item-${i}`,\n });\n }\n\n return entries;\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}