@ixfx/components 0.5.20 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/bundle/index.d.ts +535 -263
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +7971 -6596
  4. package/bundle/index.js.map +1 -1
  5. package/dist/ac-text.d.ts +12 -7
  6. package/dist/ac-text.d.ts.map +1 -1
  7. package/dist/ac-text.js +3 -4
  8. package/dist/ac-text.js.map +1 -1
  9. package/dist/ac-token-DVbmHmky.d.ts +107 -0
  10. package/dist/ac-token-DVbmHmky.d.ts.map +1 -0
  11. package/dist/ac-token.d.ts +2 -0
  12. package/dist/ac-token.js +646 -0
  13. package/dist/ac-token.js.map +1 -0
  14. package/dist/{button-pcDaCemT.js → button-Bn0BuLpO.js} +3 -4
  15. package/dist/{button-pcDaCemT.js.map → button-Bn0BuLpO.js.map} +1 -1
  16. package/dist/button.d.ts +1 -2
  17. package/dist/button.d.ts.map +1 -1
  18. package/dist/button.js +1 -1
  19. package/dist/checkbox.d.ts +0 -1
  20. package/dist/checkbox.d.ts.map +1 -1
  21. package/dist/checkbox.js +1 -1
  22. package/dist/checkbox.js.map +1 -1
  23. package/dist/{colour-picker-D43Q96r0.js → colour-picker-0stHB90J.js} +11 -14
  24. package/dist/{colour-picker-D43Q96r0.js.map → colour-picker-0stHB90J.js.map} +1 -1
  25. package/dist/colour-picker.d.ts +1 -1
  26. package/dist/colour-picker.js +1 -1
  27. package/dist/crumbs.d.ts +4 -2
  28. package/dist/crumbs.d.ts.map +1 -1
  29. package/dist/crumbs.js +1152 -1
  30. package/dist/crumbs.js.map +1 -0
  31. package/dist/data-controller-DOlmqNKb.js +171 -0
  32. package/dist/data-controller-DOlmqNKb.js.map +1 -0
  33. package/dist/data-display.d.ts +1 -2
  34. package/dist/data-display.d.ts.map +1 -1
  35. package/dist/data-display.js +24 -22
  36. package/dist/data-display.js.map +1 -1
  37. package/dist/data-grid-BeAkORz2.d.ts +215 -0
  38. package/dist/data-grid-BeAkORz2.d.ts.map +1 -0
  39. package/dist/data-grid.d.ts +2 -0
  40. package/dist/data-grid.js +1225 -0
  41. package/dist/data-grid.js.map +1 -0
  42. package/dist/data-provider-BAn_-oR1.d.ts +61 -0
  43. package/dist/data-provider-BAn_-oR1.d.ts.map +1 -0
  44. package/dist/{decorate-DdjvVHS-.js → decorate-VRK8rslU.js} +2 -2
  45. package/dist/{decorate-DdjvVHS-.js.map → decorate-VRK8rslU.js.map} +1 -1
  46. package/dist/{defaults-BkWCPJFL.js → defaults-BCiDhZbF.js} +20 -3
  47. package/dist/defaults-BCiDhZbF.js.map +1 -0
  48. package/dist/drag-ghost-DtSDvjri.js +85 -0
  49. package/dist/drag-ghost-DtSDvjri.js.map +1 -0
  50. package/dist/editable-label.d.ts +1 -2
  51. package/dist/editable-label.d.ts.map +1 -1
  52. package/dist/editable-label.js +1 -1
  53. package/dist/editable-label.js.map +1 -1
  54. package/dist/{incr-search-CeERfijK.js → element-search-Y8SRfPGM.js} +7 -135
  55. package/dist/element-search-Y8SRfPGM.js.map +1 -0
  56. package/dist/form-CsXJX15p.js +64 -0
  57. package/dist/form-CsXJX15p.js.map +1 -0
  58. package/dist/form.d.ts +15 -0
  59. package/dist/form.d.ts.map +1 -0
  60. package/dist/form.js +2 -0
  61. package/dist/grouped-item-lister-CNLMgdIr.d.ts +121 -0
  62. package/dist/grouped-item-lister-CNLMgdIr.d.ts.map +1 -0
  63. package/dist/grouped-item-lister.d.ts +2 -0
  64. package/dist/grouped-item-lister.js +177 -0
  65. package/dist/grouped-item-lister.js.map +1 -0
  66. package/dist/{hex-editor-B-UI4OZu.js → hex-editor-Bk6rxhfg.js} +6 -8
  67. package/dist/{hex-editor-B-UI4OZu.js.map → hex-editor-Bk6rxhfg.js.map} +1 -1
  68. package/dist/{hex-editor-CMIxtNgT.d.ts → hex-editor-Caq8vNQk.d.ts} +2 -3
  69. package/dist/hex-editor-Caq8vNQk.d.ts.map +1 -0
  70. package/dist/hex.d.ts +1 -1
  71. package/dist/hex.js +1 -1
  72. package/dist/highlight-B-eQrhhb.js.map +1 -1
  73. package/dist/{icon-Bd5BiU4b.d.ts → icon-BUwP1CZ1.d.ts} +3 -4
  74. package/dist/icon-BUwP1CZ1.d.ts.map +1 -0
  75. package/dist/{icon-CK14NUcE.js → icons-Bm2ByQ3s.js} +10 -5
  76. package/dist/icons-Bm2ByQ3s.js.map +1 -0
  77. package/dist/icons.d.ts +2 -2
  78. package/dist/icons.js +2 -8
  79. package/dist/incr-search-vCzuao-2.js +137 -0
  80. package/dist/incr-search-vCzuao-2.js.map +1 -0
  81. package/dist/incr-search.d.ts +1 -1
  82. package/dist/incr-search.js +2 -1
  83. package/dist/{index-DrKRD8_a.d.ts → index-BOUaDIW-.d.ts} +4 -4
  84. package/dist/index-BOUaDIW-.d.ts.map +1 -0
  85. package/dist/{index-CkMIKEWp.d.ts → index-BUB5SICW.d.ts} +3 -4
  86. package/dist/index-BUB5SICW.d.ts.map +1 -0
  87. package/dist/{index-tX6fKF8m.d.ts → index-BeuCXtiO.d.ts} +3 -3
  88. package/dist/index-BeuCXtiO.d.ts.map +1 -0
  89. package/dist/{index-BslNaMLo.d.ts → index-Cu5i8zZY.d.ts} +3 -3
  90. package/dist/index-Cu5i8zZY.d.ts.map +1 -0
  91. package/dist/{index-D87kRcEs.d.ts → index-RqMh1i-O.d.ts} +2 -1
  92. package/dist/index-RqMh1i-O.d.ts.map +1 -0
  93. package/dist/{index-Cdmrn0SZ.d.ts → index-ovq_GTdl.d.ts} +11 -11
  94. package/dist/index-ovq_GTdl.d.ts.map +1 -0
  95. package/dist/index.d.ts +93 -606
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +1351 -3714
  98. package/dist/index.js.map +1 -1
  99. package/dist/{labelled-input-base-ORb1rGq6.d.ts → labelled-input-base-Dp_9KP0G.d.ts} +2 -3
  100. package/dist/labelled-input-base-Dp_9KP0G.d.ts.map +1 -0
  101. package/dist/{labelled-input-base-9K_w3oLj.js → labelled-input-base-hoKGwyKT.js} +2 -2
  102. package/dist/{labelled-input-base-9K_w3oLj.js.map → labelled-input-base-hoKGwyKT.js.map} +1 -1
  103. package/dist/labelled-radial-input.d.ts +4 -5
  104. package/dist/labelled-radial-input.d.ts.map +1 -1
  105. package/dist/labelled-radial-input.js +2 -3
  106. package/dist/labelled-radial-input.js.map +1 -1
  107. package/dist/labelled-range-input.d.ts +1 -1
  108. package/dist/labelled-range-input.js +2 -2
  109. package/dist/labelled-range-input.js.map +1 -1
  110. package/dist/led.d.ts +1 -2
  111. package/dist/led.d.ts.map +1 -1
  112. package/dist/led.js +1 -1
  113. package/dist/led.js.map +1 -1
  114. package/dist/menu-DIfU70AA.js +1609 -0
  115. package/dist/menu-DIfU70AA.js.map +1 -0
  116. package/dist/{menu-item-AtoP6bD4.d.ts → menu-item-BG5w7fi4.d.ts} +4 -4
  117. package/dist/menu-item-BG5w7fi4.d.ts.map +1 -0
  118. package/dist/menu.d.ts +2 -2
  119. package/dist/menu.js +1 -2
  120. package/dist/miller.d.ts +7 -5
  121. package/dist/miller.d.ts.map +1 -1
  122. package/dist/miller.js +23 -25
  123. package/dist/miller.js.map +1 -1
  124. package/dist/narrowed-text.d.ts +1 -2
  125. package/dist/narrowed-text.d.ts.map +1 -1
  126. package/dist/narrowed-text.js +14 -13
  127. package/dist/narrowed-text.js.map +1 -1
  128. package/dist/notification-pill-DyZydXoZ.d.ts +68 -0
  129. package/dist/notification-pill-DyZydXoZ.d.ts.map +1 -0
  130. package/dist/notifier.d.ts +2 -0
  131. package/dist/notifier.js +146 -0
  132. package/dist/notifier.js.map +1 -0
  133. package/dist/panel.d.ts +1 -1
  134. package/dist/panel.d.ts.map +1 -1
  135. package/dist/panel.js +1 -2
  136. package/dist/panel.js.map +1 -1
  137. package/dist/plots.d.ts +1 -1
  138. package/dist/plots.js +1 -1
  139. package/dist/polar-pad.d.ts +1 -2
  140. package/dist/polar-pad.d.ts.map +1 -1
  141. package/dist/polar-pad.js +2 -2
  142. package/dist/polar-pad.js.map +1 -1
  143. package/dist/{radial-input-Dhu5ZGP5.d.ts → radial-input-DXMN55Nz.d.ts} +2 -3
  144. package/dist/radial-input-DXMN55Nz.d.ts.map +1 -0
  145. package/dist/{radial-input-C4f-2Bya.js → radial-input-Dk8Wydp5.js} +26 -16
  146. package/dist/radial-input-Dk8Wydp5.js.map +1 -0
  147. package/dist/radial-input.d.ts +1 -1
  148. package/dist/radial-input.js +1 -1
  149. package/dist/range-input.d.ts +2 -3
  150. package/dist/range-input.d.ts.map +1 -1
  151. package/dist/range-input.js +2 -2
  152. package/dist/range-input.js.map +1 -1
  153. package/dist/range.d.ts +2 -3
  154. package/dist/range.d.ts.map +1 -1
  155. package/dist/range.js +2 -2
  156. package/dist/range.js.map +1 -1
  157. package/dist/scroll-fade-CAs1EabA.js +70 -0
  158. package/dist/scroll-fade-CAs1EabA.js.map +1 -0
  159. package/dist/select-horiz.d.ts +50 -0
  160. package/dist/select-horiz.d.ts.map +1 -0
  161. package/dist/select-horiz.js +263 -0
  162. package/dist/select-horiz.js.map +1 -0
  163. package/dist/{slider-input-SW7e2Ac2.js → slider-input-CT4gcF-o.js} +30 -27
  164. package/dist/{slider-input-SW7e2Ac2.js.map → slider-input-CT4gcF-o.js.map} +1 -1
  165. package/dist/{slider-input-BEaztT-g.d.ts → slider-input-XppH3vcy.d.ts} +2 -3
  166. package/dist/slider-input-XppH3vcy.d.ts.map +1 -0
  167. package/dist/slider-input.d.ts +1 -1
  168. package/dist/slider-input.js +1 -1
  169. package/dist/snackbar.d.ts +58 -0
  170. package/dist/snackbar.d.ts.map +1 -0
  171. package/dist/snackbar.js +265 -0
  172. package/dist/snackbar.js.map +1 -0
  173. package/dist/snap-container.d.ts +1 -2
  174. package/dist/snap-container.d.ts.map +1 -1
  175. package/dist/snap-container.js +6 -5
  176. package/dist/snap-container.js.map +1 -1
  177. package/dist/split-layout.d.ts +1 -2
  178. package/dist/split-layout.d.ts.map +1 -1
  179. package/dist/split-layout.js +5 -3
  180. package/dist/split-layout.js.map +1 -1
  181. package/dist/swipe.d.ts +1 -2
  182. package/dist/swipe.d.ts.map +1 -1
  183. package/dist/swipe.js +4 -3
  184. package/dist/swipe.js.map +1 -1
  185. package/dist/{tab-list-B8v9KntS.d.ts → tab-list-Beuh2nom.d.ts} +4 -4
  186. package/dist/tab-list-Beuh2nom.d.ts.map +1 -0
  187. package/dist/tabs.d.ts +1 -1
  188. package/dist/tabs.js +533 -1
  189. package/dist/tabs.js.map +1 -0
  190. package/dist/{tickled-controller-JDOR9B8V.d.ts → tickled-controller-BtevrRLV.d.ts} +1 -2
  191. package/dist/tickled-controller-BtevrRLV.d.ts.map +1 -0
  192. package/dist/{tickled-styles-Bgo_Lpw-.js → tickled-controller-DkAU-0qL.js} +2 -88
  193. package/dist/tickled-controller-DkAU-0qL.js.map +1 -0
  194. package/dist/tickled-styles-BrAHEj1q.js +89 -0
  195. package/dist/tickled-styles-BrAHEj1q.js.map +1 -0
  196. package/dist/{timeline-CdSI003L.js → timeline-B2fgDL4U.js} +3 -3
  197. package/dist/{timeline-CdSI003L.js.map → timeline-B2fgDL4U.js.map} +1 -1
  198. package/dist/timeline.d.ts +1 -1
  199. package/dist/timeline.js +1 -1
  200. package/dist/{tooltip-BMTSUPBU.d.ts → tooltip-BlvBUQxx.d.ts} +2 -3
  201. package/dist/tooltip-BlvBUQxx.d.ts.map +1 -0
  202. package/dist/transitory-label.d.ts +30 -0
  203. package/dist/transitory-label.d.ts.map +1 -0
  204. package/dist/transitory-label.js +249 -0
  205. package/dist/transitory-label.js.map +1 -0
  206. package/dist/{tree-CqPhQRHo.js → tree-BO6BXI2b.js} +9 -10
  207. package/dist/{tree-CqPhQRHo.js.map → tree-BO6BXI2b.js.map} +1 -1
  208. package/dist/{tree-component-CDLO1ITF.d.ts → tree-component-BvV4muxx.d.ts} +8 -124
  209. package/dist/tree-component-BvV4muxx.d.ts.map +1 -0
  210. package/dist/tree.d.ts +9 -4
  211. package/dist/tree.d.ts.map +1 -1
  212. package/dist/tree.js +1 -1
  213. package/dist/types-Bc23SI94.d.ts +72 -0
  214. package/dist/types-Bc23SI94.d.ts.map +1 -0
  215. package/dist/types-DlVNJez_.d.ts +41 -0
  216. package/dist/types-DlVNJez_.d.ts.map +1 -0
  217. package/dist/vertical-list.d.ts +122 -0
  218. package/dist/vertical-list.d.ts.map +1 -0
  219. package/dist/vertical-list.js +737 -0
  220. package/dist/vertical-list.js.map +1 -0
  221. package/dist/{wheel-nudge-Dhzi5nHc.js → wheel-nudge-BlSCe_hD.js} +2 -2
  222. package/dist/wheel-nudge-BlSCe_hD.js.map +1 -0
  223. package/dist/{wheel-nudge-C-ra_1os.d.ts → wheel-nudge-DGrNzWuE.d.ts} +3 -4
  224. package/dist/wheel-nudge-DGrNzWuE.d.ts.map +1 -0
  225. package/dist/{xy-axis-CtDDQzGZ.d.ts → xy-axis-5KhVTNoX.d.ts} +8 -6
  226. package/dist/xy-axis-5KhVTNoX.d.ts.map +1 -0
  227. package/dist/{xy-axis-BpA2eJq6.js → xy-axis-B6yMjckW.js} +8 -112
  228. package/dist/xy-axis-B6yMjckW.js.map +1 -0
  229. package/dist/xy-pad.d.ts +1 -2
  230. package/dist/xy-pad.d.ts.map +1 -1
  231. package/dist/xy-pad.js +2 -2
  232. package/dist/xy-pad.js.map +1 -1
  233. package/docs-user/README.md +3 -2
  234. package/docs-user/data-grid.md +248 -0
  235. package/docs-user/index.json +217 -0
  236. package/docs-user/llms.txt +57 -0
  237. package/docs-user/rating.md +102 -0
  238. package/llms.txt +57 -0
  239. package/package.json +21 -11
  240. package/dist/crumb-navigation-Pif-kupA.js +0 -1221
  241. package/dist/crumb-navigation-Pif-kupA.js.map +0 -1
  242. package/dist/defaults-BkWCPJFL.js.map +0 -1
  243. package/dist/hex-editor-CMIxtNgT.d.ts.map +0 -1
  244. package/dist/icon-Bd5BiU4b.d.ts.map +0 -1
  245. package/dist/icon-CK14NUcE.js.map +0 -1
  246. package/dist/icons.js.map +0 -1
  247. package/dist/incr-search-CeERfijK.js.map +0 -1
  248. package/dist/index-BslNaMLo.d.ts.map +0 -1
  249. package/dist/index-Cdmrn0SZ.d.ts.map +0 -1
  250. package/dist/index-CkMIKEWp.d.ts.map +0 -1
  251. package/dist/index-D87kRcEs.d.ts.map +0 -1
  252. package/dist/index-DrKRD8_a.d.ts.map +0 -1
  253. package/dist/index-tX6fKF8m.d.ts.map +0 -1
  254. package/dist/interaction-_Y2qO3QI.js +0 -1
  255. package/dist/labelled-input-base-ORb1rGq6.d.ts.map +0 -1
  256. package/dist/menu-BiFarLUA.js +0 -826
  257. package/dist/menu-BiFarLUA.js.map +0 -1
  258. package/dist/menu-item-AtoP6bD4.d.ts.map +0 -1
  259. package/dist/menu-item-yHSPV8nS.js +0 -783
  260. package/dist/menu-item-yHSPV8nS.js.map +0 -1
  261. package/dist/radial-input-C4f-2Bya.js.map +0 -1
  262. package/dist/radial-input-Dhu5ZGP5.d.ts.map +0 -1
  263. package/dist/registry-CkW7q09Q.js +0 -21
  264. package/dist/registry-CkW7q09Q.js.map +0 -1
  265. package/dist/selecthorizontal.d.ts +0 -16
  266. package/dist/selecthorizontal.d.ts.map +0 -1
  267. package/dist/selecthorizontal.js +0 -43
  268. package/dist/selecthorizontal.js.map +0 -1
  269. package/dist/slider-input-BEaztT-g.d.ts.map +0 -1
  270. package/dist/tab-list-B8v9KntS.d.ts.map +0 -1
  271. package/dist/tab-list-CR0v53KJ.js +0 -615
  272. package/dist/tab-list-CR0v53KJ.js.map +0 -1
  273. package/dist/tickled-controller-JDOR9B8V.d.ts.map +0 -1
  274. package/dist/tickled-styles-Bgo_Lpw-.js.map +0 -1
  275. package/dist/tooltip-BMTSUPBU.d.ts.map +0 -1
  276. package/dist/tree-component-CDLO1ITF.d.ts.map +0 -1
  277. package/dist/types-DSfbtHs3.d.ts +0 -8
  278. package/dist/types-DSfbtHs3.d.ts.map +0 -1
  279. package/dist/wheel-nudge-C-ra_1os.d.ts.map +0 -1
  280. package/dist/wheel-nudge-Dhzi5nHc.js.map +0 -1
  281. package/dist/xy-axis-BpA2eJq6.js.map +0 -1
  282. package/dist/xy-axis-CtDDQzGZ.d.ts.map +0 -1
  283. package/docs-user/selecthorizontal.md +0 -32
  284. /package/bundle/{chunk-D7D4PA-g.js → rolldown-runtime-D7D4PA-g.js} +0 -0
  285. /package/dist/{chunk-D7D4PA-g.js → rolldown-runtime-D7D4PA-g.js} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertical-list.js","names":["#search","#selectionAnchor","#customWrappers","#wrappedElements","customElement"],"sources":["../src/vertical-list/vertical-list.ts"],"sourcesContent":["import type { CommandId } from '@clinth/ui-commands';\nimport type { PropertyValues } from 'lit';\nimport type { ElementIncrSearch } from '../incr-search/element-search.js';\nimport type {\n ListActivateDetail,\n ListElementEventMap,\n ListInteractionMode,\n ListItemClickDetail,\n ListSelectDetail,\n ListSelectionMode,\n ListTickleDetail,\n} from './types.js';\nimport { css, html, LitElement, render } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { createElementIncrSearch } from '../incr-search/element-search.js';\nimport { TickledController } from '../interaction/tickled-controller.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type {\n ListActivateDetail,\n ListActivateEvent,\n ListElementEventMap,\n ListInteractionMode,\n ListItemClickDetail,\n ListItemClickEvent,\n ListSelectDetail,\n ListSelectEvent,\n ListSelectionMode,\n ListTickleDetail,\n ListTickleEvent,\n} from './types.js';\n\nexport interface CustomCheckboxOptions {\n renderer: (checked: boolean) => unknown;\n margin?: string;\n width?: string;\n}\n\nexport interface AddItemOptions {\n /**\n * In `checked` interaction mode, adds the item without a checkbox column and\n * without the ability to be checked/selected. Equivalent to setting the\n * `not-checked` attribute on the item. Ignored outside `checked` mode.\n */\n notChecked?: boolean;\n}\n\nconst ITEM_SELECTOR = `li, [data-list-item]`;\n\n// Whether the mode allows building a multi-item selection\nfunction isMultiMode(mode: ListInteractionMode): boolean {\n return mode === `checked` || mode === `sticky` || mode === `vscode` || mode === `standard`;\n}\n\n@customElement(`ixfx-vertical-list`)\nexport class VerticalListElement extends LitElement {\n @property({ type: String, attribute: `selection-mode` })\n selectionMode: ListSelectionMode = `single`;\n\n @property({ type: String, attribute: `interaction-mode` })\n interactionMode: ListInteractionMode = `standard`;\n\n @property({ attribute: false })\n filterPredicate: ((el: Element) => boolean) | undefined;\n\n /**\n * Optional renderer for the checkbox shown in `checked` interactionMode.\n * Receives the current `checked` state and returns a Lit template result.\n *\n * When set, the per-row checkbox becomes a `<span role=\"checkbox\">` whose\n * contents are whatever this returns (rendered with `lit`'s `render()`).\n * When unset, a native `<input type=\"checkbox\">` is used.\n *\n * @example\n * list.checkboxRenderer = (checked) => checked\n * ? html`<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\"\n * fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n * stroke-linecap=\"round\" stroke-linejoin=\"round\"\n * style=\"opacity:0.5\">\n * <polyline points=\"3,8 7,12 13,4\" />\n * </svg>`\n * : html``;\n */\n @property({ attribute: false })\n checkboxRenderer: ((checked: boolean) => unknown) | CustomCheckboxOptions | undefined;\n\n @state() private _selectedItems: ReadonlySet<Element> = new Set();\n @state() private _searchVisible = false;\n @state() private _searchQuery = ``;\n\n @query(`.search-input`)\n private _searchInputEl!: HTMLInputElement;\n\n #search: ElementIncrSearch | undefined;\n // Anchor for range/shift selection — updated on plain-click or plain-keyboard select\n #selectionAnchor: Element | undefined;\n #customWrappers = new Map<HTMLLIElement, Element>();\n #wrappedElements = new Set<Element>();\n\n private tickled = new TickledController<Element>(this, {\n getItems: () => this._getVisibleItems().map(el => ({ id: el, enabled: true })),\n onTickle: (id) => {\n if (id !== undefined) {\n this._dispatch<ListTickleDetail>(`list-tickle`, { item: id });\n }\n },\n onStateChange: () => this._syncItemStates(),\n });\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute(`tabindex`))\n this.tabIndex = 0;\n this.addEventListener(`pointerover`, this._onPointerOver);\n this.addEventListener(`pointerleave`, this._onPointerLeave);\n this.addEventListener(`keydown`, this._onKeyDown);\n this.addEventListener(`click`, this._onClick);\n this.addEventListener(`dblclick`, this._onDblClick);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`pointerover`, this._onPointerOver);\n this.removeEventListener(`pointerleave`, this._onPointerLeave);\n this.removeEventListener(`keydown`, this._onKeyDown);\n this.removeEventListener(`click`, this._onClick);\n this.removeEventListener(`dblclick`, this._onDblClick);\n this.#search?.dispose();\n this.#search = undefined;\n }\n\n override firstUpdated(): void {\n this.#search = createElementIncrSearch({\n container: this,\n itemSelector: ITEM_SELECTOR,\n getLabel: el => el.getAttribute(`data-search-label`) ?? el.textContent?.trim() ?? ``,\n getKey: el =>\n el.getAttribute(`data-key`)\n ?? el.getAttribute(`data-search-label`)\n ?? el.textContent?.trim()\n ?? ``,\n highlightKey: `vertical-list-search`,\n });\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has(`interactionMode`)) {\n this.#selectionAnchor = undefined;\n const previousSelected = this._selectedItems;\n // Save wrapper→inner map before _syncCheckboxes() clears it on unwrap\n const leavingChecked = (changed.get(`interactionMode`) as ListInteractionMode) === `checked`;\n const savedWrappers = leavingChecked ? new Map(this.#customWrappers) : null;\n\n this._syncCheckboxes();\n\n // Remap _selectedItems across the wrap/unwrap element-reference boundary\n if (previousSelected.size > 0) {\n let remapped: Set<Element>;\n if (savedWrappers && savedWrappers.size > 0) {\n // Leaving checked: wrapper refs → inner element refs\n remapped = new Set([...previousSelected].map(el => savedWrappers.get(el as HTMLLIElement) ?? el));\n } else if (this.#customWrappers.size > 0) {\n // Entering checked: inner element refs → wrapper refs\n const innerToWrapper = new Map([...this.#customWrappers].map(([w, i]) => [i, w]));\n remapped = new Set([...previousSelected].map(el => innerToWrapper.get(el) ?? el));\n } else {\n remapped = new Set(previousSelected);\n }\n this._selectedItems = remapped;\n }\n\n this._syncItemStates();\n } else if (changed.has(`checkboxRenderer`) && this.interactionMode === `checked`) {\n this._syncCheckboxes();\n }\n }\n\n // --- Public API ---\n\n /** The most recently selected item, or `undefined` if nothing is selected. */\n get selectedItem(): Element | undefined {\n return [...this._selectedItems].at(-1);\n }\n\n /** The full current selection set (read-only). */\n get selectedItems(): ReadonlySet<Element> {\n return this._selectedItems;\n }\n\n addItem(item: Element | string, options?: AddItemOptions): void {\n let el: Element;\n if (typeof item === `string`) {\n const li = document.createElement(`li`);\n li.textContent = item;\n el = li;\n } else {\n el = item;\n }\n if (options?.notChecked)\n el.setAttribute(`not-checked`, ``);\n this.appendChild(el);\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n }\n\n removeItem(item: Element): void {\n item.remove();\n }\n\n clearItems(): void {\n this.#customWrappers.clear();\n this.replaceChildren();\n this.#selectionAnchor = undefined;\n this._selectedItems = new Set();\n this._syncItemStates();\n }\n\n /**\n * Replace the entire item list in one call.\n * Equivalent to `clearItems()` followed by `addItem()` for each element.\n * Preserves `interactionMode` checkbox wrapping.\n */\n setItems(items: readonly Element[]): void {\n this.clearItems();\n for (const item of items) {\n this.appendChild(item);\n }\n if (this.interactionMode === `checked`)\n this._syncCheckboxes();\n }\n\n /**\n * Dispatch a command to this list. No-op by default.\n * Intended for use with `ixfx-grouped-item-lister`'s `dispatch()` method,\n * which forwards commands to all sub-components.\n */\n dispatch(_commandId: CommandId, _args?: Record<string, unknown>): void {}\n\n select(item: Element): void {\n this._replaceSelection(item);\n }\n\n selectMany(items: Iterable<Element>): void {\n if (this.selectionMode !== `multiple`) {\n throw new Error(`selectMany requires selectionMode=\"multiple\" (current: \"${this.selectionMode}\")`);\n }\n const previous = this._selectedItems;\n const next = new Set([...items].filter(el => this._isCheckable(el)));\n if (next.size === 0)\n return;\n this._selectedItems = next;\n this.#selectionAnchor = [...next].at(-1);\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n deselect(item: Element): void {\n if (!this._selectedItems.has(item))\n return;\n const previous = this._selectedItems;\n const next = new Set(this._selectedItems);\n next.delete(item);\n this._selectedItems = next;\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n clearSelection(): void {\n this._clearSelection();\n }\n\n selectAll(): void {\n const canMulti = this.selectionMode === `multiple` || isMultiMode(this.interactionMode);\n if (canMulti && this.selectionMode !== `none`)\n this._selectAll();\n }\n\n * selectedFilter(kind: `selected` | `checked` | `either`): Generator<Element> {\n const wanted = (el: Element) => {\n switch (kind) {\n case `selected`: return el.hasAttribute(`data-selected`);\n case `checked`: return el.hasAttribute(`data-checked`);\n case `either`: return el.hasAttribute(`data-selected`) || el.hasAttribute(`data-checked`);\n }\n };\n\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n if (this.#wrappedElements.has(el))\n continue;\n if ((el as HTMLElement).hidden)\n continue;\n if (wanted(el))\n yield el;\n }\n }\n\n // --- Private selection primitives ---\n\n // Replace entire selection with one item; updates anchor. Used for plain clicks and Enter.\n private _replaceSelection(item: Element): void {\n if (this.selectionMode === `none`)\n return;\n if (!this._isCheckable(item))\n return;\n const previous = this._selectedItems;\n const next = new Set([item]);\n this._selectedItems = next;\n this.#selectionAnchor = item;\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n // Toggle a single item in/out of the selection without replacing. Does not update anchor.\n private _toggleItem(item: Element): void {\n if (!this._isCheckable(item))\n return;\n // checked/vscode modes imply multiple selection capacity\n const effectiveMultiple\n = this.selectionMode === `multiple` || isMultiMode(this.interactionMode);\n if (this.selectionMode === `none` && this.interactionMode !== `checked` && this.interactionMode !== `sticky`)\n return;\n\n const previous = this._selectedItems;\n const next = new Set(this._selectedItems);\n if (next.has(item)) {\n next.delete(item);\n } else {\n if (!effectiveMultiple)\n next.clear();\n next.add(item);\n }\n this._selectedItems = next;\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n // Select the contiguous range from anchor to item. Anchor is not changed.\n private _rangeSelectTo(item: Element): void {\n if (this.selectionMode === `none`)\n return;\n if (!this.#selectionAnchor) {\n this._replaceSelection(item);\n return;\n }\n const visible = this._getVisibleItems();\n const anchorIdx = visible.indexOf(this.#selectionAnchor);\n const targetIdx = visible.indexOf(item);\n if (anchorIdx === -1 || targetIdx === -1) {\n this._replaceSelection(item);\n return;\n }\n const start = Math.min(anchorIdx, targetIdx);\n const end = Math.max(anchorIdx, targetIdx);\n const previous = this._selectedItems;\n const next = new Set(visible.slice(start, end + 1).filter(el => this._isCheckable(el)));\n this._selectedItems = next;\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n private _clearSelection(): void {\n if (this._selectedItems.size === 0)\n return;\n const previous = this._selectedItems;\n this._selectedItems = new Set();\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: new Set(), previous });\n }\n\n private _selectAll(): void {\n const visible = this._getVisibleItems();\n if (visible.length === 0)\n return;\n const previous = this._selectedItems;\n const next = new Set(visible.filter(el => this._isCheckable(el)));\n if (next.size === 0)\n return;\n this._selectedItems = next;\n this._syncItemStates();\n this._dispatch<ListSelectDetail>(`list-select`, { selected: next, previous });\n }\n\n // --- Click interaction routing per interactionMode ---\n\n private _handleClickSelection(item: Element, e: MouseEvent): void {\n const mode = this.interactionMode;\n if (mode === `manual`)\n return;\n if (this.selectionMode === `none` && mode !== `checked` && mode !== `sticky`)\n return;\n\n switch (mode) {\n case `implicit`:\n // Single-select only; modifier keys have no effect\n this._replaceSelection(item);\n break;\n\n case `standard`:\n case `vscode`:\n if (e.ctrlKey || e.metaKey) {\n // Ctrl/Cmd+click: toggle item; requires effective multi-select\n if (this.selectionMode === `multiple` || mode === `vscode`) {\n this._toggleItem(item);\n }\n } else if (e.shiftKey && (this.selectionMode === `multiple` || mode === `vscode`)) {\n // Shift+click: range-select from anchor\n this._rangeSelectTo(item);\n } else {\n // Plain click: replace selection, update anchor\n this._replaceSelection(item);\n }\n break;\n\n case `checked`:\n // Body clicks do nothing — only the full-height checkbox column toggles.\n break;\n\n case `sticky`:\n // Every tap/click toggles — multi-select without modifier keys (touchscreens).\n this._toggleItem(item);\n break;\n }\n }\n\n // --- Space key routing per interactionMode ---\n\n private _handleSpaceKey(item: Element): void {\n const mode = this.interactionMode;\n if (mode === `manual`)\n return;\n if (mode === `implicit`) {\n // Space selects (same as click) in implicit mode\n this._replaceSelection(item);\n } else {\n // standard / vscode / checked / sticky: Space toggles\n this._toggleItem(item);\n }\n }\n\n // --- Helpers ---\n\n private _getVisibleItems(): Element[] {\n return Array.from(this.querySelectorAll(ITEM_SELECTOR)).filter((el) => {\n if (this.#wrappedElements.has(el))\n return false;\n if ((el as HTMLElement).hidden)\n return false;\n if (this.filterPredicate && !this.filterPredicate(el))\n return false;\n return true;\n });\n }\n\n // Whether an item participates in checked-mode selection. Items carrying the\n // `not-checked` attribute are skipped; outside `checked` mode it has no effect.\n // For wrapped custom elements the flag lives on the inner element, so resolve\n // through the wrapper map.\n private _isCheckable(item: Element): boolean {\n if (this.interactionMode !== `checked`)\n return true;\n const real = this.#customWrappers.get(item as HTMLLIElement) ?? item;\n return !real.hasAttribute(`not-checked`);\n }\n\n private _syncItemStates(): void {\n for (const el of this.querySelectorAll(ITEM_SELECTOR)) {\n if (this.#wrappedElements.has(el))\n continue;\n const item = this.#customWrappers.get(el as HTMLLIElement) ?? el;\n el.toggleAttribute(`data-tickled`, this.tickled.isTickled(el));\n el.toggleAttribute(`data-selected`, this._selectedItems.has(el));\n if (this.interactionMode === `checked`) {\n el.toggleAttribute(`data-checked`, !item.hasAttribute(`not-checked`) && this._selectedItems.has(el));\n } else {\n el.removeAttribute(`data-checked`);\n }\n }\n this.dataset.inputMode = this.tickled.inputMode;\n this._syncCheckboxes();\n }\n\n private _syncCheckboxes(): void {\n const inCheckedMode = this.interactionMode === `checked`;\n const wantsCustom = typeof this.checkboxRenderer === `function`;\n\n if (inCheckedMode) {\n for (const inner of Array.from(this.children)) {\n if (!inner.hasAttribute(`data-list-item`))\n continue;\n if (inner.parentElement !== this)\n continue; // idempotency: already wrapped\n const wrapper = document.createElement(`li`);\n wrapper.className = `ixfx-custom-row`;\n const key = inner.getAttribute(`data-key`);\n const label = inner.getAttribute(`data-search-label`);\n if (key !== null)\n wrapper.setAttribute(`data-key`, key);\n if (label !== null)\n wrapper.setAttribute(`data-search-label`, label);\n inner.removeAttribute(`data-list-item`);\n this.insertBefore(wrapper, inner);\n wrapper.appendChild(inner);\n this.#customWrappers.set(wrapper, inner);\n this.#wrappedElements.add(inner);\n }\n } else {\n for (const [wrapper, inner] of this.#customWrappers) {\n if (wrapper.parentElement !== this)\n continue;\n inner.setAttribute(`data-list-item`, ``);\n this.insertBefore(inner, wrapper);\n wrapper.remove();\n }\n this.#customWrappers.clear();\n this.#wrappedElements.clear();\n }\n\n for (const el of this.querySelectorAll<HTMLElement>(`li`)) {\n const existing = el.querySelector<HTMLElement>(`.ixfx-list-checkbox`);\n if (!inCheckedMode) {\n if (existing)\n existing.remove();\n continue;\n }\n // Rows marked `not-checked` get no checkbox column and can't be checked\n const itemEl = this.#customWrappers.get(el as HTMLLIElement) ?? el;\n if (itemEl.hasAttribute(`not-checked`)) {\n if (existing)\n existing.remove();\n continue;\n }\n\n // In checked mode: if the existing checkbox is the wrong variant, drop it.\n const existingIsCustom = existing?.classList.contains(`ixfx-list-checkbox-custom`) ?? false;\n if (existing && existingIsCustom !== wantsCustom)\n existing.remove();\n\n let cb: HTMLElement | null = el.querySelector<HTMLElement>(`.ixfx-list-checkbox`);\n if (!cb) {\n if (wantsCustom) {\n const opts = this.checkboxRenderer as CustomCheckboxOptions;\n const margin = opts.margin ?? `0`;\n const width = opts.width ?? `24px`;\n cb = this._createCustomCheckbox(el, margin, width);\n } else {\n cb = this._createNativeCheckboxCell(el);\n }\n el.prepend(cb);\n }\n\n const checked = this._selectedItems.has(el);\n if (wantsCustom) {\n cb.setAttribute(`aria-checked`, String(checked));\n cb.toggleAttribute(`data-checked`, checked);\n if (this.checkboxRenderer) {\n const renderer = typeof this.checkboxRenderer === `function`\n ? this.checkboxRenderer\n : (this.checkboxRenderer as CustomCheckboxOptions).renderer;\n render(renderer(checked), cb);\n }\n } else {\n const input = cb.querySelector<HTMLInputElement>(`input.ixfx-list-checkbox`);\n if (input)\n input.checked = checked;\n }\n }\n }\n\n /**\n * Native checkbox cell: a span that stretches to the row's full cross-axis\n * (so the entire column height is a click target) with a real `<input>`\n * centred inside. The span owns the click; the input is purely visual and\n * has `pointer-events:none` so a single click produces one toggle.\n */\n private _createNativeCheckboxCell(el: HTMLElement): HTMLSpanElement {\n const cell = document.createElement(`span`);\n cell.className = `ixfx-list-checkbox ixfx-list-checkbox-native`;\n cell.style.cssText = `display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;align-self:stretch;width:18px;margin:0 6px 0 0;cursor:pointer;pointer-events:auto`;\n cell.tabIndex = -1;\n cell.setAttribute(`role`, `checkbox`);\n cell.setAttribute(`part`, `checkbox`);\n cell.addEventListener(`click`, (e) => {\n e.stopPropagation();\n this._toggleItem(el);\n });\n const input = document.createElement(`input`);\n input.type = `checkbox`;\n input.className = `ixfx-list-checkbox`;\n input.style.cssText = `pointer-events:none;cursor:pointer;margin:0`;\n cell.appendChild(input);\n return cell;\n }\n\n /**\n * Custom checkbox cell: same shape as the native cell (a stretching span)\n * so behaviour is identical. The renderer's content goes inside.\n */\n private _createCustomCheckbox(el: HTMLElement, margin: string, width: string): HTMLSpanElement {\n const span = document.createElement(`span`);\n span.className = `ixfx-list-checkbox ixfx-list-checkbox-custom`;\n span.style.cssText = `display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;align-self:stretch;width:${width};margin:${margin};cursor:pointer;pointer-events:auto`;\n span.tabIndex = -1;\n span.setAttribute(`role`, `checkbox`);\n span.setAttribute(`part`, `checkbox`);\n span.addEventListener(`click`, (e) => {\n e.stopPropagation();\n this._toggleItem(el);\n });\n return span;\n }\n\n private _findListItem(path: EventTarget[]): Element | undefined {\n for (const target of path) {\n if (!(target instanceof Element))\n continue;\n if (target === this)\n break;\n if (target.parentElement === this && target.matches(ITEM_SELECTOR))\n return target;\n }\n return undefined;\n }\n\n private _dispatch<T>(name: keyof ListElementEventMap, detail: T): void {\n this.dispatchEvent(new CustomEvent<T>(name as string, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n private _openSearch(): void {\n this._searchVisible = true;\n void this.updateComplete.then(() => this._searchInputEl?.focus());\n }\n\n private _closeSearch(): void {\n this._searchVisible = false;\n this._searchQuery = ``;\n void this.#search?.clearQuery();\n this.focus();\n }\n\n // --- Event handlers ---\n\n private _onPointerOver = (e: PointerEvent): void => {\n const item = this._findListItem(e.composedPath());\n if (item)\n this.tickled.handlePointerEnter(item);\n };\n\n private _onPointerLeave = (e: PointerEvent): void => {\n this.tickled.handlePointerLeave(e);\n };\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if ((e.ctrlKey || e.metaKey) && e.key === `f`) {\n e.preventDefault();\n this._openSearch();\n return;\n }\n if ((e.ctrlKey || e.metaKey) && e.key === `a`) {\n const canMulti\n = this.selectionMode === `multiple` || isMultiMode(this.interactionMode);\n if (canMulti && this.selectionMode !== `none`) {\n e.preventDefault();\n this._selectAll();\n }\n return;\n }\n if (this._searchVisible)\n return;\n\n switch (e.key) {\n case `ArrowDown`: {\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`next`);\n // vscode: Shift+Arrow extends range from anchor\n if (e.shiftKey && this.interactionMode === `vscode`) {\n const cur = this.tickled.tickledId;\n if (cur)\n this._rangeSelectTo(cur);\n }\n break;\n }\n case `ArrowUp`: {\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`previous`);\n if (e.shiftKey && this.interactionMode === `vscode`) {\n const cur = this.tickled.tickledId;\n if (cur)\n this._rangeSelectTo(cur);\n }\n break;\n }\n case `Enter`: {\n const id = this.tickled.tickledId;\n if (id) {\n e.preventDefault();\n this._dispatch<ListItemClickDetail>(`list-item-click`, { item: id });\n this._activateItem(id);\n }\n break;\n }\n case ` `: {\n const id = this.tickled.tickledId;\n if (id) {\n e.preventDefault();\n this._handleSpaceKey(id);\n }\n break;\n }\n case `Escape`:\n this._clearSelection();\n break;\n }\n };\n\n private _onClick = (e: MouseEvent): void => {\n const item = this._findListItem(e.composedPath());\n if (!item)\n return;\n this._dispatch<ListItemClickDetail>(`list-item-click`, { item });\n this._handleClickSelection(item, e);\n };\n\n private _onDblClick = (e: MouseEvent): void => {\n const item = this._findListItem(e.composedPath());\n if (item)\n this._activateItem(item);\n };\n\n private _activateItem(item: Element): void {\n // manual mode: never auto-select; just fire the event\n if (this.interactionMode !== `manual`) {\n this._replaceSelection(item);\n }\n this._dispatch<ListActivateDetail>(`list-activate`, { item });\n }\n\n private _onSearchInput = (e: Event): void => {\n const input = e.target as HTMLInputElement;\n this._searchQuery = input.value;\n void this.#search?.setQuery(this._searchQuery);\n };\n\n private _onSearchKeydown = (e: KeyboardEvent): void => {\n if (e.key === `Escape`) {\n e.stopPropagation();\n this._closeSearch();\n } else if (e.key === `ArrowDown`) {\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`next`);\n } else if (e.key === `ArrowUp`) {\n e.preventDefault();\n this.tickled.handleKeyboardNavigation(`previous`);\n } else if (e.key === `Enter`) {\n e.preventDefault();\n e.stopPropagation();\n const id = this.tickled.tickledId ?? this._getVisibleItems()[0];\n if (id) {\n this._dispatch<ListItemClickDetail>(`list-item-click`, { item: id });\n this._activateItem(id);\n this._closeSearch();\n }\n }\n };\n\n // --- Styles ---\n\n static override styles = [themeFallbacks, css`\n :host {\n display: block;\n position: relative;\n background: var(--list-bg, var(--surface-3));\n color: var(--list-text, var(--surface-3-text));\n border-radius: var(--list-radius, var(--radius-s));\n border: 1px solid var(--list-border, var(--border));\n width: 100%;\n height: 100%;\n overflow: hidden;\n box-sizing: border-box;\n outline: none;\n --ixfx-list-item-padding: var(--ixfx-list-item-padding, var(--list-item-padding, 4px var(--space-m, 8px)));\n }\n\n :host(:focus-visible) {\n outline: 2px solid var(--accent);\n outline-offset: 2px;\n }\n\n .container {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n ul {\n list-style: none;\n margin: 0;\n padding: 0;\n width: 100%;\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n box-sizing: border-box;\n /* Scrollbar theming: end users override these CSS variables to control\n the native scrollbar (scrollbar-width, scrollbar-gutter, scrollbar-color). */\n scrollbar-width: var(--list-scrollbar-width, auto);\n scrollbar-gutter: var(--list-scrollbar-gutter, auto);\n scrollbar-color: var(--list-scrollbar-color, auto);\n }\n\n ::slotted([hidden]) {\n display: none !important;\n }\n\n ::slotted(li) {\n display: flex;\n align-items: center;\n padding: var(--ixfx-list-item-padding);\n min-height: var(--list-item-height, 28px);\n cursor: pointer;\n user-select: none;\n transition: background var(--transition, 0.1s ease-out),\n outline-color var(--transition, 0.1s ease-out);\n box-sizing: border-box;\n outline: 1px solid transparent;\n }\n\n /* Custom shadow-DOM components handle their own internal layout/padding */\n ::slotted([data-list-item]) {\n display: block;\n cursor: pointer;\n user-select: none;\n transition: background var(--transition, 0.1s ease-out),\n outline-color var(--transition, 0.1s ease-out);\n outline: 1px solid transparent;\n }\n\n /* In checked mode, only the checkbox column is clickable; the row body\n gets a default cursor so it doesn't suggest otherwise. */\n :host([interaction-mode=\"checked\"]) ::slotted(li),\n :host([interaction-mode=\"checked\"]) ::slotted([data-list-item]) {\n cursor: default;\n }\n\n /* Wrapper inserted around custom [data-list-item] elements in checked mode.\n Provides the flex layout so the injected checkbox can stretch to the\n row's full height via align-self:stretch. */\n .ixfx-custom-row {\n display: flex;\n align-items: center;\n min-height: var(--list-item-height, 28px);\n box-sizing: border-box;\n cursor: default;\n user-select: none;\n }\n\n ::slotted([data-tickled]) {\n background: var(--item-bg-tickled);\n outline: var(--item-border-tickled);\n }\n\n ::slotted([data-selected]) {\n background: var(--item-bg-selected);\n color: var(--item-text-selected);\n outline: 1px solid transparent;\n }\n\n ::slotted([data-selected][data-tickled]) {\n background: var(--item-bg-selected-tickled);\n outline: 2px dashed var(--surface-3);\n outline-offset: -2px;\n }\n\n /* checked mode: checkbox (injected into li) communicates selection — suppress bg highlight */\n :host([interaction-mode=\"checked\"]) ::slotted([data-selected]) {\n background: transparent;\n color: inherit;\n outline: 1px solid transparent;\n }\n\n :host([interaction-mode=\"checked\"]) ::slotted([data-selected][data-tickled]) {\n background: var(--item-bg-tickled);\n color: inherit;\n outline: var(--item-border-tickled);\n }\n\n .search-overlay {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 10;\n display: flex;\n align-items: center;\n gap: 4px;\n background: var(--surface-4, #2a2a2a);\n border: 1px solid var(--border, #444);\n border-radius: var(--radius-m, 4px);\n padding: 4px 6px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n }\n\n .search-overlay[hidden] {\n display: none;\n }\n\n .search-input {\n background: transparent;\n border: none;\n outline: none;\n color: inherit;\n font-size: var(--text-m, 0.875em);\n min-width: 140px;\n }\n\n .search-close {\n background: transparent;\n border: none;\n color: var(--surface-muted-text, #888);\n cursor: pointer;\n font-size: 1.1em;\n line-height: 1;\n padding: 0 2px;\n }\n\n .search-close:hover {\n color: inherit;\n }\n `];\n\n // --- Render ---\n\n override render() {\n return html`\n <div class=\"container\">\n <ul part=\"list\">\n <slot></slot>\n </ul>\n <div\n class=\"search-overlay\"\n part=\"search-overlay\"\n ?hidden=${!this._searchVisible}\n >\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search…\"\n .value=${this._searchQuery}\n @input=${this._onSearchInput}\n @keydown=${this._onSearchKeydown}\n />\n <button class=\"search-close\" @click=${this._closeSearch} title=\"Close search (Esc)\">×</button>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-vertical-list': VerticalListElement;\n }\n\n interface HTMLElementEventMap extends ListElementEventMap {}\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { t as __decorate } from "./decorate-DdjvVHS-.js";
