@ixfx/components 0.5.20 → 0.6.1

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 +586 -261
  2. package/bundle/index.d.ts.map +1 -1
  3. package/bundle/index.js +8306 -6624
  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 +2 -3
  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 +139 -599
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +789 -2845
  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-BhZeyyP-.d.ts} +2 -3
  144. package/dist/radial-input-BhZeyyP-.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-TidGhvXt.d.ts} +2 -3
  166. package/dist/slider-input-TidGhvXt.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-Dhzi5nHc.js.map → wheel-nudge-BlSCe_hD.js.map} +1 -1
  223. package/dist/{wheel-nudge-C-ra_1os.d.ts → wheel-nudge-DgMTRYlh.d.ts} +1 -2
  224. package/dist/wheel-nudge-DgMTRYlh.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 +4 -2
  234. package/docs-user/data-grid.md +248 -0
  235. package/docs-user/index.json +222 -0
  236. package/docs-user/llms.txt +58 -0
  237. package/docs-user/rating.md +102 -0
  238. package/docs-user/toolbar.md +135 -0
  239. package/llms.txt +58 -0
  240. package/package.json +21 -11
  241. package/dist/crumb-navigation-Pif-kupA.js +0 -1221
  242. package/dist/crumb-navigation-Pif-kupA.js.map +0 -1
  243. package/dist/defaults-BkWCPJFL.js.map +0 -1
  244. package/dist/hex-editor-CMIxtNgT.d.ts.map +0 -1
  245. package/dist/icon-Bd5BiU4b.d.ts.map +0 -1
  246. package/dist/icon-CK14NUcE.js.map +0 -1
  247. package/dist/icons.js.map +0 -1
  248. package/dist/incr-search-CeERfijK.js.map +0 -1
  249. package/dist/index-BslNaMLo.d.ts.map +0 -1
  250. package/dist/index-Cdmrn0SZ.d.ts.map +0 -1
  251. package/dist/index-CkMIKEWp.d.ts.map +0 -1
  252. package/dist/index-D87kRcEs.d.ts.map +0 -1
  253. package/dist/index-DrKRD8_a.d.ts.map +0 -1
  254. package/dist/index-tX6fKF8m.d.ts.map +0 -1
  255. package/dist/interaction-_Y2qO3QI.js +0 -1
  256. package/dist/labelled-input-base-ORb1rGq6.d.ts.map +0 -1
  257. package/dist/menu-BiFarLUA.js +0 -826
  258. package/dist/menu-BiFarLUA.js.map +0 -1
  259. package/dist/menu-item-AtoP6bD4.d.ts.map +0 -1
  260. package/dist/menu-item-yHSPV8nS.js +0 -783
  261. package/dist/menu-item-yHSPV8nS.js.map +0 -1
  262. package/dist/radial-input-C4f-2Bya.js.map +0 -1
  263. package/dist/radial-input-Dhu5ZGP5.d.ts.map +0 -1
  264. package/dist/registry-CkW7q09Q.js +0 -21
  265. package/dist/registry-CkW7q09Q.js.map +0 -1
  266. package/dist/selecthorizontal.d.ts +0 -16
  267. package/dist/selecthorizontal.d.ts.map +0 -1
  268. package/dist/selecthorizontal.js +0 -43
  269. package/dist/selecthorizontal.js.map +0 -1
  270. package/dist/slider-input-BEaztT-g.d.ts.map +0 -1
  271. package/dist/tab-list-B8v9KntS.d.ts.map +0 -1
  272. package/dist/tab-list-CR0v53KJ.js +0 -615
  273. package/dist/tab-list-CR0v53KJ.js.map +0 -1
  274. package/dist/tickled-controller-JDOR9B8V.d.ts.map +0 -1
  275. package/dist/tickled-styles-Bgo_Lpw-.js.map +0 -1
  276. package/dist/tooltip-BMTSUPBU.d.ts.map +0 -1
  277. package/dist/tree-component-CDLO1ITF.d.ts.map +0 -1
  278. package/dist/types-DSfbtHs3.d.ts +0 -8
  279. package/dist/types-DSfbtHs3.d.ts.map +0 -1
  280. package/dist/wheel-nudge-C-ra_1os.d.ts.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,737 @@
