@ixfx/components 0.13.2 → 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 (306) hide show
  1. package/bundle/index.d.ts +1649 -128
  2. package/bundle/index.js +1595 -44437
  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 +1 -3
  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-Ck1Qx2H1.d.ts → data-grid-BtBZt8M1.d.ts} +10 -9
  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 -1923
  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-BfYHNh6B.js +1999 -0
  32. package/dist/{detail-list-C1xzr1z7.d.ts → detail-list-u2rWnAXQ.d.ts} +13 -5
  33. package/dist/detail-list.d.ts +2 -2
  34. package/dist/detail-list.js +1 -1680
  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-Ohxqsy0g.d.ts → flat-list-DNnTQ65v.d.ts} +3 -4
  40. package/dist/flat-list.d.ts +1 -1
  41. package/dist/flat-list.js +5 -3
  42. package/dist/form-CsXJX15p.js +0 -2
  43. package/dist/form.d.ts +1 -2
  44. package/dist/{grid-list-pefLORIr.d.ts → grid-list-BLnV9oZE.d.ts} +9 -3
  45. package/dist/{grid-list-DjIl910A.js → grid-list-CkU8gHCh.js} +189 -42
  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-D91M4Ozq.js → incr-search-JIhwB49y.js} +26 -6
  62. package/dist/incr-search.d.ts +1 -1
  63. package/dist/incr-search.js +1 -1
  64. package/dist/{index-Dq30pOnn.d.ts → index-B-hzcIP0.d.ts} +3 -4
  65. package/dist/{index-CxZ61DO1.d.ts → index-BYIRgv49.d.ts} +9 -3
  66. package/dist/index-CCC0G1nO.d.ts +324 -0
  67. package/dist/{index-garxxqgV.d.ts → index-CYndvTWH.d.ts} +2 -3
  68. package/dist/{index-BUB5SICW.d.ts → index-CoqtMSd9.d.ts} +2 -3
  69. package/dist/index-DV3iaUBW.d.ts +1 -2
  70. package/dist/{index-CJ5fshD3.d.ts → index-UvnoZUAo.d.ts} +2 -3
  71. package/dist/index-o-CWDt11.d.ts +1 -2
  72. package/dist/{index-BOUaDIW-.d.ts → index-tq6f8007.d.ts} +2 -3
  73. package/dist/index.d.ts +21 -22
  74. package/dist/index.js +48 -29
  75. package/dist/item-appearance-BjcMyauw.js +0 -2
  76. package/dist/keyboard-B5xD7Fz-.js +0 -2
  77. package/dist/labelled-input-base-BFa4xlYV.js +0 -2
  78. package/dist/{labelled-input-base-Dp_9KP0G.d.ts → labelled-input-base-DiTme1JO.d.ts} +2 -3
  79. package/dist/labelled-radial-input.d.ts +3 -4
  80. package/dist/labelled-radial-input.js +0 -2
  81. package/dist/labelled-range-input.d.ts +1 -1
  82. package/dist/labelled-range-input.js +0 -2
  83. package/dist/labelled-slider-input-FdCRi6st.js +0 -2
  84. package/dist/labelled-slider-input.d.ts +1 -1
  85. package/dist/led.d.ts +1 -2
  86. package/dist/led.js +0 -2
  87. package/dist/list-group-header.d.ts +2 -3
  88. package/dist/list-group-header.js +0 -2
  89. package/dist/list-item-animation-BUoEKi5s.js +0 -2
  90. package/dist/list-native-drag-controller-B9xO0XWn.js +0 -2
  91. package/dist/list-native-drag-controller-ChIi3eK5.d.ts +1 -2
  92. package/dist/list-selection-controller-BeE70lbB.js +0 -2
  93. package/dist/list-selection-types-PjKdhF-a.d.ts +1 -2
  94. package/dist/list-viewport-types-BRZsLcvp.d.ts +1 -2
  95. package/dist/menu-CwcXXeLM.js +0 -2
  96. package/dist/menu-item-BDEekBVy.js +0 -2
  97. package/dist/{menu-item-B0zqw2xp.d.ts → menu-item-bF6narIz.d.ts} +2 -3
  98. package/dist/menu.d.ts +2 -2
  99. package/dist/miller.d.ts +2 -3
  100. package/dist/miller.js +146 -102
  101. package/dist/narrowed-text.js +1 -3
  102. package/dist/notification-pill-DyZydXoZ.d.ts +1 -2
  103. package/dist/notifier.js +0 -2
  104. package/dist/pan-text-CoYmt2qd.d.ts +1 -2
  105. package/dist/pan-text-CqtvjPyK.js +0 -2
  106. package/dist/panel.d.ts +2 -3
  107. package/dist/panel.js +0 -2
  108. package/dist/polar-pad.d.ts +1 -2
  109. package/dist/polar-pad.js +0 -2
  110. package/dist/popup-D80sj2QC.js +0 -2
  111. package/dist/prominence-DlFShic3.js +0 -2
  112. package/dist/radial-input-DU6t2hYO.d.ts +1 -2
  113. package/dist/radial-input-KMVltQfe.js +0 -2
  114. package/dist/range-input.d.ts +1 -2
  115. package/dist/range-input.js +0 -2
  116. package/dist/range.d.ts +1 -2
  117. package/dist/range.js +0 -2
  118. package/dist/registry-BEtb8_wB.js +0 -2
  119. package/dist/{scroll-fade-BrNUIYnm.js → scroll-fade-Xx28D7mH.js} +11 -7
  120. package/dist/select-horiz.d.ts +1 -2
  121. package/dist/select-horiz.js +1 -3
  122. package/dist/slider-input-BxURAAmD.d.ts +1 -2
  123. package/dist/slider-input-ByHdotzp.js +0 -2
  124. package/dist/snackbar.d.ts +1 -2
  125. package/dist/snackbar.js +0 -2
  126. package/dist/snap-container.d.ts +1 -2
  127. package/dist/snap-container.js +0 -2
  128. package/dist/{split-layout-CXotkdbx.js → split-layout-Deoxy47d.js} +5 -2
  129. package/dist/{split-layout-C5SYbDrq.d.ts → split-layout-JK3xWVX2.d.ts} +2 -3
  130. package/dist/split-layout.d.ts +1 -1
  131. package/dist/split-layout.js +1 -1
  132. package/dist/swipe.d.ts +1 -2
  133. package/dist/swipe.js +0 -2
  134. package/dist/{tab-list-v8mKX7Fu.d.ts → tab-list-CexFFg6O.d.ts} +3 -5
  135. package/dist/tabs.d.ts +1 -1
  136. package/dist/tabs.js +23 -3
  137. package/dist/tickled-controller-D-HZymaZ.js +0 -2
  138. package/dist/tickled-controller-DodxD3eQ.d.ts +1 -2
  139. package/dist/tickled-styles-BrAHEj1q.js +0 -2
  140. package/dist/timeline-BP1Ux2EV.js +0 -2
  141. package/dist/{titlebar-B5zSTZnF.d.ts → titlebar-Tqu-VvMU.d.ts} +2 -3
  142. package/dist/titlebar.d.ts +1 -1
  143. package/dist/titlebar.js +0 -2
  144. package/dist/tooltip-BlvBUQxx.d.ts +1 -2
  145. package/dist/tooltip-CJt3WLmN.js +0 -2
  146. package/dist/transitory-label.d.ts +1 -2
  147. package/dist/transitory-label.js +0 -2
  148. package/dist/{tree-DGveys4K.js → tree-DD8OaqsK.js} +1009 -231
  149. package/dist/tree-component-Cj8V3uar.d.ts +1 -2
  150. package/dist/tree.d.ts +4 -267
  151. package/dist/tree.js +1 -1
  152. package/dist/types-DQ7KOUIj.d.ts +1 -2
  153. package/dist/{vertical-list-CqBc-t8w.d.ts → vertical-list-m7GJtXwv.d.ts} +3 -3
  154. package/dist/vertical-list.d.ts +1 -1
  155. package/dist/vertical-list.js +114 -27
  156. package/dist/wheel-nudge-By5s_ioH.d.ts +1 -2
  157. package/dist/wheel-nudge-D5rmht3v.js +0 -2
  158. package/dist/xy-axis-CyMd_Bn1.js +0 -2
  159. package/dist/xy-axis-DQqd2yXJ.d.ts +1 -2
  160. package/dist/xy-pad.d.ts +1 -2
  161. package/dist/xy-pad.js +0 -2
  162. package/docs-user/data-grid.md +74 -4
  163. package/docs-user/detail-list.md +65 -0
  164. package/docs-user/grid-list.md +81 -4
  165. package/docs-user/index.json +2 -2
  166. package/docs-user/miller.md +59 -3
  167. package/docs-user/tree.md +63 -2
  168. package/docs-user/vertical-list.md +9 -1
  169. package/package.json +6 -1
  170. package/bundle/index.d.ts.map +0 -1
  171. package/bundle/index.js.map +0 -1
  172. package/bundle/rolldown-runtime-D7D4PA-g.js +0 -13
  173. package/dist/ac-text.d.ts.map +0 -1
  174. package/dist/ac-text.js.map +0 -1
  175. package/dist/ac-token-TCLAZeVg.d.ts.map +0 -1
  176. package/dist/ac-token.js.map +0 -1
  177. package/dist/button-B7mgqtxR.js.map +0 -1
  178. package/dist/button-CTL45aBl.d.ts.map +0 -1
  179. package/dist/checkbox.d.ts.map +0 -1
  180. package/dist/checkbox.js.map +0 -1
  181. package/dist/checked-select-CglRukbP.d.ts.map +0 -1
  182. package/dist/checked-select-lDgAQQ7v.js.map +0 -1
  183. package/dist/colour-picker-BCMU7W7R.js.map +0 -1
  184. package/dist/crumbs.d.ts.map +0 -1
  185. package/dist/crumbs.js.map +0 -1
  186. package/dist/data-controller-DOlmqNKb.js.map +0 -1
  187. package/dist/data-display.d.ts.map +0 -1
  188. package/dist/data-display.js.map +0 -1
  189. package/dist/data-grid-Ck1Qx2H1.d.ts.map +0 -1
  190. package/dist/data-grid.js.map +0 -1
  191. package/dist/data-provider-35TyWclX.js.map +0 -1
  192. package/dist/data-provider-BAn_-oR1.d.ts.map +0 -1
  193. package/dist/decorate-VRK8rslU.js.map +0 -1
  194. package/dist/defaults-B4ePs4LB.js.map +0 -1
  195. package/dist/detail-list-C1xzr1z7.d.ts.map +0 -1
  196. package/dist/detail-list.js.map +0 -1
  197. package/dist/drag-ghost-DtSDvjri.js.map +0 -1
  198. package/dist/editable-label-rzXkjf1H.d.ts.map +0 -1
  199. package/dist/editable-label.js.map +0 -1
  200. package/dist/fallbacks-DQ_5OsmR.js.map +0 -1
  201. package/dist/flat-list-Ohxqsy0g.d.ts.map +0 -1
  202. package/dist/flat-list.js.map +0 -1
  203. package/dist/form-CsXJX15p.js.map +0 -1
  204. package/dist/form.d.ts.map +0 -1
  205. package/dist/grid-list-DjIl910A.js.map +0 -1
  206. package/dist/grid-list-pefLORIr.d.ts.map +0 -1
  207. package/dist/grouped-item-lister-Bhyo-dkH.d.ts.map +0 -1
  208. package/dist/grouped-item-lister.js.map +0 -1
  209. package/dist/grouping-CUKgmkMm.d.ts.map +0 -1
  210. package/dist/grouping-RYPnHkrS.js.map +0 -1
  211. package/dist/handle-DAXs7kbJ.js.map +0 -1
  212. package/dist/hex-editor-Caq8vNQk.d.ts.map +0 -1
  213. package/dist/hex-editor-DiYpgIKs.js.map +0 -1
  214. package/dist/highlight-B-eQrhhb.js.map +0 -1
  215. package/dist/icon-1gpwtPx8.js.map +0 -1
  216. package/dist/icon-DR_3rSyZ.d.ts.map +0 -1
  217. package/dist/icons.js.map +0 -1
  218. package/dist/incr-search-D91M4Ozq.js.map +0 -1
  219. package/dist/index-BOUaDIW-.d.ts.map +0 -1
  220. package/dist/index-BUB5SICW.d.ts.map +0 -1
  221. package/dist/index-CJ5fshD3.d.ts.map +0 -1
  222. package/dist/index-CxZ61DO1.d.ts.map +0 -1
  223. package/dist/index-DV3iaUBW.d.ts.map +0 -1
  224. package/dist/index-Dq30pOnn.d.ts.map +0 -1
  225. package/dist/index-garxxqgV.d.ts.map +0 -1
  226. package/dist/index-o-CWDt11.d.ts.map +0 -1
  227. package/dist/index.d.ts.map +0 -1
  228. package/dist/index.js.map +0 -1
  229. package/dist/item-appearance-BjcMyauw.js.map +0 -1
  230. package/dist/keyboard-B5xD7Fz-.js.map +0 -1
  231. package/dist/labelled-input-base-BFa4xlYV.js.map +0 -1
  232. package/dist/labelled-input-base-Dp_9KP0G.d.ts.map +0 -1
  233. package/dist/labelled-radial-input.d.ts.map +0 -1
  234. package/dist/labelled-radial-input.js.map +0 -1
  235. package/dist/labelled-range-input.js.map +0 -1
  236. package/dist/labelled-slider-input-FdCRi6st.js.map +0 -1
  237. package/dist/led.d.ts.map +0 -1
  238. package/dist/led.js.map +0 -1
  239. package/dist/list-group-header.d.ts.map +0 -1
  240. package/dist/list-group-header.js.map +0 -1
  241. package/dist/list-item-animation-BUoEKi5s.js.map +0 -1
  242. package/dist/list-native-drag-controller-B9xO0XWn.js.map +0 -1
  243. package/dist/list-native-drag-controller-ChIi3eK5.d.ts.map +0 -1
  244. package/dist/list-selection-controller-BeE70lbB.js.map +0 -1
  245. package/dist/list-selection-types-PjKdhF-a.d.ts.map +0 -1
  246. package/dist/list-viewport-types-BRZsLcvp.d.ts.map +0 -1
  247. package/dist/menu-CwcXXeLM.js.map +0 -1
  248. package/dist/menu-item-B0zqw2xp.d.ts.map +0 -1
  249. package/dist/menu-item-BDEekBVy.js.map +0 -1
  250. package/dist/miller.d.ts.map +0 -1
  251. package/dist/miller.js.map +0 -1
  252. package/dist/narrowed-text.js.map +0 -1
  253. package/dist/notification-pill-DyZydXoZ.d.ts.map +0 -1
  254. package/dist/notifier.js.map +0 -1
  255. package/dist/pan-text-CoYmt2qd.d.ts.map +0 -1
  256. package/dist/pan-text-CqtvjPyK.js.map +0 -1
  257. package/dist/panel.d.ts.map +0 -1
  258. package/dist/panel.js.map +0 -1
  259. package/dist/polar-pad.d.ts.map +0 -1
  260. package/dist/polar-pad.js.map +0 -1
  261. package/dist/popup-D80sj2QC.js.map +0 -1
  262. package/dist/prominence-DlFShic3.js.map +0 -1
  263. package/dist/radial-input-DU6t2hYO.d.ts.map +0 -1
  264. package/dist/radial-input-KMVltQfe.js.map +0 -1
  265. package/dist/range-input.d.ts.map +0 -1
  266. package/dist/range-input.js.map +0 -1
  267. package/dist/range.d.ts.map +0 -1
  268. package/dist/range.js.map +0 -1
  269. package/dist/registry-BEtb8_wB.js.map +0 -1
  270. package/dist/scroll-fade-BrNUIYnm.js.map +0 -1
  271. package/dist/select-horiz.d.ts.map +0 -1
  272. package/dist/select-horiz.js.map +0 -1
  273. package/dist/slider-input-BxURAAmD.d.ts.map +0 -1
  274. package/dist/slider-input-ByHdotzp.js.map +0 -1
  275. package/dist/snackbar.d.ts.map +0 -1
  276. package/dist/snackbar.js.map +0 -1
  277. package/dist/snap-container.d.ts.map +0 -1
  278. package/dist/snap-container.js.map +0 -1
  279. package/dist/split-layout-C5SYbDrq.d.ts.map +0 -1
  280. package/dist/split-layout-CXotkdbx.js.map +0 -1
  281. package/dist/swipe.d.ts.map +0 -1
  282. package/dist/swipe.js.map +0 -1
  283. package/dist/tab-list-v8mKX7Fu.d.ts.map +0 -1
  284. package/dist/tabs.js.map +0 -1
  285. package/dist/tickled-controller-D-HZymaZ.js.map +0 -1
  286. package/dist/tickled-controller-DodxD3eQ.d.ts.map +0 -1
  287. package/dist/tickled-styles-BrAHEj1q.js.map +0 -1
  288. package/dist/timeline-BP1Ux2EV.js.map +0 -1
  289. package/dist/titlebar-B5zSTZnF.d.ts.map +0 -1
  290. package/dist/titlebar.js.map +0 -1
  291. package/dist/tooltip-BlvBUQxx.d.ts.map +0 -1
  292. package/dist/tooltip-CJt3WLmN.js.map +0 -1
  293. package/dist/transitory-label.d.ts.map +0 -1
  294. package/dist/transitory-label.js.map +0 -1
  295. package/dist/tree-DGveys4K.js.map +0 -1
  296. package/dist/tree-component-Cj8V3uar.d.ts.map +0 -1
  297. package/dist/tree.d.ts.map +0 -1
  298. package/dist/types-DQ7KOUIj.d.ts.map +0 -1
  299. package/dist/vertical-list-CqBc-t8w.d.ts.map +0 -1
  300. package/dist/vertical-list.js.map +0 -1
  301. package/dist/wheel-nudge-By5s_ioH.d.ts.map +0 -1
  302. package/dist/wheel-nudge-D5rmht3v.js.map +0 -1
  303. package/dist/xy-axis-CyMd_Bn1.js.map +0 -1
  304. package/dist/xy-axis-DQqd2yXJ.d.ts.map +0 -1
  305. package/dist/xy-pad.d.ts.map +0 -1
  306. package/dist/xy-pad.js.map +0 -1