1
+ import { t as __decorate } from "./decorate-VRK8rslU.js";
2
2
  import { property } from "lit/decorators.js";
3
3
  //#region src/mixins/wheel-nudge.ts
4
4
  /**
@@ -83,4 +83,4 @@ function WheelNudgeMixin(superClass) {
83
83
  //#endregion
84
84
  export { WheelNudgeMixin as t };
85
85
 
86
- //# sourceMappingURL=wheel-nudge-Dhzi5nHc.js.map
86
+ //# sourceMappingURL=wheel-nudge-BlSCe_hD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wheel-nudge-BlSCe_hD.js","names":[],"sources":["../src/mixins/wheel-nudge.ts"],"sourcesContent":["import type { LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\n\ntype Constructor<T = object> = new (...args: any[]) => T;\n\n/**\n * Direction of a wheel tick. `+1` for `deltaY < 0` (wheel up/away), `-1` for\n * `deltaY > 0` (wheel down/toward).\n */\nexport type WheelDirection = 1 | -1;\n\n/**\n * Abstract surface a consumer of {@link WheelNudgeMixin} must implement.\n *\n * `_applyWheelDelta` is called once per handled wheel tick. The consumer is\n * expected to reuse its existing arrow-key step math (typically a shared\n * `_stepByDelta(direction, effectiveStep)` private method) and call it here.\n *\n * `_shouldHandleWheel` may be overridden to restrict when the wheel acts\n * (e.g. editable-number rejects while the user is typing).\n */\nexport interface WheelNudgeConsumer {\n _applyWheelDelta: (direction: WheelDirection, event: WheelEvent) => void;\n _shouldHandleWheel: () => boolean;\n}\n\n/**\n * Internal: the surface a {@link WheelNudgeMixin}-decorated class exposes to\n * TypeScript — its own members plus the consumer contract.\n */\nexport type WheelNudgeConsumerType<TBase> = TBase & WheelNudgeConsumer;\ntype WheelNudgeMixinBase<T> = T extends Constructor<infer U> ? U : never;\ntype WheelNudgeMixinResult<T extends Constructor<LitElement>>\n = Constructor<WheelNudgeConsumerType<WheelNudgeMixinBase<T>>> & T;\n\n/**\n * Mixin that adds mousewheel support with an optional `lighttouch` hover mode.\n *\n * Activation rule:\n * - If the host's `disabled` property is truthy → ignore.\n * - Otherwise, handle if EITHER:\n * • `lighttouch` is true AND the pointer is currently over the host, OR\n * • the host (or anything in its shadow tree) currently has focus.\n *\n * Direction convention: `deltaY < 0` (wheel up/away) → +1 step; `deltaY > 0` → -1 step.\n *\n * Consumers must implement `_applyWheelDelta(direction, event)` (see\n * {@link WheelNudgeConsumer}). The mixin calls `event.preventDefault()` only when\n * the activation rule accepts the event, so page scroll is suppressed during\n * interaction without blocking wheel events over empty space.\n *\n * Usage:\n *\n * ```ts\n * class MyInput extends WheelNudgeMixin(LitElement) {\n * protected _applyWheelDelta(direction, event) {\n * const step = resolveAxisStep(this.range, this.stops, this.step, event.shiftKey);\n * this._stepByDelta(direction, step);\n * }\n * }\n * ```\n */\nexport function WheelNudgeMixin<T extends Constructor<LitElement>>(superClass: T): WheelNudgeMixinResult<T> {\n class WheelNudgeMixinClass extends superClass {\n /**\n * When true, the wheel adjusts the value simply when the pointer is hovering\n * over the host (no focus required). When false (default), the host must\n * have focus for the wheel to act.\n */\n @property({ type: Boolean, reflect: true })\n lighttouch = false;\n\n /**\n * Imperative hover flag — not Lit-reactive (avoids update churn for what\n * is purely an interaction-time predicate).\n */\n _isHovering = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`pointerenter`, this._onPointerEnter);\n this.addEventListener(`pointerleave`, this._onPointerLeave);\n this.addEventListener(`wheel`, this._onWheel, { passive: false });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`pointerenter`, this._onPointerEnter);\n this.removeEventListener(`pointerleave`, this._onPointerLeave);\n this.removeEventListener(`wheel`, this._onWheel);\n this._isHovering = false;\n }\n\n _onPointerEnter = (): void => {\n this._isHovering = true;\n };\n\n _onPointerLeave = (): void => {\n this._isHovering = false;\n };\n\n /**\n * Override to restrict when wheel is handled (e.g. editable-number rejects\n * while the user is typing). Default: respect `disabled`, then apply the\n * focus-or-lighttouch rule described on the mixin.\n */\n _shouldHandleWheel(): boolean {\n const anyThis = this as unknown as { disabled?: boolean };\n if (anyThis.disabled)\n return false;\n if (this.lighttouch && this._isHovering)\n return true;\n if (this.matches?.(`:focus, :focus-within`))\n return true;\n const root = this.renderRoot;\n if (root && (root as ShadowRoot).activeElement !== null)\n return true;\n return false;\n }\n\n _onWheel = (event: WheelEvent): void => {\n if (!this._shouldHandleWheel())\n return;\n event.preventDefault();\n // Some browsers (notably when the user holds Shift) send `deltaY=0`\n // and route the scroll into `deltaX` instead. Use whichever axis\n // actually moved so the direction sign matches the user's intent.\n const delta = event.deltaY !== 0 ? event.deltaY : event.deltaX;\n const direction: WheelDirection = delta < 0 ? 1 : -1;\n (this as unknown as WheelNudgeConsumer)._applyWheelDelta(direction, event);\n };\n }\n return WheelNudgeMixinClass as unknown as WheelNudgeMixinResult<T>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DA,SAAgB,gBAAmD,YAAyC;CAC1G,MAAM,6BAA6B,WAAW;;;GAO/B,KAAA,aAAA;GAMC,KAAA,cAAA;GAiBgB,KAAA,wBAAA;IAC5B,KAAK,cAAc;GACrB;GAE8B,KAAA,wBAAA;IAC5B,KAAK,cAAc;GACrB;GAqBY,KAAA,YAAA,UAA4B;IACtC,IAAI,CAAC,KAAK,mBAAmB,GAC3B;IACF,MAAM,eAAe;IAKrB,MAAM,aADQ,MAAM,WAAW,IAAI,MAAM,SAAS,MAAM,UACd,IAAI,IAAI;IAClD,KAAwC,iBAAiB,WAAW,KAAK;GAC3E;;EApDA,oBAAmC;GACjC,MAAM,kBAAkB;GACxB,KAAK,iBAAiB,gBAAgB,KAAK,eAAe;GAC1D,KAAK,iBAAiB,gBAAgB,KAAK,eAAe;GAC1D,KAAK,iBAAiB,SAAS,KAAK,UAAU,EAAE,SAAS,MAAM,CAAC;EAClE;EAEA,uBAAsC;GACpC,MAAM,qBAAqB;GAC3B,KAAK,oBAAoB,gBAAgB,KAAK,eAAe;GAC7D,KAAK,oBAAoB,gBAAgB,KAAK,eAAe;GAC7D,KAAK,oBAAoB,SAAS,KAAK,QAAQ;GAC/C,KAAK,cAAc;EACrB;;;;;;EAeA,qBAA8B;GAE5B,IAAI,KAAQ,UACV,OAAO;GACT,IAAI,KAAK,cAAc,KAAK,aAC1B,OAAO;GACT,IAAI,KAAK,UAAU,uBAAuB,GACxC,OAAO;GACT,MAAM,OAAO,KAAK;GAClB,IAAI,QAAS,KAAoB,kBAAkB,MACjD,OAAO;GACT,OAAO;EACT;CAaF;CA9DG,WAAA,CAAA,SAAS;EAAE,MAAM;EAAS,SAAS;CAAK,CAAC,CAAA,GAAA,qBAAA,WAAA,cAAA,KAAA,CAAA;CA+D5C,OAAO;AACT"}
@@ -1,5 +1,4 @@
1
1
  import { LitElement } from "lit";
2
-
3
2
  //#region src/mixins/wheel-nudge.d.ts
4
3
  /**
5
4
  * Direction of a wheel tick. `+1` for `deltaY < 0` (wheel up/away), `-1` for
@@ -17,8 +16,8 @@ type WheelDirection = 1 | -1;
17
16
  * (e.g. editable-number rejects while the user is typing).
18
17
  */
19
18
  interface WheelNudgeConsumer {
20
- _applyWheelDelta(direction: WheelDirection, event: WheelEvent): void;
21
- _shouldHandleWheel(): boolean;
19
+ _applyWheelDelta: (direction: WheelDirection, event: WheelEvent) => void;
20
+ _shouldHandleWheel: () => boolean;
22
21
  }
23
22
  /**
24
23
  * Internal: the surface a {@link WheelNudgeMixin}-decorated class exposes to
@@ -27,4 +26,4 @@ interface WheelNudgeConsumer {
27
26
  type WheelNudgeConsumerType<TBase> = TBase & WheelNudgeConsumer;
28
27
  //#endregion
29
28
  export { WheelNudgeConsumerType as n, WheelDirection as t };
30
- //# sourceMappingURL=wheel-nudge-C-ra_1os.d.ts.map
29
+ //# sourceMappingURL=wheel-nudge-DGrNzWuE.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wheel-nudge-DGrNzWuE.d.ts","names":[],"sources":["../src/mixins/wheel-nudge.ts"],"mappings":";;;;;;KASY;;;;;;;;;;;UAYK;EACf,mBAAmB,WAAW,gBAAgB,OAAO;EACrD;;;;;;KAOU,uBAAuB,SAAS,QAAQ"}
@@ -1,11 +1,13 @@
1
1
  import { LitElement, PropertyValues } from "lit";
2
-
3
2
  //#region src/plots/colour-map.d.ts
4
3
  type ColourMode = `fixed` | `opacity` | `hue` | `saturation` | `lightness` | `scale`;
5
4
  type ColourMapConfig = {
6
- mode: ColourMode; /** Parsed colours for 'scale' mode. Must have ≥ 2 entries. */
7
- palette: string[]; /** ixfx easing name applied before the colour mode mapping. Takes precedence over valueMap. */
8
- easingName: string; /** Custom value mapping fn (0..1 → 0..1). Used when easingName is empty. */
5
+ mode: ColourMode;
6
+ /** Parsed colours for 'scale' mode. Must have 2 entries. */
7
+ palette: string[];
8
+ /** ixfx easing name — applied before the colour mode mapping. Takes precedence over valueMap. */
9
+ easingName: string;
10
+ /** Custom value mapping fn (0..1 → 0..1). Used when easingName is empty. */
9
11
  valueMap: ((v: number) => number) | null;
10
12
  };
