@cdevhub/ngx-tw 0.5.0 → 0.6.1

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 (209) hide show
  1. package/README.md +78 -15
  2. package/fesm2022/cdevhub-ngx-tw-accordion.mjs +16 -5
  3. package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
  4. package/fesm2022/cdevhub-ngx-tw-avatar.mjs +26 -15
  5. package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
  6. package/fesm2022/cdevhub-ngx-tw-badge.mjs +17 -5
  7. package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
  8. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +27 -6
  9. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
  10. package/fesm2022/cdevhub-ngx-tw-button.mjs +23 -11
  11. package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
  12. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +5 -5
  13. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
  14. package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +3 -3
  15. package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -1
  16. package/fesm2022/cdevhub-ngx-tw-calendar.mjs +427 -122
  17. package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
  18. package/fesm2022/cdevhub-ngx-tw-card.mjs +21 -11
  19. package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
  20. package/fesm2022/cdevhub-ngx-tw-carousel.mjs +215 -96
  21. package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
  22. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +108 -64
  23. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
  24. package/fesm2022/cdevhub-ngx-tw-code-block.mjs +18 -6
  25. package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
  26. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +55 -30
  27. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
  28. package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs +218 -0
  29. package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs.map +1 -0
  30. package/fesm2022/cdevhub-ngx-tw-combobox.mjs +236 -211
  31. package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
  32. package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs +200 -0
  33. package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs.map +1 -0
  34. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +34 -7
  35. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
  36. package/fesm2022/cdevhub-ngx-tw-core.mjs +135 -15
  37. package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
  38. package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs +203 -0
  39. package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs.map +1 -0
  40. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +160 -102
  41. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
  42. package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs +209 -0
  43. package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs.map +1 -0
  44. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +182 -107
  45. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
  46. package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs +122 -0
  47. package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs.map +1 -0
  48. package/fesm2022/cdevhub-ngx-tw-dialog.mjs +11 -2
  49. package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
  50. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +1 -1
  51. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
  52. package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs +149 -0
  53. package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs.map +1 -0
  54. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +57 -67
  55. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -1
  56. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +42 -24
  57. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
  58. package/fesm2022/cdevhub-ngx-tw-form-field.mjs +114 -21
  59. package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
  60. package/fesm2022/cdevhub-ngx-tw-icon.mjs +16 -6
  61. package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
  62. package/fesm2022/cdevhub-ngx-tw-input.mjs +52 -61
  63. package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
  64. package/fesm2022/cdevhub-ngx-tw-item.mjs +28 -4
  65. package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
  66. package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs +168 -0
  67. package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs.map +1 -0
  68. package/fesm2022/cdevhub-ngx-tw-menu.mjs +58 -21
  69. package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
  70. package/fesm2022/cdevhub-ngx-tw-number-input.mjs +34 -1
  71. package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -1
  72. package/fesm2022/cdevhub-ngx-tw-paginator.mjs +95 -45
  73. package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
  74. package/fesm2022/cdevhub-ngx-tw-popover.mjs +81 -32
  75. package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
  76. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +1 -1
  77. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
  78. package/fesm2022/cdevhub-ngx-tw-radio.mjs +131 -98
  79. package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
  80. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +207 -42
  81. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
  82. package/fesm2022/cdevhub-ngx-tw-select-testing.mjs +165 -0
  83. package/fesm2022/cdevhub-ngx-tw-select-testing.mjs.map +1 -0
  84. package/fesm2022/cdevhub-ngx-tw-select.mjs +386 -210
  85. package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
  86. package/fesm2022/{cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs → cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs} +3 -3
  87. package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs.map +1 -0
  88. package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs +129 -0
  89. package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs.map +1 -0
  90. package/fesm2022/cdevhub-ngx-tw-sheet.mjs +23 -7
  91. package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
  92. package/fesm2022/cdevhub-ngx-tw-slider.mjs +89 -54
  93. package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
  94. package/fesm2022/cdevhub-ngx-tw-sort.mjs +122 -17
  95. package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
  96. package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -19
  97. package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
  98. package/fesm2022/cdevhub-ngx-tw-stat.mjs +63 -25
  99. package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
  100. package/fesm2022/cdevhub-ngx-tw-stepper.mjs +35 -8
  101. package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
  102. package/fesm2022/cdevhub-ngx-tw-switch.mjs +54 -48
  103. package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
  104. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +12 -15
  105. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
  106. package/fesm2022/cdevhub-ngx-tw-table.mjs +74 -13
  107. package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
  108. package/fesm2022/cdevhub-ngx-tw-tabs.mjs +84 -30
  109. package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
  110. package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs +172 -0
  111. package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs.map +1 -0
  112. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +107 -71
  113. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -1
  114. package/fesm2022/cdevhub-ngx-tw-textarea.mjs +41 -9
  115. package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
  116. package/fesm2022/cdevhub-ngx-tw-theme.mjs +257 -45
  117. package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
  118. package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs +201 -0
  119. package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs.map +1 -0
  120. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +184 -77
  121. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
  122. package/fesm2022/cdevhub-ngx-tw-timeline.mjs +110 -27
  123. package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
  124. package/fesm2022/{cdevhub-ngx-tw-toast-toast-renderer-DSu4YoTy.mjs → cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs} +107 -19
  125. package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs.map +1 -0
  126. package/fesm2022/cdevhub-ngx-tw-toast.mjs +21 -13
  127. package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
  128. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +102 -15
  129. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
  130. package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs +219 -0
  131. package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs.map +1 -0
  132. package/fesm2022/cdevhub-ngx-tw-transfer.mjs +88 -69
  133. package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -1
  134. package/fesm2022/cdevhub-ngx-tw-tree.mjs +68 -19
  135. package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -1
  136. package/index.json +1 -1
  137. package/package.json +63 -2
  138. package/theme/_base.css +13 -0
  139. package/theme/_dark.css +111 -36
  140. package/theme/_high-contrast-dark.css +367 -0
  141. package/theme/_high-contrast.css +13 -2
  142. package/theme/_light.css +332 -0
  143. package/theme/_semantic.css +60 -26
  144. package/theme/_typography.css +17 -0
  145. package/theme/index.css +86 -7
  146. package/types/cdevhub-ngx-tw-accordion.d.ts +12 -4
  147. package/types/cdevhub-ngx-tw-avatar.d.ts +10 -3
  148. package/types/cdevhub-ngx-tw-button.d.ts +1 -0
  149. package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +2 -2
  150. package/types/cdevhub-ngx-tw-calendar-testing.d.ts +1 -1
  151. package/types/cdevhub-ngx-tw-calendar.d.ts +179 -73
  152. package/types/cdevhub-ngx-tw-card.d.ts +11 -3
  153. package/types/cdevhub-ngx-tw-carousel.d.ts +89 -20
  154. package/types/cdevhub-ngx-tw-checkbox.d.ts +40 -12
  155. package/types/cdevhub-ngx-tw-code-block.d.ts +11 -2
  156. package/types/cdevhub-ngx-tw-collapsible.d.ts +32 -5
  157. package/types/cdevhub-ngx-tw-combobox-testing.d.ts +157 -0
  158. package/types/cdevhub-ngx-tw-combobox.d.ts +94 -53
  159. package/types/cdevhub-ngx-tw-command-palette-testing.d.ts +136 -0
  160. package/types/cdevhub-ngx-tw-command-palette.d.ts +33 -5
  161. package/types/cdevhub-ngx-tw-core.d.ts +152 -21
  162. package/types/cdevhub-ngx-tw-date-picker-testing.d.ts +141 -0
  163. package/types/cdevhub-ngx-tw-date-picker.d.ts +37 -29
  164. package/types/cdevhub-ngx-tw-date-range-picker-testing.d.ts +148 -0
  165. package/types/cdevhub-ngx-tw-date-range-picker.d.ts +36 -29
  166. package/types/cdevhub-ngx-tw-dialog-testing.d.ts +98 -0
  167. package/types/cdevhub-ngx-tw-dialog.d.ts +12 -3
  168. package/types/cdevhub-ngx-tw-file-upload-testing.d.ts +120 -0
  169. package/types/cdevhub-ngx-tw-file-upload.d.ts +8 -10
  170. package/types/cdevhub-ngx-tw-flip-card.d.ts +18 -11
  171. package/types/cdevhub-ngx-tw-form-field.d.ts +19 -2
  172. package/types/cdevhub-ngx-tw-icon.d.ts +3 -3
  173. package/types/cdevhub-ngx-tw-input.d.ts +5 -8
  174. package/types/cdevhub-ngx-tw-item.d.ts +2 -0
  175. package/types/cdevhub-ngx-tw-menu-testing.d.ts +131 -0
  176. package/types/cdevhub-ngx-tw-menu.d.ts +2 -2
  177. package/types/cdevhub-ngx-tw-number-input.d.ts +20 -0
  178. package/types/cdevhub-ngx-tw-paginator.d.ts +58 -24
  179. package/types/cdevhub-ngx-tw-popover.d.ts +41 -10
  180. package/types/cdevhub-ngx-tw-progress-bar.d.ts +1 -1
  181. package/types/cdevhub-ngx-tw-radio.d.ts +68 -25
  182. package/types/cdevhub-ngx-tw-segmented-control.d.ts +79 -16
  183. package/types/cdevhub-ngx-tw-select-testing.d.ts +114 -0
  184. package/types/cdevhub-ngx-tw-select.d.ts +104 -33
  185. package/types/cdevhub-ngx-tw-sheet-testing.d.ts +104 -0
  186. package/types/cdevhub-ngx-tw-sheet.d.ts +19 -3
  187. package/types/cdevhub-ngx-tw-slider.d.ts +79 -25
  188. package/types/cdevhub-ngx-tw-sort.d.ts +45 -4
  189. package/types/cdevhub-ngx-tw-split.d.ts +32 -2
  190. package/types/cdevhub-ngx-tw-stat.d.ts +14 -4
  191. package/types/cdevhub-ngx-tw-stepper.d.ts +16 -2
  192. package/types/cdevhub-ngx-tw-switch.d.ts +35 -13
  193. package/types/cdevhub-ngx-tw-tab-nav.d.ts +7 -6
  194. package/types/cdevhub-ngx-tw-table.d.ts +53 -10
  195. package/types/cdevhub-ngx-tw-tabs.d.ts +41 -10
  196. package/types/cdevhub-ngx-tw-tags-input-testing.d.ts +135 -0
  197. package/types/cdevhub-ngx-tw-tags-input.d.ts +26 -11
  198. package/types/cdevhub-ngx-tw-textarea.d.ts +3 -2
  199. package/types/cdevhub-ngx-tw-theme.d.ts +245 -39
  200. package/types/cdevhub-ngx-tw-time-picker-testing.d.ts +129 -0
  201. package/types/cdevhub-ngx-tw-time-picker.d.ts +76 -19
  202. package/types/cdevhub-ngx-tw-timeline.d.ts +36 -12
  203. package/types/cdevhub-ngx-tw-toast.d.ts +20 -6
  204. package/types/cdevhub-ngx-tw-tooltip.d.ts +28 -6
  205. package/types/cdevhub-ngx-tw-transfer-testing.d.ts +152 -0
  206. package/types/cdevhub-ngx-tw-transfer.d.ts +21 -8
  207. package/types/cdevhub-ngx-tw-tree.d.ts +6 -1
  208. package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs.map +0 -1
  209. package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-DSu4YoTy.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"cdevhub-ngx-tw-table.mjs","sources":["../../../projects/ngx-tw/table/table.ts","../../../projects/ngx-tw/table/table.html","../../../projects/ngx-tw/table/cdevhub-ngx-tw-table.ts"],"sourcesContent":["/*\n * tw-table — wraps Angular CDK's CdkTable with a declarative <tw-column> API,\n * slot-based chrome (caption, toolbar, empty, loading, error, footer, pagination),\n * responsive (scroll / stack / hide) + sticky + layout controls, and typed\n * template contexts per cell/row/footer/expansion.\n *\n * v2 input shape — visual/behavioral concerns are grouped into config objects:\n * - `appearance` { variant, density, size, layout, rowAnimations }\n * - `sticky` { header, footer, scrollHeight }\n * - `responsive` { mode, stackBelow }\n * - `selection` { enabled }\n * - `<tw-column>` `display` { sticky, align, numeric, hideBelow, width }\n *\n * Each config input accepts a partial object; unset keys fall back to the documented\n * defaults (see `APPEARANCE_DEFAULTS`, etc.). Data, state, mechanical mode flags, i18n\n * and a11y attributes stay flat.\n *\n * Out of scope for v1:\n * - Column resize, drag-reorder\n * - CDK virtual scroll viewport integration\n * - Inline cell editing\n * - Filter UI primitives\n * - Arrow-key \"grid\" pattern keyboard navigation (APG)\n */\n\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n isDevMode,\n model,\n output,\n signal,\n TemplateRef,\n type TrackByFunction,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport {\n CdkNoDataRow,\n type CdkTable,\n CdkTableModule,\n type CdkTableDataSourceInput,\n} from '@angular/cdk/table';\nimport { tv } from 'tailwind-variants';\nimport { CheckboxComponent } from '@cdevhub/ngx-tw/checkbox';\nimport { TW_SORT_HANDLE, type TwBreakpoint, type TwSize } from '@cdevhub/ngx-tw/core';\n\n/** Possible values for the `aria-sort` attribute on a sortable column header. */\nexport type TwColumnAriaSort = 'ascending' | 'descending' | 'none' | null;\n\n// ── Public types ─────────────────────────────────────────────────────\n\n/** Re-export of CDK's accepted data-source shapes: plain array, Observable, or `DataSource<T>`. */\nexport type TwTableDataSourceInput<T> = CdkTableDataSourceInput<T>;\n\n/** Visual variant of the table. `'default'` — clean row dividers. `'striped'` — alternating rows. `'bordered'` — full grid with outer rounded border. */\nexport type TwTableVariant = 'default' | 'striped' | 'bordered';\n\n/** Row density. `'comfortable'` — larger vertical padding. `'compact'` — tighter padding for dense data. */\nexport type TwTableDensity = 'comfortable' | 'compact';\n\n/** Responsive behaviour mode. `'scroll'` — horizontal overflow. `'stack'` — cards per row below a breakpoint. `'hide'` — columns with `hideBelow` are hidden. */\nexport type TwTableResponsiveMode = 'scroll' | 'stack' | 'hide';\n\n/** Table layout algorithm. `'auto'` — content-sized columns. `'fixed'` — respects `<tw-column display.width>`. */\nexport type TwTableLayout = 'auto' | 'fixed';\n\n/** Horizontal alignment of a column's cells. */\nexport type TwColumnAlign = 'start' | 'center' | 'end';\n\n/** Column stickiness. `'start'` pins to leading edge; `'end'` pins to trailing edge; `false` disables. */\nexport type TwColumnSticky = 'start' | 'end' | false;\n\n// ── Config object types ──────────────────────────────────────────────\n\n/** Visual configuration. Pass any subset; unset keys fall back to the defaults. */\nexport interface TwTableAppearance {\n /** Visual variant. Defaults to `'default'`. */\n variant?: TwTableVariant;\n /** Row density (vertical padding only — independent of font size). Defaults to `'comfortable'`. */\n density?: TwTableDensity;\n /** Base font-size scale for header and data cells. Defaults to `'md'`. */\n size?: TwSize;\n /** Table layout algorithm. Defaults to `'auto'`. */\n layout?: TwTableLayout;\n /** When `true`, rows fade in on enter via `animate.enter=\"fade-in\"`. Off by default to avoid flicker on frequent data updates. Defaults to `false`. */\n rowAnimations?: boolean;\n}\n\n/** Sticky configuration — pinned header/footer rows and an internal scroll region. */\nexport interface TwTableSticky {\n /** When `true`, the `<thead>` row stays visible while the body scrolls. Requires `scrollHeight` or a scrolling ancestor. Defaults to `false`. */\n header?: boolean;\n /** When `true`, the `<tfoot>` row stays pinned while the body scrolls. Defaults to `false`. */\n footer?: boolean;\n /** Max-height of the internal scroll container. A number is treated as pixels; a string is passed through as a CSS length. When `null`, the table flows with its content. Defaults to `null`. */\n scrollHeight?: string | number | null;\n}\n\n/** Responsive configuration — how the table adapts to narrow viewports. */\nexport interface TwTableResponsive {\n /** Narrow-viewport strategy. Defaults to `'scroll'`. */\n mode?: TwTableResponsiveMode;\n /** Breakpoint below which the `'stack'` mode engages. Ignored when `mode !== 'stack'`. Defaults to `'md'`. */\n stackBelow?: TwBreakpoint;\n}\n\n/** Selection configuration. */\nexport interface TwTableSelection {\n /** When `true`, exposes a leading `_selection` column slot for checkbox rendering. Defaults to `false`. */\n enabled?: boolean;\n}\n\n/** Per-column display configuration. */\nexport interface TwColumnDisplay {\n /** Sticky positioning. `'start'` pins to the leading edge; `'end'` pins to the trailing edge; `false` disables stickiness. Defaults to `false`. */\n sticky?: TwColumnSticky;\n /** Horizontal text alignment. `'end'` is idiomatic for numeric columns. Defaults to `'start'`. */\n align?: TwColumnAlign;\n /** Convenience flag equivalent to `align: 'end'` plus tabular numerals. Overridden by an explicit `align`. Defaults to `false`. */\n numeric?: boolean;\n /** Responsive visibility: when set and the viewport is below this breakpoint, the column is hidden (applies when the table's `responsive.mode === 'hide'`). Defaults to `null`. */\n hideBelow?: TwBreakpoint | null;\n /** CSS column width applied to header and data cells. A number is treated as pixels; a string is passed through. Only honoured when the table's `appearance.layout === 'fixed'`. Defaults to `null`. */\n width?: string | number | null;\n}\n\n// ── Resolved-default constants ───────────────────────────────────────\n\nconst APPEARANCE_DEFAULTS: Required<TwTableAppearance> = {\n variant: 'default',\n density: 'comfortable',\n size: 'md',\n layout: 'auto',\n rowAnimations: false,\n};\n\nconst STICKY_DEFAULTS: Required<TwTableSticky> = {\n header: false,\n footer: false,\n scrollHeight: null,\n};\n\nconst RESPONSIVE_DEFAULTS: Required<TwTableResponsive> = {\n mode: 'scroll',\n stackBelow: 'md',\n};\n\nconst SELECTION_DEFAULTS: Required<TwTableSelection> = {\n enabled: false,\n};\n\nconst DISPLAY_DEFAULTS: Required<TwColumnDisplay> = {\n sticky: false,\n align: 'start',\n numeric: false,\n hideBelow: null,\n width: null,\n};\n\n// ── i18n + event types ───────────────────────────────────────────────\n\n/** String labels used by the table. All keys optional on the `labels` input; unset keys fall back to the English defaults. */\nexport interface TwTableLabels {\n /** Accessible name used when neither `<caption>`, `ariaLabel`, nor `ariaLabelledby` is provided. Triggers a dev-mode warning. */\n ariaLabel: string;\n /** Default empty-state message rendered when no `[slot=\"empty\"]` content is projected. */\n empty: string;\n /** Default loading message announced politely via `LiveAnnouncer`. */\n loading: string;\n /** Prefix prepended to `String(error)` when no `[slot=\"error\"]` content is projected. */\n errorPrefix: string;\n /** `LiveAnnouncer` template announced on row-count changes. Variable: `{count}`. */\n rowsUpdatedAnnouncement: string;\n /** `LiveAnnouncer` template for selection-change announcements. Variable: `{count}`. */\n selectionAnnouncement: string;\n /** Accessible label for the row-expansion toggle button. */\n expandRowLabel: string;\n /** Accessible label for the collapse-row toggle button. */\n collapseRowLabel: string;\n /** Accessible label for the master \"select all\" checkbox in the leading selection column. */\n selectAllLabel: string;\n /** Accessible label template for each per-row selection checkbox. Variable: `{index}` (1-based). */\n selectRowLabel: string;\n}\n\n/** Default English labels for the table. */\nexport const DEFAULT_TABLE_LABELS: Readonly<TwTableLabels> = {\n ariaLabel: 'Data table',\n empty: 'No data',\n loading: 'Loading…',\n errorPrefix: 'Error: ',\n rowsUpdatedAnnouncement: '{count} rows loaded',\n selectionAnnouncement: '{count} rows selected',\n expandRowLabel: 'Expand row',\n collapseRowLabel: 'Collapse row',\n selectAllLabel: 'Select all rows',\n selectRowLabel: 'Select row {index}',\n};\n\n/** Context provided to every data-cell template (`*twCellDef`). Generic over the row type `T`. */\nexport interface TwCellContext<T> {\n /** The row data (implicit `let-row`). */\n $implicit: T;\n /** The row, aliased for readability. */\n row: T;\n /** The column's declared `name`. */\n column: string;\n /** Zero-based index within the rendered row list. */\n index: number;\n /** Zero-based column index in the visible column set. */\n columnIndex: number;\n /** True when this cell is in the first row. */\n first: boolean;\n /** True when this cell is in the last row. */\n last: boolean;\n /** True when the row index is even. */\n even: boolean;\n /** True when the row index is odd. */\n odd: boolean;\n /** Total number of rendered rows. */\n count: number;\n}\n\n/** Context provided to every header-cell template (`*twHeaderCellDef`). */\nexport interface TwHeaderCellContext {\n /** The column's declared `name` (implicit `let-column`). */\n $implicit: string;\n /** The column's declared `name`, aliased. */\n column: string;\n /** Zero-based column index in the visible column set. */\n columnIndex: number;\n}\n\n/** Context provided to every footer-cell template (`*twFooterCellDef`). Generic over the row type `T`. */\nexport interface TwFooterCellContext<T> {\n /** The column's declared `name` (implicit). */\n $implicit: string;\n /** The column's declared `name`. */\n column: string;\n /** Zero-based column index in the visible column set. */\n columnIndex: number;\n /** Snapshot of all rows (useful for total/summary computation). */\n rows: readonly T[];\n}\n\n/** Context surfaced to a `*twRowDef` template. Mirrors `TwCellContext<T>` minus the column-specific fields. */\nexport interface TwRowContext<T> {\n /** The row data (implicit `let-row`). */\n $implicit: T;\n /** The row, aliased. */\n row: T;\n /** Zero-based index within the rendered row list. */\n index: number;\n /** True when this row is the first rendered row. */\n first: boolean;\n /** True when this row is the last rendered row. */\n last: boolean;\n /** True when the row index is even. */\n even: boolean;\n /** True when the row index is odd. */\n odd: boolean;\n /** Total rendered row count. */\n count: number;\n}\n\n/** Context provided to `*twRowExpansion`. */\nexport interface TwRowExpansionContext<T> {\n /** The row whose expansion panel this template renders. */\n $implicit: T;\n /** The row, aliased. */\n row: T;\n /** The data index. */\n index: number;\n /** Collapses this row (removes it from `expandedRows`). */\n collapse: () => void;\n}\n\n/** Payload emitted by `rowClicked`. */\nexport interface TwRowClickEvent<T> {\n /** The clicked row. */\n row: T;\n /** Zero-based index in the rendered data. */\n index: number;\n /** The original DOM event. */\n event: MouseEvent;\n}\n\n/** Payload emitted by `selectionChange`. */\nexport interface TwSelectionChangeEvent<T> {\n /** The full current selection. */\n selected: readonly T[];\n /** Rows added since the previous selection. */\n added: readonly T[];\n /** Rows removed since the previous selection. */\n removed: readonly T[];\n /** The previous selection. */\n previous: readonly T[];\n}\n\n/** Payload emitted by `expansionChange`. */\nexport interface TwRowExpansionChangeEvent<T> {\n /** The row whose expansion state changed. */\n row: T;\n /** Whether the row is now expanded. */\n expanded: boolean;\n /** The full set of expanded rows after the change. */\n expandedRows: ReadonlySet<T>;\n}\n\n// ── tv() config ──────────────────────────────────────────────────────\n\n// CDK renders `<thead>` / `<tbody>` / `<tfoot>` inside its native-table template;\n// we can't set classes on those elements directly. Instead, we style them via\n// arbitrary descendant selectors on the `<table>` element itself (`[&>thead]:…`,\n// `[&>tbody>tr]:…`, etc.) — the full class strings stay statically present in\n// source so Tailwind v4's JIT scanner picks them up.\nconst tableVariants = tv(\n {\n slots: {\n root: 'relative block w-full',\n toolbar:\n 'empty:hidden flex items-center justify-between gap-3 px-4 py-3 border-b border-border',\n scrollWrapper: 'relative',\n scrollContainer: 'overflow-x-auto w-full',\n // `border-separate` + `border-spacing-0` is required for `position: sticky` on\n // `<th>` / `<td>` (CDK's sticky mechanism) to work reliably across browsers.\n // In border-collapse mode, Firefox (and historically Chrome) fails to stick\n // individual cells. Consequence: borders on row groups (`<thead>`, `<tfoot>`,\n // `<tr>`) don't render — all separators must be applied to cells directly.\n table:\n 'w-full border-separate border-spacing-0 text-start align-middle [&>thead>tr>th]:font-semibold [&>thead>tr>th]:text-fg [&>thead>tr>th]:tracking-tight [&>tbody>tr]:transition-colors [&>tbody>tr]:duration-normal [&>tbody>tr]:motion-reduce:transition-none [&>tfoot>tr>td]:border-t [&>tfoot>tr>td]:border-border',\n th: 'text-start font-semibold text-fg tracking-tight align-middle',\n td: 'text-fg align-middle',\n footerTd: 'text-fg font-medium align-middle',\n emptyState:\n 'flex flex-col items-center justify-center gap-2 px-4 py-12 text-center',\n emptyIcon: 'size-10 shrink-0 text-fg-subtle',\n emptyMessage: 'text-sm text-fg-muted',\n loadingOverlay:\n 'absolute inset-0 flex items-center justify-center gap-3 bg-surface/70 backdrop-blur-sm z-20 pointer-events-auto',\n loadingMessage: 'text-sm text-fg-muted',\n errorState:\n 'flex flex-col items-center justify-center gap-2 px-4 py-12 text-center',\n errorIcon: 'size-10 shrink-0 text-error-500',\n errorMessage: 'text-sm text-error-700',\n footerSlot: 'empty:hidden px-4 py-2 border-t border-border text-sm text-fg-muted',\n paginationSlot: 'empty:hidden border-t border-border px-2 py-2',\n expansionRow: 'bg-surface-sunken',\n expansionCell: 'p-0',\n // The leading `_selection` column hosts checkboxes only — override the standard\n // text alignment + padding so the control stays centered in a narrow column.\n selectionHeader: 'w-12 text-center align-middle',\n selectionCell: 'w-12 text-center align-middle',\n },\n variants: {\n variant: {\n default: {\n table:\n '[&>thead>tr>th]:bg-surface-muted [&>tbody>tr:not(:last-child)>td]:border-b [&>tbody>tr:not(:last-child)>td]:border-border [&>tbody>tr:hover]:bg-surface-sunken',\n },\n striped: {\n table:\n '[&>thead>tr>th]:bg-surface-muted [&>tbody>tr:nth-child(even)]:bg-surface-sunken [&>tbody>tr:hover]:bg-surface-muted',\n },\n bordered: {\n root: 'rounded-lg border border-border-strong overflow-hidden',\n table:\n '[&>thead>tr>th]:bg-surface-muted [&>thead>tr>th]:border-b [&>thead>tr>th]:border-border [&>tbody>tr:hover]:bg-surface-sunken',\n th: 'border-r border-border last:border-r-0',\n td: 'border-r border-border last:border-r-0',\n footerTd: 'border-r border-border last:border-r-0',\n },\n },\n density: {\n comfortable: {\n th: 'px-4 py-3',\n td: 'px-4 py-3',\n footerTd: 'px-4 py-3',\n },\n compact: {\n th: 'px-3 py-1.5',\n td: 'px-3 py-1.5',\n footerTd: 'px-3 py-1.5',\n },\n },\n size: {\n xs: { table: 'text-xs' },\n sm: { table: 'text-sm' },\n md: { table: 'text-sm' },\n lg: { table: 'text-base' },\n xl: { table: 'text-base' },\n },\n layout: {\n auto: { table: 'table-auto' },\n fixed: { table: 'table-fixed' },\n },\n stickyHeader: {\n // Apply `position: sticky` to `<thead>` directly in addition to CDK's\n // per-cell sticky. Group-level sticky on row groups is well supported\n // across Chrome/Firefox/Safari and keeps the header visible reliably\n // regardless of table layout (`border-separate` vs `border-collapse`)\n // or consumer-supplied scroll ancestors. Cells still get their own bg\n // so they stay opaque over scrolled rows.\n true: {\n table:\n '[&>thead]:sticky [&>thead]:top-0 [&>thead]:z-20 [&>thead>tr>th]:bg-surface-raised [&>thead>tr>th]:z-10',\n },\n false: {},\n },\n stickyFooter: {\n true: {\n table:\n '[&>tfoot]:sticky [&>tfoot]:bottom-0 [&>tfoot]:z-20 [&>tfoot>tr>td]:bg-surface-raised [&>tfoot>tr>td]:z-10',\n },\n false: {},\n },\n loading: {\n true: { table: '[&>tbody]:opacity-60 [&>tbody]:pointer-events-none' },\n false: {},\n },\n },\n compoundVariants: [\n {\n variant: 'bordered',\n density: 'compact',\n class: { th: 'text-xs', td: 'text-xs', footerTd: 'text-xs' },\n },\n {\n stickyHeader: true,\n variant: 'striped',\n class: {\n table: '[&>thead>tr>th]:shadow-table-sticky',\n },\n },\n ],\n defaultVariants: {\n variant: 'default',\n density: 'comfortable',\n size: 'md',\n layout: 'auto',\n stickyHeader: false,\n stickyFooter: false,\n loading: false,\n },\n },\n { twMerge: true },\n);\n\n// ── Static class maps (Tailwind v4 JIT requires literal class strings) ──\n\nconst ALIGN_CLASSES: Record<TwColumnAlign, string> = {\n start: 'text-start',\n center: 'text-center',\n end: 'text-end',\n};\n\nconst HIDE_BELOW_UTILITIES: Record<TwBreakpoint, string> = {\n sm: 'max-sm:hidden',\n md: 'max-md:hidden',\n lg: 'max-lg:hidden',\n xl: 'max-xl:hidden',\n};\n\n/**\n * Stack mode: CSS-only transform that makes each data row read like a labelled card\n * below the chosen breakpoint. Applied to `<table>` via arbitrary descendant selectors\n * because CDK owns the `<thead>` / `<tbody>` / `<tr>` elements.\n *\n * Every class is written in full so Tailwind v4's JIT scanner picks it up.\n */\nconst STACK_TABLE_UTILITIES: Record<TwBreakpoint, string> = {\n sm: '[&>thead]:max-sm:hidden [&>tbody>tr]:max-sm:block [&>tbody>tr]:max-sm:border [&>tbody>tr]:max-sm:border-border [&>tbody>tr]:max-sm:rounded-lg [&>tbody>tr]:max-sm:p-3 [&>tbody>tr]:max-sm:mb-2 [&>tbody>tr]:max-sm:bg-surface-raised',\n md: '[&>thead]:max-md:hidden [&>tbody>tr]:max-md:block [&>tbody>tr]:max-md:border [&>tbody>tr]:max-md:border-border [&>tbody>tr]:max-md:rounded-lg [&>tbody>tr]:max-md:p-3 [&>tbody>tr]:max-md:mb-2 [&>tbody>tr]:max-md:bg-surface-raised',\n lg: '[&>thead]:max-lg:hidden [&>tbody>tr]:max-lg:block [&>tbody>tr]:max-lg:border [&>tbody>tr]:max-lg:border-border [&>tbody>tr]:max-lg:rounded-lg [&>tbody>tr]:max-lg:p-3 [&>tbody>tr]:max-lg:mb-2 [&>tbody>tr]:max-lg:bg-surface-raised',\n xl: '[&>thead]:max-xl:hidden [&>tbody>tr]:max-xl:block [&>tbody>tr]:max-xl:border [&>tbody>tr]:max-xl:border-border [&>tbody>tr]:max-xl:rounded-lg [&>tbody>tr]:max-xl:p-3 [&>tbody>tr]:max-xl:mb-2 [&>tbody>tr]:max-xl:bg-surface-raised',\n};\n\n/** Stack mode per-cell decoration (applied to `<td>` directly via column classes). */\nconst STACK_CELL_UTILITIES: Record<TwBreakpoint, string> = {\n sm: 'max-sm:flex max-sm:justify-between max-sm:gap-3 max-sm:py-1 max-sm:border-0 max-sm:before:content-[attr(data-label)] max-sm:before:font-semibold max-sm:before:text-fg-muted max-sm:before:mr-4',\n md: 'max-md:flex max-md:justify-between max-md:gap-3 max-md:py-1 max-md:border-0 max-md:before:content-[attr(data-label)] max-md:before:font-semibold max-md:before:text-fg-muted max-md:before:mr-4',\n lg: 'max-lg:flex max-lg:justify-between max-lg:gap-3 max-lg:py-1 max-lg:border-0 max-lg:before:content-[attr(data-label)] max-lg:before:font-semibold max-lg:before:text-fg-muted max-lg:before:mr-4',\n xl: 'max-xl:flex max-xl:justify-between max-xl:gap-3 max-xl:py-1 max-xl:border-0 max-xl:before:content-[attr(data-label)] max-xl:before:font-semibold max-xl:before:text-fg-muted max-xl:before:mr-4',\n};\n\n// CDK handles `position: sticky` + left/right offsets via its sticky styler.\n// We only add the decorative background + z-index so overlapping cells stay opaque,\n// plus a hairline shadow on the inner edge so the pinned column reads as floating\n// over scrolled content. Direction follows the pinned edge:\n// sticky-start (pinned left) → 1px shadow on the right side\n// sticky-end (pinned right) → 1px shadow on the left side\nconst STICKY_CELL_ZINDEX = 'z-[5]';\nconst STICKY_START_SHADOW = 'shadow-table-sticky-cell-start';\nconst STICKY_END_SHADOW = 'shadow-table-sticky-cell-end';\n\nconst INTERACTIVE_TAGS = new Set([\n 'BUTTON',\n 'A',\n 'INPUT',\n 'SELECT',\n 'OPTION',\n 'TEXTAREA',\n 'LABEL',\n 'SUMMARY',\n]);\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\nfunction formatLabel(\n template: string,\n vars: Readonly<Record<string, string | number>>,\n): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, key: string) =>\n Object.prototype.hasOwnProperty.call(vars, key) ? String(vars[key]) : match,\n );\n}\n\nfunction coerceCssSize(value: string | number | null | undefined): string | null {\n if (value === null || value === undefined || value === '') return null;\n return typeof value === 'number' ? `${value}px` : value;\n}\n\n// ── Cell/Header/Footer template directives ────────────────────────────\n//\n// These DO NOT extend the CDK counterparts. The ColumnComponent renders its\n// own <td cdk-cell *cdkCellDef>…</td> internally and forwards the consumer's\n// TemplateRef via ngTemplateOutlet with a typed context. Decoupling from CDK\n// here keeps our cell contexts strongly typed with extra fields (`columnIndex`,\n// `column`, `row`) that CDK's `CdkCellOutletRowContext` lacks.\n\n/** Structural directive on an `<ng-template>` (or a star-directive host) defining a column's data-cell template. Typed as `TwCellContext<T>`. */\n@Directive({ selector: '[twCellDef]' })\nexport class CellDefDirective<T = unknown> {\n /** @internal */\n readonly template = inject(TemplateRef<TwCellContext<T>>);\n\n /** @internal */\n static ngTemplateContextGuard<T>(\n _dir: CellDefDirective<T>,\n _ctx: unknown,\n ): _ctx is TwCellContext<T> {\n return true;\n }\n}\n\n/** Structural directive defining a column's header-cell template. Typed as `TwHeaderCellContext`. */\n@Directive({ selector: '[twHeaderCellDef]' })\nexport class HeaderCellDefDirective {\n /** @internal */\n readonly template = inject(TemplateRef<TwHeaderCellContext>);\n\n /** @internal */\n static ngTemplateContextGuard(\n _dir: HeaderCellDefDirective,\n _ctx: unknown,\n ): _ctx is TwHeaderCellContext {\n return true;\n }\n}\n\n/** Structural directive defining a column's footer-cell template. Typed as `TwFooterCellContext<T>`. */\n@Directive({ selector: '[twFooterCellDef]' })\nexport class FooterCellDefDirective<T = unknown> {\n /** @internal */\n readonly template = inject(TemplateRef<TwFooterCellContext<T>>);\n\n /** @internal */\n static ngTemplateContextGuard<T>(\n _dir: FooterCellDefDirective<T>,\n _ctx: unknown,\n ): _ctx is TwFooterCellContext<T> {\n return true;\n }\n}\n\n// ── No-data row + expansion directives ───────────────────────────────\n//\n// Row / header-row / footer-row defs are auto-generated inline in the\n// `<tw-table>` template based on `<tw-column>` declarations. `*twNoDataRow`\n// and `*twRowExpansion` remain as consumer-facing directives because they\n// carry custom templates the consumer projects.\n\n/** Structural directive on an `<ng-template>` declaring the no-data row fallback. Takes precedence over `[slot=\"empty\"]` when both are present. */\n@Directive({\n selector: 'ng-template[twNoDataRow]',\n providers: [{ provide: CdkNoDataRow, useExisting: NoDataRowDirective }],\n})\nexport class NoDataRowDirective extends CdkNoDataRow {}\n\n/** Structural directive on an `<ng-template>` declaring the row-expansion template. Requires `[multiTemplateRows]=\"true\"` on the parent `<tw-table>`. */\n@Directive({ selector: 'ng-template[twRowExpansion]' })\nexport class RowExpansionDirective<T = unknown> {\n /** Optional predicate that decides whether this expansion renders for a given row. Defaults to `undefined` (render for every expanded row). */\n readonly predicate = input<((row: T, index: number) => boolean) | undefined>(\n undefined,\n { alias: 'twRowExpansionWhen' },\n );\n\n /** @internal */\n readonly template = inject(TemplateRef<TwRowExpansionContext<T>>);\n\n /** @internal */\n static ngTemplateContextGuard<T>(\n _dir: RowExpansionDirective<T>,\n _ctx: unknown,\n ): _ctx is TwRowExpansionContext<T> {\n return true;\n }\n}\n\n// ── ColumnComponent ───────────────────────────────────────────────────\n//\n// `<tw-column>` is a pure metadata component — it holds the column's inputs\n// and collects the consumer's header/data/footer cell templates via\n// `contentChild`. The actual `<ng-container cdkColumnDef>` + cell renderers\n// are emitted inline in `<tw-table>`'s template via a `@for` loop. This keeps\n// every CDK defn (column, row, header-row, footer-row) inside CdkTable's\n// DIRECT content, so its `@ContentChildren` queries resolve them on first\n// render without our having to wire programmatic `addColumnDef` + deal with\n// its timing quirks.\n\nlet nextColumnId = 0;\n\n/**\n * Declares a single column of a `<tw-table>`. Pure-metadata component — its\n * host element is `display: none`; the column's `<th>` / `<td>` / `<tfoot>`\n * renderers are emitted by the parent `<tw-table>` using the projected cell\n * templates (`*twHeaderCellDef`, `*twCellDef`, `*twFooterCellDef`).\n */\n@Component({\n selector: 'tw-column',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: '',\n host: {\n 'style': 'display: none',\n },\n})\nexport class ColumnComponent<T = unknown> {\n /** Unique identifier for this column. Required — referenced by `*twRowDef` / `*twHeaderRowDef` and used as the CDK `cdkColumnDef` name. */\n readonly name = input.required<string>();\n\n /** Visual configuration: sticky, align, numeric, hideBelow, width. Accepts any subset; unset keys fall back to the defaults. */\n readonly display = input<TwColumnDisplay>({});\n\n /** When true, removes this column from the visible column set. Defaults to `false`. */\n readonly hidden = input<boolean>(false);\n\n /** Ordering hint for the default visible-columns list when no `*twRowDef` is declared. Lower renders first. Defaults to `0`. */\n readonly priority = input<number>(0);\n\n /** Plain text header label. Used when no `*twHeaderCellDef` template is projected. Defaults to `undefined`. */\n readonly headerLabel = input<string | undefined>(undefined);\n\n /** Label used as `data-label` on cells in responsive `'stack'` mode. Falls back to `headerLabel`, then `name`. Defaults to `undefined`. */\n readonly stackLabel = input<string | undefined>(undefined);\n\n /**\n * Explicit override for the column header's `aria-sort` attribute. When unset (the default),\n * the column derives its `aria-sort` from a parent `[twSort]` directive via the `TW_SORT_HANDLE`\n * token — the column is treated as active when the directive's `active` id matches this column's\n * `name`. Set explicitly to `'ascending'` / `'descending'` / `'none'` to override; `null` disables\n * the attribute entirely. Defaults to `null`.\n */\n readonly sortState = input<TwColumnAriaSort>(null);\n\n /** @internal Stable identifier used for DOM `data-*` hooks. */\n readonly columnId = `tw-column-${nextColumnId++}`;\n\n private readonly sortHandle = inject(TW_SORT_HANDLE, { optional: true });\n\n /** @internal Consumer-projected header-cell template (optional). */\n readonly headerCellDef = contentChild(HeaderCellDefDirective);\n\n /** @internal Consumer-projected data-cell template. */\n readonly cellDef = contentChild(CellDefDirective<T>);\n\n /** @internal Consumer-projected footer-cell template (optional). */\n readonly footerCellDef = contentChild(FooterCellDefDirective<T>);\n\n /** @internal Index in the visible column set — pushed by the parent table. */\n readonly columnIndex = signal(0);\n\n /** @internal Row snapshot pushed by the parent for footer-cell contexts. */\n readonly rowsSnapshot = signal<readonly T[]>([]);\n\n /** @internal Table-pushed extra classes (sticky / hide-below / responsive decorations). */\n readonly extraCellClass = signal('');\n readonly extraHeaderClass = signal('');\n readonly extraFooterClass = signal('');\n\n /** Resolved display config — partial input merged with `DISPLAY_DEFAULTS`. */\n readonly resolvedDisplay = computed<Required<TwColumnDisplay>>(() => ({\n ...DISPLAY_DEFAULTS,\n ...this.display(),\n }));\n\n /** @internal Convenience accessor for the cdkColumnDef `[sticky]` binding. */\n readonly stickyStart = computed(() => this.resolvedDisplay().sticky === 'start');\n\n /** @internal Convenience accessor for the cdkColumnDef `[stickyEnd]` binding. */\n readonly stickyEnd = computed(() => this.resolvedDisplay().sticky === 'end');\n\n /** @internal Effective align — `numeric` forces `'end'` unless `align` is explicitly set to a non-default value. */\n readonly effectiveAlign = computed<TwColumnAlign>(() => {\n const display = this.resolvedDisplay();\n if (display.align === 'start' && display.numeric) return 'end';\n return display.align;\n });\n\n /** @internal CSS width string applied to cells. */\n readonly resolvedWidth = computed<string | null>(() =>\n coerceCssSize(this.resolvedDisplay().width),\n );\n\n /** @internal `data-label` emitted on cells in stack mode. */\n readonly stackDataLabel = computed<string>(\n () => this.stackLabel() ?? this.headerLabel() ?? this.name(),\n );\n\n /** @internal Align class plus tabular-numerals when `numeric` is true — shared by data and footer cells. */\n private readonly dataCellPrefix = computed(() => {\n const align = ALIGN_CLASSES[this.effectiveAlign()];\n const numeric = this.resolvedDisplay().numeric ? '[font-variant-numeric:tabular-nums]' : '';\n return numeric ? `${align} ${numeric}` : align;\n });\n\n readonly cellClasses = computed(() =>\n [this.dataCellPrefix(), this.extraCellClass()].filter(Boolean).join(' '),\n );\n\n readonly headerCellClasses = computed(() =>\n [ALIGN_CLASSES[this.effectiveAlign()], this.extraHeaderClass()].filter(Boolean).join(' '),\n );\n\n readonly footerCellClasses = computed(() =>\n [this.dataCellPrefix(), this.extraFooterClass()].filter(Boolean).join(' '),\n );\n\n /**\n * @internal `aria-sort` value for the column's `<th>`. Explicit `sortState` wins; otherwise the\n * column auto-resolves against a parent `[twSort]` directive (`TW_SORT_HANDLE`). Returns `null`\n * when no sort is wired or the column is not the active sort, so the attribute is omitted.\n */\n readonly ariaSort = computed<TwColumnAriaSort>(() => {\n const explicit = this.sortState();\n if (explicit !== null) return explicit;\n const handle = this.sortHandle;\n if (!handle) return null;\n if (handle.active() !== this.name()) return null;\n const direction = handle.direction();\n if (direction === 'asc') return 'ascending';\n if (direction === 'desc') return 'descending';\n return null;\n });\n\n readonly headerContext = computed<TwHeaderCellContext>(() => ({\n $implicit: this.name(),\n column: this.name(),\n columnIndex: this.columnIndex(),\n }));\n\n readonly footerContext = computed<TwFooterCellContext<T>>(() => ({\n $implicit: this.name(),\n column: this.name(),\n columnIndex: this.columnIndex(),\n rows: this.rowsSnapshot(),\n }));\n\n /** @internal Builds the per-cell template context from CDK-provided row variables. */\n buildCellContext(\n row: T,\n index: number,\n count: number,\n first: boolean,\n last: boolean,\n even: boolean,\n odd: boolean,\n ): TwCellContext<T> {\n return {\n $implicit: row,\n row,\n column: this.name(),\n index,\n columnIndex: this.columnIndex(),\n first,\n last,\n even,\n odd,\n count,\n };\n }\n}\n\n// ── TableComponent ────────────────────────────────────────────────────\n\nlet nextTableId = 0;\n\n/**\n * A highly customizable data-table component wrapping `@angular/cdk/table`.\n *\n * Composes with other ngx-tw primitives:\n * - Sortable headers: place `[twSort]` on `<tw-table>` and `[tw-sort-header]` inside `*twHeaderCellDef`.\n * - Pagination: project `<tw-paginator slot=\"pagination\">` as a child.\n * - Loading spinner: project `<tw-spinner slot=\"loading\">` or rely on the built-in fallback.\n */\n@Component({\n selector: 'tw-table',\n exportAs: 'twTable',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CdkTableModule, NgTemplateOutlet, CheckboxComponent],\n templateUrl: './table.html',\n host: {\n '[class]': 'hostClasses()',\n },\n})\nexport class TableComponent<T = unknown> {\n // ── Inputs ──\n\n /** The table's rows. Accepts a plain array, an `Observable<readonly T[]>`, or a CDK `DataSource<T>`. Wired directly to `CdkTable.dataSource`. Defaults to an empty array. */\n readonly data = input<TwTableDataSourceInput<T>>([] as readonly T[]);\n\n /**\n * Tracking function used to identify rows across data changes. When unset, rows are identified by\n * object reference.\n *\n * This drives **selection and expansion membership** as well as CDK's DOM diffing. Supply it when\n * the data source re-emits equal-but-new objects — an HTTP refetch, an immutable store — or the\n * user's selection empties on every refresh with no event and no error. It is called with `-1` as\n * the index for membership lookups, so return a value derived from the row alone (`row.id`), not\n * from the index.\n */\n readonly trackBy = input<TrackByFunction<T> | undefined>(undefined);\n\n /** When true, renders the loading slot as an overlay and applies `opacity-60 pointer-events-none` to the body. Defaults to `false`. */\n readonly loading = input<boolean>(false);\n\n /** When non-null, renders the error slot in place of the body. Defaults to `null`. */\n readonly error = input<unknown | null>(null);\n\n /** Visual configuration — `variant`, `density`, `size`, `layout`, `rowAnimations`. Accepts a partial; unset keys fall back to the defaults. */\n readonly appearance = input<TwTableAppearance>({});\n\n /** Sticky configuration — `header`, `footer`, `scrollHeight`. Accepts a partial; unset keys fall back to the defaults. */\n readonly sticky = input<TwTableSticky>({});\n\n /** Responsive configuration — `mode`, `stackBelow`. Accepts a partial; unset keys fall back to the defaults. */\n readonly responsive = input<TwTableResponsive>({});\n\n /** Selection configuration — `enabled`. Accepts a partial; unset keys fall back to the defaults. */\n readonly selection = input<TwTableSelection>({});\n\n /** Whether multiple row templates may render per data object. Required for `*twRowExpansion` and advanced `*twRowDef [when]` usage. Defaults to `false`. */\n readonly multiTemplateRows = input<boolean>(false);\n\n /** Overrides for user-facing strings. Unset keys fall back to the English defaults. Defaults to `{}`. */\n readonly labels = input<Partial<TwTableLabels>>({});\n\n /** Accessible name for the `<table>`. Required when no visible `<caption slot=\"caption\">` is provided. */\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n\n /** Id of an external element labelling the table. Mirrored to `aria-labelledby` on the `<table>`. */\n readonly ariaLabelledby = input<string | undefined>(undefined, { alias: 'aria-labelledby' });\n\n // ── Models (two-way) ──\n\n /** Two-way bound set of rows currently expanded. Immutable — set a new `Set` on every change; do not mutate in place. */\n readonly expandedRows = model<ReadonlySet<T>>(new Set<T>());\n\n /** Two-way bound list of selected rows. Set a new array on every change; do not mutate. Only used when `selection.enabled` is `true`. */\n readonly selected = model<readonly T[]>([]);\n\n // ── Outputs ──\n\n /** Fires when a row is clicked. Suppressed when the click originated inside an interactive descendant (button, link, input, etc.). */\n readonly rowClicked = output<TwRowClickEvent<T>>();\n\n /** Fires after `selected` changes via user interaction (not on programmatic writes). */\n readonly selectionChange = output<TwSelectionChangeEvent<T>>();\n\n /** Fires after a row is expanded or collapsed by user interaction. */\n readonly expansionChange = output<TwRowExpansionChangeEvent<T>>();\n\n // ── Content queries ──\n\n /** @internal Projected columns. */\n readonly columns = contentChildren(ColumnComponent<T>, { descendants: true });\n\n /** @internal Projected custom no-data row (takes precedence over the fallback empty state). */\n readonly noDataRow = contentChild(NoDataRowDirective, { descendants: true });\n\n /** @internal Projected expansion row template. */\n readonly expansionTemplate = contentChild(RowExpansionDirective<T>, { descendants: true });\n\n // ── View children ──\n\n /** @internal The CDK table inside our view. */\n readonly cdkTable = viewChild.required<CdkTable<T>>('cdkTable');\n\n // ── Injected services ──\n\n private readonly _liveAnnouncer = inject(LiveAnnouncer);\n private readonly _elementRef = inject(ElementRef<HTMLElement>);\n private readonly _destroyRef = inject(DestroyRef);\n\n // ── Identifiers ──\n\n /** Unique per-instance id used to scope row/expansion DOM ids. */\n readonly hostId = `tw-table-${nextTableId++}`;\n\n /** Returns the DOM id used for the expansion row of the given data row at the given index. Useful for wiring `aria-controls` from a trigger cell. */\n readonly expansionId = (_row: T, index: number): string =>\n `${this.hostId}-expansion-${index}`;\n\n // ── Resolved config (partial input merged with defaults) ──\n\n /** @internal Resolved visual configuration. */\n readonly resolvedAppearance = computed<Required<TwTableAppearance>>(() => ({\n ...APPEARANCE_DEFAULTS,\n ...this.appearance(),\n }));\n\n /** @internal Resolved sticky configuration. */\n readonly resolvedSticky = computed<Required<TwTableSticky>>(() => ({\n ...STICKY_DEFAULTS,\n ...this.sticky(),\n }));\n\n /** @internal Resolved responsive configuration. */\n readonly resolvedResponsive = computed<Required<TwTableResponsive>>(() => ({\n ...RESPONSIVE_DEFAULTS,\n ...this.responsive(),\n }));\n\n /** @internal Resolved selection configuration. */\n readonly resolvedSelection = computed<Required<TwTableSelection>>(() => ({\n ...SELECTION_DEFAULTS,\n ...this.selection(),\n }));\n\n // ── Derived state ──\n\n /** @internal Snapshot of the data array (for footer-cell context). Empty array for async data sources. */\n readonly resolvedRows = computed<readonly T[]>(() => {\n const d = this.data();\n return Array.isArray(d) ? (d as readonly T[]) : [];\n });\n\n /** @internal Whether the data input is a plain array. */\n readonly dataIsArray = computed(() => Array.isArray(this.data()));\n\n /** @internal Snapshot-based empty check; `false` for async sources (we can't know without subscribing). */\n readonly isEmptySnapshot = computed(\n () => this.dataIsArray() && this.resolvedRows().length === 0,\n );\n\n /** @internal Whether the empty overlay fallback should render (no no-data-row projected). */\n readonly shouldRenderEmptyOverlay = computed(\n () =>\n this.isEmptySnapshot() &&\n !this.loading() &&\n this.error() === null &&\n !this.noDataRow(),\n );\n\n /** @internal Whether the error overlay should render. */\n readonly shouldRenderErrorOverlay = computed(() => this.error() !== null);\n\n /** @internal Resolved table labels (defaults merged with input overrides). */\n readonly resolvedLabels = computed<TwTableLabels>(() => ({\n ...DEFAULT_TABLE_LABELS,\n ...this.labels(),\n }));\n\n /** @internal Computed error message for the default error overlay. Empty when no error is set. */\n readonly errorMessage = computed(() => {\n const err = this.error();\n if (err == null) return '';\n return `${this.resolvedLabels().errorPrefix}${String(err)}`;\n });\n\n /** @internal CSS max-height string for the scroll container. */\n readonly maxHeightStyle = computed(() => coerceCssSize(this.resolvedSticky().scrollHeight));\n\n /** @internal The visible (non-hidden) columns in render order (by ascending `priority`). */\n readonly visibleColumns = computed<readonly ColumnComponent<T>[]>(() =>\n this.columns()\n .filter((c) => !c.hidden())\n .sort((a, b) => a.priority() - b.priority()),\n );\n\n /** @internal Column names of the visible set, prefixed with `_selection` when `selection.enabled === true`. */\n readonly visibleColumnNames = computed<readonly string[]>(() => {\n const names = this.visibleColumns().map((c) => c.name());\n return this.resolvedSelection().enabled ? ['_selection', ...names] : names;\n });\n\n /** @internal Whether any column has a projected footer-cell template. */\n readonly hasFooterRow = computed<boolean>(() =>\n this.visibleColumns().some((c) => !!c.footerCellDef()),\n );\n\n /** @internal Whether an expansion template has been declared and multi-template rows are enabled. */\n readonly hasExpansion = computed(\n () => this.multiTemplateRows() && !!this.expansionTemplate(),\n );\n\n /** @internal Colspan to use for the expansion `<td>`. */\n readonly expansionColspan = computed(() => {\n const cols = this.visibleColumns().length;\n return Math.max(1, cols + (this.resolvedSelection().enabled ? 1 : 0));\n });\n\n /** @internal Pulled by the template for the `*cdkHeaderRowDef`/`*cdkFooterRowDef` `sticky:` field. */\n readonly stickyHeader = computed(() => this.resolvedSticky().header);\n readonly stickyFooter = computed(() => this.resolvedSticky().footer);\n\n // ── Variant class computation ──\n\n private readonly _variantResult = computed(() => {\n const appearance = this.resolvedAppearance();\n const stickyCfg = this.resolvedSticky();\n return tableVariants({\n variant: appearance.variant,\n density: appearance.density,\n size: appearance.size,\n layout: appearance.layout,\n stickyHeader: stickyCfg.header,\n stickyFooter: stickyCfg.footer,\n loading: this.loading(),\n });\n });\n\n readonly hostClasses = computed(() => this._variantResult().root());\n readonly toolbarClasses = computed(() => this._variantResult().toolbar());\n readonly scrollWrapperClasses = computed(() => this._variantResult().scrollWrapper());\n readonly scrollContainerClasses = computed(() => {\n const base = this._variantResult().scrollContainer();\n return this.maxHeightStyle() ? `${base} overflow-y-auto` : base;\n });\n\n readonly tableClasses = computed(() => {\n const base = this._variantResult().table();\n const responsive = this.resolvedResponsive();\n if (responsive.mode !== 'stack') return base;\n return `${base} ${STACK_TABLE_UTILITIES[responsive.stackBelow]}`;\n });\n\n readonly thClasses = computed(() => this._variantResult().th());\n readonly tdClasses = computed(() => {\n const base = this._variantResult().td();\n const responsive = this.resolvedResponsive();\n if (responsive.mode === 'stack') {\n return `${base} ${STACK_CELL_UTILITIES[responsive.stackBelow]}`;\n }\n return base;\n });\n readonly footerTdClasses = computed(() => this._variantResult().footerTd());\n readonly emptyStateClasses = computed(() => this._variantResult().emptyState());\n readonly emptyIconClasses = computed(() => this._variantResult().emptyIcon());\n readonly emptyMessageClasses = computed(() => this._variantResult().emptyMessage());\n readonly loadingOverlayClasses = computed(() => this._variantResult().loadingOverlay());\n readonly loadingMessageClasses = computed(() => this._variantResult().loadingMessage());\n readonly errorStateClasses = computed(() => this._variantResult().errorState());\n readonly errorIconClasses = computed(() => this._variantResult().errorIcon());\n readonly errorMessageClasses = computed(() => this._variantResult().errorMessage());\n readonly footerSlotClasses = computed(() => this._variantResult().footerSlot());\n readonly paginationSlotClasses = computed(() => this._variantResult().paginationSlot());\n readonly expansionRowClasses = computed(() => this._variantResult().expansionRow());\n readonly expansionCellClasses = computed(() => this._variantResult().expansionCell());\n readonly selectionHeaderClasses = computed(() => {\n const base = this._variantResult().selectionHeader();\n return [base, this.thClasses()].filter(Boolean).join(' ');\n });\n readonly selectionCellClasses = computed(() => {\n const base = this._variantResult().selectionCell();\n return [base, this.tdClasses()].filter(Boolean).join(' ');\n });\n\n // ── CdkTable wiring ──\n //\n // All CdkColumnDefs + row defs are rendered INLINE in our template (see\n // `table.html`), so CdkTable's own @ContentChildren queries resolve them on\n // first render without our having to programmatically register anything.\n //\n // The noDataRow and expansion template are projected by consumers — we bridge\n // those to CdkTable via `setNoDataRow` (expansion uses an inline fallback\n // column + row def in the template).\n\n constructor() {\n // Forward dataSource / trackBy / multiTemplateRows / fixedLayout to the CDK\n // table whenever the inputs change.\n effect(() => {\n const table = this.cdkTable();\n if (!table) return;\n table.dataSource = this.data();\n const tb = this.trackBy();\n if (tb) table.trackBy = tb;\n table.multiTemplateDataRows = this.multiTemplateRows();\n table.fixedLayout = this.resolvedAppearance().layout === 'fixed';\n });\n\n // Bridge the projected no-data row to CdkTable.\n let registeredNoDataRow: NoDataRowDirective | null = null;\n effect(() => {\n const table = this.cdkTable();\n const noDataRow = this.noDataRow() ?? null;\n if (!table) return;\n if (registeredNoDataRow !== noDataRow) {\n table.setNoDataRow(noDataRow);\n registeredNoDataRow = noDataRow;\n }\n });\n\n // Expansion-set changes don't mutate `data`, so CdkTable's internal differ\n // doesn't know to re-evaluate row `when` predicates. Trigger a manual render\n // whenever the expansion set changes.\n effect(() => {\n this.expandedRows();\n const table = untracked(() => this.cdkTable());\n if (table) queueMicrotask(() => table.renderRows());\n });\n\n // Update each column's extra-class signals + columnIndex on relevant input changes.\n // Pushes the table-level `th` / `td` / `footerTd` classes plus per-column decorations\n // (sticky, hideBelow). ColumnComponent combines these with its own align/numeric bits.\n effect(() => {\n const visible = this.visibleColumns();\n const responsiveMode = this.resolvedResponsive().mode;\n const thCls = this.thClasses();\n const tdCls = this.tdClasses();\n const footerCls = this.footerTdClasses();\n\n untracked(() => {\n const allCols = this.columns();\n allCols.forEach((col) => {\n const visibleIndex = visible.indexOf(col);\n col.columnIndex.set(Math.max(0, visibleIndex));\n\n const display = col.resolvedDisplay();\n const decor: string[] = [];\n if (display.sticky === 'start') {\n decor.push(STICKY_CELL_ZINDEX, 'bg-surface-raised', STICKY_START_SHADOW);\n } else if (display.sticky === 'end') {\n decor.push(STICKY_CELL_ZINDEX, 'bg-surface-raised', STICKY_END_SHADOW);\n }\n if (display.hideBelow && responsiveMode === 'hide') {\n decor.push(HIDE_BELOW_UTILITIES[display.hideBelow]);\n }\n\n const decorCls = decor.join(' ');\n col.extraHeaderClass.set(`${thCls} ${decorCls}`.trim());\n col.extraCellClass.set(`${tdCls} ${decorCls}`.trim());\n col.extraFooterClass.set(`${footerCls} ${decorCls}`.trim());\n });\n });\n });\n\n // Push row snapshot into each column for footer-cell contexts.\n effect(() => {\n const rows = this.resolvedRows();\n const cols = this.columns();\n untracked(() => cols.forEach((c) => c.rowsSnapshot.set(rows)));\n });\n\n // Dev-mode: duplicate column name guard.\n effect(() => {\n if (!isDevMode()) return;\n const names = this.columns().map((c) => c.name());\n const seen = new Set<string>();\n for (const n of names) {\n if (seen.has(n)) {\n throw new Error(\n `[tw-table] duplicate column name '${n}'. Every <tw-column> must have a unique \\`name\\`.`,\n );\n }\n seen.add(n);\n }\n });\n\n // Dev-mode: require multiTemplateRows when row-expansion is declared.\n effect(() => {\n if (!isDevMode()) return;\n const tpl = this.expansionTemplate();\n if (tpl && !this.multiTemplateRows()) {\n throw new Error(\n '[tw-table] *twRowExpansion requires [multiTemplateRows]=\"true\" on <tw-table>.',\n );\n }\n });\n\n // Dev-mode: accessible-name warning, once mounted.\n afterNextRender(() => {\n if (!isDevMode()) return;\n const hasCaption = !!this._elementRef.nativeElement.querySelector('caption');\n if (!hasCaption && !this.ariaLabel() && !this.ariaLabelledby()) {\n\n console.warn(\n '[tw-table] no accessible name provided. Add a `<caption slot=\"caption\">`, `[aria-label]`, or `[aria-labelledby]`.',\n );\n }\n });\n\n // Loading announcement.\n //\n // The effect tracks `this.loading()` only; reads of labels / rows are wrapped\n // in `untracked()` so unrelated upstream signals (label updates, row mutations\n // that don't toggle loading) don't re-announce. The announcement should fire\n // once per loading-state transition, never on incidental data changes.\n effect(() => {\n const loading = this.loading();\n const labels = untracked(() => this.resolvedLabels());\n if (loading) {\n this._liveAnnouncer.announce(labels.loading, 'polite');\n } else {\n const count = untracked(() =>\n this.dataIsArray() ? this.resolvedRows().length : 0,\n );\n if (count > 0) {\n this._liveAnnouncer.announce(\n formatLabel(labels.rowsUpdatedAnnouncement, { count }),\n 'polite',\n );\n }\n }\n });\n }\n\n // ── Row-click + expansion + selection helpers ──\n\n /** @internal Called by the template when a data row is clicked. */\n handleRowClick(row: T, index: number, event: MouseEvent): void {\n const path = typeof event.composedPath === 'function' ? event.composedPath() : [];\n for (const node of path) {\n if (!(node instanceof HTMLElement)) continue;\n if (node === event.currentTarget) break;\n if (INTERACTIVE_TAGS.has(node.tagName)) return;\n if (node.hasAttribute('tabindex') && node.tabIndex >= 0 && node.tagName !== 'TR') return;\n const role = node.getAttribute('role');\n if (role === 'button' || role === 'link' || role === 'checkbox') return;\n }\n this.rowClicked.emit({ row, index, event });\n }\n\n /** @internal Whether a row is currently expanded. */\n isRowExpanded(row: T): boolean {\n const expanded = this.expandedRows();\n if (expanded.has(row)) return true;\n // `expandedRows` is a public `model<ReadonlySet<T>>`, and a JS Set cannot\n // take custom equality — so unlike selection this cannot be a keyed Set\n // without a breaking API change. A scan is acceptable here: expansion\n // holds a handful of rows, not the whole page. Skipped entirely when no\n // `trackBy` is supplied, since the reference check above is then complete.\n const track = this.trackBy();\n if (!track) return false;\n const key = this.rowKey(row);\n for (const candidate of expanded) {\n if (this.rowKey(candidate) === key) return true;\n }\n return false;\n }\n\n /** @internal CDK `when` predicate used for the auto-generated expansion row. */\n readonly expansionWhen = (index: number, row: T): boolean => {\n if (!this.hasExpansion()) return false;\n if (!this.expandedRows().has(row)) return false;\n const pred = this.expansionTemplate()?.predicate();\n if (typeof pred === 'function' && !pred(row, index)) return false;\n return true;\n };\n\n /** @internal Context object for the expansion template. */\n expansionContext(row: T, index: number): TwRowExpansionContext<T> {\n return {\n $implicit: row,\n row,\n index,\n collapse: () => this.collapse(row),\n };\n }\n\n /** Expands the given row if not already expanded and emits `expansionChange`. */\n expand(row: T): void {\n if (this.isRowExpanded(row)) return;\n const next = new Set(this.expandedRows());\n next.add(row);\n this.expandedRows.set(next);\n this.expansionChange.emit({ row, expanded: true, expandedRows: next });\n }\n\n /** Collapses the given row if currently expanded and emits `expansionChange`. */\n collapse(row: T): void {\n if (!this.isRowExpanded(row)) return;\n const next = new Set(this.expandedRows());\n if (!next.delete(row)) {\n // Row was matched by key rather than by reference — find and drop the\n // instance actually held in the set.\n const key = this.rowKey(row);\n for (const candidate of next) {\n if (this.rowKey(candidate) === key) {\n next.delete(candidate);\n break;\n }\n }\n }\n this.expandedRows.set(next);\n this.expansionChange.emit({ row, expanded: false, expandedRows: next });\n }\n\n /** Toggles the expansion state of the given row. */\n toggleExpansion(row: T): void {\n if (this.isRowExpanded(row)) this.collapse(row);\n else this.expand(row);\n }\n\n /**\n * @internal Identity key for a row.\n *\n * Selection and expansion are membership questions, and answering them by\n * object reference breaks the moment a data source re-emits equal-but-new\n * objects — an HTTP refetch, an immutable store, `signal.set([...mapped])`.\n * The user's selection empties with no event and no error.\n *\n * `trackBy` is already the consumer's declaration of row identity, so it is\n * reused here rather than adding a second, redundant input. With no `trackBy`\n * the key IS the row, i.e. reference identity — the same default CDK uses.\n *\n * Note this must be a *key* function, not a comparator: a comparator would fix\n * identity but leave membership as an O(rows x selected) scan, and a\n * reference-keyed Set would fix the scan but ignore custom identity. Only a\n * key fixes both.\n */\n private rowKey(row: T): unknown {\n const track = this.trackBy();\n return track ? track(-1, row) : row;\n }\n\n /** @internal O(1) membership lookup for the current selection, keyed by `rowKey`. */\n private readonly selectedKeys = computed<ReadonlySet<unknown>>(\n () => new Set(this.selected().map((row) => this.rowKey(row))),\n );\n\n /** Whether a given row is currently in the `selected` list. */\n isSelected(row: T): boolean {\n return this.selectedKeys().has(this.rowKey(row));\n }\n\n /** Selects or deselects a row and emits `selectionChange`. */\n setSelected(row: T, nextSelected: boolean): void {\n const previous = this.selected();\n const key = this.rowKey(row);\n const isAlreadySelected = this.selectedKeys().has(key);\n if (isAlreadySelected === nextSelected) return;\n const next = nextSelected\n ? [...previous, row]\n : previous.filter((r) => this.rowKey(r) !== key);\n this.selected.set(next);\n this.selectionChange.emit({\n selected: next,\n added: nextSelected ? [row] : [],\n removed: nextSelected ? [] : [row],\n previous,\n });\n }\n\n /**\n * Adds every row in the current data snapshot to `selected` that isn't already selected.\n * Emits `selectionChange` if anything changed. Only the array data-source path can compute a\n * full snapshot — for `Observable<T[]>` or `DataSource<T>` data inputs this is a no-op.\n */\n selectAll(): void {\n const rows = this.resolvedRows();\n if (rows.length === 0) return;\n const previous = this.selected();\n const previousKeys = this.selectedKeys();\n const added: T[] = [];\n for (const row of rows) {\n if (!previousKeys.has(this.rowKey(row))) added.push(row);\n }\n if (added.length === 0) return;\n const next: T[] = [...previous, ...added];\n this.selected.set(next);\n this.selectionChange.emit({ selected: next, added, removed: [], previous });\n }\n\n /** Clears every currently-selected row. Emits `selectionChange` if anything was selected. */\n clearSelection(): void {\n const previous = this.selected();\n if (previous.length === 0) return;\n this.selected.set([]);\n this.selectionChange.emit({ selected: [], added: [], removed: previous, previous });\n }\n\n /** @internal Returns `aria-selected` for a data row, or `null` to omit the attribute when selection is disabled. */\n rowAriaSelected(row: T): 'true' | 'false' | null {\n if (!this.resolvedSelection().enabled) return null;\n return this.isSelected(row) ? 'true' : 'false';\n }\n\n /**\n * @internal Tri-state summary of the current selection vs. the visible data snapshot.\n * `'none'` — nothing selected; `'some'` — partial; `'all'` — every snapshot row is selected.\n */\n readonly masterSelectionState = computed<'none' | 'some' | 'all'>(() => {\n const rows = this.resolvedRows();\n if (rows.length === 0) return 'none';\n const selected = this.selected();\n if (selected.length === 0) return 'none';\n const selectedKeys = this.selectedKeys();\n for (const row of rows) {\n if (!selectedKeys.has(this.rowKey(row))) return 'some';\n }\n return 'all';\n });\n\n /** @internal Whether the master \"select all\" checkbox should render checked. */\n readonly masterChecked = computed(() => this.masterSelectionState() === 'all');\n\n /** @internal Whether the master \"select all\" checkbox should render indeterminate. */\n readonly masterIndeterminate = computed(() => this.masterSelectionState() === 'some');\n\n /** @internal Wires the master checkbox change event to `selectAll` / `clearSelection`. */\n toggleMasterSelection(checked: boolean): void {\n if (checked) this.selectAll();\n else this.clearSelection();\n }\n\n /** @internal Formatted accessible label for a per-row selection checkbox. */\n selectRowLabel(rowIndex: number): string {\n return formatLabel(this.resolvedLabels().selectRowLabel, { index: rowIndex + 1 });\n }\n}\n","<!-- Toolbar slot — hidden when empty via `empty:hidden` in the slot class. -->\n<div [class]=\"toolbarClasses()\">\n <ng-content select=\"[slot='toolbar']\" />\n</div>\n\n<!-- Scroll wrapper — also hosts the loading overlay as an absolutely-positioned child. -->\n<div [class]=\"scrollWrapperClasses()\">\n <div [class]=\"scrollContainerClasses()\" [style.max-height]=\"maxHeightStyle()\">\n <table\n #cdkTable=\"cdkTable\"\n cdk-table\n [class]=\"tableClasses()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n >\n <ng-content select=\"[slot='caption']\" />\n\n <!--\n Emit one <ng-container cdkColumnDef> per visible column. CdkColumnDef's\n @ContentChildren(CdkCellDef / CdkHeaderCellDef / CdkFooterCellDef)\n resolves the <th *cdkHeaderCellDef> / <td *cdkCellDef> / <td *cdkFooterCellDef>\n below — those renderers delegate to the consumer's projected templates\n (col.cellDef() / col.headerCellDef() / col.footerCellDef()) via\n ngTemplateOutlet.\n -->\n @for (col of visibleColumns(); track col.name()) {\n <ng-container\n [cdkColumnDef]=\"col.name()\"\n [sticky]=\"col.stickyStart()\"\n [stickyEnd]=\"col.stickyEnd()\"\n >\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n [class]=\"col.headerCellClasses()\"\n [style.width]=\"col.resolvedWidth()\"\n [attr.aria-sort]=\"col.ariaSort()\"\n [attr.data-column]=\"col.name()\"\n scope=\"col\"\n >\n @if (col.headerCellDef(); as hdef) {\n <ng-container\n [ngTemplateOutlet]=\"hdef.template\"\n [ngTemplateOutletContext]=\"col.headerContext()\"\n />\n } @else if (col.headerLabel()) {\n {{ col.headerLabel() }}\n }\n </th>\n <td\n cdk-cell\n *cdkCellDef=\"let row; let i = index; let c = count; let f = first; let l = last; let e = even; let o = odd\"\n [class]=\"col.cellClasses()\"\n [style.width]=\"col.resolvedWidth()\"\n [attr.data-label]=\"col.stackDataLabel()\"\n [attr.data-column]=\"col.name()\"\n >\n @if (col.cellDef(); as cdef) {\n <ng-container\n [ngTemplateOutlet]=\"cdef.template\"\n [ngTemplateOutletContext]=\"col.buildCellContext(row, i, c, f, l, e, o)\"\n />\n }\n </td>\n @if (col.footerCellDef()) {\n <td\n cdk-footer-cell\n *cdkFooterCellDef\n [class]=\"col.footerCellClasses()\"\n [style.width]=\"col.resolvedWidth()\"\n [attr.data-column]=\"col.name()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"col.footerCellDef()!.template\"\n [ngTemplateOutletContext]=\"col.footerContext()\"\n />\n </td>\n }\n </ng-container>\n }\n\n <!-- Selection pseudo-column emitted as a leading column when `selection.enabled` is true.\n Hosts the master \"select all\" checkbox in the header and per-row checkboxes in the body.\n The role=\"checkbox\" host on <tw-checkbox> is allowlisted by the row-click suppression\n helper so clicking it does NOT also emit `rowClicked`. -->\n @if (resolvedSelection().enabled) {\n <ng-container cdkColumnDef=\"_selection\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n [class]=\"selectionHeaderClasses()\"\n scope=\"col\"\n >\n <!-- Select-all needs a full row snapshot, which only the array\n data-source path can produce. Rendering it for an Observable /\n DataSource input gave a checkbox that looked functional, never\n reflected state, and did nothing on click. -->\n @if (dataIsArray()) {\n <tw-checkbox\n size=\"sm\"\n [checked]=\"masterChecked()\"\n [indeterminate]=\"masterIndeterminate()\"\n (change)=\"toggleMasterSelection($event)\"\n [aria-label]=\"resolvedLabels().selectAllLabel\"\n />\n }\n </th>\n <td\n cdk-cell\n *cdkCellDef=\"let row; let i = index\"\n [class]=\"selectionCellClasses()\"\n >\n <tw-checkbox\n size=\"sm\"\n [checked]=\"isSelected(row)\"\n (change)=\"setSelected(row, $event)\"\n [aria-label]=\"selectRowLabel(i)\"\n />\n </td>\n </ng-container>\n }\n\n <!-- Auto-generated row defs driven by visibleColumnNames(). -->\n @if (visibleColumnNames().length > 0) {\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"visibleColumnNames(); sticky: stickyHeader()\"\n ></tr>\n <tr\n cdk-row\n *cdkRowDef=\"let row; let i = dataIndex; columns: visibleColumnNames()\"\n (click)=\"handleRowClick(row, i, $event)\"\n [attr.aria-selected]=\"rowAriaSelected(row)\"\n ></tr>\n @if (hasFooterRow()) {\n <tr\n cdk-footer-row\n *cdkFooterRowDef=\"visibleColumnNames(); sticky: stickyFooter()\"\n ></tr>\n }\n }\n\n <!-- Expansion pseudo-column + extra row def. -->\n @if (hasExpansion()) {\n <ng-container cdkColumnDef=\"_tw_expansion\">\n <td\n cdk-cell\n *cdkCellDef=\"let row; let i = dataIndex\"\n [attr.colspan]=\"expansionColspan()\"\n [class]=\"expansionCellClasses()\"\n >\n @if (expansionTemplate(); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"expansionContext(row, i)\"\n />\n }\n </td>\n </ng-container>\n <tr\n cdk-row\n *cdkRowDef=\"let row; columns: ['_tw_expansion']; when: expansionWhen\"\n [class]=\"expansionRowClasses()\"\n ></tr>\n }\n\n <!-- Consumer-projected content: tw-column metadata components and ng-template-based\n directives (*twNoDataRow, *twRowExpansion). The tw-column hosts are display:none\n so they are harmless inside the <table>. -->\n <ng-content />\n </table>\n\n <!-- Empty-state fallback overlay (hidden when a *twNoDataRow is projected; hidden when loading/error). -->\n @if (shouldRenderEmptyOverlay()) {\n <div [class]=\"emptyStateClasses()\">\n <ng-content select=\"[slot='empty']\">\n <svg\n [class]=\"emptyIconClasses()\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n aria-hidden=\"true\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M2.25 13.5h3.86a2.25 2.25 0 0 1 2.012 1.244l.256.512a2.25 2.25 0 0 0 2.013 1.244h3.218a2.25 2.25 0 0 0 2.013-1.244l.256-.512a2.25 2.25 0 0 1 2.013-1.244h3.859m-19.5.338V18a2.25 2.25 0 0 0 2.25 2.25h15A2.25 2.25 0 0 0 21.75 18v-4.162c0-.224-.034-.447-.1-.661l-2.4-8.022A2.25 2.25 0 0 0 17.128 3.5H6.873a2.25 2.25 0 0 0-2.122 1.655l-2.4 8.022a2.25 2.25 0 0 0-.1.661Z\"\n />\n </svg>\n <p [class]=\"emptyMessageClasses()\">{{ resolvedLabels().empty }}</p>\n </ng-content>\n </div>\n }\n\n <!-- Error-state overlay. -->\n @if (shouldRenderErrorOverlay()) {\n <div [class]=\"errorStateClasses()\" role=\"alert\">\n <ng-content select=\"[slot='error']\">\n <svg\n [class]=\"errorIconClasses()\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n aria-hidden=\"true\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z\"\n />\n </svg>\n <p [class]=\"errorMessageClasses()\">{{ errorMessage() }}</p>\n </ng-content>\n </div>\n }\n\n <!-- Loading overlay (absolute-positioned inside scroll wrapper). -->\n @if (loading()) {\n <div\n [class]=\"loadingOverlayClasses()\"\n role=\"status\"\n aria-live=\"polite\"\n animate.enter=\"fade-in\"\n animate.leave=\"fade-out\"\n >\n <ng-content select=\"[slot='loading']\">\n <svg\n class=\"size-5 shrink-0 animate-spin motion-reduce:animate-none text-fg-muted\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n opacity=\"0.2\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-dasharray=\"60\"\n stroke-dashoffset=\"40\"\n />\n </svg>\n <span [class]=\"loadingMessageClasses()\">{{ resolvedLabels().loading }}</span>\n </ng-content>\n </div>\n }\n </div>\n</div>\n\n<!-- Footer slot — hidden when empty via `empty:hidden` in the slot class. -->\n<div [class]=\"footerSlotClasses()\">\n <ng-content select=\"[slot='footer']\" />\n</div>\n\n<!-- Pagination slot — hidden when empty via `empty:hidden` in the slot class. -->\n<div [class]=\"paginationSlotClasses()\">\n <ng-content select=\"[slot='pagination']\" />\n</div>\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-table.mjs","sources":["../../../projects/ngx-tw/table/table.ts","../../../projects/ngx-tw/table/table.html","../../../projects/ngx-tw/table/cdevhub-ngx-tw-table.ts"],"sourcesContent":["/*\n * tw-table — wraps Angular CDK's CdkTable with a declarative <tw-column> API,\n * slot-based chrome (caption, toolbar, empty, loading, error, footer, pagination),\n * responsive (scroll / stack / hide) + sticky + layout controls, and typed\n * template contexts per cell/row/footer/expansion.\n *\n * v2 input shape — visual/behavioral concerns are grouped into config objects:\n * - `appearance` { variant, density, size, layout, rowAnimations }\n * - `sticky` { header, footer, scrollHeight }\n * - `responsive` { mode, stackBelow }\n * - `selection` { enabled }\n * - `<tw-column>` `display` { sticky, align, numeric, hideBelow, width }\n *\n * Each config input accepts a partial object; unset keys fall back to the documented\n * defaults (see `APPEARANCE_DEFAULTS`, etc.). Data, state, mechanical mode flags, i18n\n * and a11y attributes stay flat.\n *\n * Out of scope for v1:\n * - Column resize, drag-reorder\n * - CDK virtual scroll viewport integration\n * - Inline cell editing\n * - Filter UI primitives\n * - Arrow-key \"grid\" pattern keyboard navigation (APG)\n */\n\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n isDevMode,\n model,\n output,\n signal,\n TemplateRef,\n type TrackByFunction,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport {\n CdkNoDataRow,\n type CdkTable,\n CdkTableModule,\n type CdkTableDataSourceInput,\n} from '@angular/cdk/table';\nimport { tv } from 'tailwind-variants';\nimport { CheckboxComponent } from '@cdevhub/ngx-tw/checkbox';\nimport { TW_SORT_HANDLE, type TwBreakpoint, type TwSize } from '@cdevhub/ngx-tw/core';\n\n/** Possible values for the `aria-sort` attribute on a sortable column header. */\nexport type TwColumnAriaSort = 'ascending' | 'descending' | 'none' | null;\n\n// ── Public types ─────────────────────────────────────────────────────\n\n/** Re-export of CDK's accepted data-source shapes: plain array, Observable, or `DataSource<T>`. */\nexport type TwTableDataSourceInput<T> = CdkTableDataSourceInput<T>;\n\n/** Visual variant of the table. `'default'` — clean row dividers. `'striped'` — alternating rows. `'bordered'` — full grid with outer rounded border. */\nexport type TwTableVariant = 'default' | 'striped' | 'bordered';\n\n/** Row density. `'comfortable'` — larger vertical padding. `'compact'` — tighter padding for dense data. */\nexport type TwTableDensity = 'comfortable' | 'compact';\n\n/** Responsive behaviour mode. `'scroll'` — horizontal overflow. `'stack'` — cards per row below a breakpoint. `'hide'` — columns with `hideBelow` are hidden. */\nexport type TwTableResponsiveMode = 'scroll' | 'stack' | 'hide';\n\n/** Table layout algorithm. `'auto'` — content-sized columns. `'fixed'` — respects `<tw-column display.width>`. */\nexport type TwTableLayout = 'auto' | 'fixed';\n\n/** Horizontal alignment of a column's cells. */\nexport type TwColumnAlign = 'start' | 'center' | 'end';\n\n/** Column stickiness. `'start'` pins to leading edge; `'end'` pins to trailing edge; `false` disables. */\nexport type TwColumnSticky = 'start' | 'end' | false;\n\n// ── Config object types ──────────────────────────────────────────────\n\n/** Visual configuration. Pass any subset; unset keys fall back to the defaults. */\nexport interface TwTableAppearance {\n /** Visual variant. Defaults to `'default'`. */\n variant?: TwTableVariant;\n /** Row density (vertical padding only — independent of font size). Defaults to `'comfortable'`. */\n density?: TwTableDensity;\n /** Base font-size scale for header and data cells. Defaults to `'md'`. */\n size?: TwSize;\n /** Table layout algorithm. Defaults to `'auto'`. */\n layout?: TwTableLayout;\n /** When `true`, rows fade in on enter via `animate.enter=\"fade-in\"`. Off by default to avoid flicker on frequent data updates. Defaults to `false`. */\n rowAnimations?: boolean;\n}\n\n/** Sticky configuration — pinned header/footer rows and an internal scroll region. */\nexport interface TwTableSticky {\n /** When `true`, the `<thead>` row stays visible while the body scrolls. Requires `scrollHeight` or a scrolling ancestor. Defaults to `false`. */\n header?: boolean;\n /** When `true`, the `<tfoot>` row stays pinned while the body scrolls. Defaults to `false`. */\n footer?: boolean;\n /** Max-height of the internal scroll container. A number is treated as pixels; a string is passed through as a CSS length. When `null`, the table flows with its content. Defaults to `null`. */\n scrollHeight?: string | number | null;\n}\n\n/** Responsive configuration — how the table adapts to narrow viewports. */\nexport interface TwTableResponsive {\n /** Narrow-viewport strategy. Defaults to `'scroll'`. */\n mode?: TwTableResponsiveMode;\n /** Breakpoint below which the `'stack'` mode engages. Ignored when `mode !== 'stack'`. Defaults to `'md'`. */\n stackBelow?: TwBreakpoint;\n}\n\n/** Selection configuration. */\nexport interface TwTableSelection {\n /** When `true`, exposes a leading `_selection` column slot for checkbox rendering. Defaults to `false`. */\n enabled?: boolean;\n}\n\n/** Per-column display configuration. */\nexport interface TwColumnDisplay {\n /** Sticky positioning. `'start'` pins to the leading edge; `'end'` pins to the trailing edge; `false` disables stickiness. Defaults to `false`. */\n sticky?: TwColumnSticky;\n /** Horizontal text alignment. `'end'` is idiomatic for numeric columns. Defaults to `'start'`. */\n align?: TwColumnAlign;\n /** Convenience flag equivalent to `align: 'end'` plus tabular numerals. Overridden by an explicit `align`. Defaults to `false`. */\n numeric?: boolean;\n /** Responsive visibility: when set and the viewport is below this breakpoint, the column is hidden (applies when the table's `responsive.mode === 'hide'`). Defaults to `null`. */\n hideBelow?: TwBreakpoint | null;\n /** CSS column width applied to header and data cells. A number is treated as pixels; a string is passed through. Only honoured when the table's `appearance.layout === 'fixed'`. Defaults to `null`. */\n width?: string | number | null;\n}\n\n// ── Resolved-default constants ───────────────────────────────────────\n\nconst APPEARANCE_DEFAULTS: Required<TwTableAppearance> = {\n variant: 'default',\n density: 'comfortable',\n size: 'md',\n layout: 'auto',\n rowAnimations: false,\n};\n\nconst STICKY_DEFAULTS: Required<TwTableSticky> = {\n header: false,\n footer: false,\n scrollHeight: null,\n};\n\nconst RESPONSIVE_DEFAULTS: Required<TwTableResponsive> = {\n mode: 'scroll',\n stackBelow: 'md',\n};\n\nconst SELECTION_DEFAULTS: Required<TwTableSelection> = {\n enabled: false,\n};\n\nconst DISPLAY_DEFAULTS: Required<TwColumnDisplay> = {\n sticky: false,\n align: 'start',\n numeric: false,\n hideBelow: null,\n width: null,\n};\n\n// ── i18n + event types ───────────────────────────────────────────────\n\n/** String labels used by the table. All keys optional on the `labels` input; unset keys fall back to the English defaults. */\nexport interface TwTableLabels {\n /** Accessible name used when neither `<caption>`, `ariaLabel`, nor `ariaLabelledby` is provided. Triggers a dev-mode warning. */\n ariaLabel: string;\n /** Default empty-state message rendered when no `[slot=\"empty\"]` content is projected. */\n empty: string;\n /** Default loading message announced politely via `LiveAnnouncer`. */\n loading: string;\n /** Prefix prepended to `String(error)` when no `[slot=\"error\"]` content is projected. */\n errorPrefix: string;\n /** `LiveAnnouncer` template announced on row-count changes. Variable: `{count}`. */\n rowsUpdatedAnnouncement: string;\n /** `LiveAnnouncer` template for selection-change announcements. Variable: `{count}`. */\n selectionAnnouncement: string;\n /** Accessible label for the row-expansion toggle button. */\n expandRowLabel: string;\n /** Accessible label for the collapse-row toggle button. */\n collapseRowLabel: string;\n /** Accessible label for the master \"select all\" checkbox in the leading selection column. */\n selectAllLabel: string;\n /**\n * Accessible name for the leading selection column's header cell, used when no master checkbox\n * can be rendered (non-array data sources). Without it the `<th>` is literally empty, which is an\n * axe `empty-table-header` failure and leaves the column unnamed in a screen reader's table\n * summary. Rendered visually hidden.\n *\n * Optional on purpose: added after the interface shipped, so a required\n * member would be a compile break for any consumer annotating a complete\n * `TwTableLabels` literal — in exchange for a label that already has a\n * sensible default. The component merges against `DEFAULT_TABLE_LABELS`.\n */\n selectionColumnLabel?: string;\n /** Accessible label template for each per-row selection checkbox. Variable: `{index}` (1-based). */\n selectRowLabel: string;\n}\n\n/** Default English labels for the table. */\nexport const DEFAULT_TABLE_LABELS: Readonly<TwTableLabels> = {\n ariaLabel: 'Data table',\n empty: 'No data',\n loading: 'Loading…',\n errorPrefix: 'Error: ',\n rowsUpdatedAnnouncement: '{count} rows loaded',\n selectionAnnouncement: '{count} rows selected',\n expandRowLabel: 'Expand row',\n collapseRowLabel: 'Collapse row',\n selectAllLabel: 'Select all rows',\n selectionColumnLabel: 'Selection',\n selectRowLabel: 'Select row {index}',\n};\n\n/** Context provided to every data-cell template (`*twCellDef`). Generic over the row type `T`. */\nexport interface TwCellContext<T> {\n /** The row data (implicit `let-row`). */\n $implicit: T;\n /** The row, aliased for readability. */\n row: T;\n /** The column's declared `name`. */\n column: string;\n /** Zero-based index within the rendered row list. */\n index: number;\n /** Zero-based column index in the visible column set. */\n columnIndex: number;\n /** True when this cell is in the first row. */\n first: boolean;\n /** True when this cell is in the last row. */\n last: boolean;\n /** True when the row index is even. */\n even: boolean;\n /** True when the row index is odd. */\n odd: boolean;\n /** Total number of rendered rows. */\n count: number;\n}\n\n/** Context provided to every header-cell template (`*twHeaderCellDef`). */\nexport interface TwHeaderCellContext {\n /** The column's declared `name` (implicit `let-column`). */\n $implicit: string;\n /** The column's declared `name`, aliased. */\n column: string;\n /** Zero-based column index in the visible column set. */\n columnIndex: number;\n}\n\n/** Context provided to every footer-cell template (`*twFooterCellDef`). Generic over the row type `T`. */\nexport interface TwFooterCellContext<T> {\n /** The column's declared `name` (implicit). */\n $implicit: string;\n /** The column's declared `name`. */\n column: string;\n /** Zero-based column index in the visible column set. */\n columnIndex: number;\n /** Snapshot of all rows (useful for total/summary computation). */\n rows: readonly T[];\n}\n\n/** Context surfaced to a `*twRowDef` template. Mirrors `TwCellContext<T>` minus the column-specific fields. */\nexport interface TwRowContext<T> {\n /** The row data (implicit `let-row`). */\n $implicit: T;\n /** The row, aliased. */\n row: T;\n /** Zero-based index within the rendered row list. */\n index: number;\n /** True when this row is the first rendered row. */\n first: boolean;\n /** True when this row is the last rendered row. */\n last: boolean;\n /** True when the row index is even. */\n even: boolean;\n /** True when the row index is odd. */\n odd: boolean;\n /** Total rendered row count. */\n count: number;\n}\n\n/** Context provided to `*twRowExpansion`. */\nexport interface TwRowExpansionContext<T> {\n /** The row whose expansion panel this template renders. */\n $implicit: T;\n /** The row, aliased. */\n row: T;\n /** The data index. */\n index: number;\n /** Collapses this row (removes it from `expandedRows`). */\n collapse: () => void;\n}\n\n/** Payload emitted by `rowClicked`. */\nexport interface TwRowClickEvent<T> {\n /** The clicked row. */\n row: T;\n /** Zero-based index in the rendered data. */\n index: number;\n /**\n * The original DOM event. A `MouseEvent` for pointer activation, or a `KeyboardEvent` when the\n * row was activated with Enter / Space (only possible when `clickableRows` is `true`).\n */\n event: MouseEvent | KeyboardEvent;\n}\n\n/** Payload emitted by `selectionChange`. */\nexport interface TwSelectionChangeEvent<T> {\n /** The full current selection. */\n selected: readonly T[];\n /** Rows added since the previous selection. */\n added: readonly T[];\n /** Rows removed since the previous selection. */\n removed: readonly T[];\n /** The previous selection. */\n previous: readonly T[];\n}\n\n/** Payload emitted by `expansionChange`. */\nexport interface TwRowExpansionChangeEvent<T> {\n /** The row whose expansion state changed. */\n row: T;\n /** Whether the row is now expanded. */\n expanded: boolean;\n /** The full set of expanded rows after the change. */\n expandedRows: ReadonlySet<T>;\n}\n\n// ── tv() config ──────────────────────────────────────────────────────\n\n// CDK renders `<thead>` / `<tbody>` / `<tfoot>` inside its native-table template;\n// we can't set classes on those elements directly. Instead, we style them via\n// arbitrary descendant selectors on the `<table>` element itself (`[&>thead]:…`,\n// `[&>tbody>tr]:…`, etc.) — the full class strings stay statically present in\n// source so Tailwind v4's JIT scanner picks them up.\nconst tableVariants = tv(\n {\n slots: {\n root: 'relative block w-full',\n toolbar:\n 'empty:hidden flex items-center justify-between gap-3 px-4 py-3 border-b border-border',\n scrollWrapper: 'relative',\n scrollContainer: 'overflow-x-auto w-full',\n // `border-separate` + `border-spacing-0` is required for `position: sticky` on\n // `<th>` / `<td>` (CDK's sticky mechanism) to work reliably across browsers.\n // In border-collapse mode, Firefox (and historically Chrome) fails to stick\n // individual cells. Consequence: borders on row groups (`<thead>`, `<tfoot>`,\n // `<tr>`) don't render — all separators must be applied to cells directly.\n table:\n 'w-full border-separate border-spacing-0 text-start align-middle [&>thead>tr>th]:font-semibold [&>thead>tr>th]:text-fg [&>thead>tr>th]:tracking-tight [&>tbody>tr]:transition-colors [&>tbody>tr]:duration-normal [&>tbody>tr]:motion-reduce:transition-none [&>tfoot>tr>td]:border-t [&>tfoot>tr>td]:border-border',\n th: 'text-start font-semibold text-fg tracking-tight align-middle',\n td: 'text-fg align-middle',\n footerTd: 'text-fg font-medium align-middle',\n emptyState:\n 'flex flex-col items-center justify-center gap-2 px-4 py-12 text-center',\n emptyIcon: 'size-10 shrink-0 text-fg-subtle',\n emptyMessage: 'text-sm text-fg-muted',\n loadingOverlay:\n 'absolute inset-0 flex items-center justify-center gap-3 bg-surface/70 backdrop-blur-sm z-20 pointer-events-auto',\n loadingMessage: 'text-sm text-fg-muted',\n errorState:\n 'flex flex-col items-center justify-center gap-2 px-4 py-12 text-center',\n errorIcon: 'size-10 shrink-0 text-error-500',\n errorMessage: 'text-sm text-error-700',\n footerSlot: 'empty:hidden px-4 py-2 border-t border-border text-sm text-fg-muted',\n paginationSlot: 'empty:hidden border-t border-border px-2 py-2',\n expansionRow: 'bg-surface-sunken',\n expansionCell: 'p-0',\n dataRow: '',\n // The leading `_selection` column hosts checkboxes only — override the standard\n // text alignment + padding so the control stays centered in a narrow column.\n selectionHeader: 'w-12 text-center align-middle',\n selectionCell: 'w-12 text-center align-middle',\n },\n variants: {\n variant: {\n default: {\n table:\n '[&>thead>tr>th]:bg-surface-muted [&>tbody>tr:not(:last-child)>td]:border-b [&>tbody>tr:not(:last-child)>td]:border-border [&>tbody>tr:hover]:bg-surface-sunken',\n },\n striped: {\n table:\n '[&>thead>tr>th]:bg-surface-muted [&>tbody>tr:nth-child(even)]:bg-surface-sunken [&>tbody>tr:hover]:bg-surface-muted',\n },\n bordered: {\n root: 'rounded-lg border border-border-strong overflow-hidden',\n table:\n '[&>thead>tr>th]:bg-surface-muted [&>thead>tr>th]:border-b [&>thead>tr>th]:border-border [&>tbody>tr:hover]:bg-surface-sunken',\n th: 'border-r border-border last:border-r-0',\n td: 'border-r border-border last:border-r-0',\n footerTd: 'border-r border-border last:border-r-0',\n },\n },\n density: {\n comfortable: {\n th: 'px-4 py-3',\n td: 'px-4 py-3',\n footerTd: 'px-4 py-3',\n },\n compact: {\n th: 'px-3 py-1.5',\n td: 'px-3 py-1.5',\n footerTd: 'px-3 py-1.5',\n },\n },\n size: {\n xs: { table: 'text-xs' },\n sm: { table: 'text-sm' },\n md: { table: 'text-sm' },\n lg: { table: 'text-base' },\n xl: { table: 'text-base' },\n },\n layout: {\n auto: { table: 'table-auto' },\n fixed: { table: 'table-fixed' },\n },\n stickyHeader: {\n // Apply `position: sticky` to `<thead>` directly in addition to CDK's\n // per-cell sticky. Group-level sticky on row groups is well supported\n // across Chrome/Firefox/Safari and keeps the header visible reliably\n // regardless of table layout (`border-separate` vs `border-collapse`)\n // or consumer-supplied scroll ancestors. Cells still get their own bg\n // so they stay opaque over scrolled rows.\n true: {\n table:\n '[&>thead]:sticky [&>thead]:top-0 [&>thead]:z-20 [&>thead>tr>th]:bg-surface-raised [&>thead>tr>th]:z-10',\n },\n false: {},\n },\n stickyFooter: {\n true: {\n table:\n '[&>tfoot]:sticky [&>tfoot]:bottom-0 [&>tfoot]:z-20 [&>tfoot>tr>td]:bg-surface-raised [&>tfoot>tr>td]:z-10',\n },\n false: {},\n },\n loading: {\n true: { table: '[&>tbody]:opacity-60 [&>tbody]:pointer-events-none' },\n false: {},\n },\n // Data rows only become a keyboard target when the consumer opts in via\n // `clickableRows`. A static table must not put every row in the tab\n // order, so the affordance and the focus ring are gated on the same flag\n // that adds `tabindex` and the keydown handler.\n clickableRows: {\n true: {\n dataRow:\n 'cursor-pointer focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',\n },\n false: {},\n },\n },\n compoundVariants: [\n {\n variant: 'bordered',\n density: 'compact',\n class: { th: 'text-xs', td: 'text-xs', footerTd: 'text-xs' },\n },\n {\n stickyHeader: true,\n variant: 'striped',\n class: {\n table: '[&>thead>tr>th]:shadow-table-sticky',\n },\n },\n ],\n defaultVariants: {\n variant: 'default',\n density: 'comfortable',\n size: 'md',\n layout: 'auto',\n stickyHeader: false,\n stickyFooter: false,\n loading: false,\n clickableRows: false,\n },\n },\n { twMerge: true },\n);\n\n// ── Static class maps (Tailwind v4 JIT requires literal class strings) ──\n\nconst ALIGN_CLASSES: Record<TwColumnAlign, string> = {\n start: 'text-start',\n center: 'text-center',\n end: 'text-end',\n};\n\nconst HIDE_BELOW_UTILITIES: Record<TwBreakpoint, string> = {\n sm: 'max-sm:hidden',\n md: 'max-md:hidden',\n lg: 'max-lg:hidden',\n xl: 'max-xl:hidden',\n};\n\n/**\n * Stack mode: CSS-only transform that makes each data row read like a labelled card\n * below the chosen breakpoint. Applied to `<table>` via arbitrary descendant selectors\n * because CDK owns the `<thead>` / `<tbody>` / `<tr>` elements.\n *\n * Every class is written in full so Tailwind v4's JIT scanner picks it up.\n */\nconst STACK_TABLE_UTILITIES: Record<TwBreakpoint, string> = {\n sm: '[&>thead]:max-sm:hidden [&>tbody>tr]:max-sm:block [&>tbody>tr]:max-sm:border [&>tbody>tr]:max-sm:border-border [&>tbody>tr]:max-sm:rounded-lg [&>tbody>tr]:max-sm:p-3 [&>tbody>tr]:max-sm:mb-2 [&>tbody>tr]:max-sm:bg-surface-raised',\n md: '[&>thead]:max-md:hidden [&>tbody>tr]:max-md:block [&>tbody>tr]:max-md:border [&>tbody>tr]:max-md:border-border [&>tbody>tr]:max-md:rounded-lg [&>tbody>tr]:max-md:p-3 [&>tbody>tr]:max-md:mb-2 [&>tbody>tr]:max-md:bg-surface-raised',\n lg: '[&>thead]:max-lg:hidden [&>tbody>tr]:max-lg:block [&>tbody>tr]:max-lg:border [&>tbody>tr]:max-lg:border-border [&>tbody>tr]:max-lg:rounded-lg [&>tbody>tr]:max-lg:p-3 [&>tbody>tr]:max-lg:mb-2 [&>tbody>tr]:max-lg:bg-surface-raised',\n xl: '[&>thead]:max-xl:hidden [&>tbody>tr]:max-xl:block [&>tbody>tr]:max-xl:border [&>tbody>tr]:max-xl:border-border [&>tbody>tr]:max-xl:rounded-lg [&>tbody>tr]:max-xl:p-3 [&>tbody>tr]:max-xl:mb-2 [&>tbody>tr]:max-xl:bg-surface-raised',\n};\n\n/** Stack mode per-cell decoration (applied to `<td>` directly via column classes). */\nconst STACK_CELL_UTILITIES: Record<TwBreakpoint, string> = {\n sm: 'max-sm:flex max-sm:justify-between max-sm:gap-3 max-sm:py-1 max-sm:border-0 max-sm:before:content-[attr(data-label)] max-sm:before:font-semibold max-sm:before:text-fg-muted max-sm:before:mr-4',\n md: 'max-md:flex max-md:justify-between max-md:gap-3 max-md:py-1 max-md:border-0 max-md:before:content-[attr(data-label)] max-md:before:font-semibold max-md:before:text-fg-muted max-md:before:mr-4',\n lg: 'max-lg:flex max-lg:justify-between max-lg:gap-3 max-lg:py-1 max-lg:border-0 max-lg:before:content-[attr(data-label)] max-lg:before:font-semibold max-lg:before:text-fg-muted max-lg:before:mr-4',\n xl: 'max-xl:flex max-xl:justify-between max-xl:gap-3 max-xl:py-1 max-xl:border-0 max-xl:before:content-[attr(data-label)] max-xl:before:font-semibold max-xl:before:text-fg-muted max-xl:before:mr-4',\n};\n\n// CDK handles `position: sticky` + left/right offsets via its sticky styler.\n// We only add the decorative background + z-index so overlapping cells stay opaque,\n// plus a hairline shadow on the inner edge so the pinned column reads as floating\n// over scrolled content. Direction follows the pinned edge:\n// sticky-start (pinned left) → 1px shadow on the right side\n// sticky-end (pinned right) → 1px shadow on the left side\nconst STICKY_CELL_ZINDEX = 'z-[5]';\nconst STICKY_START_SHADOW = 'shadow-table-sticky-cell-start';\nconst STICKY_END_SHADOW = 'shadow-table-sticky-cell-end';\n\nconst INTERACTIVE_TAGS = new Set([\n 'BUTTON',\n 'A',\n 'INPUT',\n 'SELECT',\n 'OPTION',\n 'TEXTAREA',\n 'LABEL',\n 'SUMMARY',\n]);\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\nfunction formatLabel(\n template: string,\n vars: Readonly<Record<string, string | number>>,\n): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, key: string) =>\n Object.prototype.hasOwnProperty.call(vars, key) ? String(vars[key]) : match,\n );\n}\n\nfunction coerceCssSize(value: string | number | null | undefined): string | null {\n if (value === null || value === undefined || value === '') return null;\n return typeof value === 'number' ? `${value}px` : value;\n}\n\n// ── Cell/Header/Footer template directives ────────────────────────────\n//\n// These DO NOT extend the CDK counterparts. The ColumnComponent renders its\n// own <td cdk-cell *cdkCellDef>…</td> internally and forwards the consumer's\n// TemplateRef via ngTemplateOutlet with a typed context. Decoupling from CDK\n// here keeps our cell contexts strongly typed with extra fields (`columnIndex`,\n// `column`, `row`) that CDK's `CdkCellOutletRowContext` lacks.\n\n/** Structural directive on an `<ng-template>` (or a star-directive host) defining a column's data-cell template. Typed as `TwCellContext<T>`. */\n@Directive({ selector: '[twCellDef]' })\nexport class CellDefDirective<T = unknown> {\n /** @internal */\n readonly template = inject(TemplateRef<TwCellContext<T>>);\n\n /** @internal */\n static ngTemplateContextGuard<T>(\n _dir: CellDefDirective<T>,\n _ctx: unknown,\n ): _ctx is TwCellContext<T> {\n return true;\n }\n}\n\n/** Structural directive defining a column's header-cell template. Typed as `TwHeaderCellContext`. */\n@Directive({ selector: '[twHeaderCellDef]' })\nexport class HeaderCellDefDirective {\n /** @internal */\n readonly template = inject(TemplateRef<TwHeaderCellContext>);\n\n /** @internal */\n static ngTemplateContextGuard(\n _dir: HeaderCellDefDirective,\n _ctx: unknown,\n ): _ctx is TwHeaderCellContext {\n return true;\n }\n}\n\n/** Structural directive defining a column's footer-cell template. Typed as `TwFooterCellContext<T>`. */\n@Directive({ selector: '[twFooterCellDef]' })\nexport class FooterCellDefDirective<T = unknown> {\n /** @internal */\n readonly template = inject(TemplateRef<TwFooterCellContext<T>>);\n\n /** @internal */\n static ngTemplateContextGuard<T>(\n _dir: FooterCellDefDirective<T>,\n _ctx: unknown,\n ): _ctx is TwFooterCellContext<T> {\n return true;\n }\n}\n\n// ── No-data row + expansion directives ───────────────────────────────\n//\n// Row / header-row / footer-row defs are auto-generated inline in the\n// `<tw-table>` template based on `<tw-column>` declarations. `*twNoDataRow`\n// and `*twRowExpansion` remain as consumer-facing directives because they\n// carry custom templates the consumer projects.\n\n/** Structural directive on an `<ng-template>` declaring the no-data row fallback. Takes precedence over `[slot=\"empty\"]` when both are present. */\n@Directive({\n selector: 'ng-template[twNoDataRow]',\n providers: [{ provide: CdkNoDataRow, useExisting: NoDataRowDirective }],\n})\nexport class NoDataRowDirective extends CdkNoDataRow {}\n\n/** Structural directive on an `<ng-template>` declaring the row-expansion template. Requires `[multiTemplateRows]=\"true\"` on the parent `<tw-table>`. */\n@Directive({ selector: 'ng-template[twRowExpansion]' })\nexport class RowExpansionDirective<T = unknown> {\n /** Optional predicate that decides whether this expansion renders for a given row. Defaults to `undefined` (render for every expanded row). Alias: `twRowExpansionWhen`. */\n readonly predicate = input<((row: T, index: number) => boolean) | undefined>(\n undefined,\n { alias: 'twRowExpansionWhen' },\n );\n\n /** @internal */\n readonly template = inject(TemplateRef<TwRowExpansionContext<T>>);\n\n /** @internal */\n static ngTemplateContextGuard<T>(\n _dir: RowExpansionDirective<T>,\n _ctx: unknown,\n ): _ctx is TwRowExpansionContext<T> {\n return true;\n }\n}\n\n// ── ColumnComponent ───────────────────────────────────────────────────\n//\n// `<tw-column>` is a pure metadata component — it holds the column's inputs\n// and collects the consumer's header/data/footer cell templates via\n// `contentChild`. The actual `<ng-container cdkColumnDef>` + cell renderers\n// are emitted inline in `<tw-table>`'s template via a `@for` loop. This keeps\n// every CDK defn (column, row, header-row, footer-row) inside CdkTable's\n// DIRECT content, so its `@ContentChildren` queries resolve them on first\n// render without our having to wire programmatic `addColumnDef` + deal with\n// its timing quirks.\n\nlet nextColumnId = 0;\n\n/**\n * Declares a single column of a `<tw-table>`. Pure-metadata component — its\n * host element is `display: none`; the column's `<th>` / `<td>` / `<tfoot>`\n * renderers are emitted by the parent `<tw-table>` using the projected cell\n * templates (`*twHeaderCellDef`, `*twCellDef`, `*twFooterCellDef`).\n */\n@Component({\n selector: 'tw-column',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: '',\n host: {\n 'style': 'display: none',\n },\n})\nexport class ColumnComponent<T = unknown> {\n /** Unique identifier for this column. Required — referenced by `*twRowDef` / `*twHeaderRowDef` and used as the CDK `cdkColumnDef` name. */\n readonly name = input.required<string>();\n\n /** Visual configuration: sticky, align, numeric, hideBelow, width. Accepts any subset; unset keys fall back to the defaults. */\n readonly display = input<TwColumnDisplay>({});\n\n /** When true, removes this column from the visible column set. Defaults to `false`. */\n readonly hidden = input<boolean>(false);\n\n /** Ordering hint for the default visible-columns list when no `*twRowDef` is declared. Lower renders first. Defaults to `0`. */\n readonly priority = input<number>(0);\n\n /** Plain text header label. Used when no `*twHeaderCellDef` template is projected. Defaults to `undefined`. */\n readonly headerLabel = input<string | undefined>(undefined);\n\n /** Label used as `data-label` on cells in responsive `'stack'` mode. Falls back to `headerLabel`, then `name`. Defaults to `undefined`. */\n readonly stackLabel = input<string | undefined>(undefined);\n\n /**\n * Explicit override for the column header's `aria-sort` attribute. When unset (the default),\n * the column derives its `aria-sort` from a parent `[twSort]` directive via the `TW_SORT_HANDLE`\n * token — the column is treated as active when the directive's `active` id matches this column's\n * `name`. Set explicitly to `'ascending'` / `'descending'` / `'none'` to override; `null` disables\n * the attribute entirely. Defaults to `null`.\n */\n readonly sortState = input<TwColumnAriaSort>(null);\n\n /** @internal Stable identifier used for DOM `data-*` hooks. */\n readonly columnId = `tw-column-${nextColumnId++}`;\n\n private readonly sortHandle = inject(TW_SORT_HANDLE, { optional: true });\n\n /** @internal Consumer-projected header-cell template (optional). */\n readonly headerCellDef = contentChild(HeaderCellDefDirective);\n\n /** @internal Consumer-projected data-cell template. */\n readonly cellDef = contentChild(CellDefDirective<T>);\n\n /** @internal Consumer-projected footer-cell template (optional). */\n readonly footerCellDef = contentChild(FooterCellDefDirective<T>);\n\n /** @internal Index in the visible column set — pushed by the parent table. */\n readonly columnIndex = signal(0);\n\n /** @internal Row snapshot pushed by the parent for footer-cell contexts. */\n readonly rowsSnapshot = signal<readonly T[]>([]);\n\n /** @internal Table-pushed extra classes (sticky / hide-below / responsive decorations). */\n readonly extraCellClass = signal('');\n readonly extraHeaderClass = signal('');\n readonly extraFooterClass = signal('');\n\n /** Resolved display config — partial input merged with `DISPLAY_DEFAULTS`. */\n readonly resolvedDisplay = computed<Required<TwColumnDisplay>>(() => ({\n ...DISPLAY_DEFAULTS,\n ...this.display(),\n }));\n\n /** @internal Convenience accessor for the cdkColumnDef `[sticky]` binding. */\n readonly stickyStart = computed(() => this.resolvedDisplay().sticky === 'start');\n\n /** @internal Convenience accessor for the cdkColumnDef `[stickyEnd]` binding. */\n readonly stickyEnd = computed(() => this.resolvedDisplay().sticky === 'end');\n\n /** @internal Effective align — `numeric` forces `'end'` unless `align` is explicitly set to a non-default value. */\n readonly effectiveAlign = computed<TwColumnAlign>(() => {\n const display = this.resolvedDisplay();\n if (display.align === 'start' && display.numeric) return 'end';\n return display.align;\n });\n\n /** @internal CSS width string applied to cells. */\n readonly resolvedWidth = computed<string | null>(() =>\n coerceCssSize(this.resolvedDisplay().width),\n );\n\n /** @internal `data-label` emitted on cells in stack mode. */\n readonly stackDataLabel = computed<string>(\n () => this.stackLabel() ?? this.headerLabel() ?? this.name(),\n );\n\n /** @internal Align class plus tabular-numerals when `numeric` is true — shared by data and footer cells. */\n private readonly dataCellPrefix = computed(() => {\n const align = ALIGN_CLASSES[this.effectiveAlign()];\n const numeric = this.resolvedDisplay().numeric ? '[font-variant-numeric:tabular-nums]' : '';\n return numeric ? `${align} ${numeric}` : align;\n });\n\n readonly cellClasses = computed(() =>\n [this.dataCellPrefix(), this.extraCellClass()].filter(Boolean).join(' '),\n );\n\n readonly headerCellClasses = computed(() =>\n [ALIGN_CLASSES[this.effectiveAlign()], this.extraHeaderClass()].filter(Boolean).join(' '),\n );\n\n readonly footerCellClasses = computed(() =>\n [this.dataCellPrefix(), this.extraFooterClass()].filter(Boolean).join(' '),\n );\n\n /**\n * @internal `aria-sort` value for the column's `<th>`. Explicit `sortState` wins; otherwise the\n * column auto-resolves against a parent `[twSort]` directive (`TW_SORT_HANDLE`). Returns `null`\n * when no sort is wired or the column is not the active sort, so the attribute is omitted.\n */\n readonly ariaSort = computed<TwColumnAriaSort>(() => {\n const explicit = this.sortState();\n if (explicit !== null) return explicit;\n const handle = this.sortHandle;\n if (!handle) return null;\n if (handle.active() !== this.name()) return null;\n const direction = handle.direction();\n if (direction === 'asc') return 'ascending';\n if (direction === 'desc') return 'descending';\n return null;\n });\n\n readonly headerContext = computed<TwHeaderCellContext>(() => ({\n $implicit: this.name(),\n column: this.name(),\n columnIndex: this.columnIndex(),\n }));\n\n readonly footerContext = computed<TwFooterCellContext<T>>(() => ({\n $implicit: this.name(),\n column: this.name(),\n columnIndex: this.columnIndex(),\n rows: this.rowsSnapshot(),\n }));\n\n /** @internal Builds the per-cell template context from CDK-provided row variables. */\n buildCellContext(\n row: T,\n index: number,\n count: number,\n first: boolean,\n last: boolean,\n even: boolean,\n odd: boolean,\n ): TwCellContext<T> {\n return {\n $implicit: row,\n row,\n column: this.name(),\n index,\n columnIndex: this.columnIndex(),\n first,\n last,\n even,\n odd,\n count,\n };\n }\n}\n\n// ── TableComponent ────────────────────────────────────────────────────\n\nlet nextTableId = 0;\n\n/**\n * A highly customizable data-table component wrapping `@angular/cdk/table`.\n *\n * Composes with other ngx-tw primitives:\n * - Sortable headers: place `[twSort]` on `<tw-table>` and `[tw-sort-header]` inside `*twHeaderCellDef`.\n * - Pagination: project `<tw-paginator slot=\"pagination\">` as a child.\n * - Loading spinner: project `<tw-spinner slot=\"loading\">` or rely on the built-in fallback.\n */\n@Component({\n selector: 'tw-table',\n exportAs: 'twTable',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CdkTableModule, NgTemplateOutlet, CheckboxComponent],\n templateUrl: './table.html',\n host: {\n '[class]': 'hostClasses()',\n },\n})\nexport class TableComponent<T = unknown> {\n // ── Inputs ──\n\n /** The table's rows. Accepts a plain array, an `Observable<readonly T[]>`, or a CDK `DataSource<T>`. Wired directly to `CdkTable.dataSource`. Defaults to an empty array. */\n readonly data = input<TwTableDataSourceInput<T>>([] as readonly T[]);\n\n /**\n * Tracking function used to identify rows across data changes. When unset, rows are identified by\n * object reference.\n *\n * This drives **selection and expansion membership** as well as CDK's DOM diffing. Supply it when\n * the data source re-emits equal-but-new objects — an HTTP refetch, an immutable store — or the\n * user's selection empties on every refresh with no event and no error. It is called with `-1` as\n * the index for membership lookups, so return a value derived from the row alone (`row.id`), not\n * from the index.\n */\n readonly trackBy = input<TrackByFunction<T> | undefined>(undefined);\n\n /** When true, renders the loading slot as an overlay and applies `opacity-60 pointer-events-none` to the body. Defaults to `false`. */\n readonly loading = input<boolean>(false);\n\n /** When non-null, renders the error slot in place of the body. Defaults to `null`. */\n readonly error = input<unknown | null>(null);\n\n /** Visual configuration — `variant`, `density`, `size`, `layout`, `rowAnimations`. Accepts a partial; unset keys fall back to the defaults. */\n readonly appearance = input<TwTableAppearance>({});\n\n /** Sticky configuration — `header`, `footer`, `scrollHeight`. Accepts a partial; unset keys fall back to the defaults. */\n readonly sticky = input<TwTableSticky>({});\n\n /** Responsive configuration — `mode`, `stackBelow`. Accepts a partial; unset keys fall back to the defaults. */\n readonly responsive = input<TwTableResponsive>({});\n\n /** Selection configuration — `enabled`. Accepts a partial; unset keys fall back to the defaults. */\n readonly selection = input<TwTableSelection>({});\n\n /** Whether multiple row templates may render per data object. Required for `*twRowExpansion` and advanced `*twRowDef [when]` usage. Defaults to `false`. */\n readonly multiTemplateRows = input<boolean>(false);\n\n /**\n * Whether data rows are activatable. Set this whenever you bind `(rowClicked)` — it is what puts\n * each row in the tab order, wires Enter / Space to the same handler as a click, and paints the\n * focus ring. Left `false`, `(rowClicked)` stays pointer-only, which keeps a static table out of\n * the tab order. Defaults to `false`.\n */\n readonly clickableRows = input<boolean>(false);\n\n /** Overrides for user-facing strings. Unset keys fall back to the English defaults. Defaults to `{}`. */\n readonly labels = input<Partial<TwTableLabels>>({});\n\n /** Accessible name for the `<table>`. Required when no visible `<caption slot=\"caption\">` is provided. Defaults to `undefined`. Alias: `aria-label`. */\n readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n\n /** Id of an external element labelling the table. Mirrored to `aria-labelledby` on the `<table>`. Defaults to `undefined`. */\n readonly ariaLabelledby = input<string | undefined>(undefined, { alias: 'aria-labelledby' });\n\n // ── Models (two-way) ──\n\n /** Two-way bound set of rows currently expanded. Immutable — set a new `Set` on every change; do not mutate in place. Defaults to an empty set. */\n readonly expandedRows = model<ReadonlySet<T>>(new Set<T>());\n\n /** Two-way bound list of selected rows. Set a new array on every change; do not mutate. Only used when `selection.enabled` is `true`. Defaults to an empty array. */\n readonly selected = model<readonly T[]>([]);\n\n // ── Outputs ──\n\n /** Fires when a row is clicked. Suppressed when the click originated inside an interactive descendant (button, link, input, etc.). */\n readonly rowClicked = output<TwRowClickEvent<T>>();\n\n /** Fires after `selected` changes via user interaction (not on programmatic writes). */\n readonly selectionChange = output<TwSelectionChangeEvent<T>>();\n\n /** Fires after a row is expanded or collapsed by user interaction. */\n readonly expansionChange = output<TwRowExpansionChangeEvent<T>>();\n\n // ── Content queries ──\n\n /** @internal Projected columns. */\n readonly columns = contentChildren(ColumnComponent<T>, { descendants: true });\n\n /** @internal Projected custom no-data row (takes precedence over the fallback empty state). */\n readonly noDataRow = contentChild(NoDataRowDirective, { descendants: true });\n\n /** @internal Projected expansion row template. */\n readonly expansionTemplate = contentChild(RowExpansionDirective<T>, { descendants: true });\n\n // ── View children ──\n\n /** @internal The CDK table inside our view. */\n readonly cdkTable = viewChild.required<CdkTable<T>>('cdkTable');\n\n // ── Injected services ──\n\n private readonly _liveAnnouncer = inject(LiveAnnouncer);\n private readonly _elementRef = inject(ElementRef<HTMLElement>);\n private readonly _destroyRef = inject(DestroyRef);\n\n // ── Identifiers ──\n\n /** Unique per-instance id used to scope row/expansion DOM ids. */\n readonly hostId = `tw-table-${nextTableId++}`;\n\n /** Returns the DOM id used for the expansion row of the given data row at the given index. Useful for wiring `aria-controls` from a trigger cell. */\n readonly expansionId = (_row: T, index: number): string =>\n `${this.hostId}-expansion-${index}`;\n\n // ── Resolved config (partial input merged with defaults) ──\n\n /** @internal Resolved visual configuration. */\n readonly resolvedAppearance = computed<Required<TwTableAppearance>>(() => ({\n ...APPEARANCE_DEFAULTS,\n ...this.appearance(),\n }));\n\n /** @internal Resolved sticky configuration. */\n readonly resolvedSticky = computed<Required<TwTableSticky>>(() => ({\n ...STICKY_DEFAULTS,\n ...this.sticky(),\n }));\n\n /** @internal Resolved responsive configuration. */\n readonly resolvedResponsive = computed<Required<TwTableResponsive>>(() => ({\n ...RESPONSIVE_DEFAULTS,\n ...this.responsive(),\n }));\n\n /** @internal Resolved selection configuration. */\n readonly resolvedSelection = computed<Required<TwTableSelection>>(() => ({\n ...SELECTION_DEFAULTS,\n ...this.selection(),\n }));\n\n // ── Derived state ──\n\n /** @internal Snapshot of the data array (for footer-cell context). Empty array for async data sources. */\n readonly resolvedRows = computed<readonly T[]>(() => {\n const d = this.data();\n return Array.isArray(d) ? (d as readonly T[]) : [];\n });\n\n /** @internal Whether the data input is a plain array. */\n readonly dataIsArray = computed(() => Array.isArray(this.data()));\n\n /** @internal Snapshot-based empty check; `false` for async sources (we can't know without subscribing). */\n readonly isEmptySnapshot = computed(\n () => this.dataIsArray() && this.resolvedRows().length === 0,\n );\n\n /** @internal Whether the empty overlay fallback should render (no no-data-row projected). */\n readonly shouldRenderEmptyOverlay = computed(\n () =>\n this.isEmptySnapshot() &&\n !this.loading() &&\n this.error() === null &&\n !this.noDataRow(),\n );\n\n /** @internal Whether the error overlay should render. */\n readonly shouldRenderErrorOverlay = computed(() => this.error() !== null);\n\n /**\n * @internal Resolved table labels (defaults merged with input overrides).\n *\n * Explicitly-undefined keys are dropped before merging: a plain spread lets\n * `{ selectionColumnLabel: undefined }` overwrite the default with undefined,\n * which renders an empty `sr-only` span and reinstates the\n * `empty-table-header` failure the label exists to prevent. `Required<>`\n * then guarantees the template a string for every label.\n */\n readonly resolvedLabels = computed<Required<TwTableLabels>>(() => {\n const overrides = Object.fromEntries(\n Object.entries(this.labels() ?? {}).filter(([, value]) => value !== undefined),\n );\n return { ...DEFAULT_TABLE_LABELS, ...overrides } as Required<TwTableLabels>;\n });\n\n /** @internal Computed error message for the default error overlay. Empty when no error is set. */\n readonly errorMessage = computed(() => {\n const err = this.error();\n if (err == null) return '';\n return `${this.resolvedLabels().errorPrefix}${String(err)}`;\n });\n\n /** @internal CSS max-height string for the scroll container. */\n readonly maxHeightStyle = computed(() => coerceCssSize(this.resolvedSticky().scrollHeight));\n\n /** @internal The visible (non-hidden) columns in render order (by ascending `priority`). */\n readonly visibleColumns = computed<readonly ColumnComponent<T>[]>(() =>\n this.columns()\n .filter((c) => !c.hidden())\n .sort((a, b) => a.priority() - b.priority()),\n );\n\n /** @internal Column names of the visible set, prefixed with `_selection` when `selection.enabled === true`. */\n readonly visibleColumnNames = computed<readonly string[]>(() => {\n const names = this.visibleColumns().map((c) => c.name());\n return this.resolvedSelection().enabled ? ['_selection', ...names] : names;\n });\n\n /** @internal Whether any column has a projected footer-cell template. */\n readonly hasFooterRow = computed<boolean>(() =>\n this.visibleColumns().some((c) => !!c.footerCellDef()),\n );\n\n /** @internal Whether an expansion template has been declared and multi-template rows are enabled. */\n readonly hasExpansion = computed(\n () => this.multiTemplateRows() && !!this.expansionTemplate(),\n );\n\n /** @internal Colspan to use for the expansion `<td>`. */\n readonly expansionColspan = computed(() => {\n const cols = this.visibleColumns().length;\n return Math.max(1, cols + (this.resolvedSelection().enabled ? 1 : 0));\n });\n\n /** @internal Pulled by the template for the `*cdkHeaderRowDef`/`*cdkFooterRowDef` `sticky:` field. */\n readonly stickyHeader = computed(() => this.resolvedSticky().header);\n readonly stickyFooter = computed(() => this.resolvedSticky().footer);\n\n // ── Variant class computation ──\n\n private readonly _variantResult = computed(() => {\n const appearance = this.resolvedAppearance();\n const stickyCfg = this.resolvedSticky();\n return tableVariants({\n variant: appearance.variant,\n density: appearance.density,\n size: appearance.size,\n layout: appearance.layout,\n stickyHeader: stickyCfg.header,\n stickyFooter: stickyCfg.footer,\n loading: this.loading(),\n clickableRows: this.clickableRows(),\n });\n });\n\n readonly hostClasses = computed(() => this._variantResult().root());\n readonly toolbarClasses = computed(() => this._variantResult().toolbar());\n readonly scrollWrapperClasses = computed(() => this._variantResult().scrollWrapper());\n readonly scrollContainerClasses = computed(() => {\n const base = this._variantResult().scrollContainer();\n return this.maxHeightStyle() ? `${base} overflow-y-auto` : base;\n });\n\n readonly tableClasses = computed(() => {\n const base = this._variantResult().table();\n const responsive = this.resolvedResponsive();\n if (responsive.mode !== 'stack') return base;\n return `${base} ${STACK_TABLE_UTILITIES[responsive.stackBelow]}`;\n });\n\n readonly thClasses = computed(() => this._variantResult().th());\n readonly tdClasses = computed(() => {\n const base = this._variantResult().td();\n const responsive = this.resolvedResponsive();\n if (responsive.mode === 'stack') {\n return `${base} ${STACK_CELL_UTILITIES[responsive.stackBelow]}`;\n }\n return base;\n });\n readonly footerTdClasses = computed(() => this._variantResult().footerTd());\n readonly emptyStateClasses = computed(() => this._variantResult().emptyState());\n readonly emptyIconClasses = computed(() => this._variantResult().emptyIcon());\n readonly emptyMessageClasses = computed(() => this._variantResult().emptyMessage());\n readonly loadingOverlayClasses = computed(() => this._variantResult().loadingOverlay());\n readonly loadingMessageClasses = computed(() => this._variantResult().loadingMessage());\n readonly errorStateClasses = computed(() => this._variantResult().errorState());\n readonly errorIconClasses = computed(() => this._variantResult().errorIcon());\n readonly errorMessageClasses = computed(() => this._variantResult().errorMessage());\n readonly footerSlotClasses = computed(() => this._variantResult().footerSlot());\n readonly paginationSlotClasses = computed(() => this._variantResult().paginationSlot());\n readonly dataRowClasses = computed(() => this._variantResult().dataRow());\n readonly expansionRowClasses = computed(() => this._variantResult().expansionRow());\n readonly expansionCellClasses = computed(() => this._variantResult().expansionCell());\n readonly selectionHeaderClasses = computed(() => {\n const base = this._variantResult().selectionHeader();\n return [base, this.thClasses()].filter(Boolean).join(' ');\n });\n readonly selectionCellClasses = computed(() => {\n const base = this._variantResult().selectionCell();\n return [base, this.tdClasses()].filter(Boolean).join(' ');\n });\n\n // ── CdkTable wiring ──\n //\n // All CdkColumnDefs + row defs are rendered INLINE in our template (see\n // `table.html`), so CdkTable's own @ContentChildren queries resolve them on\n // first render without our having to programmatically register anything.\n //\n // The noDataRow and expansion template are projected by consumers — we bridge\n // those to CdkTable via `setNoDataRow` (expansion uses an inline fallback\n // column + row def in the template).\n\n constructor() {\n // Forward dataSource / trackBy / multiTemplateRows / fixedLayout to the CDK\n // table whenever the inputs change.\n effect(() => {\n const table = this.cdkTable();\n if (!table) return;\n table.dataSource = this.data();\n const tb = this.trackBy();\n if (tb) table.trackBy = tb;\n table.multiTemplateDataRows = this.multiTemplateRows();\n table.fixedLayout = this.resolvedAppearance().layout === 'fixed';\n });\n\n // Bridge the projected no-data row to CdkTable.\n let registeredNoDataRow: NoDataRowDirective | null = null;\n effect(() => {\n const table = this.cdkTable();\n const noDataRow = this.noDataRow() ?? null;\n if (!table) return;\n if (registeredNoDataRow !== noDataRow) {\n table.setNoDataRow(noDataRow);\n registeredNoDataRow = noDataRow;\n }\n });\n\n // Expansion-set changes don't mutate `data`, so CdkTable's internal differ\n // doesn't know to re-evaluate row `when` predicates. Trigger a manual render\n // whenever the expansion set changes.\n effect(() => {\n this.expandedRows();\n const table = untracked(() => this.cdkTable());\n if (table) queueMicrotask(() => table.renderRows());\n });\n\n // Update each column's extra-class signals + columnIndex on relevant input changes.\n // Pushes the table-level `th` / `td` / `footerTd` classes plus per-column decorations\n // (sticky, hideBelow). ColumnComponent combines these with its own align/numeric bits.\n effect(() => {\n const visible = this.visibleColumns();\n const responsiveMode = this.resolvedResponsive().mode;\n const thCls = this.thClasses();\n const tdCls = this.tdClasses();\n const footerCls = this.footerTdClasses();\n\n untracked(() => {\n const allCols = this.columns();\n allCols.forEach((col) => {\n const visibleIndex = visible.indexOf(col);\n col.columnIndex.set(Math.max(0, visibleIndex));\n\n const display = col.resolvedDisplay();\n const decor: string[] = [];\n if (display.sticky === 'start') {\n decor.push(STICKY_CELL_ZINDEX, 'bg-surface-raised', STICKY_START_SHADOW);\n } else if (display.sticky === 'end') {\n decor.push(STICKY_CELL_ZINDEX, 'bg-surface-raised', STICKY_END_SHADOW);\n }\n if (display.hideBelow && responsiveMode === 'hide') {\n decor.push(HIDE_BELOW_UTILITIES[display.hideBelow]);\n }\n\n const decorCls = decor.join(' ');\n col.extraHeaderClass.set(`${thCls} ${decorCls}`.trim());\n col.extraCellClass.set(`${tdCls} ${decorCls}`.trim());\n col.extraFooterClass.set(`${footerCls} ${decorCls}`.trim());\n });\n });\n });\n\n // Push row snapshot into each column for footer-cell contexts.\n effect(() => {\n const rows = this.resolvedRows();\n const cols = this.columns();\n untracked(() => cols.forEach((c) => c.rowsSnapshot.set(rows)));\n });\n\n // Dev-mode: duplicate column name guard.\n effect(() => {\n if (!isDevMode()) return;\n const names = this.columns().map((c) => c.name());\n const seen = new Set<string>();\n for (const n of names) {\n if (seen.has(n)) {\n throw new Error(\n `[tw-table] duplicate column name '${n}'. Every <tw-column> must have a unique \\`name\\`.`,\n );\n }\n seen.add(n);\n }\n });\n\n // Dev-mode: require multiTemplateRows when row-expansion is declared.\n effect(() => {\n if (!isDevMode()) return;\n const tpl = this.expansionTemplate();\n if (tpl && !this.multiTemplateRows()) {\n throw new Error(\n '[tw-table] *twRowExpansion requires [multiTemplateRows]=\"true\" on <tw-table>.',\n );\n }\n });\n\n // Dev-mode: accessible-name warning, once mounted.\n afterNextRender(() => {\n if (!isDevMode()) return;\n const hasCaption = !!this._elementRef.nativeElement.querySelector('caption');\n if (!hasCaption && !this.ariaLabel() && !this.ariaLabelledby()) {\n\n console.warn(\n '[tw-table] no accessible name provided. Add a `<caption slot=\"caption\">`, `[aria-label]`, or `[aria-labelledby]`.',\n );\n }\n });\n\n // Loading announcement.\n //\n // This is the *only* announcement channel for the loading state. The\n // loading overlay in table.html carries no `role=\"status\"` / `aria-live`\n // on purpose — it used to, and screen readers announced the same string\n // twice per fetch. A pre-existing live region receiving text (what\n // `LiveAnnouncer` does) is also the reliable pattern; an `@if`-inserted\n // region whose content arrives in the same tick is not.\n //\n // The effect tracks `this.loading()` only; reads of labels / rows are wrapped\n // in `untracked()` so unrelated upstream signals (label updates, row mutations\n // that don't toggle loading) don't re-announce. The announcement should fire\n // once per loading-state transition, never on incidental data changes.\n effect(() => {\n const loading = this.loading();\n const labels = untracked(() => this.resolvedLabels());\n if (loading) {\n this._liveAnnouncer.announce(labels.loading, 'polite');\n } else {\n const count = untracked(() =>\n this.dataIsArray() ? this.resolvedRows().length : 0,\n );\n if (count > 0) {\n this._liveAnnouncer.announce(\n formatLabel(labels.rowsUpdatedAnnouncement, { count }),\n 'polite',\n );\n }\n }\n });\n }\n\n // ── Row-click + expansion + selection helpers ──\n\n /** @internal Called by the template when a data row is clicked. */\n handleRowClick(row: T, index: number, event: MouseEvent): void {\n const path = typeof event.composedPath === 'function' ? event.composedPath() : [];\n for (const node of path) {\n if (!(node instanceof HTMLElement)) continue;\n if (node === event.currentTarget) break;\n if (INTERACTIVE_TAGS.has(node.tagName)) return;\n if (node.hasAttribute('tabindex') && node.tabIndex >= 0 && node.tagName !== 'TR') return;\n const role = node.getAttribute('role');\n if (role === 'button' || role === 'link' || role === 'checkbox') return;\n }\n this.rowClicked.emit({ row, index, event });\n }\n\n /**\n * @internal Keyboard counterpart to `handleRowClick`. Only reachable when `clickableRows` is\n * `true`, because that is the only state in which the `<tr>` carries `tabindex`.\n *\n * The `target !== currentTarget` guard is what keeps Enter on a button *inside* a cell from also\n * activating the row: that keystroke's target is the button, and its own click already bubbles\n * into `handleRowClick`, which suppresses it. Reusing the `composedPath()` walk here would let\n * the row fire a second time.\n */\n handleRowKeydown(row: T, index: number, event: KeyboardEvent): void {\n if (!this.clickableRows()) return;\n if (event.target !== event.currentTarget) return;\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n this.rowClicked.emit({ row, index, event });\n }\n\n /** @internal `tabindex` for a data row — present only while rows are activatable. */\n readonly rowTabIndex = computed(() => (this.clickableRows() ? 0 : null));\n\n /** @internal Whether a row is currently expanded. */\n isRowExpanded(row: T): boolean {\n const expanded = this.expandedRows();\n if (expanded.has(row)) return true;\n // `expandedRows` is a public `model<ReadonlySet<T>>`, and a JS Set cannot\n // take custom equality — so unlike selection this cannot be a keyed Set\n // without a breaking API change. A scan is acceptable here: expansion\n // holds a handful of rows, not the whole page. Skipped entirely when no\n // `trackBy` is supplied, since the reference check above is then complete.\n const track = this.trackBy();\n if (!track) return false;\n const key = this.rowKey(row);\n for (const candidate of expanded) {\n if (this.rowKey(candidate) === key) return true;\n }\n return false;\n }\n\n /** @internal CDK `when` predicate used for the auto-generated expansion row. */\n readonly expansionWhen = (index: number, row: T): boolean => {\n if (!this.hasExpansion()) return false;\n if (!this.expandedRows().has(row)) return false;\n const pred = this.expansionTemplate()?.predicate();\n if (typeof pred === 'function' && !pred(row, index)) return false;\n return true;\n };\n\n /** @internal Context object for the expansion template. */\n expansionContext(row: T, index: number): TwRowExpansionContext<T> {\n return {\n $implicit: row,\n row,\n index,\n collapse: () => this.collapse(row),\n };\n }\n\n /** Expands the given row if not already expanded and emits `expansionChange`. */\n expand(row: T): void {\n if (this.isRowExpanded(row)) return;\n const next = new Set(this.expandedRows());\n next.add(row);\n this.expandedRows.set(next);\n this.expansionChange.emit({ row, expanded: true, expandedRows: next });\n }\n\n /** Collapses the given row if currently expanded and emits `expansionChange`. */\n collapse(row: T): void {\n if (!this.isRowExpanded(row)) return;\n const next = new Set(this.expandedRows());\n if (!next.delete(row)) {\n // Row was matched by key rather than by reference — find and drop the\n // instance actually held in the set.\n const key = this.rowKey(row);\n for (const candidate of next) {\n if (this.rowKey(candidate) === key) {\n next.delete(candidate);\n break;\n }\n }\n }\n this.expandedRows.set(next);\n this.expansionChange.emit({ row, expanded: false, expandedRows: next });\n }\n\n /** Toggles the expansion state of the given row. */\n toggleExpansion(row: T): void {\n if (this.isRowExpanded(row)) this.collapse(row);\n else this.expand(row);\n }\n\n /**\n * @internal Identity key for a row.\n *\n * Selection and expansion are membership questions, and answering them by\n * object reference breaks the moment a data source re-emits equal-but-new\n * objects — an HTTP refetch, an immutable store, `signal.set([...mapped])`.\n * The user's selection empties with no event and no error.\n *\n * `trackBy` is already the consumer's declaration of row identity, so it is\n * reused here rather than adding a second, redundant input. With no `trackBy`\n * the key IS the row, i.e. reference identity — the same default CDK uses.\n *\n * Note this must be a *key* function, not a comparator: a comparator would fix\n * identity but leave membership as an O(rows x selected) scan, and a\n * reference-keyed Set would fix the scan but ignore custom identity. Only a\n * key fixes both.\n */\n private rowKey(row: T): unknown {\n const track = this.trackBy();\n return track ? track(-1, row) : row;\n }\n\n /** @internal O(1) membership lookup for the current selection, keyed by `rowKey`. */\n private readonly selectedKeys = computed<ReadonlySet<unknown>>(\n () => new Set(this.selected().map((row) => this.rowKey(row))),\n );\n\n /** Whether a given row is currently in the `selected` list. */\n isSelected(row: T): boolean {\n return this.selectedKeys().has(this.rowKey(row));\n }\n\n /** Selects or deselects a row and emits `selectionChange`. */\n setSelected(row: T, nextSelected: boolean): void {\n const previous = this.selected();\n const key = this.rowKey(row);\n const isAlreadySelected = this.selectedKeys().has(key);\n if (isAlreadySelected === nextSelected) return;\n const next = nextSelected\n ? [...previous, row]\n : previous.filter((r) => this.rowKey(r) !== key);\n this.selected.set(next);\n this.selectionChange.emit({\n selected: next,\n added: nextSelected ? [row] : [],\n removed: nextSelected ? [] : [row],\n previous,\n });\n }\n\n /**\n * Adds every row in the current data snapshot to `selected` that isn't already selected.\n * Emits `selectionChange` if anything changed. Only the array data-source path can compute a\n * full snapshot — for `Observable<T[]>` or `DataSource<T>` data inputs this is a no-op.\n */\n selectAll(): void {\n const rows = this.resolvedRows();\n if (rows.length === 0) return;\n const previous = this.selected();\n const previousKeys = this.selectedKeys();\n const added: T[] = [];\n for (const row of rows) {\n if (!previousKeys.has(this.rowKey(row))) added.push(row);\n }\n if (added.length === 0) return;\n const next: T[] = [...previous, ...added];\n this.selected.set(next);\n this.selectionChange.emit({ selected: next, added, removed: [], previous });\n }\n\n /** Clears every currently-selected row. Emits `selectionChange` if anything was selected. */\n clearSelection(): void {\n const previous = this.selected();\n if (previous.length === 0) return;\n this.selected.set([]);\n this.selectionChange.emit({ selected: [], added: [], removed: previous, previous });\n }\n\n /** @internal Returns `aria-selected` for a data row, or `null` to omit the attribute when selection is disabled. */\n rowAriaSelected(row: T): 'true' | 'false' | null {\n if (!this.resolvedSelection().enabled) return null;\n return this.isSelected(row) ? 'true' : 'false';\n }\n\n /**\n * @internal Tri-state summary of the current selection vs. the visible data snapshot.\n * `'none'` — nothing selected; `'some'` — partial; `'all'` — every snapshot row is selected.\n */\n readonly masterSelectionState = computed<'none' | 'some' | 'all'>(() => {\n const rows = this.resolvedRows();\n if (rows.length === 0) return 'none';\n const selected = this.selected();\n if (selected.length === 0) return 'none';\n const selectedKeys = this.selectedKeys();\n for (const row of rows) {\n if (!selectedKeys.has(this.rowKey(row))) return 'some';\n }\n return 'all';\n });\n\n /** @internal Whether the master \"select all\" checkbox should render checked. */\n readonly masterChecked = computed(() => this.masterSelectionState() === 'all');\n\n /** @internal Whether the master \"select all\" checkbox should render indeterminate. */\n readonly masterIndeterminate = computed(() => this.masterSelectionState() === 'some');\n\n /** @internal Wires the master checkbox change event to `selectAll` / `clearSelection`. */\n toggleMasterSelection(checked: boolean): void {\n if (checked) this.selectAll();\n else this.clearSelection();\n }\n\n /** @internal Formatted accessible label for a per-row selection checkbox. */\n selectRowLabel(rowIndex: number): string {\n return formatLabel(this.resolvedLabels().selectRowLabel, { index: rowIndex + 1 });\n }\n}\n","<!-- Toolbar slot — hidden when empty via `empty:hidden` in the slot class. -->\n<div [class]=\"toolbarClasses()\">\n <ng-content select=\"[slot='toolbar']\" />\n</div>\n\n<!-- Scroll wrapper — also hosts the loading overlay as an absolutely-positioned child. -->\n<div [class]=\"scrollWrapperClasses()\">\n <div [class]=\"scrollContainerClasses()\" [style.max-height]=\"maxHeightStyle()\">\n <table\n #cdkTable=\"cdkTable\"\n cdk-table\n [class]=\"tableClasses()\"\n [attr.aria-label]=\"ariaLabel() ?? null\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? null\"\n >\n <ng-content select=\"[slot='caption']\" />\n\n <!--\n Emit one <ng-container cdkColumnDef> per visible column. CdkColumnDef's\n @ContentChildren(CdkCellDef / CdkHeaderCellDef / CdkFooterCellDef)\n resolves the <th *cdkHeaderCellDef> / <td *cdkCellDef> / <td *cdkFooterCellDef>\n below — those renderers delegate to the consumer's projected templates\n (col.cellDef() / col.headerCellDef() / col.footerCellDef()) via\n ngTemplateOutlet.\n -->\n @for (col of visibleColumns(); track col.name()) {\n <ng-container\n [cdkColumnDef]=\"col.name()\"\n [sticky]=\"col.stickyStart()\"\n [stickyEnd]=\"col.stickyEnd()\"\n >\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n [class]=\"col.headerCellClasses()\"\n [style.width]=\"col.resolvedWidth()\"\n [attr.aria-sort]=\"col.ariaSort()\"\n [attr.data-column]=\"col.name()\"\n scope=\"col\"\n >\n @if (col.headerCellDef(); as hdef) {\n <ng-container\n [ngTemplateOutlet]=\"hdef.template\"\n [ngTemplateOutletContext]=\"col.headerContext()\"\n />\n } @else if (col.headerLabel()) {\n {{ col.headerLabel() }}\n }\n </th>\n <td\n cdk-cell\n *cdkCellDef=\"let row; let i = index; let c = count; let f = first; let l = last; let e = even; let o = odd\"\n [class]=\"col.cellClasses()\"\n [style.width]=\"col.resolvedWidth()\"\n [attr.data-label]=\"col.stackDataLabel()\"\n [attr.data-column]=\"col.name()\"\n >\n @if (col.cellDef(); as cdef) {\n <ng-container\n [ngTemplateOutlet]=\"cdef.template\"\n [ngTemplateOutletContext]=\"col.buildCellContext(row, i, c, f, l, e, o)\"\n />\n }\n </td>\n @if (col.footerCellDef()) {\n <td\n cdk-footer-cell\n *cdkFooterCellDef\n [class]=\"col.footerCellClasses()\"\n [style.width]=\"col.resolvedWidth()\"\n [attr.data-column]=\"col.name()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"col.footerCellDef()!.template\"\n [ngTemplateOutletContext]=\"col.footerContext()\"\n />\n </td>\n }\n </ng-container>\n }\n\n <!-- Selection pseudo-column emitted as a leading column when `selection.enabled` is true.\n Hosts the master \"select all\" checkbox in the header and per-row checkboxes in the body.\n The role=\"checkbox\" host on <tw-checkbox> is allowlisted by the row-click suppression\n helper so clicking it does NOT also emit `rowClicked`. -->\n @if (resolvedSelection().enabled) {\n <ng-container cdkColumnDef=\"_selection\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n [class]=\"selectionHeaderClasses()\"\n scope=\"col\"\n >\n <!-- Select-all needs a full row snapshot, which only the array\n data-source path can produce. Rendering it for an Observable /\n DataSource input gave a checkbox that looked functional, never\n reflected state, and did nothing on click. -->\n @if (dataIsArray()) {\n <tw-checkbox\n size=\"sm\"\n [checked]=\"masterChecked()\"\n [indeterminate]=\"masterIndeterminate()\"\n (change)=\"toggleMasterSelection($event)\"\n [aria-label]=\"resolvedLabels().selectAllLabel\"\n />\n } @else {\n <!-- Without the master checkbox this header cell would be\n literally empty, which axe reports as `empty-table-header`\n and which leaves the column unnamed in a screen reader's\n table summary. -->\n <span class=\"sr-only\">{{ resolvedLabels().selectionColumnLabel }}</span>\n }\n </th>\n <td\n cdk-cell\n *cdkCellDef=\"let row; let i = index\"\n [class]=\"selectionCellClasses()\"\n >\n <tw-checkbox\n size=\"sm\"\n [checked]=\"isSelected(row)\"\n (change)=\"setSelected(row, $event)\"\n [aria-label]=\"selectRowLabel(i)\"\n />\n </td>\n </ng-container>\n }\n\n <!-- Auto-generated row defs driven by visibleColumnNames(). -->\n @if (visibleColumnNames().length > 0) {\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"visibleColumnNames(); sticky: stickyHeader()\"\n ></tr>\n <!-- Both index context variables are captured on purpose. CDK's\n `CdkTable` sets `dataIndex` ONLY when `multiTemplateDataRows` is\n enabled (row expansion); otherwise it sets `index` and leaves\n `dataIndex` undefined. Reading just one gives `undefined` in the\n other mode — which shipped as `rowClicked` emitting\n `index: undefined` for every table without row expansion. -->\n <!-- `tabindex` / `(keydown)` / the focus ring are all gated on\n `clickableRows`. A static table must not put every row in the tab\n order, and Angular gives no way to ask whether `(rowClicked)` has a\n subscriber — so the consumer declares it. Deliberately NO `role`\n override: a `<tr>` is a `row`, and retagging it `button` breaks the\n table's structural role contract for its own cells. -->\n <tr\n cdk-row\n *cdkRowDef=\"\n let row;\n let i = index;\n let di = dataIndex;\n columns: visibleColumnNames()\n \"\n [class]=\"dataRowClasses()\"\n (click)=\"handleRowClick(row, di ?? i, $event)\"\n (keydown)=\"handleRowKeydown(row, di ?? i, $event)\"\n [attr.tabindex]=\"rowTabIndex()\"\n [attr.aria-selected]=\"rowAriaSelected(row)\"\n ></tr>\n @if (hasFooterRow()) {\n <tr\n cdk-footer-row\n *cdkFooterRowDef=\"visibleColumnNames(); sticky: stickyFooter()\"\n ></tr>\n }\n }\n\n <!-- Expansion pseudo-column + extra row def. -->\n @if (hasExpansion()) {\n <ng-container cdkColumnDef=\"_tw_expansion\">\n <td\n cdk-cell\n *cdkCellDef=\"let row; let i = dataIndex\"\n [attr.colspan]=\"expansionColspan()\"\n [class]=\"expansionCellClasses()\"\n >\n @if (expansionTemplate(); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl.template\"\n [ngTemplateOutletContext]=\"expansionContext(row, i)\"\n />\n }\n </td>\n </ng-container>\n <tr\n cdk-row\n *cdkRowDef=\"let row; columns: ['_tw_expansion']; when: expansionWhen\"\n [class]=\"expansionRowClasses()\"\n ></tr>\n }\n\n <!-- Consumer-projected content: tw-column metadata components and ng-template-based\n directives (*twNoDataRow, *twRowExpansion). The tw-column hosts are display:none\n so they are harmless inside the <table>. -->\n <ng-content />\n </table>\n\n <!-- Empty-state fallback overlay (hidden when a *twNoDataRow is projected; hidden when loading/error). -->\n @if (shouldRenderEmptyOverlay()) {\n <div [class]=\"emptyStateClasses()\">\n <ng-content select=\"[slot='empty']\">\n <svg\n [class]=\"emptyIconClasses()\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n aria-hidden=\"true\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M2.25 13.5h3.86a2.25 2.25 0 0 1 2.012 1.244l.256.512a2.25 2.25 0 0 0 2.013 1.244h3.218a2.25 2.25 0 0 0 2.013-1.244l.256-.512a2.25 2.25 0 0 1 2.013-1.244h3.859m-19.5.338V18a2.25 2.25 0 0 0 2.25 2.25h15A2.25 2.25 0 0 0 21.75 18v-4.162c0-.224-.034-.447-.1-.661l-2.4-8.022A2.25 2.25 0 0 0 17.128 3.5H6.873a2.25 2.25 0 0 0-2.122 1.655l-2.4 8.022a2.25 2.25 0 0 0-.1.661Z\"\n />\n </svg>\n <p [class]=\"emptyMessageClasses()\">{{ resolvedLabels().empty }}</p>\n </ng-content>\n </div>\n }\n\n <!-- Error-state overlay. -->\n @if (shouldRenderErrorOverlay()) {\n <div [class]=\"errorStateClasses()\" role=\"alert\">\n <ng-content select=\"[slot='error']\">\n <svg\n [class]=\"errorIconClasses()\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n aria-hidden=\"true\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z\"\n />\n </svg>\n <p [class]=\"errorMessageClasses()\">{{ errorMessage() }}</p>\n </ng-content>\n </div>\n }\n\n <!--\n Loading overlay (absolute-positioned inside scroll wrapper).\n\n Deliberately NOT a live region. The loading string is announced by\n `LiveAnnouncer` from the effect in table.ts; carrying `role=\"status\"`\n (which implies `aria-live=\"polite\"`) here as well made screen readers\n announce the same text twice on every fetch. The visible text stays —\n it is the sighted user's loading affordance — it just no longer\n announces itself.\n -->\n @if (loading()) {\n <div\n [class]=\"loadingOverlayClasses()\"\n data-tw-table-loading\n animate.enter=\"fade-in\"\n animate.leave=\"fade-out\"\n >\n <ng-content select=\"[slot='loading']\">\n <svg\n class=\"size-5 shrink-0 animate-spin motion-reduce:animate-none text-fg-muted\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n opacity=\"0.2\"\n />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-dasharray=\"60\"\n stroke-dashoffset=\"40\"\n />\n </svg>\n <span [class]=\"loadingMessageClasses()\">{{ resolvedLabels().loading }}</span>\n </ng-content>\n </div>\n }\n </div>\n</div>\n\n<!-- Footer slot — hidden when empty via `empty:hidden` in the slot class. -->\n<div [class]=\"footerSlotClasses()\">\n <ng-content select=\"[slot='footer']\" />\n</div>\n\n<!-- Pagination slot — hidden when empty via `empty:hidden` in the slot class. -->\n<div [class]=\"paginationSlotClasses()\">\n <ng-content select=\"[slot='pagination']\" />\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}