@ixfx/components 0.13.3 → 0.13.4

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 (297) hide show
  1. package/bundle/index.d.ts +1449 -11
  2. package/bundle/index.js +1529 -45918
  3. package/bundle/rolldown-runtime-CEoa-xHZ.js +1 -0
  4. package/dist/ac-text.d.ts +2 -3
  5. package/dist/ac-text.js +0 -2
  6. package/dist/{ac-token-TCLAZeVg.d.ts → ac-token--_vCHXWw.d.ts} +2 -3
  7. package/dist/ac-token.d.ts +1 -1
  8. package/dist/ac-token.js +0 -2
  9. package/dist/button-B7mgqtxR.js +0 -2
  10. package/dist/{button-CTL45aBl.d.ts → button-BYuf72aR.d.ts} +2 -3
  11. package/dist/button.d.ts +1 -1
  12. package/dist/checkbox.d.ts +1 -2
  13. package/dist/checkbox.js +0 -2
  14. package/dist/checked-select-CglRukbP.d.ts +1 -2
  15. package/dist/checked-select-lDgAQQ7v.js +0 -2
  16. package/dist/colour-picker-BCMU7W7R.js +0 -2
  17. package/dist/colour-picker.d.ts +1 -1
  18. package/dist/crumbs.d.ts +2 -3
  19. package/dist/crumbs.js +1 -3
  20. package/dist/data-controller-DOlmqNKb.js +0 -2
  21. package/dist/data-display.d.ts +1 -2
  22. package/dist/data-display.js +0 -2
  23. package/dist/{data-grid-DHWJN66w.d.ts → data-grid-BtBZt8M1.d.ts} +5 -6
  24. package/dist/data-grid-FHr7wZ_k.js +2108 -0
  25. package/dist/data-grid.d.ts +1 -1
  26. package/dist/data-grid.js +1 -2013
  27. package/dist/data-provider-35TyWclX.js +0 -2
  28. package/dist/data-provider-BAn_-oR1.d.ts +1 -2
  29. package/dist/decorate-VRK8rslU.js +0 -2
  30. package/dist/defaults-B4ePs4LB.js +0 -2
  31. package/dist/{detail-list-C96B5Txz.js → detail-list-BfYHNh6B.js} +1 -3
  32. package/dist/{detail-list-dX7jLO6b.d.ts → detail-list-u2rWnAXQ.d.ts} +4 -5
  33. package/dist/detail-list.d.ts +2 -2
  34. package/dist/detail-list.js +1 -1
  35. package/dist/drag-ghost-DtSDvjri.js +0 -2
  36. package/dist/editable-label-rzXkjf1H.d.ts +1 -2
  37. package/dist/editable-label.js +0 -2
  38. package/dist/fallbacks-DQ_5OsmR.js +0 -2
  39. package/dist/{flat-list-Y98IqH00.d.ts → flat-list-DNnTQ65v.d.ts} +3 -4
  40. package/dist/flat-list.d.ts +1 -1
  41. package/dist/flat-list.js +0 -2
  42. package/dist/form-CsXJX15p.js +0 -2
  43. package/dist/form.d.ts +1 -2
  44. package/dist/{grid-list-CoT9e1jB.d.ts → grid-list-BLnV9oZE.d.ts} +2 -3
  45. package/dist/{grid-list-DeqAd9-h.js → grid-list-CkU8gHCh.js} +1 -3
  46. package/dist/grid-list.d.ts +1 -1
  47. package/dist/grid-list.js +1 -1
  48. package/dist/{grouped-item-lister-Bhyo-dkH.d.ts → grouped-item-lister-DETte0Dh.d.ts} +2 -3
  49. package/dist/grouped-item-lister.d.ts +1 -1
  50. package/dist/grouped-item-lister.js +0 -2
  51. package/dist/grouping-CUKgmkMm.d.ts +1 -2
  52. package/dist/grouping-RYPnHkrS.js +0 -2
  53. package/dist/handle-DAXs7kbJ.js +0 -2
  54. package/dist/hex-editor-Caq8vNQk.d.ts +1 -2
  55. package/dist/hex-editor-DiYpgIKs.js +0 -2
  56. package/dist/highlight-B-eQrhhb.js +0 -2
  57. package/dist/icon-1gpwtPx8.js +0 -2
  58. package/dist/{icon-DR_3rSyZ.d.ts → icon-CDGprSdE.d.ts} +2 -3
  59. package/dist/icons.d.ts +2 -2
  60. package/dist/icons.js +0 -2
  61. package/dist/incr-search-JIhwB49y.js +0 -2
  62. package/dist/incr-search.d.ts +1 -1
  63. package/dist/{index-Dq30pOnn.d.ts → index-B-hzcIP0.d.ts} +3 -4
  64. package/dist/{index-Dlah7Zfi.d.ts → index-BYIRgv49.d.ts} +2 -3
  65. package/dist/{index-CnQPCywE.d.ts → index-CCC0G1nO.d.ts} +2 -3
  66. package/dist/{index-garxxqgV.d.ts → index-CYndvTWH.d.ts} +2 -3
  67. package/dist/{index-BUB5SICW.d.ts → index-CoqtMSd9.d.ts} +2 -3
  68. package/dist/index-DV3iaUBW.d.ts +1 -2
  69. package/dist/{index-CJ5fshD3.d.ts → index-UvnoZUAo.d.ts} +2 -3
  70. package/dist/index-o-CWDt11.d.ts +1 -2
  71. package/dist/{index-BOUaDIW-.d.ts → index-tq6f8007.d.ts} +2 -3
  72. package/dist/index.d.ts +21 -22
  73. package/dist/index.js +4 -6
  74. package/dist/item-appearance-BjcMyauw.js +0 -2
  75. package/dist/keyboard-B5xD7Fz-.js +0 -2
  76. package/dist/labelled-input-base-BFa4xlYV.js +0 -2
  77. package/dist/{labelled-input-base-Dp_9KP0G.d.ts → labelled-input-base-DiTme1JO.d.ts} +2 -3
  78. package/dist/labelled-radial-input.d.ts +3 -4
  79. package/dist/labelled-radial-input.js +0 -2
  80. package/dist/labelled-range-input.d.ts +1 -1
  81. package/dist/labelled-range-input.js +0 -2
  82. package/dist/labelled-slider-input-FdCRi6st.js +0 -2
  83. package/dist/labelled-slider-input.d.ts +1 -1
  84. package/dist/led.d.ts +1 -2
  85. package/dist/led.js +0 -2
  86. package/dist/list-group-header.d.ts +2 -3
  87. package/dist/list-group-header.js +0 -2
  88. package/dist/list-item-animation-BUoEKi5s.js +0 -2
  89. package/dist/list-native-drag-controller-B9xO0XWn.js +0 -2
  90. package/dist/list-native-drag-controller-ChIi3eK5.d.ts +1 -2
  91. package/dist/list-selection-controller-BeE70lbB.js +0 -2
  92. package/dist/list-selection-types-PjKdhF-a.d.ts +1 -2
  93. package/dist/list-viewport-types-BRZsLcvp.d.ts +1 -2
  94. package/dist/menu-CwcXXeLM.js +0 -2
  95. package/dist/menu-item-BDEekBVy.js +0 -2
  96. package/dist/{menu-item-B0zqw2xp.d.ts → menu-item-bF6narIz.d.ts} +2 -3
  97. package/dist/menu.d.ts +2 -2
  98. package/dist/miller.d.ts +2 -3
  99. package/dist/miller.js +0 -2
  100. package/dist/narrowed-text.js +0 -2
  101. package/dist/notification-pill-DyZydXoZ.d.ts +1 -2
  102. package/dist/notifier.js +0 -2
  103. package/dist/pan-text-CoYmt2qd.d.ts +1 -2
  104. package/dist/pan-text-CqtvjPyK.js +0 -2
  105. package/dist/panel.d.ts +2 -3
  106. package/dist/panel.js +0 -2
  107. package/dist/polar-pad.d.ts +1 -2
  108. package/dist/polar-pad.js +0 -2
  109. package/dist/popup-D80sj2QC.js +0 -2
  110. package/dist/prominence-DlFShic3.js +0 -2
  111. package/dist/radial-input-DU6t2hYO.d.ts +1 -2
  112. package/dist/radial-input-KMVltQfe.js +0 -2
  113. package/dist/range-input.d.ts +1 -2
  114. package/dist/range-input.js +0 -2
  115. package/dist/range.d.ts +1 -2
  116. package/dist/range.js +0 -2
  117. package/dist/registry-BEtb8_wB.js +0 -2
  118. package/dist/{scroll-fade-BrNUIYnm.js → scroll-fade-Xx28D7mH.js} +11 -7
  119. package/dist/select-horiz.d.ts +1 -2
  120. package/dist/select-horiz.js +1 -3
  121. package/dist/slider-input-BxURAAmD.d.ts +1 -2
  122. package/dist/slider-input-ByHdotzp.js +0 -2
  123. package/dist/snackbar.d.ts +1 -2
  124. package/dist/snackbar.js +0 -2
  125. package/dist/snap-container.d.ts +1 -2
  126. package/dist/snap-container.js +0 -2
  127. package/dist/split-layout-Deoxy47d.js +0 -2
  128. package/dist/{split-layout-C5SYbDrq.d.ts → split-layout-JK3xWVX2.d.ts} +2 -3
  129. package/dist/split-layout.d.ts +1 -1
  130. package/dist/swipe.d.ts +1 -2
  131. package/dist/swipe.js +0 -2
  132. package/dist/{tab-list-D_dmImJM.d.ts → tab-list-CexFFg6O.d.ts} +2 -3
  133. package/dist/tabs.d.ts +1 -1
  134. package/dist/tabs.js +1 -3
  135. package/dist/tickled-controller-D-HZymaZ.js +0 -2
  136. package/dist/tickled-controller-DodxD3eQ.d.ts +1 -2
  137. package/dist/tickled-styles-BrAHEj1q.js +0 -2
  138. package/dist/timeline-BP1Ux2EV.js +0 -2
  139. package/dist/{titlebar-B5zSTZnF.d.ts → titlebar-Tqu-VvMU.d.ts} +2 -3
  140. package/dist/titlebar.d.ts +1 -1
  141. package/dist/titlebar.js +0 -2
  142. package/dist/tooltip-BlvBUQxx.d.ts +1 -2
  143. package/dist/tooltip-CJt3WLmN.js +0 -2
  144. package/dist/transitory-label.d.ts +1 -2
  145. package/dist/transitory-label.js +0 -2
  146. package/dist/tree-DD8OaqsK.js +0 -2
  147. package/dist/tree-component-Cj8V3uar.d.ts +1 -2
  148. package/dist/tree.d.ts +1 -1
  149. package/dist/types-DQ7KOUIj.d.ts +1 -2
  150. package/dist/{vertical-list-lj_19DCx.d.ts → vertical-list-m7GJtXwv.d.ts} +2 -3
  151. package/dist/vertical-list.d.ts +1 -1
  152. package/dist/vertical-list.js +1 -3
  153. package/dist/wheel-nudge-By5s_ioH.d.ts +1 -2
  154. package/dist/wheel-nudge-D5rmht3v.js +0 -2
  155. package/dist/xy-axis-CyMd_Bn1.js +0 -2
  156. package/dist/xy-axis-DQqd2yXJ.d.ts +1 -2
  157. package/dist/xy-pad.d.ts +1 -2
  158. package/dist/xy-pad.js +0 -2
  159. package/docs-user/index.json +2 -2
  160. package/package.json +1 -1
  161. package/bundle/index.d.ts.map +0 -1
  162. package/bundle/index.js.map +0 -1
  163. package/bundle/rolldown-runtime-D7D4PA-g.js +0 -13
  164. package/dist/ac-text.d.ts.map +0 -1
  165. package/dist/ac-text.js.map +0 -1
  166. package/dist/ac-token-TCLAZeVg.d.ts.map +0 -1
  167. package/dist/ac-token.js.map +0 -1
  168. package/dist/button-B7mgqtxR.js.map +0 -1
  169. package/dist/button-CTL45aBl.d.ts.map +0 -1
  170. package/dist/checkbox.d.ts.map +0 -1
  171. package/dist/checkbox.js.map +0 -1
  172. package/dist/checked-select-CglRukbP.d.ts.map +0 -1
  173. package/dist/checked-select-lDgAQQ7v.js.map +0 -1
  174. package/dist/colour-picker-BCMU7W7R.js.map +0 -1
  175. package/dist/crumbs.d.ts.map +0 -1
  176. package/dist/crumbs.js.map +0 -1
  177. package/dist/data-controller-DOlmqNKb.js.map +0 -1
  178. package/dist/data-display.d.ts.map +0 -1
  179. package/dist/data-display.js.map +0 -1
  180. package/dist/data-grid-DHWJN66w.d.ts.map +0 -1
  181. package/dist/data-grid.js.map +0 -1
  182. package/dist/data-provider-35TyWclX.js.map +0 -1
  183. package/dist/data-provider-BAn_-oR1.d.ts.map +0 -1
  184. package/dist/decorate-VRK8rslU.js.map +0 -1
  185. package/dist/defaults-B4ePs4LB.js.map +0 -1
  186. package/dist/detail-list-C96B5Txz.js.map +0 -1
  187. package/dist/detail-list-dX7jLO6b.d.ts.map +0 -1
  188. package/dist/drag-ghost-DtSDvjri.js.map +0 -1
  189. package/dist/editable-label-rzXkjf1H.d.ts.map +0 -1
  190. package/dist/editable-label.js.map +0 -1
  191. package/dist/fallbacks-DQ_5OsmR.js.map +0 -1
  192. package/dist/flat-list-Y98IqH00.d.ts.map +0 -1
  193. package/dist/flat-list.js.map +0 -1
  194. package/dist/form-CsXJX15p.js.map +0 -1
  195. package/dist/form.d.ts.map +0 -1
  196. package/dist/grid-list-CoT9e1jB.d.ts.map +0 -1
  197. package/dist/grid-list-DeqAd9-h.js.map +0 -1
  198. package/dist/grouped-item-lister-Bhyo-dkH.d.ts.map +0 -1
  199. package/dist/grouped-item-lister.js.map +0 -1
  200. package/dist/grouping-CUKgmkMm.d.ts.map +0 -1
  201. package/dist/grouping-RYPnHkrS.js.map +0 -1
  202. package/dist/handle-DAXs7kbJ.js.map +0 -1
  203. package/dist/hex-editor-Caq8vNQk.d.ts.map +0 -1
  204. package/dist/hex-editor-DiYpgIKs.js.map +0 -1
  205. package/dist/highlight-B-eQrhhb.js.map +0 -1
  206. package/dist/icon-1gpwtPx8.js.map +0 -1
  207. package/dist/icon-DR_3rSyZ.d.ts.map +0 -1
  208. package/dist/icons.js.map +0 -1
  209. package/dist/incr-search-JIhwB49y.js.map +0 -1
  210. package/dist/index-BOUaDIW-.d.ts.map +0 -1
  211. package/dist/index-BUB5SICW.d.ts.map +0 -1
  212. package/dist/index-CJ5fshD3.d.ts.map +0 -1
  213. package/dist/index-CnQPCywE.d.ts.map +0 -1
  214. package/dist/index-DV3iaUBW.d.ts.map +0 -1
  215. package/dist/index-Dlah7Zfi.d.ts.map +0 -1
  216. package/dist/index-Dq30pOnn.d.ts.map +0 -1
  217. package/dist/index-garxxqgV.d.ts.map +0 -1
  218. package/dist/index-o-CWDt11.d.ts.map +0 -1
  219. package/dist/index.d.ts.map +0 -1
  220. package/dist/index.js.map +0 -1
  221. package/dist/item-appearance-BjcMyauw.js.map +0 -1
  222. package/dist/keyboard-B5xD7Fz-.js.map +0 -1
  223. package/dist/labelled-input-base-BFa4xlYV.js.map +0 -1
  224. package/dist/labelled-input-base-Dp_9KP0G.d.ts.map +0 -1
  225. package/dist/labelled-radial-input.d.ts.map +0 -1
  226. package/dist/labelled-radial-input.js.map +0 -1
  227. package/dist/labelled-range-input.js.map +0 -1
  228. package/dist/labelled-slider-input-FdCRi6st.js.map +0 -1
  229. package/dist/led.d.ts.map +0 -1
  230. package/dist/led.js.map +0 -1
  231. package/dist/list-group-header.d.ts.map +0 -1
  232. package/dist/list-group-header.js.map +0 -1
  233. package/dist/list-item-animation-BUoEKi5s.js.map +0 -1
  234. package/dist/list-native-drag-controller-B9xO0XWn.js.map +0 -1
  235. package/dist/list-native-drag-controller-ChIi3eK5.d.ts.map +0 -1
  236. package/dist/list-selection-controller-BeE70lbB.js.map +0 -1
  237. package/dist/list-selection-types-PjKdhF-a.d.ts.map +0 -1
  238. package/dist/list-viewport-types-BRZsLcvp.d.ts.map +0 -1
  239. package/dist/menu-CwcXXeLM.js.map +0 -1
  240. package/dist/menu-item-B0zqw2xp.d.ts.map +0 -1
  241. package/dist/menu-item-BDEekBVy.js.map +0 -1
  242. package/dist/miller.d.ts.map +0 -1
  243. package/dist/miller.js.map +0 -1
  244. package/dist/narrowed-text.js.map +0 -1
  245. package/dist/notification-pill-DyZydXoZ.d.ts.map +0 -1
  246. package/dist/notifier.js.map +0 -1
  247. package/dist/pan-text-CoYmt2qd.d.ts.map +0 -1
  248. package/dist/pan-text-CqtvjPyK.js.map +0 -1
  249. package/dist/panel.d.ts.map +0 -1
  250. package/dist/panel.js.map +0 -1
  251. package/dist/polar-pad.d.ts.map +0 -1
  252. package/dist/polar-pad.js.map +0 -1
  253. package/dist/popup-D80sj2QC.js.map +0 -1
  254. package/dist/prominence-DlFShic3.js.map +0 -1
  255. package/dist/radial-input-DU6t2hYO.d.ts.map +0 -1
  256. package/dist/radial-input-KMVltQfe.js.map +0 -1
  257. package/dist/range-input.d.ts.map +0 -1
  258. package/dist/range-input.js.map +0 -1
  259. package/dist/range.d.ts.map +0 -1
  260. package/dist/range.js.map +0 -1
  261. package/dist/registry-BEtb8_wB.js.map +0 -1
  262. package/dist/scroll-fade-BrNUIYnm.js.map +0 -1
  263. package/dist/select-horiz.d.ts.map +0 -1
  264. package/dist/select-horiz.js.map +0 -1
  265. package/dist/slider-input-BxURAAmD.d.ts.map +0 -1
  266. package/dist/slider-input-ByHdotzp.js.map +0 -1
  267. package/dist/snackbar.d.ts.map +0 -1
  268. package/dist/snackbar.js.map +0 -1
  269. package/dist/snap-container.d.ts.map +0 -1
  270. package/dist/snap-container.js.map +0 -1
  271. package/dist/split-layout-C5SYbDrq.d.ts.map +0 -1
  272. package/dist/split-layout-Deoxy47d.js.map +0 -1
  273. package/dist/swipe.d.ts.map +0 -1
  274. package/dist/swipe.js.map +0 -1
  275. package/dist/tab-list-D_dmImJM.d.ts.map +0 -1
  276. package/dist/tabs.js.map +0 -1
  277. package/dist/tickled-controller-D-HZymaZ.js.map +0 -1
  278. package/dist/tickled-controller-DodxD3eQ.d.ts.map +0 -1
  279. package/dist/tickled-styles-BrAHEj1q.js.map +0 -1
  280. package/dist/timeline-BP1Ux2EV.js.map +0 -1
  281. package/dist/titlebar-B5zSTZnF.d.ts.map +0 -1
  282. package/dist/titlebar.js.map +0 -1
  283. package/dist/tooltip-BlvBUQxx.d.ts.map +0 -1
  284. package/dist/tooltip-CJt3WLmN.js.map +0 -1
  285. package/dist/transitory-label.d.ts.map +0 -1
  286. package/dist/transitory-label.js.map +0 -1
  287. package/dist/tree-DD8OaqsK.js.map +0 -1
  288. package/dist/tree-component-Cj8V3uar.d.ts.map +0 -1
  289. package/dist/types-DQ7KOUIj.d.ts.map +0 -1
  290. package/dist/vertical-list-lj_19DCx.d.ts.map +0 -1
  291. package/dist/vertical-list.js.map +0 -1
  292. package/dist/wheel-nudge-By5s_ioH.d.ts.map +0 -1
  293. package/dist/wheel-nudge-D5rmht3v.js.map +0 -1
  294. package/dist/xy-axis-CyMd_Bn1.js.map +0 -1
  295. package/dist/xy-axis-DQqd2yXJ.d.ts.map +0 -1
  296. package/dist/xy-pad.d.ts.map +0 -1
  297. package/dist/xy-pad.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-grid.js","names":["#tickledItems","#nativeDrag","#prepareNativeDrag","#nativeDragging","#dragOriginKey","#startPostDragSuppressTimer","#createSearchAdapter","#windowRows","#viewportChangeRaf","#emitViewportChangeIfChanged","#rowEntry","#postDragSuppressTimer","#searchRegistry","#searchKeyByRow","#rowSearchText","#effectiveSearchModes","#unregisterSearchCommands","#syncSearchCommands","#rowReflowTimer","#viewportResizeObserver","#measureViewport","#scheduleViewportChangeEmit","#syncDerivedRows","#flatVersion","#notedFlatVersion","#noteFlatMutation","#sortInputs","#flatInputs","#prevFlatKeys","#dataGridRenderedOnce","#enteringRowKeys","#rebuildFlatIndex","#flatIndexByKey","#pointerEventSuppressess","#appendToFlat","#markDerivedRowsSynced","#resortRaf","#visibleKeys","#lastViewportRenderedKeys","#lastViewportVisibleKeys","customElement"],"sources":["../src/data-grid/data-grid.ts"],"sourcesContent":["/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { CommandId, CommandRegistry } from '@clinth/ui-commands';\nimport type { ListSearchAdapter, ListSearchMode } from '../incr-search/index.js';\nimport type {\n ListDragEntry,\n ListDragPreviewRenderer,\n ListDragPreviewSourceResolver,\n ListNativeDragStartDetail,\n ListNativeDragStartEvent,\n} from '../interaction/list-drag-types.js';\nimport type { ListViewportChangeDetail, ListViewportChangeEvent } from '../interaction/list-viewport-types.js';\nimport type { DragGhost } from '../util/drag-ghost.js';\nimport type { BuiltInFormatterName, BuiltInFormatterOptions, DataGridCellOverflow, DataGridColumn, DataGridColumnMenu, DataGridEditability, DataGridEditorFactory, DataGridGetRowKey, DataGridGroupBy, DataGridGroupLabel, DataGridInteractionMode, DataGridSelectionMode, DataGridSortState, GlobalFormatter } from './types.js';\nimport { createCommandRegistry } from '@clinth/ui-commands';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { appearanceAbsent, appearanceColor } from '../common/item-appearance.js';\nimport {\n LIST_SEARCH_MODES,\n ListSearchController,\n listSearchStyles,\n registerListSearchCommands,\n} from '../incr-search/index.js';\nimport { listItemFadeKeyframes, TickledController, tickledItemStyles, tickledStyles } from '../interaction/index.js';\nimport { ListNativeDragController } from '../interaction/list-native-drag-controller.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { handleStyles } from '../styles/handle.js';\nimport { scrollFadeStyles } from '../styles/scroll-fade.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { createDragGhost } from '../util/drag-ghost.js';\nimport '../icons/icon.js';\nimport '../menu/index.js';\nimport '../pan-text/pan-text.js';\n\n// Events\nexport type DataGridSortDetail = { readonly sort: DataGridSortState; readonly previous: DataGridSortState };\nexport type DataGridSortEvent = CustomEvent<DataGridSortDetail>;\nexport type DataGridSelectDetail = { readonly selectedKeys: ReadonlySet<string>; readonly previous: ReadonlySet<string> };\nexport type DataGridSelectEvent = CustomEvent<DataGridSelectDetail>;\nexport type DataGridColumnReorderDetail = { readonly from: number; readonly to: number; readonly columns: readonly DataGridColumn[] };\nexport type DataGridColumnReorderEvent = CustomEvent<DataGridColumnReorderDetail>;\nexport type DataGridColumnResizeDetail = { readonly key: string; readonly width: number };\nexport type DataGridColumnResizeEvent = CustomEvent<DataGridColumnResizeDetail>;\nexport type DataGridColumnVisibilityDetail = { readonly key: string; readonly visible: boolean };\nexport type DataGridColumnVisibilityEvent = CustomEvent<DataGridColumnVisibilityDetail>;\nexport type DataGridCellClickDetail = { readonly rowKey: string; readonly colKey: string; readonly rowIndex: number; readonly colIndex: number };\nexport type DataGridCellClickEvent = CustomEvent<DataGridCellClickDetail>;\nexport type DataGridCellEditDetail = { readonly rowKey: string; readonly colKey: string; readonly oldValue: unknown; readonly newValue: unknown };\nexport type DataGridCellEditEvent = CustomEvent<DataGridCellEditDetail>;\n\nexport type DataGridGroupChangeDetail = { readonly groupBy: DataGridGroupBy<unknown> | null };\nexport type DataGridGroupChangeEvent = CustomEvent<DataGridGroupChangeDetail>;\nexport type DataGridRowActivateDetail = { readonly rowKey: string; readonly row: unknown; readonly rowIndex: number };\nexport type DataGridRowActivateEvent = CustomEvent<DataGridRowActivateDetail>;\n\n/** Same shape as the list components' shared `ListViewportChangeDetail`. */\nexport type DataGridViewportChangeDetail = ListViewportChangeDetail;\nexport type DataGridViewportChangeEvent = ListViewportChangeEvent;\n\n/** Resolved per-cell appearance — see `DataGridRowLook` and `_cellLook`. */\ntype DataGridCellLook = {\n readonly textColor: string | undefined;\n readonly icon: unknown;\n readonly iconColor: string | undefined;\n readonly badge: unknown;\n};\n\nconst EMPTY_CELL_LOOK: DataGridCellLook = {\n textColor: undefined,\n icon: undefined,\n iconColor: undefined,\n badge: undefined,\n};\n\nexport interface DataGridElementEventMap {\n 'datagrid-sort': DataGridSortEvent;\n 'datagrid-select': DataGridSelectEvent;\n 'datagrid-column-reorder': DataGridColumnReorderEvent;\n 'datagrid-column-resize': DataGridColumnResizeEvent;\n 'datagrid-column-visibility': DataGridColumnVisibilityEvent;\n 'datagrid-cell-click': DataGridCellClickEvent;\n 'datagrid-cell-edit': DataGridCellEditEvent;\n 'datagrid-group-change': DataGridGroupChangeEvent;\n 'datagrid-row-activate': DataGridRowActivateEvent;\n 'datagrid-viewport-change': DataGridViewportChangeEvent;\n 'list-native-drag-start': ListNativeDragStartEvent<unknown>;\n}\n\nexport type {\n ListDragEntry,\n ListDragPreview,\n ListDragPreviewContext,\n ListDragPreviewRenderer,\n ListDragSource,\n ListNativeDragStartDetail,\n ListNativeDragStartEvent,\n} from '../interaction/list-drag-types.js';\n\nexport type {\n BuiltInFormatterName,\n BuiltInFormatterOptions,\n DataGridColumn,\n DataGridColumnMenu,\n DataGridDataType,\n DataGridEditability,\n DataGridEditorContext,\n DataGridEditorFactory,\n DataGridEditorType,\n DataGridGetRowKey,\n DataGridGroupBy,\n DataGridGroupLabel,\n DataGridInteractionMode,\n DataGridRowLook,\n DataGridSelectionMode,\n DataGridSortDirection,\n DataGridSortState,\n GlobalFormatter,\n} from './types.js';\n\n/** Shallow key-array equality, treating `undefined` (never dispatched) as different. */\nfunction sameKeys(a: readonly string[] | undefined, b: readonly string[]): boolean {\n if (a === undefined || a.length !== b.length)\n return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i])\n return false;\n }\n return true;\n}\n\n/** Element-wise reference equality, treating `undefined` (never computed) as different. */\nfunction sameRefs(a: readonly unknown[] | undefined, b: readonly unknown[]): boolean {\n return a !== undefined && a.length === b.length && a.every((v, i) => v === b[i]);\n}\n\n@customElement(`ixfx-data-grid`)\nexport class DataGridElement extends LitElement {\n static override styles = [themeFallbacks, handleStyles, tickledStyles, tickledItemStyles, listItemFadeKeyframes, listSearchStyles, scrollFadeStyles(`x`), scrollFadeStyles(`y`), css`\n :host {\n --data-grid-row-height: 28px;\n --data-grid-header-height: 32px;\n --data-grid-bg: var(--surface-3);\n --data-grid-header-bg: var(--surface-2);\n --data-grid-border: var(--border);\n --data-grid-header-text: var(--surface-3-text);\n --data-grid-reorder-handle-width: 4px;\n /* How strongly the alternate (\"zebra\") row stands out from the base row\n background when [zebra-stripes] is set - a color-mix() percentage. */\n --data-grid-zebra-intensity: 6%;\n /* Duration of the width transition when a column is auto-sized via\n autoSizeColumn(). Read back in JS (_columnResizeAnimationMs) to know\n when the animation has finished, so keep it a plain time value. */\n --data-grid-column-resize-duration: 180ms;\n /* Dense 28px rows read badly under the global 30px full-strength fade,\n so default to a shorter, shallower edge hint. Consumers can override\n --scroll-fade-width / --scroll-fade-strength per instance. */\n --scroll-fade-width: 20px;\n --scroll-fade-strength: 0.8;\n position: relative;\n display: block;\n overflow: hidden;\n border: var(--data-grid-border);\n border-radius: var(--radius-m);\n background: var(--data-grid-bg);\n color: var(--surface-3-text);\n font-family: var(--font-family);\n font-size: var(--text-m);\n }\n :host(:focus-visible) { outline: 2px solid var(--accent); outline-offset: 2px; }\n .grid { display: flex; flex-direction: column; height: 100%; min-height: 200px; position: relative; }\n .header-bar {\n display: flex; align-items: stretch; height: var(--data-grid-header-height);\n background: var(--data-grid-header-bg); border-bottom: var(--data-grid-border);\n overflow: visible; flex-shrink: 0; position: relative;\n }\n .header-scroll {\n display: flex; flex: 1; overflow: hidden;\n /* Horizontal edge fade comes from the shared .scroll-fade-x class\n (see ../styles/scroll-fade.ts). Its scrollLeft is synced from the\n viewport in _onScroll, which drives its own scroll-timeline. */\n }\n .header-cell {\n display: flex; align-items: center; gap: var(--space-xs);\n padding: 0 var(--space-s); border-right: var(--border-subtle);\n flex-shrink: 0; user-select: none; cursor: pointer; position: relative;\n background: var(--data-grid-header-bg);\n box-sizing: border-box;\n }\n .header-cell[data-tickled] { background: var(--surface-5); }\n /* Applied to a header-cell / cell while its column is animating towards\n an autoSizeColumn() target width. */\n .header-cell.width-animating, .cell.width-animating {\n transition: width var(--data-grid-column-resize-duration, 180ms) ease-out;\n }\n @media (prefers-reduced-motion: reduce) {\n .header-cell.width-animating, .cell.width-animating { transition: none; }\n }\n .header-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .sort-icon { display: inline-flex; align-items: center; opacity: 0.7; }\n .resize-handle {\n position: absolute; right: -4px; top: 0; bottom: 0; width: 8px; cursor: col-resize; z-index: 1;\n display: flex; align-items: stretch; justify-content: center;\n }\n .resize-handle::before {\n content: ''; width: 2px; margin: 2px 0; border-radius: 1px; background: var(--split-gutter-color, transparent);\n transition: background-color var(--transition, 0.15s ease-out);\n }\n .resize-handle:hover::before { background: var(--split-gutter-hover-color, var(--surface-6)); }\n .resize-handle[data-active]::before { background: var(--split-gutter-active-color, var(--accent)); }\n .reorder-handle { cursor: grab; opacity: 0; display: inline-flex; align-items: center; transition: opacity var(--transition, 0.15s ease-out); }\n .header-cell:hover .reorder-handle, .header-cell:focus-within .reorder-handle, .header-cell[drag-source] .reorder-handle { opacity: var(--ixfx-handle-opacity, 0.5); }\n .col-button { opacity: 0; pointer-events: none; display: inline-flex; align-items: center; justify-content: center; width: 20px; height: 20px; border-radius: var(--radius-s); cursor: pointer; flex-shrink: 0; margin-left: var(--space-xs); transition: opacity var(--transition, 0.15s ease-out), background var(--transition, 0.15s ease-out); }\n .col-button ixfx-icon { width: 14px; height: 14px; }\n .header-cell:hover .col-button, .header-cell:focus-within .col-button { opacity: 1; pointer-events: auto; }\n .col-button:hover { background: var(--surface-4); }\n .reorder-handle .ixfx-handle { --ixfx-handle-length: 14px; --ixfx-handle-thickness: var(--data-grid-reorder-handle-width, 10px); --ixfx-handle-dot-size: 3px; }\n .flyout-trigger { flex-shrink: 0; width: 36px; display: flex; align-items: center; justify-content: center; cursor: pointer; border-left: var(--border-subtle); background: var(--data-grid-header-bg); }\n .viewport { flex: 1; overflow: auto; position: relative; }\n /* Vertical edge fade from the shared .scroll-fade-y class\n (see ../styles/scroll-fade.ts). The mask lives on the viewport —\n below the header bar — so the top fade never covers the column\n headers. Reach/strength tune via --scroll-fade-width /\n --scroll-fade-strength (defaults set on :host above). */\n .spacer { position: relative; }\n .row.item {\n position: absolute; left: 0; right: 0; display: flex; align-items: stretch;\n gap: 0;\n height: var(--data-grid-row-height);\n /* Border width is always 1px, even when not visually shown (transparent),\n so hover/selection never changes the box size and shifts content. */\n border: 1px solid transparent;\n background: var(--item-bg);\n border-radius: var(--item-border-radius);\n padding: 0;\n box-sizing: border-box;\n /* Only background transitions - hover (\"tickled\") no longer changes\n border, so there is nothing else to animate. */\n transition: background var(--transition, 0.1s ease-out);\n }\n /* Zebra striping: alternate rows tint towards the text colour, which\n lightens in dark themes and darkens in light themes - so it reads as\n \"more contrast\" either way. The zebra-odd class is only applied when\n zebraStripes is set (see render()). Declared before .tickled /\n .selected so those states (same specificity) still win when a striped\n row is also hovered or selected. */\n .row.item.zebra-odd {\n background: color-mix(in oklch, transparent calc(100% - var(--data-grid-zebra-intensity, 6%)), var(--surface-3-text) var(--data-grid-zebra-intensity, 6%));\n }\n /* Hover: background only, no border change (avoids layout shift + colour flash). */\n .row.item.tickled { background: var(--item-bg-tickled); color: var(--item-text-tickled); }\n .row.item.selected { background: var(--item-bg-selected); border: var(--item-border-selected); color: var(--item-text-selected); }\n .row.item.selected.tickled { background: var(--item-bg-selected-tickled); }\n .row.item.dragging-origin { opacity: 0.6; }\n\n /* Insertion / removal animation. Only while [reflowing] — the ~0.3s after\n the row set changes — do rows slide (their top transitions) to make or\n close a gap; a freshly inserted row also fades in. Kept scoped so it\n never fires while scrolling the virtualised list. */\n :host([reflowing]) .row.item,\n :host([reflowing]) .group-row {\n transition: top var(--data-grid-row-move-duration, 200ms) cubic-bezier(0.2, 0, 0, 1);\n }\n .row.item.entering {\n animation: ixfx-list-item-in var(--data-grid-row-move-duration, 200ms) ease both;\n }\n @media (prefers-reduced-motion: reduce) {\n :host([reflowing]) .row.item, :host([reflowing]) .group-row { transition: none; }\n .row.item.entering { animation: none; }\n }\n .cell {\n flex-shrink: 0; display: flex; align-items: center; padding: 0 var(--space-s);\n overflow: hidden; text-overflow: ellipsis; white-space: nowrap; border-right: var(--border-subtle);\n box-sizing: border-box;\n font-variant-numeric: tabular-nums;\n }\n .cell.editable-text { cursor: text; }\n .cell input, .cell select { width: 100%; font: inherit; }\n /* Per-row icon / badge, enabled by nominating iconColumn / badgeColumn.\n The badge self-justifies to the cell's trailing edge; the value text\n keeps its own flex sizing so the cell still ellipsises. */\n .cell-icon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-inline-end: var(--data-grid-cell-icon-gap, 6px);\n width: var(--data-grid-cell-icon-size, 1em);\n height: var(--data-grid-cell-icon-size, 1em);\n }\n .cell-badge {\n flex: none;\n display: inline-flex;\n align-items: center;\n margin-inline-start: auto;\n padding-inline-start: var(--data-grid-badge-gap, 6px);\n }\n .checkbox-col { width: 28px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }\n ixfx-menu-trigger { flex-shrink: 0; border-left: var(--border-subtle); background: var(--data-grid-header-bg); display: flex; align-items: center; --ixfx-button-padding: var(--space-s) var(--space-m); min-width: 44px; min-height: var(--data-grid-header-height); justify-content: center; }\n .header-cell[drag-source] { opacity: 0.4; }\n .drop-caret {\n position: absolute; top: 0; bottom: 0; width: 2px;\n background: var(--accent); border-radius: 1px; pointer-events: none; z-index: 2;\n }\n .group-row {\n position: absolute; left: 0; right: 0; display: flex; align-items: center; gap: var(--space-s);\n height: var(--data-grid-row-height); background: transparent; color: var(--surface-3-text);\n border-bottom: 1px solid var(--border); font-weight: 600; padding: 0 var(--space-s);\n cursor: pointer; user-select: none;\n }\n .group-row .caret { transition: transform 0.15s; display: inline-flex; }\n .group-row.collapsed .caret { transform: rotate(-90deg); }\n .group-row .divider { flex: 1; height: 1px; background: var(--border); margin-left: var(--space-s); }\n .group-row .count { opacity: 0.6; font-weight: 400; font-size: 0.9em; }\n\n `];\n\n @property({ type: Array }) columns: DataGridColumn[] = [];\n @property({ type: Array }) rows: unknown[] = [];\n @property({ type: String, attribute: `selection-mode` }) selectionMode: DataGridSelectionMode = `single`;\n @property({ type: String, attribute: `interaction-mode` }) interactionMode: DataGridInteractionMode = `standard`;\n @property({ attribute: false }) sortState: DataGridSortState = null;\n @property({ type: Number, attribute: `row-height` }) rowHeight = 28;\n @property({ attribute: false }) getRowKey: DataGridGetRowKey<unknown> = (r: unknown, i: number) => (r as Record<string, unknown>).key as string ?? (r as Record<string, unknown>).id as string ?? String(i);\n @property({ attribute: false }) checkboxRenderer?: (checked: boolean) => unknown;\n @property({ attribute: false }) editable: boolean | ((row: unknown, col: DataGridColumn) => boolean) = false;\n @property({ type: String, reflect: true }) editability: DataGridEditability = `user`;\n @property({ type: String, attribute: `cell-overflow` }) cellOverflow: DataGridCellOverflow = `ellipsis`;\n @property({ type: Boolean, attribute: `zebra-stripes`, reflect: true }) zebraStripes = false;\n\n @property({ attribute: false }) groupBy: DataGridGroupBy<unknown> | null = null;\n @property({ type: Boolean, attribute: `allow-grouping` }) allowGrouping = false;\n @property({ attribute: false }) groupLabel: DataGridGroupLabel | undefined;\n /** Columns keys that can be grouped by; undefined = all groupable columns */\n @property({ attribute: false }) groupableColumns: string[] | undefined;\n @property({ type: Boolean, attribute: `cross-group-selection`, reflect: true }) crossGroupSelection = false;\n /**\n * `none` (default): don't render the built-in header column/group menu — hosts can\n * supply their own column UI via `column.visible` + `datagrid-column-visibility`.\n * `auto`: opt in to the built-in menu.\n */\n @property({ type: String, attribute: `column-menu` }) columnMenu: DataGridColumnMenu = `none`;\n @property({ attribute: false }) globalFormatter?: GlobalFormatter;\n\n // --- Per-row appearance \"nomination\" columns ---\n //\n // A grid has no per-item schema of its own, so the consumer nominates the\n // column that carries each appearance feature. The value itself is read off\n // the row, not off the cell's own column value — see `DataGridRowLook`.\n\n /**\n * Key of the column whose cell text takes the row's `textColor` — e.g. a\n * status column that renders a red \"Failed\" only on some rows.\n */\n @property({ type: String, attribute: `text-color-column` }) textColorColumn = ``;\n\n /**\n * Key of the column that renders the row's `icon` (tinted by `iconColor`).\n */\n @property({ type: String, attribute: `icon-column` }) iconColumn = ``;\n\n /**\n * Key of the column that renders the row's `badge`, right-justified in the\n * cell after the cell's own value.\n */\n @property({ type: String, attribute: `badge-column` }) badgeColumn = ``;\n\n /**\n * Predicate used by incremental filter-search (and callable directly). Rows\n * for which it returns `false` are dropped from the flat list — hidden from\n * view and navigation.\n */\n @property({ attribute: false }) filterPredicate?: (row: unknown) => boolean;\n\n /** Text a row is matched against by incremental search. Default: its visible cells joined by a space. */\n @property({ attribute: false }) rowSearchText?: (row: unknown) => string;\n\n /**\n * Space-separated subset of `navigate select filter` — limits which\n * incremental-search modes are offered. Unset ⇒ all three; empty ⇒ search\n * disabled. See `docs/infra-incremental.md`.\n */\n @property({ type: String, attribute: `search-modes`, reflect: true }) searchModes: string | undefined;\n\n /**\n * Enable native browser drag-and-drop for selectable rows. When true,\n * selectable rows become draggable and the grid emits\n * `list-native-drag-start` when a drag begins.\n */\n @property({ type: Boolean, attribute: `items-draggable`, reflect: true }) itemsDraggable = false;\n\n /**\n * Custom drag preview renderer (synchronous). Defaults to the shared\n * built-in HTML+canvas preview.\n */\n @property({ attribute: false }) dragPreviewRenderer: ListDragPreviewRenderer<unknown> | undefined;\n\n @property({ attribute: false }) dragPreviewSource: ListDragPreviewSourceResolver<unknown> | undefined;\n\n /**\n * Default icon name for column header buttons. Defaults to `ellipsis`.\n * Individual columns can override with `button: { icon: '...' }`.\n */\n @property({ type: String, attribute: `column-button-icon` }) columnButtonIcon = `ellipsis`;\n\n private _columnFormatters = new Map<string, (value: unknown) => unknown>();\n\n @state() private _resizingColKey: string | undefined = undefined;\n @state() private _animatingColKeys = new Set<string>();\n @state() private _selectedKeys = new Set<string>();\n /** Not reactive: `_onScroll` only re-renders when the row window actually moves. */\n private _scrollTop = 0;\n /** Not reactive: columns aren't virtualised, so render never reads it. */\n private _scrollLeft = 0;\n @state() private _viewportH = 300;\n @state() private _viewportW = 600;\n @state() private _collapsedGroups = new Set<string>();\n @state() private _editing: { rowKey: string; colKey: string } | null = null;\n @state() private _editingRow: string | null = null;\n @state() private _lastClick: { key: string; col: string; time: number } | null = null;\n @state() private _lastClickedCell: { rowKey: string; colKey: string } | null = null;\n @state() private _editValue: unknown = ``;\n\n @query(`.viewport`) private _viewportEl!: HTMLElement;\n @query(`.header-scroll`) private _headerScrollEl!: HTMLElement;\n #viewportResizeObserver?: ResizeObserver;\n\n private _tickled = new TickledController<string>(this, {\n getItems: () => this.#tickledItems ??= this._flat.map(f => ({ id: f.key, enabled: f.type === `row` })),\n onStateChange: () => this.requestUpdate(),\n hoverDisabled: () => this.#nativeDrag.isDragging,\n });\n\n #nativeDragging = false;\n #dragOriginKey: string | undefined;\n #postDragSuppressTimer = 0;\n #pointerEventSuppressess = new WeakMap<PointerEvent, boolean>();\n\n readonly #nativeDrag = new ListNativeDragController<unknown>(this, {\n source: `data-grid`,\n isEnabled: () => this.itemsDraggable && this.selectionMode !== `none` && this._flat.some(f => f.type === `row`),\n resolveEventToKey: (target) => {\n if (!(target instanceof Element))\n return undefined;\n // Column-header reorder uses pointer drag on `.header-cell` — never a row drag.\n if (target.closest?.(`.header-cell`))\n return undefined;\n const row = target.closest?.(`.row`) as HTMLElement | null;\n return row?.dataset.key;\n },\n prepareSelection: originKey => this.#prepareNativeDrag(originKey),\n getMetrics: () => ({ rowHeight: this.rowHeight }),\n getRenderer: () => this.dragPreviewRenderer,\n getDragPreviewSourceResolver: () => this.dragPreviewSource,\n dispatch: detail => this.dispatchEvent(new CustomEvent<ListNativeDragStartDetail<unknown>>(`list-native-drag-start`, {\n detail,\n bubbles: true,\n composed: true,\n cancelable: true,\n })),\n onActiveChange: (active, originKey) => {\n this.#nativeDragging = active;\n this.#dragOriginKey = active ? originKey : undefined;\n this.toggleAttribute(`data-native-dragging`, active);\n if (active) {\n const count = this._selectedKeys.size;\n this.setAttribute(`aria-label`, count <= 1 ? `Dragging 1 item` : `Dragging ${count} items`);\n } else {\n this.removeAttribute(`aria-label`);\n }\n this.requestUpdate();\n },\n onEnd: () => {\n this.#nativeDragging = false;\n this.#dragOriginKey = undefined;\n this.toggleAttribute(`data-native-dragging`, false);\n this.removeAttribute(`aria-label`);\n this.#startPostDragSuppressTimer();\n },\n });\n\n #prepareNativeDrag(originKey: string): { origin: ListDragEntry<unknown>; selected: Array<ListDragEntry<unknown>> } | undefined {\n const rows = this._flat.filter(f => f.type === `row`);\n if (!rows.some(f => f.key === originKey))\n return undefined;\n if (!this._selectedKeys.has(originKey))\n this._replaceSelection(originKey);\n const selected: Array<ListDragEntry<unknown>> = [];\n let displayIndex = 0;\n for (const entry of rows) {\n if (!this._selectedKeys.has(entry.key)) {\n displayIndex++;\n continue;\n }\n const rowEl = this.renderRoot.querySelector(`.row[data-key=\"${CSS.escape(entry.key)}\"]`) ?? undefined;\n selected.push({\n key: entry.key,\n index: displayIndex,\n item: entry.row,\n ...(rowEl ? { element: rowEl as Element } : {}),\n });\n displayIndex++;\n }\n const origin = selected.find(entry => entry.key === originKey);\n if (!origin)\n return undefined;\n return { origin, selected };\n }\n\n #startPostDragSuppressTimer(): void {\n if (this.#postDragSuppressTimer)\n clearTimeout(this.#postDragSuppressTimer);\n this.#postDragSuppressTimer = window.setTimeout(() => {\n this.#postDragSuppressTimer = 0;\n }, 0);\n }\n\n private _sortedRows: unknown[] = [];\n private _flat: Array<{ type: `group`; key: string; label: string; count: number } | { type: `row`; key: string; row: unknown; idx: number }> = [];\n private _flatKeys: string[] = [];\n #flatIndexByKey = new Map<string, number>();\n /** Bumped whenever `_flat` changes; drives `#noteFlatMutation`. */\n #flatVersion = 0;\n #notedFlatVersion = -1;\n /** Inputs `_sortedRows` / `_flat` were last derived from — see `#syncDerivedRows`. */\n #sortInputs: readonly unknown[] | undefined;\n #flatInputs: readonly unknown[] | undefined;\n /** `_flat` projected for the tickled controller, cached until `_flat` changes. */\n #tickledItems: ReadonlyArray<{ id: string; enabled: boolean }> | undefined;\n\n #searchRegistry: CommandRegistry<unknown> | undefined;\n #unregisterSearchCommands: (() => void) | undefined;\n #searchKeyByRow = new Map<unknown, string>();\n\n /** Incremental search (navigate / select / filter). See `docs/infra-incremental.md`. */\n readonly search = new ListSearchController<unknown>(this, {\n adapter: this.#createSearchAdapter(),\n });\n\n /** Command registry carrying this grid's `list.search.*` commands. */\n get registry(): CommandRegistry<unknown> | undefined {\n return this.#searchRegistry;\n }\n\n #rowSearchText(row: unknown): string {\n if (this.rowSearchText)\n return this.rowSearchText(row);\n const rec = row as Record<string, unknown>;\n return this._visibleColumns.map(c => String(rec[c.key] ?? ``)).join(` `);\n }\n\n #createSearchAdapter(): ListSearchAdapter<unknown> {\n return {\n getItems: () => {\n this.#searchKeyByRow.clear();\n this._sortedRows.forEach((r, i) => this.#searchKeyByRow.set(r, this.getRowKey(r, i)));\n return this._sortedRows;\n },\n getLabel: row => this.#rowSearchText(row),\n getKey: row => this.#searchKeyByRow.get(row) ?? String(this._sortedRows.indexOf(row)),\n focusItem: (row) => {\n if (row === undefined)\n return;\n const key = this.#searchKeyByRow.get(row);\n if (key !== undefined)\n this.tickleRow(key);\n },\n selectItems: (rows) => {\n this.selectKeys(rows.map(r => this.#searchKeyByRow.get(r)).filter((k): k is string => k !== undefined));\n },\n applyFilter: (matched) => {\n this.filterPredicate = matched === undefined\n ? undefined\n : (row) => {\n const k = this.#searchKeyByRow.get(row);\n return k === undefined || matched.has(k);\n };\n },\n // No character highlights: match positions index into the whole-row search\n // text, which spans multiple cells, so they can't be mapped to one cell.\n };\n }\n\n #effectiveSearchModes(): ListSearchMode[] {\n const raw = this.searchModes?.trim();\n if (raw === undefined)\n return [...LIST_SEARCH_MODES];\n const requested = new Set(raw.split(/\\s+/));\n return LIST_SEARCH_MODES.filter(m => requested.has(m));\n }\n\n #syncSearchCommands(): void {\n if (!this.#searchRegistry)\n return;\n this.search.setModes(this.#effectiveSearchModes());\n this.#unregisterSearchCommands?.();\n this.#unregisterSearchCommands = registerListSearchCommands(this.#searchRegistry, this.search);\n }\n\n /** Row-key snapshot from the previous update, for the insertion / removal animation. */\n #prevFlatKeys: string[] = [];\n #enteringRowKeys = new Set<string>();\n #rowReflowTimer = 0;\n #dataGridRenderedOnce = false;\n private _visibleColumns: DataGridColumn[] = [];\n private _colOffsets: number[] = [];\n private _colWidthSum = 0;\n private _raf = 0;\n #viewportChangeRaf = 0;\n /** Key sets as of the last `datagrid-viewport-change` dispatch, for dedupe. */\n #lastViewportRenderedKeys: readonly string[] | undefined;\n #lastViewportVisibleKeys: readonly string[] | undefined;\n #resortRaf = 0;\n private _drag: { pointerId: number; from: number; startX: number; startY: number; active: boolean; ghost: DragGhost | null; gap: number | undefined; sourceCol: DataGridColumn } | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute(`tabindex`))\n this.tabIndex = 0;\n this.addEventListener(`keydown`, this._onKeyDown as EventListener);\n this.addEventListener(`focusout`, this._onFocusOut as EventListener);\n this.#searchRegistry ??= createCommandRegistry();\n this.#syncSearchCommands();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`keydown`, this._onKeyDown as EventListener);\n this.removeEventListener(`focusout`, this._onFocusOut as EventListener);\n cancelAnimationFrame(this._raf);\n cancelAnimationFrame(this.#viewportChangeRaf);\n this.#viewportChangeRaf = 0;\n this.#unregisterSearchCommands?.();\n this.#unregisterSearchCommands = undefined;\n this.#searchRegistry = undefined;\n if (this.#rowReflowTimer) {\n clearTimeout(this.#rowReflowTimer);\n this.#rowReflowTimer = 0;\n }\n if (this.#postDragSuppressTimer) {\n clearTimeout(this.#postDragSuppressTimer);\n this.#postDragSuppressTimer = 0;\n }\n this.#viewportResizeObserver?.disconnect();\n this.#viewportResizeObserver = undefined;\n }\n\n /**\n * Dispatch a command to this grid — routes through the command registry so\n * `list.search.*` (and any other registered commands) work.\n */\n dispatch(commandId: CommandId, args?: Record<string, unknown>): void {\n this.#searchRegistry?.invoke(commandId, args);\n }\n\n private _onFocusOut = (e: FocusEvent): void => {\n if (this._suppressBlurCommit)\n return;\n if (this.editability === `immediate`)\n return;\n if (!this._editing && !this._editingRow)\n return;\n const next = e.relatedTarget as Node | null;\n if (next && this.contains(next))\n return;\n // focus moved outside component → revert editors\n this._editing = null;\n this._editingRow = null;\n this.requestUpdate();\n };\n\n protected override firstUpdated(): void {\n this.#viewportResizeObserver = new ResizeObserver(() => this.#measureViewport());\n this.#viewportResizeObserver.observe(this._viewportEl);\n this.#measureViewport();\n }\n\n /**\n * Re-read the viewport's size and update `_viewportH`/`_viewportW` if it\n * changed. A zero-sized read (e.g. while hosted in a hidden/inactive dock\n * tab) is ignored so it never clobbers the last known-good geometry — the\n * observer fires again with the real size once the host becomes visible.\n */\n #measureViewport(): void {\n if (!this._viewportEl)\n return;\n const w = this._viewportEl.clientWidth;\n const h = this._viewportEl.clientHeight;\n if (w <= 0 || h <= 0)\n return;\n if (w === this._viewportW && h === this._viewportH)\n return;\n this._viewportW = w;\n this._viewportH = h;\n this.#scheduleViewportChangeEmit();\n }\n\n /**\n * Force a fresh re-measure of the viewport and re-render. Normally\n * unnecessary — a `ResizeObserver` tracks the viewport automatically — but\n * gives a consumer an escape hatch to recover if an ancestor's\n * layout/visibility changes without the observer noticing (matches\n * `ixfx-grid-list`'s `refreshLayout()`).\n */\n refreshLayout(): void {\n this.#measureViewport();\n this.requestUpdate();\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has(`rows`) || changed.has(`sortState`) || changed.has(`columns`) || changed.has(`groupBy`) || changed.has(`groupLabel`) || changed.has(`filterPredicate`) || changed.has(`rowHeight`)) {\n // Row set / layout shift can move the window without a scroll event.\n this.#scheduleViewportChangeEmit();\n }\n if (changed.has(`_editing`) || changed.has(`_editingRow`)) {\n // The edited row is always in the DOM in this same update (see the pinned row in render()).\n void this.updateComplete.then(() => {\n let sel: string | null = null;\n if (this._editing)\n sel = `.row[data-key=\"${this._editing.rowKey}\"] .cell[data-col=\"${this._editing.colKey}\"] input, .row[data-key=\"${this._editing.rowKey}\"] .cell[data-col=\"${this._editing.colKey}\"] select`;\n else if (this._editingRow)\n sel = `.row[data-key=\"${this._editingRow}\"] .cell input, .row[data-key=\"${this._editingRow}\"] .cell select`;\n if (!sel)\n return;\n const el = this.renderRoot.querySelector(sel) as HTMLElement | null;\n el?.focus();\n if (el instanceof HTMLInputElement && el.type === `text`)\n el.select();\n });\n }\n }\n\n protected override willUpdate(changed: Map<string, unknown>): void {\n super.willUpdate(changed);\n this.setAttribute(`data-input-mode`, this._tickled.inputMode);\n if (changed.has(`searchModes`)) {\n this.#syncSearchCommands();\n }\n this.#syncDerivedRows();\n this._visibleColumns = this.columns.filter(c => c.visible !== false);\n let off = 0;\n this._colOffsets = this._visibleColumns.map((c) => {\n const o = off;\n off += c.width ?? 150;\n return o;\n });\n this._colWidthSum = off;\n if (this.interactionMode === `checked`)\n this._colWidthSum += 28;\n if (this.#flatVersion !== this.#notedFlatVersion) {\n this.#notedFlatVersion = this.#flatVersion;\n this.#noteFlatMutation();\n }\n }\n\n /**\n * Re-derive `_sortedRows` / `_flat` only when one of their inputs changed\n * identity. Scroll, hover, selection and edit-state updates touch none of\n * them, so those frames cost O(window) instead of O(rows).\n */\n #syncDerivedRows(): void {\n const sortInputs = [this.rows, this.sortState, this.columns];\n const flatInputs = [this.filterPredicate, this.groupBy, this.groupLabel, this._collapsedGroups, this.getRowKey];\n const resort = !sameRefs(this.#sortInputs, sortInputs);\n if (resort) {\n this.#sortInputs = sortInputs;\n this._sortedRows = this._applySort([...this.rows]);\n }\n if (resort || !sameRefs(this.#flatInputs, flatInputs)) {\n this.#flatInputs = flatInputs;\n this._rebuildFlat();\n }\n }\n\n /** Mark the derived rows as matching the current inputs (after an incremental update). */\n #markDerivedRowsSynced(): void {\n this.#sortInputs = [this.rows, this.sortState, this.columns];\n this.#flatInputs = [this.filterPredicate, this.groupBy, this.groupLabel, this._collapsedGroups, this.getRowKey];\n }\n\n /**\n * Diff the row-key list against the previous update. Rows that appeared get an\n * enter fade; any add/remove opens a short `[reflowing]` window so the rows\n * that shift slide (their `top` transitions) instead of snapping. Bounded in\n * time so it never bleeds into scroll virtualisation.\n */\n #noteFlatMutation(): void {\n const now = this._flatKeys;\n const prev = this.#prevFlatKeys;\n this.#prevFlatKeys = now.slice();\n if (!this.#dataGridRenderedOnce) {\n this.#dataGridRenderedOnce = true;\n return;\n }\n if (prev.length === 0 || now.length === 0) {\n this.#enteringRowKeys.clear();\n return;\n }\n const before = new Set(prev);\n const added = now.filter(k => !before.has(k));\n // Keys are unique, so whatever of `prev` didn't survive into `now` was removed.\n const removedCount = prev.length - (now.length - added.length);\n if (added.length === now.length || (added.length === 0 && removedCount === 0))\n return;\n this.#enteringRowKeys = new Set(added);\n this.toggleAttribute(`reflowing`, true);\n if (this.#rowReflowTimer)\n clearTimeout(this.#rowReflowTimer);\n this.#rowReflowTimer = window.setTimeout(() => {\n this.#rowReflowTimer = 0;\n this.#enteringRowKeys.clear();\n this.toggleAttribute(`reflowing`, false);\n this.requestUpdate();\n }, 320);\n }\n\n private _getGroupKey(row: unknown): string | null {\n if (!this.groupBy)\n return null;\n if (typeof this.groupBy === `string`)\n return String((row as Record<string, unknown>)[this.groupBy] ?? ``);\n return String((this.groupBy as (r: unknown) => string)(row));\n }\n\n private _rebuildFlat(): void {\n // Sorted indices of the rows that pass the filter — carried alongside the\n // rows so no per-row `indexOf` (which made filtering/grouping O(n²)).\n const pred = this.filterPredicate;\n const sourceIdx: number[] = [];\n for (let i = 0; i < this._sortedRows.length; i++) {\n if (!pred || pred(this._sortedRows[i]))\n sourceIdx.push(i);\n }\n const flat: typeof this._flat = [];\n const keys: string[] = [];\n const pushRow = (idx: number): void => {\n const row = this._sortedRows[idx];\n const key = this.getRowKey(row, idx);\n flat.push({ type: `row`, key, row, idx });\n keys.push(key);\n };\n if (!this.groupBy) {\n sourceIdx.forEach(pushRow);\n } else {\n const groups = new Map<string, number[]>();\n for (const idx of sourceIdx) {\n const k = this._getGroupKey(this._sortedRows[idx]) ?? ``;\n const arr = groups.get(k);\n if (arr)\n arr.push(idx); else groups.set(k, [idx]);\n }\n for (const [gKey, idxs] of groups) {\n const label = this.groupLabel ? this.groupLabel(gKey, idxs.map(i => this._sortedRows[i])) : gKey;\n const gId = `__group__${gKey}`;\n flat.push({ type: `group`, key: gId, label, count: idxs.length });\n keys.push(gId);\n if (!this._collapsedGroups.has(gKey))\n idxs.forEach(pushRow);\n }\n }\n this._flat = flat;\n this._flatKeys = keys;\n this.#rebuildFlatIndex();\n }\n\n #rebuildFlatIndex(): void {\n this.#flatIndexByKey.clear();\n this._flat.forEach((f, i) => this.#flatIndexByKey.set(f.key, i));\n this.#flatVersion++;\n this.#tickledItems = undefined;\n }\n\n /** Flat entry for a row key, or `undefined` for unknown keys and group headers. */\n #rowEntry(key: string): { row: unknown; idx: number } | undefined {\n const i = this.#flatIndexByKey.get(key);\n const entry = i === undefined ? undefined : this._flat[i];\n if (entry?.type === `row`)\n return entry;\n // Not in the flat list (filtered out / collapsed group) — fall back to a scan.\n const idx = this._sortedRows.findIndex((r, j) => this.getRowKey(r, j) === key);\n return idx < 0 ? undefined : { row: this._sortedRows[idx], idx };\n }\n\n private _toggleGroup(gKey: string): void {\n const next = new Set(this._collapsedGroups);\n if (next.has(gKey))\n next.delete(gKey); else next.add(gKey);\n this._collapsedGroups = next;\n }\n\n private _applySort(rows: unknown[]): unknown[] {\n if (!this.sortState)\n return rows;\n const col = this.columns.find(c => c.key === this.sortState!.key);\n if (!col)\n return rows;\n const dir = this.sortState.direction === `asc` ? 1 : -1;\n if (col.sortFn)\n return rows.sort((a, b) => dir * col.sortFn!(a as never, b as never));\n const dataType = col.dataType ?? `text`;\n return rows.sort((a, b) => {\n const av = (a as Record<string, unknown>)[col.key];\n const bv = (b as Record<string, unknown>)[col.key];\n if (av === bv)\n return 0;\n if (dataType === `number`)\n return dir * ((av as number) - (bv as number));\n if (dataType === `boolean`)\n return dir * ((Boolean(av) === Boolean(bv)) ? 0 : (av ? 1 : -1));\n return dir * String(av).localeCompare(String(bv));\n });\n }\n\n private _onScroll = (e: Event): void => {\n const el = e.target as HTMLElement;\n cancelAnimationFrame(this._raf);\n this._raf = requestAnimationFrame(() => {\n const before = this.#windowRows(2);\n this._scrollTop = el.scrollTop;\n this._scrollLeft = el.scrollLeft;\n if (this._headerScrollEl)\n this._headerScrollEl.scrollLeft = el.scrollLeft;\n // Rows are absolutely positioned, so a scroll that keeps the same\n // window needs no re-render at all.\n const after = this.#windowRows(2);\n if (before.start !== after.start || before.end !== after.end)\n this.requestUpdate();\n // A content/layout check may already be queued for this frame. Fold it\n // into this scroll result so there can be only one dispatch per frame.\n cancelAnimationFrame(this.#viewportChangeRaf);\n this.#viewportChangeRaf = 0;\n this.#emitViewportChangeIfChanged();\n });\n };\n\n private _onHeaderClick(col: DataGridColumn, e?: MouseEvent): void {\n if (col.sortable === false)\n return;\n if (e) {\n const pointerEvent = e.composedPath()[0] as unknown as PointerEvent | undefined;\n if (pointerEvent && this.#pointerEventSuppressess.get(pointerEvent)) {\n this.#pointerEventSuppressess.delete(pointerEvent);\n return;\n }\n }\n const prev = this.sortState;\n let next: DataGridSortState = null;\n if (!prev || prev.key !== col.key)\n next = { key: col.key, direction: `asc` };\n else if (prev.direction === `asc`)\n next = { key: col.key, direction: `desc` };\n else next = null;\n this.sortState = next;\n this.dispatchEvent(new CustomEvent<DataGridSortDetail>(`datagrid-sort`, { detail: { sort: next, previous: prev }, bubbles: true, composed: true }));\n }\n\n private _onHeaderPointerUp(col: DataGridColumn, e: PointerEvent): void {\n let stopped = false;\n const customEvent = new CustomEvent(`datagrid-header-pointerup`, {\n detail: { key: col.key, column: col },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n this.dispatchEvent(customEvent);\n if (customEvent.defaultPrevented)\n stopped = true;\n if (stopped)\n this.#pointerEventSuppressess.set(e, true);\n }\n\n private _onColButtonClick(col: DataGridColumn, e: PointerEvent): void {\n e.stopPropagation();\n const icon = col.button === false\n ? this.columnButtonIcon\n : (typeof col.button === `object` && col.button.icon) ? col.button.icon : this.columnButtonIcon;\n const target = e.currentTarget as HTMLElement;\n const customEvent = new CustomEvent(`datagrid-header-button-click`, {\n detail: { key: col.key, column: col, icon, clientX: e.clientX, clientY: e.clientY, anchorElement: target },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n this.dispatchEvent(customEvent);\n if (customEvent.defaultPrevented)\n this.#pointerEventSuppressess.set(e, true);\n }\n\n private _onRowClick(rowKey: string, col: DataGridColumn | null, e: MouseEvent): void {\n if (this.#nativeDrag.isDragging || this.#postDragSuppressTimer !== 0)\n return;\n if (col && col.selectable === false)\n return;\n if (this.selectionMode === `none` && this.interactionMode !== `checked` && this.interactionMode !== `sticky`)\n return;\n if (this.interactionMode === `manual`)\n return;\n if (this.interactionMode === `implicit`) {\n this._replaceSelection(rowKey); return;\n }\n if (this.interactionMode === `checked`)\n return;\n if (this.interactionMode === `sticky`) {\n this._toggleSelection(rowKey); return;\n }\n // standard / vscode\n if (e.ctrlKey || e.metaKey) {\n if (this.selectionMode === `multiple` || this.interactionMode === `vscode`)\n this._toggleSelection(rowKey);\n } else if (e.shiftKey && (this.selectionMode === `multiple` || this.interactionMode === `vscode`)) {\n this._rangeSelectTo(rowKey);\n } else {\n this._replaceSelection(rowKey);\n }\n }\n\n private _onCheckboxClick(rowKey: string, e: MouseEvent): void {\n e.stopPropagation();\n this._onRowClick(rowKey, null, e);\n }\n\n private _onVisibilityToggle(col: DataGridColumn, checked: boolean): void {\n col.visible = checked;\n this.columns = [...this.columns];\n this.dispatchEvent(new CustomEvent<DataGridColumnVisibilityDetail>(`datagrid-column-visibility`, { detail: { key: col.key, visible: checked }, bubbles: true, composed: true }));\n }\n\n private _beginHeaderDrag(e: PointerEvent, col: DataGridColumn, idx: number): void {\n e.stopPropagation();\n const anchor = (e.currentTarget as HTMLElement).closest(`.header-cell`) as HTMLElement ?? e.currentTarget as HTMLElement;\n this._drag = { pointerId: e.pointerId, from: idx, startX: e.clientX, startY: e.clientY, active: false, ghost: null, gap: undefined, sourceCol: col };\n const onMove = (ev: PointerEvent): void => {\n if (!this._drag || ev.pointerId !== this._drag.pointerId)\n return;\n const dx = ev.clientX - this._drag.startX;\n const dy = ev.clientY - this._drag.startY;\n if (!this._drag.active) {\n if (Math.hypot(dx, dy) < 5)\n return;\n this._drag.active = true;\n const content = document.createElement(`span`);\n content.textContent = col.label;\n try {\n this._drag.ghost = createDragGhost({ anchor, content });\n this._drag.ghost.move(ev.clientX, ev.clientY);\n } catch { /* ignore */ }\n try {\n this._headerScrollEl?.setPointerCapture(ev.pointerId);\n } catch { /* ignore */ }\n }\n this._drag.ghost?.move(ev.clientX, ev.clientY);\n const x = ev.clientX - (this._headerScrollEl?.getBoundingClientRect().left ?? 0) + (this._headerScrollEl?.scrollLeft ?? 0);\n let gap = this._drag.from;\n let bestDist = Infinity;\n for (let i = 0; i < this._visibleColumns.length; i++) {\n if (i === this._drag.from)\n continue;\n const rectLeft = this._colOffsets[i];\n const rectRight = rectLeft + (this._visibleColumns[i].width ?? 150);\n const mid = (rectLeft + rectRight) / 2;\n // gap before i\n const gapPos = x < mid ? rectLeft : rectRight;\n const gapIdx = x < mid ? i : i + 1;\n const d = Math.abs(x - gapPos);\n if (d < bestDist) {\n bestDist = d; gap = gapIdx > this._drag.from ? gapIdx - 1 : gapIdx;\n }\n }\n // handle gap after last\n if (this._visibleColumns.length > 0) {\n const lastOff = this._colOffsets[this._colOffsets.length - 1] + (this._visibleColumns[this._visibleColumns.length - 1].width ?? 150);\n const d = Math.abs(x - lastOff);\n if (d < bestDist) {\n bestDist = d; gap = this._visibleColumns.length - 1; if (this._drag.from === this._visibleColumns.length - 1)\n gap = this._drag.from; else if (gap >= this._drag.from)\n gap = this._visibleColumns.length - 1;\n }\n }\n // normalized gap for reorder (visible index without source)\n const siblings = this._visibleColumns.length - 1;\n let normalizedGap = gap;\n if (normalizedGap < 0)\n normalizedGap = 0;\n if (normalizedGap > siblings)\n normalizedGap = siblings;\n this._drag.gap = normalizedGap;\n this.requestUpdate();\n };\n const onUp = (ev: PointerEvent): void => {\n if (!this._drag || ev.pointerId !== this._drag.pointerId)\n return;\n const active = this._drag.active;\n const from = this._drag.from;\n const gap = this._drag.gap;\n this._drag.ghost?.destroy();\n try {\n this._headerScrollEl?.releasePointerCapture(ev.pointerId);\n } catch { /* ignore */ }\n window.removeEventListener(`pointermove`, onMove);\n window.removeEventListener(`pointerup`, onUp);\n window.removeEventListener(`pointercancel`, onUp);\n this._drag = null;\n this.requestUpdate();\n if (active && gap !== undefined && gap !== from) {\n // convert visible gap to actual reorder (filter hidden)\n this._onReorderDrag(from, gap);\n }\n };\n window.addEventListener(`pointermove`, onMove);\n window.addEventListener(`pointerup`, onUp);\n window.addEventListener(`pointercancel`, onUp as EventListener);\n }\n\n private _onReorderDrag(fromIdx: number, toIdx: number): void {\n if (fromIdx === toIdx)\n return;\n const cols = [...this.columns];\n const vis = cols.filter(c => c.visible !== false);\n const hidden = cols.filter(c => c.visible === false);\n const [moved] = vis.splice(fromIdx, 1);\n vis.splice(toIdx, 0, moved);\n this.columns = [...vis, ...hidden];\n this.dispatchEvent(new CustomEvent<DataGridColumnReorderDetail>(`datagrid-column-reorder`, { detail: { from: fromIdx, to: toIdx, columns: [...this.columns] }, bubbles: true, composed: true }));\n }\n\n private _anchorKey: string | undefined;\n\n private _scrollRowIntoView(key: string): void {\n const idx = this.#flatIndexByKey.get(key);\n if (idx === undefined || !this._viewportEl)\n return;\n const rh = this.rowHeight;\n const headerAbove = idx > 0 && this._flat[idx - 1].type === `group`;\n const top = (headerAbove ? idx - 1 : idx) * rh;\n const bottom = (idx + 1) * rh;\n const vt = this._viewportEl.scrollTop;\n const vh = this._viewportEl.clientHeight;\n let next = vt;\n if (top < vt) {\n next = top;\n } else if (bottom > vt + vh) {\n next = bottom - vh;\n }\n if (next !== vt) {\n this._viewportEl.scrollTop = next;\n this._scrollTop = next;\n this.requestUpdate();\n }\n }\n\n private _getRowForKey(key: string): unknown | undefined {\n const i = this.#flatIndexByKey.get(key);\n const entry = i === undefined ? undefined : this._flat[i];\n return entry?.type === `row` ? entry.row : undefined;\n }\n\n // --- Public keyed API ---\n\n /** The selected row keys (read-only). */\n get selectedKeys(): ReadonlySet<string> {\n return this._selectedKeys;\n }\n\n /** Replace the selection with these row keys (clamped to known rows). */\n set selectedKeys(keys: Iterable<string>) {\n this.selectKeys(keys);\n }\n\n /**\n * Replace the selection with the given row keys. Unknown keys are dropped;\n * in a single-select mode only the last surviving key is kept;\n * `selectionMode=\"none\"` clears. Fires `datagrid-select` with the previous\n * set when the selection actually changes.\n */\n selectKeys(keys: Iterable<string>): void {\n let next = new Set([...keys].filter(k => this._getRowForKey(k) !== undefined));\n const multi = this.selectionMode === `multiple`\n || this.interactionMode === `checked`\n || this.interactionMode === `sticky`\n || this.interactionMode === `vscode`;\n if (this.selectionMode === `none`) {\n next = new Set();\n } else if (!multi && next.size > 1) {\n const last = [...next].at(-1);\n next = last === undefined ? new Set() : new Set([last]);\n }\n const prev = new Set(this._selectedKeys);\n if (prev.size === next.size && [...next].every(k => prev.has(k)))\n return;\n this._selectedKeys = next;\n this._anchorKey = [...next].at(-1);\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, {\n detail: { selectedKeys: new Set(next), previous: prev },\n bubbles: true,\n composed: true,\n }));\n }\n\n /** The row key under the cursor, or `undefined`. */\n get tickledKey(): string | undefined {\n return this._tickled.tickledId;\n }\n\n /** Move the cursor to this row key and scroll it into view. */\n tickleRow(key: string): void {\n if (!this.#flatIndexByKey.has(key) || key.startsWith(`__group__`))\n return;\n this._tickled.focus(key);\n this._scrollRowIntoView(key);\n }\n\n /**\n * Append rows without the full O(n log n) rebuild that reassigning `rows`\n * incurs. `rows` still gets a new array reference (reactivity is preserved),\n * but the derived arrays are extended over the appended slice only. When a\n * sort is active the new rows show unsorted for one frame, then a single\n * coalesced re-sort runs. Scroll position, selection and cursor are kept.\n */\n appendRows(rows: readonly unknown[]): void {\n if (rows.length === 0)\n return;\n const startIdx = this.rows.length;\n // Only extend in place if the derived arrays are current; otherwise let\n // `willUpdate` do its normal full rebuild.\n const inSync = this._sortedRows.length === startIdx && sameRefs(this.#sortInputs, [this.rows, this.sortState, this.columns]);\n this.rows = [...this.rows, ...rows];\n if (!inSync)\n return;\n const appended = this.rows.slice(startIdx);\n this._sortedRows = [...this._sortedRows, ...appended];\n this.#appendToFlat(appended, startIdx);\n // The `rows` change is pending — tell `#syncDerivedRows` it's already applied.\n this.#markDerivedRowsSynced();\n\n if (this.sortState != null) {\n cancelAnimationFrame(this.#resortRaf);\n this.#resortRaf = requestAnimationFrame(() => {\n this.#sortInputs = undefined;\n this.requestUpdate();\n });\n }\n }\n\n #appendToFlat(appended: readonly unknown[], startIdx: number): void {\n if (this.groupBy) {\n // grouped flat layout can't be extended in place — rebuild it\n this._rebuildFlat();\n return;\n }\n for (let j = 0; j < appended.length; j++) {\n const idx = startIdx + j;\n if (this.filterPredicate && !this.filterPredicate(appended[j]))\n continue;\n const key = this.getRowKey(appended[j], idx);\n this._flat.push({ type: `row`, key, row: appended[j], idx });\n this._flatKeys.push(key);\n this.#flatIndexByKey.set(key, this._flat.length - 1);\n }\n this.#flatVersion++;\n this.#tickledItems = undefined;\n }\n\n private _replaceSelection(key: string): void {\n if (this.selectionMode === `none`)\n return;\n const prev = new Set(this._selectedKeys);\n if (this.groupBy && !this.crossGroupSelection) {\n const g = this._getGroupKey(this._getRowForKey(key) ?? { key });\n const keep = [...prev].filter(k => this._getGroupKey(this._getRowForKey(k) ?? { key: k }) === g);\n // cross-group off → keep only same-group, then replace\n this._selectedKeys = new Set([key]);\n void keep;\n } else {\n this._selectedKeys = new Set([key]);\n }\n this._anchorKey = key;\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n }\n\n private _toggleSelection(key: string): void {\n const prev = new Set(this._selectedKeys);\n const next = new Set(this._selectedKeys);\n if (next.has(key)) {\n next.delete(key);\n } else {\n if (this.groupBy && !this.crossGroupSelection) {\n const g = this._getGroupKey(this._getRowForKey(key) ?? { key });\n for (const k of [...next]) {\n if (this._getGroupKey(this._getRowForKey(k) ?? { key: k }) !== g)\n next.delete(k);\n }\n }\n if (this.selectionMode !== `multiple` && this.interactionMode !== `checked` && this.interactionMode !== `sticky`)\n next.clear();\n next.add(key);\n }\n this._selectedKeys = next;\n this._anchorKey = key;\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n }\n\n private _rangeSelectTo(key: string): void {\n if (!this._anchorKey) {\n this._replaceSelection(key); return;\n }\n const keys = this._flat.filter(f => f.type === `row`).map(f => f.key);\n const a = keys.indexOf(this._anchorKey);\n const b = keys.indexOf(key);\n if (a < 0 || b < 0) {\n this._replaceSelection(key); return;\n }\n if (this.groupBy && !this.crossGroupSelection) {\n const anchorGroup = this._getGroupKey(this._getRowForKey(this._anchorKey) ?? { key: this._anchorKey });\n const targetGroup = this._getGroupKey(this._getRowForKey(key) ?? { key });\n if (anchorGroup !== targetGroup) {\n this._replaceSelection(key); return;\n }\n // restrict range to rows of that group\n const groupKeys = keys.filter(k => this._getGroupKey(this._getRowForKey(k) ?? { key: k }) === anchorGroup);\n const ga = groupKeys.indexOf(this._anchorKey);\n const gb = groupKeys.indexOf(key);\n if (ga < 0 || gb < 0) {\n this._replaceSelection(key); return;\n }\n const lo = Math.min(ga, gb); const hi = Math.max(ga, gb);\n const prev = new Set(this._selectedKeys);\n this._selectedKeys = new Set(groupKeys.slice(lo, hi + 1));\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n return;\n }\n const lo = Math.min(a, b); const hi = Math.max(a, b);\n const prev = new Set(this._selectedKeys);\n this._selectedKeys = new Set(keys.slice(lo, hi + 1));\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n }\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === `a`) {\n if (this.selectionMode === `multiple` || this.interactionMode === `checked` || this.interactionMode === `sticky` || this.interactionMode === `vscode` || this.interactionMode === `standard`) {\n e.preventDefault();\n const prev = new Set(this._selectedKeys);\n if (this.groupBy && !this.crossGroupSelection && this._anchorKey) {\n const g = this._getGroupKey(this._getRowForKey(this._anchorKey) ?? { key: this._anchorKey });\n this._selectedKeys = new Set(this._flat.filter(f => f.type === `row` && this._getGroupKey((f as { row: unknown }).row) === g).map(f => f.key));\n } else {\n this._selectedKeys = new Set(this._flat.filter(f => f.type === `row`).map(f => f.key));\n }\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n }\n return;\n }\n // If editing, Up/Down commits and moves to same column in adjacent row\n if (this._editing && (e.key === `ArrowDown` || e.key === `ArrowUp`)) {\n const active = this.shadowRoot?.activeElement as HTMLElement | null;\n if (active?.tagName === `SELECT`)\n return; // let native select handle\n e.preventDefault();\n const cur = this._editing;\n const dir = e.key === `ArrowDown` ? 1 : -1;\n const colKey = cur.colKey;\n this._suppressBlurCommit = true;\n this._commitEdit();\n const rowKeys = this._flat.filter(f => f.type === `row`).map(f => f.key);\n const idx = rowKeys.indexOf(cur.rowKey);\n let nextIdx = idx + dir;\n while (nextIdx >= 0 && nextIdx < rowKeys.length) {\n const nk = rowKeys[nextIdx];\n const row = this.#rowEntry(nk)?.row;\n const col = this._visibleColumns.find(c => c.key === colKey);\n if (row && col && this._isEditable(row, col)) {\n this._startEdit(nk, colKey);\n this._tickled.handleKeyboardNavigation(nextIdx > idx ? `next` : `previous`);\n this._scrollRowIntoView(nk);\n break;\n }\n nextIdx += dir;\n }\n if (nextIdx < 0 || nextIdx >= rowKeys.length) {\n // no editable target, stay on current row tickled\n this._tickled.handleKeyboardNavigation(dir > 0 ? `next` : `previous`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n }\n requestAnimationFrame(() => {\n this._suppressBlurCommit = false;\n });\n return;\n }\n if (e.key === `ArrowDown` || e.key === `ArrowUp` || e.key === `Home` || e.key === `End`) {\n e.preventDefault();\n this._tickled.setInputMode(`keyboard`);\n }\n switch (e.key) {\n case `ArrowDown`: {\n this._tickled.handleKeyboardNavigation(`next`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n if (this.interactionMode === `implicit` && this._tickled.tickledId)\n this._replaceSelection(this._tickled.tickledId);\n if (e.shiftKey && (this.interactionMode === `standard` || this.interactionMode === `vscode`) && this._tickled.tickledId)\n this._rangeSelectTo(this._tickled.tickledId);\n break;\n }\n case `ArrowUp`: {\n this._tickled.handleKeyboardNavigation(`previous`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n if (this.interactionMode === `implicit` && this._tickled.tickledId)\n this._replaceSelection(this._tickled.tickledId);\n if (e.shiftKey && (this.interactionMode === `standard` || this.interactionMode === `vscode`) && this._tickled.tickledId)\n this._rangeSelectTo(this._tickled.tickledId);\n break;\n }\n case `Home`: {\n this._tickled.handleKeyboardNavigation(`first`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n break;\n }\n case `End`: {\n this._tickled.handleKeyboardNavigation(`last`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n break;\n }\n case `Enter`: {\n const key = this._tickled.tickledId;\n if (!key)\n break;\n e.preventDefault();\n if (!this._editing && this.editability === `user`) {\n const entry = this.#rowEntry(key);\n if (entry) {\n const row = entry.row;\n // prefer lastClickedCell if it is in this row and editable\n if (this._lastClickedCell?.rowKey === key) {\n const col = this._visibleColumns.find(c => c.key === this._lastClickedCell!.colKey);\n if (col && this._isEditable(row, col)) {\n this._startEdit(key, col.key); break;\n }\n }\n const firstEditable = this._visibleColumns.find(c => this._isEditable(row, c));\n if (firstEditable) {\n this._startEdit(key, firstEditable.key); break;\n }\n }\n }\n if (!this._editing) {\n const entry = this.#rowEntry(key);\n const idx = entry?.idx ?? -1;\n if (this._selectedKeys.has(key)) {\n this._activateRow(key, entry?.row, idx);\n break;\n }\n if (this.interactionMode !== `manual` && this.interactionMode !== `checked`)\n this._replaceSelection(key);\n this.dispatchEvent(new CustomEvent<DataGridCellClickDetail>(`datagrid-cell-click`, { detail: { rowKey: key, colKey: ``, rowIndex: idx, colIndex: -1 }, bubbles: true, composed: true }));\n }\n break;\n }\n case ` `: {\n if (this._editing) {\n const col = this.columns.find(c => c.key === this._editing!.colKey);\n const effectiveDataType = col?.dataType ?? `text`;\n if (effectiveDataType === `boolean`) {\n e.preventDefault();\n const isImmediate = this.editability === `immediate`;\n const rowKey = this._editing.rowKey;\n const colKey = this._editing.colKey;\n // Toggle: use checkbox checked if focused, else flip _editValue / row value\n const active = this.shadowRoot?.activeElement as HTMLInputElement | null;\n let next: boolean;\n if (active?.type === `checkbox`) {\n next = !active.checked;\n active.checked = next;\n } else {\n const row = this.#rowEntry(rowKey)?.row as Record<string, unknown> | undefined;\n const cur = this._editValue !== `` ? Boolean(this._editValue) : Boolean(row?.[colKey]);\n next = !cur;\n }\n if (isImmediate) {\n this._commitImmediate(rowKey, colKey, next);\n } else {\n this._editValue = next; this._commitEdit();\n }\n }\n break;\n }\n const key = this._tickled.tickledId;\n if (!key)\n break;\n e.preventDefault();\n if (this.interactionMode === `checked` || this.interactionMode === `sticky` || this.interactionMode === `standard` || this.interactionMode === `vscode` || this.interactionMode === `manual`)\n this._toggleSelection(key);\n else this._replaceSelection(key);\n break;\n }\n case `Escape`: {\n if (this._editing || this._editingRow) {\n e.preventDefault(); this._editing = null; this._editingRow = null; this.requestUpdate();\n } else if (this._selectedKeys.size) {\n e.preventDefault(); const prev = new Set(this._selectedKeys); this._selectedKeys = new Set(); this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(), previous: prev }, bubbles: true, composed: true }));\n }\n break;\n }\n }\n };\n\n private _isEditable(row: unknown, col: DataGridColumn): boolean {\n if (this.editability === `disabled`)\n return false;\n if (typeof this.editable === `function`)\n return (this.editable as (r: unknown, c: DataGridColumn) => boolean)(row, col);\n if (this.editable === true)\n return col.editable !== false;\n return !!col.editable;\n }\n\n private _isTextEditor(col: DataGridColumn): boolean {\n const e = col.editor;\n return !e || e === `auto`;\n }\n\n private _isCellEditing(rowKey: string, colKey: string): boolean {\n if (this.editability === `immediate` && this._isEditable(this.#rowEntry(rowKey)?.row ?? {}, this.columns.find(c => c.key === colKey)!))\n return true;\n if (this._editingRow === rowKey)\n return this._isEditable(this.#rowEntry(rowKey)?.row ?? {}, this.columns.find(c => c.key === colKey)!);\n return this._editing?.rowKey === rowKey && this._editing?.colKey === colKey;\n }\n\n private _activateRow(rowKey: string, row: unknown, rowIndex: number): void {\n this.dispatchEvent(new CustomEvent<DataGridRowActivateDetail>(`datagrid-row-activate`, { detail: { rowKey, row, rowIndex }, bubbles: true, composed: true }));\n }\n\n private _startEdit(rowKey: string, colKey: string): void {\n if (this.editability === `disabled`)\n return;\n const row = this.#rowEntry(rowKey)?.row;\n if (!row)\n return;\n const col = this.columns.find(c => c.key === colKey);\n if (!col || !this._isEditable(row, col))\n return;\n this._editing = { rowKey, colKey };\n this._editingRow = null;\n this._editValue = (row as Record<string, unknown>)[colKey];\n }\n\n /** Programmatic: put a single cell in edit mode. Works in manual/user/immediate (no-op if disabled or not editable). */\n startEdit(rowKey: string, colKey: string): void {\n this._startEdit(rowKey, colKey);\n }\n\n /** Programmatic: put all editable cells of a row in edit mode. */\n startRowEdit(rowKey: string): void {\n if (this.editability === `disabled`)\n return;\n const row = this.#rowEntry(rowKey)?.row;\n if (!row)\n return;\n this._editing = null;\n this._editingRow = rowKey;\n this.requestUpdate();\n }\n\n stopEdit(): void {\n this._editing = null; this._editingRow = null;\n }\n\n setColumnFormatter(columnKey: string, formatter: ((value: unknown) => unknown) | BuiltInFormatterName | null, options?: BuiltInFormatterOptions): void {\n if (!formatter) {\n this._columnFormatters.delete(columnKey); this.requestUpdate(); return;\n }\n if (typeof formatter === `string`) {\n const digits = options?.digits ?? (formatter === `integer` ? 0 : 2);\n if (formatter === `fixed`)\n this._columnFormatters.set(columnKey, v => typeof v === `number` && Number.isFinite(v) ? v.toFixed(digits) : String(v ?? ``));\n else if (formatter === `percentage`)\n this._columnFormatters.set(columnKey, v => typeof v === `number` && Number.isFinite(v) ? `${v.toFixed(digits)}%` : String(v ?? ``));\n else if (formatter === `integer`)\n this._columnFormatters.set(columnKey, v => typeof v === `number` && Number.isFinite(v) ? Math.round(v).toString() : String(v ?? ``));\n } else {\n this._columnFormatters.set(columnKey, formatter as (value: unknown) => unknown);\n }\n this.requestUpdate();\n }\n\n private _formatValue(value: unknown, col: DataGridColumn, row: unknown): unknown {\n const perCol = this._columnFormatters.get(col.key);\n if (perCol)\n return perCol(value);\n if (col.formatter)\n return col.formatter(value, row, col);\n if (this.globalFormatter)\n return this.globalFormatter(value, col.key, row);\n return value;\n }\n\n /**\n * Resolve the per-row appearance for the cell at `colKey`, honouring the\n * nominated columns. Additive — `col.renderer` / `col.formatter` still own\n * the cell's value; this only decorates it. Returns all-`undefined` for\n * every cell when nothing is nominated (the common case).\n */\n private _cellLook(row: unknown, colKey: string): DataGridCellLook {\n if (this.textColorColumn === `` && this.iconColumn === `` && this.badgeColumn === ``)\n return EMPTY_CELL_LOOK;\n const rec = (typeof row === `object` && row !== null ? row : {}) as Record<string, unknown>;\n const textColor = colKey === this.textColorColumn ? appearanceColor(rec.textColor) : undefined;\n const icon = colKey === this.iconColumn && !appearanceAbsent(rec.icon) ? rec.icon : undefined;\n const iconColor = icon === undefined ? undefined : appearanceColor(rec.iconColor);\n const badge = colKey === this.badgeColumn && !appearanceAbsent(rec.badge) ? rec.badge : undefined;\n if (textColor === undefined && icon === undefined && badge === undefined)\n return EMPTY_CELL_LOOK;\n return { textColor, icon, iconColor, badge };\n }\n\n private _handleCellSecondClick(rowKey: string, col: DataGridColumn): void {\n if (this.editability !== `user`)\n return;\n const now = Date.now();\n if (this._lastClick && this._lastClick.key === rowKey && this._lastClick.col === col.key && now - this._lastClick.time < 700 && now - this._lastClick.time > 150) {\n this._startEdit(rowKey, col.key);\n this._lastClick = null;\n } else {\n this._lastClick = { key: rowKey, col: col.key, time: now };\n }\n }\n\n private _commitEdit(fromImmediate = false): void {\n // immediate/row-edit: commit uses current _editValue or val; keep simple single-cell path\n if (!this._editing && !fromImmediate)\n return;\n const target = this._editing;\n if (!target)\n return;\n const { rowKey, colKey } = target;\n const row = this.#rowEntry(rowKey)?.row as Record<string, unknown> | undefined;\n if (!row) {\n this._editing = null; return;\n }\n const oldValue = row[colKey];\n const newValue = this._editValue;\n const col = this.columns.find(c => c.key === colKey);\n if (col?.editor && typeof col.editor === `function`) {\n // custom factory handles commit itself\n } else {\n row[colKey] = newValue as never;\n this.rows = [...this.rows];\n }\n this._editing = null;\n this.dispatchEvent(new CustomEvent<DataGridCellEditDetail>(`datagrid-cell-edit`, { detail: { rowKey, colKey, oldValue, newValue }, bubbles: true, composed: true }));\n }\n\n private _suppressBlurCommit = false;\n private _tabToNext(rowKey: string, curColKey: string, dir: number): void {\n const row = this.#rowEntry(rowKey)?.row;\n if (!row)\n return;\n const cols = this._visibleColumns;\n const curIdx = cols.findIndex(c => c.key === curColKey);\n let next = curIdx + dir;\n while (next >= 0 && next < cols.length) {\n if (this._isEditable(row, cols[next])) {\n // commit current before moving (use _editValue if pending)\n if (this._editing)\n this._commitEdit();\n this._suppressBlurCommit = true;\n this._startEdit(rowKey, cols[next].key);\n requestAnimationFrame(() => {\n this._suppressBlurCommit = false;\n });\n return;\n }\n next += dir;\n }\n if (this._editing)\n this._commitEdit();\n this._editing = null;\n this.requestUpdate();\n }\n\n private _commitImmediate(rowKey: string, colKey: string, value: unknown): void {\n const row = this.#rowEntry(rowKey)?.row as Record<string, unknown> | undefined;\n if (!row)\n return;\n const oldValue = row[colKey];\n if (oldValue === value)\n return;\n row[colKey] = value as never;\n this.rows = [...this.rows];\n this.dispatchEvent(new CustomEvent<DataGridCellEditDetail>(`datagrid-cell-edit`, { detail: { rowKey, colKey, oldValue, newValue: value }, bubbles: true, composed: true }));\n }\n\n /**\n * Measure the width a column would need to show its header label and every\n * row's (formatted) value without truncation, clamped to `minWidth`/`maxWidth`.\n * Values are measured from their formatted string via canvas `measureText` -\n * accurate for plain text, an estimate for anything else.\n */\n private _measureAutoWidth(col: DataGridColumn): number {\n const cs = getComputedStyle(this);\n const font = `${cs.fontSize} ${cs.fontFamily}`;\n const canvas = document.createElement(`canvas`);\n const ctx = canvas.getContext(`2d`);\n const cellPad = 24; // ~space-s + space-xs + handle-width for left-aligned items\n const headerExtra = 40; // sort icon + reorder handle + resize handle\n const measure = (text: string): number => {\n if (!ctx)\n return text.length * 8;\n ctx.font = font;\n return Math.ceil(ctx.measureText(text).width);\n };\n let maxW = measure(col.label) + headerExtra;\n for (const r of this.rows) {\n const v = (r as Record<string, unknown>)[col.key];\n if (v === null || v === undefined || v === ``)\n continue;\n const text = String(this._formatValue(v, col, r));\n const w = measure(text) + cellPad;\n if (w > maxW)\n maxW = w;\n }\n const min = col.minWidth ?? 40;\n const max = col.maxWidth ?? 600;\n return Math.max(min, Math.min(max, maxW));\n }\n\n private _autoSizeColumn(col: DataGridColumn): void {\n const w = this._measureAutoWidth(col);\n col.width = w;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent<DataGridColumnResizeDetail>(`datagrid-column-resize`, { detail: { key: col.key, width: w }, bubbles: true, composed: true }));\n }\n\n /**\n * Resize a single column, by key, to fit its contents (header label + every\n * row's formatted value), animating the width change smoothly. Only works\n * for plain columns - one with a custom `renderer` can't be measured\n * reliably from its raw value, so it's left untouched. Returns `false` (and\n * does nothing) if the column doesn't exist, isn't resizable, or has a\n * `renderer`.\n */\n autoSizeColumn(key: string): boolean {\n const col = this.columns.find(c => c.key === key);\n if (!col || col.resizable === false || col.renderer)\n return false;\n const target = this._measureAutoWidth(col);\n if ((col.width ?? 150) === target)\n return true;\n this._animatingColKeys = new Set(this._animatingColKeys).add(key);\n // Let the \"width transitions\" class above take effect on the current\n // width for one frame before changing it, so the browser animates the\n // change instead of snapping straight to it.\n requestAnimationFrame(() => {\n col.width = target;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent<DataGridColumnResizeDetail>(`datagrid-column-resize`, { detail: { key, width: target }, bubbles: true, composed: true }));\n window.setTimeout(() => {\n const next = new Set(this._animatingColKeys);\n next.delete(key);\n this._animatingColKeys = next;\n }, this._columnResizeAnimationMs());\n });\n return true;\n }\n\n private _columnResizeAnimationMs(): number {\n const raw = getComputedStyle(this).getPropertyValue(`--data-grid-column-resize-duration`).trim();\n const ms = raw.endsWith(`ms`) ? Number.parseFloat(raw) : raw.endsWith(`s`) ? Number.parseFloat(raw) * 1000 : Number.parseFloat(raw);\n return (Number.isFinite(ms) && ms > 0 ? ms : 180) + 30; // small margin over the CSS transition duration\n }\n\n private _onResizePointerDown(e: PointerEvent, col: DataGridColumn): void {\n e.preventDefault(); e.stopPropagation();\n const startX = e.clientX;\n const startW = col.width ?? 150;\n this._resizingColKey = col.key;\n const onMove = (ev: PointerEvent): void => {\n const w = Math.max(col.minWidth ?? 40, Math.min(col.maxWidth ?? 600, startW + ev.clientX - startX));\n col.width = w;\n this.requestUpdate();\n };\n const onUp = (ev: PointerEvent): void => {\n window.removeEventListener(`pointermove`, onMove);\n window.removeEventListener(`pointerup`, onUp);\n this._resizingColKey = undefined;\n const w = Math.max(col.minWidth ?? 40, Math.min(col.maxWidth ?? 600, startW + ev.clientX - startX));\n this.dispatchEvent(new CustomEvent<DataGridColumnResizeDetail>(`datagrid-column-resize`, { detail: { key: col.key, width: w }, bubbles: true, composed: true }));\n };\n window.addEventListener(`pointermove`, onMove);\n window.addEventListener(`pointerup`, onUp);\n }\n\n // Public API for stress demo\n /** Flat-index window `[start, end)` intersecting the viewport, widened by `overscan` rows each side. */\n #windowRows(overscan: number): { start: number; end: number } {\n const rh = this.rowHeight;\n return {\n start: Math.max(0, Math.floor(this._scrollTop / rh) - overscan),\n end: Math.min(this._flat.length, Math.ceil((this._scrollTop + this._viewportH) / rh) + overscan),\n };\n }\n\n getVisibleRange(): { startRow: number; endRow: number; startCol: number; endCol: number } {\n const { start: startRow, end: endRow } = this.#windowRows(2);\n const startCol = this._findFirstVisibleCol(this._scrollLeft);\n const endCol = this._findLastVisibleCol(this._scrollLeft + this._viewportW);\n return { startRow, endRow, startCol, endCol };\n }\n\n /** Row keys currently within the windowed/visible range, in display order. */\n renderedKeys(): string[] {\n const { startRow, endRow } = this.getVisibleRange();\n return this._flat.slice(startRow, endRow).filter(f => f.type === `row`).map(f => f.key);\n }\n\n /**\n * Row keys strictly intersecting the viewport (no overscan), mirroring\n * `ixfx-grid-list.visibleKeys()` for the `datagrid-viewport-change` detail.\n */\n #visibleKeys(): string[] {\n const { start, end } = this.#windowRows(0);\n return this._flat.slice(start, end).filter(f => f.type === `row`).map(f => f.key);\n }\n\n /** Coalesce viewport-change dispatches to at most one per animation frame. */\n #scheduleViewportChangeEmit(): void {\n if (this.#viewportChangeRaf !== 0)\n return;\n this.#viewportChangeRaf = requestAnimationFrame(() => {\n this.#viewportChangeRaf = 0;\n this.#emitViewportChangeIfChanged();\n });\n }\n\n /**\n * Dispatch `datagrid-viewport-change` with the current key sets — unless\n * neither set changed since the last dispatch, so coalesced frames and\n * no-op scrolls stay silent.\n */\n #emitViewportChangeIfChanged(): void {\n const renderedKeys = this.renderedKeys();\n const visibleKeys = this.#visibleKeys();\n if (sameKeys(this.#lastViewportRenderedKeys, renderedKeys) && sameKeys(this.#lastViewportVisibleKeys, visibleKeys))\n return;\n this.#lastViewportRenderedKeys = renderedKeys;\n this.#lastViewportVisibleKeys = visibleKeys;\n this.dispatchEvent(new CustomEvent<DataGridViewportChangeDetail>(`datagrid-viewport-change`, {\n detail: { renderedKeys, visibleKeys },\n bubbles: true,\n composed: true,\n }));\n }\n\n private _findFirstVisibleCol(scrollLeft: number): number {\n let lo = 0; let hi = this._colOffsets.length - 1; let ans = 0;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n if (this._colOffsets[mid] <= scrollLeft) {\n ans = mid; lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return ans;\n }\n\n private _findLastVisibleCol(right: number): number {\n for (let i = 0; i < this._colOffsets.length; i++) {\n if (this._colOffsets[i] > right)\n return i;\n }\n return this._colOffsets.length;\n }\n\n protected override render() {\n const rh = this.rowHeight;\n const { start: startRow, end: endRow } = this.#windowRows(2);\n const visibleFlat = this._flat.slice(startRow, endRow).map((entry, i) => ({ entry, absIdx: startRow + i }));\n // Pin the row being edited: scrolling it out of the window must not destroy its focused input.\n // It always goes first so keyed `repeat` never has to move its node (a DOM move blurs the input).\n const pinnedKey = this._editing?.rowKey ?? this._editingRow;\n const pinnedIdx = pinnedKey ? this.#flatIndexByKey.get(pinnedKey) : undefined;\n if (pinnedIdx !== undefined) {\n const inWindow = pinnedIdx >= startRow && pinnedIdx < endRow;\n if (inWindow)\n visibleFlat.splice(pinnedIdx - startRow, 1);\n visibleFlat.unshift({ entry: this._flat[pinnedIdx], absIdx: pinnedIdx });\n }\n const showCheckbox = this.interactionMode === `checked`;\n\n return html`\n <div class=\"grid\" role=\"grid\" aria-rowcount=${this._flat.length + 1} aria-colcount=${this._visibleColumns.length} aria-multiselectable=${this.selectionMode === `multiple` ? `true` : `false`}>\n <div class=\"header-bar\">\n <div class=\"header-scroll scroll-fade-x\" role=\"row\" aria-rowindex=\"1\">\n ${showCheckbox ? html`<div class=\"header-cell checkbox-col\" role=\"columnheader\"></div>` : nothing}\n ${repeat(this._visibleColumns, c => c.key, (col, idx) => html`\n <div class=\"header-cell ${this._animatingColKeys.has(col.key) ? `width-animating` : ``}\" role=\"columnheader\" aria-sort=${this.sortState?.key === col.key ? (this.sortState.direction === `asc` ? `ascending` : `descending`) : `none`} style=\"width:${col.width ?? 150}px\" ?drag-source=${this._drag?.active && this._drag.sourceCol.key === col.key}\n @click=${(e: MouseEvent) => this._onHeaderClick(col, e)}\n @pointerenter=${() => this._tickled.handlePointerEnter(col.key)}>\n ${col.reorderable !== false\n ? html`<span class=\"reorder-handle\" draggable=\"false\"\n @pointerdown=${(e: PointerEvent) => this._beginHeaderDrag(e, col, idx)}\n ><span class=\"ixfx-handle\" data-handle=\"dotted\" data-shape=\"vertical\" part=\"reorder-handle\"></span></span>`\n : nothing}\n <span class=\"header-label\" @pointerup=${(e: PointerEvent) => this._onHeaderPointerUp(col, e)}>${col.label}</span>\n ${this.sortState?.key === col.key ? html`<span class=\"sort-icon\"><ixfx-icon name=${this.sortState.direction === `asc` ? `chevron-up` : `chevron-down`} size=\"12\"></ixfx-icon></span>` : nothing}\n ${col.button !== false ? html`<span class=\"col-button\" @click=${(e: PointerEvent) => this._onColButtonClick(col, e)}><ixfx-icon name=${col.button && typeof col.button === `object` && col.button.icon ? col.button.icon : this.columnButtonIcon} size=\"14\"></ixfx-icon></span>` : nothing}\n ${col.resizable !== false\n ? html`<span class=\"resize-handle\" ?data-active=${this._resizingColKey === col.key} @pointerdown=${(e: PointerEvent) => this._onResizePointerDown(e, col)} @click=${(e: MouseEvent) => e.stopPropagation()} @dblclick=${(e: MouseEvent) => {\n e.preventDefault(); e.stopPropagation(); this._autoSizeColumn(col);\n }}></span>`\n : nothing}\n </div>\n `)}\n ${this._drag?.active && this._drag.gap !== undefined\n ? html`<div class=\"drop-caret\" style=\"left:${(() => {\n const gap = this._drag!.gap!;\n if (gap < this._colOffsets.length)\n return this._colOffsets[gap];\n const last = this._colOffsets.length - 1;\n return last >= 0 ? this._colOffsets[last] + (this._visibleColumns[last].width ?? 150) : 0;\n })()}px\"></div>`\n : nothing}\n </div>\n ${this.columnMenu !== `auto`\n ? nothing\n : html`\n <ixfx-menu-trigger label=\"⚙\" placement=\"bottom-end\" @menu-command=${(e: CustomEvent) => {\n const cmd = (e.detail as { command?: string; checked?: boolean; value?: string }).command;\n const checked = (e.detail as { checked?: boolean }).checked;\n const value = (e.detail as { value?: string }).value;\n if (cmd?.startsWith(`col:`)) {\n const key = cmd.slice(4);\n const col = this.columns.find(c => c.key === key);\n if (col)\n this._onVisibilityToggle(col, !!checked);\n e.stopPropagation();\n return;\n }\n if (cmd === `groupBy`) {\n const v = value ?? ``;\n this.groupBy = v || null;\n this._collapsedGroups = new Set();\n this.dispatchEvent(new CustomEvent<DataGridGroupChangeDetail>(`datagrid-group-change`, { detail: { groupBy: this.groupBy as DataGridGroupBy<unknown> | null }, bubbles: true, composed: true }));\n e.stopPropagation();\n }\n }}>\n <ixfx-menu-container slot=\"menu\">\n <ixfx-menu-header label=\"Columns\"></ixfx-menu-header>\n ${repeat(this.columns, c => c.key, col => html`\n <ixfx-menu-check-item command=\"col:${col.key}\" label=${col.label} ?checked=${col.visible !== false}></ixfx-menu-check-item>\n `)}\n ${this.allowGrouping\n ? html`\n <ixfx-menu-separator></ixfx-menu-separator>\n <ixfx-menu-header label=\"Group by\"></ixfx-menu-header>\n <ixfx-menu-radio-group name=\"groupBy\" value=${typeof this.groupBy === `string` ? this.groupBy : ``}>\n <ixfx-menu-radio-item value=\"\" label=\"None\"></ixfx-menu-radio-item>\n ${this.columns.filter(c => c.groupable !== false && (!this.groupableColumns || this.groupableColumns.includes(c.key))).map(col => html`\n <ixfx-menu-radio-item value=${col.key} label=${col.label}></ixfx-menu-radio-item>\n `)}\n </ixfx-menu-radio-group>\n `\n : nothing}\n </ixfx-menu-container>\n </ixfx-menu-trigger>`}\n </div>\n <div class=\"viewport scroll-fade-y\" @scroll=${this._onScroll}>\n <div class=\"spacer\" style=\"height:${this._flat.length * rh}px; width:${this._colWidthSum}px\">\n ${repeat(visibleFlat, f => f.entry.key, ({ entry, absIdx }) => {\n if (entry.type === `group`) {\n const gKey = entry.key.replace(/^__group__/, ``);\n const collapsed = this._collapsedGroups.has(gKey);\n return html`<div class=\"group-row ${collapsed ? `collapsed` : ``}\" role=\"row\" aria-rowindex=${absIdx + 2} style=\"top:${absIdx * rh}px; height:${rh}px\" @click=${() => this._toggleGroup(gKey)}><span class=\"caret\"><ixfx-icon name=\"chevron-down\" size=\"12\"></ixfx-icon></span><span role=\"rowheader\" aria-expanded=${collapsed ? `false` : `true`}>${entry.label}</span><span class=\"count\">(${entry.count})</span><span class=\"divider\"></span></div>`;\n }\n const row = entry.row;\n const absIdx2 = entry.idx;\n const rowKey = entry.key;\n const selected = this._selectedKeys.has(rowKey);\n const tickled = this._tickled.isTickled(rowKey);\n return html`\n <div class=\"row item ${selected ? `selected` : ``} ${tickled ? `tickled` : ``} ${this.zebraStripes && absIdx2 % 2 === 1 ? `zebra-odd` : ``} ${this.#enteringRowKeys.has(rowKey) ? `entering` : ``} ${this.#nativeDragging && rowKey === this.#dragOriginKey ? `dragging-origin` : ``}\" role=\"row\" aria-rowindex=${absIdx + 2} aria-selected=${selected ? `true` : `false`} style=\"top:${absIdx * rh}px; height:${rh}px\"\n data-key=${rowKey}\n draggable=${this.#nativeDrag.draggableAttr}\n @click=${(e: MouseEvent) => {\n this._onRowClick(rowKey, null, e); this.dispatchEvent(new CustomEvent<DataGridCellClickDetail>(`datagrid-cell-click`, { detail: { rowKey, colKey: ``, rowIndex: absIdx2, colIndex: -1 }, bubbles: true, composed: true }));\n }}\n @pointerenter=${() => this._tickled.handlePointerEnter(rowKey)}\n @pointerleave=${() => this._tickled.clearTickled()}\n @dblclick=${() => {\n if (this._visibleColumns[0] && this._isEditable(row, this._visibleColumns[0]))\n this._startEdit(rowKey, this._visibleColumns[0].key);\n else\n this._activateRow(rowKey, row, absIdx2);\n }}>\n ${showCheckbox ? html`<div class=\"checkbox-col\"><input type=\"checkbox\" .checked=${selected} @click=${(e: MouseEvent) => this._onCheckboxClick(rowKey, e)} /></div>` : nothing}\n ${repeat(this._visibleColumns, c => c.key, (col) => {\n const val = (row as Record<string, unknown>)[col.key];\n const isEditing = this._isCellEditing(rowKey, col.key);\n if (isEditing) {\n const immediate = this.editability === `immediate` || this._editingRow === rowKey;\n const curVal = immediate ? val : (this._editValue ?? val);\n const effectiveDataType = col.dataType ?? `text`;\n if (effectiveDataType === `boolean` && (col.editor === `auto` || col.editor === `select` || !col.editor)) {\n return html`<div class=\"cell\" role=\"gridcell\" data-col=${col.key} style=\"width:${col.width ?? 150}px;justify-content:center;align-items:center\"><input type=\"checkbox\" .checked=${Boolean(curVal)} @change=${(e: Event) => {\n const v = (e.target as HTMLInputElement).checked;\n if (immediate) {\n this._commitImmediate(rowKey, col.key, v);\n } else {\n this._editValue = v; this._commitEdit();\n }\n }} /></div>`;\n }\n if (col.editor === `select`) {\n const opts = (col.editorOptions ?? []) as ReadonlyArray<string | { value: string; label: string }>;\n return html`<div class=\"cell\" role=\"gridcell\" data-col=${col.key} style=\"width:${col.width ?? 150}px\"><select @change=${(e: Event) => {\n const v = (e.target as HTMLSelectElement).value;\n if (immediate) {\n this._commitImmediate(rowKey, col.key, v);\n } else {\n this._editValue = v; this._commitEdit();\n }\n }} @keydown=${(e: KeyboardEvent) => {\n if (e.key === `Tab`) {\n e.preventDefault(); e.stopPropagation(); this._tabToNext(rowKey, col.key, e.shiftKey ? -1 : 1);\n } if (e.key === `Escape`) {\n this._editing = null; this._editingRow = null;\n }\n }} @blur=${() => {\n if (this._suppressBlurCommit)\n return; if (!immediate)\n this._commitEdit();\n }}><option value=\"\"></option>${opts.map((o) => {\n const v = typeof o === `string` ? o : o.value;\n const l = typeof o === `string` ? o : o.label;\n return html`<option value=${v} ?selected=${String(curVal) === v}>${l}</option>`;\n })}</select></div>`;\n }\n if (typeof col.editor === `function`) {\n const factory = col.editor as DataGridEditorFactory;\n const ctx = { row, column: col, rowIndex: absIdx2, colIndex: 0, value: curVal, commit: (v: unknown) => {\n if (immediate) {\n this._commitImmediate(rowKey, col.key, v);\n } else {\n this._editValue = v; this._commitEdit();\n }\n }, cancel: () => {\n this._editing = null; this._editingRow = null;\n } };\n return html`<div class=\"cell\" role=\"gridcell\" data-col=${col.key} style=\"width:${col.width ?? 150}px\">${factory(ctx)}</div>`;\n }\n const inputType = effectiveDataType === `number` ? `number` : `text`;\n const inputValue = effectiveDataType === `number` ? String(curVal ?? ``) : String(curVal ?? ``);\n return html`<div class=\"cell\" role=\"gridcell\" data-col=${col.key} style=\"width:${col.width ?? 150}px\"><input type=${inputType} .value=${inputValue} @input=${(e: Event) => this._editValue = (e.target as HTMLInputElement).value} @keydown=${(e: KeyboardEvent) => {\n if (e.key === `Enter`)\n this._commitEdit(); if (e.key === `Escape`) {\n this._editing = null; this._editingRow = null;\n } if (e.key === `Tab`) {\n e.preventDefault(); e.stopPropagation(); this._tabToNext(rowKey, col.key, e.shiftKey ? -1 : 1);\n }\n }} @blur=${() => {\n if (this._suppressBlurCommit)\n return; if (!immediate)\n this._commitEdit();\n }} autofocus /></div>`;\n }\n const displayVal = this._formatValue(val, col, row);\n const rendered = col.renderer ? col.renderer(row as never, col as never, absIdx2) : displayVal;\n // renderer may return TemplateResult or primitive; if renderer not used, display formatted\n const cellContent = col.renderer ? rendered : displayVal;\n const editable = this._isEditable(row, col);\n const textEditable = editable && this._isTextEditor(col);\n const leftAligned = col.align !== `right` && col.align !== `center`;\n const indent = leftAligned && col.reorderable !== false\n ? `padding-left:calc(var(--space-s) + var(--data-grid-reorder-handle-width, 10px) + var(--space-xs));`\n : ``;\n // Plain (non-renderer) text can pan instead of being CSS-ellipsised,\n // while its row is selected or under the tickle cursor.\n const canPan = this.cellOverflow === `pan-text` && !col.renderer && (selected || tickled);\n const look = this._cellLook(row, col.key);\n const cellStyle = look.textColor === undefined\n ? ``\n : `color:${look.textColor};`;\n return html`<div class=\"cell ${textEditable ? `editable-text` : ``} ${this._animatingColKeys.has(col.key) ? `width-animating` : ``}\" role=\"gridcell\" data-col=${col.key} style=\"width:${col.width ?? 150}px; justify-content:${col.align === `right` ? `flex-end` : col.align === `center` ? `center` : `flex-start`}; ${indent} ${cellStyle}\"\n @click=${(e: MouseEvent) => {\n this._lastClickedCell = { rowKey, colKey: col.key }; if (col.selectable !== false) {\n e.stopPropagation(); this._onRowClick(rowKey, col, e); this._handleCellSecondClick(rowKey, col);\n } this.dispatchEvent(new CustomEvent<DataGridCellClickDetail>(`datagrid-cell-click`, { detail: { rowKey, colKey: col.key, rowIndex: absIdx2, colIndex: this.columns.indexOf(col) }, bubbles: true, composed: true }));\n }}\n >${look.icon === undefined ? nothing : html`<span class=\"cell-icon\" part=\"icon\" style=${look.iconColor === undefined ? nothing : `color:${look.iconColor}`}>${look.icon}</span>`}${canPan ? html`<ixfx-pan-text mode=\"loop\">${cellContent as unknown as string}</ixfx-pan-text>` : cellContent as unknown as string}${look.badge === undefined ? nothing : html`<span class=\"cell-badge\" part=\"badge\">${look.badge}</span>`}</div>`;\n })}\n </div>\n `;\n })}\n </div>\n </div>\n ${this.search.renderField()}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap { 'ixfx-data-grid': DataGridElement }\n}\nexport interface DataGridElement {\n addEventListener: (<K extends keyof DataGridElementEventMap>(type: K, listener: (this: DataGridElement, event: DataGridElementEventMap[K]) => void, options?: boolean | AddEventListenerOptions) => void) & ((type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions) => void);\n removeEventListener: (<K extends keyof DataGridElementEventMap>(type: K, listener: (this: DataGridElement, event: DataGridElementEventMap[K]) => void, options?: boolean | EventListenerOptions) => void) & ((type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions) => void);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-provider-35TyWclX.js","names":[],"sources":["../src/common/data-provider.ts"],"sourcesContent":["/**\n * Shared data-provider contract used by components that render a list of items.\n *\n * A provider is a simple callable — the consuming component (via DataController)\n * manages the request lifecycle, cancellation, and reactive state.\n */\n\n/**\n * One batch of items within a streaming provider response.\n *\n * For sync and async one-shot providers, the DataController synthesises a single\n * DataBatch internally — you only need this type when writing a streaming provider.\n */\nexport type DataBatch<T> = {\n /** Items delivered in this batch. */\n readonly items: readonly T[];\n /**\n * When true, replace all previously accumulated items with this batch instead\n * of appending. Useful for re-ranked or filtered results mid-stream.\n * Default: false (append).\n */\n replace?: boolean;\n /**\n * Provider's current estimate of the total number of items that will be\n * delivered across all batches. Enables progress percentage in the consumer.\n * May be refined in subsequent batches as the estimate improves.\n * Omit when the total is unknown.\n */\n total?: number;\n};\n\n/**\n * The three return modes a provider may use.\n * DataController normalises all three — callers can mix modes freely.\n *\n * - `readonly T[]` — sync, items available immediately\n * - `Promise<readonly T[]>` — async one-shot, resolves to the full result\n * - `AsyncIterable<DataBatch<T>>` — streaming, batches arrive over time\n */\nexport type DataProviderResult<T>\n = | readonly T[]\n | Promise<readonly T[]>\n | AsyncIterable<DataBatch<T>>;\n\n/**\n * A data provider callable.\n *\n * @typeParam TQuery - The input that scopes the request (e.g. `string` for\n * autocomplete, `{ node, depth }` for a tree branch, `void` for a plain list).\n * @typeParam TItem - The item type produced.\n *\n * The AbortSignal is cancelled when the consumer supersedes the request (e.g.\n * a new query arrives before the previous one completes). Streaming providers\n * should check `signal.aborted` between yields or pass the signal to their\n * underlying fetch calls.\n */\nexport type IDataProvider<TQuery, TItem> = (\n query: TQuery,\n signal: AbortSignal,\n) => DataProviderResult<TItem>;\n\n/**\n * Collects all items from any DataProviderResult into a flat array.\n * Useful for components that need a complete list before rendering (e.g. tree branches).\n * Respects the AbortSignal — stops accumulating if cancelled mid-stream.\n */\nexport async function collectDataResult<T>(\n result: DataProviderResult<T>,\n signal: AbortSignal,\n): Promise<readonly T[]> {\n if (Array.isArray(result))\n return result as T[];\n if (Symbol.asyncIterator in new Object(result)) {\n const items: T[] = [];\n for await (const batch of result as AsyncIterable<DataBatch<T>>) {\n if (signal.aborted)\n return items;\n if (batch.replace)\n items.length = 0;\n items.push(...(batch.items as T[]));\n }\n return items;\n }\n return result as Promise<readonly T[]>;\n}\n"],"mappings":";;;;;;AAkEA,eAAsB,kBACpB,QACA,QACuB;CACvB,IAAI,MAAM,QAAQ,MAAM,GACtB,OAAO;CACT,IAAI,OAAO,iBAAiB,IAAI,OAAO,MAAM,GAAG;EAC9C,MAAM,QAAa,CAAC;EACpB,WAAW,MAAM,SAAS,QAAuC;GAC/D,IAAI,OAAO,SACT,OAAO;GACT,IAAI,MAAM,SACR,MAAM,SAAS;GACjB,MAAM,KAAK,GAAI,MAAM,KAAa;EACpC;EACA,OAAO;CACT;CACA,OAAO;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-provider-BAn_-oR1.d.ts","names":[],"sources":["../src/common/data-provider.ts"],"mappings":";;;;;;;;;;;;;KAaY,UAAU;;WAEX,gBAAgB;;;;;;EAMzB;;;;;;;EAOA;;;;;;;;;;KAWU,mBAAmB,cAChB,MACT,iBAAiB,OACjB,cAAc,UAAU;;;;;;;;;;;;;KAclB,cAAc,QAAQ,UAChC,OAAO,QACP,QAAQ,gBACL,mBAAmB;;;;;;iBAOF,kBAAkB,GACtC,QAAQ,mBAAmB,IAC3B,QAAQ,cACP,iBAAiB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"decorate-VRK8rslU.js","names":[],"sources":["../src/util/custom-elements.ts"],"sourcesContent":["type CustomElementCtor = CustomElementConstructor;\n\nfunction getRegistry(): CustomElementRegistry | undefined {\n if (typeof customElements === `undefined`)\n return undefined;\n return customElements;\n}\n\nexport function safeDefine(name: string, ctor: CustomElementCtor): void {\n const registry = getRegistry();\n if (!registry)\n return;\n const existing = registry.get(name);\n if (existing === undefined) {\n registry.define(name, ctor);\n }\n}\n\nexport function safeCustomElement(name: string) {\n return (ctor: CustomElementCtor): void => {\n safeDefine(name, ctor);\n };\n}\n"],"mappings":";AAEA,SAAS,cAAiD;CACxD,IAAI,OAAO,mBAAmB,aAC5B,OAAO,KAAA;CACT,OAAO;AACT;AAEA,SAAgB,WAAW,MAAc,MAA+B;CACtE,MAAM,WAAW,YAAY;CAC7B,IAAI,CAAC,UACH;CAEF,IADiB,SAAS,IAAI,IACnB,MAAM,KAAA,GACf,SAAS,OAAO,MAAM,IAAI;AAE9B;AAEA,SAAgB,kBAAkB,MAAc;CAC9C,QAAQ,SAAkC;EACxC,WAAW,MAAM,IAAI;CACvB;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"defaults-B4ePs4LB.js","names":[],"sources":["../src/icons/defaults.ts"],"sourcesContent":["import { registerIcon } from './registry.js';\n\n// All shapes below are Lucide icons (https://lucide.dev/icons/) — stroke-based,\n// viewBox 0 0 24 24, stroke-width 2, round linecap/linejoin, fill=\"none\" so\n// color comes entirely from `currentColor`.\n\n/** Chevron pointing down (Lucide `chevron-down`). Used for split-button dropdown toggle. */\nexport const ICON_CHEVRON_DOWN = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m6 9 6 6 6-6\"/></svg>`;\n\n/**\n * Chevron pointing right (Lucide `chevron-right`). Used for tree-basic expand\n * indicator as a CSS mask — shape only, color comes from background-color.\n */\nexport const ICON_CARET_RIGHT = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"black\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m9 18 6-6-6-6\"/></svg>`;\n\n/** Checkmark (Lucide `check`). Useful for menu-check-item or confirmation states. */\nexport const ICON_CHECK = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M20 6 9 17l-5-5\"/></svg>`;\n\n/** Close / X icon (Lucide `x`). Useful for dialogs, notifications, dismissible elements. */\nexport const ICON_CLOSE = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>`;\n\n/** Plus / add icon (Lucide `plus`). Pairs with `close` for add/remove actions. */\nexport const ICON_ADD = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12h14\"/><path d=\"M12 5v14\"/></svg>`;\n\n/** Error icon (Lucide `circle-alert`). Useful for error notifications. */\nexport const ICON_ERROR = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"12\"/><line x1=\"12\" x2=\"12.01\" y1=\"16\" y2=\"16\"/></svg>`;\n\n/** Info icon (Lucide `info`). Useful for info notifications. */\nexport const ICON_INFO = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 16v-4\"/><path d=\"M12 8h.01\"/></svg>`;\n\n/** Warning icon (Lucide `triangle-alert`). Useful for warning notifications. */\nexport const ICON_WARNING = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m21.73 18-8-14a2 2 0 0 0-3.46 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg>`;\n\n/** Chevron pointing right (Lucide `chevron-right`). Used for split-button switcher toggle. */\nexport const ICON_CHEVRON_RIGHT = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m9 18 6-6-6-6\"/></svg>`;\n\n/** Folder with up arrow (Lucide `folder-up`). Angled line style for navigating up one level. */\nexport const ICON_FOLDER_UP = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M2 9V5c0-1.1.9-2 2-2h3.93a2 2 0 0 1 1.66.9l.82 1.2a2 2 0 0 0 1.66.9H20a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-1\"/><path d=\"M12 10v6\"/><path d=\"m9 13 3-3 3 3\"/></svg>`;\n\n/** Folder (Lucide `folder`). Useful for file explorers and sidebars. */\nexport const ICON_FOLDER = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\"/></svg>`;\n\n/** Document / file page (Lucide `file`). Useful for file lists and document tabs. */\nexport const ICON_FILE = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\"/><path d=\"M14 2v4a2 2 0 0 0 2 2h4\"/></svg>`;\n\n/** Magnifying glass (Lucide `search`). Useful for search panels and inputs. */\nexport const ICON_SEARCH = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/></svg>`;\n\n/** Chevron pointing up (Lucide `chevron-up`). Sort/collapse direction indicators. */\nexport const ICON_CHEVRON_UP = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m18 15-6-6-6 6\"/></svg>`;\n\n/** Chevron pointing left (Lucide `chevron-left`). Previous/back affordances. */\nexport const ICON_CHEVRON_LEFT = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m15 18-6-6 6-6\"/></svg>`;\n\n/** Vertical ellipsis (Lucide `ellipsis-vertical`). Default glyph for an unlabelled menu trigger. */\nexport const ICON_ELLIPSIS_VERTICAL = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"12\" cy=\"5\" r=\"1\"/><circle cx=\"12\" cy=\"19\" r=\"1\"/></svg>`;\n\n/** Horizontal ellipsis (Lucide `ellipsis`). Three dots in a horizontal row. */\nexport const ICON_ELLIPSIS = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"5\" cy=\"12\" r=\"1\"/><circle cx=\"19\" cy=\"12\" r=\"1\"/></svg>`;\n\nexport function registerDefaults(): void {\n registerIcon(`chevron-down`, ICON_CHEVRON_DOWN);\n registerIcon(`chevron-right`, ICON_CHEVRON_RIGHT);\n registerIcon(`caret-right`, ICON_CARET_RIGHT);\n registerIcon(`check`, ICON_CHECK);\n registerIcon(`close`, ICON_CLOSE);\n registerIcon(`file`, ICON_FILE);\n registerIcon(`folder`, ICON_FOLDER);\n registerIcon(`search`, ICON_SEARCH);\n registerIcon(`add`, ICON_ADD);\n registerIcon(`error`, ICON_ERROR);\n registerIcon(`folder-up`, ICON_FOLDER_UP);\n registerIcon(`info`, ICON_INFO);\n registerIcon(`warning`, ICON_WARNING);\n registerIcon(`chevron-up`, ICON_CHEVRON_UP);\n registerIcon(`chevron-left`, ICON_CHEVRON_LEFT);\n registerIcon(`ellipsis-vertical`, ICON_ELLIPSIS_VERTICAL);\n registerIcon(`ellipsis`, ICON_ELLIPSIS);\n}\n"],"mappings":";;;AAOA,MAAa,oBAAoB;;;;;AAMjC,MAAa,mBAAmB;;AAGhC,MAAa,aAAa;;AAG1B,MAAa,aAAa;;AAG1B,MAAa,WAAW;;AAGxB,MAAa,aAAa;;AAG1B,MAAa,YAAY;;AAGzB,MAAa,eAAe;;AAG5B,MAAa,qBAAqB;;AAGlC,MAAa,iBAAiB;;AAG9B,MAAa,cAAc;;AAG3B,MAAa,YAAY;;AAGzB,MAAa,cAAc;;AAG3B,MAAa,kBAAkB;;AAG/B,MAAa,oBAAoB;;AAGjC,MAAa,yBAAyB;;AAGtC,MAAa,gBAAgB;AAE7B,SAAgB,mBAAyB;CACvC,aAAa,gBAAgB,iBAAiB;CAC9C,aAAa,iBAAiB,kBAAkB;CAChD,aAAa,eAAe,gBAAgB;CAC5C,aAAa,SAAS,UAAU;CAChC,aAAa,SAAS,UAAU;CAChC,aAAa,QAAQ,SAAS;CAC9B,aAAa,UAAU,WAAW;CAClC,aAAa,UAAU,WAAW;CAClC,aAAa,OAAO,QAAQ;CAC5B,aAAa,SAAS,UAAU;CAChC,aAAa,aAAa,cAAc;CACxC,aAAa,QAAQ,SAAS;CAC9B,aAAa,WAAW,YAAY;CACpC,aAAa,cAAc,eAAe;CAC1C,aAAa,gBAAgB,iBAAiB;CAC9C,aAAa,qBAAqB,sBAAsB;CACxD,aAAa,YAAY,aAAa;AACxC"}