@@ -81,5 +81,3 @@ function createDragGhost(opts) {
81
81
  }
82
82
  //#endregion
83
83
  export { createDragGhost as t };
84
-
85
- //# sourceMappingURL=drag-ghost-DtSDvjri.js.map
@@ -71,5 +71,4 @@ declare global {
71
71
  }
72
72
  }
73
73
  //#endregion
74
- export { EditableMode as a, EditableLabelChangeEvent as i, EditableLabel as n, EntryMode as o, EditableLabelChangeDetail as r, DisplayTextLogic as t };
75
- //# sourceMappingURL=editable-label-rzXkjf1H.d.ts.map
74
+ export { EditableMode as a, EditableLabelChangeEvent as i, EditableLabel as n, EntryMode as o, EditableLabelChangeDetail as r, DisplayTextLogic as t };
@@ -324,5 +324,3 @@ function _selectAll(el) {
324
324
  }
325
325
  //#endregion
326
326
  export { EditableLabel };
327
-
328
- //# sourceMappingURL=editable-label.js.map
@@ -418,5 +418,3 @@ _registerThemeFallbacksOnce();
418
418
  const themeFallbacks = css``;
419
419
  //#endregion
420
420
  export { themeFallbacks as t };
421
-
422
- //# sourceMappingURL=fallbacks-DQ_5OsmR.js.map
@@ -1,9 +1,9 @@
1
- import "./icon-DR_3rSyZ.js";
1
+ import "./icon-CDGprSdE.js";
2
2
  import { k as TreeDataModel } from "./tree-component-Cj8V3uar.js";
