@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,646 @@
1
+ import { t as TickledController } from "./tickled-controller-DkAU-0qL.js";
2
+ import { n as tickledStyles, t as tickledItemStyles } from "./tickled-styles-BrAHEj1q.js";
3
+ import { t as themeFallbacks } from "./fallbacks-DEE1nCTt.js";
4
+ import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
5
+ import { t as DataController } from "./data-controller-DOlmqNKb.js";
6
+ import { n as createAcCompletionProvider } from "./incr-search-vCzuao-2.js";
7
+ import { LitElement, css, html, nothing } from "lit";
8
+ import { property, state } from "lit/decorators.js";
9
+ //#region src/ac-token/ac-token.ts
10
+ const DEFAULT_TOKENIZER = (text) => text.split(/[\s,;]+/);
11
+ function makeLruCache(maxSize) {
12
+ const map = /* @__PURE__ */ new Map();
13
+ return {
14
+ get: (k) => map.get(k),
15
+ set: (k, v) => {
16
+ if (map.has(k)) map.delete(k);
17
+ map.set(k, v);
18
+ if (map.size > maxSize) map.delete(map.keys().next().value);
19
+ },
20
+ has: (k) => map.has(k),
21
+ clear: () => map.clear()
22
+ };
23
+ }
24
+ let AcTokenElement = class AcTokenElement extends LitElement {
25
+ #data;
26
+ #cache;
27
+ #debounceTimer;
28
+ #staticProvider;
29
+ #lastSuggestions;
30
+ constructor() {
31
+ super();
32
+ this.placeholder = ``;
33
+ this.cacheSize = 20;
34
+ this.debounceMs = 150;
35
+ this.strict = false;
36
+ this.allowDuplicates = false;
37
+ this._tokens = [];
38
+ this._draft = ``;
39
+ this._isOpen = false;
40
+ this._tickled = new TickledController(this, { getItems: () => this.#data.items.map((_, i) => ({
41
+ id: i,
42
+ enabled: true
43
+ })) });
44
+ this.#data = new DataController(this, void 0, {
45
+ clearOnRequest: true,
46
+ onError: (err) => console.error(`[ixfx-ac-token] completionProvider error:`, err)
47
+ });
48
+ this.#cache = makeLruCache(20);
49
+ this.#lastSuggestions = [];
50
+ this.#onWrapperClick = (e) => {
51
+ if (!e.target.closest(`.token-chip`)) this.shadowRoot?.querySelector(`input.draft`)?.focus();
52
+ };
53
+ this.#onFocus = () => {
54
+ this._selectedTokenIndex = void 0;
55
+ this.#scheduleSuggestionFetch(this._draft);
56
+ };
57
+ this.#onBlur = () => {
58
+ setTimeout(() => {
59
+ this._isOpen = false;
60
+ this._tickled.clearTickled();
61
+ this._selectedTokenIndex = void 0;
62
+ }, 120);
63
+ };
64
+ this.#onInput = (e) => {
65
+ const value = e.target.value;
66
+ this._selectedTokenIndex = void 0;
67
+ const parts = (this.tokenizer ?? DEFAULT_TOKENIZER)(value);
68
+ if (parts.length > 1) {
69
+ for (let i = 0; i < parts.length - 1; i++) {
70
+ const label = parts[i].trim();
71
+ if (label) this.#addToken({ label });
72
+ }
73
+ this._draft = parts[parts.length - 1] ?? ``;
74
+ } else this._draft = value;
75
+ this.#scheduleSuggestionFetch(this._draft);
76
+ };
77
+ this.#onKeyDown = (e) => {
78
+ const input = e.target;
79
+ if ((e.metaKey || e.ctrlKey) && e.key === `a`) {
80
+ e.preventDefault();
81
+ const parts = [...this._tokens.map((t) => t.label), this._draft.trim()].filter(Boolean);
82
+ navigator.clipboard.writeText(parts.join(` `)).catch(() => {});
83
+ return;
84
+ }
85
+ if (this._selectedTokenIndex !== void 0 && e.key.length === 1 && !e.metaKey && !e.ctrlKey && !e.altKey) {
86
+ e.preventDefault();
87
+ this.#startEditingSelectedToken(e.key);
88
+ return;
89
+ }
90
+ this.#handleNavigationKey(e, input);
91
+ };
92
+ this.#onPaste = (e) => {
93
+ e.preventDefault();
94
+ const text = e.clipboardData?.getData(`text/plain`) ?? ``;
95
+ if (!text) return;
96
+ const parts = (this.tokenizer ?? DEFAULT_TOKENIZER)(this._draft + text).filter(Boolean);
97
+ if (parts.length === 0) return;
98
+ if (parts.length === 1) this._draft = parts[0];
99
+ else {
100
+ for (let i = 0; i < parts.length - 1; i++) {
101
+ const label = parts[i].trim();
102
+ if (label) this.#addToken({ label });
103
+ }
104
+ this._draft = parts[parts.length - 1] ?? ``;
105
+ }
106
+ this.updateComplete.then(() => {
107
+ this.shadowRoot?.querySelector(`input.draft`)?.setSelectionRange(this._draft.length, this._draft.length);
108
+ });
109
+ this.#scheduleSuggestionFetch(this._draft);
110
+ };
111
+ this.#onSuggestionPointerDown = (e, item) => {
112
+ e.preventDefault();
113
+ this.#selectSuggestion(item);
114
+ };
115
+ this.#onChipPointerDown = (e, index) => {
116
+ if (e.button !== 0) return;
117
+ e.preventDefault();
118
+ const el = e.currentTarget;
119
+ const startY = e.clientY;
120
+ let dragged = false;
121
+ el.setPointerCapture(e.pointerId);
122
+ const cleanup = () => {
123
+ el.removeEventListener(`pointermove`, onMove);
124
+ el.removeEventListener(`pointerup`, onUp);
125
+ };
126
+ const onMove = (me) => {
127
+ if (Math.abs(me.clientY - startY) > 28) {
128
+ dragged = true;
129
+ el.releasePointerCapture(me.pointerId);
130
+ cleanup();
131
+ this.#removeToken(index);
132
+ this.shadowRoot?.querySelector(`input.draft`)?.focus();
133
+ }
134
+ };
135
+ const onUp = () => {
136
+ cleanup();
137
+ if (!dragged) {
138
+ this._selectedTokenIndex = this._selectedTokenIndex === index ? void 0 : index;
139
+ this.shadowRoot?.querySelector(`input.draft`)?.focus();
140
+ }
141
+ };
142
+ el.addEventListener(`pointermove`, onMove);
143
+ el.addEventListener(`pointerup`, onUp);
144
+ };
145
+ this.#cache = makeLruCache(this.cacheSize);
146
+ }
147
+ get tokens() {
148
+ return this._tokens;
149
+ }
150
+ set tokens(value) {
151
+ this._tokens = [...value];
152
+ this.#emitChange();
153
+ }
154
+ /**
155
+ * Set the token list programmatically. Unlike the `tokens` property setter,
156
+ * this does not dispatch `ac-token-change` — use it for initialisation or any
157
+ * other programmatic update that should not re-enter a parent's own
158
+ * `ac-token-change` handler.
159
+ */
160
+ setTokens(value) {
161
+ this._tokens = [...value];
162
+ }
163
+ /** All committed token labels joined with commas. */
164
+ get value() {
165
+ return this._tokens.map((t) => t.label).join(`, `);
166
+ }
167
+ connectedCallback() {
168
+ super.connectedCallback();
169
+ this.#buildStaticProvider();
170
+ }
171
+ disconnectedCallback() {
172
+ super.disconnectedCallback();
173
+ if (this.#debounceTimer !== void 0) {
174
+ clearTimeout(this.#debounceTimer);
175
+ this.#debounceTimer = void 0;
176
+ }
177
+ }
178
+ updated(changedProps) {
179
+ if (changedProps.has(`completionProvider`) || changedProps.has(`cacheSize`)) this.#cache = makeLruCache(this.cacheSize);
180
+ if (changedProps.has(`completionProvider`)) this.#buildStaticProvider();
181
+ if (this.#data.items !== this.#lastSuggestions) {
182
+ this.#lastSuggestions = this.#data.items;
183
+ if (this.#data.items.length > 0) this._tickled.setTickled(0);
184
+ else this._tickled.clearTickled();
185
+ }
186
+ }
187
+ #buildStaticProvider() {
188
+ const raw = this.getAttribute(`data-tokens`);
189
+ if (!raw || this.completionProvider) {
190
+ this.#staticProvider = void 0;
191
+ return;
192
+ }
193
+ const items = raw.trim().split(/[\s,;]+/).filter(Boolean).map((label) => ({ label }));
194
+ this.#staticProvider = createAcCompletionProvider(items);
195
+ }
196
+ #onWrapperClick;
197
+ #onFocus;
198
+ #onBlur;
199
+ #onInput;
200
+ #onKeyDown;
201
+ #handleNavigationKey(e, input) {
202
+ switch (e.key) {
203
+ case `ArrowLeft`:
204
+ if (input.selectionStart === 0 && input.selectionEnd === 0) {
205
+ e.preventDefault();
206
+ if (this._selectedTokenIndex === void 0) {
207
+ if (this._tokens.length > 0) this._selectedTokenIndex = this._tokens.length - 1;
208
+ } else if (this._selectedTokenIndex > 0) this._selectedTokenIndex--;
209
+ }
210
+ break;
211
+ case `ArrowRight`:
212
+ if (this._selectedTokenIndex !== void 0) {
213
+ e.preventDefault();
214
+ if (this._selectedTokenIndex < this._tokens.length - 1) this._selectedTokenIndex++;
215
+ else this._selectedTokenIndex = void 0;
216
+ }
217
+ break;
218
+ case `Backspace`:
219
+ if (input.selectionStart === 0 && input.selectionEnd === 0) {
220
+ e.preventDefault();
221
+ if (this._selectedTokenIndex !== void 0) this.#removeToken(this._selectedTokenIndex);
222
+ else if (this._tokens.length > 0) this.#removeToken(this._tokens.length - 1);
223
+ }
224
+ break;
225
+ case `Enter`: {
226
+ const tickledIdx = this._tickled.tickledId;
227
+ if (this._isOpen && tickledIdx !== void 0 && this.#data.items[tickledIdx]) {
228
+ e.preventDefault();
229
+ this.#selectSuggestion(this.#data.items[tickledIdx]);
230
+ } else if (!this.strict && this._draft.trim()) {
231
+ e.preventDefault();
232
+ this.#addToken({ label: this._draft.trim() });
233
+ this._draft = ``;
234
+ this.#closePopup();
235
+ }
236
+ break;
237
+ }
238
+ case `ArrowDown`:
239
+ if (!this._isOpen) return;
240
+ e.preventDefault();
241
+ this._tickled.handleKeyboardNavigation(`next`);
242
+ this.#scrollSuggestionIntoView();
243
+ break;
244
+ case `ArrowUp`:
245
+ if (!this._isOpen) return;
246
+ e.preventDefault();
247
+ this._tickled.handleKeyboardNavigation(`previous`);
248
+ this.#scrollSuggestionIntoView();
249
+ break;
250
+ case `Escape`:
251
+ e.preventDefault();
252
+ this.#closePopup();
253
+ this._selectedTokenIndex = void 0;
254
+ }
255
+ }
256
+ #onPaste;
257
+ #onSuggestionPointerDown;
258
+ #onChipPointerDown;
259
+ #startEditingSelectedToken(key) {
260
+ const idx = this._selectedTokenIndex;
261
+ if (idx === void 0) return;
262
+ const token = this._tokens[idx];
263
+ if (!token) return;
264
+ const newDraft = token.label + key;
265
+ this.#removeToken(idx);
266
+ this._selectedTokenIndex = void 0;
267
+ this._draft = newDraft;
268
+ this.updateComplete.then(() => {
269
+ const inp = this.shadowRoot?.querySelector(`input.draft`);
270
+ if (!inp) return;
271
+ inp.setSelectionRange(inp.value.length, inp.value.length);
272
+ });
273
+ this.#scheduleSuggestionFetch(newDraft);
274
+ }
275
+ #addToken(item) {
276
+ const index = this._tokens.length;
277
+ this._tokens = [...this._tokens, item];
278
+ this.dispatchEvent(new CustomEvent(`ac-token-add`, {
279
+ detail: {
280
+ item,
281
+ index
282
+ },
283
+ bubbles: true,
284
+ composed: true
285
+ }));
286
+ this.#emitChange();
287
+ }
288
+ #removeToken(index) {
289
+ const item = this._tokens[index];
290
+ if (!item) return;
291
+ this._tokens = this._tokens.filter((_, i) => i !== index);
292
+ if (this._selectedTokenIndex !== void 0) {
293
+ if (this._selectedTokenIndex === index) this._selectedTokenIndex = void 0;
294
+ else if (this._selectedTokenIndex > index) this._selectedTokenIndex--;
295
+ }
296
+ this.dispatchEvent(new CustomEvent(`ac-token-remove`, {
297
+ detail: {
298
+ item,
299
+ index
300
+ },
301
+ bubbles: true,
302
+ composed: true
303
+ }));
304
+ this.#emitChange();
305
+ }
306
+ #selectSuggestion(item) {
307
+ this.#addToken(item);
308
+ this._draft = ``;
309
+ this.#closePopup();
310
+ }
311
+ #emitChange() {
312
+ this.dispatchEvent(new CustomEvent(`ac-token-change`, {
313
+ detail: { tokens: this._tokens },
314
+ bubbles: true,
315
+ composed: true
316
+ }));
317
+ }
318
+ #filterUsed(items) {
319
+ if (this.allowDuplicates) return items;
320
+ const used = new Set(this._tokens.map((t) => t.label));
321
+ return items.filter((item) => !used.has(item.label));
322
+ }
323
+ #closePopup() {
324
+ this._isOpen = false;
325
+ this._tickled.clearTickled();
326
+ }
327
+ #cancelPending() {
328
+ if (this.#debounceTimer !== void 0) {
329
+ clearTimeout(this.#debounceTimer);
330
+ this.#debounceTimer = void 0;
331
+ }
332
+ this.#data.cancel();
333
+ }
334
+ #scheduleSuggestionFetch(query) {
335
+ const cachedProvider = this.#buildCachedProvider();
336
+ if (!cachedProvider) {
337
+ this._isOpen = false;
338
+ return;
339
+ }
340
+ if (this.#debounceTimer !== void 0) clearTimeout(this.#debounceTimer);
341
+ this._isOpen = true;
342
+ this.#debounceTimer = setTimeout(() => {
343
+ this.#data.provider = cachedProvider;
344
+ this.#data.request(query);
345
+ }, this.debounceMs);
346
+ }
347
+ #buildCachedProvider() {
348
+ const raw = this.completionProvider ?? this.#staticProvider;
349
+ if (!raw) return void 0;
350
+ return (query, signal) => {
351
+ const hit = this.#cache.get(query);
352
+ if (hit !== void 0) return this.#filterUsed(hit);
353
+ const result = raw(query, signal);
354
+ if (Symbol.asyncIterator in new Object(result)) return result;
355
+ if (Array.isArray(result)) {
356
+ this.#cache.set(query, result);
357
+ return this.#filterUsed(result);
358
+ }
359
+ return result.then((items) => {
360
+ if (!signal.aborted) this.#cache.set(query, items);
361
+ return this.#filterUsed(items);
362
+ });
363
+ };
364
+ }
365
+ #scrollSuggestionIntoView() {
366
+ this.updateComplete.then(() => {
367
+ this.shadowRoot?.querySelector(`.item.tickled`)?.scrollIntoView({ block: `nearest` });
368
+ });
369
+ }
370
+ #renderChip(item, index) {
371
+ const isSelected = this._selectedTokenIndex === index;
372
+ return html`
373
+ <span
374
+ class="token-chip ${isSelected ? `selected` : ``}"
375
+ title=${item.subLabel ?? nothing}
376
+ @pointerdown=${(e) => this.#onChipPointerDown(e, index)}
377
+ >
378
+ ${item.icon ? html`<ixfx-icon class="chip-icon" name=${item.icon}></ixfx-icon>` : nothing}
379
+ <span class="chip-label">${item.label}</span>
380
+ </span>
381
+ `;
382
+ }
383
+ #renderSuggestion(item, index) {
384
+ const isTickled = this._tickled.isTickled(index);
385
+ return html`
386
+ <div
387
+ class="item ${isTickled ? `tickled` : ``}"
388
+ role="option"
389
+ id="ac-token-sugg-${index}"
390
+ aria-selected=${isTickled}
391
+ @pointerenter=${() => this._tickled.handlePointerEnter(index)}
392
+ @pointerdown=${(e) => this.#onSuggestionPointerDown(e, item)}
393
+ >
394
+ ${item.icon ? html`<ixfx-icon class="sugg-icon" name=${item.icon}></ixfx-icon>` : nothing}
395
+ <span class="sugg-label">${item.label}</span>
396
+ ${item.subLabel ? html`<span class="sugg-sublabel">${item.subLabel}</span>` : nothing}
397
+ </div>
398
+ `;
399
+ }
400
+ #renderPopup() {
401
+ const showEmpty = !this.#data.loading && this.#data.items.length === 0;
402
+ return html`
403
+ <div
404
+ class="popup"
405
+ role="listbox"
406
+ aria-label="Suggestions"
407
+ data-input-mode=${this._tickled.inputMode}
408
+ @pointerleave=${(e) => this._tickled.handlePointerLeave(e)}
409
+ >
410
+ ${showEmpty ? html`<div class="no-results">No matching results</div>` : this.#data.items.map((item, i) => this.#renderSuggestion(item, i))}
411
+ </div>
412
+ `;
413
+ }
414
+ render() {
415
+ const tickledIdx = this._tickled.tickledId ?? -1;
416
+ const activeDescendant = tickledIdx >= 0 ? `ac-token-sugg-${tickledIdx}` : void 0;
417
+ const showPlaceholder = this._tokens.length === 0 ? this.placeholder || nothing : nothing;
418
+ return html`
419
+ <div class="wrapper" @click=${this.#onWrapperClick}>
420
+ ${this._tokens.map((t, i) => this.#renderChip(t, i))}
421
+ <input
422
+ type="text"
423
+ class="draft"
424
+ .value=${this._draft}
425
+ placeholder=${showPlaceholder}
426
+ autocomplete="off"
427
+ spellcheck="false"
428
+ role="combobox"
429
+ aria-autocomplete="list"
430
+ aria-expanded=${this._isOpen}
431
+ aria-activedescendant=${activeDescendant ?? nothing}
432
+ @input=${this.#onInput}
433
+ @keydown=${this.#onKeyDown}
434
+ @focus=${this.#onFocus}
435
+ @blur=${this.#onBlur}
436
+ @paste=${this.#onPaste}
437
+ >
438
+ ${this.#data.loading ? html`<span class="spinner" aria-hidden="true"></span>` : nothing}
439
+ </div>
440
+ ${this._isOpen ? this.#renderPopup() : nothing}
441
+ `;
442
+ }
443
+ static {
444
+ this.styles = [
445
+ themeFallbacks,
446
+ tickledStyles,
447
+ tickledItemStyles,
448
+ css`
449
+ :host {
450
+ display: block;
451
+ position: relative;
452
+ font-family: var(--font-family, system-ui, sans-serif);
453
+ font-size: var(--text-m, 12px);
454
+ color: var(--surface-2-text);
455
+ }
456
+
457
+ /* ---- Wrapper (looks like a text input) ---- */
458
+
459
+ .wrapper {
460
+ display: flex;
461
+ flex-wrap: wrap;
462
+ align-items: center;
463
+ gap: var(--ac-token-chip-gap, var(--space-xs, 3px));
464
+ padding: var(--ac-token-input-padding, var(--space-xs, 3px) var(--space-m, 8px));
465
+ background: var(--ac-token-input-background, var(--surface-3, var(--surface-2)));
466
+ color: var(--surface-2-text);
467
+ border: var(--ac-token-input-border, var(--border));
468
+ border-radius: var(--ac-token-input-border-radius, var(--radius-m, 4px));
469
+ cursor: text;
470
+ min-height: 32px;
471
+ box-sizing: border-box;
472
+ transition: border-color var(--transition, 0.15s ease-out);
473
+ }
474
+
475
+ .wrapper:focus-within {
476
+ border-color: var(--accent);
477
+ }
478
+
479
+ /* ---- Token chips ---- */
480
+
481
+ .token-chip {
482
+ display: inline-flex;
483
+ align-items: center;
484
+ gap: var(--space-xs, 3px);
485
+ padding: 1px var(--space-m, 8px);
486
+ background: var(--ac-token-chip-background, var(--surface-4));
487
+ border: var(--ac-token-chip-border, var(--border));
488
+ border-radius: var(--ac-token-chip-border-radius, var(--radius-s, 3px));
489
+ user-select: none;
490
+ cursor: default;
491
+ font-size: var(--text-s, 11px);
492
+ white-space: nowrap;
493
+ touch-action: none;
494
+ transition:
495
+ background var(--transition, 0.1s ease-out),
496
+ border-color var(--transition, 0.1s ease-out),
497
+ color var(--transition, 0.1s ease-out);
498
+ }
499
+
500
+ .token-chip.selected {
501
+ background: var(--ac-token-chip-selected-background, var(--accent));
502
+ color: var(--ac-token-chip-selected-color, var(--accent-text, #fff));
503
+ border-color: var(--accent);
504
+ }
505
+
506
+ .chip-icon {
507
+ flex-shrink: 0;
508
+ width: 1em;
509
+ height: 1em;
510
+ }
511
+
512
+ /* ---- Draft input ---- */
513
+
514
+ input.draft {
515
+ flex: 1;
516
+ min-width: 60px;
517
+ border: none;
518
+ background: transparent;
519
+ color: inherit;
520
+ font: inherit;
521
+ outline: none;
522
+ caret-color: var(--accent);
523
+ padding: 1px 0;
524
+ anchor-name: --ac-token-draft;
525
+ }
526
+
527
+ input.draft::placeholder {
528
+ color: var(--surface-muted-text);
529
+ }
530
+
531
+ /* ---- Spinner ---- */
532
+
533
+ .spinner {
534
+ width: 12px;
535
+ height: 12px;
536
+ border: 2px solid var(--surface-5);
537
+ border-top-color: var(--accent);
538
+ border-radius: 50%;
539
+ animation: ac-token-spin 0.7s linear infinite;
540
+ flex-shrink: 0;
541
+ pointer-events: none;
542
+ margin-left: var(--space-xs, 3px);
543
+ }
544
+
545
+ @keyframes ac-token-spin {
546
+ to { transform: rotate(360deg); }
547
+ }
548
+
549
+ /* ---- Popup ---- */
550
+
551
+ .popup {
552
+ position: fixed;
553
+ position-anchor: --ac-token-draft;
554
+ top: anchor(bottom);
555
+ left: anchor(left);
556
+ margin-top: 2px;
557
+ position-try-fallbacks: --ac-token-popup-above;
558
+ z-index: 200;
559
+ background: var(--surface-3, var(--surface-2));
560
+ border: var(--border);
561
+ border-radius: var(--radius-m, 4px);
562
+ box-shadow: var(--shadow-l, 0 4px 24px rgba(0, 0, 0, 0.5));
563
+ padding: var(--space-xs, 3px) 0;
564
+ max-height: 260px;
565
+ min-width: 160px;
566
+ overflow-y: auto;
567
+ font-size: var(--ac-token-popup-font-size, var(--text-s, 11px));
568
+ }
569
+
570
+ @position-try --ac-token-popup-above {
571
+ top: auto;
572
+ bottom: anchor(top);
573
+ left: anchor(left);
574
+ margin-top: 0;
575
+ margin-bottom: 2px;
576
+ }
577
+
578
+ /* ---- Suggestion items ---- */
579
+
580
+ .item {
581
+ /* tickledItemStyles provides base; override layout for popup context */
582
+ display: flex;
583
+ padding: var(--item-padding, var(--space-xs, 3px) var(--space-l, 12px));
584
+ gap: var(--space-m, 8px);
585
+ cursor: pointer;
586
+ margin: 0 var(--space-xs, 3px);
587
+ white-space: nowrap;
588
+ min-height: 28px;
589
+ user-select: none;
590
+ }
591
+
592
+ .sugg-icon {
593
+ flex-shrink: 0;
594
+ width: 1em;
595
+ height: 1em;
596
+ }
597
+
598
+ .sugg-label {
599
+ flex: 1;
600
+ overflow: hidden;
601
+ text-overflow: ellipsis;
602
+ }
603
+
604
+ .sugg-sublabel {
605
+ flex-shrink: 0;
606
+ margin-left: auto;
607
+ color: var(--surface-muted-text);
608
+ font-size: var(--text-s, 11px);
609
+ }
610
+
611
+ /* ---- Empty state ---- */
612
+
613
+ .no-results {
614
+ padding: var(--space-m, 8px) var(--space-l, 12px);
615
+ color: var(--surface-muted-text);
616
+ font-style: italic;
617
+ }
618
+ `
619
+ ];
620
+ }
621
+ };
622
+ __decorate([property({ type: Object })], AcTokenElement.prototype, "completionProvider", void 0);
623
+ __decorate([property({ type: Object })], AcTokenElement.prototype, "tokenizer", void 0);
624
+ __decorate([property({ type: String })], AcTokenElement.prototype, "placeholder", void 0);
625
+ __decorate([property({
626
+ type: Number,
627
+ attribute: `cache-size`
628
+ })], AcTokenElement.prototype, "cacheSize", void 0);
629
+ __decorate([property({
630
+ type: Number,
631
+ attribute: `debounce-ms`
632
+ })], AcTokenElement.prototype, "debounceMs", void 0);
633
+ __decorate([property({ type: Boolean })], AcTokenElement.prototype, "strict", void 0);
634
+ __decorate([property({
635
+ type: Boolean,
636
+ attribute: `allow-duplicates`
637
+ })], AcTokenElement.prototype, "allowDuplicates", void 0);
638
+ __decorate([state()], AcTokenElement.prototype, "_tokens", void 0);
639
+ __decorate([state()], AcTokenElement.prototype, "_draft", void 0);
640
+ __decorate([state()], AcTokenElement.prototype, "_selectedTokenIndex", void 0);
641
+ __decorate([state()], AcTokenElement.prototype, "_isOpen", void 0);
642
+ AcTokenElement = __decorate([safeCustomElement(`ixfx-ac-token`)], AcTokenElement);
643
+ //#endregion
644
+ export { AcTokenElement };
645
+
646
+ //# sourceMappingURL=ac-token.js.map