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
@@ -4,6 +4,7 @@ import '../button/snice-button';
4
4
  import '../checkbox/snice-checkbox';
5
5
  import '../modal/snice-modal';
6
6
  import '../empty-state/snice-empty-state';
7
+ import '../progress/snice-progress';
7
8
  import './snice-cell.ts';
8
9
  import './snice-cell-text.ts';
9
10
  import './snice-cell-number.ts';
@@ -33,7 +34,7 @@ import type { DetailPanelOptions } from './table-master-detail';
33
34
  import type { ToolbarOptions } from './table-toolbar';
34
35
  import type { TreeDataOptions } from './table-tree-data';
35
36
  import type { ColumnGroup } from './table-column-manager';
36
- import type { SniceTableElement, SelectionMode, ListViewRenderer } from './snice-table.types';
37
+ import type { ColumnFit, SniceTableElement, SelectionMode, ListViewRenderer } from './snice-table.types';
37
38
  export declare class SniceTable extends HTMLElement implements SniceTableElement {
38
39
  striped: boolean;
39
40
  searchable: boolean;
@@ -84,6 +85,15 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
84
85
  editable: boolean;
85
86
  editMode: 'cell' | 'row';
86
87
  density: 'compact' | 'standard' | 'comfortable';
88
+ /**
89
+ * How the columns relate to the frame's width.
90
+ *
91
+ * `scroll` keeps every column at or above its `minWidth` and lets the frame
92
+ * scroll horizontally when they no longer fit. `squish` makes the frame the
93
+ * hard constraint instead: minimums relax, content ellipsises, and the table
94
+ * never scrolls sideways. See the `ColumnFit` docs in snice-table.types.ts.
95
+ */
96
+ columnFit: ColumnFit;
87
97
  headerFilters: boolean;
88
98
  quickFilter: boolean;
89
99
  rowReorder: boolean;
@@ -122,6 +132,8 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
122
132
  table: HTMLTableElement;
123
133
  thead: HTMLTableSectionElement;
124
134
  tbody: HTMLTableSectionElement;
135
+ /** Frame width the columns were last fitted to — see handleFrameResize. */
136
+ private lastFittedFrameWidth;
125
137
  getTableConfig(): any;
126
138
  getTableData(): any;
127
139
  private unsortedData;
@@ -133,9 +145,22 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
133
145
  private renderedRows;
134
146
  private settingSortedData;
135
147
  private settingDataImperative;
148
+ private reorderingRows;
136
149
  private renderQueued;
137
150
  private pendingHeaderRender;
138
151
  private pendingBodyRender;
152
+ private bodyRenderRetries;
153
+ private bodyRenderRetryQueued;
154
+ /**
155
+ * Requeue a body render whose target had not been committed yet. A frame is
156
+ * the right granularity — the shadow template commits between frames — and
157
+ * the paint is dropped again (silently, as before) once the retries run out.
158
+ *
159
+ * The retry CHAINS: a template that needs more than one frame to commit is
160
+ * the whole reason this exists, so a retry that still finds no <tbody> spends
161
+ * one more of the budget rather than giving the frame back and quitting.
162
+ */
163
+ private rearmBodyRender;
139
164
  private scheduleRender;
140
165
  private debouncedDataRequest;
141
166
  styles(): import("snice").CSSResult;
@@ -157,7 +182,14 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
157
182
  handleColumnsAssignment(): void;
158
183
  handleGroupByChange(): void;
159
184
  private syncGrouping;
160
- handleDataAssignment(): void;
185
+ handleDataAssignment(oldVal?: any[]): void;
186
+ /**
187
+ * Drop the failed-load state: the ⚠️ message row's text and the `table--error`
188
+ * host class always move together, so they are cleared together and from one
189
+ * place. Idempotent, and deliberately does NOT render — every caller is either
190
+ * mid-delivery (the data watcher renders) or already renders itself.
191
+ */
192
+ private clearLoadError;
161
193
  handleDataChange(): void;
162
194
  /**
163
195
  * Refetch affordance: with rows on screen `loading` only dims the tbody, so
@@ -171,6 +203,28 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
171
203
  handleControlsChange(): void;
172
204
  handleControlledSort(): void;
173
205
  handleCurrentPageChange(): void;
206
+ /**
207
+ * Write a page number the display model just derived (a re-clamp after the
208
+ * row set shortened), WITHOUT re-entering the render scheduler.
209
+ *
210
+ * The three clamp sites all sit inside a display-model computation whose
211
+ * caller paints immediately afterwards with the clamped page — the ordinary
212
+ * body path slices with it and then renders the pager, the grouping and tree
213
+ * models return the clamped slice. Letting the @watch fire here queued a
214
+ * second, byte-identical body pass per delivery — the measured cost, and what
215
+ * the regression test pins. Suppressing the write's watcher makes the clamp
216
+ * cost zero extra passes and makes an oscillating clamp structurally unable
217
+ * to loop.
218
+ *
219
+ * All three sites are reachable only under `paginationMode === 'client'`, so
220
+ * the watcher's server branch (debouncedDataRequest, whose `loading = true`
221
+ * re-enters renderBody SYNCHRONOUSLY through the loading watcher — from the
222
+ * middle of a render) is not reachable from a clamp today. It is the reason
223
+ * to keep this guard rather than to drop the watcher suppression if a fourth
224
+ * clamp site ever lands outside that guard.
225
+ */
226
+ private clampingPage;
227
+ private clampCurrentPage;
174
228
  handlePageSizeChange(): void;
175
229
  handleDensityChange(): void;
176
230
  handleListChange(): void;
@@ -184,12 +238,73 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
184
238
  handleColumnReorderChange(): void;
185
239
  handleLazyLoadChange(): void;
186
240
  handleColumnMenuChange(): void;
241
+ /**
242
+ * Switching fit policy re-decides every unsized column's width, so the frame
243
+ * has to be re-fitted from scratch: the cached width would otherwise make the
244
+ * resize observer's "did the frame move?" guard swallow the very next pass.
245
+ */
246
+ handleColumnFitChange(): void;
187
247
  /** Column definitions in their actual painted order. Column state owns
188
248
  * visibility/order; pinned columns are partitioned to their physical edges
189
249
  * so right-pinned cells do not overlap later unpinned columns. */
190
250
  private getVisibleColumnDefinitions;
251
+ /**
252
+ * Cells one full-width row spans: every visible data column plus the tool
253
+ * columns that precede them. Group, aggregate, detail, empty-state, and
254
+ * virtual-spacer rows all measure themselves against this — a row that spans
255
+ * MORE than the table has invents columns, and `table-layout: fixed` then
256
+ * spends the frame's leftover width on the phantoms.
257
+ */
258
+ private getTotalColumnSpan;
259
+ /**
260
+ * Re-fit the columns nobody sized to the frame they are painted in.
261
+ *
262
+ * A column width is a CONTENT width, so the frame's budget has to be reduced
263
+ * by each column's own padding + border and by the fixed tool columns before
264
+ * it can be shared out. Both are read off the live header — the previous
265
+ * render's, on the first pass — rather than guessed, so the fitted table
266
+ * lands on the frame's width instead of a few pixels past it.
267
+ *
268
+ * Widths are written straight onto the header cells: under fixed layout the
269
+ * first row owns the column grid, so no body repaint is needed and this can
270
+ * run inside a resize observer without a render cascade.
271
+ */
272
+ private syncColumnWidthsToFrame;
273
+ /**
274
+ * Sticky geometry plus the visible affordance for a pinned cell.
275
+ *
276
+ * Freezing a column is only communicated if the reader can see where the
277
+ * frozen region ends, so the inner-most pinned column on each side carries
278
+ * the divider (`--edge`); the header additionally carries a pin marker, which
279
+ * is the only cue when the table happens to be wide enough not to scroll.
280
+ */
281
+ private applyPinnedCell;
282
+ /** The pin marker a frozen header carries, so pinning reads at any width. */
283
+ private static pinIndicator;
284
+ /**
285
+ * List mode is only "list mode" once a renderer is installed: `list` alone is
286
+ * a border treatment and still paints normal columnar cells. With a renderer
287
+ * every row collapses to one full-width cell, so there is no column geometry
288
+ * left for a header to label.
289
+ */
290
+ private usesListRowRenderer;
191
291
  renderHeader(): void;
192
292
  renderSortableHeader(column: any): string;
293
+ /**
294
+ * The single message row a zero-row body shows: loading spinner, load error,
295
+ * or the empty state (the `empty-state` slot cloned fresh, else the default
296
+ * placeholder). Returns null when there is data to render. Shared by the
297
+ * ordinary and virtualized paths — the virtualizer wipes the tbody itself, so
298
+ * it asks for this row rather than leaving a virtualized empty table blank.
299
+ */
300
+ /**
301
+ * The spinner both loading affordances draw. `snice-progress` paints its
302
+ * track at 20% alpha, which vanishes against a dark surface — the table pins
303
+ * `--progress-track-opacity` in its own stylesheet so the ring reads on any
304
+ * theme; the indicator arc keeps the primary color.
305
+ */
306
+ private createLoadingSpinner;
307
+ private createEmptyBodyRow;
193
308
  renderBody(): void;
194
309
  /**
195
310
  * When the host is taller than its rows, append an inert filler row so the
@@ -197,6 +312,20 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
197
312
  * data row, so column widths, pinning, and alignment track the table
198
313
  * engine natively. Removed entirely when content fills (or overflows) the
199
314
  * frame, restoring the plain last-row styling.
315
+ *
316
+ * INVARIANT — the filler may only consume space the frame ALREADY has; space
317
+ * that exists only BECAUSE of the filler must be given back. The filler is
318
+ * table content, and `@observe('resize', '.table-frame')` re-derives it from
319
+ * the frame's box, so on a host whose height is content-driven (the
320
+ * documented `:host { height: 100% }` resolving against an auto or
321
+ * max-content container — a stretched grid/flex item, a plain block parent)
322
+ * the filler is an input to the very measurement that produced it: the frame
323
+ * grows, the observer fires, the leftover computes positive again, and the
324
+ * table inflates by one slack per animation frame without bound. No static
325
+ * check distinguishes a content-driven frame from a genuinely sized one, so
326
+ * this measures instead: apply the filler, then confirm the frame kept its
327
+ * height. Any growth is self-inflicted and is subtracted from the filler;
328
+ * once nothing honest is left, the frame had no free space to fill at all.
200
329
  */
201
330
  private updateFillRow;
202
331
  private reconcileRows;
@@ -279,6 +408,14 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
279
408
  private selectorDebounceTimeout;
280
409
  private handleSelectorChange;
281
410
  updateRowSelectionState(): void;
411
+ /**
412
+ * The two selection reflections a row carries, written together: `data-selected`
413
+ * drives the CSS, `aria-selected` is the documented a11y contract ("selected
414
+ * data rows expose aria-selected"). The keyboard module stamps ARIA only on a
415
+ * full body render, so the delta paths below have to carry it themselves —
416
+ * otherwise a screen reader never hears an interaction-driven selection.
417
+ */
418
+ private stampRowSelection;
282
419
  private updateRowSelectionStateFor;
283
420
  updateSelectAllState(): void;
284
421
  toggleSort(columnKey: string, multiSort?: boolean): void;
@@ -289,6 +426,20 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
289
426
  */
290
427
  private applyLocalSortOrder;
291
428
  private sortLocalData;
429
+ /**
430
+ * Selection is anchored to the ROW, not to its position. `selectedRows` holds
431
+ * indices into `data`, so any reorder of that array — a local sort, or a
432
+ * re-delivery of the same row objects in another order — has to re-resolve
433
+ * them; otherwise the indices keep pointing at whatever row now occupies the
434
+ * slot and the user's checkmark silently jumps to a different row (the same
435
+ * remap the row-reorder/DnD path performs).
436
+ *
437
+ * Only a permutation is remapped: same length, same identities, no duplicates.
438
+ * A genuinely new dataset keeps the documented raw-index semantics untouched,
439
+ * and rows carrying no identity (duplicate objects) have nothing to anchor to.
440
+ * Call AFTER rebuildRowIndex() — the remap reads the fresh row-index map.
441
+ */
442
+ private remapSelectionAfterReorder;
292
443
  private dispatchRowSelectionChanged;
293
444
  private dispatchRowClicked;
294
445
  private dispatchLoadError;
@@ -316,6 +467,23 @@ export declare class SniceTable extends HTMLElement implements SniceTableElement
316
467
  * virtualized); otherwise it is the filtered data. Each descriptor carries
317
468
  * the logical index used for `data-index`, selection, and detail lookups.
318
469
  */
470
+ /**
471
+ * Re-derive the windowed row model and hand it to the virtualizer.
472
+ *
473
+ * `virtualRowsSnapshot` is the ONLY state the paint pipeline caches, and
474
+ * `renderRowRange` paints from it. Any caller that resolves a display index
475
+ * against a FRESH `getVirtualRows()` and then asks the virtualizer to paint
476
+ * (scrollToRow, the keyboard ensure-visible hook) must republish that model
477
+ * first, or it scrolls to an offset computed in one list and paints rows from
478
+ * another — the requested row never appears. Returns the fresh model so the
479
+ * caller indexes exactly what will be painted.
480
+ *
481
+ * `paint` false leaves the repaint to the caller (scrollToIndex refreshes the
482
+ * window itself). Those callers must not paint from here: the virtualizer's
483
+ * afterRender hook re-runs keyboard.refresh(), whose ensure-visible callback
484
+ * lands back in ensureKeyboardRowRendered — an unbounded recursion.
485
+ */
486
+ private syncVirtualRows;
319
487
  private getVirtualRows;
320
488
  private renderRowRange;
321
489
  /** Build a fragment of pinned rows for the given position (top/bottom). */