3
3
  import { o as TreeNode, r as TreeFilterPredicate, t as LoadChildrenCallback } from "./types-DQ7KOUIj.js";
4
4
  import "./crumbs.js";
5
5
  import { i as ListInteractionMode, l as ListSelectionMode } from "./list-selection-types-PjKdhF-a.js";
6
- import { r as VerticalListElement } from "./vertical-list-CqBc-t8w.js";
6
+ import { r as VerticalListElement } from "./vertical-list-m7GJtXwv.js";
7
7
  import { LitElement, PropertyValues } from "lit";
8
8
  //#region src/flat-list/types.d.ts
9
9
  /** How branches and leaves are ordered within one level. */
@@ -180,5 +180,4 @@ interface FlatListElement {
180
180
  addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
181
181
  }
182
182
  //#endregion
183
- export { FlatListSelectEvent as _, FlatListContextMenuDetail as a, FlatListDropEvent as c, FlatListEditCommitDetail as d, FlatListEditCommitEvent as f, FlatListSelectDetail as g, FlatListNavigateEvent as h, FlatListBranchOrder as i, FlatListEditCancelDetail as l, FlatListNavigateDetail as m, FlatListActivateDetail as n, FlatListContextMenuEvent as o, FlatListElementEventMap as p, FlatListActivateEvent as r, FlatListDropDetail as s, FlatListElement as t, FlatListEditCancelEvent as u };
184
- //# sourceMappingURL=flat-list-Ohxqsy0g.d.ts.map
183
+ export { FlatListSelectEvent as _, FlatListContextMenuDetail as a, FlatListDropEvent as c, FlatListEditCommitDetail as d, FlatListEditCommitEvent as f, FlatListSelectDetail as g, FlatListNavigateEvent as h, FlatListBranchOrder as i, FlatListEditCancelDetail as l, FlatListNavigateDetail as m, FlatListActivateDetail as n, FlatListContextMenuEvent as o, FlatListElementEventMap as p, FlatListActivateEvent as r, FlatListDropDetail as s, FlatListElement as t, FlatListEditCancelEvent as u };
@@ -1,2 +1,2 @@
1
- import { _ as FlatListSelectEvent, a as FlatListContextMenuDetail, c as FlatListDropEvent, d as FlatListEditCommitDetail, f as FlatListEditCommitEvent, g as FlatListSelectDetail, h as FlatListNavigateEvent, i as FlatListBranchOrder, l as FlatListEditCancelDetail, m as FlatListNavigateDetail, n as FlatListActivateDetail, o as FlatListContextMenuEvent, p as FlatListElementEventMap, r as FlatListActivateEvent, s as FlatListDropDetail, t as FlatListElement, u as FlatListEditCancelEvent } from "./flat-list-Ohxqsy0g.js";
1
+ import { _ as FlatListSelectEvent, a as FlatListContextMenuDetail, c as FlatListDropEvent, d as FlatListEditCommitDetail, f as FlatListEditCommitEvent, g as FlatListSelectDetail, h as FlatListNavigateEvent, i as FlatListBranchOrder, l as FlatListEditCancelDetail, m as FlatListNavigateDetail, n as FlatListActivateDetail, o as FlatListContextMenuEvent, p as FlatListElementEventMap, r as FlatListActivateEvent, s as FlatListDropDetail, t as FlatListElement, u as FlatListEditCancelEvent } from "./flat-list-DNnTQ65v.js";
2
2
  export { type FlatListActivateDetail, type FlatListActivateEvent, type FlatListBranchOrder, type FlatListContextMenuDetail, type FlatListContextMenuEvent, type FlatListDropDetail, type FlatListDropEvent, type FlatListEditCancelDetail, type FlatListEditCancelEvent, type FlatListEditCommitDetail, type FlatListEditCommitEvent, FlatListElement, type FlatListElementEventMap, type FlatListNavigateDetail, type FlatListNavigateEvent, type FlatListSelectDetail, type FlatListSelectEvent };
package/dist/flat-list.js CHANGED
@@ -414,12 +414,16 @@ let FlatListElement = class FlatListElement extends LitElement {
414
414
  #onKeyDown;
415
415
  /** A crumb was chosen (or the Up button used): go to that node, or to its parent and select it if it is a leaf. */
416
416
  #onCrumbSelect;
417
+ #markedEl;
417
418
  /** Flag the marked row. Rows are rebuilt with the level, so this runs after each rebuild. */
418
419
  async #applyMarked() {
419
420
  const list = this.list;
420
421
  if (!list) return;
421
422
  await list.updateComplete;
422
- for (const row of list.querySelectorAll(`li[data-key]`)) row.toggleAttribute(`data-marked`, row.getAttribute(`data-key`) === this.markedKey);
423
+ this.#markedEl?.removeAttribute(`data-marked`);
424
+ const key = this.markedKey;
425
+ this.#markedEl = key === void 0 ? void 0 : list.getItemByKey(key);
426
+ this.#markedEl?.setAttribute(`data-marked`, ``);
423
427
  }