11
13
  type ColourResult = {
@@ -380,7 +382,7 @@ declare global {
380
382
  interface HTMLElementTagNameMap {
381
383
  'ixfx-plot-xy-axis': PlotXyAxis;
382
384
  }
383
- } //# sourceMappingURL=xy-axis.d.ts.map
385
+ }
384
386
  //#endregion
385
387
  export { ColourMapConfig as C, computeColour as D, applyAgeModification as E, parseColourScaleAttr as O, PlotDataSeriesOptions as S, ColourResult as T, PlotSingleAxisPointerMoveDetail as _, PlotHistogramBucketClickDetail as a, SingleAxisDrawStyle as b, PlotHistogramOrientation as c, PlotMultiAxisDataPointClickDetail as d, PlotMultiAxisDataPointClickEvent as f, PlotSingleAxisElementEventMap as g, PlotSingleAxis as h, PlotHistogram as i, readBaseColour as k, PlotHistogramValueTooltips as l, PlotMultiAxisLayout as m, XyAgeStyle as n, PlotHistogramBucketClickEvent as o, PlotMultiAxisElementEventMap as p, XyDrawStyle as r, PlotHistogramElementEventMap as s, PlotXyAxis as t, PlotMultiAxis as u, PlotSingleAxisPointerMoveEvent as v, ColourMode as w, PlotDataSeries as x, SingleAxisAgeStyle as y };
