snice 7.8.0 → 7.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/README.md +1 -1
  2. package/adapters/react/SniceProvider.js +1 -1
  3. package/adapters/react/SniceRouter.js +1 -1
  4. package/adapters/react/matchRoute.js +1 -1
  5. package/adapters/react/table.d.ts +1 -0
  6. package/adapters/react/table.d.ts.map +1 -1
  7. package/adapters/react/table.js +1 -1
  8. package/adapters/react/table.js.map +1 -1
  9. package/adapters/react/table.tsx +2 -1
  10. package/adapters/react/useRequestHandler.js +1 -1
  11. package/bin/analyzer-contracts.js +17 -1
  12. package/custom-elements.json +57 -3
  13. package/dist/cdn/accordion/snice-accordion.js +1 -1
  14. package/dist/cdn/action-bar/snice-action-bar.js +1 -1
  15. package/dist/cdn/activity-feed/snice-activity-feed.js +1 -1
  16. package/dist/cdn/alert/snice-alert.js +1 -1
  17. package/dist/cdn/app-tiles/snice-app-tiles.js +1 -1
  18. package/dist/cdn/approval-flow/snice-approval-flow.js +1 -1
  19. package/dist/cdn/audio-recorder/snice-audio-recorder.js +1 -1
  20. package/dist/cdn/availability/snice-availability.js +1 -1
  21. package/dist/cdn/avatar/snice-avatar.js +1 -1
  22. package/dist/cdn/avatar-group/snice-avatar-group.js +1 -1
  23. package/dist/cdn/badge/snice-badge.js +1 -1
  24. package/dist/cdn/banner/snice-banner.js +1 -1
  25. package/dist/cdn/binpack/snice-binpack.js +1 -1
  26. package/dist/cdn/book/snice-book.js +1 -1
  27. package/dist/cdn/booking/snice-booking.js +1 -1
  28. package/dist/cdn/breadcrumbs/snice-breadcrumbs.js +1 -1
  29. package/dist/cdn/button/snice-button.js +1 -1
  30. package/dist/cdn/calendar/README.md +2 -2
  31. package/dist/cdn/calendar/snice-calendar.js +537 -44
  32. package/dist/cdn/calendar/snice-calendar.js.map +1 -1
  33. package/dist/cdn/calendar/snice-calendar.min.js +2 -2
  34. package/dist/cdn/calendar/snice-calendar.min.js.map +1 -1
  35. package/dist/cdn/camera/snice-camera.js +1 -1
  36. package/dist/cdn/camera-annotate/snice-camera-annotate.js +1 -1
  37. package/dist/cdn/candlestick/snice-candlestick.js +1 -1
  38. package/dist/cdn/card/snice-card.js +1 -1
  39. package/dist/cdn/carousel/snice-carousel.js +1 -1
  40. package/dist/cdn/cart/snice-cart.js +1 -1
  41. package/dist/cdn/chart/snice-chart.js +1 -1
  42. package/dist/cdn/chat/snice-chat.js +1 -1
  43. package/dist/cdn/checkbox/snice-checkbox.js +1 -1
  44. package/dist/cdn/chip/snice-chip.js +1 -1
  45. package/dist/cdn/code-block/README.md +2 -2
  46. package/dist/cdn/code-block/snice-code-block.js +177 -167
  47. package/dist/cdn/code-block/snice-code-block.js.map +1 -1
  48. package/dist/cdn/code-block/snice-code-block.min.js +2 -2
  49. package/dist/cdn/code-block/snice-code-block.min.js.map +1 -1
  50. package/dist/cdn/color-display/snice-color-display.js +1 -1
  51. package/dist/cdn/color-picker/snice-color-picker.js +1 -1
  52. package/dist/cdn/command-palette/README.md +1 -1
  53. package/dist/cdn/command-palette/snice-command-palette.js +2 -2
  54. package/dist/cdn/command-palette/snice-command-palette.js.map +1 -1
  55. package/dist/cdn/command-palette/snice-command-palette.min.js +1 -1
  56. package/dist/cdn/command-palette/snice-command-palette.min.js.map +1 -1
  57. package/dist/cdn/comments/snice-comments.js +1 -1
  58. package/dist/cdn/countdown/snice-countdown.js +1 -1
  59. package/dist/cdn/cropper/snice-cropper.js +1 -1
  60. package/dist/cdn/data-card/snice-data-card.js +1 -1
  61. package/dist/cdn/date-picker/snice-date-picker.js +1 -1
  62. package/dist/cdn/date-range-picker/snice-date-range-picker.js +1 -1
  63. package/dist/cdn/date-time-picker/snice-date-time-picker.js +1 -1
  64. package/dist/cdn/diff/snice-diff.js +1 -1
  65. package/dist/cdn/divider/snice-divider.js +1 -1
  66. package/dist/cdn/doc/snice-doc.js +1 -1
  67. package/dist/cdn/draw/snice-draw.js +1 -1
  68. package/dist/cdn/drawer/snice-drawer.js +1 -1
  69. package/dist/cdn/empty-state/snice-empty-state.js +1 -1
  70. package/dist/cdn/estimate/snice-estimate.js +1 -1
  71. package/dist/cdn/file-gallery/snice-file-gallery.js +1 -1
  72. package/dist/cdn/file-upload/snice-file-upload.js +1 -1
  73. package/dist/cdn/flip-card/snice-flip-card.js +1 -1
  74. package/dist/cdn/flow/snice-flow.js +1 -1
  75. package/dist/cdn/form-layout/snice-form-layout.js +1 -1
  76. package/dist/cdn/funnel/snice-funnel.js +1 -1
  77. package/dist/cdn/gantt/snice-gantt.js +1 -1
  78. package/dist/cdn/gauge/snice-gauge.js +1 -1
  79. package/dist/cdn/grid/snice-grid.js +1 -1
  80. package/dist/cdn/heatmap/snice-heatmap.js +1 -1
  81. package/dist/cdn/image/snice-image.js +1 -1
  82. package/dist/cdn/input/snice-input.js +1 -1
  83. package/dist/cdn/invoice/snice-invoice.js +1 -1
  84. package/dist/cdn/kanban/snice-kanban.js +1 -1
  85. package/dist/cdn/key-value/snice-key-value.js +1 -1
  86. package/dist/cdn/kpi/snice-kpi.js +1 -1
  87. package/dist/cdn/layout/snice-layout.js +1 -1
  88. package/dist/cdn/leaderboard/snice-leaderboard.js +1 -1
  89. package/dist/cdn/link/snice-link.js +1 -1
  90. package/dist/cdn/link-preview/snice-link-preview.js +1 -1
  91. package/dist/cdn/list/snice-list.js +1 -1
  92. package/dist/cdn/location/snice-location.js +1 -1
  93. package/dist/cdn/login/snice-login.js +1 -1
  94. package/dist/cdn/map/snice-map.js +1 -1
  95. package/dist/cdn/markdown/snice-markdown.js +1 -1
  96. package/dist/cdn/masonry/snice-masonry.js +1 -1
  97. package/dist/cdn/menu/snice-menu.js +1 -1
  98. package/dist/cdn/message-strip/snice-message-strip.js +1 -1
  99. package/dist/cdn/modal/snice-modal.js +1 -1
  100. package/dist/cdn/music-player/snice-music-player.js +1 -1
  101. package/dist/cdn/nav/snice-nav.js +1 -1
  102. package/dist/cdn/network-graph/snice-network-graph.js +1 -1
  103. package/dist/cdn/notification-center/snice-notification-center.js +1 -1
  104. package/dist/cdn/order-tracker/snice-order-tracker.js +1 -1
  105. package/dist/cdn/org-chart/snice-org-chart.js +1 -1
  106. package/dist/cdn/pagination/snice-pagination.js +1 -1
  107. package/dist/cdn/paint/snice-paint.js +1 -1
  108. package/dist/cdn/pdf-viewer/snice-pdf-viewer.js +1 -1
  109. package/dist/cdn/permission-matrix/snice-permission-matrix.js +1 -1
  110. package/dist/cdn/podcast-player/snice-podcast-player.js +1 -1
  111. package/dist/cdn/popover/snice-popover.js +1 -1
  112. package/dist/cdn/pricing-table/snice-pricing-table.js +1 -1
  113. package/dist/cdn/product-card/snice-product-card.js +1 -1
  114. package/dist/cdn/progress/snice-progress.js +2 -2
  115. package/dist/cdn/progress/snice-progress.js.map +1 -1
  116. package/dist/cdn/progress/snice-progress.min.js +1 -1
  117. package/dist/cdn/progress/snice-progress.min.js.map +1 -1
  118. package/dist/cdn/progress-ring/snice-progress-ring.js +1 -1
  119. package/dist/cdn/qr-code/README.md +2 -2
  120. package/dist/cdn/qr-code/snice-qr-code.js +19 -3
  121. package/dist/cdn/qr-code/snice-qr-code.js.map +1 -1
  122. package/dist/cdn/qr-code/snice-qr-code.min.js +2 -2
  123. package/dist/cdn/qr-code/snice-qr-code.min.js.map +1 -1
  124. package/dist/cdn/qr-reader/snice-qr-reader.js +1 -1
  125. package/dist/cdn/radio/snice-radio.js +1 -1
  126. package/dist/cdn/range-slider/snice-range-slider.js +1 -1
  127. package/dist/cdn/rating/snice-rating.js +1 -1
  128. package/dist/cdn/receipt/snice-receipt.js +5 -2
  129. package/dist/cdn/receipt/snice-receipt.js.map +1 -1
  130. package/dist/cdn/receipt/snice-receipt.min.js +1 -1
  131. package/dist/cdn/receipt/snice-receipt.min.js.map +1 -1
  132. package/dist/cdn/recipe/snice-recipe.js +1 -1
  133. package/dist/cdn/runtime/snice-runtime.esm.js +4 -4
  134. package/dist/cdn/runtime/snice-runtime.esm.js.map +1 -1
  135. package/dist/cdn/runtime/snice-runtime.esm.min.js.map +1 -1
  136. package/dist/cdn/runtime/snice-runtime.js +4 -4
  137. package/dist/cdn/runtime/snice-runtime.js.map +1 -1
  138. package/dist/cdn/runtime/snice-runtime.min.js.map +1 -1
  139. package/dist/cdn/sankey/snice-sankey.js +1 -1
  140. package/dist/cdn/segmented-control/snice-segmented-control.js +1 -1
  141. package/dist/cdn/select/README.md +2 -2
  142. package/dist/cdn/select/snice-select.js +6 -9
  143. package/dist/cdn/select/snice-select.js.map +1 -1
  144. package/dist/cdn/select/snice-select.min.js +2 -2
  145. package/dist/cdn/select/snice-select.min.js.map +1 -1
  146. package/dist/cdn/skeleton/snice-skeleton.js +1 -1
  147. package/dist/cdn/slider/snice-slider.js +1 -1
  148. package/dist/cdn/sortable/snice-sortable.js +1 -1
  149. package/dist/cdn/sparkline/snice-sparkline.js +1 -1
  150. package/dist/cdn/spinner/snice-spinner.js +1 -1
  151. package/dist/cdn/split-button/snice-split-button.js +1 -1
  152. package/dist/cdn/split-pane/snice-split-pane.js +1 -1
  153. package/dist/cdn/spotlight/snice-spotlight.js +1 -1
  154. package/dist/cdn/stat-group/snice-stat-group.js +1 -1
  155. package/dist/cdn/step-input/snice-step-input.js +1 -1
  156. package/dist/cdn/stepper/snice-stepper.js +1 -1
  157. package/dist/cdn/switch/snice-switch.js +1 -1
  158. package/dist/cdn/table/README.md +2 -2
  159. package/dist/cdn/table/snice-table.esm.js +1940 -407
  160. package/dist/cdn/table/snice-table.esm.js.map +1 -1
  161. package/dist/cdn/table/snice-table.esm.min.js +242 -53
  162. package/dist/cdn/table/snice-table.esm.min.js.map +1 -1
  163. package/dist/cdn/table/snice-table.js +1940 -407
  164. package/dist/cdn/table/snice-table.js.map +1 -1
  165. package/dist/cdn/table/snice-table.min.js +234 -45
  166. package/dist/cdn/table/snice-table.min.js.map +1 -1
  167. package/dist/cdn/tabs/snice-tabs.js +1 -1
  168. package/dist/cdn/tag/snice-tag.js +1 -1
  169. package/dist/cdn/tag-input/snice-tag-input.js +1 -1
  170. package/dist/cdn/terminal/snice-terminal.js +1 -1
  171. package/dist/cdn/testimonial/snice-testimonial.js +1 -1
  172. package/dist/cdn/textarea/snice-textarea.js +1 -1
  173. package/dist/cdn/time-picker/snice-time-picker.js +1 -1
  174. package/dist/cdn/time-range-picker/snice-time-range-picker.js +1 -1
  175. package/dist/cdn/timeline/snice-timeline.js +1 -1
  176. package/dist/cdn/timer/snice-timer.js +1 -1
  177. package/dist/cdn/toast/snice-toast.js +1 -1
  178. package/dist/cdn/tooltip/snice-tooltip.js +1 -1
  179. package/dist/cdn/tree/snice-tree.js +1 -1
  180. package/dist/cdn/treemap/snice-treemap.js +1 -1
  181. package/dist/cdn/user-card/snice-user-card.js +1 -1
  182. package/dist/cdn/video-player/snice-video-player.js +1 -1
  183. package/dist/cdn/virtual-scroller/snice-virtual-scroller.js +1 -1
  184. package/dist/cdn/waterfall/snice-waterfall.js +1 -1
  185. package/dist/cdn/weather/snice-weather.js +1 -1
  186. package/dist/cdn/work-order/snice-work-order.js +1 -1
  187. package/dist/components/calendar/snice-calendar.d.ts +187 -5
  188. package/dist/components/calendar/snice-calendar.js +537 -44
  189. package/dist/components/calendar/snice-calendar.js.map +1 -1
  190. package/dist/components/calendar/snice-calendar.types.d.ts +2 -1
  191. package/dist/components/code-block/formatter.d.ts +6 -0
  192. package/dist/components/code-block/formatter.js +174 -164
  193. package/dist/components/code-block/formatter.js.map +1 -1
  194. package/dist/components/code-block/grammars/snice.json +1 -1
  195. package/dist/components/code-block/grammars/typescript.json +1 -1
  196. package/dist/components/command-palette/snice-command-palette.js +1 -1
  197. package/dist/components/command-palette/snice-command-palette.js.map +1 -1
  198. package/dist/components/progress/snice-progress.js +1 -1
  199. package/dist/components/progress/snice-progress.js.map +1 -1
  200. package/dist/components/qr-code/qrcode.d.ts +1 -1
  201. package/dist/components/qr-code/qrcode.js +18 -2
  202. package/dist/components/qr-code/qrcode.js.map +1 -1
  203. package/dist/components/receipt/snice-receipt.js +4 -1
  204. package/dist/components/receipt/snice-receipt.js.map +1 -1
  205. package/dist/components/select/snice-select.d.ts +1 -1
  206. package/dist/components/select/snice-select.js +5 -8
  207. package/dist/components/select/snice-select.js.map +1 -1
  208. package/dist/components/table/snice-cell-actions.js +1 -1
  209. package/dist/components/table/snice-cell-actions.js.map +1 -1
  210. package/dist/components/table/snice-cell-color.js +1 -1
  211. package/dist/components/table/snice-cell-color.js.map +1 -1
  212. package/dist/components/table/snice-cell-date.js +20 -8
  213. package/dist/components/table/snice-cell-date.js.map +1 -1
  214. package/dist/components/table/snice-cell-email.js +1 -1
  215. package/dist/components/table/snice-cell-email.js.map +1 -1
  216. package/dist/components/table/snice-cell-image.js +1 -1
  217. package/dist/components/table/snice-cell-image.js.map +1 -1
  218. package/dist/components/table/snice-cell-json.js +1 -1
  219. package/dist/components/table/snice-cell-json.js.map +1 -1
  220. package/dist/components/table/snice-cell-link.js +1 -1
  221. package/dist/components/table/snice-cell-link.js.map +1 -1
  222. package/dist/components/table/snice-cell-location.js +1 -1
  223. package/dist/components/table/snice-cell-location.js.map +1 -1
  224. package/dist/components/table/snice-cell-phone.js +1 -1
  225. package/dist/components/table/snice-cell-phone.js.map +1 -1
  226. package/dist/components/table/snice-cell-status.js +1 -1
  227. package/dist/components/table/snice-cell-status.js.map +1 -1
  228. package/dist/components/table/snice-cell.d.ts +10 -0
  229. package/dist/components/table/snice-cell.js +59 -13
  230. package/dist/components/table/snice-cell.js.map +1 -1
  231. package/dist/components/table/snice-row.d.ts +0 -1
  232. package/dist/components/table/snice-row.js +4 -10
  233. package/dist/components/table/snice-row.js.map +1 -1
  234. package/dist/components/table/snice-table.d.ts +170 -2
  235. package/dist/components/table/snice-table.js +868 -189
  236. package/dist/components/table/snice-table.js.map +1 -1
  237. package/dist/components/table/snice-table.types.d.ts +17 -0
  238. package/dist/components/table/table-cell-presentation.d.ts +17 -4
  239. package/dist/components/table/table-cell-presentation.js +37 -11
  240. package/dist/components/table/table-cell-presentation.js.map +1 -1
  241. package/dist/components/table/table-column-manager.d.ts +153 -2
  242. package/dist/components/table/table-column-manager.js +364 -43
  243. package/dist/components/table/table-column-manager.js.map +1 -1
  244. package/dist/components/table/table-date.d.ts +29 -0
  245. package/dist/components/table/table-date.js +78 -0
  246. package/dist/components/table/table-date.js.map +1 -0
  247. package/dist/components/table/table-export.js +6 -2
  248. package/dist/components/table/table-export.js.map +1 -1
  249. package/dist/components/table/table-filter-engine.d.ts +9 -0
  250. package/dist/components/table/table-filter-engine.js +58 -14
  251. package/dist/components/table/table-filter-engine.js.map +1 -1
  252. package/dist/components/table/table-keyboard.d.ts +8 -0
  253. package/dist/components/table/table-keyboard.js +14 -3
  254. package/dist/components/table/table-keyboard.js.map +1 -1
  255. package/dist/components/table/table-toolbar.js +1 -0
  256. package/dist/components/table/table-toolbar.js.map +1 -1
  257. package/dist/components/table/table-tree-data.d.ts +2 -0
  258. package/dist/components/table/table-tree-data.js +35 -9
  259. package/dist/components/table/table-tree-data.js.map +1 -1
  260. package/dist/components/table/table-virtualizer.d.ts +44 -7
  261. package/dist/components/table/table-virtualizer.js +101 -54
  262. package/dist/components/table/table-virtualizer.js.map +1 -1
  263. package/dist/components/theme/theme.css +9 -0
  264. package/dist/index.cjs +1 -1
  265. package/dist/index.esm.js +1 -1
  266. package/dist/index.iife.js +1 -1
  267. package/dist/react/SniceProvider.js +1 -1
  268. package/dist/react/SniceRouter.js +1 -1
  269. package/dist/react/index.js +1 -1
  270. package/dist/react/matchRoute.js +1 -1
  271. package/dist/react/useRequestHandler.js +1 -1
  272. package/dist/symbols.cjs +1 -1
  273. package/dist/symbols.esm.js +1 -1
  274. package/dist/testing-dom.cjs +1 -1
  275. package/dist/testing-dom.esm.js +1 -1
  276. package/dist/transitions.cjs +1 -1
  277. package/dist/transitions.esm.js +1 -1
  278. package/docs/ai/DEVELOPMENT.md +93 -2
  279. package/docs/ai/components/calendar.md +113 -10
  280. package/docs/ai/components/code-block.md +4 -0
  281. package/docs/ai/components/doc.md +1 -1
  282. package/docs/ai/components/progress.md +1 -0
  283. package/docs/ai/components/receipt.md +1 -1
  284. package/docs/ai/components/table.md +29 -30
  285. package/docs/ai/components/theme.md +1 -0
  286. package/docs/ai/events.md +30 -0
  287. package/docs/ai/theme.md +1 -0
  288. package/docs/components/calendar.md +171 -11
  289. package/docs/components/code-block.md +2 -0
  290. package/docs/components/doc.md +1 -1
  291. package/docs/components/progress.md +13 -0
  292. package/docs/components/receipt.md +1 -0
  293. package/docs/components/table.md +274 -15
  294. package/docs/components/theme.md +5 -0
  295. package/docs/events.md +49 -0
  296. package/docs/plans/2026-03-06-date-range-picker-plan.md +4 -4
  297. package/docs/plans/2026-03-07-table-mui-parity-design.md +1 -1
  298. package/docs/plans/2026-03-09-action-bar-plan.md +11 -11
  299. package/docs/superpowers/specs/2026-07-09-table-incredible-design.md +1 -1
  300. package/docs/superpowers/specs/2026-07-09-table-phase0-implementation.md +2 -2
  301. package/package.json +3 -1
  302. package/vscode.html-custom-data.json +13 -1
@@ -1 +1 @@
1
- {"version":3,"file":"snice-table.js","sources":["../../../../components/table/snice-table.ts"],"sourcesContent":["import { element, property, query, request, dispatch, watch, render, styles, html, css, ready, dispose, on, observe } from 'snice';\nimport '../input/snice-input';\nimport '../select/snice-select';\nimport '../button/snice-button';\nimport '../checkbox/snice-checkbox';\nimport '../modal/snice-modal';\nimport '../empty-state/snice-empty-state';\nimport './snice-cell.ts';\nimport './snice-cell-text.ts';\nimport './snice-cell-number.ts';\nimport './snice-cell-date.ts';\nimport './snice-cell-boolean.ts';\nimport './snice-cell-rating.ts';\nimport './snice-cell-progress.ts';\nimport './snice-cell-duration.ts';\nimport './snice-cell-filesize.ts';\nimport './snice-cell-sparkline.ts';\nimport './snice-cell-percentage.ts';\nimport './snice-cell-tag.ts';\nimport './snice-cell-status.ts';\nimport './snice-cell-actions.ts';\nimport './snice-cell-link.ts';\nimport './snice-cell-email.ts';\nimport './snice-cell-phone.ts';\nimport './snice-cell-color.ts';\nimport './snice-cell-location.ts';\nimport './snice-cell-json.ts';\nimport './snice-cell-currency.ts';\nimport './snice-cell-image.ts';\nimport './snice-column.ts';\nimport './snice-row.ts';\nimport { TableVirtualizer } from './table-virtualizer';\nimport { TableColumnManager } from './table-column-manager';\nimport { TableFilterEngine } from './table-filter-engine';\nimport { TableEditor } from './table-editor';\nimport type { EditorType } from './table-editor';\nimport { TableKeyboard } from './table-keyboard';\nimport { TableExport } from './table-export';\nimport { TableMasterDetail } from './table-master-detail';\nimport { TableToolbar } from './table-toolbar';\nimport { TableTreeData } from './table-tree-data';\nimport { TableGrouping } from './table-grouping';\nimport type { DisplayItem, GroupRow, AggregateRow } from './table-grouping';\nimport { TableColumnMenu } from './table-column-menu';\nimport { TableRowDnD, TableColumnDnD } from './table-row-dnd';\nimport type { FilterModel } from './table-filter-engine';\nimport type { DetailPanelOptions } from './table-master-detail';\nimport type { ToolbarOptions } from './table-toolbar';\nimport type { TreeDataOptions, TreeRow } from './table-tree-data';\nimport type { ColumnGroup } from './table-column-manager';\nimport type { ColumnDefinition, SniceTableElement, SelectionMode, ListViewRenderer } from './snice-table.types';\n\n/**\n * A single desired body row for the render-path reconciler (Task B). `key`\n * identifies the row across renders (the row-object itself for data rows, a\n * synthetic string for pinned / detail rows). `sig` captures everything about\n * the row's DOM that a data-object move can't fix by re-stamping — when it is\n * unchanged the existing element is reused. `alwaysRebuild` forces a fresh\n * element (edit-state and detail rows). `restampIndex`, when present, updates\n * the reused row's index-derived attributes after a reorder.\n */\ninterface RowEntry {\n key: unknown;\n sig: string;\n create: () => HTMLElement;\n alwaysRebuild?: boolean;\n restampIndex?: number;\n}\n\n@element('snice-table')\nexport class SniceTable extends HTMLElement implements SniceTableElement {\n\n @property({ type: Boolean, attribute: 'striped' })\n striped = false;\n\n @property({ type: Boolean, attribute: 'searchable' })\n searchable = false;\n\n @property({ type: Boolean, attribute: 'filterable' })\n filterable = false;\n\n @property({ type: Boolean, attribute: 'sortable' })\n sortable = false;\n\n @property({ type: Boolean, attribute: 'selectable' })\n selectable = false;\n\n @property({ type: Boolean, attribute: 'hoverable' })\n hoverable = true;\n\n @property({ type: Boolean, attribute: 'clickable' })\n clickable = false;\n\n @property({ type: Boolean, attribute: 'list' })\n list = false;\n\n @property({ type: Boolean, attribute: 'pagination' })\n pagination = false;\n\n @property({ attribute: 'pagination-mode' })\n paginationMode: 'client' | 'server' = 'client';\n\n @property({ type: Number, attribute: 'page-size' })\n pageSize = 10;\n\n @property({ type: Number, attribute: 'current-page' })\n currentPage = 1;\n\n @property({ type: Number, attribute: 'total-items' })\n totalItems = 0;\n\n @property({ type: Array, attribute: false })\n pageSizes: number[] = [10, 25, 50, 100];\n\n @property({ type: Number, attribute: 'search-debounce' })\n searchDebounce = 500;\n\n // C1: reactive, no attribute reflection. A post-mount assignment (or the\n // setData/setColumns aliases) re-renders through the microtask-coalesced\n // queue — see handleColumnsAssignment / handleDataAssignment.\n @property({ attribute: false })\n columns: any[] = [];\n\n @property({ attribute: false })\n data: any[] = [];\n\n /**\n * Data mode: 'local' = client-side, table owns the dataset (set via setData\n * or the `data` property; filter/sort run locally);\n * 'remote' = server-side, every filter/sort/search/page change\n * fires @request('table/data'); a @respond handler in\n * the parent controller returns the new page.\n *\n * Default is 'local'. Set `mode=\"remote\"` on the element OR assign the\n * property to opt into remote mode.\n */\n @property() mode: 'local' | 'remote' = 'local';\n\n // C1: setColumns is a thin alias over the reactive assignment — its @watch\n // resyncs the column model and coalesces the header+body render.\n setColumns(columns: any[]) {\n this.columns = columns;\n }\n\n // C1: setData is the IMPERATIVE bulk-load path. It resyncs the data model\n // (snapshot + row-index map) exactly like the reactive `table.data =` setter,\n // but does NOT eagerly re-render — the established API fills the body via an\n // explicit render (or the coalesced render from a paired setColumns). Keeping\n // the eager render off this path avoids re-warming the filtered snapshot the\n // caller may want left cold. The reactive PROPERTY (`table.data = rows`) is\n // the auto-rendering entry point.\n setData(data: any[]) {\n this.settingDataImperative = true;\n this.data = data;\n this.settingDataImperative = false;\n }\n\n @property({ type: Array, attribute: false })\n currentSort: Array<{ column: string, direction: 'asc' | 'desc' }> = [];\n\n // Don't use @property decorator to avoid auto-rendering on searchText change\n // This would cause the input to lose focus while typing\n searchText: string = '';\n\n @property({ type: String, attribute: 'selector' })\n selector: string = '';\n\n @property({ type: Array, attribute: false })\n selectorOptions: Array<{value: string, label: string}> = [];\n\n @property({ type: Boolean, attribute: 'loading' })\n loading: boolean = false;\n\n // Set when a remote-mode load fails; cleared on the next successful load.\n // Not a @property — renderBody() reads it directly, no attribute needed.\n private loadError: string | null = null;\n\n @property({ type: Boolean, attribute: 'virtualize' })\n virtualize = false;\n\n @property({ type: Number, attribute: 'row-height' })\n rowHeight = 48;\n\n @property({ type: Number, attribute: 'virtual-buffer' })\n virtualBuffer = 200;\n\n @property({ type: Boolean, attribute: 'column-resize' })\n columnResize = false;\n\n @property({ type: Boolean, attribute: 'editable' })\n editable = false;\n\n @property({ attribute: 'edit-mode' })\n editMode: 'cell' | 'row' = 'cell';\n\n @property({ attribute: 'density' })\n density: 'compact' | 'standard' | 'comfortable' = 'standard';\n\n @property({ type: Boolean, attribute: 'header-filters' })\n headerFilters = false;\n\n @property({ type: Boolean, attribute: 'quick-filter' })\n quickFilter = false;\n\n @property({ type: Boolean, attribute: 'row-reorder' })\n rowReorder = false;\n\n @property({ type: Boolean, attribute: 'column-reorder' })\n columnReorder = false;\n\n @property({ type: Boolean, attribute: 'column-menu' })\n columnMenu = false;\n\n @property({ type: Boolean, attribute: 'lazy-load' })\n lazyLoad = false;\n\n @property({ type: Number, attribute: 'lazy-load-threshold' })\n lazyLoadThreshold = 200; // px from bottom to trigger\n\n @property({ type: Array, attribute: false })\n selectedRows: number[] = [];\n\n // E1: selection behavior. 'multiple' (default) preserves the historical\n // additive-toggle path; 'single' collapses to one row; 'none' disables it.\n @property({ attribute: 'selection-mode' })\n selectionMode: SelectionMode = 'multiple';\n\n // E1: shift-range anchor. Holds the row OBJECT (not an index) so it tracks the\n // row across a sort that moves it — the range is computed against the current\n // filtered snapshot / rowIndexMap at click time.\n private selectionAnchor: any = null;\n\n // F: row grouping. `groupBy` is column key(s) to group by; assigning it\n // post-mount re-renders through the coalescing queue (handleGroupByChange).\n // Aggregation is per-column (ColumnDefinition.aggregate) and needs no flag —\n // the grouping model reports isEnabled() when either grouping or aggregation\n // is active, and the body routes through the flattened display list in both\n // cases. attribute:false — a string[] can't reflect to an attribute, and the\n // reactive contract is property assignment (mirrors columns/data).\n @property({ attribute: false })\n groupBy: string | string[] = '';\n\n @property({ attribute: false })\n groupDefaults: { expanded?: boolean } = {};\n\n // F: flattened group+row+aggregate display list cache. Rebuilt lazily from the\n // filtered snapshot; invalidated on the same model mutations as filteredCache\n // PLUS group expand/collapse and groupBy/column changes (invalidateGroupingCache).\n private groupingCache: DisplayItem[] | null = null;\n\n // Module instances\n private virtualizer = new TableVirtualizer();\n private columnManager = new TableColumnManager();\n private filterEngine = new TableFilterEngine();\n private editor = new TableEditor();\n private keyboard = new TableKeyboard();\n private exporter = new TableExport();\n private masterDetail = new TableMasterDetail();\n private toolbar = new TableToolbar();\n private treeData = new TableTreeData();\n private grouping = new TableGrouping();\n private columnMenuManager = new TableColumnMenu();\n private rowDnD = new TableRowDnD();\n private columnDnD = new TableColumnDnD();\n private pinnedTopRows: any[] = [];\n private pinnedBottomRows: any[] = [];\n private toolbarOptions: ToolbarOptions | null = null;\n private lazyLoadHandler: (() => void) | null = null;\n private lazyLoadContainer: HTMLElement | null = null;\n private rowHeightCallback: ((row: any, index: number) => number) | null = null;\n private virtualRowsSnapshot: Array<{ data: any; index: number; treeRow?: TreeRow; groupItem?: DisplayItem }> = [];\n\n @query('table')\n table!: HTMLTableElement;\n\n @query('thead')\n thead!: HTMLTableSectionElement;\n\n @query('tbody')\n tbody!: HTMLTableSectionElement;\n\n\n @request('table/config')\n async *getTableConfig(): any {\n const config = await (yield {});\n this.columns = config.columns || [];\n this.selectorOptions = config.selectorOptions || [];\n // Wait for next frame to ensure DOM is updated\n await new Promise(resolve => requestAnimationFrame(resolve));\n this.renderHeader();\n this.renderControls();\n return config;\n }\n\n @request('table/data')\n async *getTableData(): any {\n // A5: capture this request's sequence number. A later request bumps the\n // counter, so a slow earlier response finds seq !== this.dataRequestSeq and\n // bails without touching the model — no out-of-order clobber.\n const seq = ++this.dataRequestSeq;\n this.loading = true;\n this.selectedRows = []; // Clear selections when loading new data\n\n try {\n const params: any = {\n search: this.searchText,\n sort: this.currentSort,\n filter: this.filterEngine.getFilterModel(),\n selector: this.selector\n };\n\n if (this.pagination) {\n params.page = this.currentPage;\n params.pageSize = this.pageSize;\n }\n const response = await (yield params);\n if (seq !== this.dataRequestSeq) return; // superseded by a newer request\n this.data = response.data || [];\n this.rebuildRowIndex();\n if (response.totalItems !== undefined) {\n this.totalItems = response.totalItems;\n }\n this.loadError = null;\n this.classList.remove('table--error');\n this.loading = false;\n // Wait for next frame to ensure DOM is updated\n await new Promise(resolve => requestAnimationFrame(resolve));\n if (seq !== this.dataRequestSeq) return; // superseded while awaiting frame\n this.renderBody();\n return response;\n } catch (error) {\n if (seq !== this.dataRequestSeq) return; // stale failure — ignore silently\n console.error('Error loading table data:', error);\n this.loadError = error instanceof Error ? error.message : String(error);\n this.classList.add('table--error');\n this.dispatchLoadError(error);\n this.loading = false;\n // Wait for next frame to ensure DOM is updated\n await new Promise(resolve => requestAnimationFrame(resolve));\n this.renderBody();\n }\n }\n\n private unsortedData: any[] = [];\n private dataRequestTimeout: any = null;\n\n // A1: row-object → its index in `this.data`. Replaces the O(n) `data.indexOf`\n // that ran per row on every selection toggle (was O(n²) for select-all).\n // `rowIndexDataRef` is the array the map was built from — a plain\n // `table.data = [...]` assignment swaps the array without going through\n // setData/rebuildRowIndex, so `ensureRowIndex()` lazily rebuilds when it\n // detects the reference changed.\n private rowIndexMap = new Map<any, number>();\n private rowIndexDataRef: any[] | null = null;\n\n // A4: the filtered snapshot getFilteredData() hands out. Recomputing it per\n // rAF scroll frame re-ran the whole filter engine every frame. Invalidated on\n // every mutation of data / filters / sort (see invalidateFilteredCache).\n private filteredCache: any[] | null = null;\n\n // A5: monotonic request id. Captured at request start; a response only\n // applies if it is still the latest, so a slow earlier response can't clobber\n // a fast later one.\n private dataRequestSeq = 0;\n\n // Task B: render-path recycling. Keyed by row-object identity (data rows) or a\n // synthetic string key (pinned / detail rows). Maps a key to the <tr> element\n // currently rendered for it plus the signature it was rendered with. On the\n // next render, a key whose object and signature are unchanged reuses its <tr>\n // (moved when order changes) instead of reconstructing it and every cell.\n // Rebuilt fresh on every render pass, so switching render modes is safe.\n private renderedRows = new Map<unknown, { el: HTMLElement; sig: string }>();\n\n // C1: brackets the internal `this.data` reassignment inside sortLocalData so\n // the data @watch treats a re-sorted view of the same rows as NOT a new\n // dataset — it must not refresh the unsortedData snapshot or double-render.\n private settingSortedData = false;\n\n // C1: set while the imperative setData() runs so the data @watch resyncs the\n // model but skips the auto-render (the caller drives the body fill).\n private settingDataImperative = false;\n\n // C1/C2: microtask-coalesced render queue. Reactive assignments schedule a\n // render here instead of calling renderHeader/renderBody synchronously —\n // MANDATORY, because happy-dom crashes constructing cell elements inside a\n // property-setter stack. A burst of assignments in one tick flushes once.\n private renderQueued = false;\n private pendingHeaderRender = false;\n private pendingBodyRender = false;\n\n private scheduleRender(what: 'header' | 'body' | 'both') {\n if (what === 'header' || what === 'both') this.pendingHeaderRender = true;\n if (what === 'body' || what === 'both') this.pendingBodyRender = true;\n if (this.renderQueued) return;\n\n this.renderQueued = true;\n queueMicrotask(() => {\n // @property invokes watchers before it asks Snice to update the template.\n // A second microtask lets that differential render commit first when a\n // property changes the table's structural mode (notably slotted rows →\n // grouped native table), while still coalescing a burst into one flush.\n queueMicrotask(() => {\n this.renderQueued = false;\n const doHeader = this.pendingHeaderRender;\n const doBody = this.pendingBodyRender;\n this.pendingHeaderRender = false;\n this.pendingBodyRender = false;\n if (doHeader) this.renderHeader();\n if (doBody) this.renderBody();\n });\n });\n }\n\n\n private debouncedDataRequest() {\n // Set loading immediately for instant feedback\n if (!this.loading) {\n this.loading = true;\n }\n \n if (this.dataRequestTimeout) {\n clearTimeout(this.dataRequestTimeout);\n }\n \n this.dataRequestTimeout = setTimeout(() => {\n this.getTableData();\n this.dataRequestTimeout = null;\n }, 150);\n }\n\n @styles()\n styles() {\n return css/*css*/`\n :host([hidden]) {\n display: none;\n}\n\n:host {\n display: block;\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 200px;\n }\n\n /* Native Fullscreen API: paint the host's background as the backdrop\n so the area outside our box (during transition) matches dark/light. */\n :host(:fullscreen) {\n background: var(--snice-color-surface, rgb(255 255 255));\n }\n :host(:fullscreen)::backdrop {\n background: var(--snice-color-surface, rgb(255 255 255));\n }\n\n /* CSS fallback fullscreen — used when requestFullscreen is blocked. */\n :host(.table-fullscreen) {\n position: fixed;\n inset: 0;\n z-index: 10000;\n background: var(--snice-color-surface, rgb(255 255 255));\n padding: var(--snice-spacing-md, 1rem);\n overflow: auto;\n display: flex;\n flex-direction: column;\n }\n\n :host(.table-fullscreen) .snice-table {\n flex: 1;\n height: auto;\n }\n\n :host(.table-fullscreen) .table-frame {\n flex: 1;\n max-height: none;\n }\n\n\n\n .snice-table {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n }\n\n /* Frame wraps super-header + table; provides the rounded border.\n flex:1 + min-height:0 lets it absorb the remaining host height\n instead of letting content size dictate height. */\n .table-frame {\n position: relative;\n flex: 1;\n min-height: 0;\n border: 1px solid var(--snice-color-border, rgb(226 226 226));\n border-radius: var(--snice-border-radius-lg, 0.5rem);\n overflow: auto;\n }\n\n table {\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n border-spacing: 0;\n /* no border or radius — handled by .table-frame */\n }\n\n /* Super-header (slotted area above column headers) */\n .table-superheader {\n background: var(--snice-color-surface, rgb(255 255 255));\n }\n\n .table-superheader:empty {\n display: none;\n }\n\n .table-superheader ::slotted(*) {\n display: block;\n padding: var(--snice-spacing-sm, 0.75rem) var(--snice-spacing-md, 1rem);\n border-bottom: 1px solid var(--snice-color-border, rgb(226 226 226));\n }\n\n th, td {\n padding: var(--snice-table-cell-padding, var(--snice-spacing-xs, 0.5rem) var(--snice-spacing-sm, 0.75rem));\n border-bottom: var(--snice-table-row-border, 1px solid var(--snice-color-border, rgb(226 226 226)));\n border-right: var(--snice-table-cell-border, 1px solid var(--snice-color-border, rgb(226 226 226)));\n text-align: left;\n vertical-align: middle;\n color: var(--snice-color-text, rgb(23 23 23));\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n /* Remove right border on last cell in row */\n th:last-child,\n td:last-child {\n border-right: none;\n }\n\n /* Remove bottom border on last body row */\n tbody tr:last-child td {\n border-bottom: none;\n }\n\n /* Height fill: when the host is taller than its rows, an inert filler\n row (cloned from the last data row, so column widths and pinning\n track the table engine) keeps the column grid running to the bottom\n edge instead of the borders cutting off where the rows end. */\n tbody tr.table-fill-row {\n pointer-events: none;\n }\n\n tbody tr.table-fill-row td {\n border-bottom: none;\n padding: 0;\n }\n\n :host([striped]) tbody tr.table-fill-row {\n background: transparent;\n }\n\n :host([hoverable]) tbody tr.table-fill-row:hover {\n background: transparent;\n }\n\n th {\n padding: var(--snice-spacing-sm, 0.75rem) var(--snice-spacing-sm, 0.75rem);\n }\n\n /* Narrow utility columns: checkbox, expand toggle, drag handle.\n * vertical-align: middle is REQUIRED — td defaults to baseline and the\n * checkbox sits at the bottom when any other cell is taller (fat rows). */\n th.select-column,\n td.select-column,\n th.detail-toggle-cell,\n td.detail-toggle-cell,\n th.drag-handle-cell,\n td.drag-handle-cell {\n width: 1.75rem;\n max-width: 1.75rem;\n min-width: 1.75rem;\n text-align: center;\n vertical-align: middle;\n padding: 0 0.125rem;\n overflow: visible;\n box-sizing: content-box;\n }\n\n /* Force snice-checkbox compact + centered inside table */\n .select-column snice-checkbox {\n min-height: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n vertical-align: middle;\n }\n\n th {\n background-color: var(--snice-color-surface-container-low, rgb(245 245 245));\n color: var(--snice-color-text, rgb(23 23 23));\n font-weight: var(--snice-font-weight-semibold, 600);\n border-bottom: 1px solid var(--snice-color-border-subtle, var(--snice-color-border, rgb(226 226 226)));\n }\n\n th.sortable {\n cursor: pointer;\n user-select: none;\n }\n\n /* Hover and selected states share the same tokens as menu/list/command-palette\n * for cross-component visual consistency. */\n th.sortable:hover {\n background-color: var(--snice-color-surface-hover, rgb(243 244 246));\n }\n\n /* Sticky header (Task 4d) — thead cells stick to .table-frame's\n scroll-top edge. z-index sits above tbody cells (plain cells are\n unpositioned; pinned body td gets inline zIndex '1' in createRow) and\n at the pinned-header corner's own inline zIndex '2' (renderHeader),\n so a cell that is both pinned AND in the header still wins on\n horizontal scroll. Background matches the existing th background so\n rows never bleed through while scrolling underneath. */\n thead th {\n position: sticky;\n top: 0;\n z-index: 2;\n background-color: var(--snice-color-surface-container-low, rgb(245 245 245));\n }\n\n /* Row styling */\n :host([striped]) tbody tr:nth-child(even) {\n background-color: var(--snice-color-surface-container-low, rgb(245 245 245));\n }\n\n :host([hoverable]) tbody tr:hover {\n background-color: var(--snice-color-surface-hover, rgb(243 244 246));\n }\n\n :host([clickable]) tbody tr {\n cursor: pointer;\n }\n\n :host([selectable]:not([selection-mode=\"none\"])) tbody tr {\n cursor: pointer;\n }\n\n tbody tr[data-selected=\"true\"] {\n background-color: var(--snice-color-primary-subtle, rgb(239 246 255));\n box-shadow: inset 2px 0 0 0 var(--snice-color-primary, rgb(37 99 235));\n }\n\n tbody tr[data-selected=\"true\"]:hover {\n background-color: var(--snice-color-primary-subtle-hover, var(--snice-color-primary-subtle, rgb(219 234 254)));\n }\n\n /* List mode - hide vertical borders */\n :host([list]) th,\n :host([list]) td {\n border-right: none;\n }\n\n :host([list]) .table-frame {\n border-left: none;\n border-right: none;\n border-radius: 0;\n }\n\n [part=\"header\"] {\n background-color: var(--snice-color-surface, rgb(255 255 255));\n }\n\n [part=\"body\"] {\n background-color: var(--snice-table-body-bg, var(--snice-color-surface, rgb(255 255 255)));\n display: block;\n }\n\n /* Toolbar */\n .table-toolbar {\n display: flex;\n align-items: center;\n gap: var(--snice-spacing-xs, 0.5rem);\n padding: var(--snice-spacing-xs, 0.5rem) var(--snice-spacing-sm, 0.75rem);\n padding-left: 0;\n background: var(--snice-color-surface, rgb(255 255 255));\n }\n\n .toolbar-search {\n width: 16rem;\n max-width: 16rem;\n flex: 0 0 auto;\n }\n\n .toolbar-actions {\n display: flex;\n align-items: center;\n gap: 2px;\n margin-left: auto;\n }\n\n .toolbar-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n border: 1px solid var(--snice-color-border, rgb(226 226 226));\n border-radius: var(--snice-border-radius-md, 0.25rem);\n background: var(--snice-color-surface, rgb(255 255 255));\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n cursor: pointer;\n transition: all var(--snice-transition-fast, 150ms) ease;\n padding: 0;\n line-height: 1;\n font-family: inherit;\n }\n\n .toolbar-btn:hover {\n background: var(--snice-color-surface-container-low, rgb(245 245 245));\n color: var(--snice-color-text, rgb(23 23 23));\n }\n\n .toolbar-btn svg {\n width: 16px;\n height: 16px;\n }\n\n /* Toolbar dropdown menus */\n .toolbar-menu {\n position: absolute;\n z-index: 10001;\n min-width: 12rem;\n background: var(--snice-color-surface, rgb(255 255 255));\n border: 1px solid var(--snice-color-border, rgb(226 226 226));\n border-radius: var(--snice-border-radius-md, 0.25rem);\n box-shadow: var(--snice-shadow-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1));\n padding: var(--snice-spacing-2xs, 0.25rem);\n }\n\n .toolbar-menu-title {\n padding: var(--snice-spacing-2xs, 0.25rem) var(--snice-spacing-xs, 0.5rem);\n font-size: var(--snice-font-size-xs, 0.75rem);\n font-weight: var(--snice-font-weight-semibold, 600);\n color: var(--snice-color-text-tertiary, rgb(115 115 115));\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .toolbar-menu-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: var(--snice-spacing-2xs, 0.25rem) var(--snice-spacing-xs, 0.5rem);\n border: none;\n border-radius: 3px;\n background: transparent;\n color: var(--snice-color-text, rgb(23 23 23));\n font-size: var(--snice-font-size-sm, 0.875rem);\n font-family: inherit;\n cursor: pointer;\n text-align: left;\n }\n\n .toolbar-menu-item:hover {\n background: var(--snice-color-surface-container-low, rgb(245 245 245));\n }\n\n .toolbar-menu-item--active {\n color: var(--snice-color-primary, rgb(37 99 235));\n font-weight: var(--snice-font-weight-medium, 500);\n }\n\n .toolbar-menu-item-indicator {\n font-size: 0.75rem;\n opacity: 0.7;\n }\n\n .toolbar-clear-btn {\n margin-top: var(--snice-spacing-2xs, 0.25rem);\n border-top: 1px solid var(--snice-color-border, rgb(226 226 226));\n border-radius: 0;\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n font-size: var(--snice-font-size-xs, 0.75rem);\n }\n\n /* Filter menu */\n .toolbar-filter-menu {\n min-width: 16rem;\n padding: var(--snice-spacing-xs, 0.5rem);\n }\n\n .toolbar-filter-row {\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-bottom: var(--snice-spacing-2xs, 0.25rem);\n }\n\n .toolbar-filter-label {\n font-size: var(--snice-font-size-xs, 0.75rem);\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n font-weight: var(--snice-font-weight-medium, 500);\n }\n\n .toolbar-filter-input {\n width: 100%;\n box-sizing: border-box;\n padding: var(--snice-spacing-2xs, 0.25rem) var(--snice-spacing-xs, 0.5rem);\n border: 1px solid var(--snice-color-border, rgb(226 226 226));\n border-radius: var(--snice-border-radius-md, 0.25rem);\n font-size: var(--snice-font-size-sm, 0.875rem);\n font-family: inherit;\n color: var(--snice-color-text, rgb(23 23 23));\n background: var(--snice-color-surface, rgb(255 255 255));\n outline: none;\n }\n\n .toolbar-filter-input:focus {\n border-color: var(--snice-color-primary, rgb(37 99 235));\n }\n\n .toolbar-filter-input::placeholder {\n color: var(--snice-color-text-tertiary, rgb(115 115 115));\n }\n\n .table-controls {\n display: flex;\n gap: var(--snice-spacing-xs, 0.5rem);\n align-items: center;\n flex-wrap: wrap;\n padding: var(--snice-spacing-xs, 0.5rem) var(--snice-spacing-sm, 0.75rem);\n padding-left: 0;\n justify-content: flex-start;\n }\n\n :host(:not([searchable])) .search-input {\n display: none;\n }\n\n :host(.selector-options-empty) .selector-input {\n display: none;\n }\n\n /* snice-input/snice-select handle own styling — layout only */\n .search-input {\n width: 16rem;\n max-width: 16rem;\n flex: 0 0 auto;\n }\n\n .selector-input {\n min-width: 9.375rem;\n --snice-select-min-height: 2rem;\n }\n\n /* Sort indicators */\n .sort-header {\n display: flex;\n align-items: center;\n gap: var(--snice-spacing-xs, 0.5rem);\n justify-content: space-between;\n }\n\n\n .sort-indicator {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n line-height: 1;\n opacity: 0.3;\n transition: opacity var(--snice-transition-fast, 150ms);\n }\n\n .sort-indicator.active {\n opacity: 1;\n color: var(--snice-color-primary, rgb(37 99 235));\n }\n\n .sort-order {\n font-size: 0.625rem;\n font-weight: 700;\n background: var(--snice-color-primary, rgb(37 99 235));\n color: rgb(255 255 255);\n border-radius: 999px;\n padding: 0.0625rem 0.3125rem;\n min-width: 1rem;\n height: 1rem;\n line-height: 1rem;\n text-align: center;\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n /* Loading fade */\n tbody {\n transition: opacity var(--snice-transition-normal, 250ms);\n }\n\n :host([loading]) tbody {\n opacity: 0.5;\n }\n\n /* Refetch spinner while rows stay on screen (SNICE-142) */\n .table-loading-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n z-index: 2;\n }\n\n .no-data {\n text-align: center;\n padding: var(--snice-spacing-lg, 1.5rem);\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n }\n\n /* Remote-mode load error (Task 4c) — informed by the dead\n components/table/snice-table.css .table--error design. */\n :host(.table--error) .table-frame {\n border-color: var(--snice-color-danger, rgb(220 38 38));\n }\n\n .table-error-message {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--snice-spacing-2xs, 0.25rem);\n color: var(--snice-color-danger, rgb(220 38 38));\n }\n\n /* Pagination */\n .pagination {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--snice-spacing-md, 1rem);\n padding: var(--snice-spacing-sm, 0.75rem) var(--snice-spacing-md, 1rem);\n border-top: 1px solid var(--snice-color-border, rgb(226 226 226));\n background: var(--snice-color-surface, rgb(255 255 255));\n font-size: var(--snice-font-size-sm, 0.875rem);\n flex-wrap: wrap;\n }\n\n .pagination__info {\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n white-space: nowrap;\n }\n\n .pagination__controls {\n display: flex;\n align-items: center;\n gap: 2px;\n }\n\n .pagination__btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 2rem;\n height: 2rem;\n padding: 0 var(--snice-spacing-2xs, 0.25rem);\n border: 1px solid var(--snice-color-border, rgb(226 226 226));\n border-radius: var(--snice-border-radius-md, 0.25rem);\n background: var(--snice-color-surface, rgb(255 255 255));\n color: var(--snice-color-text, rgb(23 23 23));\n font-size: var(--snice-font-size-sm, 0.875rem);\n cursor: pointer;\n transition: all var(--snice-transition-fast, 150ms) ease;\n font-family: inherit;\n line-height: 1;\n }\n\n .pagination__btn:hover:not(:disabled) {\n background: var(--snice-color-surface-container-low, rgb(245 245 245));\n }\n\n .pagination__btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n .pagination__btn--active {\n background: var(--snice-color-primary, rgb(37 99 235));\n color: var(--snice-color-text-inverse, rgb(250 250 250));\n border-color: var(--snice-color-primary, rgb(37 99 235));\n }\n\n .pagination__btn--active:hover:not(:disabled) {\n background: var(--snice-color-primary-hover, rgb(29 78 216));\n }\n\n .pagination__btn:focus-visible {\n outline: 2px solid var(--snice-color-primary, rgb(37 99 235));\n outline-offset: 2px;\n z-index: 1;\n }\n\n .pagination__ellipsis {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 2rem;\n height: 2rem;\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n }\n\n .pagination__size {\n display: flex;\n align-items: center;\n gap: var(--snice-spacing-xs, 0.5rem);\n white-space: nowrap;\n }\n\n .pagination__size label {\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n }\n\n .pagination__size-select {\n min-width: 4.5rem;\n --snice-select-min-height: 1.75rem;\n }\n\n /* Column resize handle */\n .resize-handle {\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n cursor: col-resize;\n background: transparent;\n z-index: 1;\n }\n\n .resize-handle:hover,\n .resize-handle:active {\n background: var(--snice-color-primary, rgb(37 99 235));\n }\n\n /* Filter indicator */\n th.filtered::after {\n content: '';\n position: absolute;\n top: 4px;\n right: 8px;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--snice-color-primary, rgb(37 99 235));\n }\n\n /* Pinned column separator */\n .pinned-cell {\n background: var(--snice-color-surface, rgb(255 255 255));\n box-shadow: 2px 0 4px -1px rgb(0 0 0 / 0.1);\n }\n\n /* Density: compact */\n :host([density=\"compact\"]) th {\n padding: var(--snice-spacing-2xs, 0.25rem) var(--snice-spacing-xs, 0.5rem);\n font-size: var(--snice-font-size-xs, 0.75rem);\n }\n\n :host([density=\"compact\"]) td {\n padding: var(--snice-spacing-3xs, 0.125rem) var(--snice-spacing-xs, 0.5rem);\n font-size: var(--snice-font-size-xs, 0.75rem);\n }\n\n /* Density: comfortable */\n :host([density=\"comfortable\"]) th {\n padding: var(--snice-spacing-md, 1rem);\n }\n\n :host([density=\"comfortable\"]) td {\n padding: var(--snice-spacing-sm, 0.75rem) var(--snice-spacing-md, 1rem);\n }\n\n /* Editing */\n .table-editor-input {\n width: 100%;\n box-sizing: border-box;\n padding: var(--snice-spacing-2xs, 0.25rem);\n border: 2px solid var(--snice-color-primary, rgb(37 99 235));\n border-radius: var(--snice-border-radius-sm, 0.125rem);\n font-family: inherit;\n font-size: inherit;\n color: var(--snice-color-text, rgb(23 23 23));\n background: var(--snice-color-surface, rgb(255 255 255));\n outline: none;\n }\n\n .table-editor-select {\n width: 100%;\n padding: var(--snice-spacing-2xs, 0.25rem);\n border: 2px solid var(--snice-color-primary, rgb(37 99 235));\n border-radius: var(--snice-border-radius-sm, 0.125rem);\n font-family: inherit;\n font-size: inherit;\n }\n\n .table-editor-checkbox {\n width: 1rem;\n height: 1rem;\n }\n\n td.editing {\n padding: 2px !important;\n }\n\n .cell-error {\n color: var(--snice-color-danger, rgb(220 38 38));\n font-size: var(--snice-font-size-xs, 0.75rem);\n margin-top: 2px;\n }\n\n /* Header filter row */\n .header-filter-row td {\n padding: 0;\n background: var(--snice-color-surface-container-low, rgb(245 245 245));\n border-bottom: 1px solid var(--snice-color-border, rgb(226 226 226));\n }\n\n .header-filter-input {\n width: 100%;\n box-sizing: border-box;\n padding: var(--snice-spacing-2xs, 0.25rem) var(--snice-spacing-xs, 0.5rem);\n border: none;\n font-size: var(--snice-font-size-xs, 0.75rem);\n font-family: inherit;\n color: var(--snice-color-text, rgb(23 23 23));\n background: transparent;\n outline: none;\n }\n\n .header-filter-input::placeholder {\n color: var(--snice-color-text-tertiary, rgb(115 115 115));\n }\n\n .header-filter-input:focus {\n background: var(--snice-color-surface-container-lowest, rgb(248 247 245));\n }\n\n /* Tree data indentation */\n .tree-indent {\n display: inline-flex;\n align-items: center;\n vertical-align: middle;\n }\n\n .tree-toggle {\n background: none;\n border: none;\n cursor: pointer;\n padding: 0;\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 0.7rem;\n line-height: 1;\n width: 1.25rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: transform var(--snice-transition-fast, 150ms) ease;\n }\n\n .tree-toggle:hover {\n color: var(--snice-color-text, rgb(23 23 23));\n }\n\n .tree-toggle:focus-visible {\n outline: var(--snice-focus-ring-width, 2px) solid var(--snice-focus-ring-color, hsl(217 91% 60% / 0.5));\n outline-offset: var(--snice-focus-ring-offset, 2px);\n }\n\n .tree-toggle-icon {\n width: 1rem;\n height: 1rem;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: rotate(-90deg);\n }\n\n .tree-toggle--expanded .tree-toggle-icon {\n transform: rotate(0deg);\n }\n\n .tree-spacer {\n display: inline-block;\n width: 1.25rem;\n }\n\n /* Row grouping — group header row */\n .group-header-row {\n background: var(--snice-table-group-header-bg, var(--snice-color-surface-container-low, hsl(0 0% 98%)));\n }\n\n .group-header-cell {\n cursor: pointer;\n font-weight: var(--snice-font-weight-semibold, 600);\n color: var(--snice-table-group-header-color, var(--snice-color-text, hsl(0 0% 9%)));\n user-select: none;\n padding: var(--snice-spacing-xs, 0.5rem) var(--snice-spacing-sm, 0.75rem);\n }\n\n .group-header-cell .tree-indent {\n vertical-align: middle;\n }\n\n .group-select-wrap {\n display: inline-flex;\n align-items: center;\n vertical-align: middle;\n margin-right: var(--snice-spacing-2xs, 0.25rem);\n }\n\n .group-header-label {\n vertical-align: middle;\n }\n\n .group-header-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 1.25rem;\n height: 1.25rem;\n margin-left: var(--snice-spacing-xs, 0.5rem);\n padding: 0 var(--snice-spacing-2xs, 0.25rem);\n border-radius: 999px;\n background: var(--snice-table-group-count-bg, var(--snice-color-surface-container-high, hsl(40 9% 97%)));\n color: var(--snice-table-group-count-color, var(--snice-color-text-secondary, hsl(0 0% 32%)));\n font-size: var(--snice-font-size-xs, 0.75rem);\n font-weight: var(--snice-font-weight-medium, 500);\n vertical-align: middle;\n }\n\n /* Row grouping — aggregate footer row */\n .group-aggregate-row {\n background: var(--snice-table-aggregate-bg, var(--snice-color-surface-container, hsl(0 0% 95%)));\n font-weight: var(--snice-font-weight-medium, 500);\n }\n\n .group-aggregate-row[data-agg-scope=\"table\"] {\n border-top: 2px solid var(--snice-table-aggregate-border-color, var(--snice-color-border, hsl(0 0% 82%)));\n font-weight: var(--snice-font-weight-semibold, 600);\n }\n\n .group-aggregate-row .aggregate-cell {\n color: var(--snice-table-aggregate-color, var(--snice-color-text, hsl(0 0% 9%)));\n }\n\n .aggregate-label {\n color: var(--snice-table-aggregate-label-color, var(--snice-color-text-secondary, hsl(0 0% 32%)));\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-size: var(--snice-font-size-xs, 0.75rem);\n }\n\n .aggregate-label--inline {\n display: block;\n margin-bottom: var(--snice-spacing-2xs, 0.25rem);\n }\n\n /* Row pinning */\n .pinned-row {\n font-weight: var(--snice-font-weight-medium, 500);\n border-bottom: 2px solid var(--snice-color-border, rgb(226 226 226));\n background: var(--snice-color-surface-container-low, rgb(245 245 245));\n }\n\n .pinned-row--top {\n border-bottom: 2px solid var(--snice-color-primary, rgb(37 99 235));\n }\n\n .pinned-row--bottom {\n border-top: 2px solid var(--snice-color-primary, rgb(37 99 235));\n }\n\n /* Column group headers */\n .column-group-row th {\n text-align: center;\n font-size: var(--snice-font-size-xs, 0.75rem);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n background: var(--snice-color-surface-container, rgb(235 235 235));\n border-bottom: 1px solid var(--snice-color-border, rgb(226 226 226));\n }\n\n /* DnD */\n .drag-handle-cell {\n font-size: 0.875rem;\n }\n\n .drop-indicator {\n position: absolute;\n left: 0;\n right: 0;\n height: 2px;\n background: var(--snice-color-primary, rgb(37 99 235));\n z-index: 10;\n pointer-events: none;\n }\n\n tr[draggable=\"true\"]:active {\n cursor: grabbing;\n }\n\n /* Master-detail — animated like accordion */\n .detail-row {\n background: var(--snice-color-surface-container-high, rgb(252 251 249));\n }\n\n .detail-cell {\n max-width: none;\n }\n\n .detail-content {\n overflow: hidden;\n max-height: 0;\n transition: max-height 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n will-change: max-height;\n }\n\n .detail-content--open {\n max-height: var(--detail-max-height, 31.25rem);\n }\n\n .detail-content-inner {\n padding: var(--snice-spacing-sm, 0.75rem) var(--snice-spacing-md, 1rem);\n border-top: 1px solid var(--snice-color-border, rgb(226 226 226));\n }\n\n .detail-toggle {\n background: none;\n border: none;\n cursor: pointer;\n padding: 0;\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n line-height: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .detail-toggle:hover {\n color: var(--snice-color-text, rgb(23 23 23));\n }\n\n .detail-toggle-icon {\n width: 1rem;\n height: 1rem;\n transition: transform 0.2s ease;\n transform: rotate(-90deg);\n }\n\n .detail-toggle--expanded .detail-toggle-icon {\n transform: rotate(0deg);\n }\n\n /* Drag handle */\n .drag-handle-cell {\n cursor: grab;\n user-select: none;\n color: var(--snice-color-text-tertiary, rgb(115 115 115));\n font-size: 0.875rem;\n }\n\n /* Focus indicator for keyboard nav */\n [data-grid-focus] {\n outline: 2px solid var(--snice-color-primary, rgb(37 99 235));\n outline-offset: -2px;\n }\n\n /* Column menu */\n .table-column-menu {\n position: fixed;\n z-index: 10001;\n min-width: 10rem;\n background: var(--snice-color-surface-container-high, rgb(252 251 249));\n border: 1px solid var(--snice-color-border, rgb(226 226 226));\n border-radius: var(--snice-border-radius-md, 0.25rem);\n box-shadow: var(--snice-shadow-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1));\n padding: 4px;\n }\n\n .column-menu-separator {\n height: 1px;\n background: var(--snice-color-border, rgb(226 226 226));\n margin: 4px 0;\n }\n\n .column-menu-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.625rem;\n border: none;\n border-radius: 3px;\n background: transparent;\n color: var(--snice-color-text, rgb(23 23 23));\n font-size: var(--snice-font-size-sm, 0.875rem);\n font-family: inherit;\n cursor: pointer;\n text-align: left;\n white-space: nowrap;\n }\n\n .column-menu-item:hover {\n background: var(--snice-color-surface-container-low, rgb(245 245 245));\n }\n\n .column-menu-item:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .column-menu-item--active {\n color: var(--snice-color-primary, rgb(37 99 235));\n font-weight: var(--snice-font-weight-medium, 500);\n }\n\n .column-menu-icon {\n width: 1rem;\n height: 1rem;\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n }\n .column-menu-icon svg {\n width: 1rem;\n height: 1rem;\n }\n\n /* Slotted table layout */\n .snice-table--slotted {\n border: 1px solid var(--snice-color-border, rgb(226 226 226));\n border-radius: var(--snice-border-radius-lg, 0.5rem);\n overflow: hidden;\n }\n\n .snice-table--slotted .table-header {\n display: grid;\n grid-auto-flow: column;\n grid-auto-columns: 1fr;\n background-color: var(--snice-color-surface-container-low, rgb(245 245 245));\n border-bottom: 2px solid var(--snice-color-border, rgb(226 226 226));\n padding: var(--snice-spacing-sm, 0.75rem);\n font-weight: var(--snice-font-weight-semibold, 600);\n color: var(--snice-color-text, rgb(23 23 23));\n }\n\n .snice-table--slotted .header-cell {\n color: var(--snice-color-text, rgb(23 23 23));\n }\n\n .snice-table--slotted .table-header::slotted(snice-column) {\n padding: var(--snice-spacing-sm, 0.75rem);\n }\n\n .snice-table--slotted .table-body {\n display: flex;\n flex-direction: column;\n }\n\n .snice-table--slotted .table-body::slotted(snice-row) {\n border-bottom: 1px solid var(--snice-color-border, rgb(226 226 226));\n }\n\n .snice-table--slotted .table-body::slotted(snice-row:last-child) {\n border-bottom: none;\n }\n\n :host([striped]) .snice-table--slotted .table-body::slotted(snice-row:nth-child(even)) {\n background-color: var(--snice-color-surface-container-low, rgb(245 245 245));\n }\n\n :host([hoverable]) .snice-table--slotted .table-body::slotted(snice-row:hover) {\n background-color: var(--snice-color-surface-container, rgb(235 235 235));\n }\n `;\n }\n\n @render()\n render() {\n // Check if we have slotted rows\n const hasSlottedRows = this.querySelectorAll('snice-row[slot=\"rows\"]').length > 0\n && !this.shouldModelSlottedRows();\n\n if (hasSlottedRows) {\n // Use slotted rows layout\n return html/*html*/`\n <div class=\"snice-table snice-table--slotted\" @click=${this.handleClick} @keydown=${this.handleKeydown} @change=${this.handleChange} @checkbox-change=${this.handleChange}>\n <div class=\"table-controls-container\"></div>\n<div class=\"table-header\" id=\"slotted-header\"></div>\n <div class=\"table-body\">\n <slot name=\"rows\"></slot>\n </div>\n <slot name=\"columns\" style=\"display: none;\"></slot>\n </div>\n `;\n } else {\n // Use traditional table layout\n return html/*html*/`\n <div class=\"snice-table\" @click=${this.handleClick} @keydown=${this.handleKeydown} @change=${this.handleChange} @checkbox-change=${this.handleChange}>\n <div class=\"table-controls-container\"></div>\n<div class=\"table-frame\">\n <div class=\"table-superheader\" part=\"superheader\">\n <slot name=\"header\"></slot>\n </div>\n <table>\n <thead></thead>\n <tbody></tbody>\n </table>\n </div>\n <div class=\"table-pagination-container\"></div>\n </div>\n `;\n }\n }\n\n renderControls() {\n const container = this.shadowRoot?.querySelector('.table-controls-container');\n if (!container) return;\n\n // A configured toolbar owns this container. Reattach it when a structural\n // render replaces the shadow template; legacy controls must not overwrite it.\n if (this.toolbarOptions) {\n this.setToolbar(this.toolbarOptions);\n return;\n }\n\n const showControls = this.searchable || this.filterable || this.quickFilter;\n if (!showControls) {\n container.innerHTML = '';\n return;\n }\n\n container.innerHTML = '';\n const controlsDiv = document.createElement('div');\n controlsDiv.className = 'table-controls';\n controlsDiv.setAttribute('part', 'controls');\n\n if (this.quickFilter) {\n const quickInput = document.createElement('snice-input') as any;\n quickInput.className = 'quick-filter-input';\n quickInput.type = 'search';\n quickInput.placeholder = 'Quick filter...';\n quickInput.size = 'small';\n quickInput.clearable = true;\n quickInput.style.width = '16rem';\n quickInput.style.maxWidth = '16rem';\n quickInput.value = this.filterEngine.getFilterModel().quickFilter || '';\n quickInput.addEventListener('input', this.handleQuickFilterInput);\n controlsDiv.appendChild(quickInput);\n } else if (this.searchable) {\n const searchInput = document.createElement('snice-input');\n searchInput.className = 'search-input';\n searchInput.setAttribute('type', 'search');\n searchInput.setAttribute('placeholder', 'Search...');\n searchInput.setAttribute('size', 'small');\n searchInput.style.width = '16rem';\n searchInput.style.maxWidth = '16rem';\n searchInput.style.flex = '0 0 auto';\n searchInput.addEventListener('input', this.handleSearchInput);\n controlsDiv.appendChild(searchInput);\n }\n\n if (this.filterable) {\n const select = document.createElement('snice-select');\n select.className = 'selector-input';\n select.setAttribute('multiple', '');\n select.setAttribute('searchable', '');\n select.setAttribute('clearable', '');\n select.setAttribute('placeholder', 'Filter...');\n select.setAttribute('size', 'medium');\n\n this.selectorOptions.forEach(opt => {\n const option = document.createElement('snice-option');\n option.setAttribute('value', opt.value);\n option.textContent = opt.label;\n select.appendChild(option);\n });\n\n controlsDiv.appendChild(select);\n }\n\n container.appendChild(controlsDiv);\n }\n\n // Re-derive the fill row whenever the frame's box changes (host resized,\n // fullscreen toggled) — the leftover space below the rows changes with it.\n @observe('resize', '.table-frame')\n handleFrameResize() {\n this.updateFillRow();\n }\n\n @ready()\n async initialize() {\n // Listen for controller attached event\n this.addEventListener('controller-attached', this.onAttached as EventListener);\n\n // Listen for select change events from the filter dropdown\n this.addEventListener('select-change', this.handleSelectorChange as EventListener);\n this.addEventListener('row-select', this.handleSlottedRowSelect as EventListener);\n\n // Listen for detail panel toggle\n this.addEventListener('detail-toggle', () => this.renderBody());\n\n // Persist committed edits back into the local dataset so the re-render\n // shows the new value. Fires before commitEdit()'s renderBody() (the\n // editor dispatches synchronously), so data is current by render time.\n this.addEventListener('cell-edit-commit', ((e: CustomEvent) => {\n const { rowIndex, columnKey, newValue } = e.detail;\n const row = this.data[rowIndex];\n if (row) row[columnKey] = newValue;\n // A4: an in-place cell change can alter which rows match an active filter.\n // Row identity is unchanged, so the index map stays valid — only the\n // filtered snapshot must be dropped.\n this.invalidateFilteredCache();\n // Task B: the row object was mutated in place (same reference), so the\n // reconciler would reuse its stale cell DOM. Drop its cached <tr> so the\n // post-commit render rebuilds it with the new value.\n if (row) this.invalidateRenderedRow(row);\n }) as EventListener);\n\n this.addEventListener('row-edit-commit', ((e: CustomEvent) => {\n const { rowIndex, newRow } = e.detail;\n if (this.data[rowIndex]) this.data[rowIndex] = newRow;\n // A1/A4: an element was swapped in place (same array reference), so the\n // ref-check can't see it — resync the index map and filtered snapshot.\n this.rebuildRowIndex();\n }) as EventListener);\n\n // Wait for snice-column to be defined\n await customElements.whenDefined('snice-column');\n await customElements.whenDefined('snice-row');\n\n // Process slotted columns and rows\n await this.processSlottedContent();\n await (this as any).rendered;\n\n // Pre-connect property assignments do not invoke change-only watchers in\n // Snice. Configure grouping explicitly once initialization has applied\n // those values so `table.groupBy = ...` works before the element is added\n // to the document (React/story/programmatic creation path).\n this.syncGrouping();\n\n // Render controls after initial setup\n this.renderControls();\n\n // Initialize feature modules\n this.initializeModules();\n this.initColumnMenu();\n\n // Setup DnD\n if (this.rowReorder) this.rowDnD.attach(this);\n if (this.columnReorder) this.columnDnD.attach(this);\n\n // We are at the safe post-template point and all feature modules that\n // affect row/header construction are attached. Finish the initial paint\n // synchronously so the public `ready` promise includes pre-connect\n // grouping, DnD handles, keyboard ARIA, and aggregate footers.\n this.renderHeader();\n this.renderBody();\n\n // Setup virtualization if enabled\n if (this.virtualize) {\n requestAnimationFrame(() => {\n if (!this.virtualizer.isEnabled()) this.setupVirtualization();\n });\n }\n\n // Setup lazy loading\n if (this.lazyLoad) {\n requestAnimationFrame(() => this.setupLazyLoading());\n }\n\n // Listen for DnD events\n this.addEventListener('row-reorder', ((e: CustomEvent) => {\n const { fromIndex, toIndex } = e.detail;\n if (!Number.isInteger(fromIndex) || !Number.isInteger(toIndex)\n || fromIndex < 0 || toIndex < 0\n || fromIndex >= this.data.length || toIndex >= this.data.length) return;\n if (fromIndex === toIndex) return;\n\n const selectedRows = this.selectedRows\n .map((index) => this.data[index])\n .filter((row) => row !== undefined);\n const expandedRows = Array.from(this.masterDetail.getExpandedRows())\n .map((index) => this.data[index])\n .filter((row) => row !== undefined);\n const item = this.data.splice(fromIndex, 1)[0];\n\n // A drop onto another group means reparenting the row. Group rendering\n // is derived from the groupBy fields, so merely changing raw array order\n // would make a cross-group drop visually snap back to its old group.\n // Copy the target leaf's grouping values before insertion so the rendered\n // result honors the user's actual drop target (all nested levels too).\n const targetBeforeRemoval = this.data[toIndex > fromIndex ? toIndex - 1 : toIndex];\n if (item && targetBeforeRemoval && this.grouping.hasGrouping()) {\n for (const key of this.grouping.getGroupByKeys()) {\n item[key] = targetBeforeRemoval[key];\n }\n }\n\n this.data.splice(toIndex, 0, item);\n this.data = [...this.data];\n this.selectedRows = selectedRows\n .map((row) => this.indexOfRow(row))\n .filter((index) => index >= 0);\n this.masterDetail.setExpandedRows(\n expandedRows.map((row) => this.indexOfRow(row)).filter((index) => index >= 0)\n );\n }) as EventListener);\n\n this.addEventListener('column-reorder', ((e: CustomEvent) => {\n const { fromKey, toKey } = e.detail;\n const fromIdx = this.columns.findIndex(c => c.key === fromKey);\n const toIdx = this.columnManager.getVisibleColumns().findIndex(c => c.key === toKey);\n if (fromIdx >= 0 && toIdx >= 0) {\n this.columnManager.moveColumn(fromKey, toIdx);\n this.renderHeader();\n this.renderBody();\n }\n }) as EventListener);\n\n // Listen for tree toggle\n this.addEventListener('tree-toggle', () => this.renderBody());\n\n }\n\n private async processSlottedContent() {\n // Get slotted column elements\n const columnElements = Array.from(this.querySelectorAll('snice-column[slot=\"columns\"]')) as any[];\n const rowElements = Array.from(this.querySelectorAll('snice-row[slot=\"rows\"]')) as any[];\n await Promise.all(rowElements.map((row) => row.ready));\n\n if (columnElements.length > 0) {\n // Extract column definitions from snice-column elements\n this.columns = columnElements.map((col: any) => col.getColumnDefinition());\n }\n\n // Pass declarative or programmatically assigned column definitions to rows.\n rowElements.forEach((row: any, index: number) => {\n row.columns = this.columns;\n row.index = index;\n row.hoverable = this.hoverable;\n row.clickable = this.clickable;\n });\n this.syncSlottedSelectionState();\n\n // Grouping/aggregation operates on the same model regardless of whether\n // rows came from a JS array or declarative <snice-row> children.\n if (this.shouldModelSlottedRows()) this.syncSlottedRowsIntoData();\n\n // Render the header for slotted mode (after next tick to ensure DOM is updated)\n if (columnElements.length > 0 && !this.shouldModelSlottedRows()) {\n requestAnimationFrame(() => this.renderSlottedHeader());\n }\n }\n\n /** Whether declarative rows need the full grouping/aggregation table model. */\n private shouldModelSlottedRows(): boolean {\n const keys = Array.isArray(this.groupBy) ? this.groupBy : (this.groupBy ? [this.groupBy] : []);\n return keys.some(Boolean) || this.columns.some((column) => column.aggregate != null);\n }\n\n /** Copy declarative row data into the table model without parsing markup. */\n private syncSlottedRowsIntoData() {\n const rowElements = Array.from(this.querySelectorAll('snice-row[slot=\"rows\"]')) as any[];\n if (rowElements.length === 0) return;\n\n const rows = rowElements.map((row) => {\n if (row.data && Object.keys(row.data).length > 0) return row.data;\n const serialized = row.getAttribute('data');\n if (serialized) {\n try { return JSON.parse(serialized); }\n catch { /* snice-row's data-* extraction remains the fallback */ }\n }\n return row.data ?? {};\n });\n this.data = rows;\n }\n\n private renderSlottedHeader() {\n const headerContainer = this.shadowRoot?.querySelector('#slotted-header');\n if (!headerContainer || this.columns.length === 0) return;\n\n // Render column headers as DOM/text, never parsed definition markup.\n headerContainer.replaceChildren();\n for (const column of this.columns) {\n const cell = document.createElement('div');\n cell.className = 'header-cell';\n cell.textContent = column.label ?? column.key;\n headerContainer.appendChild(cell);\n }\n }\n\n /** Keep declarative column definitions reactive, including aggregate. */\n @on('column-changed')\n private handleDeclarativeColumnChange() {\n const columnElements = Array.from(this.querySelectorAll('snice-column[slot=\"columns\"]')) as any[];\n if (columnElements.length === 0) return;\n this.columns = columnElements.map((column) => column.getColumnDefinition());\n\n // Ungrouped declarative rows stay in their light-DOM rendering path, so\n // they do not consume the native table render scheduled by the columns\n // watcher. Keep their model and header synchronized explicitly. When a new\n // aggregate switches the table to native mode the watcher instead copies\n // row data into the shared model.\n const rowElements = Array.from(this.querySelectorAll('snice-row[slot=\"rows\"]')) as any[];\n rowElements.forEach((row) => { row.columns = this.columns; });\n requestAnimationFrame(() => {\n if (!this.shouldModelSlottedRows()) this.renderSlottedHeader();\n this.renderControls();\n });\n }\n\n\n @watch('selectorOptions')\n handleSelectorOptionsChange() {\n // Update CSS class to show/hide selector\n if (this.selectorOptions.length === 0) {\n this.classList.add('selector-options-empty');\n } else {\n this.classList.remove('selector-options-empty');\n }\n }\n\n @watch('sortable')\n handleSortableChange() {\n this.renderHeader(); // Re-render header to show/hide sort indicators\n }\n\n @watch('selectable')\n handleSelectableChange() {\n this.render(); // Re-render both header and body for checkbox columns\n queueMicrotask(() => this.syncSlottedSelectionState());\n }\n\n // C1: reactive columns. A new column set can change cell types/formatting\n // without changing keys (which the row signature keys on), so drop the\n // recycler map and resync the column model before the header renders. All DOM\n // construction is deferred to the coalescing queue (setter-stack landmine).\n @watch('columns', { immediate: false })\n handleColumnsAssignment() {\n this.renderedRows = new Map();\n if (this.columns.length > 0) this.columnManager.initialize(this.columns, this);\n // F: a column set change can add/remove an `aggregate` — resync the grouping\n // model's aggregator list and drop its stale flattened snapshot.\n this.grouping.setColumns(this.columns);\n this.invalidateGroupingCache();\n const hasSlottedRows = !!this.querySelector('snice-row[slot=\"rows\"]');\n const modelSlottedRows = this.shouldModelSlottedRows();\n if (hasSlottedRows\n && this.virtualizer.isEnabled()\n && !!this.shadowRoot?.querySelector('table') !== modelSlottedRows) {\n this.virtualizer.detach();\n }\n if (modelSlottedRows) this.syncSlottedRowsIntoData();\n if (hasSlottedRows) {\n requestAnimationFrame(() => {\n if (!modelSlottedRows) this.renderSlottedHeader();\n this.renderControls();\n if (this.toolbarOptions) this.setToolbar(this.toolbarOptions);\n if (this.lazyLoad) this.setupLazyLoading();\n });\n }\n this.scheduleRender('both');\n }\n\n // F: reactive groupBy. Post-mount `table.groupBy = 'department'` reconfigures\n // the grouping model and re-renders through the coalescing queue. immediate:\n // false so the initial value doesn't kick a render (the columns/data watchers\n // drive the first paint). No synchronous cell construction here — scheduleRender\n // defers to a microtask (happy-dom constructor landmine).\n @watch('groupBy', 'groupDefaults', { immediate: false })\n handleGroupByChange() {\n this.syncGrouping();\n const hasSlottedRows = !!this.querySelector('snice-row[slot=\"rows\"]');\n const modelSlottedRows = this.shouldModelSlottedRows();\n if (hasSlottedRows\n && this.virtualizer.isEnabled()\n && !!this.shadowRoot?.querySelector('table') !== modelSlottedRows) {\n this.virtualizer.detach();\n }\n if (modelSlottedRows) {\n this.syncSlottedRowsIntoData();\n }\n if (hasSlottedRows) {\n requestAnimationFrame(() => {\n // Clearing the last model feature switches the structural template\n // back to slotted mode; either direction replaces the controls.\n if (!modelSlottedRows) this.renderSlottedHeader();\n this.renderControls();\n if (this.toolbarOptions) this.setToolbar(this.toolbarOptions);\n if (this.lazyLoad) this.setupLazyLoading();\n });\n }\n this.scheduleRender(hasSlottedRows ? 'both' : 'body');\n }\n\n // F: push the current groupBy/groupDefaults into the grouping model and drop\n // the flattened cache. Called from the watch and before the first render.\n private syncGrouping() {\n const keys = Array.isArray(this.groupBy)\n ? this.groupBy.filter(Boolean)\n : (this.groupBy ? [this.groupBy] : []);\n this.grouping.configure({ groupBy: keys, defaultExpanded: this.groupDefaults?.expanded !== false });\n this.grouping.setColumns(this.columns);\n this.invalidateGroupingCache();\n }\n\n // C1: reactive data. `table.data = rows` refreshes the unsortedData snapshot\n // and the row-index map, then renders the body. The internal sort path\n // (sortLocalData) reassigns this.data with a re-sorted view of the SAME rows\n // and owns its own snapshot/render — settingSortedData tells us to skip.\n @watch('data', { immediate: false })\n handleDataAssignment() {\n if (this.settingSortedData) return;\n this.unsortedData = [...this.data];\n // C3: rows delivered while a client-side sort is active must land in that\n // sorted order — the currentSort watcher only fires when the sort itself\n // changes, so without this the body silently contradicts the header. In\n // remote mode the server owns the ordering.\n if (this.mode !== 'remote' && this.currentSort.length > 0) this.applyLocalSortOrder();\n this.rebuildRowIndex();\n this.masterDetail.prepare(this.data, row => this.rowValueSignature(row));\n if (this.settingDataImperative) return; // imperative setData(): caller renders\n this.scheduleRender('body');\n }\n\n @watch('loading')\n handleDataChange() {\n this.renderBody();\n this.updateLoadingOverlay();\n }\n\n /**\n * Refetch affordance: with rows on screen `loading` only dims the tbody, so\n * add a spinner overlay (styled via `part=\"loading-overlay\"`). The no-data\n * load keeps its single spinner message row instead.\n */\n private updateLoadingOverlay() {\n const frame = this.shadowRoot?.querySelector('.table-frame');\n if (!frame) return;\n let overlay = frame.querySelector('.table-loading-overlay') as HTMLElement | null;\n const show = this.loading && this.data.length > 0;\n if (show && !overlay) {\n overlay = document.createElement('div');\n overlay.className = 'table-loading-overlay';\n overlay.setAttribute('part', 'loading-overlay');\n const spinner = document.createElement('snice-progress');\n spinner.setAttribute('variant', 'circular');\n spinner.setAttribute('indeterminate', '');\n spinner.setAttribute('size', 'small');\n overlay.appendChild(spinner);\n frame.appendChild(overlay);\n } else if (!show && overlay) {\n overlay.remove();\n }\n }\n\n @watch('selectedRows')\n handleSelectedRowsChange(oldVal?: number[], newVal?: number[]) {\n // A2: selection is a @property, so every reassignment lands here — the\n // single source of truth for reflecting selection into the DOM. Touch only\n // the rows whose membership actually changed (symmetric difference of old\n // vs new), not every rendered <tr>. A single toggle updates one row; a\n // select-all/clear-all naturally updates every changed row.\n const oldSet = new Set(oldVal ?? []);\n const newSet = new Set(newVal ?? this.selectedRows ?? []);\n const changed = new Set<number>();\n for (const i of oldSet) if (!newSet.has(i)) changed.add(i);\n for (const i of newSet) if (!oldSet.has(i)) changed.add(i);\n\n for (const i of changed) this.updateRowSelectionStateFor(i, newSet.has(i));\n this.updateSelectAllState();\n // F: a data-row toggle must refresh its group header's all/some/none state.\n this.updateGroupSelectionStates();\n }\n\n @watch('selectionMode', { immediate: false })\n handleSelectionModeChange() {\n if (this.selectionMode === 'none') {\n this.selectedRows = [];\n this.selectionAnchor = null;\n } else if (this.selectionMode === 'single' && this.selectedRows.length > 1) {\n this.selectedRows = this.selectedRows.slice(0, 1);\n this.selectionAnchor = this.data[this.selectedRows[0]] ?? null;\n }\n this.syncSlottedSelectionState();\n // The selection mode changes the tool-column structure (none has no\n // checkbox column; single has row checkboxes but no select-all control).\n this.scheduleRender('both');\n }\n\n @watch('currentSort')\n handleSortChange() {\n this.renderHeader();\n }\n\n @watch('searchable', 'filterable', 'quickFilter')\n handleControlsChange() {\n this.renderControls();\n if (this.quickFilter) this.scheduleRender('body');\n }\n\n // ── C2: controlled-state props. Assigning any of these post-mount routes to\n // the same effect its imperative setter produces, rendering through the\n // coalescing queue. immediate:false so the initial value never kicks a render\n // (the initial render is driven by the other immediate watchers).\n\n // A controlled `currentSort` must actually re-sort (local) or re-request\n // (remote) — the sibling handleSortChange only repaints the arrows.\n @watch('currentSort', { immediate: false })\n handleControlledSort() {\n if (this.mode === 'remote') this.debouncedDataRequest();\n else this.sortLocalData();\n }\n\n @watch('currentPage', { immediate: false })\n handleCurrentPageChange() {\n if (this.paginationMode === 'server' && this.mode === 'remote') this.debouncedDataRequest();\n else this.scheduleRender('body');\n }\n\n @watch('pageSize', { immediate: false })\n handlePageSizeChange() {\n this.currentPage = 1;\n if (this.paginationMode === 'server' && this.mode === 'remote') this.debouncedDataRequest();\n else this.scheduleRender('body');\n }\n\n @watch('density', { immediate: false })\n handleDensityChange() {\n // The density attribute reflects automatically (drives the CSS); the body\n // rebuilds because density is part of the row signature.\n this.scheduleRender('body');\n this.dispatchDensityChange();\n }\n\n @watch('list', { immediate: false })\n handleListChange() {\n this.renderedRows = new Map();\n this.scheduleRender('body');\n }\n\n @watch('editable', { immediate: false })\n handleEditableChange() {\n if (this.editable) this.setupEditor();\n this.scheduleRender('body');\n }\n\n @watch('editMode', { immediate: false })\n handleEditModeChange() {\n if (this.editable) this.editor.setEditMode(this.editMode);\n this.scheduleRender('body');\n }\n\n @watch('virtualize', { immediate: false })\n handleVirtualizeChange() {\n // renderBody self-heals virtualization (enables the virtualizer when\n // requested); turning it off detaches so the normal path takes over.\n if (!this.virtualize) this.virtualizer.detach();\n this.scheduleRender('body');\n }\n\n @watch('rowHeight', { immediate: false })\n handleRowHeightChange() {\n this.scheduleRender('body');\n }\n\n @watch('columnResize', { immediate: false })\n handleColumnResizeChange() {\n this.scheduleRender('header');\n }\n\n @watch('headerFilters', { immediate: false })\n handleHeaderFiltersChange() {\n this.scheduleRender('header');\n }\n\n @watch('rowReorder', { immediate: false })\n handleRowReorderChange() {\n if (this.rowReorder) this.rowDnD.attach(this);\n else this.rowDnD.detach();\n this.scheduleRender('both');\n }\n\n @watch('columnReorder', { immediate: false })\n handleColumnReorderChange() {\n if (this.columnReorder) this.columnDnD.attach(this);\n else this.columnDnD.detach();\n this.scheduleRender('header');\n }\n\n @watch('lazyLoad', 'lazyLoadThreshold', { immediate: false })\n handleLazyLoadChange() {\n if (this.lazyLoad) {\n queueMicrotask(() => this.setupLazyLoading());\n } else {\n if (this.lazyLoadHandler) this.lazyLoadContainer?.removeEventListener('scroll', this.lazyLoadHandler);\n this.lazyLoadHandler = null;\n this.lazyLoadContainer = null;\n }\n }\n\n @watch('columnMenu', { immediate: false })\n handleColumnMenuChange() {\n if (this.columnMenu) this.initColumnMenu();\n this.scheduleRender('header');\n }\n\n /** Column definitions in their actual painted order. Column state owns\n * visibility/order; pinned columns are partitioned to their physical edges\n * so right-pinned cells do not overlap later unpinned columns. */\n private getVisibleColumnDefinitions(): ColumnDefinition[] {\n if (this.columnManager.getAllStates().length === 0) return this.columns;\n const states = [\n ...this.columnManager.getPinnedLeft(),\n ...this.columnManager.getUnpinned(),\n ...this.columnManager.getPinnedRight(),\n ];\n const byKey = new Map(this.columns.map((column) => [column.key, column]));\n return states\n .map((state) => byKey.get(state.key))\n .filter((column): column is ColumnDefinition => !!column);\n }\n\n renderHeader() {\n if (!this.thead) return;\n \n const headerRow = document.createElement('tr');\n headerRow.className = 'column-header-row';\n\n // Tool column headers — must match createRow order\n if (this.rowReorder && this.rowDnD.isEnabled()) {\n const th = document.createElement('th');\n th.setAttribute('scope', 'col');\n th.className = 'drag-handle-cell';\n headerRow.appendChild(th);\n }\n\n if (this.masterDetail.isEnabled()) {\n const th = document.createElement('th');\n th.setAttribute('scope', 'col');\n th.className = 'detail-toggle-cell';\n headerRow.appendChild(th);\n }\n\n if (this.hasSelectionColumn()) {\n const selectCell = document.createElement('th');\n selectCell.setAttribute('scope', 'col');\n selectCell.className = 'select-column';\n if (this.selectionMode === 'multiple') {\n const filteredIndices = this.getSelectableIndices(this.getFilteredData());\n const selectedInFiltered = filteredIndices.filter(i => this.selectedRows.includes(i));\n const allSelected = selectedInFiltered.length === filteredIndices.length && filteredIndices.length > 0;\n const someSelected = selectedInFiltered.length > 0 && selectedInFiltered.length < filteredIndices.length;\n selectCell.innerHTML = `<snice-checkbox class=\"select-all\" size=\"small\" compact ${allSelected ? 'checked' : ''}></snice-checkbox>`;\n\n // Set indeterminate after insertion.\n setTimeout(() => {\n const checkbox = selectCell.querySelector('.select-all') as HTMLInputElement;\n if (checkbox) checkbox.indeterminate = someSelected;\n }, 0);\n } else {\n selectCell.setAttribute('aria-label', 'Select one row');\n }\n headerRow.appendChild(selectCell);\n }\n\n const visibleColumns = this.getVisibleColumnDefinitions();\n\n visibleColumns.forEach(column => {\n\n const th = document.createElement('th');\n th.setAttribute('data-key', column.key);\n th.setAttribute('scope', 'col');\n // Reflect current sort direction for SR users.\n if (this.sortable && column.sortable !== false) {\n const sortState = this.currentSort.find(s => s.column === column.key);\n if (sortState?.direction === 'asc') th.setAttribute('aria-sort', 'ascending');\n else if (sortState?.direction === 'desc') th.setAttribute('aria-sort', 'descending');\n else th.setAttribute('aria-sort', 'none');\n }\n\n // Apply column width\n const state = this.columnManager.getState(column.key);\n if (state) {\n th.style.width = `${state.width}px`;\n\n // Pinned column sticky positioning\n if (state.pinned === 'left') {\n const offsets = this.columnManager.getPinnedLeftOffsets();\n th.classList.add('pinned-cell');\n th.style.position = 'sticky';\n th.style.left = `${offsets.get(column.key) ?? 0}px`;\n th.style.zIndex = '2';\n } else if (state.pinned === 'right') {\n const offsets = this.columnManager.getPinnedRightOffsets();\n th.classList.add('pinned-cell');\n th.style.position = 'sticky';\n th.style.right = `${offsets.get(column.key) ?? 0}px`;\n th.style.zIndex = '2';\n }\n }\n\n if (this.sortable && column.sortable !== false) {\n th.classList.add('sortable');\n th.setAttribute('role', 'button');\n // A role=button must be focusable and named, or the keyboard cannot\n // sort at all. Matches the declarative header in snice-header.ts.\n th.setAttribute('tabindex', '0');\n th.setAttribute('aria-label', `Sort by ${column.label}`);\n th.innerHTML = this.renderSortableHeader(column);\n } else {\n th.textContent = column.label;\n }\n\n // Filter indicator\n if (this.filterEngine.hasColumnFilter(column.key)) {\n th.classList.add('filtered');\n }\n\n // Resize handle\n if (this.columnResize && column.resizable !== false) {\n const handle = document.createElement('span');\n handle.className = 'resize-handle';\n handle.addEventListener('mousedown', (e) => {\n e.stopPropagation();\n this.columnManager.startResize(column.key, e.clientX);\n });\n handle.addEventListener('dblclick', (e) => {\n e.stopPropagation();\n if (this.tbody) {\n this.columnManager.autoSizeColumn(column.key, this.tbody);\n this.renderHeader();\n this.renderBody();\n }\n });\n th.appendChild(handle);\n // No inline position:relative here — inline styles outrank the\n // stylesheet and would stomp the sticky header (thead th) and\n // pinned-column sticky positioning. `position: sticky` is itself a\n // positioned ancestor, so the absolutely-positioned resize handle\n // anchors correctly without it.\n }\n\n // Column menu (right-click)\n if (this.columnMenu) {\n th.addEventListener('contextmenu', (e) => {\n e.preventDefault();\n const colState = this.columnManager.getState(column.key);\n this.columnMenuManager.show(column.key, e.clientX, e.clientY, {\n sortable: this.sortable && column.sortable !== false,\n filterable: column.filterable !== false,\n hideable: colState?.hideable,\n pinnable: colState?.pinnable,\n pinned: colState?.pinned,\n });\n });\n }\n\n // Column DnD\n if (this.columnReorder && this.columnDnD.isEnabled()) {\n // A pinned column has a fixed physical edge. Presenting it as draggable\n // would emit a reorder event that the column manager correctly ignores.\n this.columnDnD.makeHeaderDraggable(th, column.key, column.reorderable !== false && !state?.pinned);\n }\n\n headerRow.appendChild(th);\n });\n\n this.thead.innerHTML = '';\n\n // Column groups header row (if any)\n const groups = this.columnManager.getColumnGroups();\n if (groups.length > 0) {\n const groupRow = document.createElement('tr');\n groupRow.className = 'column-group-row';\n // Tool-column spacers must line up with the equivalent cells in the main\n // header row before the grouped data-column runs.\n const toolColumnClasses = [\n this.rowReorder && this.rowDnD.isEnabled() ? 'drag-handle-cell' : '',\n this.masterDetail.isEnabled() ? 'detail-toggle-cell' : '',\n this.hasSelectionColumn() ? 'select-column' : '',\n ].filter(Boolean);\n for (const className of toolColumnClasses) {\n const spacer = document.createElement('th');\n spacer.className = className;\n spacer.setAttribute('aria-hidden', 'true');\n groupRow.appendChild(spacer);\n }\n const groupedHeaders = document.createElement('template');\n groupedHeaders.innerHTML = this.columnManager.renderGroupHeaders(\n visibleColumns.map((column) => column.key)\n );\n groupRow.appendChild(groupedHeaders.content);\n this.thead.appendChild(groupRow);\n }\n\n this.thead.appendChild(headerRow);\n\n // Header filter row (if enabled)\n if (this.headerFilters) {\n const filterRow = document.createElement('tr');\n filterRow.className = 'header-filter-row';\n\n if (this.rowReorder && this.rowDnD.isEnabled()) {\n const spacer = document.createElement('td');\n spacer.className = 'drag-handle-cell';\n filterRow.appendChild(spacer);\n }\n if (this.masterDetail.isEnabled()) {\n const spacer = document.createElement('td');\n spacer.className = 'detail-toggle-cell';\n filterRow.appendChild(spacer);\n }\n if (this.hasSelectionColumn()) {\n const spacer = document.createElement('td');\n spacer.className = 'select-column';\n filterRow.appendChild(spacer);\n }\n\n visibleColumns.forEach(column => {\n const td = document.createElement('td');\n const input = document.createElement('snice-input') as any;\n input.size = 'small';\n input.placeholder = `Filter ${column.label}...`;\n input.setAttribute('data-column', column.key);\n input.value = this.filterEngine.getHeaderFilter(column.key);\n input.style.cssText = 'width:100%;--snice-color-border:transparent;--snice-border-radius-md:0;';\n input.addEventListener('input', () => {\n // A3: engine model updates synchronously (cheap); the expensive\n // re-filter + re-render is debounced so a keystroke burst is one apply.\n this.filterEngine.setHeaderFilter(column.key, input.value);\n this.debouncedApplyClientFilters();\n });\n td.appendChild(input);\n filterRow.appendChild(td);\n });\n\n this.thead.appendChild(filterRow);\n }\n }\n\n renderSortableHeader(column: any): string {\n const sortItem = this.currentSort.find(s => s.column === column.key);\n const sortIndex = this.currentSort.findIndex(s => s.column === column.key);\n const isActive = !!sortItem;\n\n const chevronUp = `<svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M1 5l4-4 4 4\"/></svg>`;\n const chevronDown = `<svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M1 1l4 4 4-4\"/></svg>`;\n\n let indicator = `<span style=\"display:flex;flex-direction:column;gap:0;opacity:0.3\">${chevronUp}${chevronDown}</span>`;\n let orderNumber = '';\n\n if (sortItem) {\n if (sortItem.direction === 'asc') {\n indicator = chevronUp;\n } else if (sortItem.direction === 'desc') {\n indicator = chevronDown;\n }\n\n if (this.currentSort.length > 1) {\n orderNumber = `<span class=\"sort-order\">${sortIndex + 1}</span>`;\n }\n }\n\n const indicatorClasses = ['sort-indicator', isActive ? 'active' : ''].filter(Boolean).join(' ');\n\n return `\n <div class=\"sort-header\">\n <span>${column.label}</span>\n <div class=\"${indicatorClasses}\">\n ${indicator}\n ${orderNumber}\n </div>\n </div>\n `;\n }\n\n\n renderBody() {\n if (!this.tbody) return;\n\n // Update column manager when columns change\n if (this.columns.length > 0) {\n this.columnManager.initialize(this.columns, this);\n }\n\n // F: keep the grouping model's aggregator list current before any\n // isEnabled() check below — isEnabled() reports aggregation-only tables too,\n // and setColumns is what tells it which columns aggregate.\n if (this.grouping.setColumns(this.columns)) this.invalidateGroupingCache();\n\n // In grouped client-pagination mode the public total is the flattened\n // display model (headers + visible rows + aggregate footers), including on\n // the virtual path which returns before the ordinary pagination block.\n if (this.pagination && this.paginationMode === 'client') {\n if (this.usesGroupingDisplayModel()) {\n this.totalItems = this.getGroupingItems().length;\n } else if (this.treeData.isEnabled()) {\n this.totalItems = this.getTreeDisplayRows(false).length;\n }\n }\n\n // Self-heal: virtualize requested but the virtualizer never enabled\n // (property assigned after @ready, or the one-shot rAF setup missed the\n // scroll container). Never fall through to an empty or full render.\n if (this.virtualize && !this.virtualizer.isEnabled()) {\n this.setupVirtualization();\n }\n\n // Virtualized rendering: delegate to virtualizer. Total row count comes\n // from the feature-aware model (flattened tree rows when tree data is on),\n // NOT the raw filtered data — otherwise the virtualizer windows the wrong\n // dataset and expand/collapse silently no-ops.\n if (this.virtualize && this.virtualizer.isEnabled()) {\n this.virtualRowsSnapshot = this.getVirtualRows();\n this.virtualizer.setTotalRows(this.virtualRowsSnapshot.length);\n // The virtualizer's afterRender hook re-establishes grid ARIA/focus on\n // the freshly inserted window.\n\n // Still render pagination\n if (this.pagination) this.renderPagination();\n this.updateSelectAllState();\n return;\n }\n\n if (this.data.length === 0 && this.columns.length > 0) {\n // Empty / loading / error states replace the body with a single message\n // row. Reset the recycler map so a later data render starts from a clean\n // slate (no stale reuse candidates pointing at removed rows).\n this.tbody.innerHTML = '';\n this.renderedRows = new Map();\n\n const toolCols = (this.hasSelectionColumn() ? 1 : 0)\n + (this.masterDetail.isEnabled() ? 1 : 0)\n + (this.rowReorder && this.rowDnD.isEnabled() ? 1 : 0);\n const colSpan = this.columns.length + toolCols;\n\n if (this.loading) {\n // Show loading spinner\n const tr = document.createElement('tr');\n const td = document.createElement('td');\n td.colSpan = colSpan;\n td.className = 'no-data';\n td.innerHTML = '<snice-progress variant=\"circular\" indeterminate size=\"small\"></snice-progress>';\n tr.appendChild(td);\n this.tbody.appendChild(tr);\n return;\n } else if (this.loadError) {\n // Show error state — surfaces a failed remote load instead of\n // silently falling through to the generic \"No data\" empty state.\n const tr = document.createElement('tr');\n const td = document.createElement('td');\n td.colSpan = colSpan;\n td.className = 'no-data';\n const errorDiv = document.createElement('div');\n errorDiv.className = 'table-error-message';\n errorDiv.textContent = `⚠️ ${this.loadError}`;\n td.appendChild(errorDiv);\n tr.appendChild(td);\n this.tbody.appendChild(tr);\n return;\n } else {\n // Show empty state\n const tr = document.createElement('tr');\n const td = document.createElement('td');\n td.colSpan = colSpan;\n td.className = 'no-data';\n const slotted = this.querySelector('[slot=\"empty-state\"]');\n if (slotted) {\n td.appendChild(slotted.cloneNode(true));\n } else {\n const empty = document.createElement('snice-empty-state');\n empty.setAttribute('size', 'small');\n empty.setAttribute('icon', '📭');\n empty.setAttribute('title', 'No data');\n empty.setAttribute('description', 'No records to display.');\n td.appendChild(empty);\n }\n tr.appendChild(td);\n this.tbody.appendChild(tr);\n return;\n }\n }\n\n // Apply client-side filters (cached snapshot — see getFilteredData).\n const filteredData = this.getFilteredData();\n\n // Client-side pagination: slice ordinary data. Group and tree modes page\n // their own flattened models and already set totalItems above; overwriting\n // it here with the raw filtered-row count made public state differ between\n // virtual and non-virtual rendering.\n let displayData = filteredData;\n if (this.pagination && this.paginationMode === 'client'\n && !this.usesGroupingDisplayModel() && !this.treeData.isEnabled()) {\n this.totalItems = filteredData.length;\n const startIndex = (this.currentPage - 1) * this.pageSize;\n displayData = filteredData.slice(startIndex, startIndex + this.pageSize);\n }\n\n const extraCols = (this.hasSelectionColumn() ? 1 : 0) + (this.masterDetail.isEnabled() ? 1 : 0) + (this.rowReorder && this.rowDnD.isEnabled() ? 1 : 0);\n const managedColumns = this.columnManager.getAllStates();\n const visibleColumnCount = managedColumns.length > 0\n ? this.columnManager.getVisibleColumns().length\n : this.columns.length;\n const totalColSpan = visibleColumnCount + extraCols;\n const structuralSig = this.computeStructuralSig();\n\n // Task B: describe the desired body as an ordered list of keyed entries,\n // then reconcile the tbody to match. Rows whose object + signature are\n // unchanged are reused (moved on reorder); only new/changed rows construct\n // fresh DOM. Replaces the old wipe-and-rebuild-everything path.\n const entries: RowEntry[] = [];\n\n // Pinned top rows — few, and rebuilt each pass under a positional key.\n this.pinnedTopRows.forEach((row, i) => {\n entries.push({\n key: `__pinned_top_${i}`,\n sig: 'pinned',\n alwaysRebuild: true,\n create: () => {\n const tr = this.createRow(row, -1);\n tr.classList.add('pinned-row', 'pinned-row--top');\n return tr;\n },\n });\n });\n\n if (this.usesGroupingDisplayModel()) {\n // F: page over the FLATTENED group+row+aggregate list (built from the full\n // filtered data — grouping must see every row, not a pre-sliced page).\n const items = this.getDisplayedGroupingItems();\n\n for (const item of items) {\n if (item.type === 'group') {\n entries.push({\n key: item.key,\n // Group + aggregate rows are few; rebuild them each pass so their\n // count / expanded / selection / aggregate state is always fresh\n // (perf-critical recycling is for the many DATA rows below).\n sig: `${structuralSig}|grp:${item.key}:${item.expanded ? 1 : 0}:${item.count}`,\n alwaysRebuild: true,\n create: () => this.createGroupRow(item, totalColSpan),\n });\n } else if (item.type === 'aggregate') {\n entries.push({\n key: item.key,\n sig: `${structuralSig}|agg:${item.key}`,\n alwaysRebuild: true,\n create: () => this.createAggregateRow(item, totalColSpan),\n });\n } else {\n // Data row — index is its position in `this.data`, not the flattened\n // list (selection / editing / data-index all key off the data index).\n const index = this.indexOfRow(item.data);\n const editing = this.isRowEditing(index);\n entries.push({\n key: item.data,\n sig: this.rowSignature(item.data, index, structuralSig) + (editing ? '|edit' : ''),\n alwaysRebuild: editing,\n restampIndex: index,\n create: () => this.createRow(item.data, index),\n });\n\n // Grouping/aggregation must compose with master-detail exactly like\n // the ordinary and virtual paths. Aggregation-only mode also routes\n // through this branch, so omitting this entry made enabling a footer\n // silently remove every expanded detail panel.\n if (this.masterDetail.isEnabled() && this.masterDetail.isExpanded(index)) {\n entries.push({\n key: `__detail_${index}`,\n sig: 'detail',\n alwaysRebuild: true,\n create: () =>\n this.masterDetail.createDetailRow(item.data, index, totalColSpan) ??\n document.createElement('tr'),\n });\n }\n }\n }\n } else if (this.treeData.isEnabled()) {\n const treeRows = this.getTreeDisplayRows(true);\n treeRows.forEach(({ data: rowData, index, treeRow, groupItem }) => {\n if (groupItem?.type === 'aggregate') {\n entries.push({\n key: groupItem.key,\n sig: `${structuralSig}|agg:${groupItem.key}`,\n alwaysRebuild: true,\n create: () => this.createAggregateRow(groupItem, totalColSpan),\n });\n return;\n }\n if (!treeRow) return;\n const editing = this.isRowEditing(index);\n entries.push({\n key: rowData,\n // The edit marker makes the editing→display transition a signature\n // change, so a row leaving edit state rebuilds (drops its editor DOM).\n sig: this.rowSignature(rowData, index, structuralSig, treeRow) + (editing ? '|edit' : ''),\n alwaysRebuild: editing,\n restampIndex: index,\n create: () => this.createRow(rowData, index, treeRow),\n });\n });\n } else {\n displayData.forEach((rowData) => {\n const index = this.indexOfRow(rowData);\n const editing = this.isRowEditing(index);\n entries.push({\n key: rowData,\n sig: this.rowSignature(rowData, index, structuralSig) + (editing ? '|edit' : ''),\n alwaysRebuild: editing,\n restampIndex: index,\n create: () => this.createRow(rowData, index),\n });\n\n // Detail row (master-detail): shape depends on state, always rebuilt.\n if (this.masterDetail.isEnabled() && this.masterDetail.isExpanded(index)) {\n entries.push({\n key: `__detail_${index}`,\n sig: 'detail',\n alwaysRebuild: true,\n create: () =>\n this.masterDetail.createDetailRow(rowData, index, totalColSpan) ??\n document.createElement('tr'),\n });\n }\n });\n }\n\n // Pinned bottom rows\n this.pinnedBottomRows.forEach((row, i) => {\n entries.push({\n key: `__pinned_bottom_${i}`,\n sig: 'pinned',\n alwaysRebuild: true,\n create: () => {\n const tr = this.createRow(row, -1);\n tr.classList.add('pinned-row', 'pinned-row--bottom');\n return tr;\n },\n });\n });\n\n this.reconcileRows(entries);\n\n // Re-establish grid role + roving tabindex after the body changed.\n this.keyboard.refresh();\n\n // The select-all control describes the *filtered* row set, so it goes stale\n // whenever the denominator moves (rows delivered, filter cleared) even\n // though `selectedRows` — its only other trigger — never changed.\n this.updateSelectAllState();\n\n // Render pagination after body\n if (this.pagination) {\n this.renderPagination();\n }\n\n this.updateFillRow();\n }\n\n /**\n * When the host is taller than its rows, append an inert filler row so the\n * column grid runs to the bottom edge of the frame. Cloned from the last\n * data row, so column widths, pinning, and alignment track the table\n * engine natively. Removed entirely when content fills (or overflows) the\n * frame, restoring the plain last-row styling.\n */\n private updateFillRow() {\n const frame = this.shadowRoot?.querySelector('.table-frame') as HTMLElement | null;\n const tableEl = frame?.querySelector('table') as HTMLElement | null;\n const tbody = tableEl?.querySelector('tbody');\n if (!frame || !tableEl || !tbody) return;\n\n tbody.querySelector('tr.table-fill-row')?.remove();\n if (this.list && this.listRenderer) return;\n\n const rows = tbody.querySelectorAll('tr[data-index]');\n const lastRow = rows[rows.length - 1] as HTMLElement | undefined;\n if (!lastRow) return;\n\n const leftover = Math.floor(frame.clientHeight - tableEl.offsetHeight);\n if (leftover <= 1) return;\n\n const fill = lastRow.cloneNode(true) as HTMLElement;\n fill.className = 'table-fill-row';\n for (const attr of ['data-index', 'data-selected', 'role', 'aria-rowindex', 'aria-selected', 'tabindex', 'id']) {\n fill.removeAttribute(attr);\n }\n fill.setAttribute('aria-hidden', 'true');\n fill.querySelectorAll('td').forEach(td => {\n td.replaceChildren();\n for (const attr of ['role', 'aria-colindex', 'tabindex', 'aria-selected']) td.removeAttribute(attr);\n });\n fill.style.height = `${leftover}px`;\n tbody.appendChild(fill);\n }\n\n // ── Task B: render-path reconciler ──────────────────────────────────────\n //\n // Reconcile the tbody's children to `entries` (an ordered list) while reusing\n // existing <tr> elements keyed by identity. Mirrors the keyed-move algorithm\n // in src/parts.ts `_reconcileKeyed`: drop departed rows first, then walk the\n // survivors placing each desired row, moving out-of-position ones via a\n // detach-into-fragment step (avoids the happy-dom stale-querySelectorAll bug\n // that an in-place insertBefore move triggers). Stationary rows are never\n // touched, so an unchanged re-render performs zero moves and constructs zero\n // cells.\n private reconcileRows(entries: RowEntry[]) {\n const tbody = this.tbody;\n if (!tbody) return;\n\n const next = new Map<unknown, { el: HTMLElement; sig: string }>();\n const desired: HTMLElement[] = [];\n const used = new Set<HTMLElement>();\n\n for (const entry of entries) {\n const prev = this.renderedRows.get(entry.key);\n let el: HTMLElement;\n\n if (prev && !used.has(prev.el) && !entry.alwaysRebuild && prev.sig === entry.sig) {\n // Reuse the existing element. A reorder may have changed its logical\n // index without changing its signature — re-stamp index-derived DOM.\n el = prev.el;\n if (entry.restampIndex !== undefined) this.restampRowIndex(el, entry.restampIndex);\n } else {\n el = entry.create();\n }\n\n used.add(el);\n desired.push(el);\n // First occurrence wins on a duplicate key (matches rowIndexMap / _reconcileKeyed).\n if (!next.has(entry.key)) next.set(entry.key, { el, sig: entry.sig });\n }\n\n // Remove any current child that is not part of the desired set (departed\n // rows, plus a prior empty/loading/error message row).\n const desiredSet = new Set(desired);\n for (const child of Array.from(tbody.children)) {\n if (!desiredSet.has(child as HTMLElement)) child.remove();\n }\n\n // Place desired rows in order. `ref` walks the surviving children; a row\n // already sitting at `ref` is skipped, anything else is moved/inserted here.\n let ref: Node | null = tbody.firstChild;\n for (const el of desired) {\n if (el === ref) {\n ref = el.nextSibling;\n } else {\n const frag = document.createDocumentFragment();\n frag.appendChild(el); // detaches el from its old position (if any)\n tbody.insertBefore(frag, ref);\n }\n }\n\n this.renderedRows = next;\n }\n\n /**\n * A structural fingerprint of everything `createRow` reads that is NOT\n * per-row data: visible columns + their widths/pinning/offsets, tool columns,\n * density, uniform row height, tree group column. A change here (resize, pin,\n * hide/show, density) forces every row to rebuild, since a reused element\n * would carry stale layout.\n */\n // E2: stable identity for a custom renderer function, so computeStructuralSig\n // can encode \"which renderer\" without stringifying the function. A new\n // function reference gets a new id → the structural signature changes →\n // reused rows rebuild.\n private rendererIds = new WeakMap<object, number>();\n private rendererIdSeq = 0;\n private rendererIdFor(fn?: unknown): string {\n if (typeof fn !== 'function') return '';\n let id = this.rendererIds.get(fn as object);\n if (id === undefined) {\n id = ++this.rendererIdSeq;\n this.rendererIds.set(fn as object, id);\n }\n return String(id);\n }\n\n private computeStructuralSig(): string {\n const cols = this.getVisibleColumnDefinitions().map(col => {\n const state = this.columnManager.getState(col.key);\n // E2: fold each column's custom renderer identity in so swapping a\n // renderCell function invalidates every reused row (Task B recycling).\n const rc = this.rendererIdFor((col as any).renderCell);\n return `${col.key}:${state?.width ?? ''}:${state?.pinned ?? ''}:rc${rc}`;\n });\n\n return [\n cols.join(','),\n `pl=${Array.from(this.columnManager.getPinnedLeftOffsets().values()).join('/')}`,\n `pr=${Array.from(this.columnManager.getPinnedRightOffsets().values()).join('/')}`,\n `sel=${this.selectable ? this.selectionMode : 'off'}`,\n `selectable=${this.rendererIdFor(this.selectabilityCheck)}`,\n `md=${this.masterDetail.isEnabled() ? 1 : 0}`,\n `rr=${this.rowReorder && this.rowDnD.isEnabled() ? 1 : 0}`,\n `rh=${this.rowHeight}`,\n `d=${this.density}`,\n `tree=${this.treeData.isEnabled() ? this.treeData.getGroupColumn() : ''}`,\n ].join('|');\n }\n\n /**\n * A fingerprint of a row's own field values, so a row object that was mutated\n * IN PLACE (the same identity re-delivered by a poll/websocket patch, or an\n * array the app edits) is rebuilt instead of recycled with stale cells.\n *\n * Tradeoff, deliberately chosen: this walks the row's OWN, SHALLOW fields\n * rather than running each column's valueGetter/formatter. It therefore costs\n * one string build per rendered row — never a user callback, so call counts\n * for `valueGetter` stay exactly one per row per render — and it still catches\n * getter-derived columns, because a getter reads the fields this covers.\n * Nested objects collapse to their String() form, so a mutation buried inside\n * a nested object (or an object rendered by a JSON/progress cell) is not\n * detected; those callers should hand over a new row object. Recycling keeps\n * its payoff: rows whose values did not change are still reused untouched.\n */\n private rowValueSignature(rowData: any): string {\n if (rowData === null || typeof rowData !== 'object') return String(rowData);\n const parts: string[] = [];\n for (const key of Object.keys(rowData)) {\n const value = (rowData as any)[key];\n parts.push(`${key}=${value === null || value === undefined ? '' : String(value)}`);\n }\n // A separator keeps {a:'1b'} from colliding with {a:'1',b:''}.\n return parts.join('|');\n }\n\n /**\n * The per-row rebuild signature. Selection and the plain data-index are\n * re-stamped on reuse (not here) so they never force a rebuild; this captures\n * the row's cell values plus what a re-stamp cannot repair: tree node state,\n * per-row height, and — when a feature embeds the index in a row-scoped\n * closure (row DnD drag index, master-detail toggle index) — the index itself.\n */\n private rowSignature(rowData: any, index: number, structuralSig: string, treeRow?: TreeRow): string {\n const parts = [structuralSig, `v:${this.rowValueSignature(rowData)}`];\n if (treeRow) parts.push(`t:${treeRow.depth}:${treeRow.expanded ? 1 : 0}:${treeRow.hasChildren ? 1 : 0}`);\n if (this.rowHeightCallback) parts.push(`h:${this.rowHeightCallback(rowData, index)}`);\n if (this.masterDetail.isEnabled()) parts.push(`detail:${this.masterDetail.isExpanded(index) ? 1 : 0}`);\n // Features whose row DOM closes over the index must rebuild when it changes.\n if ((this.rowReorder && this.rowDnD.isEnabled()) || this.masterDetail.isEnabled()) {\n parts.push(`i:${index}`);\n }\n return parts.join('|');\n }\n\n /** Whether the row at `index` currently hosts an inline editor. */\n private isRowEditing(index: number): boolean {\n if (!this.editable) return false;\n if (this.editMode === 'row') {\n const rowState = this.editor.getRowEditState();\n return !!(rowState?.isEditing && rowState.rowIndex === index);\n }\n const cellState = this.editor.getCellEditState();\n return !!(cellState?.isEditing && cellState.rowIndex === index);\n }\n\n /**\n * Update a reused row's index-derived DOM after a reorder: the tr's\n * `data-index`, its selection reflection, and the select checkbox's\n * `data-row-index` (read back by the click/change handlers). Everything else\n * that depends on the index is captured by the signature and forces a rebuild.\n */\n private restampRowIndex(el: HTMLElement, index: number) {\n el.setAttribute('data-index', String(index));\n const isSelected = this.selectedRows.includes(index);\n el.setAttribute('data-selected', String(isSelected));\n const checkbox = el.querySelector('snice-checkbox.row-select') as any;\n if (checkbox) {\n checkbox.setAttribute('data-row-index', String(index));\n checkbox.checked = isSelected;\n const disabled = !!(this.selectabilityCheck && !this.selectabilityCheck(this.data[index], index));\n checkbox.disabled = disabled;\n checkbox.toggleAttribute('disabled', disabled);\n }\n }\n\n /**\n * Drop the cached <tr> for a row object so the next render rebuilds it. Used\n * when the table mutates a row in place (cell-edit commit) — the object\n * identity is unchanged, so the reconciler would otherwise reuse the stale\n * cell DOM.\n */\n private invalidateRenderedRow(rowData: any) {\n this.renderedRows.delete(rowData);\n }\n\n // F: the denominator for client-side pagination. When grouping/aggregation is\n // active the page unit is a FLATTENED display item (group/data/aggregate row),\n // not a raw data row — so pages cover the whole flattened list. Ungrouped\n // behavior is unchanged (data.length).\n private paginationTotal(): number {\n if (this.paginationMode !== 'client') return this.totalItems;\n if (this.usesGroupingDisplayModel()) return this.getGroupingItems().length;\n if (this.treeData.isEnabled()) return this.getTreeDisplayRows(false).length;\n return this.data.length;\n }\n\n private get totalPages(): number {\n const total = this.paginationTotal();\n return Math.max(1, Math.ceil(total / this.pageSize));\n }\n\n goToPage(page: number) {\n const clamped = Math.max(1, Math.min(page, this.totalPages));\n if (clamped === this.currentPage) return;\n this.currentPage = clamped;\n\n if (this.paginationMode === 'server' && this.mode === 'remote') {\n this.debouncedDataRequest();\n } else {\n this.renderBody();\n }\n\n this.dispatchPageChange();\n }\n\n setPageSize(size: number) {\n this.pageSize = size;\n this.currentPage = 1;\n\n if (this.paginationMode === 'server' && this.mode === 'remote') {\n this.debouncedDataRequest();\n } else {\n this.renderBody();\n }\n\n this.dispatchPageChange();\n }\n\n @dispatch('page-change', { bubbles: true, composed: true })\n private dispatchPageChange() {\n return {\n page: this.currentPage,\n pageSize: this.pageSize,\n totalPages: this.totalPages,\n totalItems: this.paginationTotal()\n };\n }\n\n renderPagination() {\n const container = this.shadowRoot?.querySelector('.table-pagination-container');\n if (!container) return;\n\n if (!this.pagination) {\n container.innerHTML = '';\n return;\n }\n\n const total = this.paginationTotal();\n const totalPages = this.totalPages;\n const start = Math.min((this.currentPage - 1) * this.pageSize + 1, total);\n const end = Math.min(this.currentPage * this.pageSize, total);\n\n // Build page buttons\n const pageButtons: string[] = [];\n const maxVisible = 7;\n\n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) {\n pageButtons.push(this.pageButton(i));\n }\n } else {\n pageButtons.push(this.pageButton(1));\n if (this.currentPage > 3) pageButtons.push('<span class=\"pagination__ellipsis\">…</span>');\n\n const rangeStart = Math.max(2, this.currentPage - 1);\n const rangeEnd = Math.min(totalPages - 1, this.currentPage + 1);\n for (let i = rangeStart; i <= rangeEnd; i++) {\n pageButtons.push(this.pageButton(i));\n }\n\n if (this.currentPage < totalPages - 2) pageButtons.push('<span class=\"pagination__ellipsis\">…</span>');\n pageButtons.push(this.pageButton(totalPages));\n }\n\n container.innerHTML = '';\n\n const pagination = document.createElement('div');\n pagination.className = 'pagination';\n pagination.setAttribute('part', 'pagination');\n\n // Info\n const info = document.createElement('div');\n info.className = 'pagination__info';\n info.textContent = `Showing ${start}\\u2013${end} of ${total}`;\n pagination.appendChild(info);\n\n // Controls\n const controls = document.createElement('div');\n controls.className = 'pagination__controls';\n controls.innerHTML = `\n <button class=\"pagination__btn pagination__first\" ${this.currentPage <= 1 ? 'disabled' : ''} data-page=\"1\" aria-label=\"First page\">\\u27E8\\u27E8</button>\n <button class=\"pagination__btn pagination__prev\" ${this.currentPage <= 1 ? 'disabled' : ''} data-page=\"${this.currentPage - 1}\" aria-label=\"Previous page\">\\u27E8</button>\n ${pageButtons.join('')}\n <button class=\"pagination__btn pagination__next\" ${this.currentPage >= totalPages ? 'disabled' : ''} data-page=\"${this.currentPage + 1}\" aria-label=\"Next page\">\\u27E9</button>\n <button class=\"pagination__btn pagination__last\" ${this.currentPage >= totalPages ? 'disabled' : ''} data-page=\"${totalPages}\" aria-label=\"Last page\">\\u27E9\\u27E9</button>\n `;\n pagination.appendChild(controls);\n\n // Page size selector — use snice-select\n const sizeContainer = document.createElement('div');\n sizeContainer.className = 'pagination__size';\n const sizeLabel = document.createElement('label');\n sizeLabel.textContent = 'Rows per page:';\n sizeContainer.appendChild(sizeLabel);\n\n const sizeSelect = document.createElement('snice-select') as any;\n sizeSelect.size = 'small';\n sizeSelect.className = 'pagination__size-select';\n // Always include the CURRENT pageSize: when it isn't in pageSizes (e.g.\n // pageSize=5 with the default list) no option matches the value and the\n // select shows its placeholder instead of the active size.\n const sizeOptions = this.pageSizes.includes(this.pageSize)\n ? this.pageSizes\n : [...this.pageSizes, this.pageSize].sort((a, b) => a - b);\n for (const s of sizeOptions) {\n const opt = document.createElement('snice-option') as any;\n opt.setAttribute('value', String(s));\n opt.textContent = String(s);\n if (s === this.pageSize) opt.setAttribute('selected', '');\n sizeSelect.appendChild(opt);\n }\n sizeSelect.value = String(this.pageSize);\n sizeContainer.appendChild(sizeSelect);\n pagination.appendChild(sizeContainer);\n\n container.appendChild(pagination);\n\n // Bind page button events\n controls.querySelectorAll('[data-page]').forEach(btn => {\n btn.addEventListener('click', () => {\n const page = parseInt((btn as HTMLElement).getAttribute('data-page')!);\n this.goToPage(page);\n });\n });\n\n // Bind size select event\n sizeSelect.addEventListener('select-change', (e: CustomEvent) => {\n this.setPageSize(parseInt(e.detail.value));\n });\n }\n\n private pageButton(page: number): string {\n const active = page === this.currentPage ? ' pagination__btn--active' : '';\n return `<button class=\"pagination__btn pagination__page${active}\" data-page=\"${page}\">${page}</button>`;\n }\n\n /**\n * The column's display text, or null when the column declares no display\n * formatter. `formatter` (row-aware) is the display formatter and\n * `valueFormatter` its documented fallback, so `formatter` wins.\n */\n private cellDisplayText(column: any, value: any, row?: any): string | null {\n const formatter = column.formatter || column.valueFormatter;\n return formatter ? String(formatter(value, row) ?? '') : null;\n }\n\n /** Create a cell element safely using createElement + setAttribute */\n createCellElement(column: any, value: any, row?: any): HTMLElement {\n // E2: a custom renderCell bypasses the type-based cell entirely. A string\n // result is set via textContent (never innerHTML — no HTML parsing / XSS);\n // an HTMLElement is used as-is.\n if (typeof column.renderCell === 'function') {\n const rendered = column.renderCell(value, row, column);\n if (rendered instanceof HTMLElement) return rendered;\n const span = document.createElement('span');\n span.className = 'custom-cell';\n span.textContent = rendered == null ? '' : String(rendered);\n return span;\n }\n\n const tagName = this.getCellTagName(column.type);\n const el = document.createElement(tagName) as any;\n\n // Base attributes. Only force `align` if the column definition specifies\n // one; otherwise let the cell pick its type-appropriate default (numbers\n // right, rating/boolean center, text left). Hard-coding 'left' here fought\n // the cell's own type-based text-align and made number values drift.\n el.setAttribute('type', column.type || 'text');\n if (column.align) el.setAttribute('align', column.align);\n el.setAttribute('in-table', 'true');\n\n // A declared display formatter makes the cell's value its DISPLAY text:\n // the pipeline (valueGetter -> formatter, valueFormatter as the fallback)\n // is resolved here, once, so the `value` channel a caller reads is what the\n // cell actually shows. The cell is marked `formatted` and handed a column\n // without the formatters, which keeps it from formatting again and tells\n // the shared presentation contract to paint the text over any type-specific\n // rendering (a rating/progress/link cell cannot render display text).\n const displayText = this.cellDisplayText(column, value, row);\n const cellColumn = displayText === null\n ? column\n : { ...column, formatter: undefined, valueFormatter: undefined };\n\n // Set the property directly so arrays/objects reach progress, sparkline,\n // JSON, action, and tag cells without a lossy attribute conversion. Keep a\n // primitive attribute for declarative inspection and CSS selectors.\n if (displayText !== null) {\n el.setAttribute('formatted', '');\n el.value = displayText;\n el.setAttribute('value', displayText);\n } else if (column.type === 'sparkline' && value !== null && typeof value === 'object') {\n el.setAttribute('value', JSON.stringify(value));\n if (Array.isArray(value)) el.data = value;\n } else {\n el.value = value ?? '';\n if (value === null || typeof value !== 'object') {\n el.setAttribute('value', String(value ?? ''));\n }\n }\n\n // Column definition as property (for formatter access etc.)\n el.column = cellColumn;\n // Row-aware formatters, conditional formatting, and action-cell events all\n // consume the originating row through the cell's property API.\n el.rowData = row ?? null;\n\n // Type-specific attributes\n switch (column.type) {\n case 'number':\n case 'currency': {\n if (column.decimals !== undefined) el.setAttribute('decimals', String(column.decimals));\n if (column.thousandsSeparator) el.setAttribute('thousands-separator', 'true');\n if (column.prefix) el.setAttribute('prefix', column.prefix);\n if (column.suffix) el.setAttribute('suffix', column.suffix);\n if (column.type === 'currency') {\n const cf = column.currencyFormat;\n if (cf) {\n if (cf.currency) el.setAttribute('currency', cf.currency);\n if (cf.locale) el.setAttribute('locale', cf.locale);\n if (cf.display || cf.currencyDisplay) {\n el.setAttribute('currencydisplay', cf.currencyDisplay || cf.display);\n }\n if (cf.decimals !== undefined) el.setAttribute('decimals', String(cf.decimals));\n if (cf.thousandsSeparator === false) el.thousandsSeparator = false;\n }\n }\n break;\n }\n case 'date':\n if (column.dateFormat) el.setAttribute('date-format', column.dateFormat);\n break;\n case 'boolean':\n if (column.useSymbols) el.setAttribute('use-symbols', 'true');\n if (column.trueSymbol) el.setAttribute('true-symbol', column.trueSymbol);\n if (column.falseSymbol) el.setAttribute('false-symbol', column.falseSymbol);\n if (column.trueValue) el.setAttribute('true-value', column.trueValue);\n if (column.falseValue) el.setAttribute('false-value', column.falseValue);\n break;\n case 'sparkline': {\n const sf = column.sparklineFormat;\n if (sf) {\n if (sf.color) el.setAttribute('color', sf.color);\n if (sf.type) el.setAttribute('chart-type', sf.type);\n if (sf.width) el.setAttribute('width', String(sf.width));\n if (sf.height) el.setAttribute('height', String(sf.height));\n }\n break;\n }\n case 'rating': {\n const rf = column.ratingFormat;\n if (rf) {\n if (rf.max) el.setAttribute('max', String(rf.max));\n if (rf.color) el.setAttribute('color', rf.color);\n }\n break;\n }\n case 'progress': {\n const pf = column.progressFormat;\n if (pf) {\n if (pf.max) el.setAttribute('max', String(pf.max));\n if (pf.color) el.setAttribute('color', pf.color);\n if (pf.showPercentage) el.setAttribute('show-percentage', 'true');\n }\n break;\n }\n case 'percentage':\n case 'percent': {\n const pf = column.percentageFormat;\n if (pf) {\n if (pf.decimals !== undefined) el.setAttribute('decimals', String(pf.decimals));\n if (pf.colorize) el.setAttribute('colorize', 'true');\n }\n break;\n }\n case 'status': {\n const sf = column.statusFormat;\n if (sf) {\n if (sf.variant) el.setAttribute('variant', sf.variant);\n if (sf.showDot) el.setAttribute('show-dot', 'true');\n }\n break;\n }\n case 'link': {\n const lf = column.linkFormat;\n if (lf) {\n if (lf.target) el.setAttribute('target', lf.target);\n if (lf.external) el.setAttribute('external', 'true');\n }\n break;\n }\n case 'image': {\n const imf = column.imageFormat;\n if (imf) {\n if (imf.shape) el.setAttribute('shape', imf.shape);\n if (imf.size) el.setAttribute('size', imf.size);\n }\n break;\n }\n case 'color': {\n const cf = column.colorFormat;\n if (cf) {\n if (cf.showSwatch !== false) el.setAttribute('show-swatch', 'true');\n if (cf.displayFormat) el.setAttribute('display-format', cf.displayFormat);\n }\n break;\n }\n case 'email': {\n const ef = column.emailFormat;\n if (ef) {\n if (ef.showIcon) el.setAttribute('show-icon', 'true');\n }\n break;\n }\n case 'phone': {\n const pf = column.phoneFormat;\n if (pf) {\n if (pf.showIcon) el.setAttribute('show-icon', 'true');\n if (pf.format) el.setAttribute('format', 'true');\n }\n break;\n }\n }\n\n return el;\n }\n\n getCellTagName(type: string): string {\n switch (type) {\n case 'text':\n return 'snice-cell-text';\n case 'number':\n return 'snice-cell-number';\n case 'currency':\n return 'snice-cell-currency';\n case 'date':\n return 'snice-cell-date';\n case 'boolean':\n return 'snice-cell-boolean';\n case 'rating':\n return 'snice-cell-rating';\n case 'progress':\n return 'snice-cell-progress';\n case 'duration':\n return 'snice-cell-duration';\n case 'filesize':\n return 'snice-cell-filesize';\n case 'sparkline':\n return 'snice-cell-sparkline';\n case 'image':\n return 'snice-cell-image';\n case 'percentage':\n case 'percent':\n return 'snice-cell-percentage';\n case 'tag':\n return 'snice-cell-tag';\n case 'status':\n return 'snice-cell-status';\n case 'actions':\n return 'snice-cell-actions';\n case 'link':\n return 'snice-cell-link';\n case 'email':\n return 'snice-cell-email';\n case 'phone':\n return 'snice-cell-phone';\n case 'color':\n return 'snice-cell-color';\n case 'location':\n return 'snice-cell-location';\n case 'json':\n return 'snice-cell-json';\n default:\n return 'snice-cell';\n }\n }\n\n private fsExitHandler: (() => void) | null = null;\n\n toggleFullscreen = async () => {\n const isFullscreen = this.classList.contains('table-fullscreen');\n if (isFullscreen) {\n this.classList.remove('table-fullscreen');\n if (document.fullscreenElement === this) {\n try { await document.exitFullscreen(); } catch { /* already exited */ }\n }\n if (this.fsExitHandler) {\n document.removeEventListener('fullscreenchange', this.fsExitHandler);\n this.fsExitHandler = null;\n }\n } else {\n this.classList.add('table-fullscreen');\n // Use the platform Fullscreen API — escapes the page's stacking context\n // (the showcase header has backdrop-filter which fights CSS-only overlays)\n // and gives the user the browser's native Esc-to-exit affordance.\n try {\n if (typeof this.requestFullscreen === 'function') {\n await this.requestFullscreen();\n }\n } catch {\n // Browser blocked it (e.g. not from a user gesture) — fall back to CSS.\n }\n // Sync class with the browser's fullscreen state\n this.fsExitHandler = () => {\n if (document.fullscreenElement !== this) {\n this.classList.remove('table-fullscreen');\n if (this.fsExitHandler) {\n document.removeEventListener('fullscreenchange', this.fsExitHandler);\n this.fsExitHandler = null;\n }\n }\n };\n document.addEventListener('fullscreenchange', this.fsExitHandler);\n }\n }\n\n private handleKeydown = (e: KeyboardEvent) => {\n if (e.key !== 'Enter' && e.key !== ' ') return;\n\n const th = (e.target as HTMLElement).closest('th.sortable') as HTMLElement | null;\n if (!th) return;\n\n const columnKey = th.getAttribute('data-key');\n if (!columnKey) return;\n\n e.preventDefault();\n this.toggleSort(columnKey, true);\n };\n\n private handleClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n\n // Handle sortable header click — every click adds/cycles in multi-sort.\n const th = target.closest('th.sortable') as HTMLElement;\n if (th) {\n const columnKey = th.getAttribute('data-key');\n if (columnKey) {\n this.toggleSort(columnKey, true);\n }\n return;\n }\n\n // Handle row click\n const tr = target.closest('tbody tr') as HTMLElement;\n if (tr) {\n // Group rows have no data-index. Route the whole header cell (including\n // its chevron) through the table's one Snice-bound click handler so the\n // model toggles once and @dispatch emits from the host. Checkbox clicks\n // are handled by handleChange and must not also collapse the group.\n if (tr.classList.contains('group-header-row')) {\n if (target.closest('snice-checkbox.group-select')) return;\n const key = tr.getAttribute('data-group-key');\n const group = key\n ? this.getGroupingItems().find(\n (item): item is GroupRow => item.type === 'group' && item.key === key\n )\n : undefined;\n if (group) this.toggleGroup(group);\n return;\n }\n\n // Aggregate, spacer, loading, error, and empty-state rows are structural\n // rows, not row zero. Ignoring them prevents phantom selection/click\n // events caused by parseInt(null || '0').\n if (!tr.hasAttribute('data-index')) return;\n\n // Don't trigger if clicking on checkbox or other interactive elements\n if (target.matches('input[type=\"checkbox\"], button, a, .interactive, snice-checkbox, snice-button, snice-input, snice-select')) {\n return;\n }\n\n const rowIndex = parseInt(tr.getAttribute('data-index') || '0');\n const rowData = this.data[rowIndex];\n\n // Handle row selection if selectable. selectionMode + modifier intent\n // (ctrl/meta = additive toggle, shift = range) resolved in one place.\n if (this.selectable) {\n this.applyRowSelection(rowIndex, {\n additive: e.ctrlKey || e.metaKey,\n range: e.shiftKey,\n });\n }\n\n // Handle clickable row event\n if (this.clickable) {\n this.dispatchRowClicked(rowData, rowIndex);\n }\n }\n }\n\n private handleChange = (e: Event) => {\n const target = e.target as HTMLElement;\n\n // Handle snice-checkbox events (row-select and select-all)\n if (target.matches('snice-checkbox.row-select')) {\n const checkbox = target as any;\n const rowIndex = parseInt(checkbox.getAttribute('data-row-index') || '0');\n\n if (this.selectionMode === 'none') return;\n if (this.selectabilityCheck && !this.selectabilityCheck(this.data[rowIndex], rowIndex)) {\n checkbox.checked = this.selectedRows.includes(rowIndex);\n return;\n }\n\n if (this.selectionMode === 'single') {\n this.selectedRows = checkbox.checked ? [rowIndex] : [];\n } else if (checkbox.checked) {\n if (!this.selectedRows.includes(rowIndex)) {\n this.selectedRows = [...this.selectedRows, rowIndex];\n }\n } else {\n this.selectedRows = this.selectedRows.filter(i => i !== rowIndex);\n }\n this.selectionAnchor = this.data[rowIndex];\n\n // DOM update happens in the selectedRows @watch (delta, one row).\n this.dispatchRowSelectionChanged(rowIndex, checkbox.checked);\n this.dispatchSelectionChanged();\n return;\n }\n\n // F: a group-header checkbox selects/deselects all rows in that group.\n if (target.matches('snice-checkbox.group-select')) {\n const checkbox = target as any;\n if (this.selectionMode !== 'multiple') return;\n\n const key = checkbox.getAttribute('data-group-key');\n const group = this.getGroupingItems().find(\n (it): it is GroupRow => it.type === 'group' && it.key === key\n );\n if (!group) return;\n\n const indices = this.getSelectableGroupIndices(group);\n if (checkbox.checked) {\n this.selectedRows = Array.from(new Set([...this.selectedRows, ...indices]));\n } else {\n const remove = new Set(indices);\n this.selectedRows = this.selectedRows.filter((i) => !remove.has(i));\n }\n\n // Row DOM + group/header checkboxes update in the selectedRows @watch.\n this.dispatchSelectionChanged();\n return;\n }\n\n if (target.matches('snice-checkbox.select-all')) {\n const checkbox = target as any;\n\n // Select-all only carries meaning in multiple mode.\n if (this.selectionMode !== 'multiple') return;\n\n if (checkbox.checked) {\n // Select only filtered/displayed rows, not all data\n this.selectedRows = this.getSelectableIndices(this.getFilteredData());\n } else {\n this.selectedRows = [];\n }\n\n // Row DOM + header checkbox update in the selectedRows @watch.\n this.dispatchSelectAllChanged(checkbox.checked);\n this.dispatchSelectionChanged();\n }\n }\n\n private onAttached = () => {\n // A controller attached. Only fetch if the user explicitly declared\n // remote mode (mode=\"remote\" on the element, or set programmatically).\n // Local mode is the default and means the table owns its dataset.\n if (this.mode !== 'remote') return;\n this.getTableConfig();\n this.getTableData();\n }\n\n private searchDebounceTimeout: any = null;\n\n private handleSearchInput = (e: Event) => {\n const target = e.target as HTMLElement;\n const input = target as HTMLInputElement;\n this.searchText = input.value;\n\n // Manual debounce implementation\n if (this.searchDebounceTimeout) {\n clearTimeout(this.searchDebounceTimeout);\n }\n this.searchDebounceTimeout = setTimeout(() => {\n if (this.mode === 'remote') this.getTableData();\n else this.setQuickFilter(this.searchText);\n }, this.searchDebounce);\n }\n\n private handleQuickFilterInput = (e: Event) => {\n const input = e.target as HTMLInputElement;\n if (this.filterInputDebounceTimeout) clearTimeout(this.filterInputDebounceTimeout);\n this.filterInputDebounceTimeout = setTimeout(() => {\n this.filterInputDebounceTimeout = null;\n this.setQuickFilter(input.value || '');\n }, SniceTable.FILTER_INPUT_DEBOUNCE_MS);\n }\n\n private selectorDebounceTimeout: any = null;\n\n private handleSelectorChange = (e: CustomEvent) => {\n this.selector = Array.isArray(e.detail.value) ? e.detail.value.join(',') : e.detail.value;\n\n // Manual debounce implementation\n if (this.selectorDebounceTimeout) {\n clearTimeout(this.selectorDebounceTimeout);\n }\n this.selectorDebounceTimeout = setTimeout(() => {\n this.debouncedDataRequest();\n }, 150);\n }\n\n\n // A2: full sweep — kept for external/programmatic callers and post-render\n // resync. NOT on the single-toggle path (that goes through the delta in\n // handleSelectedRowsChange → updateRowSelectionStateFor).\n updateRowSelectionState() {\n if (!this.tbody) return;\n\n const rows = this.tbody.querySelectorAll('tr');\n rows.forEach((row, index) => {\n const isSelected = this.selectedRows.includes(index);\n row.setAttribute('data-selected', String(isSelected));\n\n const checkbox = row.querySelector('snice-checkbox.row-select') as any;\n if (checkbox) {\n checkbox.checked = isSelected;\n }\n });\n }\n\n // A2: reflect one row's selection into the DOM (located by data-index). The\n // reconciler (Task B) re-stamps data-index on moved rows, so this stays\n // correct after reorder. No-op if the row isn't in the current window.\n private updateRowSelectionStateFor(index: number, isSelected: boolean) {\n if (!this.tbody) return;\n const row = this.tbody.querySelector(`tr[data-index=\"${index}\"]`) as HTMLElement | null;\n if (!row) return;\n row.setAttribute('data-selected', String(isSelected));\n const checkbox = row.querySelector('snice-checkbox.row-select') as any;\n if (checkbox) checkbox.checked = isSelected;\n }\n\n updateSelectAllState() {\n const selectAllCheckbox = this.thead?.querySelector('snice-checkbox.select-all') as any;\n if (!selectAllCheckbox) return;\n\n const filteredIndices = this.getSelectableIndices(this.getFilteredData());\n const selectedInFiltered = filteredIndices.filter(i => this.selectedRows.includes(i));\n const allSelected = selectedInFiltered.length === filteredIndices.length && filteredIndices.length > 0;\n const someSelected = selectedInFiltered.length > 0 && selectedInFiltered.length < filteredIndices.length;\n\n selectAllCheckbox.checked = allSelected;\n selectAllCheckbox.indeterminate = someSelected;\n }\n\n toggleSort(columnKey: string, multiSort: boolean = false) {\n if (!multiSort) {\n // Single column sort - clear all other sorts\n const existingSort = this.currentSort.find(s => s.column === columnKey);\n\n if (!existingSort) {\n this.currentSort = [{ column: columnKey, direction: 'asc' }];\n } else if (existingSort.direction === 'asc') {\n this.currentSort = [{ column: columnKey, direction: 'desc' }];\n } else {\n this.currentSort = [];\n }\n } else {\n // Multi column sort - modify existing or add new\n const existingSortIndex = this.currentSort.findIndex(s => s.column === columnKey);\n\n if (existingSortIndex === -1) {\n // Add new sort\n this.currentSort = [...this.currentSort, { column: columnKey, direction: 'asc' }];\n } else {\n const existingSort = this.currentSort[existingSortIndex];\n if (existingSort.direction === 'asc') {\n // Change to desc - create new array to trigger reactivity\n this.currentSort = this.currentSort.map((sort, index) =>\n index === existingSortIndex ? { ...sort, direction: 'desc' as const } : sort\n );\n } else {\n // Remove this sort\n this.currentSort = this.currentSort.filter(s => s.column !== columnKey);\n }\n }\n }\n\n this.renderHeader();\n this.dispatchSortChange();\n if (this.mode === 'remote') {\n this.debouncedDataRequest();\n } else {\n this.sortLocalData();\n }\n }\n\n /**\n * Reorder `this.data` to the current client-side sort (or back to delivery\n * order when the sort was cleared). Split out of sortLocalData so a fresh\n * delivery can land sorted without re-entering the render/index bookkeeping.\n */\n private applyLocalSortOrder() {\n if (!this.unsortedData.length) {\n this.unsortedData = [...this.data];\n }\n // C1: bracket the reassignment so the data @watch does NOT treat this\n // re-sorted view as a new dataset (would clobber unsortedData + double-render).\n this.settingSortedData = true;\n if (this.currentSort.length === 0) {\n this.data = [...this.unsortedData];\n } else {\n this.data = [...this.unsortedData].sort((a, b) => {\n for (const { column, direction } of this.currentSort) {\n const colDef = this.columns.find(c => c.key === column);\n const customComparator = (colDef as any)?.sortComparator;\n // The value pipeline feeds BOTH sort paths: valueGetter \"runs for\n // display, sort, aggregation\", so a custom comparator sees the same\n // derived value the cell shows (remote columns routinely key on the\n // server's sort field and bridge the display with a getter).\n const aVal = colDef?.valueGetter ? colDef.valueGetter(a[column], a) : a[column];\n const bVal = colDef?.valueGetter ? colDef.valueGetter(b[column], b) : b[column];\n\n if (customComparator) {\n const cmp = customComparator(aVal, bVal, direction);\n if (cmp !== 0) return cmp;\n } else {\n const cmp = String(aVal ?? '').localeCompare(String(bVal ?? ''), undefined, { numeric: true });\n if (cmp !== 0) return direction === 'asc' ? cmp : -cmp;\n }\n }\n return 0;\n });\n }\n this.settingSortedData = false;\n }\n\n private sortLocalData() {\n this.applyLocalSortOrder();\n // Sort replaced this.data (new order + reference) — resync the row-index\n // map and drop the stale filtered snapshot before re-rendering. Render is\n // queued (not synchronous): sortLocalData is reachable from the currentSort\n // setter stack via handleControlledSort, and cells must never construct there.\n this.rebuildRowIndex();\n this.scheduleRender('body');\n }\n\n @dispatch('table-row-selection-changed', { bubbles: true, composed: true })\n private dispatchRowSelectionChanged(rowIndex: number, selected: boolean) {\n return {\n selectedRows: this.selectedRows,\n rowIndex,\n selected\n };\n }\n\n @dispatch('row-clicked', { bubbles: true, composed: true })\n private dispatchRowClicked(rowData: any, rowIndex: number) {\n return { rowData, rowIndex };\n }\n\n @dispatch('table-load-error', { bubbles: true, composed: true })\n private dispatchLoadError(error: unknown) {\n return { error };\n }\n\n @dispatch('table-select-all-changed', { bubbles: true, composed: true })\n private dispatchSelectAllChanged(allSelected: boolean) {\n return {\n selectedRows: this.selectedRows,\n allSelected\n };\n }\n\n // E1: unified selection event, emitted alongside the two legacy events on\n // every user-driven selection change. `rows` are the current row objects.\n @dispatch('selection-changed', { bubbles: true, composed: true })\n private dispatchSelectionChanged() {\n return {\n selectedRows: this.selectedRows,\n rows: this.getSelectedData(),\n };\n }\n\n @dispatch('sort-change', { bubbles: true, composed: true })\n private dispatchSortChange() {\n return { sort: this.currentSort };\n }\n\n @dispatch('filter-change', { bubbles: true, composed: true })\n private dispatchFilterChange() {\n return { filters: this.filterEngine.getFilterModel() };\n }\n\n @dispatch('column-visibility-change', { bubbles: true, composed: true })\n private dispatchColumnVisibilityChange(key: string, visible: boolean) {\n return { key, visible, visibility: this.columnManager.getVisibilityModel() };\n }\n\n @dispatch('column-pin-change', { bubbles: true, composed: true })\n private dispatchColumnPinChange(key: string, pinned: 'left' | 'right' | false) {\n return { key, pinned };\n }\n\n @dispatch('column-order-change', { bubbles: true, composed: true })\n private dispatchColumnOrderChange(key: string, toIndex: number) {\n return { key, toIndex };\n }\n\n @dispatch('density-change', { bubbles: true, composed: true })\n private dispatchDensityChange() {\n return { density: this.density };\n }\n\n // ── Module Integration: Initialize ──\n\n private initializeModules() {\n // Column manager\n this.columnManager.initialize(this.columns, this);\n\n // Editor\n this.setupEditor();\n\n // Keyboard\n if (this.shadowRoot) {\n this.keyboard.attach({\n shadowRoot: this.shadowRoot,\n // Keyboard order follows the rows users can actually focus. In grouped\n // mode this excludes group/aggregate rows and collapsed descendants;\n // callbacks below translate that navigation position back to the raw\n // data index expected by selection/editing APIs.\n totalRows: () => this.getKeyboardRows().length,\n ariaRows: () => this.usesGroupingDisplayModel()\n ? this.getDisplayedGroupingItems().length\n : (this.treeData.isEnabled()\n ? this.getTreeDisplayRows(true).length\n : this.getKeyboardRows().length),\n ariaRowOffset: () => this.virtualize && this.virtualizer.isEnabled()\n ? Math.max(0, this.virtualizer.getVisibleRange().start)\n : 0,\n // Use the actual main-header width: tool columns add grid cells and\n // hidden data columns remove them. Raw columns.length made keyboard\n // navigation stop early or point at nonexistent cells.\n totalColumns: () => this.getKeyboardColumnCount(),\n tabMode: 'all',\n isEditing: () => this.editor.isEditing(),\n getRowElement: (rowIndex) => this.getKeyboardRowElement(rowIndex),\n ensureRowVisible: (rowIndex) => this.ensureKeyboardRowRendered(rowIndex),\n onCellActivate: (row, col) => {\n const dataIndex = this.getKeyboardDataIndex(row);\n if (this.editable && dataIndex >= 0 && col) this.startEdit(dataIndex, col);\n },\n onSelectionToggle: (row) => {\n const dataIndex = this.getKeyboardDataIndex(row);\n if (this.selectable && dataIndex >= 0) this.toggleRowSelection(dataIndex);\n },\n onSelectAll: () => {\n if (this.selectable) this.selectAllRows();\n },\n });\n }\n }\n\n @dispose()\n cleanup() {\n this.virtualizer.detach();\n this.keyboard.detach();\n if (this.lazyLoadHandler) this.lazyLoadContainer?.removeEventListener('scroll', this.lazyLoadHandler);\n this.lazyLoadHandler = null;\n this.lazyLoadContainer = null;\n this.rowDnD.detach();\n this.columnDnD.detach();\n }\n\n // ── Virtualization API ──\n\n /**\n * The element that actually scrolls. `.table-frame` owns `overflow: auto`\n * in the live styles — attaching scroll listeners to `.snice-table` works\n * in happy-dom (no layout) but never fires in a real browser.\n */\n private getScrollContainer(): HTMLElement | null {\n return (this.shadowRoot?.querySelector('.table-frame') ??\n this.shadowRoot?.querySelector('.snice-table')) as HTMLElement | null;\n }\n\n private setupVirtualization() {\n if (!this.virtualize || !this.shadowRoot || !this.tbody) return;\n\n const scrollContainer = this.getScrollContainer();\n if (!scrollContainer) return;\n\n this.virtualRowsSnapshot = this.getVirtualRows();\n this.virtualizer.attach({\n rowHeight: (displayIndex) => this.getVirtualRowHeight(displayIndex),\n bufferPx: this.virtualBuffer,\n totalRows: this.virtualRowsSnapshot.length,\n scrollContainer,\n renderRange: (start, end) => this.renderRowRange(start, end),\n // Pinned rows live outside the windowed range so they are always present,\n // exactly like the non-virtual path (renderBody).\n renderPinnedTop: () => this.renderPinnedRows(this.pinnedTopRows, 'top'),\n renderPinnedBottom: () => this.renderPinnedRows(this.pinnedBottomRows, 'bottom'),\n // Scroll-driven windows bypass renderBody; restore grid roles, logical\n // row indices, and roving focus after every inserted range.\n afterRender: () => this.keyboard.refresh(),\n });\n }\n\n private getVirtualRowHeight(displayIndex: number): number {\n const entry = this.virtualRowsSnapshot[displayIndex];\n if (!entry || (entry.groupItem && entry.groupItem.type !== 'row')) return this.rowHeight;\n const dataIndex = entry.groupItem ? this.indexOfRow(entry.data) : entry.index;\n const base = this.rowHeightCallback\n ? this.rowHeightCallback(entry.data, dataIndex)\n : this.rowHeight;\n return base + this.masterDetail.getFixedAdditionalHeight(dataIndex);\n }\n\n /**\n * The feature-aware row list the virtualizer windows over. In tree-data mode\n * this is the FLATTENED visible tree (so expand/collapse works while\n * virtualized); otherwise it is the filtered data. Each descriptor carries\n * the logical index used for `data-index`, selection, and detail lookups.\n */\n private getVirtualRows(): Array<{ data: any; index: number; treeRow?: TreeRow; groupItem?: DisplayItem }> {\n const filtered = this.getFilteredData();\n // F: the flattened group+row+aggregate list is the virtual model when\n // grouping/aggregation is on — same pattern as tree data. Group/aggregate\n // rows carry no data index; data rows key off their index in `this.data`.\n if (this.usesGroupingDisplayModel()) {\n return this.getDisplayedGroupingItems().map((groupItem, i) => ({\n data: groupItem.type === 'row' ? groupItem.data : undefined,\n index: i,\n groupItem,\n }));\n }\n if (this.treeData.isEnabled()) {\n return this.getTreeDisplayRows(true);\n }\n return filtered.map((data) => ({ data, index: this.indexOfRow(data) }));\n }\n\n private renderRowRange(startIndex: number, endIndex: number): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const rows = this.virtualRowsSnapshot.length > 0\n ? this.virtualRowsSnapshot\n : this.getVirtualRows();\n\n const extraCols =\n (this.hasSelectionColumn() ? 1 : 0) +\n (this.masterDetail.isEnabled() ? 1 : 0) +\n (this.rowReorder && this.rowDnD.isEnabled() ? 1 : 0);\n const managedColumns = this.columnManager.getAllStates();\n const visibleColumnCount = managedColumns.length > 0\n ? this.columnManager.getVisibleColumns().length\n : this.columns.length;\n const totalColSpan = visibleColumnCount + extraCols;\n const structuralSig = this.computeStructuralSig();\n\n // Task B: recycle rows that stay in the window across a scroll shift. A row\n // still visible after scrolling keeps its data-object key and signature, so\n // it is MOVED into the freshly built fragment (appendChild detaches it from\n // the live tbody) instead of reconstructed. The virtualizer wipes the tbody\n // AFTER we build this fragment — reused rows are already parked in the\n // fragment by then, so the wipe only clears departed rows and the spacers.\n // Net cost of a small scroll: a few createRow calls for the entering rows.\n const next = new Map<unknown, { el: HTMLElement; sig: string }>();\n const used = new Set<HTMLElement>();\n\n for (let i = startIndex; i < endIndex && i < rows.length; i++) {\n const { data, index, treeRow, groupItem } = rows[i];\n\n // F: group + aggregate rows are rebuilt each window (few, always fresh),\n // keyed by their synthetic key so the reconciler places them correctly.\n if (groupItem && groupItem.type !== 'row') {\n const el = groupItem.type === 'group'\n ? this.createGroupRow(groupItem, totalColSpan)\n : this.createAggregateRow(groupItem, totalColSpan);\n used.add(el);\n if (!next.has(groupItem.key)) next.set(groupItem.key, { el, sig: 'grouprow' });\n fragment.appendChild(el);\n continue;\n }\n\n // F: a grouped data row's logical index is its index in `this.data`.\n const dataIndex = groupItem ? this.indexOfRow(data) : index;\n const editing = this.isRowEditing(dataIndex);\n // Edit marker: see renderBody. Ensures leaving edit state rebuilds the row.\n const sig = this.rowSignature(data, dataIndex, structuralSig, treeRow) + (editing ? '|edit' : '');\n const prev = this.renderedRows.get(data);\n let tr: HTMLElement;\n\n if (prev && !used.has(prev.el) && !editing && prev.sig === sig) {\n tr = prev.el;\n this.restampRowIndex(tr, dataIndex);\n } else {\n tr = this.createRow(data, dataIndex, treeRow);\n }\n\n used.add(tr);\n if (!next.has(data)) next.set(data, { el: tr, sig });\n fragment.appendChild(tr);\n\n // Master-detail: render the expanded detail row in-window. The detail\n // A fixed detailHeight participates in virtual spacer math through\n // getVirtualRowHeight. Auto-height content is still rendered in-window\n // and contributes through normal table layout. Tree rows never carry\n // detail panels, so skip them.\n if (!treeRow && this.masterDetail.isEnabled() && this.masterDetail.isExpanded(dataIndex)) {\n const detailRow = this.masterDetail.createDetailRow(data, dataIndex, totalColSpan);\n if (detailRow) fragment.appendChild(detailRow);\n }\n }\n\n this.renderedRows = next;\n return fragment;\n }\n\n /** Build a fragment of pinned rows for the given position (top/bottom). */\n private renderPinnedRows(rows: any[], position: 'top' | 'bottom'): DocumentFragment {\n const fragment = document.createDocumentFragment();\n for (const row of rows) {\n const tr = this.createRow(row, -1);\n tr.classList.add('pinned-row', position === 'top' ? 'pinned-row--top' : 'pinned-row--bottom');\n fragment.appendChild(tr);\n }\n return fragment;\n }\n\n scrollToRow(index: number) {\n // Public row indices refer to `this.data`; grouped/tree virtualization\n // scrolls a flattened display model containing structural rows as well.\n // Translate through row identity so callers still land on the requested\n // data row rather than an unrelated header/subtotal.\n if (this.usesGroupingDisplayModel() || this.treeData.isEnabled()) {\n const row = this.data[index];\n const displayIndex = this.getVirtualRows().findIndex((entry) => entry.data === row);\n if (displayIndex >= 0) this.virtualizer.scrollToIndex(displayIndex);\n return;\n }\n this.virtualizer.scrollToRow(index);\n }\n\n /** Rows currently reachable by grid keyboard navigation, in display order. */\n private getKeyboardColumnCount(): number {\n const rendered = this.shadowRoot?.querySelectorAll('thead tr.column-header-row > th').length ?? 0;\n if (rendered > 0) return rendered;\n\n const states = this.columnManager.getAllStates();\n const dataColumns = states.length > 0\n ? this.columnManager.getVisibleColumns().length\n : this.columns.length;\n return dataColumns\n + (this.rowReorder && this.rowDnD.isEnabled() ? 1 : 0)\n + (this.masterDetail.isEnabled() ? 1 : 0)\n + (this.hasSelectionColumn() ? 1 : 0);\n }\n\n private getKeyboardRows(): any[] {\n if (this.usesGroupingDisplayModel()) {\n return this.getDisplayedGroupingItems()\n .filter((item): item is Extract<DisplayItem, { type: 'row' }> => item.type === 'row')\n .map((item) => item.data);\n }\n\n if (this.treeData.isEnabled()) {\n return this.getTreeDisplayRows(true)\n .filter((item) => !!item.treeRow)\n .map((item) => item.data);\n }\n\n let rows = this.getFilteredData();\n if (this.pagination && this.paginationMode === 'client') {\n const start = (this.currentPage - 1) * this.pageSize;\n rows = rows.slice(start, start + this.pageSize);\n }\n return rows;\n }\n\n /** Translate a keyboard navigation position to the table's raw data index. */\n private getKeyboardDataIndex(rowIndex: number): number {\n const row = this.getKeyboardRows()[rowIndex];\n return row === undefined ? -1 : this.indexOfRow(row);\n }\n\n private getKeyboardRowElement(rowIndex: number): HTMLElement | null {\n const dataIndex = this.getKeyboardDataIndex(rowIndex);\n if (dataIndex < 0) return null;\n return this.tbody?.querySelector(`tr[data-index=\"${dataIndex}\"]`) as HTMLElement | null;\n }\n\n /**\n * Ensure a keyboard row is in the virtual window. The virtualizer scrolls by\n * flattened display position while keyboard navigation indexes visible data\n * rows, so resolve through the shared virtual row model instead of assuming\n * those two indices are interchangeable.\n */\n private ensureKeyboardRowRendered(rowIndex: number) {\n if (!this.virtualize || !this.virtualizer.isEnabled()) return;\n if (this.getKeyboardRowElement(rowIndex)) return;\n\n const row = this.getKeyboardRows()[rowIndex];\n if (row === undefined) return;\n const displayIndex = this.getVirtualRows().findIndex((entry) => entry.data === row);\n if (displayIndex >= 0) this.virtualizer.scrollToIndex(displayIndex);\n }\n\n getScrollPosition() {\n return this.virtualizer.getScrollPosition();\n }\n\n // ── Filtering API ──\n\n setColumnFilter(column: string, operator: any, value: any) {\n this.filterEngine.setColumnFilter(column, operator, value);\n this.applyClientFilters();\n }\n\n removeColumnFilter(column: string) {\n this.filterEngine.removeColumnFilter(column);\n this.applyClientFilters();\n }\n\n setQuickFilter(text: string) {\n this.filterEngine.setQuickFilter(text);\n this.applyClientFilters();\n }\n\n setFilterModel(model: FilterModel) {\n this.filterEngine.setFilterModel(model);\n this.applyClientFilters();\n }\n\n getFilterModel() {\n return this.filterEngine.getFilterModel();\n }\n\n clearAllFilters() {\n this.filterEngine.clearAllFilters();\n this.applyClientFilters();\n }\n\n private getFilteredData(): any[] {\n // Keep the row-index map + filtered snapshot coherent with the current\n // `this.data` reference (catches a direct `table.data = [...]` assignment).\n this.ensureRowIndex();\n if (this.filteredCache) return this.filteredCache;\n const filteredDataOp = !this.filterEngine.hasActiveFilters()\n ? this.data\n : this.filterEngine.applyFilters(this.data, this.columns);\n this.filteredCache = filteredDataOp;\n return filteredDataOp;\n }\n\n // A1: rebuild the row-object → index map from `this.data`. Call wherever the\n // data array is REPLACED (setData, remote load, sortLocalData) or an element\n // is swapped in place (row-edit commit). First occurrence wins, matching\n // `Array.prototype.indexOf` semantics. Also drops the filtered snapshot,\n // since replacing the data invalidates any previously filtered view.\n private rebuildRowIndex() {\n this.rowIndexMap.clear();\n const rows = this.data;\n for (let i = 0; i < rows.length; i++) {\n if (!this.rowIndexMap.has(rows[i])) this.rowIndexMap.set(rows[i], i);\n }\n this.rowIndexDataRef = rows;\n this.filteredCache = null;\n this.groupingCache = null; // F: derived from the filtered snapshot.\n }\n\n // Rebuild lazily if `this.data` was reassigned out from under the map (plain\n // `table.data = [...]`, used widely by app code and tests, bypasses setData).\n private ensureRowIndex() {\n if (this.rowIndexDataRef !== this.data) this.rebuildRowIndex();\n }\n\n // A1: map lookup replacing `this.data.indexOf(row)`. Same identity semantics\n // (reference equality, -1 when absent).\n private indexOfRow(row: any): number {\n this.ensureRowIndex();\n const idx = this.rowIndexMap.get(row);\n return idx === undefined ? -1 : idx;\n }\n\n // A4: the filtered snapshot must be dropped on every mutation of the model it\n // is derived from. Enumerated invalidation sites:\n // 1. data replacement — rebuildRowIndex() (setData, remote load,\n // sortLocalData) + the ensureRowIndex() ref-check\n // for a direct `table.data = [...]` assignment.\n // 2. in-place row change — cell-edit-commit / row-edit-commit handlers\n // (see @ready initialize()).\n // 3. filter model change — invalidateFilteredCache() below, called from\n // applyClientFilters(); every setQuickFilter /\n // setColumnFilter / setHeaderFilter / setFilterModel\n // / clearAllFilters / removeColumnFilter and the\n // header-filter INPUT path route through it.\n // 4. sort — sortLocalData() replaces this.data (case 1).\n private invalidateFilteredCache() {\n this.filteredCache = null;\n // F: the flattened group list is derived from the filtered snapshot, so any\n // change that drops one drops the other (data/filter/sort/edit).\n this.groupingCache = null;\n }\n\n // F: drop only the flattened group list — expand/collapse and groupBy changes\n // reshape it without touching the filtered snapshot.\n private invalidateGroupingCache() {\n this.groupingCache = null;\n }\n\n // F: the flattened { group | row | aggregate } display list for the current\n // filtered data, cached like filteredCache. setColumns keeps the aggregator\n // set in sync with the live columns before each rebuild.\n private getGroupingItems(): DisplayItem[] {\n if (this.grouping.setColumns(this.columns)) this.invalidateGroupingCache();\n if (this.groupingCache) return this.groupingCache;\n this.groupingCache = this.grouping.processData(this.getFilteredData());\n return this.groupingCache;\n }\n\n /**\n * Row grouping owns the hierarchy whenever groupBy is non-empty. With no\n * groupBy, aggregation normally uses the same flattened row+footer model,\n * except when tree data is active: tree hierarchy stays intact and the table\n * total is appended to that tree model instead.\n */\n private usesGroupingDisplayModel(): boolean {\n return this.grouping.hasGrouping()\n || (this.grouping.hasAggregation() && !this.treeData.isEnabled());\n }\n\n /**\n * Group display items on the active client-side page. This single helper is\n * shared by normal rendering, virtualization, keyboard navigation, and ARIA\n * so combining those features cannot produce four different row models.\n */\n private getDisplayedGroupingItems(): DisplayItem[] {\n const items = this.getGroupingItems();\n if (!this.pagination || this.paginationMode !== 'client') return items;\n\n const totalPages = Math.max(1, Math.ceil(items.length / this.pageSize));\n const page = Math.max(1, Math.min(this.currentPage, totalPages));\n if (page !== this.currentPage) this.currentPage = page;\n const start = (page - 1) * this.pageSize;\n return items.slice(start, start + this.pageSize);\n }\n\n /** Tree rows plus an optional table-total footer, optionally page-sliced. */\n private getTreeDisplayRows(paginate: boolean): Array<{\n data: any;\n index: number;\n treeRow?: TreeRow;\n groupItem?: AggregateRow;\n }> {\n const rows: Array<{ data: any; index: number; treeRow?: TreeRow; groupItem?: AggregateRow }> =\n this.treeData.processData(this.getFilteredData()).map((treeRow) => ({\n data: treeRow.data,\n index: this.indexOfRow(treeRow.data),\n treeRow,\n }));\n\n if (this.grouping.hasAggregation()) {\n const total = this.getGroupingItems().find(\n (item): item is AggregateRow => item.type === 'aggregate' && item.scope === 'table'\n );\n if (total) rows.push({ data: undefined, index: -1, groupItem: total });\n }\n\n if (!paginate || !this.pagination || this.paginationMode !== 'client') return rows;\n const totalPages = Math.max(1, Math.ceil(rows.length / this.pageSize));\n const page = Math.max(1, Math.min(this.currentPage, totalPages));\n if (page !== this.currentPage) this.currentPage = page;\n const start = (page - 1) * this.pageSize;\n return rows.slice(start, start + this.pageSize);\n }\n\n private applyClientFilters() {\n this.invalidateFilteredCache();\n this.dispatchFilterChange();\n if (this.mode === 'remote') {\n // Server-side: send filter params to controller\n this.debouncedDataRequest();\n } else {\n // Client-side: re-render with filtered data\n this.renderBody();\n }\n }\n\n // A3: 150 ms window (matches the remote debounce constant) so a burst of\n // keystrokes into a live filter INPUT collapses into a single re-filter +\n // re-render. Only the INPUT event paths (header-filter inputs) route through\n // here; programmatic API (setQuickFilter/setColumnFilter/...) stays\n // synchronous so callers and tests keep deterministic behavior.\n private static readonly FILTER_INPUT_DEBOUNCE_MS = 150;\n private filterInputDebounceTimeout: any = null;\n\n private debouncedApplyClientFilters() {\n if (this.filterInputDebounceTimeout) clearTimeout(this.filterInputDebounceTimeout);\n this.filterInputDebounceTimeout = setTimeout(() => {\n this.filterInputDebounceTimeout = null;\n this.applyClientFilters();\n }, SniceTable.FILTER_INPUT_DEBOUNCE_MS);\n }\n\n // ── Column API ──\n\n setColumnVisible(key: string, visible: boolean) {\n this.columnManager.setColumnVisible(key, visible);\n this.renderHeader();\n this.renderBody();\n this.dispatchColumnVisibilityChange(key, visible);\n }\n\n showAllColumns() {\n this.columnManager.showAllColumns();\n this.renderHeader();\n this.renderBody();\n }\n\n hideAllColumns() {\n this.columnManager.hideAllColumns();\n this.renderHeader();\n this.renderBody();\n }\n\n getColumnVisibility() {\n return this.columnManager.getVisibilityModel();\n }\n\n pinColumn(key: string, side: 'left' | 'right') {\n this.columnManager.pinColumn(key, side);\n this.renderHeader();\n this.renderBody();\n this.dispatchColumnPinChange(key, side);\n }\n\n unpinColumn(key: string) {\n this.columnManager.unpinColumn(key);\n this.renderHeader();\n this.renderBody();\n this.dispatchColumnPinChange(key, false);\n }\n\n autoSizeColumn(key: string) {\n if (this.tbody) {\n this.columnManager.autoSizeColumn(key, this.tbody);\n this.renderHeader();\n }\n }\n\n autoSizeAllColumns() {\n if (this.tbody) {\n this.columnManager.autoSizeAll(this.tbody);\n this.renderHeader();\n }\n }\n\n moveColumn(key: string, toIndex: number) {\n this.columnManager.moveColumn(key, toIndex);\n this.renderHeader();\n this.renderBody();\n this.dispatchColumnOrderChange(key, toIndex);\n }\n\n // ── Editing API ──\n\n /**\n * Configure the editor from the current columns. Safe to call repeatedly —\n * columns/data are plain fields that can be assigned after @ready ran with an\n * empty set, so this re-syncs editable columns + pipelines before an edit\n * starts rather than trusting the one-time @ready snapshot.\n */\n private setupEditor() {\n if (!this.editable) return;\n\n this.editor.attach(this);\n this.editor.setEditMode(this.editMode);\n const editableCols = this.columns.filter(c => c.editable !== false).map(c => c.key);\n this.editor.setEditableColumns(editableCols);\n\n // Register value pipelines\n for (const col of this.columns) {\n if (col.valueGetter || col.valueFormatter || col.valueParser || col.valueSetter) {\n this.editor.setPipeline(col.key, {\n valueGetter: col.valueGetter,\n valueFormatter: col.valueFormatter,\n valueParser: col.valueParser,\n valueSetter: col.valueSetter,\n });\n }\n }\n }\n\n startEdit(rowIndex: number, columnKey: string) {\n if (!this.editable) return;\n const row = this.data[rowIndex];\n if (!row) return;\n\n // Ensure the editor knows which columns are editable for the current\n // column set (columns may have been assigned after @ready).\n this.setupEditor();\n\n if (this.editMode === 'row') {\n this.editor.startRowEdit(rowIndex, row);\n } else {\n const column = this.columns.find(c => c.key === columnKey);\n const value = row[columnKey];\n this.editor.startCellEdit(rowIndex, columnKey, value, row, column?.editorType ?? column?.type);\n }\n // Re-render the affected row to show the editor, then focus it.\n this.renderBody();\n this.focusActiveEditor();\n }\n\n /** Focus the first rendered editor input (called after renderBody). */\n private focusActiveEditor() {\n const el = this.tbody?.querySelector(\n '.table-editor-input, .table-editor-checkbox, .table-editor-select'\n ) as HTMLElement | null;\n if (!el) return;\n\n el.focus();\n if (el instanceof HTMLInputElement && (el.type === 'text' || el.type === 'number')) {\n try { el.select(); } catch { /* happy-dom may not implement select */ }\n }\n }\n\n async commitEdit(): Promise<string | null> {\n if (this.editMode === 'row') {\n const errors = await this.editor.commitRowEdit();\n this.renderBody();\n return errors ? 'Validation errors' : null;\n } else {\n const error = await this.editor.commitCellEdit();\n this.renderBody();\n return error;\n }\n }\n\n cancelEdit() {\n if (this.editMode === 'row') {\n this.editor.cancelRowEdit();\n } else {\n this.editor.cancelCellEdit();\n }\n this.renderBody();\n }\n\n // ── Export API ──\n\n exportCSV(options?: any) {\n const data = this.getFilteredData();\n const selectedData = options?.selectedOnly\n ? this.getSelectedRowsIn(data)\n : data;\n this.exporter.exportCSV(selectedData, this.columns, options);\n }\n\n printTable(options?: any) {\n this.exporter.print(this, options);\n }\n\n async copyToClipboard(options?: any): Promise<boolean> {\n const filtered = this.getFilteredData();\n const rows = this.selectedRows.length > 0 ? this.getSelectedRowsIn(filtered) : filtered;\n return this.exporter.copyToClipboard(rows, this.columns, options);\n }\n\n /** Resolve raw selection indices against the source data first, then retain\n * only rows present in the current filtered view. Filtered positions are not\n * interchangeable with raw indices. */\n private getSelectedRowsIn(view: any[]): any[] {\n const selected = new Set(this.getSelectedData());\n return view.filter((row) => selected.has(row));\n }\n\n // ── Selection helpers ──\n\n private hasSelectionColumn(): boolean {\n return this.selectable && this.selectionMode !== 'none';\n }\n\n private getSlottedSelectionRows(): any[] {\n if (this.shouldModelSlottedRows()) return [];\n return Array.from(this.querySelectorAll('snice-row[slot=\"rows\"]')) as any[];\n }\n\n private getSelectionSourceRows(): any[] {\n const slotted = this.getSlottedSelectionRows();\n return slotted.length > 0 ? slotted.map((row) => row.data) : this.data;\n }\n\n /** Keep light-DOM rows aligned with the table's live selection mode and\n * conditional selectability, including property changes after connection. */\n private syncSlottedSelectionState() {\n const rows = this.getSlottedSelectionRows();\n if (rows.length === 0) return;\n\n const showSelectors = this.hasSelectionColumn();\n let keptSingleSelection = false;\n rows.forEach((row, index) => {\n const disabled = !!(showSelectors && this.selectabilityCheck\n && !this.selectabilityCheck(row.data, index));\n row.index = index;\n row.selectable = showSelectors;\n row.selectionDisabled = disabled;\n\n if (!showSelectors || disabled) {\n row.selected = false;\n } else if (this.selectionMode === 'single' && row.selected) {\n if (keptSingleSelection) row.selected = false;\n else keptSingleSelection = true;\n }\n });\n\n this.selectedRows = rows\n .map((row, index) => row.selected && !row.selectionDisabled ? index : -1)\n .filter((index) => index >= 0);\n }\n\n private handleSlottedRowSelect = (event: CustomEvent) => {\n const row = event.detail?.element as any;\n const rows = this.getSlottedSelectionRows();\n const index = rows.indexOf(row);\n if (index < 0) return;\n\n const blocked = !this.hasSelectionColumn()\n || !!(this.selectabilityCheck && !this.selectabilityCheck(row.data, index));\n if (blocked) {\n row.selected = false;\n this.syncSlottedSelectionState();\n return;\n }\n\n if (this.selectionMode === 'single' && row.selected) {\n rows.forEach((candidate, candidateIndex) => {\n if (candidateIndex !== index) candidate.selected = false;\n });\n }\n this.selectedRows = rows\n .map((candidate, candidateIndex) => candidate.selected ? candidateIndex : -1)\n .filter((candidateIndex) => candidateIndex >= 0);\n this.selectionAnchor = row.data;\n this.dispatchRowSelectionChanged(index, row.selected);\n this.dispatchSelectionChanged();\n };\n\n private getSelectableIndices(rows: any[]): number[] {\n const indices: number[] = [];\n for (const row of rows) {\n const index = this.indexOfRow(row);\n if (index < 0) continue;\n if (this.selectabilityCheck && !this.selectabilityCheck(row, index)) continue;\n indices.push(index);\n }\n return indices;\n }\n\n /**\n * E1: the single entry point for a pointer/keyboard interaction on one row.\n * Resolves selectionMode + modifier intent (`additive` = ctrl/meta,\n * `range` = shift), mutates `selectedRows` (delta DOM via the @watch), moves\n * the object-valued anchor for non-range interactions, and emits the legacy\n * row-selection event plus the unified `selection-changed` event.\n */\n private applyRowSelection(rowIndex: number, opts: { additive: boolean; range: boolean }) {\n if (this.selectionMode === 'none') return;\n // Conditional selectability gate (shared with the keyboard path).\n if (this.selectabilityCheck && !this.selectabilityCheck(this.data[rowIndex], rowIndex)) return;\n\n const row = this.data[rowIndex];\n\n // Single mode: always collapse to exactly the interacted row.\n if (this.selectionMode === 'single') {\n this.selectedRows = [rowIndex];\n this.selectionAnchor = row;\n this.dispatchRowSelectionChanged(rowIndex, true);\n this.dispatchSelectionChanged();\n return;\n }\n\n // Multiple mode. Shift extends the contiguous range from the anchor object.\n if (opts.range && this.selectionAnchor != null) {\n this.selectRange(this.selectionAnchor, row); // anchor stays put\n this.dispatchRowSelectionChanged(rowIndex, this.selectedRows.includes(rowIndex));\n this.dispatchSelectionChanged();\n return;\n }\n\n // Plain or additive (ctrl/meta) click → toggle this row (historical path).\n const isSelected = this.selectedRows.includes(rowIndex);\n this.selectedRows = isSelected\n ? this.selectedRows.filter(i => i !== rowIndex)\n : [...this.selectedRows, rowIndex];\n this.selectionAnchor = row;\n\n // DOM update happens in the selectedRows @watch (delta, one row).\n this.dispatchRowSelectionChanged(rowIndex, !isSelected);\n this.dispatchSelectionChanged();\n }\n\n /**\n * E1: replace the selection with the contiguous range between the anchor and\n * target ROW OBJECTS, resolved against the current filtered snapshot (display\n * order). Object-valued endpoints mean the range follows the rows across a\n * sort — `getFilteredData()` reflects the reordered `this.data`, and each\n * position maps back to a data index via `indexOfRow` (rowIndexMap).\n */\n private selectRange(anchorRow: any, targetRow: any) {\n const view = this.getFilteredData();\n let posA = view.indexOf(anchorRow);\n const posT = view.indexOf(targetRow);\n if (posT === -1) return;\n if (posA === -1) posA = posT;\n\n const lo = Math.min(posA, posT);\n const hi = Math.max(posA, posT);\n const indices: number[] = [];\n for (let p = lo; p <= hi; p++) {\n const idx = this.indexOfRow(view[p]);\n if (idx < 0) continue;\n if (this.selectabilityCheck && !this.selectabilityCheck(view[p], idx)) continue;\n indices.push(idx);\n }\n this.selectedRows = indices;\n }\n\n private toggleRowSelection(rowIndex: number) {\n // Keyboard Space/Shift+Space toggle — additive intent, no range.\n this.applyRowSelection(rowIndex, { additive: true, range: false });\n }\n\n private selectAllRows() {\n // Select-all only carries meaning in multiple mode.\n if (this.selectionMode !== 'multiple') return;\n\n const filteredIndices = this.getSelectableIndices(this.getFilteredData());\n const allFilteredSelected = filteredIndices.every(i => this.selectedRows.includes(i));\n\n if (allFilteredSelected) {\n this.selectedRows = this.selectedRows.filter(i => !filteredIndices.includes(i));\n } else {\n const combined = new Set([...this.selectedRows, ...filteredIndices]);\n this.selectedRows = Array.from(combined);\n }\n // Row DOM + header checkbox update in the selectedRows @watch.\n this.dispatchSelectAllChanged(allFilteredSelected);\n this.dispatchSelectionChanged();\n }\n\n // ── Master-Detail API ──\n\n setDetailPanel(options: DetailPanelOptions) {\n this.masterDetail.attach(this, options);\n this.masterDetail.onHeightChange = () => {\n if (!this.virtualize || !this.virtualizer.isEnabled()) return;\n this.virtualRowsSnapshot = this.getVirtualRows();\n this.virtualizer.setTotalRows(this.virtualRowsSnapshot.length);\n };\n this.masterDetail.prepare(this.data);\n this.renderHeader();\n this.renderBody();\n }\n\n expandRow(index: number) {\n this.masterDetail.expand(index);\n this.renderBody();\n }\n\n collapseRow(index: number) {\n this.masterDetail.collapse(index);\n this.renderBody();\n }\n\n toggleRowExpansion(index: number) {\n this.masterDetail.toggle(index);\n this.renderBody();\n }\n\n expandAllRows() {\n this.masterDetail.expandAll(this.data.length);\n this.renderBody();\n }\n\n collapseAllRows() {\n this.masterDetail.collapseAll();\n this.renderBody();\n }\n\n // ── Toolbar API ──\n\n setToolbar(options: ToolbarOptions) {\n this.toolbarOptions = options;\n const container = this.shadowRoot?.querySelector('.table-controls-container') as HTMLElement;\n if (!container) return;\n\n this.toolbar.attach(this, container, options);\n // Share the table's filter engine with the toolbar so reads (panel rendering)\n // and writes (apply/clear) operate on the same model.\n this.toolbar.setFilterEngine(this.filterEngine);\n this.toolbar.onSearch = (query) => this.setQuickFilter(query);\n this.toolbar.onSortColumn = (key, dir) => {\n this.currentSort = [{ column: key, direction: dir }];\n this.dispatchSortChange();\n this.renderHeader();\n if (this.mode === 'remote') this.debouncedDataRequest();\n else this.sortLocalData();\n };\n this.toolbar.onSetSortModel = (sortModel) => {\n this.currentSort = sortModel;\n this.dispatchSortChange();\n this.renderHeader();\n if (this.mode === 'remote') this.debouncedDataRequest();\n else this.sortLocalData();\n };\n this.toolbar.onFilterColumn = (key, operator, value) => {\n this.setColumnFilter(key, operator, value);\n };\n this.toolbar.onRemoveFilter = (key) => {\n this.removeColumnFilter(key);\n };\n this.toolbar.onSetFilterModel = (filters, logic) => {\n this.filterEngine.clearAllFilters();\n this.filterEngine.setFilterLogic(logic);\n for (const f of filters) {\n this.filterEngine.setColumnFilter(f.column, f.operator, f.value);\n }\n this.applyClientFilters();\n };\n this.toolbar.onClearFilters = () => {\n this.clearAllFilters();\n };\n this.toolbar.onExportCSV = () => this.exportCSV();\n this.toolbar.onFullscreen = () => this.toggleFullscreen();\n }\n\n // ── Tree Data API ──\n\n setTreeData(options: TreeDataOptions) {\n this.treeData.attach(options);\n this.renderBody();\n }\n\n expandTreeNode(key: string) {\n this.treeData.expand(key);\n this.renderBody();\n }\n\n collapseTreeNode(key: string) {\n this.treeData.collapse(key);\n this.renderBody();\n }\n\n toggleTreeNode(key: string) {\n this.treeData.toggle(key);\n this.renderBody();\n }\n\n expandAllTreeNodes() {\n this.treeData.expandAll(this.data);\n this.renderBody();\n }\n\n collapseAllTreeNodes() {\n this.treeData.collapseAll();\n this.renderBody();\n }\n\n // ── Column Groups API ──\n\n setColumnGroups(groups: ColumnGroup[]) {\n this.columnManager.setColumnGroups(groups);\n this.renderHeader();\n }\n\n // ── Column Menu API ──\n\n private initColumnMenu() {\n if (!this.columnMenu) return;\n this.columnMenuManager.attach(this);\n this.columnMenuManager.onSortAsc = (col) => {\n this.currentSort = [{ column: col, direction: 'asc' }];\n this.dispatchSortChange();\n this.renderHeader();\n if (this.mode === 'remote') this.debouncedDataRequest();\n else this.sortLocalData();\n };\n this.columnMenuManager.onSortDesc = (col) => {\n this.currentSort = [{ column: col, direction: 'desc' }];\n this.dispatchSortChange();\n this.renderHeader();\n if (this.mode === 'remote') this.debouncedDataRequest();\n else this.sortLocalData();\n };\n this.columnMenuManager.onFilter = (col) => {\n // Open filter modal pre-populated with this column\n this.toolbar.openFilterModal(col);\n };\n this.columnMenuManager.onHide = (col) => this.setColumnVisible(col, false);\n this.columnMenuManager.onPinLeft = (col) => this.pinColumn(col, 'left');\n this.columnMenuManager.onPinRight = (col) => this.pinColumn(col, 'right');\n this.columnMenuManager.onUnpin = (col) => this.unpinColumn(col);\n this.columnMenuManager.onAutoSize = (col) => this.autoSizeColumn(col);\n }\n\n // ── Row Pinning API ──\n\n pinRowTop(row: any) {\n this.pinnedTopRows.push(row);\n this.renderBody();\n }\n\n pinRowBottom(row: any) {\n this.pinnedBottomRows.push(row);\n this.renderBody();\n }\n\n unpinRow(row: any) {\n this.pinnedTopRows = this.pinnedTopRows.filter(r => r !== row);\n this.pinnedBottomRows = this.pinnedBottomRows.filter(r => r !== row);\n this.renderBody();\n }\n\n clearPinnedRows() {\n this.pinnedTopRows = [];\n this.pinnedBottomRows = [];\n this.renderBody();\n }\n\n // ── Row Height API ──\n\n setRowHeight(height: number) {\n this.rowHeight = height;\n this.renderBody();\n }\n\n setRowHeightCallback(fn: (row: any, index: number) => number) {\n this.rowHeightCallback = fn;\n this.renderBody();\n }\n\n // ── Sort Enhancements ──\n\n setSortComparator(columnKey: string, comparator: (a: any, b: any, direction: 'asc' | 'desc') => number) {\n const col = this.columns.find(c => c.key === columnKey);\n if (col) (col as any).sortComparator = comparator;\n }\n\n // ── Selection Enhancements ──\n\n private selectabilityCheck: ((row: any, index: number) => boolean) | null = null;\n\n setSelectabilityCheck(fn: (row: any, index: number) => boolean) {\n this.selectabilityCheck = fn;\n const sourceRows = this.getSelectionSourceRows();\n this.selectedRows = this.selectedRows.filter((index) => {\n const row = sourceRows[index];\n return !!row && fn(row, index);\n });\n this.syncSlottedSelectionState();\n this.scheduleRender('both');\n }\n\n // E2: register a per-cell editability predicate. Wraps the editor's check —\n // gates whether a given (row, columnKey) may enter edit mode, on top of the\n // column's `editable` flag. Stored on the editor instance, so it survives the\n // setupEditor() re-sync that startEdit() performs.\n setCellEditableCheck(fn: (row: any, column: string) => boolean) {\n this.editor.setEditabilityCheck(fn);\n }\n\n getSelectedData(): any[] {\n const rows = this.getSelectionSourceRows();\n return this.selectedRows.map(i => rows[i]).filter(Boolean);\n }\n\n // ── Lazy Loading ──\n\n private setupLazyLoading() {\n if (!this.lazyLoad) return;\n\n const scrollContainer = this.getScrollContainer();\n if (!scrollContainer) return;\n\n if (this.lazyLoadHandler) {\n this.lazyLoadContainer?.removeEventListener('scroll', this.lazyLoadHandler);\n }\n\n this.lazyLoadHandler = () => {\n const { scrollTop, scrollHeight, clientHeight } = scrollContainer;\n if (scrollHeight - scrollTop - clientHeight < this.lazyLoadThreshold) {\n this.dispatchEvent(new CustomEvent('lazy-load', {\n detail: { currentCount: this.data.length },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n scrollContainer.addEventListener('scroll', this.lazyLoadHandler, { passive: true });\n this.lazyLoadContainer = scrollContainer;\n }\n\n // ── Scrolling API ──\n\n scrollToColumn(columnKey: string) {\n const th = this.shadowRoot?.querySelector(`th[data-key=\"${columnKey}\"]`) as HTMLElement;\n th?.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n }\n\n // ── List View ──\n\n /**\n * Declarative list-mode row renderer — bind via `.listRenderer=${fn}`.\n * Returning an HTMLElement appends it; anything else becomes text.\n */\n @property({ attribute: false })\n listRenderer: ListViewRenderer | null = null;\n\n @watch('listRenderer', { immediate: false })\n handleListRendererChange() {\n if (!this.list) return;\n // The row recycler cannot infer that a callback identity changed from\n // row data alone. Force fresh rows so list markup replaces table cells.\n this.renderedRows = new Map();\n this.renderBody();\n }\n\n setListViewRenderer(fn: ListViewRenderer) {\n this.listRenderer = fn;\n }\n\n // ── Row creation helper (used by both regular and virtualized rendering) ──\n\n private createRow(rowData: any, index: number, treeRow?: TreeRow): HTMLTableRowElement {\n const tr = document.createElement('tr');\n tr.setAttribute('data-index', String(index));\n tr.setAttribute('part', 'row');\n\n // Row height\n if (this.rowHeightCallback) {\n tr.style.height = `${this.rowHeightCallback(rowData, index)}px`;\n } else if (this.rowHeight !== 48) {\n tr.style.height = `${this.rowHeight}px`;\n }\n\n const isSelected = this.selectedRows.includes(index);\n tr.setAttribute('data-selected', String(isSelected));\n\n // Row DnD handle\n if (this.rowReorder && this.rowDnD.isEnabled()) {\n tr.appendChild(this.rowDnD.createDragHandle());\n this.rowDnD.makeRowDraggable(tr, index);\n }\n\n // Master-detail expand/collapse toggle\n if (this.masterDetail.isEnabled()) {\n const toggleCell = document.createElement('td');\n toggleCell.className = 'detail-toggle-cell';\n toggleCell.appendChild(this.masterDetail.createToggleButton(index));\n tr.appendChild(toggleCell);\n }\n\n if (this.hasSelectionColumn()) {\n const selectCell = document.createElement('td');\n selectCell.className = 'select-column';\n const disabled = !!(this.selectabilityCheck && !this.selectabilityCheck(rowData, index));\n selectCell.innerHTML = `<snice-checkbox class=\"row-select\" size=\"small\" compact ${isSelected ? 'checked' : ''} ${disabled ? 'disabled' : ''} data-row-index=\"${index}\"></snice-checkbox>`;\n const checkbox = selectCell.querySelector('snice-checkbox') as any;\n checkbox.disabled = disabled;\n tr.appendChild(selectCell);\n }\n\n const columnsToRender = this.getVisibleColumnDefinitions();\n\n if (this.list && this.listRenderer) {\n const td = document.createElement('td');\n td.className = 'list-view-cell';\n td.colSpan = Math.max(1, columnsToRender.length);\n const rendered = this.listRenderer(rowData, index);\n if (rendered instanceof HTMLElement) td.appendChild(rendered);\n else td.textContent = rendered == null ? '' : String(rendered);\n tr.appendChild(td);\n return tr;\n }\n\n let skipColumns = 0;\n columnsToRender.forEach((column, colIdx) => {\n // Column spanning: skip cells consumed by a previous span\n if (skipColumns > 0) {\n skipColumns--;\n return;\n }\n\n const td = document.createElement('td');\n td.setAttribute('data-key', column.key);\n td.setAttribute('part', 'cell');\n const rawValue = rowData[column.key];\n // Display path must run the same valueGetter the sort/grouping/editor\n // paths already apply.\n const value = column.valueGetter ? column.valueGetter(rawValue, rowData) : rawValue;\n\n this.applyCellPresentation(td, column, value, rowData);\n\n // Column span\n const colSpanDef = (column as any).colSpan;\n if (colSpanDef) {\n const span = typeof colSpanDef === 'function' ? colSpanDef(value, rowData) : colSpanDef;\n if (span > 1) {\n td.colSpan = span;\n skipColumns = span - 1;\n }\n }\n\n // Cell/row edit: when this cell is being edited, render its editor\n // element instead of the display cell.\n const editorEl = this.maybeCreateCellEditor(column, rowData, value, index);\n if (editorEl) {\n td.classList.add('editing');\n td.appendChild(editorEl);\n } else if (treeRow && column.key === this.treeData.getGroupColumn()) {\n // Tree data: add indent + toggle on the group column\n const toggle = this.treeData.createToggle(treeRow);\n td.appendChild(toggle);\n const textSpan = document.createElement('span');\n textSpan.textContent = value == null ? '' : String(value);\n // Clicking the text label also toggles expand/collapse\n if (treeRow.hasChildren) {\n textSpan.style.cursor = 'pointer';\n textSpan.addEventListener('click', (e) => {\n e.stopPropagation();\n this.treeData.toggle(treeRow.key);\n this.renderBody();\n });\n }\n td.appendChild(textSpan);\n } else {\n td.appendChild(this.createCellElement(column, value, rowData));\n }\n\n // Apply column width\n const state = this.columnManager.getState(column.key);\n if (state) {\n td.style.width = `${state.width}px`;\n\n // Pinned column sticky positioning\n if (state.pinned === 'left') {\n const offsets = this.columnManager.getPinnedLeftOffsets();\n td.classList.add('pinned-cell');\n td.style.position = 'sticky';\n td.style.left = `${offsets.get(column.key) ?? 0}px`;\n td.style.zIndex = '1';\n } else if (state.pinned === 'right') {\n const offsets = this.columnManager.getPinnedRightOffsets();\n td.classList.add('pinned-cell');\n td.style.position = 'sticky';\n td.style.right = `${offsets.get(column.key) ?? 0}px`;\n td.style.zIndex = '1';\n }\n }\n\n tr.appendChild(td);\n });\n\n return tr;\n }\n\n private applyCellPresentation(td: HTMLTableCellElement, column: ColumnDefinition, value: any, row: any) {\n const applyStyle = (style?: ColumnDefinition['style']) => {\n if (!style) return;\n if (style.backgroundColor) td.style.backgroundColor = style.backgroundColor;\n if (style.color) td.style.color = style.color;\n if (style.fontWeight) td.style.fontWeight = style.fontWeight;\n if (style.fontStyle) td.style.fontStyle = style.fontStyle;\n if (style.fontSize) td.style.fontSize = style.fontSize;\n if (style.textDecoration) td.style.textDecoration = style.textDecoration;\n };\n\n applyStyle(column.style);\n for (const rule of column.conditionalFormats || []) {\n if (!rule.condition(value, row)) continue;\n applyStyle(rule.style);\n if (rule.className) td.classList.add(rule.className);\n break;\n }\n\n if (column.tooltip) {\n td.title = typeof column.tooltip === 'function'\n ? column.tooltip(value, row)\n : (value == null ? '' : String(value));\n }\n }\n\n // ── F: group + aggregate row construction ──\n\n /**\n * A group-header row: a single full-width cell holding an optional group\n * checkbox (selectable), the expand/collapse chevron (reusing the tree-toggle\n * affordance), the group value, and a leaf-count badge. The table's delegated\n * click handler toggles the whole cell (except the checkbox) and emits one\n * host-level `group-toggle` event.\n */\n private createGroupRow(group: GroupRow, totalColSpan: number): HTMLTableRowElement {\n const tr = document.createElement('tr');\n tr.className = 'group-header-row';\n tr.setAttribute('data-group-key', group.key);\n tr.setAttribute('data-depth', String(group.depth));\n tr.setAttribute('aria-label', `${group.value == null || group.value === '' ? 'Blank' : String(group.value)} group, ${group.count} rows`);\n\n const td = document.createElement('td');\n td.colSpan = totalColSpan;\n td.className = 'group-header-cell';\n\n // Group selection checkbox (multiple mode only — select-all semantics).\n if (this.selectable && this.selectionMode === 'multiple') {\n const state = this.groupSelectionState(group);\n const wrap = document.createElement('span');\n wrap.className = 'group-select-wrap';\n const checkbox = document.createElement('snice-checkbox') as any;\n checkbox.className = 'group-select';\n checkbox.setAttribute('size', 'small');\n checkbox.setAttribute('compact', '');\n checkbox.setAttribute('data-group-key', group.key);\n checkbox.setAttribute('aria-label', `Select all rows in ${group.value == null || group.value === '' ? 'blank' : String(group.value)} group`);\n checkbox.checked = state === 'all';\n checkbox.indeterminate = state === 'some';\n checkbox.disabled = this.getSelectableGroupIndices(group).length === 0;\n wrap.appendChild(checkbox);\n td.appendChild(wrap);\n }\n\n // The chevron is passive DOM; the root template's @click handler owns the\n // interaction and host-level group-toggle dispatch.\n const toggle = this.grouping.createToggle(group);\n td.appendChild(toggle);\n\n const label = document.createElement('span');\n label.className = 'group-header-label';\n label.textContent = group.value == null ? '' : String(group.value);\n td.appendChild(label);\n\n const count = document.createElement('span');\n count.className = 'group-header-count';\n count.textContent = String(group.count);\n td.appendChild(count);\n\n tr.appendChild(td);\n return tr;\n }\n\n /**\n * An aggregate footer row: per-column cells carrying the aggregate value for\n * columns that declare one (formatted through the column's normal type /\n * formatter pipeline), empty otherwise. Tool columns get spacer cells so the\n * aggregated values line up under their columns.\n */\n private createAggregateRow(agg: AggregateRow, _totalColSpan: number): HTMLTableRowElement {\n const tr = document.createElement('tr');\n tr.className = 'group-aggregate-row';\n tr.setAttribute('data-agg-scope', agg.scope);\n tr.setAttribute('data-depth', String(agg.depth));\n if (agg.groupKey) tr.setAttribute('data-group-key', agg.groupKey);\n const groupLabel = agg.groupValue == null || agg.groupValue === '' ? 'Blank' : String(agg.groupValue);\n const scopeLabel = agg.scope === 'table'\n ? 'Total'\n : `${agg.groupColumn ? `${agg.groupColumn}: ` : ''}${groupLabel} subtotal`;\n tr.setAttribute('aria-label', scopeLabel);\n\n // Tool-column spacers (match createRow / renderHeader order).\n if (this.rowReorder && this.rowDnD.isEnabled()) {\n const spacer = document.createElement('td');\n spacer.className = 'drag-handle-cell';\n tr.appendChild(spacer);\n }\n if (this.masterDetail.isEnabled()) {\n const spacer = document.createElement('td');\n spacer.className = 'detail-toggle-cell';\n tr.appendChild(spacer);\n }\n if (this.hasSelectionColumn()) {\n const spacer = document.createElement('td');\n spacer.className = 'select-column';\n tr.appendChild(spacer);\n }\n\n const columnsToRender = this.getVisibleColumnDefinitions();\n\n const labelColumn = columnsToRender.find(\n (column) => !Object.prototype.hasOwnProperty.call(agg.aggregates, column.key)\n );\n // If every visible column aggregates, keep the scope/group label in the\n // first aggregate cell instead of silently omitting it.\n const inlineLabelKey = labelColumn ? null : columnsToRender[0]?.key;\n let labelled = false;\n columnsToRender.forEach((column) => {\n const td = document.createElement('td');\n td.setAttribute('data-key', column.key);\n td.className = 'aggregate-cell';\n\n const hasAgg = Object.prototype.hasOwnProperty.call(agg.aggregates, column.key);\n if ((!hasAgg && !labelled) || (hasAgg && column.key === inlineLabelKey)) {\n labelled = true;\n const label = document.createElement('span');\n label.className = `aggregate-label${hasAgg ? ' aggregate-label--inline' : ''}`;\n label.textContent = scopeLabel;\n if (agg.scope === 'group' && agg.depth > 0) {\n label.style.paddingLeft = `${agg.depth * 1.5}rem`;\n }\n td.appendChild(label);\n }\n\n if (hasAgg) {\n const value = agg.aggregates[column.key];\n td.setAttribute('data-agg-value', String(value));\n // Format through the type/formatter pipeline, but never a custom\n // renderCell (it's a per-row renderer; aggregates have no row).\n const aggCol = (column.renderCell || (!column.formatter && column.valueFormatter))\n ? {\n ...column,\n renderCell: undefined,\n // valueFormatter is the newer pipeline spelling; cell elements\n // consume the established `formatter` field. Adapt it only for\n // the already-computed aggregate value (valueGetter ran before\n // reduction and must not run a second time here).\n formatter: column.formatter ?? column.valueFormatter,\n }\n : column;\n td.appendChild(this.createCellElement(aggCol, value));\n }\n\n // Keep pinned columns aligned under their headers.\n const state = this.columnManager.getState(column.key);\n if (state) {\n td.style.width = `${state.width}px`;\n if (state.pinned === 'left') {\n const offsets = this.columnManager.getPinnedLeftOffsets();\n td.classList.add('pinned-cell');\n td.style.position = 'sticky';\n td.style.left = `${offsets.get(column.key) ?? 0}px`;\n td.style.zIndex = '1';\n } else if (state.pinned === 'right') {\n const offsets = this.columnManager.getPinnedRightOffsets();\n td.classList.add('pinned-cell');\n td.style.position = 'sticky';\n td.style.right = `${offsets.get(column.key) ?? 0}px`;\n td.style.zIndex = '1';\n }\n }\n\n tr.appendChild(td);\n });\n\n return tr;\n }\n\n /** F: whether all / some / none of a group's rows are selected. */\n private groupSelectionState(group: GroupRow): 'all' | 'some' | 'none' {\n const indices = this.getSelectableGroupIndices(group);\n if (indices.length === 0) return 'none';\n const selected = indices.filter((i) => this.selectedRows.includes(i)).length;\n if (selected === 0) return 'none';\n if (selected === indices.length) return 'all';\n return 'some';\n }\n\n /** Raw indices in a group that the table's conditional selectability allows. */\n private getSelectableGroupIndices(group: GroupRow): number[] {\n const indices: number[] = [];\n for (const row of group.rows) {\n const index = this.indexOfRow(row);\n if (index < 0) continue;\n if (this.selectabilityCheck && !this.selectabilityCheck(row, index)) continue;\n indices.push(index);\n }\n return indices;\n }\n\n /** F: toggle a group's expansion, dispatch `group-toggle`, and re-render. */\n private toggleGroup(group: GroupRow) {\n this.grouping.toggle(group.key);\n this.invalidateGroupingCache();\n this.dispatchGroupToggle(group.key, group.value, this.grouping.isExpanded(group.key));\n this.renderBody();\n }\n\n // F: reflect selection state onto the rendered group-header checkboxes.\n // Called from the selectedRows @watch delta path (a data-row toggle must\n // update its group header's all/some/none without a full re-render).\n private updateGroupSelectionStates() {\n if (!this.tbody || !this.grouping.hasGrouping() || !this.selectable) return;\n const groups = this.getGroupingItems().filter((it): it is GroupRow => it.type === 'group');\n if (groups.length === 0) return;\n const byKey = new Map(groups.map((g) => [g.key, g]));\n const headers = this.tbody.querySelectorAll('tr.group-header-row');\n headers.forEach((header) => {\n const key = header.getAttribute('data-group-key');\n const group = key ? byKey.get(key) : undefined;\n if (!group) return;\n const checkbox = header.querySelector('snice-checkbox.group-select') as any;\n if (!checkbox) return;\n const state = this.groupSelectionState(group);\n checkbox.checked = state === 'all';\n checkbox.indeterminate = state === 'some';\n });\n }\n\n @dispatch('group-toggle', { bubbles: true, composed: true })\n private dispatchGroupToggle(key: string, value: any, expanded: boolean) {\n return { key, value, expanded };\n }\n\n // ── Editor rendering ──\n\n /**\n * If the given cell is currently being edited (cell mode → this exact cell;\n * row mode → any editable cell in the edited row), build and wire its editor\n * element. Returns null when the cell is not in an edit state.\n */\n private maybeCreateCellEditor(column: any, rowData: any, value: any, index: number): HTMLElement | null {\n if (!this.editable) return null;\n\n let editing = false;\n let editValue = value;\n let editorType: EditorType;\n\n if (this.editMode === 'row') {\n const rowState = this.editor.getRowEditState();\n if (rowState?.isEditing && rowState.rowIndex === index\n && this.editor.isCellEditable(rowData, column.key)) {\n editing = true;\n editValue = rowState.editedRow[column.key];\n }\n editorType = this.resolveEditorType(column);\n } else {\n const cellState = this.editor.getCellEditState();\n if (cellState?.isEditing && cellState.rowIndex === index\n && cellState.columnKey === column.key) {\n editing = true;\n editValue = cellState.currentValue;\n }\n editorType = cellState?.editorType ?? this.resolveEditorType(column);\n }\n\n if (!editing) return null;\n\n // E2: a custom renderEditor bypasses the built-in editor. commit(v) writes\n // the value through the same pipeline the default editor uses, then commits;\n // cancel() aborts. No default wiring is attached — the renderer owns its UI.\n if (typeof column.renderEditor === 'function') {\n const commit = (v: any) => {\n if (this.editMode === 'row') this.editor.updateRowField(column.key, v);\n else this.editor.updateCellValue(v);\n this.commitEdit();\n };\n const cancel = () => this.cancelEdit();\n return column.renderEditor(editValue, rowData, column, commit, cancel);\n }\n\n const options = column.selectOptions ? { selectOptions: column.selectOptions } : undefined;\n const editorEl = this.editor.createEditor(editorType, editValue, options);\n this.wireEditorElement(editorEl, column);\n return editorEl;\n }\n\n /** Resolve the editor kind for a column (explicit override wins, else by type). */\n private resolveEditorType(column: any): EditorType {\n if (column.editorType) return column.editorType;\n return this.editor.getEditorType(column.type || 'text');\n }\n\n /**\n * Attach input/commit/cancel behavior to an editor element. Plain listeners\n * on a module-created element — the established pattern for imperative table\n * DOM (see createRow's checkbox/tree wiring).\n */\n private wireEditorElement(editorEl: HTMLElement, column: any) {\n const isCheckbox = editorEl instanceof HTMLInputElement && editorEl.type === 'checkbox';\n const readValue = () =>\n isCheckbox ? (editorEl as HTMLInputElement).checked : (editorEl as any).value;\n\n const syncValue = () => {\n const v = readValue();\n if (this.editMode === 'row') this.editor.updateRowField(column.key, v);\n else this.editor.updateCellValue(v);\n };\n\n editorEl.addEventListener('input', syncValue);\n editorEl.addEventListener('change', syncValue);\n\n editorEl.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n syncValue();\n this.commitEdit();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n this.cancelEdit();\n }\n });\n\n editorEl.addEventListener('blur', () => {\n // Commit on blur only in cell mode — in row mode, tabbing between the\n // row's editors would otherwise commit the whole row prematurely. Guard\n // on isEditing so re-renders that remove the editor (also firing blur)\n // don't re-trigger a commit.\n if (this.editMode !== 'row' && this.editor.isEditing()) {\n syncValue();\n this.commitEdit();\n }\n });\n }\n\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"snice-table.js","sources":["../../../../components/table/snice-table.ts"],"sourcesContent":["import { element, property, query, request, dispatch, watch, render, styles, html, css, ready, dispose, on, observe } from 'snice';\nimport '../input/snice-input';\nimport '../select/snice-select';\nimport '../button/snice-button';\nimport '../checkbox/snice-checkbox';\nimport '../modal/snice-modal';\nimport '../empty-state/snice-empty-state';\n// The zero-row loading row and the loading overlay both emit <snice-progress>.\n// NOT the same module as this folder's ./snice-progress, which registers\n// `snice-table-progress` for the progress CELL — importing that one leaves the\n// spinner an unregistered 0x0 inline element, i.e. a loading state that paints\n// nothing on any page that imports only the table.\nimport '../progress/snice-progress';\nimport './snice-cell.ts';\nimport './snice-cell-text.ts';\nimport './snice-cell-number.ts';\nimport './snice-cell-date.ts';\nimport './snice-cell-boolean.ts';\nimport './snice-cell-rating.ts';\nimport './snice-cell-progress.ts';\nimport './snice-cell-duration.ts';\nimport './snice-cell-filesize.ts';\nimport './snice-cell-sparkline.ts';\nimport './snice-cell-percentage.ts';\nimport './snice-cell-tag.ts';\nimport './snice-cell-status.ts';\nimport './snice-cell-actions.ts';\nimport './snice-cell-link.ts';\nimport './snice-cell-email.ts';\nimport './snice-cell-phone.ts';\nimport './snice-cell-color.ts';\nimport './snice-cell-location.ts';\nimport './snice-cell-json.ts';\nimport './snice-cell-currency.ts';\nimport './snice-cell-image.ts';\nimport './snice-column.ts';\nimport './snice-row.ts';\nimport { TableVirtualizer } from './table-virtualizer';\nimport { TableColumnManager, horizontalCellChrome } from './table-column-manager';\nimport { TableFilterEngine } from './table-filter-engine';\nimport { TableEditor } from './table-editor';\nimport type { EditorType } from './table-editor';\nimport { TableKeyboard } from './table-keyboard';\nimport { TableExport } from './table-export';\nimport { TableMasterDetail } from './table-master-detail';\nimport { TableToolbar } from './table-toolbar';\nimport { TableTreeData } from './table-tree-data';\nimport { TableGrouping } from './table-grouping';\nimport type { DisplayItem, GroupRow, AggregateRow } from './table-grouping';\nimport { TableColumnMenu } from './table-column-menu';\nimport { TableRowDnD, TableColumnDnD } from './table-row-dnd';\nimport { defaultCellAlign, emptyCellValue } from './table-cell-presentation';\nimport type { FilterModel } from './table-filter-engine';\nimport type { DetailPanelOptions } from './table-master-detail';\nimport type { ToolbarOptions } from './table-toolbar';\nimport type { TreeDataOptions, TreeRow } from './table-tree-data';\nimport type { ColumnGroup, ColumnState } from './table-column-manager';\nimport type { ColumnDefinition, ColumnFit, SniceTableElement, SelectionMode, ListViewRenderer } from './snice-table.types';\n\n/**\n * A single desired body row for the render-path reconciler (Task B). `key`\n * identifies the row across renders (the row-object itself for data rows, a\n * synthetic string for pinned / detail rows). `sig` captures everything about\n * the row's DOM that a data-object move can't fix by re-stamping — when it is\n * unchanged the existing element is reused. `alwaysRebuild` forces a fresh\n * element (edit-state and detail rows). `restampIndex`, when present, updates\n * the reused row's index-derived attributes after a reorder.\n */\ninterface RowEntry {\n key: unknown;\n sig: string;\n create: () => HTMLElement;\n alwaysRebuild?: boolean;\n restampIndex?: number;\n}\n\n/**\n * The one string both loading affordances use — the zero-row message row shows\n * it, the refetch overlay announces it. Kept together so they can never drift.\n */\nconst LOADING_LABEL = 'Loading…';\n\n@element('snice-table')\nexport class SniceTable extends HTMLElement implements SniceTableElement {\n\n @property({ type: Boolean, attribute: 'striped' })\n striped = false;\n\n @property({ type: Boolean, attribute: 'searchable' })\n searchable = false;\n\n @property({ type: Boolean, attribute: 'filterable' })\n filterable = false;\n\n @property({ type: Boolean, attribute: 'sortable' })\n sortable = false;\n\n @property({ type: Boolean, attribute: 'selectable' })\n selectable = false;\n\n @property({ type: Boolean, attribute: 'hoverable' })\n hoverable = true;\n\n @property({ type: Boolean, attribute: 'clickable' })\n clickable = false;\n\n @property({ type: Boolean, attribute: 'list' })\n list = false;\n\n @property({ type: Boolean, attribute: 'pagination' })\n pagination = false;\n\n @property({ attribute: 'pagination-mode' })\n paginationMode: 'client' | 'server' = 'client';\n\n @property({ type: Number, attribute: 'page-size' })\n pageSize = 10;\n\n @property({ type: Number, attribute: 'current-page' })\n currentPage = 1;\n\n @property({ type: Number, attribute: 'total-items' })\n totalItems = 0;\n\n @property({ type: Array, attribute: false })\n pageSizes: number[] = [10, 25, 50, 100];\n\n @property({ type: Number, attribute: 'search-debounce' })\n searchDebounce = 500;\n\n // C1: reactive, no attribute reflection. A post-mount assignment (or the\n // setData/setColumns aliases) re-renders through the microtask-coalesced\n // queue — see handleColumnsAssignment / handleDataAssignment.\n //\n // `hasChanged: () => true` — ASSIGNMENT IS THE SIGNAL, NOT IDENTITY.\n // The core dirty-check (notEqual in packages/core/src/utils.ts, applied by the\n // @property setter in element.ts) is identity-based and stays that way for\n // every other property: that is the right default for reactivity in general.\n // But `data` and `columns` are bulk payloads that callers routinely mutate in\n // place and then publish by re-assigning the SAME array reference\n // (`rows.push(row); table.data = rows`). The documented contract is that\n // assigning `data`/`columns` rerenders, so these two properties opt OUT of the\n // identity gate locally rather than weakening it globally.\n //\n // Tradeoff — double-render cost: a genuinely redundant assignment\n // (`table.data = table.data` with nothing changed) now costs a render that the\n // identity gate used to swallow, and a caller who assigns both `columns` and\n // `data` pays two schedule calls instead of one. It is bounded: both watchers\n // go through scheduleRender(), which coalesces a burst within a tick into a\n // single microtask flush, so the worst case is one extra body paint per tick,\n // never per assignment. Deep-equality diffing was rejected as the alternative\n // — it is O(rows x columns) on every assignment, i.e. a cost paid by the\n // common (genuinely-changed) path to save the rare redundant one.\n @property({ attribute: false, hasChanged: () => true })\n columns: any[] = [];\n\n @property({ attribute: false, hasChanged: () => true })\n data: any[] = [];\n\n /**\n * Data mode: 'local' = client-side, table owns the dataset (set via setData\n * or the `data` property; filter/sort run locally);\n * 'remote' = server-side, every filter/sort/search/page change\n * fires @request('table/data'); a @respond handler in\n * the parent controller returns the new page.\n *\n * Default is 'local'. Set `mode=\"remote\"` on the element OR assign the\n * property to opt into remote mode.\n */\n @property() mode: 'local' | 'remote' = 'local';\n\n // C1: setColumns is a thin alias over the reactive assignment — its @watch\n // resyncs the column model and coalesces the header+body render.\n setColumns(columns: any[]) {\n this.columns = columns;\n }\n\n // C1: setData is the IMPERATIVE bulk-load path. It resyncs the data model\n // (snapshot + row-index map) exactly like the reactive `table.data =` setter,\n // but does NOT eagerly re-render — the established API fills the body via an\n // explicit render (or the coalesced render from a paired setColumns). Keeping\n // the eager render off this path avoids re-warming the filtered snapshot the\n // caller may want left cold. The reactive PROPERTY (`table.data = rows`) is\n // the auto-rendering entry point.\n setData(data: any[]) {\n this.settingDataImperative = true;\n this.data = data;\n this.settingDataImperative = false;\n }\n\n @property({ type: Array, attribute: false })\n currentSort: Array<{ column: string, direction: 'asc' | 'desc' }> = [];\n\n // Don't use @property decorator to avoid auto-rendering on searchText change\n // This would cause the input to lose focus while typing\n searchText: string = '';\n\n @property({ type: String, attribute: 'selector' })\n selector: string = '';\n\n @property({ type: Array, attribute: false })\n selectorOptions: Array<{value: string, label: string}> = [];\n\n @property({ type: Boolean, attribute: 'loading' })\n loading: boolean = false;\n\n // Set when a remote-mode load fails; cleared by clearLoadError() as soon as\n // ANY fresh dataset arrives (see there).\n // Not a @property — renderBody() reads it directly, no attribute needed.\n private loadError: string | null = null;\n\n @property({ type: Boolean, attribute: 'virtualize' })\n virtualize = false;\n\n @property({ type: Number, attribute: 'row-height' })\n rowHeight = 48;\n\n @property({ type: Number, attribute: 'virtual-buffer' })\n virtualBuffer = 200;\n\n @property({ type: Boolean, attribute: 'column-resize' })\n columnResize = false;\n\n @property({ type: Boolean, attribute: 'editable' })\n editable = false;\n\n @property({ attribute: 'edit-mode' })\n editMode: 'cell' | 'row' = 'cell';\n\n @property({ attribute: 'density' })\n density: 'compact' | 'standard' | 'comfortable' = 'standard';\n\n /**\n * How the columns relate to the frame's width.\n *\n * `scroll` keeps every column at or above its `minWidth` and lets the frame\n * scroll horizontally when they no longer fit. `squish` makes the frame the\n * hard constraint instead: minimums relax, content ellipsises, and the table\n * never scrolls sideways. See the `ColumnFit` docs in snice-table.types.ts.\n */\n @property({ attribute: 'column-fit' })\n columnFit: ColumnFit = 'scroll';\n\n @property({ type: Boolean, attribute: 'header-filters' })\n headerFilters = false;\n\n @property({ type: Boolean, attribute: 'quick-filter' })\n quickFilter = false;\n\n @property({ type: Boolean, attribute: 'row-reorder' })\n rowReorder = false;\n\n @property({ type: Boolean, attribute: 'column-reorder' })\n columnReorder = false;\n\n @property({ type: Boolean, attribute: 'column-menu' })\n columnMenu = false;\n\n @property({ type: Boolean, attribute: 'lazy-load' })\n lazyLoad = false;\n\n @property({ type: Number, attribute: 'lazy-load-threshold' })\n lazyLoadThreshold = 200; // px from bottom to trigger\n\n @property({ type: Array, attribute: false })\n selectedRows: number[] = [];\n\n // E1: selection behavior. 'multiple' (default) preserves the historical\n // additive-toggle path; 'single' collapses to one row; 'none' disables it.\n @property({ attribute: 'selection-mode' })\n selectionMode: SelectionMode = 'multiple';\n\n // E1: shift-range anchor. Holds the row OBJECT (not an index) so it tracks the\n // row across a sort that moves it — the range is computed against the current\n // filtered snapshot / rowIndexMap at click time.\n private selectionAnchor: any = null;\n\n // F: row grouping. `groupBy` is column key(s) to group by; assigning it\n // post-mount re-renders through the coalescing queue (handleGroupByChange).\n // Aggregation is per-column (ColumnDefinition.aggregate) and needs no flag —\n // the grouping model reports isEnabled() when either grouping or aggregation\n // is active, and the body routes through the flattened display list in both\n // cases. attribute:false — a string[] can't reflect to an attribute, and the\n // reactive contract is property assignment (mirrors columns/data).\n @property({ attribute: false })\n groupBy: string | string[] = '';\n\n @property({ attribute: false })\n groupDefaults: { expanded?: boolean } = {};\n\n // F: flattened group+row+aggregate display list cache. Rebuilt lazily from the\n // filtered snapshot; invalidated on the same model mutations as filteredCache\n // PLUS group expand/collapse and groupBy/column changes (invalidateGroupingCache).\n private groupingCache: DisplayItem[] | null = null;\n\n // Module instances\n private virtualizer = new TableVirtualizer();\n private columnManager = new TableColumnManager();\n private filterEngine = new TableFilterEngine();\n private editor = new TableEditor();\n private keyboard = new TableKeyboard();\n private exporter = new TableExport();\n private masterDetail = new TableMasterDetail();\n private toolbar = new TableToolbar();\n private treeData = new TableTreeData();\n private grouping = new TableGrouping();\n private columnMenuManager = new TableColumnMenu();\n private rowDnD = new TableRowDnD();\n private columnDnD = new TableColumnDnD();\n private pinnedTopRows: any[] = [];\n private pinnedBottomRows: any[] = [];\n private toolbarOptions: ToolbarOptions | null = null;\n private lazyLoadHandler: (() => void) | null = null;\n private lazyLoadContainer: HTMLElement | null = null;\n private rowHeightCallback: ((row: any, index: number) => number) | null = null;\n private virtualRowsSnapshot: Array<{ data: any; index: number; treeRow?: TreeRow; groupItem?: DisplayItem }> = [];\n\n @query('table')\n table!: HTMLTableElement;\n\n @query('thead')\n thead!: HTMLTableSectionElement;\n\n @query('tbody')\n tbody!: HTMLTableSectionElement;\n\n /** Frame width the columns were last fitted to — see handleFrameResize. */\n private lastFittedFrameWidth = 0;\n\n\n @request('table/config')\n async *getTableConfig(): any {\n const config = await (yield {});\n this.columns = config.columns || [];\n this.selectorOptions = config.selectorOptions || [];\n // Wait for next frame to ensure DOM is updated\n await new Promise(resolve => requestAnimationFrame(resolve));\n this.renderHeader();\n // The body render the columns assignment queued above can have been\n // consumed against a not-yet-committed <tbody>. Repainting the header\n // without the rows is what leaves a remote table showing headings over an\n // empty frame, so this pass owns both.\n this.renderBody();\n this.renderControls();\n return config;\n }\n\n @request('table/data')\n async *getTableData(): any {\n // A5: capture this request's sequence number. A later request bumps the\n // counter, so a slow earlier response finds seq !== this.dataRequestSeq and\n // bails without touching the model — no out-of-order clobber.\n const seq = ++this.dataRequestSeq;\n this.loading = true;\n this.selectedRows = []; // Clear selections when loading new data\n\n try {\n const params: any = {\n search: this.searchText,\n sort: this.currentSort,\n filter: this.filterEngine.getFilterModel(),\n selector: this.selector\n };\n\n if (this.pagination) {\n params.page = this.currentPage;\n params.pageSize = this.pageSize;\n }\n const response = await (yield params);\n if (seq !== this.dataRequestSeq) return; // superseded by a newer request\n this.data = response.data || [];\n this.rebuildRowIndex();\n if (response.totalItems !== undefined) {\n this.totalItems = response.totalItems;\n }\n this.clearLoadError();\n this.loading = false;\n // Wait for next frame to ensure DOM is updated\n await new Promise(resolve => requestAnimationFrame(resolve));\n if (seq !== this.dataRequestSeq) return; // superseded while awaiting frame\n this.renderBody();\n return response;\n } catch (error) {\n if (seq !== this.dataRequestSeq) return; // stale failure — ignore silently\n console.error('Error loading table data:', error);\n this.loadError = error instanceof Error ? error.message : String(error);\n this.classList.add('table--error');\n this.dispatchLoadError(error);\n this.loading = false;\n // Wait for next frame to ensure DOM is updated\n await new Promise(resolve => requestAnimationFrame(resolve));\n // Same guard the success path applies above: a newer request can settle\n // (and paint) inside this frame, and this failure's repaint would then be\n // a second full body rebuild owed to nobody.\n if (seq !== this.dataRequestSeq) return;\n this.renderBody();\n }\n }\n\n private unsortedData: any[] = [];\n private dataRequestTimeout: any = null;\n\n // A1: row-object → its index in `this.data`. Replaces the O(n) `data.indexOf`\n // that ran per row on every selection toggle (was O(n²) for select-all).\n // `rowIndexDataRef` is the array the map was built from — a plain\n // `table.data = [...]` assignment swaps the array without going through\n // setData/rebuildRowIndex, so `ensureRowIndex()` lazily rebuilds when it\n // detects the reference changed.\n private rowIndexMap = new Map<any, number>();\n private rowIndexDataRef: any[] | null = null;\n\n // A4: the filtered snapshot getFilteredData() hands out. Recomputing it per\n // rAF scroll frame re-ran the whole filter engine every frame. Invalidated on\n // every mutation of data / filters / sort (see invalidateFilteredCache).\n private filteredCache: any[] | null = null;\n\n // A5: monotonic request id. Captured at request start; a response only\n // applies if it is still the latest, so a slow earlier response can't clobber\n // a fast later one.\n private dataRequestSeq = 0;\n\n // Task B: render-path recycling. Keyed by row-object identity (data rows) or a\n // synthetic string key (pinned / detail rows). Maps a key to the <tr> element\n // currently rendered for it plus the signature it was rendered with. On the\n // next render, a key whose object and signature are unchanged reuses its <tr>\n // (moved when order changes) instead of reconstructing it and every cell.\n // Rebuilt fresh on every render pass, so switching render modes is safe.\n private renderedRows = new Map<unknown, { el: HTMLElement; sig: string }>();\n\n // C1: brackets the internal `this.data` reassignment inside sortLocalData so\n // the data @watch treats a re-sorted view of the same rows as NOT a new\n // dataset — it must not refresh the unsortedData snapshot or double-render.\n private settingSortedData = false;\n\n // C1: set while the imperative setData() runs so the data @watch resyncs the\n // model but skips the auto-render (the caller drives the body fill).\n private settingDataImperative = false;\n\n // Set while the row-reorder handler re-publishes `this.data` as a new array\n // of the SAME rows. Tells the data @watch that no fresh dataset arrived, so a\n // pending load error must survive the drag.\n private reorderingRows = false;\n\n // C1/C2: microtask-coalesced render queue. Reactive assignments schedule a\n // render here instead of calling renderHeader/renderBody synchronously —\n // MANDATORY, because happy-dom crashes constructing cell elements inside a\n // property-setter stack. A burst of assignments in one tick flushes once.\n private renderQueued = false;\n private pendingHeaderRender = false;\n private pendingBodyRender = false;\n\n // Re-arm bookkeeping for a body render that found no <tbody> to paint into.\n // Bounded: the slotted-rows template legitimately has no <tbody>, and an\n // unbounded retry there would spin every frame.\n private bodyRenderRetries = 0;\n private bodyRenderRetryQueued = false;\n\n /**\n * Requeue a body render whose target had not been committed yet. A frame is\n * the right granularity — the shadow template commits between frames — and\n * the paint is dropped again (silently, as before) once the retries run out.\n *\n * The retry CHAINS: a template that needs more than one frame to commit is\n * the whole reason this exists, so a retry that still finds no <tbody> spends\n * one more of the budget rather than giving the frame back and quitting.\n */\n private rearmBodyRender() {\n if (this.bodyRenderRetryQueued || this.bodyRenderRetries >= 3) return;\n this.bodyRenderRetryQueued = true;\n this.bodyRenderRetries++;\n requestAnimationFrame(() => {\n this.bodyRenderRetryQueued = false;\n if (this.tbody) this.renderBody();\n else this.rearmBodyRender();\n });\n }\n\n private scheduleRender(what: 'header' | 'body' | 'both') {\n if (what === 'header' || what === 'both') this.pendingHeaderRender = true;\n if (what === 'body' || what === 'both') {\n this.pendingBodyRender = true;\n // A NEWLY requested paint gets a fresh budget. The bound exists to stop\n // one render from spinning against a template that structurally has no\n // <tbody> (the slotted-rows branch), not to disqualify the table forever:\n // without this reset, three misses during the slotted phase silently\n // cancel every body render that follows a later flip to the native table.\n if (!this.bodyRenderRetryQueued) this.bodyRenderRetries = 0;\n }\n if (this.renderQueued) return;\n\n this.renderQueued = true;\n queueMicrotask(() => {\n // @property invokes watchers before it asks Snice to update the template.\n // A second microtask lets that differential render commit first when a\n // property changes the table's structural mode (notably slotted rows →\n // grouped native table), while still coalescing a burst into one flush.\n queueMicrotask(() => {\n this.renderQueued = false;\n const doHeader = this.pendingHeaderRender;\n const doBody = this.pendingBodyRender;\n this.pendingHeaderRender = false;\n this.pendingBodyRender = false;\n try {\n if (doHeader) this.renderHeader();\n } catch (error) {\n // Both flags are already consumed. Letting a header failure escape\n // would cancel the body paint queued alongside it and leave the rows\n // permanently stale — the exact \"header fine, rows blank\" symptom.\n console.error('Error rendering table header:', error);\n }\n if (doBody) this.renderBody();\n });\n });\n }\n\n\n private debouncedDataRequest() {\n // The supersede decision belongs to the moment the NEW request is decided\n // on, not to the moment its timeout fires. Bumping here closes the 150ms\n // window in which an already-obsolete in-flight response still satisfied\n // `seq === this.dataRequestSeq` and painted rows for the previous sort /\n // filter / page under a header that already advertises the new one.\n this.dataRequestSeq++;\n\n // Set loading immediately for instant feedback\n if (!this.loading) {\n this.loading = true;\n }\n\n if (this.dataRequestTimeout) {\n clearTimeout(this.dataRequestTimeout);\n }\n\n this.dataRequestTimeout = setTimeout(() => {\n this.getTableData();\n this.dataRequestTimeout = null;\n }, 150);\n }\n\n @styles()\n styles() {\n return css/*css*/`\n :host([hidden]) {\n display: none;\n}\n\n:host {\n display: block;\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 200px;\n }\n\n /* Native Fullscreen API: paint the host's background as the backdrop\n so the area outside our box (during transition) matches dark/light. */\n :host(:fullscreen) {\n background: var(--snice-color-surface, rgb(255 255 255));\n }\n :host(:fullscreen)::backdrop {\n background: var(--snice-color-surface, rgb(255 255 255));\n }\n\n /* CSS fallback fullscreen — used when requestFullscreen is blocked. */\n :host(.table-fullscreen) {\n position: fixed;\n inset: 0;\n z-index: 10000;\n background: var(--snice-color-surface, rgb(255 255 255));\n padding: var(--snice-spacing-md, 1rem);\n overflow: auto;\n display: flex;\n flex-direction: column;\n }\n\n :host(.table-fullscreen) .snice-table {\n flex: 1;\n height: auto;\n }\n\n :host(.table-fullscreen) .table-frame {\n flex: 1;\n max-height: none;\n }\n\n\n\n .snice-table {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n }\n\n /* Frame wraps super-header + table; provides the rounded border.\n flex:1 + min-height:0 lets it absorb the remaining host height\n instead of letting content size dictate height. */\n .table-frame {\n position: relative;\n flex: 1;\n min-height: 0;\n border: 1px solid var(--snice-color-border, rgb(226 226 226));\n border-radius: var(--snice-border-radius-lg, 0.5rem);\n overflow: auto;\n }\n\n table {\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n border-spacing: 0;\n /* no border or radius — handled by .table-frame */\n }\n\n /* column-fit=\"squish\": the frame's width is the constraint.\n *\n * The arithmetic (syncColumnWidthsToFrame → fitVisibleColumns) already\n * lands the columns on the frame's content width, and fixed layout hands\n * any rounding slack back to the columns, so the rightmost edge sits on\n * the frame's inner edge. These rules are the guarantee behind that:\n * hiding the horizontal overflow means a stray pixel — a sub-pixel\n * border, a browser rounding a percentage the other way — can never turn\n * into a scrollbar the mode promised would not appear. Vertical scrolling\n * is untouched. */\n :host([column-fit=\"squish\"]) .table-frame {\n overflow-x: hidden;\n }\n\n :host([column-fit=\"squish\"]) table {\n max-width: 100%;\n }\n\n /* Squished columns are narrower than their content by design, so the\n * content has to end in an ellipsis rather than wrap the row taller (or\n * push a word past the clip edge). */\n :host([column-fit=\"squish\"]) th,\n :host([column-fit=\"squish\"]) td {\n white-space: nowrap;\n }\n\n :host([column-fit=\"squish\"]) td > snice-cell-text,\n :host([column-fit=\"squish\"]) td > .custom-cell,\n :host([column-fit=\"squish\"]) td > .tree-label {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n /* The typed cells (email, status, link, phone, location, json, colour,\n * image, actions) each declare a 100px floor on their host AND on their\n * inner .cell-content. That floor is a sensible default at natural width\n * and fatal here: a squished column is routinely narrower than 100px, the\n * cell refuses to shrink to it, and the td's own overflow: hidden then\n * chops the label mid-glyph — no ellipsis, because the element that owns\n * the ellipsis never got small enough to trigger it.\n *\n * .cell-content lives in the cell's shadow root, so no descendant\n * selector from here can reach it. A custom property can: it inherits\n * across the boundary, the cells read it with the same 100px as the\n * fallback, and nothing outside a squished td sees any change. */\n :host([column-fit=\"squish\"]) td {\n --snice-table-cell-min-width: 0;\n }\n\n /* The header label is the table's own markup and needs the same promise:\n * \"Department\" clipped to \"Departme\" reads as a different word. A\n * sortable header puts the label in a flex row beside the sort\n * indicator, and a flex item only shrinks below its content once it is\n * allowed to — hence min-width: 0 alongside the ellipsis. A plain header\n * is bare text in the th, which ellipsises on the th itself. */\n :host([column-fit=\"squish\"]) th {\n text-overflow: ellipsis;\n }\n\n :host([column-fit=\"squish\"]) th .sort-header > span {\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n }\n\n /* Super-header (slotted area above column headers) */\n .table-superheader {\n background: var(--snice-color-surface, rgb(255 255 255));\n }\n\n .table-superheader:empty {\n display: none;\n }\n\n .table-superheader ::slotted(*) {\n display: block;\n padding: var(--snice-spacing-sm, 0.75rem) var(--snice-spacing-md, 1rem);\n border-bottom: 1px solid var(--snice-color-border, rgb(226 226 226));\n }\n\n th, td {\n padding: var(--snice-table-cell-padding, var(--snice-spacing-xs, 0.5rem) var(--snice-spacing-sm, 0.75rem));\n border-bottom: var(--snice-table-row-border, 1px solid var(--snice-color-border, rgb(226 226 226)));\n border-right: var(--snice-table-cell-border, 1px solid var(--snice-color-border, rgb(226 226 226)));\n text-align: left;\n vertical-align: middle;\n color: var(--snice-color-text, rgb(23 23 23));\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n /* Remove right border on last cell in row */\n th:last-child,\n td:last-child {\n border-right: none;\n }\n\n /* Remove bottom border on last body row */\n tbody tr:last-child td {\n border-bottom: none;\n }\n\n /* Height fill: when the host is taller than its rows, an inert filler\n row (cloned from the last data row, so column widths and pinning\n track the table engine) keeps the column grid running to the bottom\n edge instead of the borders cutting off where the rows end. */\n tbody tr.table-fill-row {\n pointer-events: none;\n }\n\n tbody tr.table-fill-row td {\n border-bottom: none;\n padding: 0;\n }\n\n :host([striped]) tbody tr.table-fill-row {\n background: transparent;\n }\n\n :host([hoverable]) tbody tr.table-fill-row:hover {\n background: transparent;\n }\n\n th {\n padding: var(--snice-spacing-sm, 0.75rem) var(--snice-spacing-sm, 0.75rem);\n }\n\n /* Narrow utility columns: checkbox, expand toggle, drag handle.\n * vertical-align: middle is REQUIRED — td defaults to baseline and the\n * checkbox sits at the bottom when any other cell is taller (fat rows). */\n th.select-column,\n td.select-column,\n th.detail-toggle-cell,\n td.detail-toggle-cell,\n th.drag-handle-cell,\n td.drag-handle-cell {\n width: 1.75rem;\n max-width: 1.75rem;\n min-width: 1.75rem;\n text-align: center;\n vertical-align: middle;\n padding: 0 0.125rem;\n overflow: visible;\n box-sizing: content-box;\n }\n\n /* Force snice-checkbox compact + centered inside table */\n .select-column snice-checkbox {\n min-height: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n vertical-align: middle;\n }\n\n th {\n background-color: var(--snice-color-surface-container-low, rgb(245 245 245));\n color: var(--snice-color-text, rgb(23 23 23));\n font-weight: var(--snice-font-weight-semibold, 600);\n border-bottom: 1px solid var(--snice-color-border-subtle, var(--snice-color-border, rgb(226 226 226)));\n }\n\n th.sortable {\n cursor: pointer;\n user-select: none;\n }\n\n /* Hover and selected states share the same tokens as menu/list/command-palette\n * for cross-component visual consistency. */\n th.sortable:hover {\n background-color: var(--snice-color-surface-hover, rgb(243 244 246));\n }\n\n /* Sticky header (Task 4d) — thead cells stick to .table-frame's\n scroll-top edge. z-index sits above tbody cells (plain cells are\n unpositioned; pinned body td gets inline zIndex '1' in createRow) and\n at the pinned-header corner's own inline zIndex '2' (renderHeader),\n so a cell that is both pinned AND in the header still wins on\n horizontal scroll. Background matches the existing th background so\n rows never bleed through while scrolling underneath. */\n thead th {\n position: sticky;\n top: 0;\n z-index: 2;\n background-color: var(--snice-color-surface-container-low, rgb(245 245 245));\n }\n\n /* Row styling. The zebra tint is an ALPHA overlay, not a surface step:\n surface-container-low sits ~2 luminance points from the body surface\n on dark themes, so striped rendered as no striping at all there.\n An overlay also composites over pinned/tinted cells instead of\n replacing their color. */\n :host([striped]) tbody tr:nth-child(even) {\n background-color: var(--snice-table-stripe-bg, var(--snice-color-overlay-stripe, hsl(0 0% 0% / 0.02)));\n }\n\n :host([hoverable]) tbody tr:hover {\n background-color: var(--snice-color-surface-hover, rgb(243 244 246));\n }\n\n :host([clickable]) tbody tr {\n cursor: pointer;\n }\n\n :host([selectable]:not([selection-mode=\"none\"])) tbody tr {\n cursor: pointer;\n }\n\n tbody tr[data-selected=\"true\"] {\n background-color: var(--snice-color-primary-subtle, rgb(239 246 255));\n box-shadow: inset 2px 0 0 0 var(--snice-color-primary, rgb(37 99 235));\n }\n\n tbody tr[data-selected=\"true\"]:hover {\n background-color: var(--snice-color-primary-subtle-hover, var(--snice-color-primary-subtle, rgb(219 234 254)));\n }\n\n /* List mode - hide vertical borders */\n :host([list]) th,\n :host([list]) td {\n border-right: none;\n }\n\n :host([list]) .table-frame {\n border-left: none;\n border-right: none;\n border-radius: 0;\n }\n\n [part=\"header\"] {\n background-color: var(--snice-color-surface, rgb(255 255 255));\n }\n\n [part=\"body\"] {\n background-color: var(--snice-table-body-bg, var(--snice-color-surface, rgb(255 255 255)));\n display: block;\n }\n\n /* Toolbar */\n .table-toolbar {\n display: flex;\n align-items: center;\n gap: var(--snice-spacing-xs, 0.5rem);\n padding: var(--snice-spacing-xs, 0.5rem) var(--snice-spacing-sm, 0.75rem);\n padding-left: 0;\n background: var(--snice-color-surface, rgb(255 255 255));\n }\n\n .toolbar-search {\n width: 16rem;\n max-width: 16rem;\n flex: 0 0 auto;\n }\n\n .toolbar-actions {\n display: flex;\n align-items: center;\n gap: 2px;\n margin-left: auto;\n }\n\n .toolbar-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 2rem;\n height: 2rem;\n border: 1px solid var(--snice-color-border, rgb(226 226 226));\n border-radius: var(--snice-border-radius-md, 0.25rem);\n background: var(--snice-color-surface, rgb(255 255 255));\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n cursor: pointer;\n transition: all var(--snice-transition-fast, 150ms) ease;\n padding: 0;\n line-height: 1;\n font-family: inherit;\n }\n\n .toolbar-btn:hover {\n background: var(--snice-color-surface-container-low, rgb(245 245 245));\n color: var(--snice-color-text, rgb(23 23 23));\n }\n\n .toolbar-btn svg {\n width: 16px;\n height: 16px;\n }\n\n /* Toolbar dropdown menus */\n .toolbar-menu {\n position: absolute;\n z-index: 10001;\n min-width: 12rem;\n background: var(--snice-color-surface, rgb(255 255 255));\n border: 1px solid var(--snice-color-border, rgb(226 226 226));\n border-radius: var(--snice-border-radius-md, 0.25rem);\n box-shadow: var(--snice-shadow-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1));\n padding: var(--snice-spacing-2xs, 0.25rem);\n }\n\n .toolbar-menu-title {\n padding: var(--snice-spacing-2xs, 0.25rem) var(--snice-spacing-xs, 0.5rem);\n font-size: var(--snice-font-size-xs, 0.75rem);\n font-weight: var(--snice-font-weight-semibold, 600);\n color: var(--snice-color-text-tertiary, rgb(115 115 115));\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .toolbar-menu-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: var(--snice-spacing-2xs, 0.25rem) var(--snice-spacing-xs, 0.5rem);\n border: none;\n border-radius: 3px;\n background: transparent;\n color: var(--snice-color-text, rgb(23 23 23));\n font-size: var(--snice-font-size-sm, 0.875rem);\n font-family: inherit;\n cursor: pointer;\n text-align: left;\n }\n\n .toolbar-menu-item:hover {\n background: var(--snice-color-surface-container-low, rgb(245 245 245));\n }\n\n .toolbar-menu-item--active {\n color: var(--snice-color-primary, rgb(37 99 235));\n font-weight: var(--snice-font-weight-medium, 500);\n }\n\n .toolbar-menu-item-indicator {\n font-size: 0.75rem;\n opacity: 0.7;\n }\n\n .toolbar-clear-btn {\n margin-top: var(--snice-spacing-2xs, 0.25rem);\n border-top: 1px solid var(--snice-color-border, rgb(226 226 226));\n border-radius: 0;\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n font-size: var(--snice-font-size-xs, 0.75rem);\n }\n\n /* Filter menu */\n .toolbar-filter-menu {\n min-width: 16rem;\n padding: var(--snice-spacing-xs, 0.5rem);\n }\n\n .toolbar-filter-row {\n display: flex;\n flex-direction: column;\n gap: 2px;\n margin-bottom: var(--snice-spacing-2xs, 0.25rem);\n }\n\n .toolbar-filter-label {\n font-size: var(--snice-font-size-xs, 0.75rem);\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n font-weight: var(--snice-font-weight-medium, 500);\n }\n\n .toolbar-filter-input {\n width: 100%;\n box-sizing: border-box;\n padding: var(--snice-spacing-2xs, 0.25rem) var(--snice-spacing-xs, 0.5rem);\n border: 1px solid var(--snice-color-border, rgb(226 226 226));\n border-radius: var(--snice-border-radius-md, 0.25rem);\n font-size: var(--snice-font-size-sm, 0.875rem);\n font-family: inherit;\n color: var(--snice-color-text, rgb(23 23 23));\n background: var(--snice-color-surface, rgb(255 255 255));\n outline: none;\n }\n\n .toolbar-filter-input:focus {\n border-color: var(--snice-color-primary, rgb(37 99 235));\n }\n\n .toolbar-filter-input::placeholder {\n color: var(--snice-color-text-tertiary, rgb(115 115 115));\n }\n\n .table-controls {\n display: flex;\n gap: var(--snice-spacing-xs, 0.5rem);\n align-items: center;\n flex-wrap: wrap;\n padding: var(--snice-spacing-xs, 0.5rem) var(--snice-spacing-sm, 0.75rem);\n padding-left: 0;\n justify-content: flex-start;\n }\n\n :host(:not([searchable])) .search-input {\n display: none;\n }\n\n :host(.selector-options-empty) .selector-input {\n display: none;\n }\n\n /* snice-input/snice-select handle own styling — layout only */\n .search-input {\n width: 16rem;\n max-width: 16rem;\n flex: 0 0 auto;\n }\n\n .selector-input {\n min-width: 9.375rem;\n --snice-select-min-height: 2rem;\n }\n\n /* Sort indicators */\n .sort-header {\n display: flex;\n align-items: center;\n gap: var(--snice-spacing-xs, 0.5rem);\n justify-content: space-between;\n }\n\n\n .sort-indicator {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n line-height: 1;\n opacity: 0.3;\n transition: opacity var(--snice-transition-fast, 150ms);\n }\n\n .sort-indicator.active {\n opacity: 1;\n color: var(--snice-color-primary, rgb(37 99 235));\n }\n\n .sort-order {\n font-size: 0.625rem;\n font-weight: 700;\n background: var(--snice-color-primary, rgb(37 99 235));\n color: rgb(255 255 255);\n border-radius: 999px;\n padding: 0.0625rem 0.3125rem;\n min-width: 1rem;\n height: 1rem;\n line-height: 1rem;\n text-align: center;\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n /* Loading fade. Scoped to ROWS, never the whole tbody: with no rows the\n only thing in there is the loading indicator, and dimming that halves\n the contrast of the one element whose entire job is to be seen. */\n tbody > tr {\n transition: opacity var(--snice-transition-normal, 250ms);\n }\n\n :host([loading]) tbody > tr:not(.table-message-row) {\n opacity: 0.5;\n }\n\n /* Refetch spinner while rows stay on screen (SNICE-142) */\n .table-loading-overlay {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n z-index: 2;\n }\n\n /* Zero-row loading: spinner + the word, centred in the empty body. */\n .table-loading-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--snice-spacing-xs, 0.5rem);\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n }\n\n .table-loading-label {\n font-size: var(--snice-font-size-sm, 0.875rem);\n line-height: 1;\n }\n\n /* snice-progress draws its circular track at 20% alpha, which disappears\n entirely on a dark surface — the ring the field report saw was a\n near-black hairline on near-black. Both table spinners opt out and use\n the border token at full strength, so the track reads in either\n theme and the primary arc always has something to travel around. */\n .table-loading-state snice-progress,\n .table-loading-overlay snice-progress {\n --progress-track-opacity: 1;\n --progress-bg: var(--snice-color-border, rgb(226 226 226));\n --progress-color: var(--snice-color-primary, rgb(37 99 235));\n }\n\n .no-data {\n text-align: center;\n padding: var(--snice-spacing-lg, 1.5rem);\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n }\n\n /* Remote-mode load error (Task 4c) — informed by the dead\n components/table/snice-table.css .table--error design. */\n :host(.table--error) .table-frame {\n border-color: var(--snice-color-danger, rgb(220 38 38));\n }\n\n .table-error-message {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--snice-spacing-2xs, 0.25rem);\n color: var(--snice-color-danger, rgb(220 38 38));\n }\n\n /* Pagination */\n .pagination {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--snice-spacing-md, 1rem);\n padding: var(--snice-spacing-sm, 0.75rem) var(--snice-spacing-md, 1rem);\n border-top: 1px solid var(--snice-color-border, rgb(226 226 226));\n background: var(--snice-color-surface, rgb(255 255 255));\n font-size: var(--snice-font-size-sm, 0.875rem);\n flex-wrap: wrap;\n }\n\n .pagination__info {\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n white-space: nowrap;\n }\n\n .pagination__controls {\n display: flex;\n align-items: center;\n gap: 2px;\n }\n\n .pagination__btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 2rem;\n height: 2rem;\n padding: 0 var(--snice-spacing-2xs, 0.25rem);\n border: 1px solid var(--snice-color-border, rgb(226 226 226));\n border-radius: var(--snice-border-radius-md, 0.25rem);\n background: var(--snice-color-surface, rgb(255 255 255));\n color: var(--snice-color-text, rgb(23 23 23));\n font-size: var(--snice-font-size-sm, 0.875rem);\n cursor: pointer;\n transition: all var(--snice-transition-fast, 150ms) ease;\n font-family: inherit;\n line-height: 1;\n }\n\n .pagination__btn:hover:not(:disabled) {\n background: var(--snice-color-surface-container-low, rgb(245 245 245));\n }\n\n .pagination__btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n }\n\n .pagination__btn--active {\n background: var(--snice-color-primary, rgb(37 99 235));\n color: var(--snice-color-text-inverse, rgb(250 250 250));\n border-color: var(--snice-color-primary, rgb(37 99 235));\n }\n\n .pagination__btn--active:hover:not(:disabled) {\n background: var(--snice-color-primary-hover, rgb(29 78 216));\n }\n\n .pagination__btn:focus-visible {\n outline: 2px solid var(--snice-color-primary, rgb(37 99 235));\n outline-offset: 2px;\n z-index: 1;\n }\n\n .pagination__ellipsis {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 2rem;\n height: 2rem;\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n }\n\n .pagination__size {\n display: flex;\n align-items: center;\n gap: var(--snice-spacing-xs, 0.5rem);\n white-space: nowrap;\n }\n\n .pagination__size label {\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n }\n\n .pagination__size-select {\n min-width: 4.5rem;\n --snice-select-min-height: 1.75rem;\n }\n\n /* Column resize handle */\n .resize-handle {\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n cursor: col-resize;\n background: transparent;\n z-index: 1;\n }\n\n .resize-handle:hover,\n .resize-handle:active {\n background: var(--snice-color-primary, rgb(37 99 235));\n }\n\n /* Filter indicator */\n th.filtered::after {\n content: '';\n position: absolute;\n top: 4px;\n right: 8px;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--snice-color-primary, rgb(37 99 235));\n }\n\n /* Pinned columns.\n\n A frozen column must be opaque — scrolled cells pass underneath it —\n and a header keeps the header's own surface rather than borrowing the\n body's. The frozen EDGE (the inner-most pinned column on each side) is\n what the reader actually needs to see: a heavier divider plus a soft\n shadow cast INTO the scrolling region, mirrored per side. Between two\n columns pinned to the same side there is no boundary to mark, so they\n keep the ordinary cell border.\n\n The shadow is a border-token tint, not black: a black drop shadow is\n invisible against a dark surface, which is exactly how pinning came to\n have no affordance at all in the dark theme. */\n .pinned-cell {\n background: var(--snice-color-surface, rgb(255 255 255));\n }\n\n th.pinned-cell {\n background: var(--snice-color-surface-container-low, rgb(245 245 245));\n }\n\n .pinned-cell--left.pinned-cell--edge {\n border-right: 2px solid var(--snice-color-border, rgb(226 226 226));\n box-shadow: 6px 0 8px -6px var(--snice-color-border, rgb(226 226 226));\n }\n\n .pinned-cell--right.pinned-cell--edge {\n border-left: 2px solid var(--snice-color-border, rgb(226 226 226));\n box-shadow: -6px 0 8px -6px var(--snice-color-border, rgb(226 226 226));\n }\n\n /* A right-pinned header is often the last cell in the row, where the\n shared rule above strips the right border. Its divider is on the left,\n so nothing to restore — but the edge border must survive that rule. */\n th:last-child.pinned-cell--right.pinned-cell--edge,\n td:last-child.pinned-cell--right.pinned-cell--edge {\n border-right: none;\n }\n\n /* Pin marker: the only cue when the table is wide enough not to scroll. */\n .pin-indicator {\n display: inline-flex;\n align-items: center;\n margin-left: var(--snice-spacing-2xs, 0.25rem);\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n opacity: 0.65;\n vertical-align: middle;\n pointer-events: none;\n }\n\n .pin-indicator--right {\n transform: scaleX(-1);\n }\n\n /* Density: compact */\n :host([density=\"compact\"]) th {\n padding: var(--snice-spacing-2xs, 0.25rem) var(--snice-spacing-xs, 0.5rem);\n font-size: var(--snice-font-size-xs, 0.75rem);\n }\n\n :host([density=\"compact\"]) td {\n padding: var(--snice-spacing-3xs, 0.125rem) var(--snice-spacing-xs, 0.5rem);\n font-size: var(--snice-font-size-xs, 0.75rem);\n }\n\n /* Density: comfortable */\n :host([density=\"comfortable\"]) th {\n padding: var(--snice-spacing-md, 1rem);\n }\n\n :host([density=\"comfortable\"]) td {\n padding: var(--snice-spacing-sm, 0.75rem) var(--snice-spacing-md, 1rem);\n }\n\n /* Editing */\n .table-editor-input {\n width: 100%;\n box-sizing: border-box;\n padding: var(--snice-spacing-2xs, 0.25rem);\n border: 2px solid var(--snice-color-primary, rgb(37 99 235));\n border-radius: var(--snice-border-radius-sm, 0.125rem);\n font-family: inherit;\n font-size: inherit;\n color: var(--snice-color-text, rgb(23 23 23));\n background: var(--snice-color-surface, rgb(255 255 255));\n outline: none;\n }\n\n .table-editor-select {\n width: 100%;\n padding: var(--snice-spacing-2xs, 0.25rem);\n border: 2px solid var(--snice-color-primary, rgb(37 99 235));\n border-radius: var(--snice-border-radius-sm, 0.125rem);\n font-family: inherit;\n font-size: inherit;\n }\n\n .table-editor-checkbox {\n width: 1rem;\n height: 1rem;\n }\n\n td.editing {\n padding: 2px !important;\n }\n\n .cell-error {\n color: var(--snice-color-danger, rgb(220 38 38));\n font-size: var(--snice-font-size-xs, 0.75rem);\n margin-top: 2px;\n }\n\n /* Header filter row */\n .header-filter-row td {\n padding: 0;\n background: var(--snice-color-surface-container-low, rgb(245 245 245));\n border-bottom: 1px solid var(--snice-color-border, rgb(226 226 226));\n }\n\n .header-filter-input {\n width: 100%;\n box-sizing: border-box;\n padding: var(--snice-spacing-2xs, 0.25rem) var(--snice-spacing-xs, 0.5rem);\n border: none;\n font-size: var(--snice-font-size-xs, 0.75rem);\n font-family: inherit;\n color: var(--snice-color-text, rgb(23 23 23));\n background: transparent;\n outline: none;\n }\n\n .header-filter-input::placeholder {\n color: var(--snice-color-text-tertiary, rgb(115 115 115));\n }\n\n .header-filter-input:focus {\n background: var(--snice-color-surface-container-lowest, rgb(248 247 245));\n }\n\n /* Tree data indentation */\n .tree-indent {\n display: inline-flex;\n align-items: center;\n vertical-align: middle;\n }\n\n .tree-toggle {\n background: none;\n border: none;\n cursor: pointer;\n padding: 0;\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 0.7rem;\n line-height: 1;\n width: 1.25rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: transform var(--snice-transition-fast, 150ms) ease;\n }\n\n .tree-toggle:hover {\n color: var(--snice-color-text, rgb(23 23 23));\n }\n\n .tree-toggle:focus-visible {\n outline: var(--snice-focus-ring-width, 2px) solid var(--snice-focus-ring-color, hsl(217 91% 60% / 0.5));\n outline-offset: var(--snice-focus-ring-offset, 2px);\n }\n\n .tree-toggle-icon {\n width: 1rem;\n height: 1rem;\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n transform: rotate(-90deg);\n }\n\n .tree-toggle--expanded .tree-toggle-icon {\n transform: rotate(0deg);\n }\n\n .tree-spacer {\n display: inline-block;\n width: 1.25rem;\n }\n\n /* Row grouping — group header row */\n .group-header-row {\n background: var(--snice-table-group-header-bg, var(--snice-color-surface-container-low, hsl(0 0% 98%)));\n }\n\n .group-header-cell {\n cursor: pointer;\n font-weight: var(--snice-font-weight-semibold, 600);\n color: var(--snice-table-group-header-color, var(--snice-color-text, hsl(0 0% 9%)));\n user-select: none;\n padding: var(--snice-spacing-xs, 0.5rem) var(--snice-spacing-sm, 0.75rem);\n }\n\n .group-header-cell .tree-indent {\n vertical-align: middle;\n }\n\n .group-select-wrap {\n display: inline-flex;\n align-items: center;\n vertical-align: middle;\n margin-right: var(--snice-spacing-2xs, 0.25rem);\n }\n\n .group-header-label {\n vertical-align: middle;\n }\n\n .group-header-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 1.25rem;\n height: 1.25rem;\n margin-left: var(--snice-spacing-xs, 0.5rem);\n padding: 0 var(--snice-spacing-2xs, 0.25rem);\n border-radius: 999px;\n background: var(--snice-table-group-count-bg, var(--snice-color-surface-container-high, hsl(40 9% 97%)));\n color: var(--snice-table-group-count-color, var(--snice-color-text-secondary, hsl(0 0% 32%)));\n font-size: var(--snice-font-size-xs, 0.75rem);\n font-weight: var(--snice-font-weight-medium, 500);\n vertical-align: middle;\n }\n\n /* Row grouping — aggregate footer row */\n .group-aggregate-row {\n background: var(--snice-table-aggregate-bg, var(--snice-color-surface-container, hsl(0 0% 95%)));\n font-weight: var(--snice-font-weight-medium, 500);\n }\n\n .group-aggregate-row[data-agg-scope=\"table\"] {\n border-top: 2px solid var(--snice-table-aggregate-border-color, var(--snice-color-border, hsl(0 0% 82%)));\n font-weight: var(--snice-font-weight-semibold, 600);\n }\n\n .group-aggregate-row .aggregate-cell {\n color: var(--snice-table-aggregate-color, var(--snice-color-text, hsl(0 0% 9%)));\n }\n\n .aggregate-label {\n color: var(--snice-table-aggregate-label-color, var(--snice-color-text-secondary, hsl(0 0% 32%)));\n text-transform: uppercase;\n letter-spacing: 0.05em;\n font-size: var(--snice-font-size-xs, 0.75rem);\n }\n\n .aggregate-label--inline {\n display: block;\n margin-bottom: var(--snice-spacing-2xs, 0.25rem);\n }\n\n /* Row pinning */\n .pinned-row {\n font-weight: var(--snice-font-weight-medium, 500);\n border-bottom: 2px solid var(--snice-color-border, rgb(226 226 226));\n background: var(--snice-color-surface-container-low, rgb(245 245 245));\n }\n\n .pinned-row--top {\n border-bottom: 2px solid var(--snice-color-primary, rgb(37 99 235));\n }\n\n .pinned-row--bottom {\n border-top: 2px solid var(--snice-color-primary, rgb(37 99 235));\n }\n\n /* Column group headers */\n .column-group-row th {\n text-align: center;\n font-size: var(--snice-font-size-xs, 0.75rem);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n background: var(--snice-color-surface-container, rgb(235 235 235));\n border-bottom: 1px solid var(--snice-color-border, rgb(226 226 226));\n }\n\n /* DnD */\n .drag-handle-cell {\n font-size: 0.875rem;\n }\n\n .drop-indicator {\n position: absolute;\n left: 0;\n right: 0;\n height: 2px;\n background: var(--snice-color-primary, rgb(37 99 235));\n z-index: 10;\n pointer-events: none;\n }\n\n tr[draggable=\"true\"]:active {\n cursor: grabbing;\n }\n\n /* Master-detail — animated like accordion */\n .detail-row {\n background: var(--snice-color-surface-container-high, rgb(252 251 249));\n }\n\n .detail-cell {\n max-width: none;\n }\n\n .detail-content {\n overflow: hidden;\n max-height: 0;\n transition: max-height 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n will-change: max-height;\n }\n\n .detail-content--open {\n max-height: var(--detail-max-height, 31.25rem);\n }\n\n .detail-content-inner {\n padding: var(--snice-spacing-sm, 0.75rem) var(--snice-spacing-md, 1rem);\n border-top: 1px solid var(--snice-color-border, rgb(226 226 226));\n }\n\n .detail-toggle {\n background: none;\n border: none;\n cursor: pointer;\n padding: 0;\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n line-height: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .detail-toggle:hover {\n color: var(--snice-color-text, rgb(23 23 23));\n }\n\n .detail-toggle-icon {\n width: 1rem;\n height: 1rem;\n transition: transform 0.2s ease;\n transform: rotate(-90deg);\n }\n\n .detail-toggle--expanded .detail-toggle-icon {\n transform: rotate(0deg);\n }\n\n /* Drag handle */\n .drag-handle-cell {\n cursor: grab;\n user-select: none;\n color: var(--snice-color-text-tertiary, rgb(115 115 115));\n font-size: 0.875rem;\n }\n\n /* Focus indicator for keyboard nav */\n [data-grid-focus] {\n outline: 2px solid var(--snice-color-primary, rgb(37 99 235));\n outline-offset: -2px;\n }\n\n /* Column menu */\n .table-column-menu {\n position: fixed;\n z-index: 10001;\n min-width: 10rem;\n background: var(--snice-color-surface-container-high, rgb(252 251 249));\n border: 1px solid var(--snice-color-border, rgb(226 226 226));\n border-radius: var(--snice-border-radius-md, 0.25rem);\n box-shadow: var(--snice-shadow-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1));\n padding: 4px;\n }\n\n .column-menu-separator {\n height: 1px;\n background: var(--snice-color-border, rgb(226 226 226));\n margin: 4px 0;\n }\n\n .column-menu-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.375rem 0.625rem;\n border: none;\n border-radius: 3px;\n background: transparent;\n color: var(--snice-color-text, rgb(23 23 23));\n font-size: var(--snice-font-size-sm, 0.875rem);\n font-family: inherit;\n cursor: pointer;\n text-align: left;\n white-space: nowrap;\n }\n\n .column-menu-item:hover {\n background: var(--snice-color-surface-container-low, rgb(245 245 245));\n }\n\n .column-menu-item:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .column-menu-item--active {\n color: var(--snice-color-primary, rgb(37 99 235));\n font-weight: var(--snice-font-weight-medium, 500);\n }\n\n .column-menu-icon {\n width: 1rem;\n height: 1rem;\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n color: var(--snice-color-text-secondary, rgb(82 82 82));\n }\n .column-menu-icon svg {\n width: 1rem;\n height: 1rem;\n }\n\n /* Slotted table layout */\n .snice-table--slotted {\n border: 1px solid var(--snice-color-border, rgb(226 226 226));\n border-radius: var(--snice-border-radius-lg, 0.5rem);\n overflow: hidden;\n }\n\n .snice-table--slotted .table-header {\n display: grid;\n grid-auto-flow: column;\n grid-auto-columns: 1fr;\n background-color: var(--snice-color-surface-container-low, rgb(245 245 245));\n border-bottom: 2px solid var(--snice-color-border, rgb(226 226 226));\n padding: var(--snice-spacing-sm, 0.75rem);\n font-weight: var(--snice-font-weight-semibold, 600);\n color: var(--snice-color-text, rgb(23 23 23));\n }\n\n .snice-table--slotted .header-cell {\n color: var(--snice-color-text, rgb(23 23 23));\n }\n\n .snice-table--slotted .table-header::slotted(snice-column) {\n padding: var(--snice-spacing-sm, 0.75rem);\n }\n\n .snice-table--slotted .table-body {\n display: flex;\n flex-direction: column;\n }\n\n .snice-table--slotted .table-body::slotted(snice-row) {\n border-bottom: 1px solid var(--snice-color-border, rgb(226 226 226));\n }\n\n .snice-table--slotted .table-body::slotted(snice-row:last-child) {\n border-bottom: none;\n }\n\n :host([striped]) .snice-table--slotted .table-body::slotted(snice-row:nth-child(even)) {\n background-color: var(--snice-table-stripe-bg, var(--snice-color-overlay-stripe, hsl(0 0% 0% / 0.02)));\n }\n\n :host([hoverable]) .snice-table--slotted .table-body::slotted(snice-row:hover) {\n background-color: var(--snice-color-surface-container, rgb(235 235 235));\n }\n `;\n }\n\n @render()\n render() {\n // Check if we have slotted rows\n const hasSlottedRows = this.querySelectorAll('snice-row[slot=\"rows\"]').length > 0\n && !this.shouldModelSlottedRows();\n\n if (hasSlottedRows) {\n // Use slotted rows layout\n return html/*html*/`\n <div class=\"snice-table snice-table--slotted\" @click=${this.handleClick} @keydown=${this.handleKeydown} @change=${this.handleChange} @checkbox-change=${this.handleChange}>\n <div class=\"table-controls-container\"></div>\n<div class=\"table-header\" id=\"slotted-header\"></div>\n <div class=\"table-body\">\n <slot name=\"rows\"></slot>\n </div>\n <slot name=\"columns\" style=\"display: none;\"></slot>\n </div>\n `;\n } else {\n // Use traditional table layout\n return html/*html*/`\n <div class=\"snice-table\" @click=${this.handleClick} @keydown=${this.handleKeydown} @change=${this.handleChange} @checkbox-change=${this.handleChange}>\n <div class=\"table-controls-container\"></div>\n<div class=\"table-frame\">\n <div class=\"table-superheader\" part=\"superheader\">\n <slot name=\"header\"></slot>\n </div>\n <table>\n <thead></thead>\n <tbody></tbody>\n </table>\n </div>\n <div class=\"table-pagination-container\"></div>\n </div>\n `;\n }\n }\n\n renderControls() {\n const container = this.shadowRoot?.querySelector('.table-controls-container');\n if (!container) return;\n\n // A configured toolbar owns this container. Reattach it when a structural\n // render replaces the shadow template; legacy controls must not overwrite it.\n if (this.toolbarOptions) {\n this.setToolbar(this.toolbarOptions);\n return;\n }\n\n const showControls = this.searchable || this.filterable || this.quickFilter;\n if (!showControls) {\n container.innerHTML = '';\n return;\n }\n\n container.innerHTML = '';\n const controlsDiv = document.createElement('div');\n controlsDiv.className = 'table-controls';\n controlsDiv.setAttribute('part', 'controls');\n\n if (this.quickFilter) {\n const quickInput = document.createElement('snice-input') as any;\n quickInput.className = 'quick-filter-input';\n quickInput.type = 'search';\n quickInput.placeholder = 'Quick filter...';\n quickInput.size = 'small';\n quickInput.clearable = true;\n quickInput.style.width = '16rem';\n quickInput.style.maxWidth = '16rem';\n quickInput.value = this.filterEngine.getFilterModel().quickFilter || '';\n quickInput.addEventListener('input', this.handleQuickFilterInput);\n controlsDiv.appendChild(quickInput);\n } else if (this.searchable) {\n const searchInput = document.createElement('snice-input');\n searchInput.className = 'search-input';\n searchInput.setAttribute('type', 'search');\n searchInput.setAttribute('placeholder', 'Search...');\n searchInput.setAttribute('size', 'small');\n searchInput.style.width = '16rem';\n searchInput.style.maxWidth = '16rem';\n searchInput.style.flex = '0 0 auto';\n searchInput.addEventListener('input', this.handleSearchInput);\n controlsDiv.appendChild(searchInput);\n }\n\n if (this.filterable) {\n const select = document.createElement('snice-select');\n select.className = 'selector-input';\n select.setAttribute('multiple', '');\n select.setAttribute('searchable', '');\n select.setAttribute('clearable', '');\n select.setAttribute('placeholder', 'Filter...');\n select.setAttribute('size', 'medium');\n\n this.selectorOptions.forEach(opt => {\n const option = document.createElement('snice-option');\n option.setAttribute('value', opt.value);\n option.textContent = opt.label;\n select.appendChild(option);\n });\n\n controlsDiv.appendChild(select);\n }\n\n container.appendChild(controlsDiv);\n }\n\n // Re-derive the frame-dependent layout whenever the frame's box changes\n // (host resized, fullscreen toggled): the columns share its width, and the\n // leftover space below the rows changes with its height.\n @observe('resize', '.table-frame')\n handleFrameResize() {\n // Only when the width actually moved. Fitting rewrites header widths, which\n // can change row heights, which can flip the frame's vertical scrollbar and\n // call us straight back — the guard stops that becoming a cycle.\n const width = (this.shadowRoot?.querySelector('.table-frame') as HTMLElement | null)?.clientWidth ?? 0;\n if (width > 0 && width !== this.lastFittedFrameWidth) {\n this.lastFittedFrameWidth = width;\n this.syncColumnWidthsToFrame();\n }\n this.updateFillRow();\n }\n\n @ready()\n async initialize() {\n // Listen for controller attached event\n this.addEventListener('controller-attached', this.onAttached as EventListener);\n\n // Listen for select change events from the filter dropdown\n this.addEventListener('select-change', this.handleSelectorChange as EventListener);\n this.addEventListener('row-select', this.handleSlottedRowSelect as EventListener);\n\n // Listen for detail panel toggle\n this.addEventListener('detail-toggle', () => this.renderBody());\n\n // Persist committed edits back into the local dataset so the re-render\n // shows the new value. Fires before commitEdit()'s renderBody() (the\n // editor dispatches synchronously), so data is current by render time.\n this.addEventListener('cell-edit-commit', ((e: CustomEvent) => {\n const { rowIndex, columnKey, newValue } = e.detail;\n const row = this.data[rowIndex];\n if (row) row[columnKey] = newValue;\n // A4: an in-place cell change can alter which rows match an active filter.\n // Row identity is unchanged, so the index map stays valid — only the\n // filtered snapshot must be dropped.\n this.invalidateFilteredCache();\n // Task B: the row object was mutated in place (same reference), so the\n // reconciler would reuse its stale cell DOM. Drop its cached <tr> so the\n // post-commit render rebuilds it with the new value.\n if (row) this.invalidateRenderedRow(row);\n }) as EventListener);\n\n this.addEventListener('row-edit-commit', ((e: CustomEvent) => {\n const { rowIndex, newRow } = e.detail;\n if (this.data[rowIndex]) this.data[rowIndex] = newRow;\n // A1/A4: an element was swapped in place (same array reference), so the\n // ref-check can't see it — resync the index map and filtered snapshot.\n this.rebuildRowIndex();\n }) as EventListener);\n\n // Wait for snice-column to be defined\n await customElements.whenDefined('snice-column');\n await customElements.whenDefined('snice-row');\n\n // Process slotted columns and rows\n await this.processSlottedContent();\n await (this as any).rendered;\n\n // Pre-connect property assignments do not invoke change-only watchers in\n // Snice. Configure grouping explicitly once initialization has applied\n // those values so `table.groupBy = ...` works before the element is added\n // to the document (React/story/programmatic creation path).\n this.syncGrouping();\n\n // Render controls after initial setup\n this.renderControls();\n\n // Initialize feature modules\n this.initializeModules();\n this.initColumnMenu();\n\n // Setup DnD\n if (this.rowReorder) this.rowDnD.attach(this);\n if (this.columnReorder) this.columnDnD.attach(this);\n\n // We are at the safe post-template point and all feature modules that\n // affect row/header construction are attached. Finish the initial paint\n // synchronously so the public `ready` promise includes pre-connect\n // grouping, DnD handles, keyboard ARIA, and aggregate footers.\n this.renderHeader();\n this.renderBody();\n\n // Setup virtualization if enabled\n if (this.virtualize) {\n requestAnimationFrame(() => {\n if (!this.virtualizer.isEnabled()) this.setupVirtualization();\n });\n }\n\n // Setup lazy loading\n if (this.lazyLoad) {\n requestAnimationFrame(() => this.setupLazyLoading());\n }\n\n // Listen for DnD events\n this.addEventListener('row-reorder', ((e: CustomEvent) => {\n const { fromIndex, toIndex } = e.detail;\n if (!Number.isInteger(fromIndex) || !Number.isInteger(toIndex)\n || fromIndex < 0 || toIndex < 0\n || fromIndex >= this.data.length || toIndex >= this.data.length) return;\n if (fromIndex === toIndex) return;\n\n const selectedRows = this.selectedRows\n .map((index) => this.data[index])\n .filter((row) => row !== undefined);\n const expandedRows = Array.from(this.masterDetail.getExpandedRows())\n .map((index) => this.data[index])\n .filter((row) => row !== undefined);\n const item = this.data.splice(fromIndex, 1)[0];\n\n // A drop onto another group means reparenting the row. Group rendering\n // is derived from the groupBy fields, so merely changing raw array order\n // would make a cross-group drop visually snap back to its old group.\n // Copy the target leaf's grouping values before insertion so the rendered\n // result honors the user's actual drop target (all nested levels too).\n const targetBeforeRemoval = this.data[toIndex > fromIndex ? toIndex - 1 : toIndex];\n if (item && targetBeforeRemoval && this.grouping.hasGrouping()) {\n for (const key of this.grouping.getGroupByKeys()) {\n item[key] = targetBeforeRemoval[key];\n }\n }\n\n this.data.splice(toIndex, 0, item);\n // Reordering the SAME rows is not a delivery: a failed reload keeps its\n // error until data actually arrives, so a drag must not dismiss it.\n // Everything else the data watcher does (row index, detail prep, render)\n // is still wanted here — hence a narrow flag rather than\n // `settingSortedData`, which skips all of it.\n this.reorderingRows = true;\n try {\n this.data = [...this.data];\n } finally {\n this.reorderingRows = false;\n }\n this.selectedRows = selectedRows\n .map((row) => this.indexOfRow(row))\n .filter((index) => index >= 0);\n this.masterDetail.setExpandedRows(\n expandedRows.map((row) => this.indexOfRow(row)).filter((index) => index >= 0)\n );\n }) as EventListener);\n\n this.addEventListener('column-reorder', ((e: CustomEvent) => {\n const { fromKey, toKey } = e.detail;\n const fromIdx = this.columns.findIndex(c => c.key === fromKey);\n const toIdx = this.columnManager.getVisibleColumns().findIndex(c => c.key === toKey);\n if (fromIdx >= 0 && toIdx >= 0) {\n this.columnManager.moveColumn(fromKey, toIdx);\n this.renderHeader();\n this.renderBody();\n }\n }) as EventListener);\n\n // Listen for tree toggle\n this.addEventListener('tree-toggle', () => this.renderBody());\n\n }\n\n private async processSlottedContent() {\n // Get slotted column elements\n const columnElements = Array.from(this.querySelectorAll('snice-column[slot=\"columns\"]')) as any[];\n const rowElements = Array.from(this.querySelectorAll('snice-row[slot=\"rows\"]')) as any[];\n await Promise.all(rowElements.map((row) => row.ready));\n\n if (columnElements.length > 0) {\n // Extract column definitions from snice-column elements\n this.columns = columnElements.map((col: any) => col.getColumnDefinition());\n }\n\n // Pass declarative or programmatically assigned column definitions to rows.\n rowElements.forEach((row: any, index: number) => {\n row.columns = this.columns;\n row.index = index;\n row.hoverable = this.hoverable;\n row.clickable = this.clickable;\n });\n this.syncSlottedSelectionState();\n\n // Grouping/aggregation operates on the same model regardless of whether\n // rows came from a JS array or declarative <snice-row> children.\n if (this.shouldModelSlottedRows()) this.syncSlottedRowsIntoData();\n\n // Render the header for slotted mode (after next tick to ensure DOM is updated)\n if (columnElements.length > 0 && !this.shouldModelSlottedRows()) {\n requestAnimationFrame(() => this.renderSlottedHeader());\n }\n }\n\n /** Whether declarative rows need the full grouping/aggregation table model. */\n private shouldModelSlottedRows(): boolean {\n const keys = Array.isArray(this.groupBy) ? this.groupBy : (this.groupBy ? [this.groupBy] : []);\n return keys.some(Boolean) || this.columns.some((column) => column.aggregate != null);\n }\n\n /** Copy declarative row data into the table model without parsing markup. */\n private syncSlottedRowsIntoData() {\n const rowElements = Array.from(this.querySelectorAll('snice-row[slot=\"rows\"]')) as any[];\n if (rowElements.length === 0) return;\n\n const rows = rowElements.map((row) => {\n if (row.data && Object.keys(row.data).length > 0) return row.data;\n const serialized = row.getAttribute('data');\n if (serialized) {\n try { return JSON.parse(serialized); }\n catch { /* snice-row's data-* extraction remains the fallback */ }\n }\n return row.data ?? {};\n });\n this.data = rows;\n }\n\n private renderSlottedHeader() {\n const headerContainer = this.shadowRoot?.querySelector('#slotted-header');\n if (!headerContainer || this.columns.length === 0) return;\n\n // Render column headers as DOM/text, never parsed definition markup.\n headerContainer.replaceChildren();\n for (const column of this.columns) {\n const cell = document.createElement('div');\n cell.className = 'header-cell';\n cell.textContent = column.label ?? column.key;\n headerContainer.appendChild(cell);\n }\n }\n\n /** Keep declarative column definitions reactive, including aggregate. */\n @on('column-changed')\n private handleDeclarativeColumnChange() {\n const columnElements = Array.from(this.querySelectorAll('snice-column[slot=\"columns\"]')) as any[];\n if (columnElements.length === 0) return;\n this.columns = columnElements.map((column) => column.getColumnDefinition());\n\n // Ungrouped declarative rows stay in their light-DOM rendering path, so\n // they do not consume the native table render scheduled by the columns\n // watcher. Keep their model and header synchronized explicitly. When a new\n // aggregate switches the table to native mode the watcher instead copies\n // row data into the shared model.\n const rowElements = Array.from(this.querySelectorAll('snice-row[slot=\"rows\"]')) as any[];\n rowElements.forEach((row) => { row.columns = this.columns; });\n requestAnimationFrame(() => {\n if (!this.shouldModelSlottedRows()) this.renderSlottedHeader();\n this.renderControls();\n });\n }\n\n\n @watch('selectorOptions')\n handleSelectorOptionsChange() {\n // Update CSS class to show/hide selector\n if (this.selectorOptions.length === 0) {\n this.classList.add('selector-options-empty');\n } else {\n this.classList.remove('selector-options-empty');\n }\n }\n\n @watch('sortable')\n handleSortableChange() {\n this.renderHeader(); // Re-render header to show/hide sort indicators\n }\n\n @watch('selectable')\n handleSelectableChange() {\n this.render(); // host template (the structural mode can change)\n // The checkbox tool column is structural: like the sibling selection-mode\n // watcher, a post-mount toggle has to rebuild the header (select-all th)\n // AND every row (row checkbox) — the host template render leaves the\n // imperatively built thead/tbody untouched, so without this the two\n // disagree and every data cell sits one column off its header. Rows are\n // never recycled stale across the toggle: computeStructuralSig folds in\n // `sel=`. Skipped before the first render — the initial paint reads\n // `selectable` itself.\n if (this.thead) this.scheduleRender('both');\n queueMicrotask(() => this.syncSlottedSelectionState());\n }\n\n // C1: reactive columns. A new column set can change cell types/formatting\n // without changing keys (which the row signature keys on), so drop the\n // recycler map and resync the column model before the header renders. All DOM\n // construction is deferred to the coalescing queue (setter-stack landmine).\n @watch('columns', { immediate: false })\n handleColumnsAssignment() {\n this.renderedRows = new Map();\n // A new array is a NEW CONFIGURATION: its order / pinned / width / declared\n // set replace whatever the column model is holding, and states for columns\n // it no longer declares are dropped. initialize() is the render-path resync\n // that must NOT do this (it would undo a drag-resize on every paint).\n if (this.columns.length > 0) this.columnManager.applyConfiguration(this.columns, this);\n // F: a column set change can add/remove an `aggregate` — resync the grouping\n // model's aggregator list and drop its stale flattened snapshot.\n this.grouping.setColumns(this.columns);\n this.invalidateGroupingCache();\n const hasSlottedRows = !!this.querySelector('snice-row[slot=\"rows\"]');\n const modelSlottedRows = this.shouldModelSlottedRows();\n if (hasSlottedRows\n && this.virtualizer.isEnabled()\n && !!this.shadowRoot?.querySelector('table') !== modelSlottedRows) {\n this.virtualizer.detach();\n }\n if (modelSlottedRows) this.syncSlottedRowsIntoData();\n if (hasSlottedRows) {\n requestAnimationFrame(() => {\n if (!modelSlottedRows) this.renderSlottedHeader();\n this.renderControls();\n if (this.toolbarOptions) this.setToolbar(this.toolbarOptions);\n if (this.lazyLoad) this.setupLazyLoading();\n });\n }\n this.scheduleRender('both');\n }\n\n // F: reactive groupBy. Post-mount `table.groupBy = 'department'` reconfigures\n // the grouping model and re-renders through the coalescing queue. immediate:\n // false so the initial value doesn't kick a render (the columns/data watchers\n // drive the first paint). No synchronous cell construction here — scheduleRender\n // defers to a microtask (happy-dom constructor landmine).\n @watch('groupBy', 'groupDefaults', { immediate: false })\n handleGroupByChange() {\n this.syncGrouping();\n const hasSlottedRows = !!this.querySelector('snice-row[slot=\"rows\"]');\n const modelSlottedRows = this.shouldModelSlottedRows();\n if (hasSlottedRows\n && this.virtualizer.isEnabled()\n && !!this.shadowRoot?.querySelector('table') !== modelSlottedRows) {\n this.virtualizer.detach();\n }\n if (modelSlottedRows) {\n this.syncSlottedRowsIntoData();\n }\n if (hasSlottedRows) {\n requestAnimationFrame(() => {\n // Clearing the last model feature switches the structural template\n // back to slotted mode; either direction replaces the controls.\n if (!modelSlottedRows) this.renderSlottedHeader();\n this.renderControls();\n if (this.toolbarOptions) this.setToolbar(this.toolbarOptions);\n if (this.lazyLoad) this.setupLazyLoading();\n });\n }\n this.scheduleRender(hasSlottedRows ? 'both' : 'body');\n }\n\n // F: push the current groupBy/groupDefaults into the grouping model and drop\n // the flattened cache. Called from the watch and before the first render.\n private syncGrouping() {\n const keys = Array.isArray(this.groupBy)\n ? this.groupBy.filter(Boolean)\n : (this.groupBy ? [this.groupBy] : []);\n this.grouping.configure({ groupBy: keys, defaultExpanded: this.groupDefaults?.expanded !== false });\n this.grouping.setColumns(this.columns);\n this.invalidateGroupingCache();\n }\n\n // C1: reactive data. `table.data = rows` refreshes the unsortedData snapshot\n // and the row-index map, then renders the body. The internal sort path\n // (sortLocalData) reassigns this.data with a re-sorted view of the SAME rows\n // and owns its own snapshot/render — settingSortedData tells us to skip.\n @watch('data', { immediate: false })\n handleDataAssignment(oldVal?: any[]) {\n if (this.settingSortedData) return;\n // A load error describes the LAST delivery ATTEMPT, so a dataset arriving\n // from any source supersedes it — including the app falling back to local\n // rows (or to none) after the remote load failed. Clearing it only on the\n // remote success path left `loadError` and the `table--error` host class\n // alive forever, so the next zero-row render showed the stale ⚠️ where the\n // empty state belonged.\n //\n // A REORDER is not an arrival: the row-reorder handler republishes the same\n // rows in a new array, and dragging a row must not dismiss the ⚠️ the\n // contract says survives until data actually arrives.\n if (!this.reorderingRows) this.clearLoadError();\n this.unsortedData = [...this.data];\n // C3: rows delivered while a client-side sort is active must land in that\n // sorted order — the currentSort watcher only fires when the sort itself\n // changes, so without this the body silently contradicts the header. In\n // remote mode the server owns the ordering.\n if (this.mode !== 'remote' && this.currentSort.length > 0) this.applyLocalSortOrder();\n this.rebuildRowIndex();\n // Re-delivering the SAME rows in a different order must not move the\n // selection to whatever row inherited the index (no-op for a new dataset).\n if (oldVal) this.remapSelectionAfterReorder(oldVal);\n this.masterDetail.prepare(this.data, row => this.rowValueSignature(row));\n if (this.settingDataImperative) return; // imperative setData(): caller renders\n this.scheduleRender('body');\n }\n\n /**\n * Drop the failed-load state: the ⚠️ message row's text and the `table--error`\n * host class always move together, so they are cleared together and from one\n * place. Idempotent, and deliberately does NOT render — every caller is either\n * mid-delivery (the data watcher renders) or already renders itself.\n */\n private clearLoadError() {\n this.loadError = null;\n this.classList.remove('table--error');\n }\n\n @watch('loading')\n handleDataChange() {\n this.renderBody();\n this.updateLoadingOverlay();\n }\n\n /**\n * Refetch affordance: with rows on screen `loading` only dims the tbody, so\n * add a spinner overlay (styled via `part=\"loading-overlay\"`). The no-data\n * load keeps its single spinner message row instead.\n */\n private updateLoadingOverlay() {\n const frame = this.shadowRoot?.querySelector('.table-frame');\n if (!frame) return;\n let overlay = frame.querySelector('.table-loading-overlay') as HTMLElement | null;\n const show = this.loading && this.data.length > 0;\n if (show && !overlay) {\n overlay = document.createElement('div');\n overlay.className = 'table-loading-overlay';\n overlay.setAttribute('part', 'loading-overlay');\n // The overlay sits ON TOP of readable rows, so it carries its label as\n // an aria-label rather than visible text — but it must still announce.\n overlay.setAttribute('role', 'status');\n overlay.setAttribute('aria-live', 'polite');\n overlay.setAttribute('aria-label', LOADING_LABEL);\n overlay.appendChild(this.createLoadingSpinner('medium'));\n frame.appendChild(overlay);\n } else if (!show && overlay) {\n overlay.remove();\n }\n }\n\n @watch('selectedRows')\n handleSelectedRowsChange(oldVal?: number[], newVal?: number[]) {\n // A2: selection is a @property, so every reassignment lands here — the\n // single source of truth for reflecting selection into the DOM. Touch only\n // the rows whose membership actually changed (symmetric difference of old\n // vs new), not every rendered <tr>. A single toggle updates one row; a\n // select-all/clear-all naturally updates every changed row.\n const oldSet = new Set(oldVal ?? []);\n const newSet = new Set(newVal ?? this.selectedRows ?? []);\n const changed = new Set<number>();\n for (const i of oldSet) if (!newSet.has(i)) changed.add(i);\n for (const i of newSet) if (!oldSet.has(i)) changed.add(i);\n\n for (const i of changed) this.updateRowSelectionStateFor(i, newSet.has(i));\n this.updateSelectAllState();\n // F: a data-row toggle must refresh its group header's all/some/none state.\n this.updateGroupSelectionStates();\n }\n\n @watch('selectionMode', { immediate: false })\n handleSelectionModeChange() {\n if (this.selectionMode === 'none') {\n this.selectedRows = [];\n this.selectionAnchor = null;\n } else if (this.selectionMode === 'single' && this.selectedRows.length > 1) {\n this.selectedRows = this.selectedRows.slice(0, 1);\n this.selectionAnchor = this.data[this.selectedRows[0]] ?? null;\n }\n this.syncSlottedSelectionState();\n // The selection mode changes the tool-column structure (none has no\n // checkbox column; single has row checkboxes but no select-all control).\n this.scheduleRender('both');\n }\n\n @watch('currentSort')\n handleSortChange() {\n this.renderHeader();\n }\n\n @watch('searchable', 'filterable', 'quickFilter')\n handleControlsChange() {\n this.renderControls();\n if (this.quickFilter) this.scheduleRender('body');\n }\n\n // ── C2: controlled-state props. Assigning any of these post-mount routes to\n // the same effect its imperative setter produces, rendering through the\n // coalescing queue. immediate:false so the initial value never kicks a render\n // (the initial render is driven by the other immediate watchers).\n\n // A controlled `currentSort` must actually re-sort (local) or re-request\n // (remote) — the sibling handleSortChange only repaints the arrows.\n @watch('currentSort', { immediate: false })\n handleControlledSort() {\n if (this.mode === 'remote') this.debouncedDataRequest();\n else this.sortLocalData();\n }\n\n @watch('currentPage', { immediate: false })\n handleCurrentPageChange() {\n // A clamp written by the display model itself is not a navigation — see\n // clampCurrentPage().\n if (this.clampingPage) return;\n if (this.paginationMode === 'server' && this.mode === 'remote') this.debouncedDataRequest();\n else this.scheduleRender('body');\n }\n\n /**\n * Write a page number the display model just derived (a re-clamp after the\n * row set shortened), WITHOUT re-entering the render scheduler.\n *\n * The three clamp sites all sit inside a display-model computation whose\n * caller paints immediately afterwards with the clamped page — the ordinary\n * body path slices with it and then renders the pager, the grouping and tree\n * models return the clamped slice. Letting the @watch fire here queued a\n * second, byte-identical body pass per delivery — the measured cost, and what\n * the regression test pins. Suppressing the write's watcher makes the clamp\n * cost zero extra passes and makes an oscillating clamp structurally unable\n * to loop.\n *\n * All three sites are reachable only under `paginationMode === 'client'`, so\n * the watcher's server branch (debouncedDataRequest, whose `loading = true`\n * re-enters renderBody SYNCHRONOUSLY through the loading watcher — from the\n * middle of a render) is not reachable from a clamp today. It is the reason\n * to keep this guard rather than to drop the watcher suppression if a fourth\n * clamp site ever lands outside that guard.\n */\n private clampingPage = false;\n private clampCurrentPage(page: number) {\n if (page === this.currentPage) return;\n this.clampingPage = true;\n try {\n this.currentPage = page;\n } finally {\n this.clampingPage = false;\n }\n }\n\n @watch('pageSize', { immediate: false })\n handlePageSizeChange() {\n this.currentPage = 1;\n if (this.paginationMode === 'server' && this.mode === 'remote') this.debouncedDataRequest();\n else this.scheduleRender('body');\n }\n\n @watch('density', { immediate: false })\n handleDensityChange() {\n // The density attribute reflects automatically (drives the CSS); the body\n // rebuilds because density is part of the row signature.\n this.scheduleRender('body');\n this.dispatchDensityChange();\n }\n\n @watch('list', { immediate: false })\n handleListChange() {\n this.renderedRows = new Map();\n // The header is part of the mode: entering list mode with a renderer drops\n // the columnar header, and leaving it must bring the header back.\n this.scheduleRender('both');\n }\n\n @watch('editable', { immediate: false })\n handleEditableChange() {\n if (this.editable) this.setupEditor();\n this.scheduleRender('body');\n }\n\n @watch('editMode', { immediate: false })\n handleEditModeChange() {\n if (this.editable) this.editor.setEditMode(this.editMode);\n this.scheduleRender('body');\n }\n\n @watch('virtualize', { immediate: false })\n handleVirtualizeChange() {\n // renderBody self-heals virtualization (enables the virtualizer when\n // requested); turning it off detaches so the normal path takes over.\n if (!this.virtualize) this.virtualizer.detach();\n this.scheduleRender('body');\n }\n\n @watch('rowHeight', { immediate: false })\n handleRowHeightChange() {\n this.scheduleRender('body');\n }\n\n @watch('columnResize', { immediate: false })\n handleColumnResizeChange() {\n this.scheduleRender('header');\n }\n\n @watch('headerFilters', { immediate: false })\n handleHeaderFiltersChange() {\n this.scheduleRender('header');\n }\n\n @watch('rowReorder', { immediate: false })\n handleRowReorderChange() {\n if (this.rowReorder) this.rowDnD.attach(this);\n else this.rowDnD.detach();\n this.scheduleRender('both');\n }\n\n @watch('columnReorder', { immediate: false })\n handleColumnReorderChange() {\n if (this.columnReorder) this.columnDnD.attach(this);\n else this.columnDnD.detach();\n this.scheduleRender('header');\n }\n\n @watch('lazyLoad', 'lazyLoadThreshold', { immediate: false })\n handleLazyLoadChange() {\n if (this.lazyLoad) {\n queueMicrotask(() => this.setupLazyLoading());\n } else {\n if (this.lazyLoadHandler) this.lazyLoadContainer?.removeEventListener('scroll', this.lazyLoadHandler);\n this.lazyLoadHandler = null;\n this.lazyLoadContainer = null;\n }\n }\n\n @watch('columnMenu', { immediate: false })\n handleColumnMenuChange() {\n if (this.columnMenu) this.initColumnMenu();\n this.scheduleRender('header');\n }\n\n /**\n * Switching fit policy re-decides every unsized column's width, so the frame\n * has to be re-fitted from scratch: the cached width would otherwise make the\n * resize observer's \"did the frame move?\" guard swallow the very next pass.\n */\n @watch('columnFit', { immediate: false })\n handleColumnFitChange() {\n this.columnManager.setFitMode(this.columnFit);\n this.lastFittedFrameWidth = 0;\n this.syncColumnWidthsToFrame();\n this.scheduleRender('header');\n }\n\n /** Column definitions in their actual painted order. Column state owns\n * visibility/order; pinned columns are partitioned to their physical edges\n * so right-pinned cells do not overlap later unpinned columns. */\n private getVisibleColumnDefinitions(): ColumnDefinition[] {\n if (this.columnManager.getAllStates().length === 0) return this.columns;\n const states = [\n ...this.columnManager.getPinnedLeft(),\n ...this.columnManager.getUnpinned(),\n ...this.columnManager.getPinnedRight(),\n ];\n const byKey = new Map(this.columns.map((column) => [column.key, column]));\n return states\n .map((state) => byKey.get(state.key))\n .filter((column): column is ColumnDefinition => !!column);\n }\n\n /**\n * Cells one full-width row spans: every visible data column plus the tool\n * columns that precede them. Group, aggregate, detail, empty-state, and\n * virtual-spacer rows all measure themselves against this — a row that spans\n * MORE than the table has invents columns, and `table-layout: fixed` then\n * spends the frame's leftover width on the phantoms.\n */\n private getTotalColumnSpan(): number {\n const managed = this.columnManager.getAllStates();\n const dataColumns = managed.length > 0\n ? this.columnManager.getVisibleColumns().length\n : this.columns.length;\n return dataColumns\n + (this.hasSelectionColumn() ? 1 : 0)\n + (this.masterDetail.isEnabled() ? 1 : 0)\n + (this.rowReorder && this.rowDnD.isEnabled() ? 1 : 0);\n }\n\n /**\n * Re-fit the columns nobody sized to the frame they are painted in.\n *\n * A column width is a CONTENT width, so the frame's budget has to be reduced\n * by each column's own padding + border and by the fixed tool columns before\n * it can be shared out. Both are read off the live header — the previous\n * render's, on the first pass — rather than guessed, so the fitted table\n * lands on the frame's width instead of a few pixels past it.\n *\n * Widths are written straight onto the header cells: under fixed layout the\n * first row owns the column grid, so no body repaint is needed and this can\n * run inside a resize observer without a render cascade.\n */\n private syncColumnWidthsToFrame(): boolean {\n // The policy is the table's, the arithmetic is the manager's: hand it over\n // before every fit so a `columnFit` change is honoured on the next pass\n // whether it arrived as a property, an attribute, or an upgrade.\n this.columnManager.setFitMode(this.columnFit);\n\n const frame = this.shadowRoot?.querySelector('.table-frame') as HTMLElement | null;\n const headerRow = this.shadowRoot?.querySelector('thead tr.column-header-row') as HTMLElement | null;\n if (!frame || !headerRow) return false;\n\n const available = frame.clientWidth;\n // Layoutless DOM (or a display:none host): every measurement is 0 and\n // fitting to it would slam the columns to their minimums for nothing.\n if (!(available > 0)) return false;\n\n const dataCells = Array.from(headerRow.querySelectorAll('th[data-key]')) as HTMLElement[];\n // An active list renderer drops the columnar header entirely; there is no\n // column geometry to fit and no cell to measure the chrome from.\n if (dataCells.length === 0) return false;\n\n let reserved = 0;\n for (const cell of Array.from(headerRow.children) as HTMLElement[]) {\n if (!cell.hasAttribute('data-key')) reserved += cell.getBoundingClientRect().width;\n }\n\n const chrome = horizontalCellChrome(dataCells[0]);\n if (!this.columnManager.fitVisibleColumns(available - reserved, chrome)) return false;\n\n for (const cell of dataCells) {\n const state = this.columnManager.getState(cell.getAttribute('data-key') || '');\n if (state) cell.style.width = `${state.width}px`;\n }\n return true;\n }\n\n /**\n * Sticky geometry plus the visible affordance for a pinned cell.\n *\n * Freezing a column is only communicated if the reader can see where the\n * frozen region ends, so the inner-most pinned column on each side carries\n * the divider (`--edge`); the header additionally carries a pin marker, which\n * is the only cue when the table happens to be wide enough not to scroll.\n */\n private applyPinnedCell(cell: HTMLElement, key: string, state: ColumnState, zIndex: string) {\n if (state.pinned !== 'left' && state.pinned !== 'right') return;\n const side = state.pinned;\n const columns = side === 'left'\n ? this.columnManager.getPinnedLeft()\n : this.columnManager.getPinnedRight();\n const offsets = side === 'left'\n ? this.columnManager.getPinnedLeftOffsets()\n : this.columnManager.getPinnedRightOffsets();\n // The edge of the frozen region: the last left-pinned column, the first\n // right-pinned one. Inner boundaries between two pinned columns are just\n // ordinary cell borders.\n const edgeKey = side === 'left' ? columns[columns.length - 1]?.key : columns[0]?.key;\n\n cell.classList.add('pinned-cell', `pinned-cell--${side}`);\n if (key === edgeKey) cell.classList.add('pinned-cell--edge');\n cell.style.position = 'sticky';\n cell.style[side] = `${offsets.get(key) ?? 0}px`;\n cell.style.zIndex = zIndex;\n }\n\n /** The pin marker a frozen header carries, so pinning reads at any width. */\n private static pinIndicator(side: 'left' | 'right'): string {\n return `<span class=\"pin-indicator pin-indicator--${side}\" aria-hidden=\"true\">`\n + `<svg width=\"10\" height=\"10\" viewBox=\"0 0 16 16\" fill=\"currentColor\">`\n + `<path d=\"M9.5 1a1 1 0 0 0-.7 1.7l.3.3-3 3-2.4-.5a1 1 0 0 0-.9 1.7l3 3-3.6 3.6a.6.6 0 0 0 .8.8L6.6 12l3 3a1 1 0 0 0 1.7-.9l-.5-2.4 3-3 .3.3a1 1 0 0 0 1.4-1.4l-5.3-5.3A1 1 0 0 0 9.5 1Z\"/>`\n + `</svg></span>`;\n }\n\n /**\n * List mode is only \"list mode\" once a renderer is installed: `list` alone is\n * a border treatment and still paints normal columnar cells. With a renderer\n * every row collapses to one full-width cell, so there is no column geometry\n * left for a header to label.\n */\n private usesListRowRenderer(): boolean {\n return !!(this.list && this.listRenderer);\n }\n\n renderHeader() {\n if (!this.thead) return;\n\n // A card/directory list has no columns, so a columnar header would promise\n // fields that align with nothing. Suppress the data-column headers (and the\n // equally columnar group and header-filter rows) while a list renderer is\n // active; the tool columns below still have real body cells to head, so\n // select-all is kept rather than lost as collateral.\n const listRows = this.usesListRowRenderer();\n\n const headerRow = document.createElement('tr');\n headerRow.className = 'column-header-row';\n\n // Tool column headers — must match createRow order\n if (this.rowReorder && this.rowDnD.isEnabled()) {\n const th = document.createElement('th');\n th.setAttribute('scope', 'col');\n th.className = 'drag-handle-cell';\n headerRow.appendChild(th);\n }\n\n if (this.masterDetail.isEnabled()) {\n const th = document.createElement('th');\n th.setAttribute('scope', 'col');\n th.className = 'detail-toggle-cell';\n headerRow.appendChild(th);\n }\n\n if (this.hasSelectionColumn()) {\n const selectCell = document.createElement('th');\n selectCell.setAttribute('scope', 'col');\n selectCell.className = 'select-column';\n if (this.selectionMode === 'multiple') {\n const filteredIndices = this.getSelectableIndices(this.getFilteredData());\n const selectedInFiltered = filteredIndices.filter(i => this.selectedRows.includes(i));\n const allSelected = selectedInFiltered.length === filteredIndices.length && filteredIndices.length > 0;\n const someSelected = selectedInFiltered.length > 0 && selectedInFiltered.length < filteredIndices.length;\n selectCell.innerHTML = `<snice-checkbox class=\"select-all\" size=\"small\" compact ${allSelected ? 'checked' : ''}></snice-checkbox>`;\n\n // Set indeterminate after insertion.\n setTimeout(() => {\n const checkbox = selectCell.querySelector('.select-all') as HTMLInputElement;\n if (checkbox) checkbox.indeterminate = someSelected;\n }, 0);\n } else {\n selectCell.setAttribute('aria-label', 'Select one row');\n }\n headerRow.appendChild(selectCell);\n }\n\n const visibleColumns = listRows ? [] : this.getVisibleColumnDefinitions();\n\n visibleColumns.forEach(column => {\n\n const th = document.createElement('th');\n th.setAttribute('data-key', column.key);\n th.setAttribute('scope', 'col');\n // Reflect current sort direction for SR users.\n if (this.sortable && column.sortable !== false) {\n const sortState = this.currentSort.find(s => s.column === column.key);\n if (sortState?.direction === 'asc') th.setAttribute('aria-sort', 'ascending');\n else if (sortState?.direction === 'desc') th.setAttribute('aria-sort', 'descending');\n else th.setAttribute('aria-sort', 'none');\n }\n\n // Apply column width\n const state = this.columnManager.getState(column.key);\n const pinnedSide = state?.pinned === 'left' || state?.pinned === 'right' ? state.pinned : null;\n if (state) {\n th.style.width = `${state.width}px`;\n this.applyPinnedCell(th, column.key, state, '2');\n }\n\n if (this.sortable && column.sortable !== false) {\n th.classList.add('sortable');\n th.setAttribute('role', 'button');\n // A role=button must be focusable and named, or the keyboard cannot\n // sort at all. Matches the declarative header in snice-header.ts.\n th.setAttribute('tabindex', '0');\n // Frozen columns say so: the divider is a visual cue only.\n th.setAttribute('aria-label', pinnedSide\n ? `Sort by ${column.label}, pinned ${pinnedSide}`\n : `Sort by ${column.label}`);\n th.innerHTML = this.renderSortableHeader(column);\n } else {\n th.textContent = column.label;\n if (pinnedSide) th.setAttribute('aria-label', `${column.label}, pinned ${pinnedSide}`);\n }\n\n if (pinnedSide) {\n // Inside the label, not after it: `.sort-header` is a full-width flex\n // row, so a sibling would be pushed onto a second line.\n const label = th.querySelector('.sort-header > span') ?? th;\n label.insertAdjacentHTML('beforeend', SniceTable.pinIndicator(pinnedSide));\n }\n\n // Filter indicator\n if (this.filterEngine.hasColumnFilter(column.key)) {\n th.classList.add('filtered');\n }\n\n // Resize handle\n if (this.columnResize && column.resizable !== false) {\n const handle = document.createElement('span');\n handle.className = 'resize-handle';\n handle.addEventListener('mousedown', (e) => {\n e.stopPropagation();\n this.columnManager.startResize(column.key, e.clientX);\n });\n handle.addEventListener('dblclick', (e) => {\n e.stopPropagation();\n if (this.tbody) {\n this.columnManager.autoSizeColumn(column.key, this.tbody);\n this.renderHeader();\n this.renderBody();\n }\n });\n th.appendChild(handle);\n // No inline position:relative here — inline styles outrank the\n // stylesheet and would stomp the sticky header (thead th) and\n // pinned-column sticky positioning. `position: sticky` is itself a\n // positioned ancestor, so the absolutely-positioned resize handle\n // anchors correctly without it.\n }\n\n // Column menu (right-click)\n if (this.columnMenu) {\n th.addEventListener('contextmenu', (e) => {\n e.preventDefault();\n const colState = this.columnManager.getState(column.key);\n this.columnMenuManager.show(column.key, e.clientX, e.clientY, {\n sortable: this.sortable && column.sortable !== false,\n filterable: column.filterable !== false,\n hideable: colState?.hideable,\n pinnable: colState?.pinnable,\n pinned: colState?.pinned,\n });\n });\n }\n\n // Column DnD\n if (this.columnReorder && this.columnDnD.isEnabled()) {\n // A pinned column has a fixed physical edge. Presenting it as draggable\n // would emit a reorder event that the column manager correctly ignores.\n this.columnDnD.makeHeaderDraggable(th, column.key, column.reorderable !== false && !state?.pinned);\n }\n\n headerRow.appendChild(th);\n });\n\n this.thead.innerHTML = '';\n\n // Column groups header row (if any)\n const groups = listRows ? [] : this.columnManager.getColumnGroups();\n if (groups.length > 0) {\n const groupRow = document.createElement('tr');\n groupRow.className = 'column-group-row';\n // Tool-column spacers must line up with the equivalent cells in the main\n // header row before the grouped data-column runs.\n const toolColumnClasses = [\n this.rowReorder && this.rowDnD.isEnabled() ? 'drag-handle-cell' : '',\n this.masterDetail.isEnabled() ? 'detail-toggle-cell' : '',\n this.hasSelectionColumn() ? 'select-column' : '',\n ].filter(Boolean);\n for (const className of toolColumnClasses) {\n const spacer = document.createElement('th');\n spacer.className = className;\n spacer.setAttribute('aria-hidden', 'true');\n groupRow.appendChild(spacer);\n }\n const groupedHeaders = document.createElement('template');\n groupedHeaders.innerHTML = this.columnManager.renderGroupHeaders(\n visibleColumns.map((column) => column.key)\n );\n groupRow.appendChild(groupedHeaders.content);\n this.thead.appendChild(groupRow);\n }\n\n // A list-mode header row with no tool columns has nothing to show; leaving\n // it out keeps the thead empty so it paints no strip above the cards.\n if (!listRows || headerRow.children.length > 0) this.thead.appendChild(headerRow);\n\n // Header filter row (if enabled)\n if (this.headerFilters && !listRows) {\n const filterRow = document.createElement('tr');\n filterRow.className = 'header-filter-row';\n\n if (this.rowReorder && this.rowDnD.isEnabled()) {\n const spacer = document.createElement('td');\n spacer.className = 'drag-handle-cell';\n filterRow.appendChild(spacer);\n }\n if (this.masterDetail.isEnabled()) {\n const spacer = document.createElement('td');\n spacer.className = 'detail-toggle-cell';\n filterRow.appendChild(spacer);\n }\n if (this.hasSelectionColumn()) {\n const spacer = document.createElement('td');\n spacer.className = 'select-column';\n filterRow.appendChild(spacer);\n }\n\n visibleColumns.forEach(column => {\n const td = document.createElement('td');\n const input = document.createElement('snice-input') as any;\n input.size = 'small';\n input.placeholder = `Filter ${column.label}...`;\n input.setAttribute('data-column', column.key);\n input.value = this.filterEngine.getHeaderFilter(column.key);\n input.style.cssText = 'width:100%;--snice-color-border:transparent;--snice-border-radius-md:0;';\n input.addEventListener('input', () => {\n // A3: engine model updates synchronously (cheap); the expensive\n // re-filter + re-render is debounced so a keystroke burst is one apply.\n this.filterEngine.setHeaderFilter(column.key, input.value);\n this.debouncedApplyClientFilters();\n });\n td.appendChild(input);\n filterRow.appendChild(td);\n });\n\n this.thead.appendChild(filterRow);\n }\n\n // The header is in the DOM, so its real chrome and tool-column widths are\n // measurable: fit the unsized columns to the frame before the browser\n // paints. Widths land on the header cells that were just created, so this\n // never re-enters renderHeader.\n this.syncColumnWidthsToFrame();\n }\n\n renderSortableHeader(column: any): string {\n const sortItem = this.currentSort.find(s => s.column === column.key);\n const sortIndex = this.currentSort.findIndex(s => s.column === column.key);\n const isActive = !!sortItem;\n\n const chevronUp = `<svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M1 5l4-4 4 4\"/></svg>`;\n const chevronDown = `<svg width=\"10\" height=\"6\" viewBox=\"0 0 10 6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M1 1l4 4 4-4\"/></svg>`;\n\n let indicator = `<span style=\"display:flex;flex-direction:column;gap:0;opacity:0.3\">${chevronUp}${chevronDown}</span>`;\n let orderNumber = '';\n\n if (sortItem) {\n if (sortItem.direction === 'asc') {\n indicator = chevronUp;\n } else if (sortItem.direction === 'desc') {\n indicator = chevronDown;\n }\n\n if (this.currentSort.length > 1) {\n orderNumber = `<span class=\"sort-order\">${sortIndex + 1}</span>`;\n }\n }\n\n const indicatorClasses = ['sort-indicator', isActive ? 'active' : ''].filter(Boolean).join(' ');\n\n return `\n <div class=\"sort-header\">\n <span>${column.label}</span>\n <div class=\"${indicatorClasses}\">\n ${indicator}\n ${orderNumber}\n </div>\n </div>\n `;\n }\n\n\n /**\n * The single message row a zero-row body shows: loading spinner, load error,\n * or the empty state (the `empty-state` slot cloned fresh, else the default\n * placeholder). Returns null when there is data to render. Shared by the\n * ordinary and virtualized paths — the virtualizer wipes the tbody itself, so\n * it asks for this row rather than leaving a virtualized empty table blank.\n */\n /**\n * The spinner both loading affordances draw. `snice-progress` paints its\n * track at 20% alpha, which vanishes against a dark surface — the table pins\n * `--progress-track-opacity` in its own stylesheet so the ring reads on any\n * theme; the indicator arc keeps the primary color.\n */\n private createLoadingSpinner(size: 'medium' | 'large'): HTMLElement {\n const spinner = document.createElement('snice-progress');\n spinner.setAttribute('variant', 'circular');\n spinner.setAttribute('indeterminate', '');\n spinner.setAttribute('size', size);\n return spinner;\n }\n\n private createEmptyBodyRow(): HTMLTableRowElement | null {\n if (this.data.length > 0 || this.columns.length === 0) return null;\n\n const toolCols = (this.hasSelectionColumn() ? 1 : 0)\n + (this.masterDetail.isEnabled() ? 1 : 0)\n + (this.rowReorder && this.rowDnD.isEnabled() ? 1 : 0);\n\n const tr = document.createElement('tr');\n tr.className = 'table-message-row';\n const td = document.createElement('td');\n td.colSpan = this.columns.length + toolCols;\n td.className = 'no-data';\n tr.appendChild(td);\n\n if (this.loading) {\n // A bare ring in an otherwise empty rectangle reads as a rendering\n // artefact, not as \"we are fetching your rows\": at `small` it is 24px of\n // low-contrast stroke with nothing naming it. The zero-row body has the\n // space for a full-size spinner AND the word, and the pair is what makes\n // the state legible — visually and to a screen reader.\n const status = document.createElement('div');\n status.className = 'table-loading-state';\n status.setAttribute('role', 'status');\n status.setAttribute('aria-live', 'polite');\n status.appendChild(this.createLoadingSpinner('medium'));\n const label = document.createElement('span');\n label.className = 'table-loading-label';\n label.textContent = LOADING_LABEL;\n status.appendChild(label);\n td.appendChild(status);\n } else if (this.loadError) {\n // Surfaces a failed remote load instead of silently falling through to\n // the generic \"No data\" empty state.\n const errorDiv = document.createElement('div');\n errorDiv.className = 'table-error-message';\n errorDiv.textContent = `⚠️ ${this.loadError}`;\n td.appendChild(errorDiv);\n } else {\n const slotted = this.querySelector('[slot=\"empty-state\"]');\n if (slotted) {\n td.appendChild(slotted.cloneNode(true));\n } else {\n const empty = document.createElement('snice-empty-state');\n empty.setAttribute('size', 'small');\n empty.setAttribute('icon', '📭');\n empty.setAttribute('title', 'No data');\n empty.setAttribute('description', 'No records to display.');\n td.appendChild(empty);\n }\n }\n\n return tr;\n }\n\n renderBody() {\n // The queue flush consumed `pendingBodyRender` before calling us, so a body\n // render that arrives while the shadow template has not committed its\n // <tbody> (a `table/config` response landing before @ready, a structural\n // branch flip mid-flight) would simply vanish — the header repaints and the\n // rows stay stale forever. Re-arm it for the next frame instead.\n if (!this.tbody) {\n this.rearmBodyRender();\n return;\n }\n this.bodyRenderRetries = 0;\n\n // Update column manager when columns change\n if (this.columns.length > 0) {\n this.columnManager.initialize(this.columns, this);\n }\n\n // F: keep the grouping model's aggregator list current before any\n // isEnabled() check below — isEnabled() reports aggregation-only tables too,\n // and setColumns is what tells it which columns aggregate.\n if (this.grouping.setColumns(this.columns)) this.invalidateGroupingCache();\n\n // In grouped client-pagination mode the public total is the flattened\n // display model (headers + visible rows + aggregate footers), including on\n // the virtual path which returns before the ordinary pagination block.\n if (this.pagination && this.paginationMode === 'client') {\n if (this.usesGroupingDisplayModel()) {\n this.totalItems = this.getGroupingItems().length;\n } else if (this.treeData.isEnabled()) {\n this.totalItems = this.getTreeDisplayRows(false).length;\n }\n }\n\n // Self-heal: virtualize requested but the virtualizer never enabled\n // (property assigned after @ready, or the one-shot rAF setup missed the\n // scroll container). Never fall through to an empty or full render.\n if (this.virtualize && !this.virtualizer.isEnabled()) {\n this.setupVirtualization();\n }\n\n // Virtualized rendering: delegate to virtualizer. Total row count comes\n // from the feature-aware model (flattened tree rows when tree data is on),\n // NOT the raw filtered data — otherwise the virtualizer windows the wrong\n // dataset and expand/collapse silently no-ops.\n if (this.virtualize && this.virtualizer.isEnabled()) {\n this.syncVirtualRows();\n // The virtualizer's afterRender hook re-establishes grid ARIA/focus on\n // the freshly inserted window.\n\n // Still render pagination\n if (this.pagination) this.renderPagination();\n this.updateSelectAllState();\n return;\n }\n\n const emptyBodyRow = this.createEmptyBodyRow();\n if (emptyBodyRow) {\n // Empty / loading / error states replace the body with a single message\n // row. Reset the recycler map so a later data render starts from a clean\n // slate (no stale reuse candidates pointing at removed rows).\n this.tbody.innerHTML = '';\n this.renderedRows = new Map();\n this.tbody.appendChild(emptyBodyRow);\n return;\n }\n\n // Apply client-side filters (cached snapshot — see getFilteredData).\n const filteredData = this.getFilteredData();\n\n // Client-side pagination: slice ordinary data. Group and tree modes page\n // their own flattened models and already set totalItems above; overwriting\n // it here with the raw filtered-row count made public state differ between\n // virtual and non-virtual rendering.\n let displayData = filteredData;\n if (this.pagination && this.paginationMode === 'client'\n && !this.usesGroupingDisplayModel() && !this.treeData.isEnabled()) {\n this.totalItems = filteredData.length;\n // Re-clamp before slicing. A shorter re-delivery (or a filter) can leave\n // `currentPage` past the new last page; slicing at the stale offset lands\n // off the end and renders an EMPTY body while the pager still advertises\n // the tail rows — blank until the user clicks a page button. Same\n // [1, totalPages] clamp goToPage() applies, and the same one the grouping\n // and tree display models already do before their own slice.\n // An empty set is left alone: a render before the rows arrive must not\n // rewrite the host's declared starting page.\n const totalPages = filteredData.length > 0\n ? Math.ceil(filteredData.length / this.pageSize)\n : this.currentPage;\n const page = Math.max(1, Math.min(this.currentPage, totalPages));\n this.clampCurrentPage(page);\n const startIndex = (page - 1) * this.pageSize;\n displayData = filteredData.slice(startIndex, startIndex + this.pageSize);\n }\n\n const totalColSpan = this.getTotalColumnSpan();\n const structuralSig = this.computeStructuralSig();\n\n // Task B: describe the desired body as an ordered list of keyed entries,\n // then reconcile the tbody to match. Rows whose object + signature are\n // unchanged are reused (moved on reorder); only new/changed rows construct\n // fresh DOM. Replaces the old wipe-and-rebuild-everything path.\n const entries: RowEntry[] = [];\n\n // Pinned top rows — few, and rebuilt each pass under a positional key.\n this.pinnedTopRows.forEach((row, i) => {\n entries.push({\n key: `__pinned_top_${i}`,\n sig: 'pinned',\n alwaysRebuild: true,\n create: () => {\n const tr = this.createRow(row, -1);\n tr.classList.add('pinned-row', 'pinned-row--top');\n return tr;\n },\n });\n });\n\n if (this.usesGroupingDisplayModel()) {\n // F: page over the FLATTENED group+row+aggregate list (built from the full\n // filtered data — grouping must see every row, not a pre-sliced page).\n const items = this.getDisplayedGroupingItems();\n\n for (const item of items) {\n if (item.type === 'group') {\n entries.push({\n key: item.key,\n // Group + aggregate rows are few; rebuild them each pass so their\n // count / expanded / selection / aggregate state is always fresh\n // (perf-critical recycling is for the many DATA rows below).\n sig: `${structuralSig}|grp:${item.key}:${item.expanded ? 1 : 0}:${item.count}`,\n alwaysRebuild: true,\n create: () => this.createGroupRow(item, totalColSpan),\n });\n } else if (item.type === 'aggregate') {\n entries.push({\n key: item.key,\n sig: `${structuralSig}|agg:${item.key}`,\n alwaysRebuild: true,\n create: () => this.createAggregateRow(item, totalColSpan),\n });\n } else {\n // Data row — index is its position in `this.data`, not the flattened\n // list (selection / editing / data-index all key off the data index).\n const index = this.indexOfRow(item.data);\n const editing = this.isRowEditing(index);\n entries.push({\n key: item.data,\n sig: this.rowSignature(item.data, index, structuralSig) + (editing ? '|edit' : ''),\n alwaysRebuild: editing,\n restampIndex: index,\n create: () => this.createRow(item.data, index),\n });\n\n // Grouping/aggregation must compose with master-detail exactly like\n // the ordinary and virtual paths. Aggregation-only mode also routes\n // through this branch, so omitting this entry made enabling a footer\n // silently remove every expanded detail panel.\n if (this.masterDetail.isEnabled() && this.masterDetail.isExpanded(index)) {\n entries.push({\n key: `__detail_${index}`,\n sig: 'detail',\n alwaysRebuild: true,\n create: () =>\n this.masterDetail.createDetailRow(item.data, index, totalColSpan) ??\n document.createElement('tr'),\n });\n }\n }\n }\n } else if (this.treeData.isEnabled()) {\n const treeRows = this.getTreeDisplayRows(true);\n treeRows.forEach(({ data: rowData, index, treeRow, groupItem }) => {\n if (groupItem?.type === 'aggregate') {\n entries.push({\n key: groupItem.key,\n sig: `${structuralSig}|agg:${groupItem.key}`,\n alwaysRebuild: true,\n create: () => this.createAggregateRow(groupItem, totalColSpan),\n });\n return;\n }\n if (!treeRow) return;\n const editing = this.isRowEditing(index);\n entries.push({\n key: rowData,\n // The edit marker makes the editing→display transition a signature\n // change, so a row leaving edit state rebuilds (drops its editor DOM).\n sig: this.rowSignature(rowData, index, structuralSig, treeRow) + (editing ? '|edit' : ''),\n alwaysRebuild: editing,\n restampIndex: index,\n create: () => this.createRow(rowData, index, treeRow),\n });\n\n // Tree data must compose with master-detail exactly like the ordinary\n // and grouping paths: createRow renders the toggle for every tree row,\n // so omitting this entry left that control inert. Generated gap nodes\n // (index -1) carry no data row and therefore no panel.\n if (index >= 0 && this.masterDetail.isEnabled() && this.masterDetail.isExpanded(index)) {\n entries.push({\n key: `__detail_${index}`,\n sig: 'detail',\n alwaysRebuild: true,\n create: () =>\n this.masterDetail.createDetailRow(rowData, index, totalColSpan) ??\n document.createElement('tr'),\n });\n }\n });\n } else {\n displayData.forEach((rowData) => {\n const index = this.indexOfRow(rowData);\n const editing = this.isRowEditing(index);\n entries.push({\n key: rowData,\n sig: this.rowSignature(rowData, index, structuralSig) + (editing ? '|edit' : ''),\n alwaysRebuild: editing,\n restampIndex: index,\n create: () => this.createRow(rowData, index),\n });\n\n // Detail row (master-detail): shape depends on state, always rebuilt.\n if (this.masterDetail.isEnabled() && this.masterDetail.isExpanded(index)) {\n entries.push({\n key: `__detail_${index}`,\n sig: 'detail',\n alwaysRebuild: true,\n create: () =>\n this.masterDetail.createDetailRow(rowData, index, totalColSpan) ??\n document.createElement('tr'),\n });\n }\n });\n }\n\n // Pinned bottom rows\n this.pinnedBottomRows.forEach((row, i) => {\n entries.push({\n key: `__pinned_bottom_${i}`,\n sig: 'pinned',\n alwaysRebuild: true,\n create: () => {\n const tr = this.createRow(row, -1);\n tr.classList.add('pinned-row', 'pinned-row--bottom');\n return tr;\n },\n });\n });\n\n this.reconcileRows(entries);\n\n // Re-establish grid role + roving tabindex after the body changed.\n this.keyboard.refresh();\n\n // The select-all control describes the *filtered* row set, so it goes stale\n // whenever the denominator moves (rows delivered, filter cleared) even\n // though `selectedRows` — its only other trigger — never changed.\n this.updateSelectAllState();\n\n // Render pagination after body\n if (this.pagination) {\n this.renderPagination();\n }\n\n this.updateFillRow();\n }\n\n /**\n * When the host is taller than its rows, append an inert filler row so the\n * column grid runs to the bottom edge of the frame. Cloned from the last\n * data row, so column widths, pinning, and alignment track the table\n * engine natively. Removed entirely when content fills (or overflows) the\n * frame, restoring the plain last-row styling.\n *\n * INVARIANT — the filler may only consume space the frame ALREADY has; space\n * that exists only BECAUSE of the filler must be given back. The filler is\n * table content, and `@observe('resize', '.table-frame')` re-derives it from\n * the frame's box, so on a host whose height is content-driven (the\n * documented `:host { height: 100% }` resolving against an auto or\n * max-content container — a stretched grid/flex item, a plain block parent)\n * the filler is an input to the very measurement that produced it: the frame\n * grows, the observer fires, the leftover computes positive again, and the\n * table inflates by one slack per animation frame without bound. No static\n * check distinguishes a content-driven frame from a genuinely sized one, so\n * this measures instead: apply the filler, then confirm the frame kept its\n * height. Any growth is self-inflicted and is subtracted from the filler;\n * once nothing honest is left, the frame had no free space to fill at all.\n */\n private updateFillRow() {\n const frame = this.shadowRoot?.querySelector('.table-frame') as HTMLElement | null;\n const tableEl = frame?.querySelector('table') as HTMLElement | null;\n const tbody = tableEl?.querySelector('tbody');\n if (!frame || !tableEl || !tbody) return;\n\n tbody.querySelector('tr.table-fill-row')?.remove();\n if (this.list && this.listRenderer) return;\n\n const rows = tbody.querySelectorAll('tr[data-index]');\n const lastRow = rows[rows.length - 1] as HTMLElement | undefined;\n if (!lastRow) return;\n\n // Baseline: the frame's height with no filler of ours in the box. Every\n // later reading is compared against it, so the correction below can never\n // hand back more than the filler itself created.\n const baseline = frame.clientHeight;\n let leftover = Math.floor(baseline - tableEl.offsetHeight);\n if (leftover <= 1) return;\n\n const fill = lastRow.cloneNode(true) as HTMLElement;\n fill.className = 'table-fill-row';\n // `part` goes with the rest of the row identity: the filler is not \"each\n // native body row\", so a consumer's ::part(row)/::part(cell) rule must not\n // paint a phantom row across it.\n for (const attr of ['data-index', 'data-selected', 'role', 'aria-rowindex', 'aria-selected', 'tabindex', 'id', 'part']) {\n fill.removeAttribute(attr);\n }\n fill.setAttribute('aria-hidden', 'true');\n fill.querySelectorAll('td').forEach(td => {\n td.replaceChildren();\n for (const attr of ['role', 'aria-colindex', 'tabindex', 'aria-selected', 'part']) td.removeAttribute(attr);\n });\n fill.style.height = `${leftover}px`;\n tbody.appendChild(fill);\n\n // Feedback check. Reading `clientHeight` flushes layout, so each pass sees\n // the frame as it stands WITH the filler in it. A frame that kept its\n // baseline is genuinely sized and the filler stays; growth means the frame\n // is (partly) sized by its own content, so give exactly that back. Two\n // corrections settle every real case — a fully self-made leftover reaches\n // zero on the first — and the bounded loop guarantees termination.\n for (let attempt = 0; attempt < 3; attempt++) {\n const selfMade = frame.clientHeight - baseline;\n if (selfMade <= 0) return;\n leftover -= selfMade;\n if (leftover <= 1) break;\n fill.style.height = `${leftover}px`;\n }\n fill.remove();\n }\n\n // ── Task B: render-path reconciler ──────────────────────────────────────\n //\n // Reconcile the tbody's children to `entries` (an ordered list) while reusing\n // existing <tr> elements keyed by identity. Mirrors the keyed-move algorithm\n // in src/parts.ts `_reconcileKeyed`: drop departed rows first, then walk the\n // survivors placing each desired row, moving out-of-position ones via a\n // detach-into-fragment step (avoids the happy-dom stale-querySelectorAll bug\n // that an in-place insertBefore move triggers). Stationary rows are never\n // touched, so an unchanged re-render performs zero moves and constructs zero\n // cells.\n private reconcileRows(entries: RowEntry[]) {\n const tbody = this.tbody;\n if (!tbody) return;\n\n const next = new Map<unknown, { el: HTMLElement; sig: string }>();\n const desired: HTMLElement[] = [];\n const used = new Set<HTMLElement>();\n\n for (const entry of entries) {\n const prev = this.renderedRows.get(entry.key);\n let el: HTMLElement;\n\n if (prev && !used.has(prev.el) && !entry.alwaysRebuild && prev.sig === entry.sig) {\n // Reuse the existing element. A reorder may have changed its logical\n // index without changing its signature — re-stamp index-derived DOM.\n el = prev.el;\n if (entry.restampIndex !== undefined) this.restampRowIndex(el, entry.restampIndex);\n } else {\n el = entry.create();\n }\n\n used.add(el);\n desired.push(el);\n // First occurrence wins on a duplicate key (matches rowIndexMap / _reconcileKeyed).\n if (!next.has(entry.key)) next.set(entry.key, { el, sig: entry.sig });\n }\n\n // Remove any current child that is not part of the desired set (departed\n // rows, plus a prior empty/loading/error message row).\n const desiredSet = new Set(desired);\n for (const child of Array.from(tbody.children)) {\n if (!desiredSet.has(child as HTMLElement)) child.remove();\n }\n\n // Place desired rows in order. `ref` walks the surviving children; a row\n // already sitting at `ref` is skipped, anything else is moved/inserted here.\n let ref: Node | null = tbody.firstChild;\n for (const el of desired) {\n if (el === ref) {\n ref = el.nextSibling;\n } else {\n const frag = document.createDocumentFragment();\n frag.appendChild(el); // detaches el from its old position (if any)\n tbody.insertBefore(frag, ref);\n }\n }\n\n this.renderedRows = next;\n }\n\n /**\n * A structural fingerprint of everything `createRow` reads that is NOT\n * per-row data: visible columns + their widths/pinning/offsets, tool columns,\n * density, uniform row height, tree group column. A change here (resize, pin,\n * hide/show, density) forces every row to rebuild, since a reused element\n * would carry stale layout.\n */\n // E2: stable identity for a custom renderer function, so computeStructuralSig\n // can encode \"which renderer\" without stringifying the function. A new\n // function reference gets a new id → the structural signature changes →\n // reused rows rebuild.\n private rendererIds = new WeakMap<object, number>();\n private rendererIdSeq = 0;\n private rendererIdFor(fn?: unknown): string {\n if (typeof fn !== 'function') return '';\n let id = this.rendererIds.get(fn as object);\n if (id === undefined) {\n id = ++this.rendererIdSeq;\n this.rendererIds.set(fn as object, id);\n }\n return String(id);\n }\n\n private computeStructuralSig(): string {\n const cols = this.getVisibleColumnDefinitions().map(col => {\n const state = this.columnManager.getState(col.key);\n // E2: fold each column's custom renderer identity in so swapping a\n // renderCell function invalidates every reused row (Task B recycling).\n const rc = this.rendererIdFor((col as any).renderCell);\n return `${col.key}:${state?.width ?? ''}:${state?.pinned ?? ''}:rc${rc}`;\n });\n\n return [\n cols.join(','),\n `pl=${Array.from(this.columnManager.getPinnedLeftOffsets().values()).join('/')}`,\n `pr=${Array.from(this.columnManager.getPinnedRightOffsets().values()).join('/')}`,\n `sel=${this.selectable ? this.selectionMode : 'off'}`,\n `selectable=${this.rendererIdFor(this.selectabilityCheck)}`,\n `md=${this.masterDetail.isEnabled() ? 1 : 0}`,\n `rr=${this.rowReorder && this.rowDnD.isEnabled() ? 1 : 0}`,\n `rh=${this.rowHeight}`,\n `d=${this.density}`,\n `tree=${this.treeData.isEnabled() ? this.treeData.getGroupColumn() : ''}`,\n ].join('|');\n }\n\n /**\n * A fingerprint of a row's own field values, so a row object that was mutated\n * IN PLACE (the same identity re-delivered by a poll/websocket patch, or an\n * array the app edits) is rebuilt instead of recycled with stale cells.\n *\n * Tradeoff, deliberately chosen: this walks the row's OWN, SHALLOW fields\n * rather than running each column's valueGetter/formatter. It therefore costs\n * one string build per rendered row — never a user callback, so call counts\n * for `valueGetter` stay exactly one per row per render — and it still catches\n * getter-derived columns, because a getter reads the fields this covers.\n * Nested objects collapse to their String() form, so a mutation buried inside\n * a nested object (or an object rendered by a JSON/progress cell) is not\n * detected; those callers should hand over a new row object. Recycling keeps\n * its payoff: rows whose values did not change are still reused untouched.\n */\n private rowValueSignature(rowData: any): string {\n if (rowData === null || typeof rowData !== 'object') return String(rowData);\n const parts: string[] = [];\n for (const key of Object.keys(rowData)) {\n const value = (rowData as any)[key];\n parts.push(`${key}=${value === null || value === undefined ? '' : String(value)}`);\n }\n // A separator keeps {a:'1b'} from colliding with {a:'1',b:''}.\n return parts.join('|');\n }\n\n /**\n * The per-row rebuild signature. Selection and the plain data-index are\n * re-stamped on reuse (not here) so they never force a rebuild; this captures\n * the row's cell values plus what a re-stamp cannot repair: tree node state,\n * per-row height, and — when a feature embeds the index in a row-scoped\n * closure (row DnD drag index, master-detail toggle index) — the index itself.\n */\n private rowSignature(rowData: any, index: number, structuralSig: string, treeRow?: TreeRow): string {\n const parts = [structuralSig, `v:${this.rowValueSignature(rowData)}`];\n if (treeRow) parts.push(`t:${treeRow.depth}:${treeRow.expanded ? 1 : 0}:${treeRow.hasChildren ? 1 : 0}`);\n if (this.rowHeightCallback) parts.push(`h:${this.rowHeightCallback(rowData, index)}`);\n if (this.masterDetail.isEnabled()) parts.push(`detail:${this.masterDetail.isExpanded(index) ? 1 : 0}`);\n // Features whose row DOM closes over the index must rebuild when it changes.\n if ((this.rowReorder && this.rowDnD.isEnabled()) || this.masterDetail.isEnabled()) {\n parts.push(`i:${index}`);\n }\n return parts.join('|');\n }\n\n /** Whether the row at `index` currently hosts an inline editor. */\n private isRowEditing(index: number): boolean {\n if (!this.editable) return false;\n if (this.editMode === 'row') {\n const rowState = this.editor.getRowEditState();\n return !!(rowState?.isEditing && rowState.rowIndex === index);\n }\n const cellState = this.editor.getCellEditState();\n return !!(cellState?.isEditing && cellState.rowIndex === index);\n }\n\n /**\n * Update a reused row's index-derived DOM after a reorder: the tr's\n * `data-index`, its selection reflection, and the select checkbox's\n * `data-row-index` (read back by the click/change handlers). Everything else\n * that depends on the index is captured by the signature and forces a rebuild.\n */\n private restampRowIndex(el: HTMLElement, index: number) {\n el.setAttribute('data-index', String(index));\n const isSelected = this.selectedRows.includes(index);\n this.stampRowSelection(el, isSelected);\n const checkbox = el.querySelector('snice-checkbox.row-select') as any;\n if (checkbox) {\n checkbox.setAttribute('data-row-index', String(index));\n checkbox.checked = isSelected;\n const disabled = !!(this.selectabilityCheck && !this.selectabilityCheck(this.data[index], index));\n checkbox.disabled = disabled;\n checkbox.toggleAttribute('disabled', disabled);\n }\n }\n\n /**\n * Drop the cached <tr> for a row object so the next render rebuilds it. Used\n * when the table mutates a row in place (cell-edit commit) — the object\n * identity is unchanged, so the reconciler would otherwise reuse the stale\n * cell DOM.\n */\n private invalidateRenderedRow(rowData: any) {\n this.renderedRows.delete(rowData);\n }\n\n // F: the denominator for client-side pagination. When grouping/aggregation is\n // active the page unit is a FLATTENED display item (group/data/aggregate row),\n // not a raw data row — so pages cover the whole flattened list. Ungrouped\n // behavior is unchanged (data.length).\n private paginationTotal(): number {\n if (this.paginationMode !== 'client') return this.totalItems;\n if (this.usesGroupingDisplayModel()) return this.getGroupingItems().length;\n if (this.treeData.isEnabled()) return this.getTreeDisplayRows(false).length;\n return this.data.length;\n }\n\n private get totalPages(): number {\n const total = this.paginationTotal();\n return Math.max(1, Math.ceil(total / this.pageSize));\n }\n\n goToPage(page: number) {\n const clamped = Math.max(1, Math.min(page, this.totalPages));\n if (clamped === this.currentPage) return;\n this.currentPage = clamped;\n\n if (this.paginationMode === 'server' && this.mode === 'remote') {\n this.debouncedDataRequest();\n } else {\n this.renderBody();\n }\n\n this.dispatchPageChange();\n }\n\n setPageSize(size: number) {\n this.pageSize = size;\n this.currentPage = 1;\n\n if (this.paginationMode === 'server' && this.mode === 'remote') {\n this.debouncedDataRequest();\n } else {\n this.renderBody();\n }\n\n this.dispatchPageChange();\n }\n\n @dispatch('page-change', { bubbles: true, composed: true })\n private dispatchPageChange() {\n return {\n page: this.currentPage,\n pageSize: this.pageSize,\n totalPages: this.totalPages,\n totalItems: this.paginationTotal()\n };\n }\n\n renderPagination() {\n const container = this.shadowRoot?.querySelector('.table-pagination-container');\n if (!container) return;\n\n if (!this.pagination) {\n container.innerHTML = '';\n return;\n }\n\n const total = this.paginationTotal();\n const totalPages = this.totalPages;\n const start = Math.min((this.currentPage - 1) * this.pageSize + 1, total);\n const end = Math.min(this.currentPage * this.pageSize, total);\n\n // Build page buttons\n const pageButtons: string[] = [];\n const maxVisible = 7;\n\n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) {\n pageButtons.push(this.pageButton(i));\n }\n } else {\n pageButtons.push(this.pageButton(1));\n if (this.currentPage > 3) pageButtons.push('<span class=\"pagination__ellipsis\">…</span>');\n\n const rangeStart = Math.max(2, this.currentPage - 1);\n const rangeEnd = Math.min(totalPages - 1, this.currentPage + 1);\n for (let i = rangeStart; i <= rangeEnd; i++) {\n pageButtons.push(this.pageButton(i));\n }\n\n if (this.currentPage < totalPages - 2) pageButtons.push('<span class=\"pagination__ellipsis\">…</span>');\n pageButtons.push(this.pageButton(totalPages));\n }\n\n container.innerHTML = '';\n\n const pagination = document.createElement('div');\n pagination.className = 'pagination';\n pagination.setAttribute('part', 'pagination');\n\n // Info\n const info = document.createElement('div');\n info.className = 'pagination__info';\n info.textContent = `Showing ${start}\\u2013${end} of ${total}`;\n pagination.appendChild(info);\n\n // Controls\n const controls = document.createElement('div');\n controls.className = 'pagination__controls';\n controls.innerHTML = `\n <button class=\"pagination__btn pagination__first\" ${this.currentPage <= 1 ? 'disabled' : ''} data-page=\"1\" aria-label=\"First page\">\\u27E8\\u27E8</button>\n <button class=\"pagination__btn pagination__prev\" ${this.currentPage <= 1 ? 'disabled' : ''} data-page=\"${this.currentPage - 1}\" aria-label=\"Previous page\">\\u27E8</button>\n ${pageButtons.join('')}\n <button class=\"pagination__btn pagination__next\" ${this.currentPage >= totalPages ? 'disabled' : ''} data-page=\"${this.currentPage + 1}\" aria-label=\"Next page\">\\u27E9</button>\n <button class=\"pagination__btn pagination__last\" ${this.currentPage >= totalPages ? 'disabled' : ''} data-page=\"${totalPages}\" aria-label=\"Last page\">\\u27E9\\u27E9</button>\n `;\n pagination.appendChild(controls);\n\n // Page size selector — use snice-select\n const sizeContainer = document.createElement('div');\n sizeContainer.className = 'pagination__size';\n const sizeLabel = document.createElement('label');\n sizeLabel.textContent = 'Rows per page:';\n sizeContainer.appendChild(sizeLabel);\n\n const sizeSelect = document.createElement('snice-select') as any;\n sizeSelect.size = 'small';\n sizeSelect.className = 'pagination__size-select';\n // Always include the CURRENT pageSize: when it isn't in pageSizes (e.g.\n // pageSize=5 with the default list) no option matches the value and the\n // select shows its placeholder instead of the active size.\n const sizeOptions = this.pageSizes.includes(this.pageSize)\n ? this.pageSizes\n : [...this.pageSizes, this.pageSize].sort((a, b) => a - b);\n for (const s of sizeOptions) {\n const opt = document.createElement('snice-option') as any;\n opt.setAttribute('value', String(s));\n opt.textContent = String(s);\n if (s === this.pageSize) opt.setAttribute('selected', '');\n sizeSelect.appendChild(opt);\n }\n sizeSelect.value = String(this.pageSize);\n sizeContainer.appendChild(sizeSelect);\n pagination.appendChild(sizeContainer);\n\n container.appendChild(pagination);\n\n // Bind page button events\n controls.querySelectorAll('[data-page]').forEach(btn => {\n btn.addEventListener('click', () => {\n const page = parseInt((btn as HTMLElement).getAttribute('data-page')!);\n this.goToPage(page);\n });\n });\n\n // Bind size select event\n sizeSelect.addEventListener('select-change', (e: CustomEvent) => {\n this.setPageSize(parseInt(e.detail.value));\n });\n }\n\n private pageButton(page: number): string {\n const active = page === this.currentPage ? ' pagination__btn--active' : '';\n return `<button class=\"pagination__btn pagination__page${active}\" data-page=\"${page}\">${page}</button>`;\n }\n\n /**\n * The column's display text, or null when the column declares no display\n * formatter. `formatter` (row-aware) is the display formatter and\n * `valueFormatter` its documented fallback, so `formatter` wins.\n */\n private cellDisplayText(column: any, value: any, row?: any): string | null {\n const formatter = column.formatter || column.valueFormatter;\n return formatter ? String(formatter(value, row) ?? '') : null;\n }\n\n /** Create a cell element safely using createElement + setAttribute */\n createCellElement(column: any, value: any, row?: any): HTMLElement {\n // E2: a custom renderCell bypasses the type-based cell entirely. A string\n // result is set via textContent (never innerHTML — no HTML parsing / XSS);\n // an HTMLElement is used as-is.\n if (typeof column.renderCell === 'function') {\n const rendered = column.renderCell(value, row, column);\n if (rendered instanceof HTMLElement) return rendered;\n const span = document.createElement('span');\n span.className = 'custom-cell';\n span.textContent = rendered == null ? '' : String(rendered);\n return span;\n }\n\n // A declared display formatter resolves the whole pipeline here — the\n // documented precedence is `formatter` first, `valueFormatter` as the\n // fallback — and its output is TEXT, so the column renders through the text\n // cell: a rating/progress/link/boolean cell cannot carry a display string\n // (its value channel is typed) and renders structure rather than text. This\n // is the rule the declarative <snice-row> path already uses.\n const displayText = this.cellDisplayText(column, value, row);\n const tagName = displayText === null ? this.getCellTagName(column.type) : 'snice-cell-text';\n const el = document.createElement(tagName) as any;\n\n // Base attributes. Only force `align` if the column definition specifies\n // one; otherwise let the cell pick its type-appropriate default (numbers\n // right, rating/boolean center, text left). Hard-coding 'left' here fought\n // the cell's own type-based text-align and made number values drift — and a\n // formatted column keeps its TYPE's default, not the text cell's.\n el.setAttribute('type', column.type || 'text');\n if (column.align) el.setAttribute('align', column.align);\n else if (displayText !== null) el.setAttribute('align', defaultCellAlign(column.type));\n el.setAttribute('in-table', 'true');\n\n // The cell's value IS its display value: with a formatter declared the cell\n // receives the formatted text and a column with the formatters removed, so\n // nothing formats twice and the `value` channel a caller reads is what the\n // cell shows.\n const cellColumn = displayText === null\n ? column\n : { ...column, formatter: undefined, valueFormatter: undefined };\n\n // Set the property directly so arrays/objects reach progress, sparkline,\n // JSON, action, and tag cells without a lossy attribute conversion. Keep a\n // primitive attribute for declarative inspection and CSS selectors.\n if (displayText !== null) {\n el.value = displayText;\n el.setAttribute('value', displayText);\n } else if (column.type === 'sparkline' && value !== null && typeof value === 'object') {\n el.setAttribute('value', JSON.stringify(value));\n if (Array.isArray(value)) el.data = value;\n } else {\n // An empty row value (null, or a field the row never carried) falls back\n // to the typed cell's own documented empty value, never to a blanket ''.\n const resolved = value ?? emptyCellValue(column.type);\n el.value = resolved;\n if (resolved !== null && typeof resolved !== 'object') {\n el.setAttribute('value', String(resolved));\n }\n }\n\n // Column definition as property (for formatter access etc.)\n el.column = cellColumn;\n // Row-aware formatters, conditional formatting, and action-cell events all\n // consume the originating row through the cell's property API.\n el.rowData = row ?? null;\n\n // Type-specific attributes\n switch (column.type) {\n case 'number':\n case 'currency': {\n if (column.decimals !== undefined) el.setAttribute('decimals', String(column.decimals));\n if (column.thousandsSeparator) el.setAttribute('thousands-separator', 'true');\n if (column.prefix) el.setAttribute('prefix', column.prefix);\n if (column.suffix) el.setAttribute('suffix', column.suffix);\n if (column.type === 'currency') {\n const cf = column.currencyFormat;\n if (cf) {\n if (cf.currency) el.setAttribute('currency', cf.currency);\n if (cf.locale) el.setAttribute('locale', cf.locale);\n if (cf.display || cf.currencyDisplay) {\n el.setAttribute('currencydisplay', cf.currencyDisplay || cf.display);\n }\n if (cf.decimals !== undefined) el.setAttribute('decimals', String(cf.decimals));\n if (cf.thousandsSeparator === false) el.thousandsSeparator = false;\n }\n }\n break;\n }\n case 'date':\n if (column.dateFormat) el.setAttribute('date-format', column.dateFormat);\n break;\n case 'boolean':\n if (column.useSymbols) el.setAttribute('use-symbols', 'true');\n if (column.trueSymbol) el.setAttribute('true-symbol', column.trueSymbol);\n if (column.falseSymbol) el.setAttribute('false-symbol', column.falseSymbol);\n if (column.trueValue) el.setAttribute('true-value', column.trueValue);\n if (column.falseValue) el.setAttribute('false-value', column.falseValue);\n break;\n case 'sparkline': {\n const sf = column.sparklineFormat;\n if (sf) {\n if (sf.color) el.setAttribute('color', sf.color);\n if (sf.type) el.setAttribute('chart-type', sf.type);\n if (sf.width) el.setAttribute('width', String(sf.width));\n if (sf.height) el.setAttribute('height', String(sf.height));\n }\n break;\n }\n case 'rating': {\n const rf = column.ratingFormat;\n if (rf) {\n if (rf.max) el.setAttribute('max', String(rf.max));\n if (rf.color) el.setAttribute('color', rf.color);\n }\n break;\n }\n case 'progress': {\n const pf = column.progressFormat;\n if (pf) {\n if (pf.max) el.setAttribute('max', String(pf.max));\n if (pf.color) el.setAttribute('color', pf.color);\n if (pf.showPercentage) el.setAttribute('show-percentage', 'true');\n }\n break;\n }\n case 'percentage':\n case 'percent': {\n const pf = column.percentageFormat;\n if (pf) {\n if (pf.decimals !== undefined) el.setAttribute('decimals', String(pf.decimals));\n if (pf.colorize) el.setAttribute('colorize', 'true');\n }\n break;\n }\n case 'status': {\n const sf = column.statusFormat;\n if (sf) {\n if (sf.variant) el.setAttribute('variant', sf.variant);\n if (sf.showDot) el.setAttribute('show-dot', 'true');\n }\n break;\n }\n case 'link': {\n const lf = column.linkFormat;\n if (lf) {\n if (lf.target) el.setAttribute('target', lf.target);\n if (lf.external) el.setAttribute('external', 'true');\n }\n break;\n }\n case 'image': {\n const imf = column.imageFormat;\n if (imf) {\n if (imf.shape) el.setAttribute('shape', imf.shape);\n if (imf.size) el.setAttribute('size', imf.size);\n }\n break;\n }\n case 'color': {\n const cf = column.colorFormat;\n if (cf) {\n if (cf.showSwatch !== false) el.setAttribute('show-swatch', 'true');\n if (cf.displayFormat) el.setAttribute('display-format', cf.displayFormat);\n }\n break;\n }\n case 'email': {\n const ef = column.emailFormat;\n if (ef) {\n if (ef.showIcon) el.setAttribute('show-icon', 'true');\n }\n break;\n }\n case 'phone': {\n const pf = column.phoneFormat;\n if (pf) {\n if (pf.showIcon) el.setAttribute('show-icon', 'true');\n if (pf.format) el.setAttribute('format', 'true');\n }\n break;\n }\n }\n\n return el;\n }\n\n getCellTagName(type: string): string {\n switch (type) {\n case 'text':\n return 'snice-cell-text';\n case 'number':\n return 'snice-cell-number';\n case 'currency':\n return 'snice-cell-currency';\n case 'date':\n return 'snice-cell-date';\n case 'boolean':\n return 'snice-cell-boolean';\n case 'rating':\n return 'snice-cell-rating';\n case 'progress':\n return 'snice-cell-progress';\n case 'duration':\n return 'snice-cell-duration';\n case 'filesize':\n return 'snice-cell-filesize';\n case 'sparkline':\n return 'snice-cell-sparkline';\n case 'image':\n return 'snice-cell-image';\n case 'percentage':\n case 'percent':\n return 'snice-cell-percentage';\n case 'tag':\n return 'snice-cell-tag';\n case 'status':\n return 'snice-cell-status';\n case 'actions':\n return 'snice-cell-actions';\n case 'link':\n return 'snice-cell-link';\n case 'email':\n return 'snice-cell-email';\n case 'phone':\n return 'snice-cell-phone';\n case 'color':\n return 'snice-cell-color';\n case 'location':\n return 'snice-cell-location';\n case 'json':\n return 'snice-cell-json';\n default:\n return 'snice-cell';\n }\n }\n\n private fsExitHandler: (() => void) | null = null;\n\n toggleFullscreen = async () => {\n const isFullscreen = this.classList.contains('table-fullscreen');\n if (isFullscreen) {\n this.classList.remove('table-fullscreen');\n if (document.fullscreenElement === this) {\n try { await document.exitFullscreen(); } catch { /* already exited */ }\n }\n if (this.fsExitHandler) {\n document.removeEventListener('fullscreenchange', this.fsExitHandler);\n this.fsExitHandler = null;\n }\n } else {\n this.classList.add('table-fullscreen');\n // Use the platform Fullscreen API — escapes the page's stacking context\n // (the showcase header has backdrop-filter which fights CSS-only overlays)\n // and gives the user the browser's native Esc-to-exit affordance.\n try {\n if (typeof this.requestFullscreen === 'function') {\n await this.requestFullscreen();\n }\n } catch {\n // Browser blocked it (e.g. not from a user gesture) — fall back to CSS.\n }\n // Sync class with the browser's fullscreen state\n this.fsExitHandler = () => {\n if (document.fullscreenElement !== this) {\n this.classList.remove('table-fullscreen');\n if (this.fsExitHandler) {\n document.removeEventListener('fullscreenchange', this.fsExitHandler);\n this.fsExitHandler = null;\n }\n }\n };\n document.addEventListener('fullscreenchange', this.fsExitHandler);\n }\n }\n\n private handleKeydown = (e: KeyboardEvent) => {\n if (e.key !== 'Enter' && e.key !== ' ') return;\n\n const th = (e.target as HTMLElement).closest('th.sortable') as HTMLElement | null;\n if (!th) return;\n\n const columnKey = th.getAttribute('data-key');\n if (!columnKey) return;\n\n e.preventDefault();\n this.toggleSort(columnKey, true);\n };\n\n private handleClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n\n // Handle sortable header click — every click adds/cycles in multi-sort.\n const th = target.closest('th.sortable') as HTMLElement;\n if (th) {\n const columnKey = th.getAttribute('data-key');\n if (columnKey) {\n this.toggleSort(columnKey, true);\n }\n return;\n }\n\n // Handle row click\n const tr = target.closest('tbody tr') as HTMLElement;\n if (tr) {\n // Group rows have no data-index. Route the whole header cell (including\n // its chevron) through the table's one Snice-bound click handler so the\n // model toggles once and @dispatch emits from the host. Checkbox clicks\n // are handled by handleChange and must not also collapse the group.\n if (tr.classList.contains('group-header-row')) {\n if (target.closest('snice-checkbox.group-select')) return;\n const key = tr.getAttribute('data-group-key');\n const group = key\n ? this.getGroupingItems().find(\n (item): item is GroupRow => item.type === 'group' && item.key === key\n )\n : undefined;\n if (group) this.toggleGroup(group);\n return;\n }\n\n // Aggregate, spacer, loading, error, and empty-state rows are structural\n // rows, not row zero. Ignoring them prevents phantom selection/click\n // events caused by parseInt(null || '0').\n if (!tr.hasAttribute('data-index')) return;\n\n // Don't trigger if clicking on checkbox or other interactive elements\n if (target.matches('input[type=\"checkbox\"], button, a, .interactive, snice-checkbox, snice-button, snice-input, snice-select')) {\n return;\n }\n\n const rowIndex = parseInt(tr.getAttribute('data-index') || '0');\n const rowData = this.data[rowIndex];\n\n // Handle row selection if selectable. selectionMode + modifier intent\n // (ctrl/meta = additive toggle, shift = range) resolved in one place.\n if (this.selectable) {\n this.applyRowSelection(rowIndex, {\n additive: e.ctrlKey || e.metaKey,\n range: e.shiftKey,\n });\n }\n\n // Handle clickable row event\n if (this.clickable) {\n this.dispatchRowClicked(rowData, rowIndex);\n }\n }\n }\n\n private handleChange = (e: Event) => {\n const target = e.target as HTMLElement;\n\n // Handle snice-checkbox events (row-select and select-all)\n if (target.matches('snice-checkbox.row-select')) {\n const checkbox = target as any;\n const rowIndex = parseInt(checkbox.getAttribute('data-row-index') || '0');\n\n if (this.selectionMode === 'none') return;\n if (this.selectabilityCheck && !this.selectabilityCheck(this.data[rowIndex], rowIndex)) {\n checkbox.checked = this.selectedRows.includes(rowIndex);\n return;\n }\n\n if (this.selectionMode === 'single') {\n this.selectedRows = checkbox.checked ? [rowIndex] : [];\n } else if (checkbox.checked) {\n if (!this.selectedRows.includes(rowIndex)) {\n this.selectedRows = [...this.selectedRows, rowIndex];\n }\n } else {\n this.selectedRows = this.selectedRows.filter(i => i !== rowIndex);\n }\n this.selectionAnchor = this.data[rowIndex];\n\n // DOM update happens in the selectedRows @watch (delta, one row).\n this.dispatchRowSelectionChanged(rowIndex, checkbox.checked);\n this.dispatchSelectionChanged();\n return;\n }\n\n // F: a group-header checkbox selects/deselects all rows in that group.\n if (target.matches('snice-checkbox.group-select')) {\n const checkbox = target as any;\n if (this.selectionMode !== 'multiple') return;\n\n const key = checkbox.getAttribute('data-group-key');\n const group = this.getGroupingItems().find(\n (it): it is GroupRow => it.type === 'group' && it.key === key\n );\n if (!group) return;\n\n const indices = this.getSelectableGroupIndices(group);\n if (checkbox.checked) {\n this.selectedRows = Array.from(new Set([...this.selectedRows, ...indices]));\n } else {\n const remove = new Set(indices);\n this.selectedRows = this.selectedRows.filter((i) => !remove.has(i));\n }\n\n // Row DOM + group/header checkboxes update in the selectedRows @watch.\n this.dispatchSelectionChanged();\n return;\n }\n\n if (target.matches('snice-checkbox.select-all')) {\n const checkbox = target as any;\n\n // Select-all only carries meaning in multiple mode.\n if (this.selectionMode !== 'multiple') return;\n\n if (checkbox.checked) {\n // Select only filtered/displayed rows, not all data\n this.selectedRows = this.getSelectableIndices(this.getFilteredData());\n } else {\n this.selectedRows = [];\n }\n\n // Row DOM + header checkbox update in the selectedRows @watch.\n this.dispatchSelectAllChanged(checkbox.checked);\n this.dispatchSelectionChanged();\n }\n }\n\n private onAttached = () => {\n // A controller attached. Only fetch if the user explicitly declared\n // remote mode (mode=\"remote\" on the element, or set programmatically).\n // Local mode is the default and means the table owns its dataset.\n if (this.mode !== 'remote') return;\n this.getTableConfig();\n this.getTableData();\n }\n\n private searchDebounceTimeout: any = null;\n\n private handleSearchInput = (e: Event) => {\n const target = e.target as HTMLElement;\n const input = target as HTMLInputElement;\n this.searchText = input.value;\n\n // Manual debounce implementation\n if (this.searchDebounceTimeout) {\n clearTimeout(this.searchDebounceTimeout);\n }\n this.searchDebounceTimeout = setTimeout(() => {\n if (this.mode === 'remote') this.getTableData();\n else this.setQuickFilter(this.searchText);\n }, this.searchDebounce);\n }\n\n private handleQuickFilterInput = (e: Event) => {\n const input = e.target as HTMLInputElement;\n if (this.filterInputDebounceTimeout) clearTimeout(this.filterInputDebounceTimeout);\n this.filterInputDebounceTimeout = setTimeout(() => {\n this.filterInputDebounceTimeout = null;\n this.setQuickFilter(input.value || '');\n }, SniceTable.FILTER_INPUT_DEBOUNCE_MS);\n }\n\n private selectorDebounceTimeout: any = null;\n\n private handleSelectorChange = (e: CustomEvent) => {\n this.selector = Array.isArray(e.detail.value) ? e.detail.value.join(',') : e.detail.value;\n\n // Manual debounce implementation\n if (this.selectorDebounceTimeout) {\n clearTimeout(this.selectorDebounceTimeout);\n }\n this.selectorDebounceTimeout = setTimeout(() => {\n this.debouncedDataRequest();\n }, 150);\n }\n\n\n // A2: full sweep — kept for external/programmatic callers and post-render\n // resync. NOT on the single-toggle path (that goes through the delta in\n // handleSelectedRowsChange → updateRowSelectionStateFor).\n updateRowSelectionState() {\n if (!this.tbody) return;\n\n // Key off each row's own `data-index`, never its DOM position: group\n // headers, aggregate footers, virtual spacers, and the inert fill row share\n // the tbody, so a positional walk hands a raw-data index to a non-data row\n // (and drifts every real row after it — on page 2 of a client-paged table\n // the offsets never lined up at all).\n const rows = this.tbody.querySelectorAll('tr[data-index]');\n rows.forEach(row => {\n const index = Number(row.getAttribute('data-index'));\n const isSelected = this.selectedRows.includes(index);\n this.stampRowSelection(row as HTMLElement, isSelected);\n\n const checkbox = row.querySelector('snice-checkbox.row-select') as any;\n if (checkbox) {\n checkbox.checked = isSelected;\n }\n });\n }\n\n /**\n * The two selection reflections a row carries, written together: `data-selected`\n * drives the CSS, `aria-selected` is the documented a11y contract (\"selected\n * data rows expose aria-selected\"). The keyboard module stamps ARIA only on a\n * full body render, so the delta paths below have to carry it themselves —\n * otherwise a screen reader never hears an interaction-driven selection.\n */\n private stampRowSelection(row: HTMLElement, isSelected: boolean) {\n row.setAttribute('data-selected', String(isSelected));\n if (isSelected) row.setAttribute('aria-selected', 'true');\n else row.removeAttribute('aria-selected');\n }\n\n // A2: reflect one row's selection into the DOM (located by data-index). The\n // reconciler (Task B) re-stamps data-index on moved rows, so this stays\n // correct after reorder. No-op if the row isn't in the current window.\n private updateRowSelectionStateFor(index: number, isSelected: boolean) {\n if (!this.tbody) return;\n const row = this.tbody.querySelector(`tr[data-index=\"${index}\"]`) as HTMLElement | null;\n if (!row) return;\n this.stampRowSelection(row, isSelected);\n const checkbox = row.querySelector('snice-checkbox.row-select') as any;\n if (checkbox) checkbox.checked = isSelected;\n }\n\n updateSelectAllState() {\n const selectAllCheckbox = this.thead?.querySelector('snice-checkbox.select-all') as any;\n if (!selectAllCheckbox) return;\n\n const filteredIndices = this.getSelectableIndices(this.getFilteredData());\n const selectedInFiltered = filteredIndices.filter(i => this.selectedRows.includes(i));\n const allSelected = selectedInFiltered.length === filteredIndices.length && filteredIndices.length > 0;\n const someSelected = selectedInFiltered.length > 0 && selectedInFiltered.length < filteredIndices.length;\n\n selectAllCheckbox.checked = allSelected;\n selectAllCheckbox.indeterminate = someSelected;\n }\n\n toggleSort(columnKey: string, multiSort: boolean = false) {\n if (!multiSort) {\n // Single column sort - clear all other sorts\n const existingSort = this.currentSort.find(s => s.column === columnKey);\n\n if (!existingSort) {\n this.currentSort = [{ column: columnKey, direction: 'asc' }];\n } else if (existingSort.direction === 'asc') {\n this.currentSort = [{ column: columnKey, direction: 'desc' }];\n } else {\n this.currentSort = [];\n }\n } else {\n // Multi column sort - modify existing or add new\n const existingSortIndex = this.currentSort.findIndex(s => s.column === columnKey);\n\n if (existingSortIndex === -1) {\n // Add new sort\n this.currentSort = [...this.currentSort, { column: columnKey, direction: 'asc' }];\n } else {\n const existingSort = this.currentSort[existingSortIndex];\n if (existingSort.direction === 'asc') {\n // Change to desc - create new array to trigger reactivity\n this.currentSort = this.currentSort.map((sort, index) =>\n index === existingSortIndex ? { ...sort, direction: 'desc' as const } : sort\n );\n } else {\n // Remove this sort\n this.currentSort = this.currentSort.filter(s => s.column !== columnKey);\n }\n }\n }\n\n this.renderHeader();\n this.dispatchSortChange();\n if (this.mode === 'remote') {\n this.debouncedDataRequest();\n } else {\n this.sortLocalData();\n }\n }\n\n /**\n * Reorder `this.data` to the current client-side sort (or back to delivery\n * order when the sort was cleared). Split out of sortLocalData so a fresh\n * delivery can land sorted without re-entering the render/index bookkeeping.\n */\n private applyLocalSortOrder() {\n if (!this.unsortedData.length) {\n this.unsortedData = [...this.data];\n }\n // C1: bracket the reassignment so the data @watch does NOT treat this\n // re-sorted view as a new dataset (would clobber unsortedData + double-render).\n this.settingSortedData = true;\n if (this.currentSort.length === 0) {\n this.data = [...this.unsortedData];\n } else {\n this.data = [...this.unsortedData].sort((a, b) => {\n for (const { column, direction } of this.currentSort) {\n const colDef = this.columns.find(c => c.key === column);\n const customComparator = (colDef as any)?.sortComparator;\n // The value pipeline feeds BOTH sort paths: valueGetter \"runs for\n // display, sort, aggregation\", so a custom comparator sees the same\n // derived value the cell shows (remote columns routinely key on the\n // server's sort field and bridge the display with a getter).\n const aVal = colDef?.valueGetter ? colDef.valueGetter(a[column], a) : a[column];\n const bVal = colDef?.valueGetter ? colDef.valueGetter(b[column], b) : b[column];\n\n if (customComparator) {\n const cmp = customComparator(aVal, bVal, direction);\n if (cmp !== 0) return cmp;\n } else {\n const cmp = String(aVal ?? '').localeCompare(String(bVal ?? ''), undefined, { numeric: true });\n if (cmp !== 0) return direction === 'asc' ? cmp : -cmp;\n }\n }\n return 0;\n });\n }\n this.settingSortedData = false;\n }\n\n private sortLocalData() {\n const previous = this.data;\n this.applyLocalSortOrder();\n // Sort replaced this.data (new order + reference) — resync the row-index\n // map and drop the stale filtered snapshot before re-rendering. Render is\n // queued (not synchronous): sortLocalData is reachable from the currentSort\n // setter stack via handleControlledSort, and cells must never construct there.\n this.rebuildRowIndex();\n this.remapSelectionAfterReorder(previous);\n this.scheduleRender('body');\n }\n\n /**\n * Selection is anchored to the ROW, not to its position. `selectedRows` holds\n * indices into `data`, so any reorder of that array — a local sort, or a\n * re-delivery of the same row objects in another order — has to re-resolve\n * them; otherwise the indices keep pointing at whatever row now occupies the\n * slot and the user's checkmark silently jumps to a different row (the same\n * remap the row-reorder/DnD path performs).\n *\n * Only a permutation is remapped: same length, same identities, no duplicates.\n * A genuinely new dataset keeps the documented raw-index semantics untouched,\n * and rows carrying no identity (duplicate objects) have nothing to anchor to.\n * Call AFTER rebuildRowIndex() — the remap reads the fresh row-index map.\n */\n private remapSelectionAfterReorder(previous: any[]) {\n if (this.selectedRows.length === 0) return;\n if (previous === this.data || previous.length !== this.data.length) return;\n const identities = new Set(this.data);\n if (identities.size !== this.data.length) return;\n // BOTH sides have to be duplicate-free for \"same length + subset\" to mean\n // permutation: previous=[A,A] against data=[A,B] satisfies the subset test\n // while actually being a NEW dataset, and remapping it would move the\n // selection off the row the raw-index contract points at.\n if (new Set(previous).size !== previous.length) return;\n for (const row of previous) if (!identities.has(row)) return;\n\n const remapped = this.selectedRows\n .map((index) => this.indexOfRow(previous[index]))\n .filter((index) => index >= 0);\n if (remapped.length === this.selectedRows.length\n && remapped.every((index, i) => index === this.selectedRows[i])) return;\n this.selectedRows = remapped;\n }\n\n @dispatch('table-row-selection-changed', { bubbles: true, composed: true })\n private dispatchRowSelectionChanged(rowIndex: number, selected: boolean) {\n return {\n selectedRows: this.selectedRows,\n rowIndex,\n selected\n };\n }\n\n @dispatch('row-clicked', { bubbles: true, composed: true })\n private dispatchRowClicked(rowData: any, rowIndex: number) {\n return { rowData, rowIndex };\n }\n\n @dispatch('table-load-error', { bubbles: true, composed: true })\n private dispatchLoadError(error: unknown) {\n return { error };\n }\n\n @dispatch('table-select-all-changed', { bubbles: true, composed: true })\n private dispatchSelectAllChanged(allSelected: boolean) {\n return {\n selectedRows: this.selectedRows,\n allSelected\n };\n }\n\n // E1: unified selection event, emitted alongside the two legacy events on\n // every user-driven selection change. `rows` are the current row objects.\n @dispatch('selection-changed', { bubbles: true, composed: true })\n private dispatchSelectionChanged() {\n return {\n selectedRows: this.selectedRows,\n rows: this.getSelectedData(),\n };\n }\n\n @dispatch('sort-change', { bubbles: true, composed: true })\n private dispatchSortChange() {\n return { sort: this.currentSort };\n }\n\n @dispatch('filter-change', { bubbles: true, composed: true })\n private dispatchFilterChange() {\n return { filters: this.filterEngine.getFilterModel() };\n }\n\n @dispatch('column-visibility-change', { bubbles: true, composed: true })\n private dispatchColumnVisibilityChange(key: string, visible: boolean) {\n return { key, visible, visibility: this.columnManager.getVisibilityModel() };\n }\n\n @dispatch('column-pin-change', { bubbles: true, composed: true })\n private dispatchColumnPinChange(key: string, pinned: 'left' | 'right' | false) {\n return { key, pinned };\n }\n\n @dispatch('column-order-change', { bubbles: true, composed: true })\n private dispatchColumnOrderChange(key: string, toIndex: number) {\n return { key, toIndex };\n }\n\n @dispatch('density-change', { bubbles: true, composed: true })\n private dispatchDensityChange() {\n return { density: this.density };\n }\n\n // ── Module Integration: Initialize ──\n\n private initializeModules() {\n // Column manager\n this.columnManager.initialize(this.columns, this);\n\n // Editor\n this.setupEditor();\n\n // Keyboard\n if (this.shadowRoot) {\n this.keyboard.attach({\n shadowRoot: this.shadowRoot,\n // Keyboard order follows the rows users can actually focus. In grouped\n // mode this excludes group/aggregate rows and collapsed descendants;\n // callbacks below translate that navigation position back to the raw\n // data index expected by selection/editing APIs.\n totalRows: () => this.getKeyboardRows().length,\n ariaRows: () => this.usesGroupingDisplayModel()\n ? this.getDisplayedGroupingItems().length\n : (this.treeData.isEnabled()\n ? this.getTreeDisplayRows(true).length\n : this.getKeyboardRows().length),\n ariaRowOffset: () => this.virtualize && this.virtualizer.isEnabled()\n ? Math.max(0, this.virtualizer.getVisibleRange().start)\n : 0,\n // Use the actual main-header width: tool columns add grid cells and\n // hidden data columns remove them. Raw columns.length made keyboard\n // navigation stop early or point at nonexistent cells.\n totalColumns: () => this.getKeyboardColumnCount(),\n tabMode: 'all',\n isEditing: () => this.editor.isEditing(),\n getRowElement: (rowIndex) => this.getKeyboardRowElement(rowIndex),\n ensureRowVisible: (rowIndex) => this.ensureKeyboardRowRendered(rowIndex),\n onCellActivate: (row, col) => {\n const dataIndex = this.getKeyboardDataIndex(row);\n if (this.editable && dataIndex >= 0 && col) this.startEdit(dataIndex, col);\n },\n onSelectionToggle: (row) => {\n const dataIndex = this.getKeyboardDataIndex(row);\n if (this.selectable && dataIndex >= 0) this.toggleRowSelection(dataIndex);\n },\n onSelectAll: () => {\n if (this.selectable) this.selectAllRows();\n },\n });\n }\n }\n\n @dispose()\n cleanup() {\n this.virtualizer.detach();\n this.keyboard.detach();\n if (this.lazyLoadHandler) this.lazyLoadContainer?.removeEventListener('scroll', this.lazyLoadHandler);\n this.lazyLoadHandler = null;\n this.lazyLoadContainer = null;\n this.rowDnD.detach();\n this.columnDnD.detach();\n }\n\n // ── Virtualization API ──\n\n /**\n * The element that actually scrolls. `.table-frame` owns `overflow: auto`\n * in the live styles — attaching scroll listeners to `.snice-table` works\n * in happy-dom (no layout) but never fires in a real browser.\n */\n private getScrollContainer(): HTMLElement | null {\n return (this.shadowRoot?.querySelector('.table-frame') ??\n this.shadowRoot?.querySelector('.snice-table')) as HTMLElement | null;\n }\n\n private setupVirtualization() {\n if (!this.virtualize || !this.shadowRoot || !this.tbody) return;\n\n const scrollContainer = this.getScrollContainer();\n if (!scrollContainer) return;\n\n this.syncVirtualRows();\n this.virtualizer.attach({\n rowHeight: (displayIndex) => this.getVirtualRowHeight(displayIndex),\n bufferPx: this.virtualBuffer,\n totalRows: this.virtualRowsSnapshot.length,\n scrollContainer,\n // The host template swaps its structural branch (slotted rows ⇄ native\n // table) without re-attaching. Re-resolving keeps the window painting into\n // the LIVE tbody instead of the detached branch's orphaned one.\n resolveScrollContainer: () => this.getScrollContainer(),\n renderRange: (start, end) => this.renderRowRange(start, end),\n // Spacers span the real grid. A spacer wider than the table invents\n // columns for fixed layout to spend the frame's spare width on.\n resolveColumnSpan: () => this.getTotalColumnSpan(),\n // Pinned rows live outside the windowed range so they are always present,\n // exactly like the non-virtual path (renderBody).\n renderPinnedTop: () => this.renderPinnedRows(this.pinnedTopRows, 'top'),\n renderPinnedBottom: () => this.renderPinnedRows(this.pinnedBottomRows, 'bottom'),\n // A zero-row window still owes the user the empty/loading/error row the\n // ordinary path renders.\n renderEmptyBody: () => this.createEmptyBodyRow(),\n // Scroll-driven windows bypass renderBody; restore grid roles, logical\n // row indices, and roving focus after every inserted range.\n afterRender: () => {\n this.keyboard.refresh();\n // Every window rebuilds the tbody from scratch, taking any filler with\n // it. Virtualization is not exempt from the fill-row contract, and\n // renderBody()'s own tail call never runs on the virtual path, so the\n // filler is re-evaluated here instead.\n this.updateFillRow();\n },\n });\n }\n\n private getVirtualRowHeight(displayIndex: number): number {\n const entry = this.virtualRowsSnapshot[displayIndex];\n if (!entry || (entry.groupItem && entry.groupItem.type !== 'row')) return this.rowHeight;\n const dataIndex = entry.groupItem ? this.indexOfRow(entry.data) : entry.index;\n const base = this.rowHeightCallback\n ? this.rowHeightCallback(entry.data, dataIndex)\n : this.rowHeight;\n return base + this.masterDetail.getFixedAdditionalHeight(dataIndex);\n }\n\n /**\n * The feature-aware row list the virtualizer windows over. In tree-data mode\n * this is the FLATTENED visible tree (so expand/collapse works while\n * virtualized); otherwise it is the filtered data. Each descriptor carries\n * the logical index used for `data-index`, selection, and detail lookups.\n */\n /**\n * Re-derive the windowed row model and hand it to the virtualizer.\n *\n * `virtualRowsSnapshot` is the ONLY state the paint pipeline caches, and\n * `renderRowRange` paints from it. Any caller that resolves a display index\n * against a FRESH `getVirtualRows()` and then asks the virtualizer to paint\n * (scrollToRow, the keyboard ensure-visible hook) must republish that model\n * first, or it scrolls to an offset computed in one list and paints rows from\n * another — the requested row never appears. Returns the fresh model so the\n * caller indexes exactly what will be painted.\n *\n * `paint` false leaves the repaint to the caller (scrollToIndex refreshes the\n * window itself). Those callers must not paint from here: the virtualizer's\n * afterRender hook re-runs keyboard.refresh(), whose ensure-visible callback\n * lands back in ensureKeyboardRowRendered — an unbounded recursion.\n */\n private syncVirtualRows(paint = true) {\n this.virtualRowsSnapshot = this.getVirtualRows();\n // Not yet attached during setupVirtualization; attach() takes the count.\n if (this.virtualizer.isEnabled()) {\n this.virtualizer.setTotalRows(this.virtualRowsSnapshot.length, paint);\n }\n return this.virtualRowsSnapshot;\n }\n\n private getVirtualRows(): Array<{ data: any; index: number; treeRow?: TreeRow; groupItem?: DisplayItem }> {\n const filtered = this.getFilteredData();\n // F: the flattened group+row+aggregate list is the virtual model when\n // grouping/aggregation is on — same pattern as tree data. Group/aggregate\n // rows carry no data index; data rows key off their index in `this.data`.\n if (this.usesGroupingDisplayModel()) {\n return this.getDisplayedGroupingItems().map((groupItem, i) => ({\n data: groupItem.type === 'row' ? groupItem.data : undefined,\n index: i,\n groupItem,\n }));\n }\n if (this.treeData.isEnabled()) {\n return this.getTreeDisplayRows(true);\n }\n return filtered.map((data) => ({ data, index: this.indexOfRow(data) }));\n }\n\n private renderRowRange(startIndex: number, endIndex: number): DocumentFragment {\n const fragment = document.createDocumentFragment();\n const rows = this.virtualRowsSnapshot.length > 0\n ? this.virtualRowsSnapshot\n : this.getVirtualRows();\n\n const totalColSpan = this.getTotalColumnSpan();\n const structuralSig = this.computeStructuralSig();\n\n // Task B: recycle rows that stay in the window across a scroll shift. A row\n // still visible after scrolling keeps its data-object key and signature, so\n // it is MOVED into the freshly built fragment (appendChild detaches it from\n // the live tbody) instead of reconstructed. The virtualizer wipes the tbody\n // AFTER we build this fragment — reused rows are already parked in the\n // fragment by then, so the wipe only clears departed rows and the spacers.\n // Net cost of a small scroll: a few createRow calls for the entering rows.\n const next = new Map<unknown, { el: HTMLElement; sig: string }>();\n const used = new Set<HTMLElement>();\n\n for (let i = startIndex; i < endIndex && i < rows.length; i++) {\n const { data, index, treeRow, groupItem } = rows[i];\n\n // F: group + aggregate rows are rebuilt each window (few, always fresh),\n // keyed by their synthetic key so the reconciler places them correctly.\n if (groupItem && groupItem.type !== 'row') {\n const el = groupItem.type === 'group'\n ? this.createGroupRow(groupItem, totalColSpan)\n : this.createAggregateRow(groupItem, totalColSpan);\n used.add(el);\n if (!next.has(groupItem.key)) next.set(groupItem.key, { el, sig: 'grouprow' });\n fragment.appendChild(el);\n continue;\n }\n\n // F: a grouped data row's logical index is its index in `this.data`.\n const dataIndex = groupItem ? this.indexOfRow(data) : index;\n const editing = this.isRowEditing(dataIndex);\n // Edit marker: see renderBody. Ensures leaving edit state rebuilds the row.\n const sig = this.rowSignature(data, dataIndex, structuralSig, treeRow) + (editing ? '|edit' : '');\n const prev = this.renderedRows.get(data);\n let tr: HTMLElement;\n\n if (prev && !used.has(prev.el) && !editing && prev.sig === sig) {\n tr = prev.el;\n this.restampRowIndex(tr, dataIndex);\n } else {\n tr = this.createRow(data, dataIndex, treeRow);\n }\n\n used.add(tr);\n if (!next.has(data)) next.set(data, { el: tr, sig });\n fragment.appendChild(tr);\n\n // Master-detail: render the expanded detail row in-window. The detail\n // A fixed detailHeight participates in virtual spacer math through\n // getVirtualRowHeight. Auto-height content is still rendered in-window\n // and contributes through normal table layout. Tree rows compose with\n // master-detail like any other row; only generated gap nodes (index -1)\n // have no data row to describe.\n if (dataIndex >= 0 && this.masterDetail.isEnabled() && this.masterDetail.isExpanded(dataIndex)) {\n const detailRow = this.masterDetail.createDetailRow(data, dataIndex, totalColSpan);\n if (detailRow) fragment.appendChild(detailRow);\n }\n }\n\n this.renderedRows = next;\n return fragment;\n }\n\n /** Build a fragment of pinned rows for the given position (top/bottom). */\n private renderPinnedRows(rows: any[], position: 'top' | 'bottom'): DocumentFragment {\n const fragment = document.createDocumentFragment();\n for (const row of rows) {\n const tr = this.createRow(row, -1);\n tr.classList.add('pinned-row', position === 'top' ? 'pinned-row--top' : 'pinned-row--bottom');\n fragment.appendChild(tr);\n }\n return fragment;\n }\n\n scrollToRow(index: number) {\n // Public row indices refer to `this.data`; grouped/tree virtualization\n // scrolls a flattened display model containing structural rows as well.\n // Translate through row identity so callers still land on the requested\n // data row rather than an unrelated header/subtotal.\n if (this.usesGroupingDisplayModel() || this.treeData.isEnabled()) {\n const row = this.data[index];\n // Resolve against the model the virtualizer is about to paint from.\n const displayIndex = this.syncVirtualRows(false).findIndex((entry) => entry.data === row);\n if (displayIndex >= 0) this.virtualizer.scrollToIndex(displayIndex);\n return;\n }\n this.virtualizer.scrollToRow(index);\n }\n\n /** Rows currently reachable by grid keyboard navigation, in display order. */\n private getKeyboardColumnCount(): number {\n // List mode paints tool cells plus ONE full-width cell per row, and its\n // header no longer mirrors the body — count the body shape directly.\n if (this.usesListRowRenderer()) {\n return 1\n + (this.rowReorder && this.rowDnD.isEnabled() ? 1 : 0)\n + (this.masterDetail.isEnabled() ? 1 : 0)\n + (this.hasSelectionColumn() ? 1 : 0);\n }\n\n const rendered = this.shadowRoot?.querySelectorAll('thead tr.column-header-row > th').length ?? 0;\n if (rendered > 0) return rendered;\n\n const states = this.columnManager.getAllStates();\n const dataColumns = states.length > 0\n ? this.columnManager.getVisibleColumns().length\n : this.columns.length;\n return dataColumns\n + (this.rowReorder && this.rowDnD.isEnabled() ? 1 : 0)\n + (this.masterDetail.isEnabled() ? 1 : 0)\n + (this.hasSelectionColumn() ? 1 : 0);\n }\n\n private getKeyboardRows(): any[] {\n if (this.usesGroupingDisplayModel()) {\n return this.getDisplayedGroupingItems()\n .filter((item): item is Extract<DisplayItem, { type: 'row' }> => item.type === 'row')\n .map((item) => item.data);\n }\n\n if (this.treeData.isEnabled()) {\n return this.getTreeDisplayRows(true)\n .filter((item) => !!item.treeRow)\n .map((item) => item.data);\n }\n\n let rows = this.getFilteredData();\n if (this.pagination && this.paginationMode === 'client') {\n const start = (this.currentPage - 1) * this.pageSize;\n rows = rows.slice(start, start + this.pageSize);\n }\n return rows;\n }\n\n /** Translate a keyboard navigation position to the table's raw data index. */\n private getKeyboardDataIndex(rowIndex: number): number {\n const row = this.getKeyboardRows()[rowIndex];\n return row === undefined ? -1 : this.indexOfRow(row);\n }\n\n private getKeyboardRowElement(rowIndex: number): HTMLElement | null {\n const dataIndex = this.getKeyboardDataIndex(rowIndex);\n if (dataIndex < 0) return null;\n return this.tbody?.querySelector(`tr[data-index=\"${dataIndex}\"]`) as HTMLElement | null;\n }\n\n /**\n * Ensure a keyboard row is in the virtual window. The virtualizer scrolls by\n * flattened display position while keyboard navigation indexes visible data\n * rows, so resolve through the shared virtual row model instead of assuming\n * those two indices are interchangeable.\n */\n private ensureKeyboardRowRendered(rowIndex: number) {\n if (!this.virtualize || !this.virtualizer.isEnabled()) return;\n if (this.getKeyboardRowElement(rowIndex)) return;\n\n const row = this.getKeyboardRows()[rowIndex];\n if (row === undefined) return;\n // The window is painted from `virtualRowsSnapshot`; republish it so the\n // offset we scroll to and the rows that land there come from one model.\n const displayIndex = this.syncVirtualRows(false).findIndex((entry) => entry.data === row);\n if (displayIndex >= 0) this.virtualizer.scrollToIndex(displayIndex);\n }\n\n getScrollPosition() {\n return this.virtualizer.getScrollPosition();\n }\n\n // ── Filtering API ──\n\n setColumnFilter(column: string, operator: any, value: any) {\n this.filterEngine.setColumnFilter(column, operator, value);\n this.applyClientFilters();\n }\n\n removeColumnFilter(column: string) {\n this.filterEngine.removeColumnFilter(column);\n this.applyClientFilters();\n }\n\n setQuickFilter(text: string) {\n this.filterEngine.setQuickFilter(text);\n this.applyClientFilters();\n }\n\n setFilterModel(model: FilterModel) {\n this.filterEngine.setFilterModel(model);\n this.applyClientFilters();\n }\n\n getFilterModel() {\n return this.filterEngine.getFilterModel();\n }\n\n clearAllFilters() {\n this.filterEngine.clearAllFilters();\n this.applyClientFilters();\n }\n\n private getFilteredData(): any[] {\n // Keep the row-index map + filtered snapshot coherent with the current\n // `this.data` reference (catches a direct `table.data = [...]` assignment).\n this.ensureRowIndex();\n if (this.filteredCache) return this.filteredCache;\n const filteredDataOp = !this.filterEngine.hasActiveFilters()\n ? this.data\n : this.filterEngine.applyFilters(this.data, this.columns);\n this.filteredCache = filteredDataOp;\n return filteredDataOp;\n }\n\n // A1: rebuild the row-object → index map from `this.data`. Call wherever the\n // data array is REPLACED (setData, remote load, sortLocalData) or an element\n // is swapped in place (row-edit commit). First occurrence wins, matching\n // `Array.prototype.indexOf` semantics. Also drops the filtered snapshot,\n // since replacing the data invalidates any previously filtered view.\n private rebuildRowIndex() {\n this.rowIndexMap.clear();\n const rows = this.data;\n for (let i = 0; i < rows.length; i++) {\n if (!this.rowIndexMap.has(rows[i])) this.rowIndexMap.set(rows[i], i);\n }\n this.rowIndexDataRef = rows;\n this.filteredCache = null;\n this.groupingCache = null; // F: derived from the filtered snapshot.\n }\n\n // Rebuild lazily if `this.data` was reassigned out from under the map (plain\n // `table.data = [...]`, used widely by app code and tests, bypasses setData).\n private ensureRowIndex() {\n if (this.rowIndexDataRef !== this.data) this.rebuildRowIndex();\n }\n\n // A1: map lookup replacing `this.data.indexOf(row)`. Same identity semantics\n // (reference equality, -1 when absent).\n private indexOfRow(row: any): number {\n this.ensureRowIndex();\n const idx = this.rowIndexMap.get(row);\n return idx === undefined ? -1 : idx;\n }\n\n // A4: the filtered snapshot must be dropped on every mutation of the model it\n // is derived from. Enumerated invalidation sites:\n // 1. data replacement — rebuildRowIndex() (setData, remote load,\n // sortLocalData) + the ensureRowIndex() ref-check\n // for a direct `table.data = [...]` assignment.\n // 2. in-place row change — cell-edit-commit / row-edit-commit handlers\n // (see @ready initialize()).\n // 3. filter model change — invalidateFilteredCache() below, called from\n // applyClientFilters(); every setQuickFilter /\n // setColumnFilter / setHeaderFilter / setFilterModel\n // / clearAllFilters / removeColumnFilter and the\n // header-filter INPUT path route through it.\n // 4. sort — sortLocalData() replaces this.data (case 1).\n private invalidateFilteredCache() {\n this.filteredCache = null;\n // F: the flattened group list is derived from the filtered snapshot, so any\n // change that drops one drops the other (data/filter/sort/edit).\n this.groupingCache = null;\n }\n\n // F: drop only the flattened group list — expand/collapse and groupBy changes\n // reshape it without touching the filtered snapshot.\n private invalidateGroupingCache() {\n this.groupingCache = null;\n }\n\n // F: the flattened { group | row | aggregate } display list for the current\n // filtered data, cached like filteredCache. setColumns keeps the aggregator\n // set in sync with the live columns before each rebuild.\n private getGroupingItems(): DisplayItem[] {\n if (this.grouping.setColumns(this.columns)) this.invalidateGroupingCache();\n if (this.groupingCache) return this.groupingCache;\n this.groupingCache = this.grouping.processData(this.getFilteredData());\n return this.groupingCache;\n }\n\n /**\n * Row grouping owns the hierarchy whenever groupBy is non-empty. With no\n * groupBy, aggregation normally uses the same flattened row+footer model,\n * except when tree data is active: tree hierarchy stays intact and the table\n * total is appended to that tree model instead.\n */\n private usesGroupingDisplayModel(): boolean {\n return this.grouping.hasGrouping()\n || (this.grouping.hasAggregation() && !this.treeData.isEnabled());\n }\n\n /**\n * Group display items on the active client-side page. This single helper is\n * shared by normal rendering, virtualization, keyboard navigation, and ARIA\n * so combining those features cannot produce four different row models.\n */\n private getDisplayedGroupingItems(): DisplayItem[] {\n const items = this.getGroupingItems();\n if (!this.pagination || this.paginationMode !== 'client') return items;\n\n const totalPages = Math.max(1, Math.ceil(items.length / this.pageSize));\n const page = Math.max(1, Math.min(this.currentPage, totalPages));\n this.clampCurrentPage(page);\n const start = (page - 1) * this.pageSize;\n return items.slice(start, start + this.pageSize);\n }\n\n /** Tree rows plus an optional table-total footer, optionally page-sliced. */\n private getTreeDisplayRows(paginate: boolean): Array<{\n data: any;\n index: number;\n treeRow?: TreeRow;\n groupItem?: AggregateRow;\n }> {\n const rows: Array<{ data: any; index: number; treeRow?: TreeRow; groupItem?: AggregateRow }> =\n this.treeData.processData(this.getFilteredData()).map((treeRow) => ({\n data: treeRow.data,\n index: this.indexOfRow(treeRow.data),\n treeRow,\n }));\n\n if (this.grouping.hasAggregation()) {\n const total = this.getGroupingItems().find(\n (item): item is AggregateRow => item.type === 'aggregate' && item.scope === 'table'\n );\n if (total) rows.push({ data: undefined, index: -1, groupItem: total });\n }\n\n if (!paginate || !this.pagination || this.paginationMode !== 'client') return rows;\n const totalPages = Math.max(1, Math.ceil(rows.length / this.pageSize));\n const page = Math.max(1, Math.min(this.currentPage, totalPages));\n this.clampCurrentPage(page);\n const start = (page - 1) * this.pageSize;\n return rows.slice(start, start + this.pageSize);\n }\n\n private applyClientFilters() {\n this.invalidateFilteredCache();\n this.dispatchFilterChange();\n if (this.mode === 'remote') {\n // Server-side: send filter params to controller\n this.debouncedDataRequest();\n } else {\n // Client-side: re-render with filtered data\n this.renderBody();\n }\n }\n\n // A3: 150 ms window (matches the remote debounce constant) so a burst of\n // keystrokes into a live filter INPUT collapses into a single re-filter +\n // re-render. Only the INPUT event paths (header-filter inputs) route through\n // here; programmatic API (setQuickFilter/setColumnFilter/...) stays\n // synchronous so callers and tests keep deterministic behavior.\n private static readonly FILTER_INPUT_DEBOUNCE_MS = 150;\n private filterInputDebounceTimeout: any = null;\n\n private debouncedApplyClientFilters() {\n if (this.filterInputDebounceTimeout) clearTimeout(this.filterInputDebounceTimeout);\n this.filterInputDebounceTimeout = setTimeout(() => {\n this.filterInputDebounceTimeout = null;\n this.applyClientFilters();\n }, SniceTable.FILTER_INPUT_DEBOUNCE_MS);\n }\n\n // ── Column API ──\n\n setColumnVisible(key: string, visible: boolean) {\n this.columnManager.setColumnVisible(key, visible);\n this.renderHeader();\n this.renderBody();\n this.dispatchColumnVisibilityChange(key, visible);\n }\n\n showAllColumns() {\n this.columnManager.showAllColumns();\n this.renderHeader();\n this.renderBody();\n }\n\n hideAllColumns() {\n this.columnManager.hideAllColumns();\n this.renderHeader();\n this.renderBody();\n }\n\n getColumnVisibility() {\n return this.columnManager.getVisibilityModel();\n }\n\n pinColumn(key: string, side: 'left' | 'right') {\n this.columnManager.pinColumn(key, side);\n this.renderHeader();\n this.renderBody();\n this.dispatchColumnPinChange(key, side);\n }\n\n unpinColumn(key: string) {\n this.columnManager.unpinColumn(key);\n this.renderHeader();\n this.renderBody();\n this.dispatchColumnPinChange(key, false);\n }\n\n // A measured width is the column's width, not the header's: the body has to\n // be repainted with it too, or the th and its tds carry different numbers\n // and the next body-only re-render paints the stale one.\n autoSizeColumn(key: string) {\n if (this.tbody) {\n this.columnManager.autoSizeColumn(key, this.tbody);\n this.renderHeader();\n this.renderBody();\n }\n }\n\n autoSizeAllColumns() {\n if (this.tbody) {\n this.columnManager.autoSizeAll(this.tbody);\n this.renderHeader();\n this.renderBody();\n }\n }\n\n moveColumn(key: string, toIndex: number) {\n this.columnManager.moveColumn(key, toIndex);\n this.renderHeader();\n this.renderBody();\n this.dispatchColumnOrderChange(key, toIndex);\n }\n\n // ── Editing API ──\n\n /**\n * Configure the editor from the current columns. Safe to call repeatedly —\n * columns/data are plain fields that can be assigned after @ready ran with an\n * empty set, so this re-syncs editable columns + pipelines before an edit\n * starts rather than trusting the one-time @ready snapshot.\n */\n private setupEditor() {\n if (!this.editable) return;\n\n this.editor.attach(this);\n this.editor.setEditMode(this.editMode);\n const editableCols = this.columns.filter(c => c.editable !== false).map(c => c.key);\n this.editor.setEditableColumns(editableCols);\n\n // Register value pipelines\n for (const col of this.columns) {\n if (col.valueGetter || col.valueFormatter || col.valueParser || col.valueSetter) {\n this.editor.setPipeline(col.key, {\n valueGetter: col.valueGetter,\n valueFormatter: col.valueFormatter,\n valueParser: col.valueParser,\n valueSetter: col.valueSetter,\n });\n }\n }\n }\n\n startEdit(rowIndex: number, columnKey: string) {\n if (!this.editable) return;\n const row = this.data[rowIndex];\n if (!row) return;\n\n // Ensure the editor knows which columns are editable for the current\n // column set (columns may have been assigned after @ready).\n this.setupEditor();\n\n if (this.editMode === 'row') {\n this.editor.startRowEdit(rowIndex, row);\n } else {\n const column = this.columns.find(c => c.key === columnKey);\n const value = row[columnKey];\n this.editor.startCellEdit(rowIndex, columnKey, value, row, column?.editorType ?? column?.type);\n }\n // Re-render the affected row to show the editor, then focus it.\n this.renderBody();\n this.focusActiveEditor();\n }\n\n /** Focus the first rendered editor input (called after renderBody). */\n private focusActiveEditor() {\n const el = this.tbody?.querySelector(\n '.table-editor-input, .table-editor-checkbox, .table-editor-select'\n ) as HTMLElement | null;\n if (!el) return;\n\n el.focus();\n if (el instanceof HTMLInputElement && (el.type === 'text' || el.type === 'number')) {\n try { el.select(); } catch { /* happy-dom may not implement select */ }\n }\n }\n\n async commitEdit(): Promise<string | null> {\n if (this.editMode === 'row') {\n const errors = await this.editor.commitRowEdit();\n this.renderBody();\n return errors ? 'Validation errors' : null;\n } else {\n const error = await this.editor.commitCellEdit();\n this.renderBody();\n return error;\n }\n }\n\n cancelEdit() {\n if (this.editMode === 'row') {\n this.editor.cancelRowEdit();\n } else {\n this.editor.cancelCellEdit();\n }\n this.renderBody();\n }\n\n // ── Export API ──\n\n exportCSV(options?: any) {\n const data = this.getFilteredData();\n const selectedData = options?.selectedOnly\n ? this.getSelectedRowsIn(data)\n : data;\n this.exporter.exportCSV(selectedData, this.columns, options);\n }\n\n printTable(options?: any) {\n this.exporter.print(this, options);\n }\n\n async copyToClipboard(options?: any): Promise<boolean> {\n const filtered = this.getFilteredData();\n const rows = this.selectedRows.length > 0 ? this.getSelectedRowsIn(filtered) : filtered;\n return this.exporter.copyToClipboard(rows, this.columns, options);\n }\n\n /** Resolve raw selection indices against the source data first, then retain\n * only rows present in the current filtered view. Filtered positions are not\n * interchangeable with raw indices. */\n private getSelectedRowsIn(view: any[]): any[] {\n const selected = new Set(this.getSelectedData());\n return view.filter((row) => selected.has(row));\n }\n\n // ── Selection helpers ──\n\n private hasSelectionColumn(): boolean {\n return this.selectable && this.selectionMode !== 'none';\n }\n\n private getSlottedSelectionRows(): any[] {\n if (this.shouldModelSlottedRows()) return [];\n return Array.from(this.querySelectorAll('snice-row[slot=\"rows\"]')) as any[];\n }\n\n private getSelectionSourceRows(): any[] {\n const slotted = this.getSlottedSelectionRows();\n return slotted.length > 0 ? slotted.map((row) => row.data) : this.data;\n }\n\n /** Keep light-DOM rows aligned with the table's live selection mode and\n * conditional selectability, including property changes after connection. */\n private syncSlottedSelectionState() {\n const rows = this.getSlottedSelectionRows();\n if (rows.length === 0) return;\n\n const showSelectors = this.hasSelectionColumn();\n let keptSingleSelection = false;\n rows.forEach((row, index) => {\n const disabled = !!(showSelectors && this.selectabilityCheck\n && !this.selectabilityCheck(row.data, index));\n row.index = index;\n row.selectable = showSelectors;\n row.selectionDisabled = disabled;\n\n if (!showSelectors || disabled) {\n row.selected = false;\n } else if (this.selectionMode === 'single' && row.selected) {\n if (keptSingleSelection) row.selected = false;\n else keptSingleSelection = true;\n }\n });\n\n this.selectedRows = rows\n .map((row, index) => row.selected && !row.selectionDisabled ? index : -1)\n .filter((index) => index >= 0);\n }\n\n private handleSlottedRowSelect = (event: CustomEvent) => {\n const row = event.detail?.element as any;\n const rows = this.getSlottedSelectionRows();\n const index = rows.indexOf(row);\n if (index < 0) return;\n\n const blocked = !this.hasSelectionColumn()\n || !!(this.selectabilityCheck && !this.selectabilityCheck(row.data, index));\n if (blocked) {\n row.selected = false;\n this.syncSlottedSelectionState();\n return;\n }\n\n if (this.selectionMode === 'single' && row.selected) {\n rows.forEach((candidate, candidateIndex) => {\n if (candidateIndex !== index) candidate.selected = false;\n });\n }\n this.selectedRows = rows\n .map((candidate, candidateIndex) => candidate.selected ? candidateIndex : -1)\n .filter((candidateIndex) => candidateIndex >= 0);\n this.selectionAnchor = row.data;\n this.dispatchRowSelectionChanged(index, row.selected);\n this.dispatchSelectionChanged();\n };\n\n private getSelectableIndices(rows: any[]): number[] {\n const indices: number[] = [];\n for (const row of rows) {\n const index = this.indexOfRow(row);\n if (index < 0) continue;\n if (this.selectabilityCheck && !this.selectabilityCheck(row, index)) continue;\n indices.push(index);\n }\n return indices;\n }\n\n /**\n * E1: the single entry point for a pointer/keyboard interaction on one row.\n * Resolves selectionMode + modifier intent (`additive` = ctrl/meta,\n * `range` = shift), mutates `selectedRows` (delta DOM via the @watch), moves\n * the object-valued anchor for non-range interactions, and emits the legacy\n * row-selection event plus the unified `selection-changed` event.\n */\n private applyRowSelection(rowIndex: number, opts: { additive: boolean; range: boolean }) {\n if (this.selectionMode === 'none') return;\n // Conditional selectability gate (shared with the keyboard path).\n if (this.selectabilityCheck && !this.selectabilityCheck(this.data[rowIndex], rowIndex)) return;\n\n const row = this.data[rowIndex];\n\n // Single mode: always collapse to exactly the interacted row.\n if (this.selectionMode === 'single') {\n this.selectedRows = [rowIndex];\n this.selectionAnchor = row;\n this.dispatchRowSelectionChanged(rowIndex, true);\n this.dispatchSelectionChanged();\n return;\n }\n\n // Multiple mode. Shift extends the contiguous range from the anchor object.\n if (opts.range && this.selectionAnchor != null) {\n this.selectRange(this.selectionAnchor, row); // anchor stays put\n this.dispatchRowSelectionChanged(rowIndex, this.selectedRows.includes(rowIndex));\n this.dispatchSelectionChanged();\n return;\n }\n\n // Plain or additive (ctrl/meta) click → toggle this row (historical path).\n const isSelected = this.selectedRows.includes(rowIndex);\n this.selectedRows = isSelected\n ? this.selectedRows.filter(i => i !== rowIndex)\n : [...this.selectedRows, rowIndex];\n this.selectionAnchor = row;\n\n // DOM update happens in the selectedRows @watch (delta, one row).\n this.dispatchRowSelectionChanged(rowIndex, !isSelected);\n this.dispatchSelectionChanged();\n }\n\n /**\n * E1: replace the selection with the contiguous range between the anchor and\n * target ROW OBJECTS, resolved against the current filtered snapshot (display\n * order). Object-valued endpoints mean the range follows the rows across a\n * sort — `getFilteredData()` reflects the reordered `this.data`, and each\n * position maps back to a data index via `indexOfRow` (rowIndexMap).\n */\n private selectRange(anchorRow: any, targetRow: any) {\n const view = this.getFilteredData();\n let posA = view.indexOf(anchorRow);\n const posT = view.indexOf(targetRow);\n if (posT === -1) return;\n if (posA === -1) posA = posT;\n\n const lo = Math.min(posA, posT);\n const hi = Math.max(posA, posT);\n const indices: number[] = [];\n for (let p = lo; p <= hi; p++) {\n const idx = this.indexOfRow(view[p]);\n if (idx < 0) continue;\n if (this.selectabilityCheck && !this.selectabilityCheck(view[p], idx)) continue;\n indices.push(idx);\n }\n this.selectedRows = indices;\n }\n\n private toggleRowSelection(rowIndex: number) {\n // Keyboard Space/Shift+Space toggle — additive intent, no range.\n this.applyRowSelection(rowIndex, { additive: true, range: false });\n }\n\n private selectAllRows() {\n // Select-all only carries meaning in multiple mode.\n if (this.selectionMode !== 'multiple') return;\n\n const filteredIndices = this.getSelectableIndices(this.getFilteredData());\n const allFilteredSelected = filteredIndices.every(i => this.selectedRows.includes(i));\n\n if (allFilteredSelected) {\n this.selectedRows = this.selectedRows.filter(i => !filteredIndices.includes(i));\n } else {\n const combined = new Set([...this.selectedRows, ...filteredIndices]);\n this.selectedRows = Array.from(combined);\n }\n // Row DOM + header checkbox update in the selectedRows @watch.\n this.dispatchSelectAllChanged(allFilteredSelected);\n this.dispatchSelectionChanged();\n }\n\n // ── Master-Detail API ──\n\n setDetailPanel(options: DetailPanelOptions) {\n this.masterDetail.attach(this, options);\n this.masterDetail.onHeightChange = () => {\n if (!this.virtualize || !this.virtualizer.isEnabled()) return;\n this.syncVirtualRows();\n };\n this.masterDetail.prepare(this.data);\n this.renderHeader();\n this.renderBody();\n }\n\n expandRow(index: number) {\n this.masterDetail.expand(index);\n this.renderBody();\n }\n\n collapseRow(index: number) {\n this.masterDetail.collapse(index);\n this.renderBody();\n }\n\n toggleRowExpansion(index: number) {\n this.masterDetail.toggle(index);\n this.renderBody();\n }\n\n expandAllRows() {\n this.masterDetail.expandAll(this.data.length);\n this.renderBody();\n }\n\n collapseAllRows() {\n this.masterDetail.collapseAll();\n this.renderBody();\n }\n\n // ── Toolbar API ──\n\n setToolbar(options: ToolbarOptions) {\n this.toolbarOptions = options;\n const container = this.shadowRoot?.querySelector('.table-controls-container') as HTMLElement;\n if (!container) return;\n\n this.toolbar.attach(this, container, options);\n // Share the table's filter engine with the toolbar so reads (panel rendering)\n // and writes (apply/clear) operate on the same model.\n this.toolbar.setFilterEngine(this.filterEngine);\n this.toolbar.onSearch = (query) => this.setQuickFilter(query);\n this.toolbar.onSortColumn = (key, dir) => {\n this.currentSort = [{ column: key, direction: dir }];\n this.dispatchSortChange();\n this.renderHeader();\n if (this.mode === 'remote') this.debouncedDataRequest();\n else this.sortLocalData();\n };\n this.toolbar.onSetSortModel = (sortModel) => {\n this.currentSort = sortModel;\n this.dispatchSortChange();\n this.renderHeader();\n if (this.mode === 'remote') this.debouncedDataRequest();\n else this.sortLocalData();\n };\n this.toolbar.onFilterColumn = (key, operator, value) => {\n this.setColumnFilter(key, operator, value);\n };\n this.toolbar.onRemoveFilter = (key) => {\n this.removeColumnFilter(key);\n };\n this.toolbar.onSetFilterModel = (filters, logic) => {\n this.filterEngine.clearAllFilters();\n this.filterEngine.setFilterLogic(logic);\n for (const f of filters) {\n this.filterEngine.setColumnFilter(f.column, f.operator, f.value);\n }\n this.applyClientFilters();\n };\n this.toolbar.onClearFilters = () => {\n this.clearAllFilters();\n };\n this.toolbar.onExportCSV = () => this.exportCSV();\n this.toolbar.onFullscreen = () => this.toggleFullscreen();\n }\n\n // ── Tree Data API ──\n\n setTreeData(options: TreeDataOptions) {\n this.treeData.attach(options);\n this.renderBody();\n }\n\n expandTreeNode(key: string) {\n this.treeData.expand(key);\n this.renderBody();\n }\n\n collapseTreeNode(key: string) {\n this.treeData.collapse(key);\n this.renderBody();\n }\n\n toggleTreeNode(key: string) {\n this.treeData.toggle(key);\n this.renderBody();\n }\n\n expandAllTreeNodes() {\n this.treeData.expandAll(this.data);\n this.renderBody();\n }\n\n collapseAllTreeNodes() {\n this.treeData.collapseAll();\n this.renderBody();\n }\n\n // ── Column Groups API ──\n\n setColumnGroups(groups: ColumnGroup[]) {\n this.columnManager.setColumnGroups(groups);\n this.renderHeader();\n }\n\n // ── Column Menu API ──\n\n private initColumnMenu() {\n if (!this.columnMenu) return;\n this.columnMenuManager.attach(this);\n this.columnMenuManager.onSortAsc = (col) => {\n this.currentSort = [{ column: col, direction: 'asc' }];\n this.dispatchSortChange();\n this.renderHeader();\n if (this.mode === 'remote') this.debouncedDataRequest();\n else this.sortLocalData();\n };\n this.columnMenuManager.onSortDesc = (col) => {\n this.currentSort = [{ column: col, direction: 'desc' }];\n this.dispatchSortChange();\n this.renderHeader();\n if (this.mode === 'remote') this.debouncedDataRequest();\n else this.sortLocalData();\n };\n this.columnMenuManager.onFilter = (col) => {\n // Open filter modal pre-populated with this column\n this.toolbar.openFilterModal(col);\n };\n this.columnMenuManager.onHide = (col) => this.setColumnVisible(col, false);\n this.columnMenuManager.onPinLeft = (col) => this.pinColumn(col, 'left');\n this.columnMenuManager.onPinRight = (col) => this.pinColumn(col, 'right');\n this.columnMenuManager.onUnpin = (col) => this.unpinColumn(col);\n this.columnMenuManager.onAutoSize = (col) => this.autoSizeColumn(col);\n }\n\n // ── Row Pinning API ──\n\n pinRowTop(row: any) {\n this.pinnedTopRows.push(row);\n this.renderBody();\n }\n\n pinRowBottom(row: any) {\n this.pinnedBottomRows.push(row);\n this.renderBody();\n }\n\n unpinRow(row: any) {\n this.pinnedTopRows = this.pinnedTopRows.filter(r => r !== row);\n this.pinnedBottomRows = this.pinnedBottomRows.filter(r => r !== row);\n this.renderBody();\n }\n\n clearPinnedRows() {\n this.pinnedTopRows = [];\n this.pinnedBottomRows = [];\n this.renderBody();\n }\n\n // ── Row Height API ──\n\n setRowHeight(height: number) {\n this.rowHeight = height;\n this.renderBody();\n }\n\n setRowHeightCallback(fn: (row: any, index: number) => number) {\n this.rowHeightCallback = fn;\n this.renderBody();\n }\n\n // ── Sort Enhancements ──\n\n setSortComparator(columnKey: string, comparator: (a: any, b: any, direction: 'asc' | 'desc') => number) {\n const col = this.columns.find(c => c.key === columnKey);\n if (col) (col as any).sortComparator = comparator;\n }\n\n // ── Selection Enhancements ──\n\n private selectabilityCheck: ((row: any, index: number) => boolean) | null = null;\n\n setSelectabilityCheck(fn: (row: any, index: number) => boolean) {\n this.selectabilityCheck = fn;\n const sourceRows = this.getSelectionSourceRows();\n this.selectedRows = this.selectedRows.filter((index) => {\n const row = sourceRows[index];\n return !!row && fn(row, index);\n });\n this.syncSlottedSelectionState();\n this.scheduleRender('both');\n }\n\n // E2: register a per-cell editability predicate. Wraps the editor's check —\n // gates whether a given (row, columnKey) may enter edit mode, on top of the\n // column's `editable` flag. Stored on the editor instance, so it survives the\n // setupEditor() re-sync that startEdit() performs.\n setCellEditableCheck(fn: (row: any, column: string) => boolean) {\n this.editor.setEditabilityCheck(fn);\n }\n\n getSelectedData(): any[] {\n const rows = this.getSelectionSourceRows();\n return this.selectedRows.map(i => rows[i]).filter(Boolean);\n }\n\n // ── Lazy Loading ──\n\n private setupLazyLoading() {\n if (!this.lazyLoad) return;\n\n const scrollContainer = this.getScrollContainer();\n if (!scrollContainer) return;\n\n if (this.lazyLoadHandler) {\n this.lazyLoadContainer?.removeEventListener('scroll', this.lazyLoadHandler);\n }\n\n this.lazyLoadHandler = () => {\n const { scrollTop, scrollHeight, clientHeight } = scrollContainer;\n if (scrollHeight - scrollTop - clientHeight < this.lazyLoadThreshold) {\n this.dispatchEvent(new CustomEvent('lazy-load', {\n detail: { currentCount: this.data.length },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n scrollContainer.addEventListener('scroll', this.lazyLoadHandler, { passive: true });\n this.lazyLoadContainer = scrollContainer;\n }\n\n // ── Scrolling API ──\n\n scrollToColumn(columnKey: string) {\n const th = this.shadowRoot?.querySelector(`th[data-key=\"${columnKey}\"]`) as HTMLElement;\n th?.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n }\n\n // ── List View ──\n\n /**\n * Declarative list-mode row renderer — bind via `.listRenderer=${fn}`.\n * Returning an HTMLElement appends it; anything else becomes text.\n */\n @property({ attribute: false })\n listRenderer: ListViewRenderer | null = null;\n\n @watch('listRenderer', { immediate: false })\n handleListRendererChange() {\n if (!this.list) return;\n // The row recycler cannot infer that a callback identity changed from\n // row data alone. Force fresh rows so list markup replaces table cells.\n this.renderedRows = new Map();\n // Installing a renderer removes the column geometry the header describes;\n // clearing it back to null restores columnar rows AND their header.\n this.renderHeader();\n this.renderBody();\n }\n\n setListViewRenderer(fn: ListViewRenderer) {\n this.listRenderer = fn;\n }\n\n // ── Row creation helper (used by both regular and virtualized rendering) ──\n\n private createRow(rowData: any, index: number, treeRow?: TreeRow): HTMLTableRowElement {\n const tr = document.createElement('tr');\n tr.setAttribute('data-index', String(index));\n tr.setAttribute('part', 'row');\n\n // Row height\n if (this.rowHeightCallback) {\n tr.style.height = `${this.rowHeightCallback(rowData, index)}px`;\n } else if (this.rowHeight !== 48) {\n tr.style.height = `${this.rowHeight}px`;\n }\n\n const isSelected = this.selectedRows.includes(index);\n this.stampRowSelection(tr, isSelected);\n\n // Row DnD handle\n if (this.rowReorder && this.rowDnD.isEnabled()) {\n tr.appendChild(this.rowDnD.createDragHandle());\n this.rowDnD.makeRowDraggable(tr, index);\n }\n\n // Master-detail expand/collapse toggle\n if (this.masterDetail.isEnabled()) {\n const toggleCell = document.createElement('td');\n toggleCell.className = 'detail-toggle-cell';\n toggleCell.appendChild(this.masterDetail.createToggleButton(index));\n tr.appendChild(toggleCell);\n }\n\n if (this.hasSelectionColumn()) {\n const selectCell = document.createElement('td');\n selectCell.className = 'select-column';\n const disabled = !!(this.selectabilityCheck && !this.selectabilityCheck(rowData, index));\n selectCell.innerHTML = `<snice-checkbox class=\"row-select\" size=\"small\" compact ${isSelected ? 'checked' : ''} ${disabled ? 'disabled' : ''} data-row-index=\"${index}\"></snice-checkbox>`;\n const checkbox = selectCell.querySelector('snice-checkbox') as any;\n checkbox.disabled = disabled;\n tr.appendChild(selectCell);\n }\n\n const columnsToRender = this.getVisibleColumnDefinitions();\n\n if (this.list && this.listRenderer) {\n const td = document.createElement('td');\n td.className = 'list-view-cell';\n td.colSpan = Math.max(1, columnsToRender.length);\n const rendered = this.listRenderer(rowData, index);\n if (rendered instanceof HTMLElement) td.appendChild(rendered);\n else td.textContent = rendered == null ? '' : String(rendered);\n tr.appendChild(td);\n return tr;\n }\n\n let skipColumns = 0;\n columnsToRender.forEach((column, colIdx) => {\n // Column spanning: skip cells consumed by a previous span\n if (skipColumns > 0) {\n skipColumns--;\n return;\n }\n\n const td = document.createElement('td');\n td.setAttribute('data-key', column.key);\n td.setAttribute('part', 'cell');\n const rawValue = rowData[column.key];\n // Display path must run the same valueGetter the sort/grouping/editor\n // paths already apply.\n const value = column.valueGetter ? column.valueGetter(rawValue, rowData) : rawValue;\n\n this.applyCellPresentation(td, column, value, rowData);\n\n // Column span\n const colSpanDef = (column as any).colSpan;\n if (colSpanDef) {\n const span = typeof colSpanDef === 'function' ? colSpanDef(value, rowData) : colSpanDef;\n if (span > 1) {\n td.colSpan = span;\n skipColumns = span - 1;\n }\n }\n\n // Cell/row edit: when this cell is being edited, render its editor\n // element instead of the display cell.\n const editorEl = this.maybeCreateCellEditor(column, rowData, value, index);\n if (editorEl) {\n td.classList.add('editing');\n td.appendChild(editorEl);\n } else if (treeRow && column.key === this.treeData.getGroupColumn()) {\n // Tree data: add indent + toggle on the group column\n const toggle = this.treeData.createToggle(treeRow);\n td.appendChild(toggle);\n const textSpan = document.createElement('span');\n textSpan.className = 'tree-label';\n // The group cell keeps its plain label next to the indent/chevron, but\n // it is still a cell: renderCell owns it outright, and otherwise the\n // documented display pipeline (formatter, then valueFormatter) decides\n // the text. Only a column with neither shows the raw working value.\n if (typeof column.renderCell === 'function') {\n textSpan.appendChild(this.createCellElement(column, value, rowData));\n } else {\n textSpan.textContent = this.cellDisplayText(column, value, rowData)\n ?? (value == null ? '' : String(value));\n }\n // Clicking the text label also toggles expand/collapse\n if (treeRow.hasChildren) {\n textSpan.style.cursor = 'pointer';\n textSpan.addEventListener('click', (e) => {\n e.stopPropagation();\n this.treeData.toggle(treeRow.key);\n this.renderBody();\n });\n }\n td.appendChild(textSpan);\n } else {\n td.appendChild(this.createCellElement(column, value, rowData));\n }\n\n // Apply column width\n const state = this.columnManager.getState(column.key);\n if (state) {\n td.style.width = `${state.width}px`;\n this.applyPinnedCell(td, column.key, state, '1');\n }\n\n tr.appendChild(td);\n });\n\n return tr;\n }\n\n private applyCellPresentation(td: HTMLTableCellElement, column: ColumnDefinition, value: any, row: any) {\n const applyStyle = (style?: ColumnDefinition['style']) => {\n if (!style) return;\n if (style.backgroundColor) td.style.backgroundColor = style.backgroundColor;\n if (style.color) td.style.color = style.color;\n if (style.fontWeight) td.style.fontWeight = style.fontWeight;\n if (style.fontStyle) td.style.fontStyle = style.fontStyle;\n if (style.fontSize) td.style.fontSize = style.fontSize;\n if (style.textDecoration) td.style.textDecoration = style.textDecoration;\n };\n\n applyStyle(column.style);\n for (const rule of column.conditionalFormats || []) {\n if (!rule.condition(value, row)) continue;\n applyStyle(rule.style);\n if (rule.className) td.classList.add(rule.className);\n break;\n }\n\n if (column.tooltip) {\n td.title = typeof column.tooltip === 'function'\n ? column.tooltip(value, row)\n : (value == null ? '' : String(value));\n }\n }\n\n // ── F: group + aggregate row construction ──\n\n /**\n * A group-header row: a single full-width cell holding an optional group\n * checkbox (selectable), the expand/collapse chevron (reusing the tree-toggle\n * affordance), the group value, and a leaf-count badge. The table's delegated\n * click handler toggles the whole cell (except the checkbox) and emits one\n * host-level `group-toggle` event.\n */\n private createGroupRow(group: GroupRow, totalColSpan: number): HTMLTableRowElement {\n const tr = document.createElement('tr');\n tr.className = 'group-header-row';\n tr.setAttribute('data-group-key', group.key);\n tr.setAttribute('data-depth', String(group.depth));\n tr.setAttribute('aria-label', `${group.value == null || group.value === '' ? 'Blank' : String(group.value)} group, ${group.count} rows`);\n\n const td = document.createElement('td');\n td.colSpan = totalColSpan;\n td.className = 'group-header-cell';\n\n // Group selection checkbox (multiple mode only — select-all semantics).\n if (this.selectable && this.selectionMode === 'multiple') {\n const state = this.groupSelectionState(group);\n const wrap = document.createElement('span');\n wrap.className = 'group-select-wrap';\n const checkbox = document.createElement('snice-checkbox') as any;\n checkbox.className = 'group-select';\n checkbox.setAttribute('size', 'small');\n checkbox.setAttribute('compact', '');\n checkbox.setAttribute('data-group-key', group.key);\n checkbox.setAttribute('aria-label', `Select all rows in ${group.value == null || group.value === '' ? 'blank' : String(group.value)} group`);\n checkbox.checked = state === 'all';\n checkbox.indeterminate = state === 'some';\n checkbox.disabled = this.getSelectableGroupIndices(group).length === 0;\n wrap.appendChild(checkbox);\n td.appendChild(wrap);\n }\n\n // The chevron is passive DOM; the root template's @click handler owns the\n // interaction and host-level group-toggle dispatch.\n const toggle = this.grouping.createToggle(group);\n td.appendChild(toggle);\n\n const label = document.createElement('span');\n label.className = 'group-header-label';\n label.textContent = group.value == null ? '' : String(group.value);\n td.appendChild(label);\n\n const count = document.createElement('span');\n count.className = 'group-header-count';\n count.textContent = String(group.count);\n td.appendChild(count);\n\n tr.appendChild(td);\n return tr;\n }\n\n /**\n * An aggregate footer row: per-column cells carrying the aggregate value for\n * columns that declare one (formatted through the column's normal type /\n * formatter pipeline), empty otherwise. Tool columns get spacer cells so the\n * aggregated values line up under their columns.\n */\n private createAggregateRow(agg: AggregateRow, _totalColSpan: number): HTMLTableRowElement {\n const tr = document.createElement('tr');\n tr.className = 'group-aggregate-row';\n tr.setAttribute('data-agg-scope', agg.scope);\n tr.setAttribute('data-depth', String(agg.depth));\n if (agg.groupKey) tr.setAttribute('data-group-key', agg.groupKey);\n const groupLabel = agg.groupValue == null || agg.groupValue === '' ? 'Blank' : String(agg.groupValue);\n const scopeLabel = agg.scope === 'table'\n ? 'Total'\n : `${agg.groupColumn ? `${agg.groupColumn}: ` : ''}${groupLabel} subtotal`;\n tr.setAttribute('aria-label', scopeLabel);\n\n // Tool-column spacers (match createRow / renderHeader order).\n if (this.rowReorder && this.rowDnD.isEnabled()) {\n const spacer = document.createElement('td');\n spacer.className = 'drag-handle-cell';\n tr.appendChild(spacer);\n }\n if (this.masterDetail.isEnabled()) {\n const spacer = document.createElement('td');\n spacer.className = 'detail-toggle-cell';\n tr.appendChild(spacer);\n }\n if (this.hasSelectionColumn()) {\n const spacer = document.createElement('td');\n spacer.className = 'select-column';\n tr.appendChild(spacer);\n }\n\n const columnsToRender = this.getVisibleColumnDefinitions();\n\n const labelColumn = columnsToRender.find(\n (column) => !Object.prototype.hasOwnProperty.call(agg.aggregates, column.key)\n );\n // If every visible column aggregates, keep the scope/group label in the\n // first aggregate cell instead of silently omitting it.\n const inlineLabelKey = labelColumn ? null : columnsToRender[0]?.key;\n let labelled = false;\n columnsToRender.forEach((column) => {\n const td = document.createElement('td');\n td.setAttribute('data-key', column.key);\n td.className = 'aggregate-cell';\n\n const hasAgg = Object.prototype.hasOwnProperty.call(agg.aggregates, column.key);\n if ((!hasAgg && !labelled) || (hasAgg && column.key === inlineLabelKey)) {\n labelled = true;\n const label = document.createElement('span');\n label.className = `aggregate-label${hasAgg ? ' aggregate-label--inline' : ''}`;\n label.textContent = scopeLabel;\n if (agg.scope === 'group' && agg.depth > 0) {\n label.style.paddingLeft = `${agg.depth * 1.5}rem`;\n }\n td.appendChild(label);\n }\n\n if (hasAgg) {\n const value = agg.aggregates[column.key];\n td.setAttribute('data-agg-value', String(value));\n // Format through the type/formatter pipeline, but never a custom\n // renderCell (it's a per-row renderer; aggregates have no row).\n const aggCol = (column.renderCell || (!column.formatter && column.valueFormatter))\n ? {\n ...column,\n renderCell: undefined,\n // valueFormatter is the newer pipeline spelling; cell elements\n // consume the established `formatter` field. Adapt it only for\n // the already-computed aggregate value (valueGetter ran before\n // reduction and must not run a second time here).\n formatter: column.formatter ?? column.valueFormatter,\n }\n : column;\n td.appendChild(this.createCellElement(aggCol, value));\n }\n\n // Keep pinned columns aligned under their headers.\n const state = this.columnManager.getState(column.key);\n if (state) {\n td.style.width = `${state.width}px`;\n this.applyPinnedCell(td, column.key, state, '1');\n }\n\n tr.appendChild(td);\n });\n\n return tr;\n }\n\n /** F: whether all / some / none of a group's rows are selected. */\n private groupSelectionState(group: GroupRow): 'all' | 'some' | 'none' {\n const indices = this.getSelectableGroupIndices(group);\n if (indices.length === 0) return 'none';\n const selected = indices.filter((i) => this.selectedRows.includes(i)).length;\n if (selected === 0) return 'none';\n if (selected === indices.length) return 'all';\n return 'some';\n }\n\n /** Raw indices in a group that the table's conditional selectability allows. */\n private getSelectableGroupIndices(group: GroupRow): number[] {\n const indices: number[] = [];\n for (const row of group.rows) {\n const index = this.indexOfRow(row);\n if (index < 0) continue;\n if (this.selectabilityCheck && !this.selectabilityCheck(row, index)) continue;\n indices.push(index);\n }\n return indices;\n }\n\n /** F: toggle a group's expansion, dispatch `group-toggle`, and re-render. */\n private toggleGroup(group: GroupRow) {\n this.grouping.toggle(group.key);\n this.invalidateGroupingCache();\n this.dispatchGroupToggle(group.key, group.value, this.grouping.isExpanded(group.key));\n this.renderBody();\n }\n\n // F: reflect selection state onto the rendered group-header checkboxes.\n // Called from the selectedRows @watch delta path (a data-row toggle must\n // update its group header's all/some/none without a full re-render).\n private updateGroupSelectionStates() {\n if (!this.tbody || !this.grouping.hasGrouping() || !this.selectable) return;\n const groups = this.getGroupingItems().filter((it): it is GroupRow => it.type === 'group');\n if (groups.length === 0) return;\n const byKey = new Map(groups.map((g) => [g.key, g]));\n const headers = this.tbody.querySelectorAll('tr.group-header-row');\n headers.forEach((header) => {\n const key = header.getAttribute('data-group-key');\n const group = key ? byKey.get(key) : undefined;\n if (!group) return;\n const checkbox = header.querySelector('snice-checkbox.group-select') as any;\n if (!checkbox) return;\n const state = this.groupSelectionState(group);\n checkbox.checked = state === 'all';\n checkbox.indeterminate = state === 'some';\n });\n }\n\n @dispatch('group-toggle', { bubbles: true, composed: true })\n private dispatchGroupToggle(key: string, value: any, expanded: boolean) {\n return { key, value, expanded };\n }\n\n // ── Editor rendering ──\n\n /**\n * If the given cell is currently being edited (cell mode → this exact cell;\n * row mode → any editable cell in the edited row), build and wire its editor\n * element. Returns null when the cell is not in an edit state.\n */\n private maybeCreateCellEditor(column: any, rowData: any, value: any, index: number): HTMLElement | null {\n if (!this.editable) return null;\n\n let editing = false;\n let editValue = value;\n let editorType: EditorType;\n\n if (this.editMode === 'row') {\n const rowState = this.editor.getRowEditState();\n if (rowState?.isEditing && rowState.rowIndex === index\n && this.editor.isCellEditable(rowData, column.key)) {\n editing = true;\n editValue = rowState.editedRow[column.key];\n }\n editorType = this.resolveEditorType(column);\n } else {\n const cellState = this.editor.getCellEditState();\n if (cellState?.isEditing && cellState.rowIndex === index\n && cellState.columnKey === column.key) {\n editing = true;\n editValue = cellState.currentValue;\n }\n editorType = cellState?.editorType ?? this.resolveEditorType(column);\n }\n\n if (!editing) return null;\n\n // E2: a custom renderEditor bypasses the built-in editor. commit(v) writes\n // the value through the same pipeline the default editor uses, then commits;\n // cancel() aborts. No default wiring is attached — the renderer owns its UI.\n if (typeof column.renderEditor === 'function') {\n const commit = (v: any) => {\n if (this.editMode === 'row') this.editor.updateRowField(column.key, v);\n else this.editor.updateCellValue(v);\n this.commitEdit();\n };\n const cancel = () => this.cancelEdit();\n return column.renderEditor(editValue, rowData, column, commit, cancel);\n }\n\n const options = column.selectOptions ? { selectOptions: column.selectOptions } : undefined;\n const editorEl = this.editor.createEditor(editorType, editValue, options);\n this.wireEditorElement(editorEl, column);\n return editorEl;\n }\n\n /** Resolve the editor kind for a column (explicit override wins, else by type). */\n private resolveEditorType(column: any): EditorType {\n if (column.editorType) return column.editorType;\n return this.editor.getEditorType(column.type || 'text');\n }\n\n /**\n * Attach input/commit/cancel behavior to an editor element. Plain listeners\n * on a module-created element — the established pattern for imperative table\n * DOM (see createRow's checkbox/tree wiring).\n */\n private wireEditorElement(editorEl: HTMLElement, column: any) {\n const isCheckbox = editorEl instanceof HTMLInputElement && editorEl.type === 'checkbox';\n const readValue = () =>\n isCheckbox ? (editorEl as HTMLInputElement).checked : (editorEl as any).value;\n\n const syncValue = () => {\n const v = readValue();\n if (this.editMode === 'row') this.editor.updateRowField(column.key, v);\n else this.editor.updateCellValue(v);\n };\n\n editorEl.addEventListener('input', syncValue);\n editorEl.addEventListener('change', syncValue);\n\n editorEl.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n syncValue();\n this.commitEdit();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n this.cancelEdit();\n }\n });\n\n editorEl.addEventListener('blur', () => {\n // Commit on blur only in cell mode — in row mode, tabbing between the\n // row's editors would otherwise commit the whole row prematurely. Guard\n // on isEditing so re-renders that remove the editor (also firing blur)\n // don't re-trigger a commit.\n if (this.editMode !== 'row' && this.editor.isEditing()) {\n syncValue();\n this.commitEdit();\n }\n });\n }\n\n}\n"],"names":[],"mappings":"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"}