424
428
  /** After the inner list has rebuilt, place the cursor / selection / focus. */
425
429
  async #settleList() {
@@ -678,5 +682,3 @@ __decorate([state()], FlatListElement.prototype, "_loading", void 0);
678
682
  FlatListElement = __decorate([safeCustomElement(`ixfx-flat-list`)], FlatListElement);
679
683
  //#endregion
680
684
  export { FlatListElement };
681
-
682
- //# sourceMappingURL=flat-list.js.map
@@ -60,5 +60,3 @@ let FormElement = class FormElement extends LitElement {
60
60
  FormElement = __decorate([safeCustomElement(`ixfx-form`)], FormElement);
61
61
  //#endregion
62
62
  export { FormElement as t };
63
-
64
- //# sourceMappingURL=form-CsXJX15p.js.map
package/dist/form.d.ts CHANGED
@@ -11,5 +11,4 @@ declare global {
11
11
  }
12
12
  }
13
13
  //#endregion
14
- export { FormElement };
15
- //# sourceMappingURL=form.d.ts.map
14
+ export { FormElement };
@@ -1,5 +1,5 @@
1
1
  import { F as ListDragPreviewSourceResolver, P as ListDragPreviewRenderer, R as ListNativeDragStartEvent } from "./tree-component-Cj8V3uar.js";
2
- import { S as ListSearchController } from "./index-CxZ61DO1.js";
2
+ import { S as ListSearchController } from "./index-BYIRgv49.js";
3
3
  import "./pan-text-CoYmt2qd.js";
4
4
  import { i as ListGroupChangeEvent, n as ListGroupBy, o as ListGroupInfo, s as ListGroupLabel, u as ListGroupToggleEvent } from "./grouping-CUKgmkMm.js";
5
5
  import { i as ListInteractionMode, l as ListSelectionMode } from "./list-selection-types-PjKdhF-a.js";
@@ -667,6 +667,13 @@ declare class GridListElement<T = unknown> extends LitElement {
667
667
  * Auto-assigned keyless-item keys are omitted.
668
668
  */
669
669
  visibleKeys(): string[];
670
+ /**
671
+ * Mirror cursor / selection onto the light-DOM items as `data-tickled` /
672
+ * `data-selected`. Only the items whose state changed are touched, so a
673
+ * cursor move costs O(selection), not O(items). `full` re-checks every item —
674
+ * used when the child list changes, so markers set before the item was
675
+ * ours (or left on a removed item) are corrected.
676
+ */
670
677
  private _syncItemStates;
671
678
  private _dispatch;
672
679
  protected render(): ReturnType<typeof html>;
@@ -682,5 +689,4 @@ interface GridListElement {
682
689
  addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
683
690
  }
684
691
  //#endregion
685
- export { DragSelectRect as A, TreeKeyboardNavControllerConfig as C, ListSelectionGesture as D, ListSelectionControllerConfig as E, ListDragSelectControllerConfig as M, ListSelectionModes as O, TreeKeyboardNavController as S, ListSelectionController as T, GridListTickleDetail as _, GridListCaptionBackdrop as a, GridListViewportChangeEvent as b, GridListDataAdapter as c, GridListItemClickDetail as d, GridListItemClickEvent as f, GridListSelectEvent as g, GridListSelectDetail as h, GridListCaptionAlign as i, ListDragSelectController as j, isMultiMode as k, GridListElementEventMap as l, GridListOrientation as m, GridListActivateDetail as n, GridListCaptionPosition as o, GridListItemEventDetail as p, GridListActivateEvent as r, GridListCaptionStyle as s, GridListElement as t, GridListFullElementEventMap as u, GridListTickleEvent as v, TreeKeyboardNavItemId as w, TreeKeyboardNavCallbacks as x, GridListViewportChangeDetail as y };
686
- //# sourceMappingURL=grid-list-pefLORIr.d.ts.map
692
+ export { DragSelectRect as A, TreeKeyboardNavControllerConfig as C, ListSelectionGesture as D, ListSelectionControllerConfig as E, ListDragSelectControllerConfig as M, ListSelectionModes as O, TreeKeyboardNavController as S, ListSelectionController as T, GridListTickleDetail as _, GridListCaptionBackdrop as a, GridListViewportChangeEvent as b, GridListDataAdapter as c, GridListItemClickDetail as d, GridListItemClickEvent as f, GridListSelectEvent as g, GridListSelectDetail as h, GridListCaptionAlign as i, ListDragSelectController as j, isMultiMode as k, GridListElementEventMap as l, GridListOrientation as m, GridListActivateDetail as n, GridListCaptionPosition as o, GridListItemEventDetail as p, GridListActivateEvent as r, GridListCaptionStyle as s, GridListElement as t, GridListFullElementEventMap as u, GridListTickleEvent as v, TreeKeyboardNavItemId as w, TreeKeyboardNavCallbacks as x, GridListViewportChangeDetail as y };
@@ -2,13 +2,13 @@ import { t as TickledController } from "./tickled-controller-D-HZymaZ.js";
2
2
  import { n as tickledStyles, t as tickledItemStyles } from "./tickled-styles-BrAHEj1q.js";
3
3
  import { t as themeFallbacks } from "./fallbacks-DQ_5OsmR.js";
4
4
  import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
5
- import { c as createElementListSearchAdapter, d as createDataListSearchAdapter, i as ListSearchController, n as listSearchStyles, o as registerListSearchCommands, r as LIST_SEARCH_MODES, u as keyForElement } from "./incr-search-D91M4Ozq.js";
5
+ import { c as createElementListSearchAdapter, d as createDataListSearchAdapter, i as ListSearchController, n as listSearchStyles, o as registerListSearchCommands, r as LIST_SEARCH_MODES, u as keyForElement } from "./incr-search-JIhwB49y.js";
6
6
  import { i as resolveGroupKey, r as partitionByGroup } from "./grouping-RYPnHkrS.js";
7
7
  import { t as ListNativeDragController } from "./list-native-drag-controller-B9xO0XWn.js";
8
8
  import { r as ListDragSelectController, t as ListSelectionController } from "./list-selection-controller-BeE70lbB.js";
9
9
  import { i as listItemFadeKeyframes } from "./list-item-animation-BUoEKi5s.js";
10
10
  import "./interaction-ZTh4htzr.js";
11
- import { t as scrollFadeStyles } from "./scroll-fade-BrNUIYnm.js";
11
+ import { t as scrollFadeStyles } from "./scroll-fade-Xx28D7mH.js";
12
12
  import { n as appearanceColor, t as appearanceAbsent } from "./item-appearance-BjcMyauw.js";
13
13
  import "./pan-text-CqtvjPyK.js";
14
14
  import "./list-group-header.js";
@@ -401,16 +401,24 @@ function warnDuplicateKeys(keys) {
401
401
  }
402
402
  if (dupes.size > 0) console.warn(`ixfx-grid-list: duplicate item key(s) ${[...dupes].map((k) => `"${k}"`).join(`, `)} — the first occurrence wins for key-based operations.`);
403
403
  }