386
- //# sourceMappingURL=xy-axis-CtDDQzGZ.d.ts.map
388
+ //# sourceMappingURL=xy-axis-5KhVTNoX.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xy-axis-5KhVTNoX.d.ts","names":[],"sources":["../src/plots/colour-map.ts","../src/plots/data.ts","../src/plots/single-axis.ts","../src/plots/multi-axis.ts","../src/plots/plot-histogram.ts","../src/plots/xy-axis.ts"],"mappings":"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"}
@@ -1,14 +1,10 @@
1
- import { n as safeCustomElement, t as __decorate } from "./decorate-DdjvVHS-.js";
2
- import { t as getIcon } from "./registry-CkW7q09Q.js";
3
- import "./icons.js";
4
- import { LitElement, css, html, nothing, svg } from "lit";
1
+ import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
2
+ import { LitElement, css, html, svg } from "lit";
5
3
  import { property, state } from "lit/decorators.js";
6
- import { unsafeHTML } from "lit/directives/unsafe-html.js";
7
4
  import { Colour } from "@ixfx/visual";
8
5
  import { clamp, rangeStream } from "@ixfx/numbers";
9
6
  import { repeat } from "lit/directives/repeat.js";
10
7
  import { Easings } from "@ixfx/modulation";
11
- import { classMap } from "lit/directives/class-map.js";
12
8
  //#region src/plots/colour-map.ts