1
+ import { t as TickledController } from "./tickled-controller-DkAU-0qL.js";
2
+ import { t as themeFallbacks } from "./fallbacks-DEE1nCTt.js";
3
+ import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
4
+ import { t as createElementIncrSearch } from "./element-search-Y8SRfPGM.js";
5
+ import { LitElement, css, html, render } from "lit";
6
+ import { property, query, state } from "lit/decorators.js";
7
+ //#region src/vertical-list/vertical-list.ts
8
+ const ITEM_SELECTOR = `li, [data-list-item]`;
9
+ function isMultiMode(mode) {
10
+ return mode === `checked` || mode === `sticky` || mode === `vscode` || mode === `standard`;
11
+ }
12
+ let VerticalListElement = class VerticalListElement extends LitElement {
13
+ constructor(..._args2) {
14
+ super(..._args2);
15
+ this.selectionMode = `single`;
16
+ this.interactionMode = `standard`;
17
+ this._selectedItems = /* @__PURE__ */ new Set();
18
+ this._searchVisible = false;
19
+ this._searchQuery = ``;
20
+ this.#customWrappers = /* @__PURE__ */ new Map();
21
+ this.#wrappedElements = /* @__PURE__ */ new Set();
22
+ this.tickled = new TickledController(this, {
23
+ getItems: () => this._getVisibleItems().map((el) => ({
24
+ id: el,
25
+ enabled: true
26
+ })),
27
+ onTickle: (id) => {
28
+ if (id !== void 0) this._dispatch(`list-tickle`, { item: id });
29
+ },
30
+ onStateChange: () => this._syncItemStates()
31
+ });
32
+ this._onPointerOver = (e) => {
33
+ const item = this._findListItem(e.composedPath());
34
+ if (item) this.tickled.handlePointerEnter(item);
35
+ };
36
+ this._onPointerLeave = (e) => {
37
+ this.tickled.handlePointerLeave(e);
38
+ };
39
+ this._onKeyDown = (e) => {
40
+ if ((e.ctrlKey || e.metaKey) && e.key === `f`) {
41
+ e.preventDefault();
42
+ this._openSearch();
43
+ return;
44
+ }
45
+ if ((e.ctrlKey || e.metaKey) && e.key === `a`) {
46
+ if ((this.selectionMode === `multiple` || isMultiMode(this.interactionMode)) && this.selectionMode !== `none`) {
47
+ e.preventDefault();
48
+ this._selectAll();
49
+ }
50
+ return;
51
+ }
52
+ if (this._searchVisible) return;
53
+ switch (e.key) {
54
+ case `ArrowDown`:
55
+ e.preventDefault();
56
+ this.tickled.handleKeyboardNavigation(`next`);
57
+ if (e.shiftKey && this.interactionMode === `vscode`) {
58
+ const cur = this.tickled.tickledId;
59
+ if (cur) this._rangeSelectTo(cur);
60
+ }
61
+ break;
62
+ case `ArrowUp`:
63
+ e.preventDefault();
64
+ this.tickled.handleKeyboardNavigation(`previous`);
65
+ if (e.shiftKey && this.interactionMode === `vscode`) {
66
+ const cur = this.tickled.tickledId;
67
+ if (cur) this._rangeSelectTo(cur);
68
+ }
69
+ break;
70
+ case `Enter`: {
71
+ const id = this.tickled.tickledId;
72
+ if (id) {
73
+ e.preventDefault();
74
+ this._dispatch(`list-item-click`, { item: id });
75
+ this._activateItem(id);
76
+ }
77
+ break;
78
+ }
79
+ case ` `: {
80
+ const id = this.tickled.tickledId;
81
+ if (id) {
82
+ e.preventDefault();
83
+ this._handleSpaceKey(id);
84
+ }
85
+ break;
86
+ }
87
+ case `Escape`: this._clearSelection();
88
+ }
89
+ };
90
+ this._onClick = (e) => {
91
+ const item = this._findListItem(e.composedPath());
92
+ if (!item) return;
93
+ this._dispatch(`list-item-click`, { item });
94
+ this._handleClickSelection(item, e);
95
+ };
96
+ this._onDblClick = (e) => {
97
+ const item = this._findListItem(e.composedPath());
98
+ if (item) this._activateItem(item);
99
+ };
100
+ this._onSearchInput = (e) => {
101
+ const input = e.target;
102
+ this._searchQuery = input.value;
103
+ this.#search?.setQuery(this._searchQuery);
104
+ };
105
+ this._onSearchKeydown = (e) => {
106
+ if (e.key === `Escape`) {
107
+ e.stopPropagation();
108
+ this._closeSearch();
109
+ } else if (e.key === `ArrowDown`) {
110
+ e.preventDefault();
111
+ this.tickled.handleKeyboardNavigation(`next`);
112
+ } else if (e.key === `ArrowUp`) {
113
+ e.preventDefault();
114
+ this.tickled.handleKeyboardNavigation(`previous`);
115
+ } else if (e.key === `Enter`) {
116
+ e.preventDefault();
117
+ e.stopPropagation();
118
+ const id = this.tickled.tickledId ?? this._getVisibleItems()[0];
119
+ if (id) {
120
+ this._dispatch(`list-item-click`, { item: id });
121
+ this._activateItem(id);
122
+ this._closeSearch();
123
+ }
124
+ }
125
+ };
126
+ }
127
+ #search;
128
+ #selectionAnchor;
129
+ #customWrappers;
130
+ #wrappedElements;
131
+ connectedCallback() {
132
+ super.connectedCallback();
133
+ if (!this.hasAttribute(`tabindex`)) this.tabIndex = 0;
134
+ this.addEventListener(`pointerover`, this._onPointerOver);
135
+ this.addEventListener(`pointerleave`, this._onPointerLeave);
136
+ this.addEventListener(`keydown`, this._onKeyDown);
137
+ this.addEventListener(`click`, this._onClick);
138
+ this.addEventListener(`dblclick`, this._onDblClick);
139
+ }
140
+ disconnectedCallback() {
141
+ super.disconnectedCallback();
142
+ this.removeEventListener(`pointerover`, this._onPointerOver);
143
+ this.removeEventListener(`pointerleave`, this._onPointerLeave);
144
+ this.removeEventListener(`keydown`, this._onKeyDown);
145
+ this.removeEventListener(`click`, this._onClick);
146
+ this.removeEventListener(`dblclick`, this._onDblClick);
147
+ this.#search?.dispose();
148
+ this.#search = void 0;
149
+ }
150
+ firstUpdated() {
151
+ this.#search = createElementIncrSearch({
152
+ container: this,
153
+ itemSelector: ITEM_SELECTOR,
154
+ getLabel: (el) => el.getAttribute(`data-search-label`) ?? el.textContent?.trim() ?? ``,
155
+ getKey: (el) => el.getAttribute(`data-key`) ?? el.getAttribute(`data-search-label`) ?? el.textContent?.trim() ?? ``,
156
+ highlightKey: `vertical-list-search`
157
+ });
158
+ }
159
+ updated(changed) {
160
+ super.updated(changed);
161
+ if (changed.has(`interactionMode`)) {
162
+ this.#selectionAnchor = void 0;
163
+ const previousSelected = this._selectedItems;
164
+ const savedWrappers = changed.get(`interactionMode`) === `checked` ? new Map(this.#customWrappers) : null;
165
+ this._syncCheckboxes();
166
+ if (previousSelected.size > 0) {
167
+ let remapped;
168
+ if (savedWrappers && savedWrappers.size > 0) remapped = new Set([...previousSelected].map((el) => savedWrappers.get(el) ?? el));
169
+ else if (this.#customWrappers.size > 0) {
170
+ const innerToWrapper = new Map([...this.#customWrappers].map(([w, i]) => [i, w]));
171
+ remapped = new Set([...previousSelected].map((el) => innerToWrapper.get(el) ?? el));
172
+ } else remapped = new Set(previousSelected);
173
+ this._selectedItems = remapped;
174
+ }
175
+ this._syncItemStates();
176
+ } else if (changed.has(`checkboxRenderer`) && this.interactionMode === `checked`) this._syncCheckboxes();
177
+ }
178
+ /** The most recently selected item, or `undefined` if nothing is selected. */
179
+ get selectedItem() {
180
+ return [...this._selectedItems].at(-1);
181
+ }
182
+ /** The full current selection set (read-only). */
183
+ get selectedItems() {
184
+ return this._selectedItems;
185
+ }
186
+ addItem(item, options) {
187
+ let el;
188
+ if (typeof item === `string`) {
189
+ const li = document.createElement(`li`);
190
+ li.textContent = item;
191
+ el = li;
192
+ } else el = item;
193
+ if (options?.notChecked) el.setAttribute(`not-checked`, ``);
194
+ this.appendChild(el);
195
+ if (this.interactionMode === `checked`) this._syncCheckboxes();
196
+ }
197
+ removeItem(item) {
198
+ item.remove();
199
+ }
200
+ clearItems() {
201
+ this.#customWrappers.clear();
202
+ this.replaceChildren();
203
+ this.#selectionAnchor = void 0;
204
+ this._selectedItems = /* @__PURE__ */ new Set();
205
+ this._syncItemStates();
206
+ }
207
+ /**
208
+ * Replace the entire item list in one call.
209
+ * Equivalent to `clearItems()` followed by `addItem()` for each element.
210
+ * Preserves `interactionMode` checkbox wrapping.
211
+ */
212
+ setItems(items) {
213
+ this.clearItems();
214
+ for (const item of items) this.appendChild(item);
215
+ if (this.interactionMode === `checked`) this._syncCheckboxes();
216
+ }
217
+ /**
218
+ * Dispatch a command to this list. No-op by default.
219
+ * Intended for use with `ixfx-grouped-item-lister`'s `dispatch()` method,
220
+ * which forwards commands to all sub-components.
221
+ */
222
+ dispatch(_commandId, _args) {}
223
+ select(item) {
224
+ this._replaceSelection(item);
225
+ }
226
+ selectMany(items) {
227
+ if (this.selectionMode !== `multiple`) throw new Error(`selectMany requires selectionMode="multiple" (current: "${this.selectionMode}")`);
228
+ const previous = this._selectedItems;
229
+ const next = new Set([...items].filter((el) => this._isCheckable(el)));
230
+ if (next.size === 0) return;
231
+ this._selectedItems = next;
232
+ this.#selectionAnchor = [...next].at(-1);
233
+ this._syncItemStates();
234
+ this._dispatch(`list-select`, {
235
+ selected: next,
236
+ previous
237
+ });
238
+ }
239
+ deselect(item) {
240
+ if (!this._selectedItems.has(item)) return;
241
+ const previous = this._selectedItems;
242
+ const next = new Set(this._selectedItems);
243
+ next.delete(item);
244
+ this._selectedItems = next;
245
+ this._syncItemStates();
246
+ this._dispatch(`list-select`, {
247
+ selected: next,
248
+ previous
249
+ });
250
+ }
251
+ clearSelection() {
252
+ this._clearSelection();
253
+ }
254
+ selectAll() {
255
+ if ((this.selectionMode === `multiple` || isMultiMode(this.interactionMode)) && this.selectionMode !== `none`) this._selectAll();
256
+ }
257
+ *selectedFilter(kind) {
258
+ const wanted = (el) => {
259
+ switch (kind) {
260
+ case `selected`: return el.hasAttribute(`data-selected`);
261
+ case `checked`: return el.hasAttribute(`data-checked`);
262
+ case `either`: return el.hasAttribute(`data-selected`) || el.hasAttribute(`data-checked`);
263
+ }
264
+ };
265
+ for (const el of this.querySelectorAll(ITEM_SELECTOR)) {
266
+ if (this.#wrappedElements.has(el)) continue;
267
+ if (el.hidden) continue;
268
+ if (wanted(el)) yield el;
269
+ }
270
+ }
271
+ _replaceSelection(item) {
272
+ if (this.selectionMode === `none`) return;
273
+ if (!this._isCheckable(item)) return;
274
+ const previous = this._selectedItems;
275
+ const next = /* @__PURE__ */ new Set([item]);
276
+ this._selectedItems = next;
277
+ this.#selectionAnchor = item;
278
+ this._syncItemStates();
279
+ this._dispatch(`list-select`, {
280
+ selected: next,
281
+ previous
282
+ });
283
+ }
284
+ _toggleItem(item) {
285
+ if (!this._isCheckable(item)) return;
286
+ const effectiveMultiple = this.selectionMode === `multiple` || isMultiMode(this.interactionMode);
287
+ if (this.selectionMode === `none` && this.interactionMode !== `checked` && this.interactionMode !== `sticky`) return;
288
+ const previous = this._selectedItems;
289
+ const next = new Set(this._selectedItems);
290
+ if (next.has(item)) next.delete(item);
291
+ else {
292
+ if (!effectiveMultiple) next.clear();
293
+ next.add(item);
294
+ }
295
+ this._selectedItems = next;
296
+ this._syncItemStates();
297
+ this._dispatch(`list-select`, {
298
+ selected: next,
299
+ previous
300
+ });
301
+ }
302
+ _rangeSelectTo(item) {
303
+ if (this.selectionMode === `none`) return;
304
+ if (!this.#selectionAnchor) {
305
+ this._replaceSelection(item);
306
+ return;
307
+ }
308
+ const visible = this._getVisibleItems();
309
+ const anchorIdx = visible.indexOf(this.#selectionAnchor);
310
+ const targetIdx = visible.indexOf(item);
311
+ if (anchorIdx === -1 || targetIdx === -1) {
312
+ this._replaceSelection(item);
313
+ return;
314
+ }
315
+ const start = Math.min(anchorIdx, targetIdx);
316
+ const end = Math.max(anchorIdx, targetIdx);
317
+ const previous = this._selectedItems;
318
+ const next = new Set(visible.slice(start, end + 1).filter((el) => this._isCheckable(el)));
319
+ this._selectedItems = next;
320
+ this._syncItemStates();
321
+ this._dispatch(`list-select`, {
322
+ selected: next,
323
+ previous
324
+ });
325
+ }
326
+ _clearSelection() {
327
+ if (this._selectedItems.size === 0) return;
328
+ const previous = this._selectedItems;
329
+ this._selectedItems = /* @__PURE__ */ new Set();
330
+ this._syncItemStates();
331
+ this._dispatch(`list-select`, {
332
+ selected: /* @__PURE__ */ new Set(),
333
+ previous
334
+ });
335
+ }
336
+ _selectAll() {
337
+ const visible = this._getVisibleItems();
338
+ if (visible.length === 0) return;
339
+ const previous = this._selectedItems;
340
+ const next = new Set(visible.filter((el) => this._isCheckable(el)));
341
+ if (next.size === 0) return;
342
+ this._selectedItems = next;
343
+ this._syncItemStates();
344
+ this._dispatch(`list-select`, {
345
+ selected: next,
346
+ previous
347
+ });
348
+ }
349
+ _handleClickSelection(item, e) {
350
+ const mode = this.interactionMode;
351
+ if (mode === `manual`) return;
352
+ if (this.selectionMode === `none` && mode !== `checked` && mode !== `sticky`) return;
353
+ switch (mode) {
354
+ case `implicit`:
355
+ this._replaceSelection(item);
356
+ break;
357
+ case `standard`:
358
+ case `vscode`:
359
+ if (e.ctrlKey || e.metaKey) {
360
+ if (this.selectionMode === `multiple` || mode === `vscode`) this._toggleItem(item);
361
+ } else if (e.shiftKey && (this.selectionMode === `multiple` || mode === `vscode`)) this._rangeSelectTo(item);
362
+ else this._replaceSelection(item);
363
+ break;
364
+ case `checked`: break;
365
+ case `sticky`: this._toggleItem(item);
366
+ }
367
+ }
368
+ _handleSpaceKey(item) {
369
+ const mode = this.interactionMode;
370
+ if (mode === `manual`) return;
371
+ if (mode === `implicit`) this._replaceSelection(item);
372
+ else this._toggleItem(item);
373
+ }
374
+ _getVisibleItems() {
375
+ return Array.from(this.querySelectorAll(ITEM_SELECTOR)).filter((el) => {
376
+ if (this.#wrappedElements.has(el)) return false;
377
+ if (el.hidden) return false;
378
+ if (this.filterPredicate && !this.filterPredicate(el)) return false;
379
+ return true;
380
+ });
381
+ }
382
+ _isCheckable(item) {
383
+ if (this.interactionMode !== `checked`) return true;
384
+ return !(this.#customWrappers.get(item) ?? item).hasAttribute(`not-checked`);
385
+ }
386
+ _syncItemStates() {
387
+ for (const el of this.querySelectorAll(ITEM_SELECTOR)) {
388
+ if (this.#wrappedElements.has(el)) continue;
389
+ const item = this.#customWrappers.get(el) ?? el;
390
+ el.toggleAttribute(`data-tickled`, this.tickled.isTickled(el));
391
+ el.toggleAttribute(`data-selected`, this._selectedItems.has(el));
392
+ if (this.interactionMode === `checked`) el.toggleAttribute(`data-checked`, !item.hasAttribute(`not-checked`) && this._selectedItems.has(el));
393
+ else el.removeAttribute(`data-checked`);
394
+ }
395
+ this.dataset.inputMode = this.tickled.inputMode;
396
+ this._syncCheckboxes();
397
+ }
398
+ _syncCheckboxes() {
399
+ const inCheckedMode = this.interactionMode === `checked`;
400
+ const wantsCustom = typeof this.checkboxRenderer === `function`;
401
+ if (inCheckedMode) for (const inner of Array.from(this.children)) {
402
+ if (!inner.hasAttribute(`data-list-item`)) continue;
403
+ if (inner.parentElement !== this) continue;
404
+ const wrapper = document.createElement(`li`);
405
+ wrapper.className = `ixfx-custom-row`;
406
+ const key = inner.getAttribute(`data-key`);
407
+ const label = inner.getAttribute(`data-search-label`);
408
+ if (key !== null) wrapper.setAttribute(`data-key`, key);
409
+ if (label !== null) wrapper.setAttribute(`data-search-label`, label);
410
+ inner.removeAttribute(`data-list-item`);
411
+ this.insertBefore(wrapper, inner);
412
+ wrapper.appendChild(inner);
413
+ this.#customWrappers.set(wrapper, inner);
414
+ this.#wrappedElements.add(inner);
415
+ }
416
+ else {
417
+ for (const [wrapper, inner] of this.#customWrappers) {
418
+ if (wrapper.parentElement !== this) continue;
419
+ inner.setAttribute(`data-list-item`, ``);
420
+ this.insertBefore(inner, wrapper);
421
+ wrapper.remove();
422
+ }
423
+ this.#customWrappers.clear();
424
+ this.#wrappedElements.clear();
425
+ }
426
+ for (const el of this.querySelectorAll(`li`)) {
427
+ const existing = el.querySelector(`.ixfx-list-checkbox`);
428
+ if (!inCheckedMode) {
429
+ if (existing) existing.remove();
430
+ continue;
431
+ }
432
+ if ((this.#customWrappers.get(el) ?? el).hasAttribute(`not-checked`)) {
433
+ if (existing) existing.remove();
434
+ continue;
435
+ }
436
+ const existingIsCustom = existing?.classList.contains(`ixfx-list-checkbox-custom`) ?? false;
437
+ if (existing && existingIsCustom !== wantsCustom) existing.remove();
438
+ let cb = el.querySelector(`.ixfx-list-checkbox`);
439
+ if (!cb) {
440
+ if (wantsCustom) {
441
+ const opts = this.checkboxRenderer;
442
+ const margin = opts.margin ?? `0`;
443
+ const width = opts.width ?? `24px`;
444
+ cb = this._createCustomCheckbox(el, margin, width);
445
+ } else cb = this._createNativeCheckboxCell(el);
446
+ el.prepend(cb);
447
+ }
448
+ const checked = this._selectedItems.has(el);
449
+ if (wantsCustom) {
450
+ cb.setAttribute(`aria-checked`, String(checked));
451
+ cb.toggleAttribute(`data-checked`, checked);
452
+ if (this.checkboxRenderer) {
453
+ const renderer = typeof this.checkboxRenderer === `function` ? this.checkboxRenderer : this.checkboxRenderer.renderer;
454
+ render(renderer(checked), cb);
455
+ }
456
+ } else {
457
+ const input = cb.querySelector(`input.ixfx-list-checkbox`);
458
+ if (input) input.checked = checked;
459
+ }
460
+ }
461
+ }
462
+ /**
463
+ * Native checkbox cell: a span that stretches to the row's full cross-axis
464
+ * (so the entire column height is a click target) with a real `<input>`
465
+ * centred inside. The span owns the click; the input is purely visual and
466
+ * has `pointer-events:none` so a single click produces one toggle.
467
+ */
468
+ _createNativeCheckboxCell(el) {
469
+ const cell = document.createElement(`span`);
470
+ cell.className = `ixfx-list-checkbox ixfx-list-checkbox-native`;
471
+ 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`;
472
+ cell.tabIndex = -1;
473
+ cell.setAttribute(`role`, `checkbox`);
474
+ cell.setAttribute(`part`, `checkbox`);
475
+ cell.addEventListener(`click`, (e) => {
476
+ e.stopPropagation();
477
+ this._toggleItem(el);
478
+ });
479
+ const input = document.createElement(`input`);
480
+ input.type = `checkbox`;
481
+ input.className = `ixfx-list-checkbox`;
482
+ input.style.cssText = `pointer-events:none;cursor:pointer;margin:0`;
483
+ cell.appendChild(input);
484
+ return cell;
485
+ }
486
+ /**
487
+ * Custom checkbox cell: same shape as the native cell (a stretching span)
488
+ * so behaviour is identical. The renderer's content goes inside.
489
+ */
490
+ _createCustomCheckbox(el, margin, width) {
491
+ const span = document.createElement(`span`);
492
+ span.className = `ixfx-list-checkbox ixfx-list-checkbox-custom`;
493
+ 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`;
494
+ span.tabIndex = -1;
495
+ span.setAttribute(`role`, `checkbox`);
496
+ span.setAttribute(`part`, `checkbox`);
497
+ span.addEventListener(`click`, (e) => {
498
+ e.stopPropagation();
499
+ this._toggleItem(el);
500
+ });
501
+ return span;
502
+ }
503
+ _findListItem(path) {
504
+ for (const target of path) {
505
+ if (!(target instanceof Element)) continue;
506
+ if (target === this) break;
507
+ if (target.parentElement === this && target.matches(ITEM_SELECTOR)) return target;
508
+ }
509
+ }
510
+ _dispatch(name, detail) {
511
+ this.dispatchEvent(new CustomEvent(name, {
512
+ detail,
513
+ bubbles: true,
514
+ composed: true
515
+ }));
516
+ }
517
+ _openSearch() {
518
+ this._searchVisible = true;
519
+ this.updateComplete.then(() => this._searchInputEl?.focus());
520
+ }
521
+ _closeSearch() {
522
+ this._searchVisible = false;
523
+ this._searchQuery = ``;
524
+ this.#search?.clearQuery();
525
+ this.focus();
526
+ }
527
+ _activateItem(item) {
528
+ if (this.interactionMode !== `manual`) this._replaceSelection(item);
529
+ this._dispatch(`list-activate`, { item });
530
+ }
531
+ static {
532
+ this.styles = [themeFallbacks, css`
533
+ :host {
534
+ display: block;
535
+ position: relative;
536
+ background: var(--list-bg, var(--surface-3));
537
+ color: var(--list-text, var(--surface-3-text));
538
+ border-radius: var(--list-radius, var(--radius-s));
539
+ border: 1px solid var(--list-border, var(--border));
540
+ width: 100%;
541
+ height: 100%;
542
+ overflow: hidden;
543
+ box-sizing: border-box;
544
+ outline: none;
545
+ --ixfx-list-item-padding: var(--ixfx-list-item-padding, var(--list-item-padding, 4px var(--space-m, 8px)));
546
+ }
547
+
548
+ :host(:focus-visible) {
549
+ outline: 2px solid var(--accent);
550
+ outline-offset: 2px;
551
+ }
552
+
553
+ .container {
554
+ position: relative;
555
+ width: 100%;
556
+ height: 100%;
557
+ }
558
+
559
+ ul {
560
+ list-style: none;
561
+ margin: 0;
562
+ padding: 0;
563
+ width: 100%;
564
+ height: 100%;
565
+ overflow-x: hidden;
566
+ overflow-y: auto;
567
+ box-sizing: border-box;
568
+ /* Scrollbar theming: end users override these CSS variables to control
569
+ the native scrollbar (scrollbar-width, scrollbar-gutter, scrollbar-color). */
570
+ scrollbar-width: var(--list-scrollbar-width, auto);
571
+ scrollbar-gutter: var(--list-scrollbar-gutter, auto);
572
+ scrollbar-color: var(--list-scrollbar-color, auto);
573
+ }
574
+
575
+ ::slotted([hidden]) {
576
+ display: none !important;
577
+ }
578
+
579
+ ::slotted(li) {
580
+ display: flex;
581
+ align-items: center;
582
+ padding: var(--ixfx-list-item-padding);
583
+ min-height: var(--list-item-height, 28px);
584
+ cursor: pointer;
585
+ user-select: none;
586
+ transition: background var(--transition, 0.1s ease-out),
587
+ outline-color var(--transition, 0.1s ease-out);
588
+ box-sizing: border-box;
589
+ outline: 1px solid transparent;
590
+ }
591
+
592
+ /* Custom shadow-DOM components handle their own internal layout/padding */
593
+ ::slotted([data-list-item]) {
594
+ display: block;
595
+ cursor: pointer;
596
+ user-select: none;
597
+ transition: background var(--transition, 0.1s ease-out),
598
+ outline-color var(--transition, 0.1s ease-out);
599
+ outline: 1px solid transparent;
600
+ }
601
+
602
+ /* In checked mode, only the checkbox column is clickable; the row body
603
+ gets a default cursor so it doesn't suggest otherwise. */
604
+ :host([interaction-mode="checked"]) ::slotted(li),
605
+ :host([interaction-mode="checked"]) ::slotted([data-list-item]) {
606
+ cursor: default;
607
+ }
608
+
609
+ /* Wrapper inserted around custom [data-list-item] elements in checked mode.
610
+ Provides the flex layout so the injected checkbox can stretch to the
611
+ row's full height via align-self:stretch. */
612
+ .ixfx-custom-row {
613
+ display: flex;
614
+ align-items: center;
615
+ min-height: var(--list-item-height, 28px);
616
+ box-sizing: border-box;
617
+ cursor: default;
618
+ user-select: none;
619
+ }
620
+
621
+ ::slotted([data-tickled]) {
622
+ background: var(--item-bg-tickled);
623
+ outline: var(--item-border-tickled);
624
+ }
625
+
626
+ ::slotted([data-selected]) {
627
+ background: var(--item-bg-selected);
628
+ color: var(--item-text-selected);
629
+ outline: 1px solid transparent;
630
+ }
631
+
632
+ ::slotted([data-selected][data-tickled]) {
633
+ background: var(--item-bg-selected-tickled);
634
+ outline: 2px dashed var(--surface-3);
635
+ outline-offset: -2px;
636
+ }
637
+
638
+ /* checked mode: checkbox (injected into li) communicates selection — suppress bg highlight */
639
+ :host([interaction-mode="checked"]) ::slotted([data-selected]) {
640
+ background: transparent;
641
+ color: inherit;
642
+ outline: 1px solid transparent;
643
+ }
644
+
645
+ :host([interaction-mode="checked"]) ::slotted([data-selected][data-tickled]) {
646
+ background: var(--item-bg-tickled);
647
+ color: inherit;
648
+ outline: var(--item-border-tickled);
649
+ }
650
+
651
+ .search-overlay {
652
+ position: absolute;
653
+ top: 8px;
654
+ right: 8px;
655
+ z-index: 10;
656
+ display: flex;
657
+ align-items: center;
658
+ gap: 4px;
659
+ background: var(--surface-4, #2a2a2a);
660
+ border: 1px solid var(--border, #444);
661
+ border-radius: var(--radius-m, 4px);
662
+ padding: 4px 6px;
663
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
664
+ }
665
+
666
+ .search-overlay[hidden] {
667
+ display: none;
668
+ }
669
+
670
+ .search-input {
671
+ background: transparent;
672
+ border: none;
673
+ outline: none;
674
+ color: inherit;
675
+ font-size: var(--text-m, 0.875em);
676
+ min-width: 140px;
677
+ }
678
+
679
+ .search-close {
680
+ background: transparent;
681
+ border: none;
682
+ color: var(--surface-muted-text, #888);
683
+ cursor: pointer;
684
+ font-size: 1.1em;
685
+ line-height: 1;
686
+ padding: 0 2px;
687
+ }
688
+
689
+ .search-close:hover {
690
+ color: inherit;
691
+ }
692
+ `];
693
+ }
694
+ render() {
695
+ return html`
696
+ <div class="container">
697
+ <ul part="list">
698
+ <slot></slot>
699
+ </ul>
700
+ <div
701
+ class="search-overlay"
702
+ part="search-overlay"
703
+ ?hidden=${!this._searchVisible}
704
+ >
705
+ <input
706
+ type="text"
707
+ class="search-input"
708
+ placeholder="Search…"
709
+ .value=${this._searchQuery}
710
+ @input=${this._onSearchInput}
711
+ @keydown=${this._onSearchKeydown}
712
+ />
713
+ <button class="search-close" @click=${this._closeSearch} title="Close search (Esc)">×</button>
714
+ </div>
715
+ </div>
716
+ `;
717
+ }
718
+ };
719
+ __decorate([property({
720
+ type: String,
721
+ attribute: `selection-mode`
722
+ })], VerticalListElement.prototype, "selectionMode", void 0);
723
+ __decorate([property({
724
+ type: String,
725
+ attribute: `interaction-mode`
726
+ })], VerticalListElement.prototype, "interactionMode", void 0);
727
+ __decorate([property({ attribute: false })], VerticalListElement.prototype, "filterPredicate", void 0);
728
+ __decorate([property({ attribute: false })], VerticalListElement.prototype, "checkboxRenderer", void 0);
729
+ __decorate([state()], VerticalListElement.prototype, "_selectedItems", void 0);
730
+ __decorate([state()], VerticalListElement.prototype, "_searchVisible", void 0);
731
+ __decorate([state()], VerticalListElement.prototype, "_searchQuery", void 0);
732
+ __decorate([query(`.search-input`)], VerticalListElement.prototype, "_searchInputEl", void 0);
733
+ VerticalListElement = __decorate([safeCustomElement(`ixfx-vertical-list`)], VerticalListElement);
734
+ //#endregion
735
+ export { VerticalListElement };
736
+
737
+ //# sourceMappingURL=vertical-list.js.map