404
+ /** Key → first effective index, built from `keys` (first occurrence wins on duplicates). */
405
+ function indexByKey(keys) {
406
+ const index = /* @__PURE__ */ new Map();
407
+ keys.forEach((k, i) => {
408
+ if (!index.has(k)) index.set(k, i);
409
+ });
410
+ return index;
411
+ }
404
412
  var ElementGridListSource = class {
405
413
  #host;
406
414
  #items = [];
407
- #slotNames = /* @__PURE__ */ new WeakMap();
408
415
  #syntheticKeys = /* @__PURE__ */ new WeakMap();
409
416
  #seq = 0;
410
417
  #predicate;
411
418
  #searchKeys;
412
419
  #effectiveIndices = [];
413
420
  #keysCache;
421
+ #indexCache;
414
422
  #grouping;
415
423
  #groups = [];
416
424
  #groupByKey = /* @__PURE__ */ new Map();
@@ -429,7 +437,8 @@ var ElementGridListSource = class {
429
437
  return eff === void 0 ? `` : this.#itemKey(this.#items[eff]);
430
438
  }
431
439
  indexOfKey(key) {
432
- return this.#effectiveIndices.findIndex((i) => this.#itemKey(this.#items[i]) === key);
440
+ this.#indexCache ??= indexByKey(this.keys());
441
+ return this.#indexCache.get(key) ?? -1;
433
442
  }
434
443
  keys() {
435
444
  this.#keysCache ??= this.#effectiveIndices.map((i) => this.#itemKey(this.#items[i]));
@@ -452,11 +461,11 @@ var ElementGridListSource = class {
452
461
  const eff = this.#effectiveIndices[index];
453
462
  return eff !== void 0 && !this.#items[eff].hasAttribute(`not-checked`);
454
463
  }
455
- renderCellContent(index) {
456
- const eff = this.#effectiveIndices[index];
457
- if (eff === void 0) return void 0;
458
- return html`<slot name=${this.slotNameFor(this.#items[eff])}></slot>`;
459
- }
464
+ /**
465
+ * Element mode cells project their item through a per-cell `<slot>` that
466
+ * `GridListElement` renders and assigns itself (see its `#applyCellSlots`).
467
+ */
468
+ renderCellContent(_index) {}
460
469
  iconAt(_index) {}
461
470
  iconColorAt(_index) {}
462
471
  textColorAt(_index) {}
@@ -478,10 +487,6 @@ var ElementGridListSource = class {
478
487
  }
479
488
  refresh() {
480
489
  this.#items = Array.from(this.#host.querySelectorAll(ITEM_SELECTOR$1)).filter((el) => !el.hidden);
481
- for (const el of this.#items) {
482
- const name = this.slotNameFor(el);
483
- if (el.getAttribute(`slot`) !== name) el.setAttribute(`slot`, name);
484
- }
485
490
  warnDuplicateKeys(this.#items.map((el) => this.#itemKey(el)));
486
491
  this.#recomputeEffective();
487
492
  }
@@ -493,16 +498,6 @@ var ElementGridListSource = class {
493
498
  rawElementAt(index) {
494
499
  return this.#items[index];
495
500
  }
496
- /** Stable per-element `<slot>` name. */
497
- slotNameFor(el) {
498
- let name = this.#slotNames.get(el);
499
- if (name === void 0) {
500
- this.#seq += 1;
501
- name = `gl-item-${this.#seq}`;
502
- this.#slotNames.set(el, name);
503
- }
504
- return name;
505
- }
506
501
  resolveKeyToElement(key) {
507
502
  if (isSyntheticKey(key)) return this.#items.find((el) => this.#syntheticKeys.get(el) === key);
508
503
  return this.#items.find((el) => keyForElement(el) === key);
@@ -520,6 +515,7 @@ var ElementGridListSource = class {
520
515
  }
521
516
  this.#applyGroupingTo(effective);
522
517
  this.#keysCache = void 0;
518
+ this.#indexCache = void 0;
523
519
  }
524
520
  #applyGroupingTo(effective) {
525
521
  if (this.#grouping === void 0) {
@@ -555,6 +551,7 @@ var DataGridListSource = class {
555
551
  #searchKeys;
556
552
  #effectiveIndices = [];
557
553
  #keysCache;
554
+ #indexCache;
558
555
  #grouping;
559
556
  #groups = [];
560
557
  #groupByKey = /* @__PURE__ */ new Map();
@@ -575,7 +572,8 @@ var DataGridListSource = class {
575
572
  return eff === void 0 ? `` : this.#adapter.key(this.#items[eff], eff);
576
573
  }
577
574
  indexOfKey(key) {
578
- return this.#effectiveIndices.findIndex((i) => this.#adapter.key(this.#items[i], i) === key);
575
+ this.#indexCache ??= indexByKey(this.keys());
576
+ return this.#indexCache.get(key) ?? -1;
579
577
  }
580
578
  keys() {
581
579
  this.#keysCache ??= this.#effectiveIndices.map((i) => this.#adapter.key(this.#items[i], i));
@@ -668,6 +666,7 @@ var DataGridListSource = class {
668
666
  this.#groupByKey = grouped.groupByKey;
669
667
  }
670
668
  this.#keysCache = void 0;
669
+ this.#indexCache = void 0;
671
670
  }
672
671
  };
673
672
  //#endregion
@@ -694,6 +693,15 @@ function sameKeys(a, b) {
694
693
  for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;
695
694
  return true;
696
695
  }
696
+ /**
697
+ * Set `attr` on exactly the elements in `now`, removing it from those in
698
+ * `previous` that no longer qualify. Returns the new marked set.
699
+ */
700
+ function syncMarker(attr, previous, now) {
701
+ for (const el of previous) if (!now.has(el)) el.removeAttribute(attr);
702
+ for (const el of now) if (!el.hasAttribute(attr)) el.setAttribute(attr, ``);
703
+ return now;
704
+ }
697
705
  let GridListElement = class GridListElement extends LitElement {
698
706
  constructor(..._args) {
699
707
  super(..._args);
@@ -728,6 +736,11 @@ let GridListElement = class GridListElement extends LitElement {
728
736
  this.#snapTimer = 0;
729
737
  this.#items = [];
730
738
  this.#itemWrap = `stop`;
739
+ this.#cellIds = /* @__PURE__ */ new Map();
740
+ this.#nextCellId = 0;
741
+ this.#recycledKeys = /* @__PURE__ */ new Set();
742
+ this.#windowSlots = [];
743
+ this.#slottedItems = /* @__PURE__ */ new Map();
731
744
  this.#entering = /* @__PURE__ */ new Set();
732
745
  this.#reflowTimer = 0;
733
746
  this.#sourceElement = new ElementGridListSource(this);
@@ -851,6 +864,8 @@ let GridListElement = class GridListElement extends LitElement {
851
864
  }
852
865
  });
853
866
  this.#groupByChanged = false;
867
+ this.#markedTickled = /* @__PURE__ */ new Set();
868
+ this.#markedSelected = /* @__PURE__ */ new Set();
854
869
  this.#selectedSnapshot = /* @__PURE__ */ new Set();
855
870
  this.#onScroll = (e) => {
856
871
  const el = e.target;
@@ -1340,6 +1355,14 @@ let GridListElement = class GridListElement extends LitElement {
1340
1355
  .cell.entering {
1341
1356
  animation: ixfx-list-item-in var(--grid-list-item-move-duration, 200ms) ease both;
1342
1357
  }
1358
+ /* A recycled cell has just been handed from one item to another (see
1359
+ #assignCellIds); it must not animate from the previous item's state
1360
+ or position. */
1361
+ .cell.recycled,
1362
+ .cell.recycled > .thumb,
1363
+ .cell.recycled > .thumb::after {
1364
+ transition: none !important;
1365
+ }
1343
1366
  @media (prefers-reduced-motion: reduce) {
1344
1367
  :host([reflowing]) .group-header { transition: none; }
1345
1368
  :host([reflowing]) .cell { transition: background var(--transition), border-color var(--transition); }
@@ -1371,11 +1394,39 @@ let GridListElement = class GridListElement extends LitElement {
1371
1394
  #viewportRef;
1372
1395
  #resizeObserver;
1373
1396
  #mutationObserver;
1397
+ /**
1398
+ * Watches item (direct child) attributes that change the item set: `hidden`
1399
+ * drops an item from layout, `data-key` / `data-value` change its identity.
1400
+ * Separate from {@link #mutationObserver} because attribute observation of
1401
+ * children needs `subtree`, which must not apply to the child list.
1402
+ */
1403
+ #itemAttrObserver;
1374
1404
  #scrollRaf;
1375
1405
  /** Debounce handle for {@link snapToItem} — fires once scrolling settles. */
1376
1406
  #snapTimer;
1377
1407
  #items;
1378
1408
  #itemWrap;
1409
+ /**
1410
+ * Cell recycling. Each rendered key holds a stable cell id, and `repeat` is
1411
+ * keyed by that id rather than the item key, so a cell scrolled out of the
1412
+ * window hands its DOM to an item scrolling in instead of being destroyed and
1413
+ * recreated. Item-keyed `repeat` gets steadily slower in Chrome when every key
1414
+ * in the window is new (a scrollbar drag / fling), and recreating ~100 cells a
1415
+ * frame is costly in any case. See {@link #assignCellIds}.
1416
+ */
1417
+ #cellIds;
1418
+ #nextCellId;
1419
+ /** Keys whose cell was taken over from another item in the latest render. */
1420
+ #recycledKeys;
1421
+ /**
1422
+ * Element mode: each cell has a fixed `<slot name="gl-cell-<id>">`, and the
1423
+ * light-DOM item it shows is pointed at it via its `slot` attribute. Moving
1424
+ * that attribute is far cheaper than renaming slots, which makes the browser
1425
+ * re-match every light-DOM child. `#windowSlots` is the assignment the latest
1426
+ * render wants (applied in `updated()`); `#slottedItems` is what's applied.
1427
+ */
1428
+ #windowSlots;
1429
+ #slottedItems;
1379
1430
  /** Items added mid-list that are still playing their enter animation. */
1380
1431
  #entering;
1381
1432
  /** Timer that ends the `[reflowing]` window opened by a mid-list insertion. */
@@ -1563,9 +1614,15 @@ let GridListElement = class GridListElement extends LitElement {
1563
1614
  this.addEventListener(`pointermove`, this.#onHostPointerMove, { passive: true });
1564
1615
  this.addEventListener(`pointerleave`, this.#onHostPointerLeave);
1565
1616
  this.#mutationObserver ??= new MutationObserver((records) => this.#onChildrenChanged(records));
1566
- this.#mutationObserver.observe(this, {
1567
- childList: true,
1568
- attributeFilter: [`hidden`]
1617
+ this.#mutationObserver.observe(this, { childList: true });
1618
+ this.#itemAttrObserver ??= new MutationObserver((records) => this.#onItemAttributesChanged(records));
1619
+ this.#itemAttrObserver.observe(this, {
1620
+ subtree: true,
1621
+ attributeFilter: [
1622
+ `hidden`,
1623
+ `data-key`,
1624
+ `data-value`
1625
+ ]
1569
1626
  });
1570
1627
  this.#searchRegistry ??= createCommandRegistry();
1571
1628
  this.#ensureSearch();
@@ -1581,6 +1638,7 @@ let GridListElement = class GridListElement extends LitElement {
1581
1638
  this.#resizeObserver?.disconnect();
1582
1639
  this.#resizeObserver = void 0;
1583
1640
  this.#mutationObserver?.disconnect();
1641
+ this.#itemAttrObserver?.disconnect();
1584
1642
  this.#cancelScrollRaf();
1585
1643
  this.#cancelSnapTimer();
1586
1644
  this.#unregisterSearchCommands?.();
@@ -1592,6 +1650,10 @@ let GridListElement = class GridListElement extends LitElement {
1592
1650
  }
1593
1651
  if (this.#nativeDragging || this.#nativeDrag.isDragging) this.#clearNativeDragState();
1594
1652
  }
1653
+ /** Only attribute changes on items themselves matter, not on their content. */
1654
+ #onItemAttributesChanged(records) {
1655
+ if (records.some((r) => r.target.parentNode === this)) this.#onChildrenChanged([]);
1656
+ }
1595
1657
  #onChildrenChanged(records) {
1596
1658
  const previousLength = this.#items.length;
1597
1659
  this.#syncItems();
@@ -1608,7 +1670,7 @@ let GridListElement = class GridListElement extends LitElement {
1608
1670
  const tickledId = this.tickled.tickledId;
1609
1671
  if (tickledId && gone.includes(tickledId)) this.tickled.focus(void 0);
1610
1672
  }
1611
- this._syncItemStates();
1673
+ this._syncItemStates(true);
1612
1674
  this.#noteChildMutation(previousLength, records);
1613
1675
  this.requestUpdate();
1614
1676
  this.updateComplete.then(() => this.#emitViewportChange());
@@ -1680,6 +1742,11 @@ let GridListElement = class GridListElement extends LitElement {
1680
1742
  const w = entry.contentRect.width;
1681
1743
  const h = entry.contentRect.height;
1682
1744
  if (w <= 0 || h <= 0) return;
1745
+ if (w === this._viewportWidth && h === this._viewportHeight) continue;
1746
+ const horizontal = this.orientation === `row`;
1747
+ const prevOffset = horizontal ? this._scrollLeft : this._scrollTop;
1748
+ const prevExtent = horizontal ? this._viewportWidth : this._viewportHeight;
1749
+ if (prevExtent > 0 && prevOffset > 1) this.#captureCentreAnchor(prevOffset, prevExtent, this.itemSize, this.gap, this.captionStyle, this.captionHeight, this.orientation);
1683
1750
  this._viewportWidth = w;
1684
1751
  this._viewportHeight = h;
1685
1752
  }
@@ -1841,7 +1908,11 @@ let GridListElement = class GridListElement extends LitElement {
1841
1908
  }
1842
1909
  updated(changed) {
1843
1910
  super.updated(changed);
1844
- this.#syncItems();
1911
+ const pending = this.#mutationObserver?.takeRecords();
1912
+ const pendingAttrs = this.#itemAttrObserver?.takeRecords();
1913
+ if (pending !== void 0 && pending.length > 0) this.#onChildrenChanged(pending);
1914
+ else if (pendingAttrs !== void 0 && pendingAttrs.length > 0) this.#onItemAttributesChanged(pendingAttrs);
1915
+ if (this.#source instanceof ElementGridListSource) this.#applyCellSlots();
1845
1916
  if (changed.has(`selectionMode`) || changed.has(`interactionMode`)) {
1846
1917
  this.selection.clearAnchor();
1847
1918
  this.#syncAriaMultiselectable();
@@ -2193,13 +2264,36 @@ let GridListElement = class GridListElement extends LitElement {
2193
2264
  this._scrollTop = next;
2194
2265
  }
2195
2266
  }
2196
- _syncItemStates() {
2267
+ /** Light-DOM items currently carrying `data-tickled` / `data-selected`. */
2268
+ #markedTickled;
2269
+ #markedSelected;
2270
+ /**
2271
+ * Mirror cursor / selection onto the light-DOM items as `data-tickled` /
2272
+ * `data-selected`. Only the items whose state changed are touched, so a
2273
+ * cursor move costs O(selection), not O(items). `full` re-checks every item —
2274
+ * used when the child list changes, so markers set before the item was
2275
+ * ours (or left on a removed item) are corrected.
2276
+ */
2277
+ _syncItemStates(full = false) {
2197
2278
  const selected = this.selection.selectedKeys;
2198
- for (const el of this.#items) {
2199
- const key = keyForElement(el);
2200
- el.toggleAttribute(`data-tickled`, key !== void 0 && this.tickled.isTickled(key));
2201
- el.toggleAttribute(`data-selected`, key !== void 0 && selected.has(key));
2279
+ const tickledId = this.tickled.tickledId;
2280
+ const elementFor = (key) => {
2281
+ if (isSyntheticKey(key)) return void 0;
2282
+ const index = this.#source.indexOfKey(key);
2283
+ return index < 0 ? void 0 : this.#items[index];
2284
+ };
2285
+ const tickledEl = tickledId === void 0 ? void 0 : elementFor(tickledId);
2286
+ const selectedEls = /* @__PURE__ */ new Set();
2287
+ for (const key of selected) {
2288
+ const el = elementFor(key);
2289
+ if (el) selectedEls.add(el);
2202
2290
  }
2291
+ if (full) for (const el of this.#items) {
2292
+ this.#markedTickled.add(el);
2293
+ this.#markedSelected.add(el);
2294
+ }
2295
+ this.#markedTickled = syncMarker(`data-tickled`, this.#markedTickled, tickledEl ? /* @__PURE__ */ new Set([tickledEl]) : /* @__PURE__ */ new Set());
2296
+ this.#markedSelected = syncMarker(`data-selected`, this.#markedSelected, selectedEls);
2203
2297
  this.setAttribute(`data-input-mode`, this.tickled.inputMode);
2204
2298
  }
2205
2299
  #emitSelect(selected, previous) {
@@ -2269,8 +2363,57 @@ let GridListElement = class GridListElement extends LitElement {
2269
2363
  `;
2270
2364
  }
2271
2365
  #renderDataCells(win) {
2366
+ const slice = this.#windowSlice(win);
2367
+ return repeat(slice, (index) => this.#cellIds.get(this.#source.keyAt(index)), (index) => this.#renderDataCell(index, win));
2368
+ }
2369
+ #cellSlotName(key) {
2370
+ return `gl-cell-${this.#cellIds.get(key)}`;
2371
+ }
2372
+ /**
2373
+ * Element mode: point each rendered item's `slot` at its cell, and clear it on
2374
+ * items that left the window (or the DOM) so they project nowhere.
2375
+ */
2376
+ #applyCellSlots() {
2377
+ const next = /* @__PURE__ */ new Map();
2378
+ for (const [el, name] of this.#windowSlots) {
2379
+ next.set(el, name);
2380
+ if (el.getAttribute(`slot`) !== name) el.setAttribute(`slot`, name);
2381
+ }
2382
+ for (const el of this.#slottedItems.keys()) if (!next.has(el)) el.removeAttribute(`slot`);
2383
+ this.#slottedItems = next;
2384
+ }
2385
+ /** Effective indices in the rendered window, with cell ids assigned to their keys. */
2386
+ #windowSlice(win) {
2272
2387
  const slice = win.ranges.flatMap(([start, end]) => Array.from({ length: end - start }, (_, i) => start + i));
2273
- return repeat(slice, (index) => this.#source.keyAt(index), (index) => this.#renderDataCell(index, win));
2388
+ this.#assignCellIds(slice.map((index) => this.#source.keyAt(index)));
2389
+ return slice;
2390
+ }
2391
+ /**
2392
+ * Give every key in the window a cell id: keys already rendered keep theirs;
2393
+ * new keys take the ids freed by keys that left the window (recycling that
2394
+ * cell's DOM), and only mint a fresh id when none is free.
2395
+ */
2396
+ #assignCellIds(keys) {
2397
+ const inWindow = new Set(keys);
2398
+ const free = [];
2399
+ for (const [key, id] of this.#cellIds) if (!inWindow.has(key)) free.push(id);
2400
+ const next = /* @__PURE__ */ new Map();
2401
+ for (const key of keys) {
2402
+ const id = this.#cellIds.get(key);
2403
+ if (id !== void 0) next.set(key, id);
2404
+ }
2405
+ const recycled = /* @__PURE__ */ new Set();
2406
+ for (const key of keys) {
2407
+ if (next.has(key)) continue;
2408
+ const id = free.pop();
2409
+ if (id === void 0) next.set(key, this.#nextCellId++);
2410
+ else {
2411
+ next.set(key, id);
2412
+ recycled.add(key);
2413
+ }
2414
+ }
2415
+ this.#cellIds = next;
2416
+ this.#recycledKeys = recycled;
2274
2417
  }
2275
2418
  #renderDataCell(index, win) {
2276
2419
  const key = this.#source.keyAt(index);
@@ -2290,10 +2433,12 @@ let GridListElement = class GridListElement extends LitElement {
2290
2433
  const icon = appearanceAbsent(rawIcon) ? void 0 : rawIcon;
2291
2434
  return html`
2292
2435
  <div
2293
- class="cell${selected ? ` selected` : ``}${tickled ? ` tickled` : ``}${marquee ? ` marquee` : ``}${this.#nativeDragging && key === this.#dragOriginKey ? ` dragging-origin` : ``}"
2436
+ class="cell${selected ? ` selected` : ``}${tickled ? ` tickled` : ``}${marquee ? ` marquee` : ``}${this.#recycledKeys.has(key) ? ` recycled` : ``}${this.#nativeDragging && key === this.#dragOriginKey ? ` dragging-origin` : ``}"
2294
2437
  part="item${selected ? ` selected` : ``}${tickled ? ` tickled` : ``}"
2295
2438
  role="option"
2296
2439
  aria-selected=${selected ? `true` : `false`}
2440
+ aria-setsize=${this.#source.count}
2441
+ aria-posinset=${index + 1}
2297
2442
  style="width:${this.itemSize}px;height:${cellHeight}px;transform:translate(${x}px,${y}px)"
2298
2443
  data-index=${index}
2299
2444
  data-key=${key}
@@ -2370,8 +2515,9 @@ let GridListElement = class GridListElement extends LitElement {
2370
2515
  current.startLoop?.();
2371
2516
  }
2372
2517
  #renderElementCells(win) {
2373
- const slice = win.ranges.flatMap(([start, end]) => Array.from({ length: end - start }, (_, i) => start + i));
2374
- return repeat(slice, (index) => this.#source.keyAt(index), (index) => this.#renderCell(this.#items[index], index, win));
2518
+ const slice = this.#windowSlice(win);
2519
+ this.#windowSlots = slice.map((index) => [this.#items[index], this.#cellSlotName(this.#source.keyAt(index))]);
2520
+ return repeat(slice, (index) => this.#cellIds.get(this.#source.keyAt(index)), (index) => this.#renderCell(this.#items[index], index, win));
2375
2521
  }
2376
2522
  #renderHeaders(win) {
2377
2523
  if (win.headers.length === 0) return nothing;
@@ -2380,6 +2526,7 @@ let GridListElement = class GridListElement extends LitElement {
2380
2526
  <ixfx-list-group-header
2381
2527
  class="group-header"
2382
2528
  part="group-header"
2529
+ role="presentation"
2383
2530
  data-group-key=${h.key}
2384
2531
  label=${h.label}
2385
2532
  count=${h.count}
@@ -2408,10 +2555,12 @@ let GridListElement = class GridListElement extends LitElement {
2408
2555
  const captionCss = separate ? `height:${Math.max(0, this.captionHeight - 4)}px` : style === `under` ? `height:${this.captionHeight}px` : ``;
2409
2556
  return html`
2410
2557
  <div
2411
- class="cell${selected ? ` selected` : ``}${tickled ? ` tickled` : ``}${entering ? ` entering` : ``}${marquee ? ` marquee` : ``}${this.#nativeDragging && key === this.#dragOriginKey ? ` dragging-origin` : ``}"
2558
+ class="cell${selected ? ` selected` : ``}${tickled ? ` tickled` : ``}${entering ? ` entering` : ``}${marquee ? ` marquee` : ``}${this.#recycledKeys.has(key) ? ` recycled` : ``}${this.#nativeDragging && key === this.#dragOriginKey ? ` dragging-origin` : ``}"
2412
2559
  part="item${selected ? ` selected` : ``}${tickled ? ` tickled` : ``}"
2413
2560
  role="option"
2414
2561
  aria-selected=${selected ? `true` : `false`}
2562
+ aria-setsize=${this.#source.count}
2563
+ aria-posinset=${index + 1}
2415
2564
  style="width:${this.itemSize}px;height:${cellHeight}px;transform:translate(${x}px,${y}px)"
2416
2565
  data-index=${index}
2417
2566
  data-key=${key}
@@ -2424,7 +2573,7 @@ let GridListElement = class GridListElement extends LitElement {
2424
2573
  @pointerenter=${() => this.#handleCellPointerEnter(key)}
2425
2574
  >
2426
2575
  <div class="thumb" part="thumb" style=${thumbStyle}>
2427
- ${this.#source.renderCellContent(index)}
2576
+ <slot name=${this.#cellSlotName(key)}></slot>
2428
2577
  </div>
2429
2578
  ${showCaption ? this.#renderCaption(caption, captionCss, tickled) : ``}
2430
2579
  </div>
@@ -2659,5 +2808,3 @@ __decorate([state()], GridListElement.prototype, "_viewportWidth", void 0);
2659
2808
  GridListElement = __decorate([safeCustomElement(`ixfx-grid-list`)], GridListElement);
2660
2809
  //#endregion
2661
2810
  export { GridListElement as t };
2662
-
2663
- //# sourceMappingURL=grid-list-DjIl910A.js.map
@@ -1,5 +1,5 @@
1
1
  import { I as ListDragSource, L as ListNativeDragStartDetail, M as ListDragPreview, N as ListDragPreviewContext, P as ListDragPreviewRenderer, R as ListNativeDragStartEvent, j as ListDragEntry } from "./tree-component-Cj8V3uar.js";
2
2
  import { i as ListGroupChangeEvent, l as ListGroupToggleDetail, n as ListGroupBy, o as ListGroupInfo, r as ListGroupChangeDetail, s as ListGroupLabel, u as ListGroupToggleEvent } from "./grouping-CUKgmkMm.js";
3
3
  import { i as ListInteractionMode, l as ListSelectionMode } from "./list-selection-types-PjKdhF-a.js";
4
- import { _ as GridListTickleDetail, a as GridListCaptionBackdrop, b as GridListViewportChangeEvent, c as GridListDataAdapter, d as GridListItemClickDetail, f as GridListItemClickEvent, g as GridListSelectEvent, h as GridListSelectDetail, i as GridListCaptionAlign, l as GridListElementEventMap, m as GridListOrientation, n as GridListActivateDetail, o as GridListCaptionPosition, p as GridListItemEventDetail, r as GridListActivateEvent, s as GridListCaptionStyle, t as GridListElement, u as GridListFullElementEventMap, v as GridListTickleEvent, y as GridListViewportChangeDetail } from "./grid-list-pefLORIr.js";
4
+ import { _ as GridListTickleDetail, a as GridListCaptionBackdrop, b as GridListViewportChangeEvent, c as GridListDataAdapter, d as GridListItemClickDetail, f as GridListItemClickEvent, g as GridListSelectEvent, h as GridListSelectDetail, i as GridListCaptionAlign, l as GridListElementEventMap, m as GridListOrientation, n as GridListActivateDetail, o as GridListCaptionPosition, p as GridListItemEventDetail, r as GridListActivateEvent, s as GridListCaptionStyle, t as GridListElement, u as GridListFullElementEventMap, v as GridListTickleEvent, y as GridListViewportChangeDetail } from "./grid-list-BLnV9oZE.js";
5
5
  export { type GridListActivateDetail, type GridListActivateEvent, type GridListCaptionAlign, type GridListCaptionBackdrop, type GridListCaptionPosition, type GridListCaptionStyle, type GridListDataAdapter, GridListElement, type GridListElementEventMap, type GridListFullElementEventMap, type GridListItemClickDetail, type GridListItemClickEvent, type GridListItemEventDetail, type GridListOrientation, type GridListSelectDetail, type GridListSelectEvent, type GridListTickleDetail, type GridListTickleEvent, type GridListViewportChangeDetail, type GridListViewportChangeEvent, type ListDragEntry, type ListDragPreview, type ListDragPreviewContext, type ListDragPreviewRenderer, type ListDragSource, type ListGroupBy, type ListGroupChangeDetail, type ListGroupChangeEvent, type ListGroupInfo, type ListGroupLabel, type ListGroupToggleDetail, type ListGroupToggleEvent, type ListInteractionMode, type ListNativeDragStartDetail, type ListNativeDragStartEvent, type ListSelectionMode };
package/dist/grid-list.js CHANGED
@@ -1,3 +1,3 @@
1
1
  import "./list-group-header.js";
2
- import { t as GridListElement } from "./grid-list-DjIl910A.js";
2
+ import { t as GridListElement } from "./grid-list-CkU8gHCh.js";
3
3
  export { GridListElement };
@@ -106,7 +106,7 @@ declare class GroupedItemListerElement<T = unknown> extends LitElement {
106
106
  connectedCallback(): void;
107
107
  disconnectedCallback(): void;
108
108
  protected updated(changed: PropertyValues): void;
109
- protected render(): import("lit").TemplateResult<1> | typeof nothing;
109
+ protected render(): typeof nothing | import("lit").TemplateResult<1>;
110
110
  }
111
111
  declare global {
112
112
  interface HTMLElementTagNameMap {
@@ -117,5 +117,4 @@ interface GroupedItemListerElement<T> {
117
117
  addEventListener: (<K extends keyof GroupedItemListerElementEventMap<T>>(type: K, listener: (this: GroupedItemListerElement<T>, event: GroupedItemListerElementEventMap<T>[K]) => void, options?: boolean | AddEventListenerOptions) => void) & ((type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions) => void);
118
118
  }
119
119
  //#endregion
120
- export { IGroupedSubComponent as a, SubComponentActivateEvent as c, SubComponentItemClickEvent as d, SubComponentSelectDetail as f, SubComponentTickleEvent as h, GroupedSelectEvent as i, SubComponentFactory as l, SubComponentTickleDetail as m, GroupedItemListerElementEventMap as n, IGroupedSubComponentEventMap as o, SubComponentSelectEvent as p, GroupedSelectDetail as r, SubComponentActivateDetail as s, GroupedItemListerElement as t, SubComponentItemClickDetail as u };
121
- //# sourceMappingURL=grouped-item-lister-Bhyo-dkH.d.ts.map
120
+ export { IGroupedSubComponent as a, SubComponentActivateEvent as c, SubComponentItemClickEvent as d, SubComponentSelectDetail as f, SubComponentTickleEvent as h, GroupedSelectEvent as i, SubComponentFactory as l, SubComponentTickleDetail as m, GroupedItemListerElementEventMap as n, IGroupedSubComponentEventMap as o, SubComponentSelectEvent as p, GroupedSelectDetail as r, SubComponentActivateDetail as s, GroupedItemListerElement as t, SubComponentItemClickDetail as u };
@@ -1,2 +1,2 @@
1
- import { a as IGroupedSubComponent, c as SubComponentActivateEvent, d as SubComponentItemClickEvent, f as SubComponentSelectDetail, h as SubComponentTickleEvent, i as GroupedSelectEvent, l as SubComponentFactory, m as SubComponentTickleDetail, n as GroupedItemListerElementEventMap, o as IGroupedSubComponentEventMap, p as SubComponentSelectEvent, r as GroupedSelectDetail, s as SubComponentActivateDetail, t as GroupedItemListerElement, u as SubComponentItemClickDetail } from "./grouped-item-lister-Bhyo-dkH.js";
1
+ import { a as IGroupedSubComponent, c as SubComponentActivateEvent, d as SubComponentItemClickEvent, f as SubComponentSelectDetail, h as SubComponentTickleEvent, i as GroupedSelectEvent, l as SubComponentFactory, m as SubComponentTickleDetail, n as GroupedItemListerElementEventMap, o as IGroupedSubComponentEventMap, p as SubComponentSelectEvent, r as GroupedSelectDetail, s as SubComponentActivateDetail, t as GroupedItemListerElement, u as SubComponentItemClickDetail } from "./grouped-item-lister-DETte0Dh.js";
2
2
  export { GroupedItemListerElement, type GroupedItemListerElementEventMap, type GroupedSelectDetail, type GroupedSelectEvent, type IGroupedSubComponent, type IGroupedSubComponentEventMap, type SubComponentActivateDetail, type SubComponentActivateEvent, type SubComponentFactory, type SubComponentItemClickDetail, type SubComponentItemClickEvent, type SubComponentSelectDetail, type SubComponentSelectEvent, type SubComponentTickleDetail, type SubComponentTickleEvent };
@@ -173,5 +173,3 @@ __decorate([property({
173
173
  GroupedItemListerElement = __decorate([safeCustomElement(`ixfx-grouped-item-lister`)], GroupedItemListerElement);
174
174
  //#endregion
175
175
  export { GroupedItemListerElement };
176
-
177
- //# sourceMappingURL=grouped-item-lister.js.map
@@ -59,5 +59,4 @@ declare function partitionByGroup<T>(items: readonly T[], keyOf: (item: T, index
59
59
  /** Immutable toggle of `key` in `set`. */
60
60
  declare function toggleInSet(set: ReadonlySet<string>, key: string): Set<string>;
61
61
  //#endregion
62
- export { ListGroupEventMap as a, ListGroupPartition as c, defaultGroupLabel as d, partitionByGroup as f, toggleInSet as h, ListGroupChangeEvent as i, ListGroupToggleDetail as l, toGroupKey as m, ListGroupBy as n, ListGroupInfo as o, resolveGroupKey as p, ListGroupChangeDetail as r, ListGroupLabel as s, EMPTY_GROUP_LABEL as t, ListGroupToggleEvent as u };
63
- //# sourceMappingURL=grouping-CUKgmkMm.d.ts.map
62
+ export { ListGroupEventMap as a, ListGroupPartition as c, defaultGroupLabel as d, partitionByGroup as f, toggleInSet as h, ListGroupChangeEvent as i, ListGroupToggleDetail as l, toGroupKey as m, ListGroupBy as n, ListGroupInfo as o, resolveGroupKey as p, ListGroupChangeDetail as r, ListGroupLabel as s, EMPTY_GROUP_LABEL as t, ListGroupToggleEvent as u };
@@ -49,5 +49,3 @@ function toggleInSet(set, key) {
49
49
  }
50
50
  //#endregion
51
51
  export { toGroupKey as a, resolveGroupKey as i, defaultGroupLabel as n, toggleInSet as o, partitionByGroup as r, EMPTY_GROUP_LABEL as t };
52
-
53
- //# sourceMappingURL=grouping-RYPnHkrS.js.map
@@ -652,5 +652,3 @@ const handleStyles = css`
652
652
  `;
653
653
  //#endregion
654
654
  export { handleStyles as t };
655
-
656
- //# sourceMappingURL=handle-DAXs7kbJ.js.map