13
9
  const DEFAULT_BASE = `oklch(60% 0.15 140)`;
14
10
  const DEFAULT_PALETTE = [
@@ -247,108 +243,6 @@ var PlotDataSeries = class {
247
243
  }
248
244
  };
249
245
  //#endregion
250
- //#region src/util/is-numeric.ts
251
- function isNumeric(str) {
252
- if (typeof str === `number`) return true;
253
- if (typeof str !== `string`) return false;
254
- const trimmed = str.trim();
255
- return trimmed !== `` && !Number.isNaN(Number(trimmed));
256
- }
257
- //#endregion
258
- //#region src/util/tooltip.ts
259
- var _TooltipElement;
260
- let _baseStylesInjected = false;
261
- function ensureBaseTooltipStyles() {
262
- if (_baseStylesInjected) return;
263
- _baseStylesInjected = true;
264
- const style = document.createElement(`style`);
265
- style.textContent = `
266
- ixfx-tooltip {
267
- display: inline-block;
268
- background: var(--surface-5);
269
- color: var(--surface-5-text);
270
- border: var(--border);
271
- border-radius: var(--radius-l, 6px);
272
- box-shadow: var(--shadow-m);
273
- padding: var(--space-s, 4px);
274
- font-size: 10px;
275
- font-family: var(--font-family, inherit);
276
- }
277
- ixfx-tooltip .tooltip-type-number {
278
- font-family: var(--font-mono, ui-monospace, monospace);
279
- }
280
- `;
281
- document.head.appendChild(style);
282
- }
283
- let TooltipElement = class TooltipElement extends LitElement {
284
- static {
285
- _TooltipElement = this;
286
- }
287
- constructor(..._args) {
288
- super(..._args);
289
- this.valueFormatTooltip = _TooltipElement.defaultFormatter;
290
- this.orientation = `top`;
291
- this.anchor = `--tooltip`;
292
- }
293
- connectedCallback() {
294
- super.connectedCallback();
295
- ensureBaseTooltipStyles();
296
- }
297
- static {
298
- this.numberFormatter = (v) => Math.floor(v).toString();
299
- }
300
- static {
301
- this.defaultFormatter = (v) => {
302
- if (typeof v === `number`) {
303
- if (Number.isInteger(v)) return v.toString();
304
- return v.toFixed(2);
305
- } else if (typeof v === `string`) return v;
306
- else return JSON.stringify(v);
307
- };
308
- }
309
- #renderIcon() {
310
- if (!this.icon) return nothing;
311
- if (this.icon.startsWith(`<svg`)) return html`<span class="tooltip-icon" style="display:inline-flex;align-items:center;margin-right:0.25em">${unsafeHTML(this.icon)}</span>`;
312
- if (!getIcon(this.icon)) return nothing;
313
- return html`<ixfx-icon class="tooltip-icon" style="margin-right:0.25em" name="${this.icon}"></ixfx-icon>`;
314
- }
315
- render() {
316
- const classes = {
317
- "tooltip": true,
318
- "tooltip-orientation-top": this.orientation === `top`,
319
- "tooltip-orientation-bottom": this.orientation === `bottom`,
320
- "tooltip-orientation-right": this.orientation === `right`,
321
- "tooltip-orientation-left": this.orientation === `left`,
322
- "tooltip-type-text": true,
323
- "tooltip-type-number": false,
324
- "tooltip-style-bubble": true
325
- };
326
- let value = ``;
327
- switch (typeof this.value) {
328
- case `number`:
329
- classes[`tooltip-type-number`] = true;
330
- value = this.valueFormatTooltip(this.value);
331
- break;
332
- case `string`:
333
- if (isNumeric(this.value)) {
334
- classes[`tooltip-type-number`] = true;
335
- value = this.valueFormatTooltip(Number.parseFloat(this.value));
336
- } else value = this.value;
337
- break;
338
- default: value = JSON.stringify(this.value);
339
- }
340
- return html`<output style="--anchor-id: ${this.anchor}" class=${classMap(classes)}>${this.#renderIcon()}${value}</output>`;
341
- }
342
- createRenderRoot() {
343
- return this;
344
- }
345
- };
346
- __decorate([property({ type: String })], TooltipElement.prototype, "orientation", void 0);
347
- __decorate([property({ type: String })], TooltipElement.prototype, "anchor", void 0);
348
- __decorate([property()], TooltipElement.prototype, "value", void 0);
349
- __decorate([property({ type: String })], TooltipElement.prototype, "icon", void 0);
350
- TooltipElement = _TooltipElement = __decorate([safeCustomElement(`ixfx-tooltip`)], TooltipElement);
351
- //#endregion
352
246
  //#region src/plots/svg-utils.ts
353
247
  let _tooltipEl = null;
354
248
  let _tooltipOwner = null;
@@ -888,6 +782,7 @@ let PlotHistogram = class PlotHistogram extends LitElement {
888
782
  };
889
783
  } else {
890
784
  const y = padding + i * bucketSize;
785
+ const height = i === bucketCount - 1 ? Math.max(0, padding + availableMain - y) : Math.max(0, bucketSize - gap);
891
786
  return {
892
787
  count,
893
788
  valueMin,
@@ -896,7 +791,7 @@ let PlotHistogram = class PlotHistogram extends LitElement {
896
791
  x: padding,
897
792
  y,
898
793
  width: barLen,
899
- height: i === bucketCount - 1 ? Math.max(0, padding + availableMain - y) : Math.max(0, bucketSize - gap)
794
+ height
900
795
  };
901
796
  }
902
797
  });
@@ -1148,7 +1043,8 @@ function renderArea(points, cr, bottom, areaColor) {
1148
1043
  if (points.length < 2) return svg``;
1149
1044
  const lineD = buildLinePath(points);
1150
1045
  const fillColor = areaColor || cr.fill;
1151
- return svg`<path d=${`${lineD} L ${points[points.length - 1].x},${bottom} L ${points[0].x},${bottom} Z`} fill=${fillColor} opacity=${cr.opacity * .2} />`;
1046
+ const areaD = `${lineD} L ${points[points.length - 1].x},${bottom} L ${points[0].x},${bottom} Z`;
1047
+ return svg`<path d=${areaD} fill=${fillColor} opacity=${cr.opacity * .2} />`;
1152
1048
  }
1153
1049
  function renderCircles(points, crs, radius, ageStyle) {
1154
1050
  return points.map((p, i) => {
@@ -1842,6 +1738,6 @@ __decorate([state()], PlotXyAxis.prototype, "_width", void 0);
1842
1738
  __decorate([state()], PlotXyAxis.prototype, "_height", void 0);
1843
1739
  PlotXyAxis = __decorate([safeCustomElement(`ixfx-plot-xy-axis`)], PlotXyAxis);
1844
1740
  //#endregion
1845
- export { TooltipElement as a, computeColour as c, PlotMultiAxis as i, parseColourScaleAttr as l, PlotSingleAxis as n, PlotDataSeries as o, PlotHistogram as r, applyAgeModification as s, PlotXyAxis as t, readBaseColour as u };
1741
+ export { PlotDataSeries as a, parseColourScaleAttr as c, PlotMultiAxis as i, readBaseColour as l, PlotSingleAxis as n, applyAgeModification as o, PlotHistogram as r, computeColour as s, PlotXyAxis as t };
1846
1742
 
1847
- //# sourceMappingURL=xy-axis-BpA2eJq6.js.map
1743
+ //# sourceMappingURL=xy-axis-B6yMjckW.js.map