@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":"data-grid.js","names":["customElement"],"sources":["../src/data-grid/data-grid.ts"],"sourcesContent":["/* eslint-disable ts/no-unsafe-declaration-merging */\nimport type { DragGhost } from '../util/drag-ghost.js';\nimport type { BuiltInFormatterName, BuiltInFormatterOptions, DataGridColumn, DataGridEditability, DataGridEditorFactory, DataGridGetRowKey, DataGridGroupBy, DataGridGroupLabel, DataGridInteractionMode, DataGridSelectionMode, DataGridSortState, GlobalFormatter } from './types.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { TickledController, tickledItemStyles, tickledStyles } from '../interaction/index.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { createDragGhost } from '../util/drag-ghost.js';\nimport '../menu/index.js';\n\n// Events\nexport type DataGridSortDetail = { readonly sort: DataGridSortState; readonly previous: DataGridSortState };\nexport type DataGridSortEvent = CustomEvent<DataGridSortDetail>;\nexport type DataGridSelectDetail = { readonly selectedKeys: ReadonlySet<string>; readonly previous: ReadonlySet<string> };\nexport type DataGridSelectEvent = CustomEvent<DataGridSelectDetail>;\nexport type DataGridColumnReorderDetail = { readonly from: number; readonly to: number; readonly columns: readonly DataGridColumn[] };\nexport type DataGridColumnReorderEvent = CustomEvent<DataGridColumnReorderDetail>;\nexport type DataGridColumnResizeDetail = { readonly key: string; readonly width: number };\nexport type DataGridColumnResizeEvent = CustomEvent<DataGridColumnResizeDetail>;\nexport type DataGridColumnVisibilityDetail = { readonly key: string; readonly visible: boolean };\nexport type DataGridColumnVisibilityEvent = CustomEvent<DataGridColumnVisibilityDetail>;\nexport type DataGridCellClickDetail = { readonly rowKey: string; readonly colKey: string; readonly rowIndex: number; readonly colIndex: number };\nexport type DataGridCellClickEvent = CustomEvent<DataGridCellClickDetail>;\nexport type DataGridCellEditDetail = { readonly rowKey: string; readonly colKey: string; readonly oldValue: unknown; readonly newValue: unknown };\nexport type DataGridCellEditEvent = CustomEvent<DataGridCellEditDetail>;\n\nexport type DataGridGroupChangeDetail = { readonly groupBy: DataGridGroupBy<unknown> | null };\nexport type DataGridGroupChangeEvent = CustomEvent<DataGridGroupChangeDetail>;\nexport interface DataGridElementEventMap {\n 'datagrid-sort': DataGridSortEvent;\n 'datagrid-select': DataGridSelectEvent;\n 'datagrid-column-reorder': DataGridColumnReorderEvent;\n 'datagrid-column-resize': DataGridColumnResizeEvent;\n 'datagrid-column-visibility': DataGridColumnVisibilityEvent;\n 'datagrid-cell-click': DataGridCellClickEvent;\n 'datagrid-cell-edit': DataGridCellEditEvent;\n 'datagrid-group-change': DataGridGroupChangeEvent;\n}\n\n@customElement(`ixfx-data-grid`)\nexport class DataGridElement extends LitElement {\n static override styles = [themeFallbacks, tickledStyles, tickledItemStyles, css`\n :host {\n --data-grid-row-height: 28px;\n --data-grid-header-height: 32px;\n --data-grid-bg: var(--surface-3);\n --data-grid-header-bg: var(--surface-2);\n --data-grid-border: var(--border);\n --data-grid-header-text: var(--surface-3-text);\n display: block;\n overflow: hidden;\n border: var(--data-grid-border);\n border-radius: var(--radius-m);\n background: var(--data-grid-bg);\n color: var(--surface-3-text);\n font-family: var(--font-family);\n font-size: var(--text-m);\n }\n :host(:focus-visible) { outline: 2px solid var(--accent); outline-offset: 2px; }\n .grid { display: flex; flex-direction: column; height: 100%; min-height: 200px; position: relative; }\n .header-bar {\n display: flex; align-items: stretch; height: var(--data-grid-header-height);\n background: var(--data-grid-header-bg); border-bottom: var(--data-grid-border);\n overflow: visible; flex-shrink: 0; position: relative;\n }\n .header-scroll {\n display: flex; flex: 1; overflow: hidden;\n }\n .header-cell {\n display: flex; align-items: center; gap: var(--space-xs);\n padding: 0 var(--space-s); border-right: var(--border-subtle);\n flex-shrink: 0; user-select: none; cursor: pointer; position: relative;\n background: var(--data-grid-header-bg);\n box-sizing: border-box;\n }\n .header-cell[data-tickled] { background: var(--surface-5); }\n .header-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .sort-icon { font-size: 10px; opacity: 0.7; }\n .resize-handle { position: absolute; right: 0; top: 0; bottom: 0; width: 8px; cursor: col-resize; z-index: 1; }\n .reorder-handle { cursor: grab; opacity: 0.5; padding: 0 2px; }\n .flyout-trigger { flex-shrink: 0; width: 36px; display: flex; align-items: center; justify-content: center; cursor: pointer; border-left: var(--border-subtle); background: var(--data-grid-header-bg); }\n .viewport { flex: 1; overflow: auto; position: relative; }\n .spacer { position: relative; }\n .row.item {\n position: absolute; left: 0; right: 0; display: flex; align-items: stretch;\n gap: 0;\n height: var(--data-grid-row-height);\n border: none;\n box-shadow: inset 0 0 0 1px var(--item-border-color, transparent);\n background: var(--item-bg);\n border-radius: var(--item-border-radius);\n padding: 0;\n box-sizing: border-box;\n }\n .row.item.tickled { background: var(--item-bg-tickled); border: var(--item-border-tickled); color: var(--item-text-tickled); }\n .row.item.selected { background: var(--item-bg-selected); border: var(--item-border-selected); color: var(--item-text-selected); }\n .row.item.selected.tickled { background: var(--item-bg-selected-tickled); }\n .cell {\n flex-shrink: 0; display: flex; align-items: center; padding: 0 var(--space-s);\n overflow: hidden; text-overflow: ellipsis; white-space: nowrap; border-right: var(--border-subtle);\n box-sizing: border-box;\n font-variant-numeric: tabular-nums;\n }\n .cell.editable-text { cursor: text; }\n .cell input, .cell select { width: 100%; font: inherit; }\n .checkbox-col { width: 28px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }\n ixfx-menu-trigger { flex-shrink: 0; border-left: var(--border-subtle); background: var(--data-grid-header-bg); display: flex; align-items: center; --ixfx-button-padding: var(--space-s) var(--space-m); min-width: 44px; min-height: var(--data-grid-header-height); justify-content: center; }\n .header-cell[drag-source] { opacity: 0.4; }\n .drop-caret {\n position: absolute; top: 0; bottom: 0; width: 2px;\n background: var(--accent); border-radius: 1px; pointer-events: none; z-index: 2;\n }\n .group-row {\n position: absolute; left: 0; right: 0; display: flex; align-items: center; gap: var(--space-s);\n height: var(--data-grid-row-height); background: transparent; color: var(--surface-3-text);\n border-bottom: 1px solid var(--border); font-weight: 600; padding: 0 var(--space-s);\n cursor: pointer; user-select: none;\n }\n .group-row .caret { transition: transform 0.15s; display: inline-flex; }\n .group-row.collapsed .caret { transform: rotate(-90deg); }\n .group-row .divider { flex: 1; height: 1px; background: var(--border); margin-left: var(--space-s); }\n .group-row .count { opacity: 0.6; font-weight: 400; font-size: 0.9em; }\n\n `];\n\n @property({ type: Array }) columns: DataGridColumn[] = [];\n @property({ type: Array }) rows: unknown[] = [];\n @property({ type: String, attribute: `selection-mode` }) selectionMode: DataGridSelectionMode = `single`;\n @property({ type: String, attribute: `interaction-mode` }) interactionMode: DataGridInteractionMode = `standard`;\n @property({ attribute: false }) sortState: DataGridSortState = null;\n @property({ type: Number, attribute: `row-height` }) rowHeight = 28;\n @property({ attribute: false }) getRowKey: DataGridGetRowKey<unknown> = (r: unknown, i: number) => (r as Record<string, unknown>).key as string ?? (r as Record<string, unknown>).id as string ?? String(i);\n @property({ attribute: false }) checkboxRenderer?: (checked: boolean) => unknown;\n @property({ attribute: false }) editable: boolean | ((row: unknown, col: DataGridColumn) => boolean) = false;\n @property({ type: String, reflect: true }) editability: DataGridEditability = `user`;\n\n @property({ attribute: false }) groupBy: DataGridGroupBy<unknown> | null = null;\n @property({ type: Boolean, attribute: `allow-grouping` }) allowGrouping = false;\n @property({ attribute: false }) groupLabel: DataGridGroupLabel | undefined;\n /** Columns keys that can be grouped by; undefined = all groupable columns */\n @property({ attribute: false }) groupableColumns: string[] | undefined;\n @property({ type: Boolean, attribute: `cross-group-selection`, reflect: true }) crossGroupSelection = false;\n @property({ attribute: false }) globalFormatter?: GlobalFormatter;\n private _columnFormatters = new Map<string, (value: unknown) => unknown>();\n\n @state() private _selectedKeys = new Set<string>();\n @state() private _scrollTop = 0;\n @state() private _scrollLeft = 0;\n @state() private _viewportH = 300;\n @state() private _viewportW = 600;\n @state() private _collapsedGroups = new Set<string>();\n @state() private _editing: { rowKey: string; colKey: string } | null = null;\n @state() private _editingRow: string | null = null;\n @state() private _lastClick: { key: string; col: string; time: number } | null = null;\n @state() private _lastClickedCell: { rowKey: string; colKey: string } | null = null;\n @state() private _editValue: unknown = ``;\n\n @query(`.viewport`) private _viewportEl!: HTMLElement;\n @query(`.header-scroll`) private _headerScrollEl!: HTMLElement;\n\n private _tickled = new TickledController<string>(this, {\n getItems: () => this._flatKeys.map(k => ({ id: k, enabled: true })),\n onStateChange: () => this.requestUpdate(),\n });\n\n private _sortedRows: unknown[] = [];\n private _flat: Array<{ type: `group`; key: string; label: string; count: number } | { type: `row`; key: string; row: unknown; idx: number }> = [];\n private _flatKeys: string[] = [];\n private _visibleColumns: DataGridColumn[] = [];\n private _colOffsets: number[] = [];\n private _colWidthSum = 0;\n private _raf = 0;\n private _drag: { pointerId: number; from: number; startX: number; startY: number; active: boolean; ghost: DragGhost | null; gap: number | undefined; sourceCol: DataGridColumn } | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute(`tabindex`))\n this.tabIndex = 0;\n this.addEventListener(`keydown`, this._onKeyDown as EventListener);\n this.addEventListener(`focusout`, this._onFocusOut as EventListener);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`keydown`, this._onKeyDown as EventListener);\n this.removeEventListener(`focusout`, this._onFocusOut as EventListener);\n cancelAnimationFrame(this._raf);\n }\n\n private _onFocusOut = (e: FocusEvent): void => {\n if (this._suppressBlurCommit)\n return;\n if (this.editability === `immediate`)\n return;\n if (!this._editing && !this._editingRow)\n return;\n const next = e.relatedTarget as Node | null;\n if (next && this.contains(next))\n return;\n // focus moved outside component → revert editors\n this._editing = null;\n this._editingRow = null;\n this.requestUpdate();\n };\n\n protected override firstUpdated(): void {\n const ro = new ResizeObserver(() => {\n if (!this._viewportEl)\n return;\n this._viewportH = this._viewportEl.clientHeight;\n this._viewportW = this._viewportEl.clientWidth;\n this.requestUpdate();\n });\n ro.observe(this._viewportEl);\n this._viewportH = this._viewportEl.clientHeight;\n this._viewportW = this._viewportEl.clientWidth;\n }\n\n protected override updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has(`_editing`) || changed.has(`_editingRow`)) {\n requestAnimationFrame(() => {\n let sel: string | null = null;\n if (this._editing)\n sel = `.row[data-key=\"${this._editing.rowKey}\"] .cell[data-col=\"${this._editing.colKey}\"] input, .row[data-key=\"${this._editing.rowKey}\"] .cell[data-col=\"${this._editing.colKey}\"] select`;\n else if (this._editingRow)\n sel = `.row[data-key=\"${this._editingRow}\"] .cell input, .row[data-key=\"${this._editingRow}\"] .cell select`;\n if (!sel)\n return;\n const el = this.renderRoot.querySelector(sel) as HTMLElement | null;\n el?.focus();\n if (el instanceof HTMLInputElement && el.type === `text`)\n el.select();\n });\n }\n }\n\n protected override willUpdate(changed: Map<string, unknown>): void {\n super.willUpdate(changed);\n this.setAttribute(`data-input-mode`, this._tickled.inputMode);\n if (changed.has(`rows`) || changed.has(`sortState`) || changed.has(`columns`) || changed.has(`groupBy`) || changed.has(`groupLabel`)) {\n this._sortedRows = this._applySort([...this.rows]);\n }\n this._rebuildFlat();\n this._visibleColumns = this.columns.filter(c => c.visible !== false);\n let off = 0;\n this._colOffsets = this._visibleColumns.map((c) => {\n const o = off;\n off += c.width ?? 150;\n return o;\n });\n this._colWidthSum = off;\n if (this.interactionMode === `checked`)\n this._colWidthSum += 28;\n }\n\n private _getGroupKey(row: unknown): string | null {\n if (!this.groupBy)\n return null;\n if (typeof this.groupBy === `string`)\n return String((row as Record<string, unknown>)[this.groupBy] ?? ``);\n return String((this.groupBy as (r: unknown) => string)(row));\n }\n\n private _rebuildFlat(): void {\n if (!this.groupBy) {\n this._flat = this._sortedRows.map((r, i) => ({ type: `row` as const, key: this.getRowKey(r, i), row: r, idx: i }));\n this._flatKeys = this._flat.map(f => f.key);\n return;\n }\n const groups = new Map<string, unknown[]>();\n for (const r of this._sortedRows) {\n const k = this._getGroupKey(r) ?? ``;\n const arr = groups.get(k);\n if (arr)\n arr.push(r); else groups.set(k, [r]);\n }\n const flat: typeof this._flat = [];\n const keys: string[] = [];\n for (const [gKey, rows] of groups) {\n const label = this.groupLabel ? this.groupLabel(gKey, rows) : gKey;\n const gId = `__group__${gKey}`;\n flat.push({ type: `group`, key: gId, label, count: rows.length });\n keys.push(gId);\n if (this._collapsedGroups.has(gKey))\n continue;\n for (const r of rows) {\n const idx = this._sortedRows.indexOf(r);\n const rk = this.getRowKey(r, idx);\n flat.push({ type: `row`, key: rk, row: r, idx });\n keys.push(rk);\n }\n }\n this._flat = flat;\n this._flatKeys = keys;\n }\n\n private _toggleGroup(gKey: string): void {\n const next = new Set(this._collapsedGroups);\n if (next.has(gKey))\n next.delete(gKey); else next.add(gKey);\n this._collapsedGroups = next;\n }\n\n private _applySort(rows: unknown[]): unknown[] {\n if (!this.sortState)\n return rows;\n const col = this.columns.find(c => c.key === this.sortState!.key);\n if (!col)\n return rows;\n const dir = this.sortState.direction === `asc` ? 1 : -1;\n if (col.sortFn)\n return rows.sort((a, b) => dir * col.sortFn!(a as never, b as never));\n return rows.sort((a, b) => {\n const av = (a as Record<string, unknown>)[col.key];\n const bv = (b as Record<string, unknown>)[col.key];\n if (av === bv)\n return 0;\n if (typeof av === `number` && typeof bv === `number`)\n return dir * (av - bv);\n return dir * String(av).localeCompare(String(bv));\n });\n }\n\n private _onScroll = (e: Event): void => {\n const el = e.target as HTMLElement;\n cancelAnimationFrame(this._raf);\n this._raf = requestAnimationFrame(() => {\n this._scrollTop = el.scrollTop;\n this._scrollLeft = el.scrollLeft;\n if (this._headerScrollEl)\n this._headerScrollEl.scrollLeft = el.scrollLeft;\n this.requestUpdate();\n });\n };\n\n private _onHeaderClick(col: DataGridColumn): void {\n if (col.sortable === false)\n return;\n const prev = this.sortState;\n let next: DataGridSortState = null;\n if (!prev || prev.key !== col.key)\n next = { key: col.key, direction: `asc` };\n else if (prev.direction === `asc`)\n next = { key: col.key, direction: `desc` };\n else next = null;\n this.sortState = next;\n this.dispatchEvent(new CustomEvent<DataGridSortDetail>(`datagrid-sort`, { detail: { sort: next, previous: prev }, bubbles: true, composed: true }));\n }\n\n private _onRowClick(rowKey: string, col: DataGridColumn | null, e: MouseEvent): void {\n if (col && col.selectable === false)\n return;\n if (this.selectionMode === `none` && this.interactionMode !== `checked` && this.interactionMode !== `sticky`)\n return;\n if (this.interactionMode === `manual`)\n return;\n if (this.interactionMode === `implicit`) {\n this._replaceSelection(rowKey); return;\n }\n if (this.interactionMode === `checked`)\n return;\n if (this.interactionMode === `sticky`) {\n this._toggleSelection(rowKey); return;\n }\n // standard / vscode\n if (e.ctrlKey || e.metaKey) {\n if (this.selectionMode === `multiple` || this.interactionMode === `vscode`)\n this._toggleSelection(rowKey);\n } else if (e.shiftKey && (this.selectionMode === `multiple` || this.interactionMode === `vscode`)) {\n this._rangeSelectTo(rowKey);\n } else {\n this._replaceSelection(rowKey);\n }\n }\n\n private _onCheckboxClick(rowKey: string, e: MouseEvent): void {\n e.stopPropagation();\n this._onRowClick(rowKey, null, e);\n }\n\n private _onVisibilityToggle(col: DataGridColumn, checked: boolean): void {\n col.visible = checked;\n this.columns = [...this.columns];\n this.dispatchEvent(new CustomEvent<DataGridColumnVisibilityDetail>(`datagrid-column-visibility`, { detail: { key: col.key, visible: checked }, bubbles: true, composed: true }));\n }\n\n private _beginHeaderDrag(e: PointerEvent, col: DataGridColumn, idx: number): void {\n e.stopPropagation();\n const anchor = (e.currentTarget as HTMLElement).closest(`.header-cell`) as HTMLElement ?? e.currentTarget as HTMLElement;\n this._drag = { pointerId: e.pointerId, from: idx, startX: e.clientX, startY: e.clientY, active: false, ghost: null, gap: undefined, sourceCol: col };\n const onMove = (ev: PointerEvent): void => {\n if (!this._drag || ev.pointerId !== this._drag.pointerId)\n return;\n const dx = ev.clientX - this._drag.startX;\n const dy = ev.clientY - this._drag.startY;\n if (!this._drag.active) {\n if (Math.hypot(dx, dy) < 5)\n return;\n this._drag.active = true;\n const content = document.createElement(`span`);\n content.textContent = col.label;\n try {\n this._drag.ghost = createDragGhost({ anchor, content });\n this._drag.ghost.move(ev.clientX, ev.clientY);\n } catch { /* ignore */ }\n try {\n this._headerScrollEl?.setPointerCapture(ev.pointerId);\n } catch { /* ignore */ }\n }\n this._drag.ghost?.move(ev.clientX, ev.clientY);\n const x = ev.clientX - (this._headerScrollEl?.getBoundingClientRect().left ?? 0) + (this._headerScrollEl?.scrollLeft ?? 0);\n let gap = this._drag.from;\n let bestDist = Infinity;\n for (let i = 0; i < this._visibleColumns.length; i++) {\n if (i === this._drag.from)\n continue;\n const rectLeft = this._colOffsets[i];\n const rectRight = rectLeft + (this._visibleColumns[i].width ?? 150);\n const mid = (rectLeft + rectRight) / 2;\n // gap before i\n const gapPos = x < mid ? rectLeft : rectRight;\n const gapIdx = x < mid ? i : i + 1;\n const d = Math.abs(x - gapPos);\n if (d < bestDist) {\n bestDist = d; gap = gapIdx > this._drag.from ? gapIdx - 1 : gapIdx;\n }\n }\n // handle gap after last\n if (this._visibleColumns.length > 0) {\n const lastOff = this._colOffsets[this._colOffsets.length - 1] + (this._visibleColumns[this._visibleColumns.length - 1].width ?? 150);\n const d = Math.abs(x - lastOff);\n if (d < bestDist) {\n bestDist = d; gap = this._visibleColumns.length - 1; if (this._drag.from === this._visibleColumns.length - 1)\n gap = this._drag.from; else if (gap >= this._drag.from)\n gap = this._visibleColumns.length - 1;\n }\n }\n // normalized gap for reorder (visible index without source)\n const siblings = this._visibleColumns.length - 1;\n let normalizedGap = gap;\n if (normalizedGap < 0)\n normalizedGap = 0;\n if (normalizedGap > siblings)\n normalizedGap = siblings;\n this._drag.gap = normalizedGap;\n this.requestUpdate();\n };\n const onUp = (ev: PointerEvent): void => {\n if (!this._drag || ev.pointerId !== this._drag.pointerId)\n return;\n const active = this._drag.active;\n const from = this._drag.from;\n const gap = this._drag.gap;\n this._drag.ghost?.destroy();\n try {\n this._headerScrollEl?.releasePointerCapture(ev.pointerId);\n } catch { /* ignore */ }\n window.removeEventListener(`pointermove`, onMove);\n window.removeEventListener(`pointerup`, onUp);\n window.removeEventListener(`pointercancel`, onUp);\n this._drag = null;\n this.requestUpdate();\n if (active && gap !== undefined && gap !== from) {\n // convert visible gap to actual reorder (filter hidden)\n this._onReorderDrag(from, gap);\n }\n };\n window.addEventListener(`pointermove`, onMove);\n window.addEventListener(`pointerup`, onUp);\n window.addEventListener(`pointercancel`, onUp as EventListener);\n }\n\n private _onReorderDrag(fromIdx: number, toIdx: number): void {\n if (fromIdx === toIdx)\n return;\n const cols = [...this.columns];\n const vis = cols.filter(c => c.visible !== false);\n const hidden = cols.filter(c => c.visible === false);\n const [moved] = vis.splice(fromIdx, 1);\n vis.splice(toIdx, 0, moved);\n this.columns = [...vis, ...hidden];\n this.dispatchEvent(new CustomEvent<DataGridColumnReorderDetail>(`datagrid-column-reorder`, { detail: { from: fromIdx, to: toIdx, columns: [...this.columns] }, bubbles: true, composed: true }));\n }\n\n private _anchorKey: string | undefined;\n\n private _scrollRowIntoView(key: string): void {\n const idx = this._flat.findIndex(f => f.key === key);\n if (idx < 0 || !this._viewportEl)\n return;\n const top = idx * this.rowHeight;\n const bottom = top + this.rowHeight;\n const vt = this._viewportEl.scrollTop;\n const vb = vt + this._viewportEl.clientHeight;\n if (top < vt)\n this._viewportEl.scrollTop = top;\n else if (bottom > vb)\n this._viewportEl.scrollTop = bottom - this._viewportEl.clientHeight;\n }\n\n private _getRowForKey(key: string): unknown | undefined {\n const entry = this._flat.find(f => f.key === key) as { row?: unknown } | undefined;\n return (entry as { row?: unknown })?.row;\n }\n\n private _replaceSelection(key: string): void {\n if (this.selectionMode === `none`)\n return;\n const prev = new Set(this._selectedKeys);\n if (this.groupBy && !this.crossGroupSelection) {\n const g = this._getGroupKey(this._getRowForKey(key) ?? { key });\n const keep = [...prev].filter(k => this._getGroupKey(this._getRowForKey(k) ?? { key: k }) === g);\n // cross-group off → keep only same-group, then replace\n this._selectedKeys = new Set([key]);\n void keep;\n } else {\n this._selectedKeys = new Set([key]);\n }\n this._anchorKey = key;\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n }\n\n private _toggleSelection(key: string): void {\n const prev = new Set(this._selectedKeys);\n const next = new Set(this._selectedKeys);\n if (next.has(key)) {\n next.delete(key);\n } else {\n if (this.groupBy && !this.crossGroupSelection) {\n const g = this._getGroupKey(this._getRowForKey(key) ?? { key });\n for (const k of [...next]) {\n if (this._getGroupKey(this._getRowForKey(k) ?? { key: k }) !== g)\n next.delete(k);\n }\n }\n if (this.selectionMode !== `multiple` && this.interactionMode !== `checked` && this.interactionMode !== `sticky`)\n next.clear();\n next.add(key);\n }\n this._selectedKeys = next;\n this._anchorKey = key;\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n }\n\n private _rangeSelectTo(key: string): void {\n if (!this._anchorKey) {\n this._replaceSelection(key); return;\n }\n const keys = this._flat.filter(f => f.type === `row`).map(f => f.key);\n const a = keys.indexOf(this._anchorKey);\n const b = keys.indexOf(key);\n if (a < 0 || b < 0) {\n this._replaceSelection(key); return;\n }\n if (this.groupBy && !this.crossGroupSelection) {\n const anchorGroup = this._getGroupKey(this._getRowForKey(this._anchorKey) ?? { key: this._anchorKey });\n const targetGroup = this._getGroupKey(this._getRowForKey(key) ?? { key });\n if (anchorGroup !== targetGroup) {\n this._replaceSelection(key); return;\n }\n // restrict range to rows of that group\n const groupKeys = keys.filter(k => this._getGroupKey(this._getRowForKey(k) ?? { key: k }) === anchorGroup);\n const ga = groupKeys.indexOf(this._anchorKey);\n const gb = groupKeys.indexOf(key);\n if (ga < 0 || gb < 0) {\n this._replaceSelection(key); return;\n }\n const lo = Math.min(ga, gb); const hi = Math.max(ga, gb);\n const prev = new Set(this._selectedKeys);\n this._selectedKeys = new Set(groupKeys.slice(lo, hi + 1));\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n return;\n }\n const lo = Math.min(a, b); const hi = Math.max(a, b);\n const prev = new Set(this._selectedKeys);\n this._selectedKeys = new Set(keys.slice(lo, hi + 1));\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n }\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === `a`) {\n if (this.selectionMode === `multiple` || this.interactionMode === `checked` || this.interactionMode === `sticky` || this.interactionMode === `vscode` || this.interactionMode === `standard`) {\n e.preventDefault();\n const prev = new Set(this._selectedKeys);\n if (this.groupBy && !this.crossGroupSelection && this._anchorKey) {\n const g = this._getGroupKey(this._getRowForKey(this._anchorKey) ?? { key: this._anchorKey });\n this._selectedKeys = new Set(this._flat.filter(f => f.type === `row` && this._getGroupKey((f as { row: unknown }).row) === g).map(f => f.key));\n } else {\n this._selectedKeys = new Set(this._flat.filter(f => f.type === `row`).map(f => f.key));\n }\n this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(this._selectedKeys), previous: prev }, bubbles: true, composed: true }));\n }\n return;\n }\n // If editing, Up/Down commits and moves to same column in adjacent row\n if (this._editing && (e.key === `ArrowDown` || e.key === `ArrowUp`)) {\n const active = this.shadowRoot?.activeElement as HTMLElement | null;\n if (active?.tagName === `SELECT`)\n return; // let native select handle\n e.preventDefault();\n const cur = this._editing;\n const dir = e.key === `ArrowDown` ? 1 : -1;\n const colKey = cur.colKey;\n this._suppressBlurCommit = true;\n this._commitEdit();\n const rowKeys = this._flat.filter(f => f.type === `row`).map(f => f.key);\n const idx = rowKeys.indexOf(cur.rowKey);\n let nextIdx = idx + dir;\n while (nextIdx >= 0 && nextIdx < rowKeys.length) {\n const nk = rowKeys[nextIdx];\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === nk);\n const col = this._visibleColumns.find(c => c.key === colKey);\n if (row && col && this._isEditable(row, col)) {\n this._startEdit(nk, colKey);\n this._tickled.handleKeyboardNavigation(nextIdx > idx ? `next` : `previous`);\n this._scrollRowIntoView(nk);\n break;\n }\n nextIdx += dir;\n }\n if (nextIdx < 0 || nextIdx >= rowKeys.length) {\n // no editable target, stay on current row tickled\n this._tickled.handleKeyboardNavigation(dir > 0 ? `next` : `previous`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n }\n requestAnimationFrame(() => {\n this._suppressBlurCommit = false;\n });\n return;\n }\n if (e.key === `ArrowDown` || e.key === `ArrowUp` || e.key === `Home` || e.key === `End`) {\n e.preventDefault();\n this._tickled.setInputMode(`keyboard`);\n }\n switch (e.key) {\n case `ArrowDown`: {\n this._tickled.handleKeyboardNavigation(`next`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n if (this.interactionMode === `implicit` && this._tickled.tickledId)\n this._replaceSelection(this._tickled.tickledId);\n if (e.shiftKey && (this.interactionMode === `standard` || this.interactionMode === `vscode`) && this._tickled.tickledId)\n this._rangeSelectTo(this._tickled.tickledId);\n break;\n }\n case `ArrowUp`: {\n this._tickled.handleKeyboardNavigation(`previous`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n if (this.interactionMode === `implicit` && this._tickled.tickledId)\n this._replaceSelection(this._tickled.tickledId);\n if (e.shiftKey && (this.interactionMode === `standard` || this.interactionMode === `vscode`) && this._tickled.tickledId)\n this._rangeSelectTo(this._tickled.tickledId);\n break;\n }\n case `Home`: {\n this._tickled.handleKeyboardNavigation(`first`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n break;\n }\n case `End`: {\n this._tickled.handleKeyboardNavigation(`last`);\n if (this._tickled.tickledId)\n this._scrollRowIntoView(this._tickled.tickledId);\n break;\n }\n case `Enter`: {\n const key = this._tickled.tickledId;\n if (!key)\n break;\n e.preventDefault();\n if (!this._editing && this.editability === `user`) {\n const idx = this._sortedRows.findIndex((r, i) => this.getRowKey(r, i) === key);\n if (idx >= 0) {\n const row = this._sortedRows[idx];\n // prefer lastClickedCell if it is in this row and editable\n if (this._lastClickedCell?.rowKey === key) {\n const col = this._visibleColumns.find(c => c.key === this._lastClickedCell!.colKey);\n if (col && this._isEditable(row, col)) {\n this._startEdit(key, col.key); break;\n }\n }\n const firstEditable = this._visibleColumns.find(c => this._isEditable(row, c));\n if (firstEditable) {\n this._startEdit(key, firstEditable.key); break;\n }\n }\n }\n if (!this._editing) {\n const idx = this._sortedRows.findIndex((r, i) => this.getRowKey(r, i) === key);\n if (this.interactionMode !== `manual` && this.interactionMode !== `checked`)\n this._replaceSelection(key);\n this.dispatchEvent(new CustomEvent<DataGridCellClickDetail>(`datagrid-cell-click`, { detail: { rowKey: key, colKey: ``, rowIndex: idx, colIndex: -1 }, bubbles: true, composed: true }));\n }\n break;\n }\n case ` `: {\n if (this._editing) {\n const col = this.columns.find(c => c.key === this._editing!.colKey);\n if (col?.editor === `boolean`) {\n e.preventDefault();\n const isImmediate = this.editability === `immediate`;\n const rowKey = this._editing.rowKey;\n const colKey = this._editing.colKey;\n // Toggle: use checkbox checked if focused, else flip _editValue / row value\n const active = this.shadowRoot?.activeElement as HTMLInputElement | null;\n let next: boolean;\n if (active?.type === `checkbox`) {\n next = !active.checked;\n active.checked = next;\n } else {\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey) as Record<string, unknown> | undefined;\n const cur = this._editValue !== `` ? Boolean(this._editValue) : Boolean(row?.[colKey]);\n next = !cur;\n }\n if (isImmediate) {\n this._commitImmediate(rowKey, colKey, next);\n } else {\n this._editValue = next; this._commitEdit();\n }\n }\n break;\n }\n const key = this._tickled.tickledId;\n if (!key)\n break;\n e.preventDefault();\n if (this.interactionMode === `checked` || this.interactionMode === `sticky` || this.interactionMode === `standard` || this.interactionMode === `vscode` || this.interactionMode === `manual`)\n this._toggleSelection(key);\n else this._replaceSelection(key);\n break;\n }\n case `Escape`: {\n if (this._editing || this._editingRow) {\n e.preventDefault(); this._editing = null; this._editingRow = null; this.requestUpdate();\n } else if (this._selectedKeys.size) {\n e.preventDefault(); const prev = new Set(this._selectedKeys); this._selectedKeys = new Set(); this.dispatchEvent(new CustomEvent<DataGridSelectDetail>(`datagrid-select`, { detail: { selectedKeys: new Set(), previous: prev }, bubbles: true, composed: true }));\n }\n break;\n }\n }\n };\n\n private _isEditable(row: unknown, col: DataGridColumn): boolean {\n if (this.editability === `disabled`)\n return false;\n if (typeof this.editable === `function`)\n return (this.editable as (r: unknown, c: DataGridColumn) => boolean)(row, col);\n if (this.editable === true)\n return col.editable !== false;\n return !!col.editable;\n }\n\n private _isTextEditor(col: DataGridColumn): boolean {\n const e = col.editor;\n return !e || e === `text` || e === `number`;\n }\n\n private _isCellEditing(rowKey: string, colKey: string): boolean {\n if (this.editability === `immediate` && this._isEditable(this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey) ?? {}, this.columns.find(c => c.key === colKey)!))\n return true;\n if (this._editingRow === rowKey)\n return this._isEditable(this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey) ?? {}, this.columns.find(c => c.key === colKey)!);\n return this._editing?.rowKey === rowKey && this._editing?.colKey === colKey;\n }\n\n private _startEdit(rowKey: string, colKey: string): void {\n if (this.editability === `disabled`)\n return;\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey);\n if (!row)\n return;\n const col = this.columns.find(c => c.key === colKey);\n if (!col || !this._isEditable(row, col))\n return;\n this._editing = { rowKey, colKey };\n this._editingRow = null;\n this._editValue = (row as Record<string, unknown>)[colKey];\n }\n\n /** Programmatic: put a single cell in edit mode. Works in manual/user/immediate (no-op if disabled or not editable). */\n startEdit(rowKey: string, colKey: string): void {\n this._startEdit(rowKey, colKey);\n }\n\n /** Programmatic: put all editable cells of a row in edit mode. */\n startRowEdit(rowKey: string): void {\n if (this.editability === `disabled`)\n return;\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey);\n if (!row)\n return;\n this._editing = null;\n this._editingRow = rowKey;\n this.requestUpdate();\n }\n\n stopEdit(): void {\n this._editing = null; this._editingRow = null;\n }\n\n setColumnFormatter(columnKey: string, formatter: ((value: unknown) => unknown) | BuiltInFormatterName | null, options?: BuiltInFormatterOptions): void {\n if (!formatter) {\n this._columnFormatters.delete(columnKey); this.requestUpdate(); return;\n }\n if (typeof formatter === `string`) {\n const digits = options?.digits ?? (formatter === `integer` ? 0 : 2);\n if (formatter === `fixed`)\n this._columnFormatters.set(columnKey, v => typeof v === `number` && Number.isFinite(v) ? v.toFixed(digits) : String(v ?? ``));\n else if (formatter === `percentage`)\n this._columnFormatters.set(columnKey, v => typeof v === `number` && Number.isFinite(v) ? `${v.toFixed(digits)}%` : String(v ?? ``));\n else if (formatter === `integer`)\n this._columnFormatters.set(columnKey, v => typeof v === `number` && Number.isFinite(v) ? Math.round(v).toString() : String(v ?? ``));\n } else {\n this._columnFormatters.set(columnKey, formatter as (value: unknown) => unknown);\n }\n this.requestUpdate();\n }\n\n private _formatValue(value: unknown, col: DataGridColumn, row: unknown): unknown {\n const perCol = this._columnFormatters.get(col.key);\n if (perCol)\n return perCol(value);\n if (col.formatter)\n return col.formatter(value, row, col);\n if (this.globalFormatter)\n return this.globalFormatter(value, col.key, row);\n return value;\n }\n\n private _handleCellSecondClick(rowKey: string, col: DataGridColumn): void {\n if (this.editability !== `user`)\n return;\n const now = Date.now();\n if (this._lastClick && this._lastClick.key === rowKey && this._lastClick.col === col.key && now - this._lastClick.time < 700 && now - this._lastClick.time > 150) {\n this._startEdit(rowKey, col.key);\n this._lastClick = null;\n } else {\n this._lastClick = { key: rowKey, col: col.key, time: now };\n }\n }\n\n private _commitEdit(fromImmediate = false): void {\n // immediate/row-edit: commit uses current _editValue or val; keep simple single-cell path\n if (!this._editing && !fromImmediate)\n return;\n const target = this._editing;\n if (!target)\n return;\n const { rowKey, colKey } = target;\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey) as Record<string, unknown> | undefined;\n if (!row) {\n this._editing = null; return;\n }\n const oldValue = row[colKey];\n const newValue = this._editValue;\n const col = this.columns.find(c => c.key === colKey);\n if (col?.editor && typeof col.editor === `function`) {\n // custom factory handles commit itself\n } else {\n row[colKey] = newValue as never;\n this.rows = [...this.rows];\n }\n this._editing = null;\n this.dispatchEvent(new CustomEvent<DataGridCellEditDetail>(`datagrid-cell-edit`, { detail: { rowKey, colKey, oldValue, newValue }, bubbles: true, composed: true }));\n }\n\n private _suppressBlurCommit = false;\n private _tabToNext(rowKey: string, curColKey: string, dir: number): void {\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey);\n if (!row)\n return;\n const cols = this._visibleColumns;\n const curIdx = cols.findIndex(c => c.key === curColKey);\n let next = curIdx + dir;\n while (next >= 0 && next < cols.length) {\n if (this._isEditable(row, cols[next])) {\n // commit current before moving (use _editValue if pending)\n if (this._editing)\n this._commitEdit();\n this._suppressBlurCommit = true;\n this._startEdit(rowKey, cols[next].key);\n requestAnimationFrame(() => {\n this._suppressBlurCommit = false;\n });\n return;\n }\n next += dir;\n }\n if (this._editing)\n this._commitEdit();\n this._editing = null;\n this.requestUpdate();\n }\n\n private _commitImmediate(rowKey: string, colKey: string, value: unknown): void {\n const row = this._sortedRows.find((r, i) => this.getRowKey(r, i) === rowKey) as Record<string, unknown> | undefined;\n if (!row)\n return;\n const oldValue = row[colKey];\n if (oldValue === value)\n return;\n row[colKey] = value as never;\n this.rows = [...this.rows];\n this.dispatchEvent(new CustomEvent<DataGridCellEditDetail>(`datagrid-cell-edit`, { detail: { rowKey, colKey, oldValue, newValue: value }, bubbles: true, composed: true }));\n }\n\n private _autoSizeColumn(col: DataGridColumn): void {\n const cs = getComputedStyle(this);\n const font = `${cs.fontSize} ${cs.fontFamily}`;\n const canvas = document.createElement(`canvas`);\n const ctx = canvas.getContext(`2d`);\n const cellPad = 32; // 2 * var(--space-s) approx + border\n const headerExtra = 40; // sort icon + reorder handle + resize handle\n const measure = (text: string): number => {\n if (!ctx)\n return text.length * 8;\n ctx.font = font;\n return Math.ceil(ctx.measureText(text).width);\n };\n let maxW = measure(col.label) + headerExtra;\n for (const r of this.rows) {\n const v = (r as Record<string, unknown>)[col.key];\n if (v === null || v === undefined || v === ``)\n continue;\n // For custom renderers we can only estimate from raw value\n const text = String(v);\n const w = measure(text) + cellPad;\n if (w > maxW)\n maxW = w;\n }\n // Also consider rendered text for visible cells (more accurate for formatted values)\n // Measure actual cell widths after render if available\n const min = col.minWidth ?? 40;\n const max = col.maxWidth ?? 600;\n const w = Math.max(min, Math.min(max, maxW));\n col.width = w;\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent<DataGridColumnResizeDetail>(`datagrid-column-resize`, { detail: { key: col.key, width: w }, bubbles: true, composed: true }));\n }\n\n private _onResizePointerDown(e: PointerEvent, col: DataGridColumn): void {\n e.preventDefault(); e.stopPropagation();\n const startX = e.clientX;\n const startW = col.width ?? 150;\n const onMove = (ev: PointerEvent): void => {\n const w = Math.max(col.minWidth ?? 40, Math.min(col.maxWidth ?? 600, startW + ev.clientX - startX));\n col.width = w;\n this.requestUpdate();\n };\n const onUp = (ev: PointerEvent): void => {\n window.removeEventListener(`pointermove`, onMove);\n window.removeEventListener(`pointerup`, onUp);\n const w = Math.max(col.minWidth ?? 40, Math.min(col.maxWidth ?? 600, startW + ev.clientX - startX));\n this.dispatchEvent(new CustomEvent<DataGridColumnResizeDetail>(`datagrid-column-resize`, { detail: { key: col.key, width: w }, bubbles: true, composed: true }));\n };\n window.addEventListener(`pointermove`, onMove);\n window.addEventListener(`pointerup`, onUp);\n }\n\n // Public API for stress demo\n getVisibleRange(): { startRow: number; endRow: number; startCol: number; endCol: number } {\n const rh = this.rowHeight;\n const startRow = Math.max(0, Math.floor(this._scrollTop / rh) - 2);\n const endRow = Math.min(this._flat.length, Math.ceil((this._scrollTop + this._viewportH) / rh) + 2);\n const startCol = this._findFirstVisibleCol(this._scrollLeft);\n const endCol = this._findLastVisibleCol(this._scrollLeft + this._viewportW);\n return { startRow, endRow, startCol, endCol };\n }\n\n private _findFirstVisibleCol(scrollLeft: number): number {\n let lo = 0; let hi = this._colOffsets.length - 1; let ans = 0;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n if (this._colOffsets[mid] <= scrollLeft) {\n ans = mid; lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return ans;\n }\n\n private _findLastVisibleCol(right: number): number {\n for (let i = 0; i < this._colOffsets.length; i++) {\n if (this._colOffsets[i] > right)\n return i;\n }\n return this._colOffsets.length;\n }\n\n protected override render() {\n const rh = this.rowHeight;\n const startRow = Math.max(0, Math.floor(this._scrollTop / rh) - 2);\n const endRow = Math.min(this._flat.length, Math.ceil((this._scrollTop + this._viewportH) / rh) + 2);\n const visibleFlat = this._flat.slice(startRow, endRow);\n const showCheckbox = this.interactionMode === `checked`;\n\n return html`\n <div class=\"grid\" style=\"height:400px\">\n <div class=\"header-bar\">\n <div class=\"header-scroll\">\n ${showCheckbox ? html`<div class=\"header-cell checkbox-col\"></div>` : nothing}\n ${repeat(this._visibleColumns, c => c.key, (col, idx) => html`\n <div class=\"header-cell\" style=\"width:${col.width ?? 150}px\" ?drag-source=${this._drag?.active && this._drag.sourceCol.key === col.key}\n @click=${() => this._onHeaderClick(col)}\n @pointerenter=${() => this._tickled.handlePointerEnter(col.key)}>\n ${col.reorderable !== false\n ? html`<span class=\"reorder-handle\" draggable=\"false\"\n @pointerdown=${(e: PointerEvent) => this._beginHeaderDrag(e, col, idx)}\n >⠿</span>`\n : nothing}\n <span class=\"header-label\">${col.label}</span>\n ${this.sortState?.key === col.key ? html`<span class=\"sort-icon\">${this.sortState.direction === `asc` ? `▲` : `▼`}</span>` : nothing}\n ${col.resizable !== false\n ? html`<span class=\"resize-handle\" @pointerdown=${(e: PointerEvent) => this._onResizePointerDown(e, col)} @click=${(e: MouseEvent) => e.stopPropagation()} @dblclick=${(e: MouseEvent) => {\n e.preventDefault(); e.stopPropagation(); this._autoSizeColumn(col);\n }}></span>`\n : nothing}\n </div>\n `)}\n ${this._drag?.active && this._drag.gap !== undefined\n ? html`<div class=\"drop-caret\" style=\"left:${(() => {\n const gap = this._drag!.gap!;\n if (gap < this._colOffsets.length)\n return this._colOffsets[gap];\n const last = this._colOffsets.length - 1;\n return last >= 0 ? this._colOffsets[last] + (this._visibleColumns[last].width ?? 150) : 0;\n })()}px\"></div>`\n : nothing}\n </div>\n <ixfx-menu-trigger label=\"⚙\" placement=\"bottom-end\" @menu-command=${(e: CustomEvent) => {\n const cmd = (e.detail as { command?: string; checked?: boolean; value?: string }).command;\n const checked = (e.detail as { checked?: boolean }).checked;\n const value = (e.detail as { value?: string }).value;\n if (cmd?.startsWith(`col:`)) {\n const key = cmd.slice(4);\n const col = this.columns.find(c => c.key === key);\n if (col)\n this._onVisibilityToggle(col, !!checked);\n e.stopPropagation();\n return;\n }\n if (cmd === `groupBy`) {\n const v = value ?? ``;\n this.groupBy = v || null;\n this._collapsedGroups = new Set();\n this.dispatchEvent(new CustomEvent<DataGridGroupChangeDetail>(`datagrid-group-change`, { detail: { groupBy: this.groupBy as DataGridGroupBy<unknown> | null }, bubbles: true, composed: true }));\n e.stopPropagation();\n }\n }}>\n <ixfx-menu-container slot=\"menu\">\n <ixfx-menu-header label=\"Columns\"></ixfx-menu-header>\n ${repeat(this.columns, c => c.key, col => html`\n <ixfx-menu-check-item command=\"col:${col.key}\" label=${col.label} ?checked=${col.visible !== false}></ixfx-menu-check-item>\n `)}\n ${this.allowGrouping\n ? html`\n <ixfx-menu-separator></ixfx-menu-separator>\n <ixfx-menu-header label=\"Group by\"></ixfx-menu-header>\n <ixfx-menu-radio-group name=\"groupBy\" value=${typeof this.groupBy === `string` ? this.groupBy : ``}>\n <ixfx-menu-radio-item value=\"\" label=\"None\"></ixfx-menu-radio-item>\n ${this.columns.filter(c => c.groupable !== false && (!this.groupableColumns || this.groupableColumns.includes(c.key))).map(col => html`\n <ixfx-menu-radio-item value=${col.key} label=${col.label}></ixfx-menu-radio-item>\n `)}\n </ixfx-menu-radio-group>\n `\n : nothing}\n </ixfx-menu-container>\n </ixfx-menu-trigger>\n </div>\n <div class=\"viewport\" @scroll=${this._onScroll}>\n <div class=\"spacer\" style=\"height:${this._flat.length * rh}px; width:${this._colWidthSum}px\">\n ${repeat(visibleFlat, f => f.key, (entry, i) => {\n const absIdx = startRow + i;\n if (entry.type === `group`) {\n const gKey = entry.key.replace(/^__group__/, ``);\n const collapsed = this._collapsedGroups.has(gKey);\n return html`<div class=\"group-row ${collapsed ? `collapsed` : ``}\" style=\"top:${absIdx * rh}px; height:${rh}px\" @click=${() => this._toggleGroup(gKey)}><span class=\"caret\">▼</span><span>${entry.label}</span><span class=\"count\">(${entry.count})</span><span class=\"divider\"></span></div>`;\n }\n const row = entry.row;\n const absIdx2 = entry.idx;\n const rowKey = entry.key;\n const selected = this._selectedKeys.has(rowKey);\n const tickled = this._tickled.isTickled(rowKey);\n return html`\n <div class=\"row item ${selected ? `selected` : ``} ${tickled ? `tickled` : ``}\" style=\"top:${absIdx * rh}px; height:${rh}px\"\n data-key=${rowKey}\n @click=${(e: MouseEvent) => {\n this._onRowClick(rowKey, null, e); this.dispatchEvent(new CustomEvent<DataGridCellClickDetail>(`datagrid-cell-click`, { detail: { rowKey, colKey: ``, rowIndex: absIdx2, colIndex: -1 }, bubbles: true, composed: true }));\n }}\n @pointerenter=${() => this._tickled.handlePointerEnter(rowKey)}\n @pointerleave=${() => this._tickled.clearTickled()}\n @dblclick=${() => {\n if (this._visibleColumns[0] && this._isEditable(row, this._visibleColumns[0]))\n this._startEdit(rowKey, this._visibleColumns[0].key);\n }}>\n ${showCheckbox ? html`<div class=\"checkbox-col\"><input type=\"checkbox\" .checked=${selected} @click=${(e: MouseEvent) => this._onCheckboxClick(rowKey, e)} /></div>` : nothing}\n ${repeat(this._visibleColumns, c => c.key, (col) => {\n const val = (row as Record<string, unknown>)[col.key];\n const isEditing = this._isCellEditing(rowKey, col.key);\n if (isEditing) {\n const immediate = this.editability === `immediate` || this._editingRow === rowKey;\n const curVal = immediate ? val : (this._editValue ?? val);\n if (col.editor === `boolean` || (col.editor as string) === `boolean`) {\n return html`<div class=\"cell\" data-col=${col.key} style=\"width:${col.width ?? 150}px;justify-content:center;align-items:center\"><input type=\"checkbox\" .checked=${Boolean(curVal)} @change=${(e: Event) => {\n const v = (e.target as HTMLInputElement).checked;\n if (immediate) {\n this._commitImmediate(rowKey, col.key, v);\n } else {\n this._editValue = v; this._commitEdit();\n }\n }} /></div>`;\n }\n if (col.editor === `select`) {\n const opts = (col.editorOptions ?? []) as ReadonlyArray<string | { value: string; label: string }>;\n return html`<div class=\"cell\" data-col=${col.key} style=\"width:${col.width ?? 150}px\"><select @change=${(e: Event) => {\n const v = (e.target as HTMLSelectElement).value;\n if (immediate) {\n this._commitImmediate(rowKey, col.key, v);\n } else {\n this._editValue = v; this._commitEdit();\n }\n }} @keydown=${(e: KeyboardEvent) => {\n if (e.key === `Tab`) {\n e.preventDefault(); e.stopPropagation(); this._tabToNext(rowKey, col.key, e.shiftKey ? -1 : 1);\n } if (e.key === `Escape`) {\n this._editing = null; this._editingRow = null;\n }\n }} @blur=${() => {\n if (this._suppressBlurCommit)\n return; if (!immediate)\n this._commitEdit();\n }}><option value=\"\"></option>${opts.map((o) => {\n const v = typeof o === `string` ? o : o.value;\n const l = typeof o === `string` ? o : o.label;\n return html`<option value=${v} ?selected=${String(curVal) === v}>${l}</option>`;\n })}</select></div>`;\n }\n if (typeof col.editor === `function`) {\n const factory = col.editor as DataGridEditorFactory;\n const ctx = { row, column: col, rowIndex: absIdx2, colIndex: 0, value: curVal, commit: (v: unknown) => {\n if (immediate) {\n this._commitImmediate(rowKey, col.key, v);\n } else {\n this._editValue = v; this._commitEdit();\n }\n }, cancel: () => {\n this._editing = null; this._editingRow = null;\n } };\n return html`<div class=\"cell\" data-col=${col.key} style=\"width:${col.width ?? 150}px\">${factory(ctx)}</div>`;\n }\n return html`<div class=\"cell\" data-col=${col.key} style=\"width:${col.width ?? 150}px\"><input .value=${String(curVal ?? ``)} @input=${(e: Event) => this._editValue = (e.target as HTMLInputElement).value} @keydown=${(e: KeyboardEvent) => {\n if (e.key === `Enter`)\n this._commitEdit(); if (e.key === `Escape`) {\n this._editing = null; this._editingRow = null;\n } if (e.key === `Tab`) {\n e.preventDefault(); e.stopPropagation(); this._tabToNext(rowKey, col.key, e.shiftKey ? -1 : 1);\n }\n }} @blur=${() => {\n if (this._suppressBlurCommit)\n return; if (!immediate)\n this._commitEdit();\n }} autofocus /></div>`;\n }\n const displayVal = this._formatValue(val, col, row);\n const rendered = col.renderer ? col.renderer(row as never, col as never, absIdx2) : displayVal;\n // renderer may return TemplateResult or primitive; if renderer not used, display formatted\n const cellContent = col.renderer ? rendered : displayVal;\n const editable = this._isEditable(row, col);\n const textEditable = editable && this._isTextEditor(col);\n return html`<div class=\"cell ${textEditable ? `editable-text` : ``}\" data-col=${col.key} style=\"width:${col.width ?? 150}px; justify-content:${col.align === `right` ? `flex-end` : col.align === `center` ? `center` : `flex-start`}\"\n @click=${(e: MouseEvent) => {\n this._lastClickedCell = { rowKey, colKey: col.key }; if (col.selectable !== false) {\n e.stopPropagation(); this._onRowClick(rowKey, col, e); this._handleCellSecondClick(rowKey, col);\n } this.dispatchEvent(new CustomEvent<DataGridCellClickDetail>(`datagrid-cell-click`, { detail: { rowKey, colKey: col.key, rowIndex: absIdx2, colIndex: this.columns.indexOf(col) }, bubbles: true, composed: true }));\n }}\n >${cellContent as unknown as string}</div>`;\n })}\n </div>\n `;\n })}\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap { 'ixfx-data-grid': DataGridElement }\n}\nexport interface DataGridElement {\n addEventListener: (<K extends keyof DataGridElementEventMap>(type: K, listener: (this: DataGridElement, event: DataGridElementEventMap[K]) => void, options?: boolean | AddEventListenerOptions) => void) & ((type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions) => void);\n removeEventListener: (<K extends keyof DataGridElementEventMap>(type: K, listener: (this: DataGridElement, event: DataGridElementEventMap[K]) => void, options?: boolean | EventListenerOptions) => void) & ((type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions) => void);\n}\n"],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ //#region src/common/data-provider.d.ts
2
+ /**
3
+ * Shared data-provider contract used by components that render a list of items.
4
+ *
5
+ * A provider is a simple callable — the consuming component (via DataController)
6
+ * manages the request lifecycle, cancellation, and reactive state.
7
+ */
8
+ /**
9
+ * One batch of items within a streaming provider response.
10
+ *
11
+ * For sync and async one-shot providers, the DataController synthesises a single
12
+ * DataBatch internally — you only need this type when writing a streaming provider.
13
+ */
14
+ type DataBatch<T> = {
15
+ /** Items delivered in this batch. */
16
+ readonly items: readonly T[];
17
+ /**
18
+ * When true, replace all previously accumulated items with this batch instead
19
+ * of appending. Useful for re-ranked or filtered results mid-stream.
20
+ * Default: false (append).
21
+ */
22
+ replace?: boolean;
23
+ /**
24
+ * Provider's current estimate of the total number of items that will be
25
+ * delivered across all batches. Enables progress percentage in the consumer.
26
+ * May be refined in subsequent batches as the estimate improves.
27
+ * Omit when the total is unknown.
28
+ */
29
+ total?: number;
30
+ };
31
+ /**
32
+ * The three return modes a provider may use.
33
+ * DataController normalises all three — callers can mix modes freely.
34
+ *
35
+ * - `readonly T[]` — sync, items available immediately
36
+ * - `Promise<readonly T[]>` — async one-shot, resolves to the full result
37
+ * - `AsyncIterable<DataBatch<T>>` — streaming, batches arrive over time
38
+ */
39
+ type DataProviderResult<T> = readonly T[] | Promise<readonly T[]> | AsyncIterable<DataBatch<T>>;
40
+ /**
41
+ * A data provider callable.
42
+ *
43
+ * @typeParam TQuery - The input that scopes the request (e.g. `string` for
44
+ * autocomplete, `{ node, depth }` for a tree branch, `void` for a plain list).
45
+ * @typeParam TItem - The item type produced.
46
+ *
47
+ * The AbortSignal is cancelled when the consumer supersedes the request (e.g.
48
+ * a new query arrives before the previous one completes). Streaming providers
49
+ * should check `signal.aborted` between yields or pass the signal to their
50
+ * underlying fetch calls.
51
+ */
52
+ type IDataProvider<TQuery, TItem> = (query: TQuery, signal: AbortSignal) => DataProviderResult<TItem>;
53
+ /**
54
+ * Collects all items from any DataProviderResult into a flat array.
55
+ * Useful for components that need a complete list before rendering (e.g. tree branches).
56
+ * Respects the AbortSignal — stops accumulating if cancelled mid-stream.
57
+ */
58
+ declare function collectDataResult<T>(result: DataProviderResult<T>, signal: AbortSignal): Promise<readonly T[]>;
59
+ //#endregion
60
+ export { collectDataResult as i, DataProviderResult as n, IDataProvider as r, DataBatch as t };
61
+ //# sourceMappingURL=data-provider-BAn_-oR1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-provider-BAn_-oR1.d.ts","names":[],"sources":["../src/common/data-provider.ts"],"mappings":";;;;;;;;;;;;;KAaY,UAAU;;WAEX,gBAAgB;;;;;;EAMzB;;;;;;;EAOA;;;;;;;;;;KAWU,mBAAmB,cAChB,MACT,iBAAiB,OACjB,cAAc,UAAU;;;;;;;;;;;;;KAclB,cAAc,QAAQ,UAChC,OAAO,QACP,QAAQ,gBACL,mBAAmB;;;;;;iBAOF,kBAAkB,GACtC,QAAQ,mBAAmB,IAC3B,QAAQ,cACP,iBAAiB"}
@@ -14,7 +14,7 @@ function safeCustomElement(name) {
14
14
  };
15
15
  }
16
16
  //#endregion
17
- //#region \0@oxc-project+runtime@0.133.0/helpers/esm/decorate.js
17
+ //#region \0@oxc-project+runtime@0.143.0/helpers/esm/decorate.js
18
18
  function __decorate(decorators, target, key, desc) {
19
19
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
20
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -24,4 +24,4 @@ function __decorate(decorators, target, key, desc) {
24
24
  //#endregion
25
25
  export { safeCustomElement as n, __decorate as t };
26
26
 
27
- //# sourceMappingURL=decorate-DdjvVHS-.js.map
27
+ //# sourceMappingURL=decorate-VRK8rslU.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"decorate-DdjvVHS-.js","names":[],"sources":["../src/util/custom-elements.ts"],"sourcesContent":["type CustomElementCtor = CustomElementConstructor;\n\nfunction getRegistry(): CustomElementRegistry | undefined {\n if (typeof customElements === `undefined`)\n return undefined;\n return customElements;\n}\n\nexport function safeDefine(name: string, ctor: CustomElementCtor): void {\n const registry = getRegistry();\n if (!registry)\n return;\n const existing = registry.get(name);\n if (existing === undefined) {\n registry.define(name, ctor);\n }\n}\n\nexport function safeCustomElement(name: string) {\n return (ctor: CustomElementCtor): void => {\n safeDefine(name, ctor);\n };\n}\n"],"mappings":";AAEA,SAAS,cAAiD;CACxD,IAAI,OAAO,mBAAmB,aAC5B,OAAO,KAAA;CACT,OAAO;AACT;AAEA,SAAgB,WAAW,MAAc,MAA+B;CACtE,MAAM,WAAW,YAAY;CAC7B,IAAI,CAAC,UACH;CAEF,IADiB,SAAS,IAAI,IACnB,MAAM,KAAA,GACf,SAAS,OAAO,MAAM,IAAI;AAE9B;AAEA,SAAgB,kBAAkB,MAAc;CAC9C,QAAQ,SAAkC;EACxC,WAAW,MAAM,IAAI;CACvB;AACF"}
1
+ {"version":3,"file":"decorate-VRK8rslU.js","names":[],"sources":["../src/util/custom-elements.ts"],"sourcesContent":["type CustomElementCtor = CustomElementConstructor;\n\nfunction getRegistry(): CustomElementRegistry | undefined {\n if (typeof customElements === `undefined`)\n return undefined;\n return customElements;\n}\n\nexport function safeDefine(name: string, ctor: CustomElementCtor): void {\n const registry = getRegistry();\n if (!registry)\n return;\n const existing = registry.get(name);\n if (existing === undefined) {\n registry.define(name, ctor);\n }\n}\n\nexport function safeCustomElement(name: string) {\n return (ctor: CustomElementCtor): void => {\n safeDefine(name, ctor);\n };\n}\n"],"mappings":";AAEA,SAAS,cAAiD;CACxD,IAAI,OAAO,mBAAmB,aAC5B,OAAO,KAAA;CACT,OAAO;AACT;AAEA,SAAgB,WAAW,MAAc,MAA+B;CACtE,MAAM,WAAW,YAAY;CAC7B,IAAI,CAAC,UACH;CAEF,IADiB,SAAS,IAAI,IACnB,MAAM,KAAA,GACf,SAAS,OAAO,MAAM,IAAI;AAE9B;AAEA,SAAgB,kBAAkB,MAAc;CAC9C,QAAQ,SAAkC;EACxC,WAAW,MAAM,IAAI;CACvB;AACF"}
@@ -1,4 +1,21 @@
1
- import { i as registerIcon } from "./registry-CkW7q09Q.js";
1
+ //#region src/icons/registry.ts
2
+ const _registry = /* @__PURE__ */ new Map();
3
+ const iconBus = new EventTarget();
4
+ function registerIcon(name, svg) {
5
+ _registry.set(name, svg);
6
+ iconBus.dispatchEvent(new CustomEvent(`ixfx-icon-change`, { detail: { name } }));
7
+ }
8
+ function getIcon(name) {
9
+ return _registry.get(name);
10
+ }
11
+ function hasIcon(name) {
12
+ return _registry.has(name);
13
+ }
14
+ /** Converts an SVG string to a CSS data-URI value, e.g. for use as a mask-image. */
15
+ function svgToDataUri(svg) {
16
+ return `url("data:image/svg+xml,${encodeURIComponent(svg)}")`;
17
+ }
18
+ //#endregion
2
19
  //#region src/icons/defaults.ts
3
20
  /**
4
21
  * Chevron pointing down. Used for split-button dropdown toggle.
@@ -57,6 +74,6 @@ function registerDefaults() {
57
74
  registerIcon(`warning`, ICON_WARNING);
58
75
  }
59
76
  //#endregion
60
- export { registerDefaults as a, ICON_CLOSE as i, ICON_CHECK as n, ICON_CHEVRON_DOWN as r, ICON_CARET_RIGHT as t };
77
+ export { registerDefaults as a, iconBus as c, ICON_CLOSE as i, registerIcon as l, ICON_CHECK as n, getIcon as o, ICON_CHEVRON_DOWN as r, hasIcon as s, ICON_CARET_RIGHT as t, svgToDataUri as u };
61
78
 
62
- //# sourceMappingURL=defaults-BkWCPJFL.js.map
79
+ //# sourceMappingURL=defaults-BCiDhZbF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults-BCiDhZbF.js","names":[],"sources":["../src/icons/registry.ts","../src/icons/defaults.ts"],"sourcesContent":["const _registry = new Map<string, string>();\n\nexport const iconBus = new EventTarget();\n\nexport type IconChangedDetail = { readonly name: string };\nexport type IconChangedEvent = CustomEvent<IconChangedDetail>;\n\nexport function registerIcon(name: string, svg: string): void {\n _registry.set(name, svg);\n iconBus.dispatchEvent(new CustomEvent<IconChangedDetail>(`ixfx-icon-change`, { detail: { name } }));\n}\n\nexport function getIcon(name: string): string | undefined {\n return _registry.get(name);\n}\n\nexport function hasIcon(name: string): boolean {\n return _registry.has(name);\n}\n\n/** Converts an SVG string to a CSS data-URI value, e.g. for use as a mask-image. */\nexport function svgToDataUri(svg: string): string {\n return `url(\"data:image/svg+xml,${encodeURIComponent(svg)}\")`;\n}\n","import { registerIcon } from './registry.js';\n\n/**\n * Chevron pointing down. Used for split-button dropdown toggle.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_CHEVRON_DOWN = `<svg viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z\"/></svg>`;\n\n/**\n * Caret pointing right. Used for tree-basic expand indicator as a CSS mask.\n * fill=\"black\" is correct for CSS mask-image use (shape only, color comes from background-color).\n */\nexport const ICON_CARET_RIGHT = `<svg viewBox=\"0 0 24 24\" fill=\"black\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 7l6 5-6 5V7z\"/></svg>`;\n\n/**\n * Checkmark. Useful for menu-check-item or confirmation states.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_CHECK = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z\"/></svg>`;\n\n/**\n * Close / X icon. Useful for dialogs, notifications, dismissible elements.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_CLOSE = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z\"/></svg>`;\n\n/**\n * Error / warning icon. Useful for error notifications.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_ERROR = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/></svg>`;\n\n/**\n * Info icon. Useful for info notifications.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_INFO = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"/></svg>`;\n\n/**\n * Warning icon. Useful for warning notifications.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_WARNING = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"/></svg>`;\n\n/**\n * Chevron pointing right. Used for split-button switcher toggle.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_CHEVRON_RIGHT = `<svg viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"/></svg>`;\n\n/**\n * Folder with up arrow. Angled line style for navigating up one level.\n * fill=\"currentColor\" so it inherits CSS color.\n */\nexport const ICON_FOLDER_UP = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M12 4L4 12h5v8h6v-8h5L12 4z\"/></svg>`;\n\nexport function registerDefaults(): void {\n registerIcon(`chevron-down`, ICON_CHEVRON_DOWN);\n registerIcon(`chevron-right`, ICON_CHEVRON_RIGHT);\n registerIcon(`caret-right`, ICON_CARET_RIGHT);\n registerIcon(`check`, ICON_CHECK);\n registerIcon(`close`, ICON_CLOSE);\n registerIcon(`error`, ICON_ERROR);\n registerIcon(`folder-up`, ICON_FOLDER_UP);\n registerIcon(`info`, ICON_INFO);\n registerIcon(`warning`, ICON_WARNING);\n}\n"],"mappings":";AAAA,MAAM,4BAAY,IAAI,IAAoB;AAE1C,MAAa,UAAU,IAAI,YAAY;AAKvC,SAAgB,aAAa,MAAc,KAAmB;CAC5D,UAAU,IAAI,MAAM,GAAG;CACvB,QAAQ,cAAc,IAAI,YAA+B,oBAAoB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AACpG;AAEA,SAAgB,QAAQ,MAAkC;CACxD,OAAO,UAAU,IAAI,IAAI;AAC3B;AAEA,SAAgB,QAAQ,MAAuB;CAC7C,OAAO,UAAU,IAAI,IAAI;AAC3B;;AAGA,SAAgB,aAAa,KAAqB;CAChD,OAAO,2BAA2B,mBAAmB,GAAG,EAAE;AAC5D;;;;;;;ACjBA,MAAa,oBAAoB;;;;;AAMjC,MAAa,mBAAmB;;;;;AAMhC,MAAa,aAAa;;;;;AAM1B,MAAa,aAAa;;;;;AAM1B,MAAa,aAAa;;;;;AAM1B,MAAa,YAAY;;;;;AAMzB,MAAa,eAAe;;;;;AAM5B,MAAa,qBAAqB;;;;;AAMlC,MAAa,iBAAiB;AAE9B,SAAgB,mBAAyB;CACvC,aAAa,gBAAgB,iBAAiB;CAC9C,aAAa,iBAAiB,kBAAkB;CAChD,aAAa,eAAe,gBAAgB;CAC5C,aAAa,SAAS,UAAU;CAChC,aAAa,SAAS,UAAU;CAChC,aAAa,SAAS,UAAU;CAChC,aAAa,aAAa,cAAc;CACxC,aAAa,QAAQ,SAAS;CAC9B,aAAa,WAAW,YAAY;AACtC"}
@@ -0,0 +1,85 @@
1
+ //#region src/util/drag-ghost.ts
2
+ /**
3
+ * Theme-aware floating element helper.
4
+ *
5
+ * Creates a `position: fixed`, `pointer-events: none` element anchored to a
6
+ * source element's theme container, then exposes imperative `move` / `destroy`
7
+ * hooks. Used by `ixfx-tab-list` for its drag-ghost; intended to be reusable
8
+ * by future drag/detach features.
9
+ *
10
+ * Theme container lookup mirrors `tooltip-controller.ts` so the floating
11
+ * element still inherits the right CSS custom properties when the source lives
12
+ * inside a `.theme-dark` / `.theme-light` subtree (used by the loader iframes).
13
+ */
14
+ let stylesInjected = false;
15
+ function injectGhostStyles() {
16
+ if (stylesInjected) return;
17
+ stylesInjected = true;
18
+ const style = document.createElement(`style`);
19
+ style.textContent = `
20
+ .ixfx-drag-ghost {
21
+ position: fixed;
22
+ top: 0;
23
+ left: 0;
24
+ pointer-events: none;
25
+ z-index: 10000;
26
+ will-change: transform;
27
+ opacity: 0.9;
28
+ display: inline-flex;
29
+ align-items: center;
30
+ gap: var(--space-xs, 4px);
31
+ padding: var(--padding, var(--space-m, 8px)) calc(2 * var(--padding, var(--space-m, 8px)));
32
+ background: var(--surface-4);
33
+ color: var(--surface-4-text);
34
+ border: 1px solid var(--border-subtle);
35
+ border-radius: var(--radius-m, 6px);
36
+ font-family: inherit;
37
+ font-size: inherit;
38
+ font-weight: 500;
39
+ white-space: nowrap;
40
+ max-width: 240px;
41
+ overflow: hidden;
42
+ text-overflow: ellipsis;
43
+ box-shadow: var(--shadow-m);
44
+ }
45
+ .ixfx-drag-ghost ixfx-icon {
46
+ flex-shrink: 0;
47
+ }
48
+ `;
49
+ document.head.appendChild(style);
50
+ }
51
+ /**
52
+ * Create a theme-aware floating ghost element.
53
+ *
54
+ * The ghost is appended to the closest `.theme-dark` / `.theme-light` ancestor
55
+ * of `anchor`, falling back to `document.body`. This preserves CSS variable
56
+ * inheritance for theming.
57
+ */
58
+ function createDragGhost(opts) {
59
+ injectGhostStyles();
60
+ const ghost = document.createElement(`div`);
61
+ ghost.className = `ixfx-drag-ghost`;
62
+ if (opts.className) ghost.classList.add(opts.className);
63
+ ghost.appendChild(opts.content);
64
+ ghost.style.transform = `translate3d(-9999px, -9999px, 0)`;
65
+ const targetDoc = opts.anchor.ownerDocument;
66
+ const themeContainer = opts.anchor.closest(`.theme-dark, .theme-light`);
67
+ if (themeContainer) themeContainer.appendChild(ghost);
68
+ else targetDoc.body.appendChild(ghost);
69
+ const anchorRect = opts.anchor.getBoundingClientRect();
70
+ const offsetX = anchorRect.width / 2;
71
+ const offsetY = anchorRect.height / 2;
72
+ return {
73
+ element: ghost,
74
+ move(x, y) {
75
+ ghost.style.transform = `translate3d(${x - offsetX}px, ${y - offsetY}px, 0)`;
76
+ },
77
+ destroy() {
78
+ ghost.remove();
79
+ }
80
+ };
81
+ }
82
+ //#endregion
83
+ export { createDragGhost as t };
84
+
85
+ //# sourceMappingURL=drag-ghost-DtSDvjri.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drag-ghost-DtSDvjri.js","names":[],"sources":["../src/util/drag-ghost.ts"],"sourcesContent":["/**\n * Theme-aware floating element helper.\n *\n * Creates a `position: fixed`, `pointer-events: none` element anchored to a\n * source element's theme container, then exposes imperative `move` / `destroy`\n * hooks. Used by `ixfx-tab-list` for its drag-ghost; intended to be reusable\n * by future drag/detach features.\n *\n * Theme container lookup mirrors `tooltip-controller.ts` so the floating\n * element still inherits the right CSS custom properties when the source lives\n * inside a `.theme-dark` / `.theme-light` subtree (used by the loader iframes).\n */\nlet stylesInjected = false;\n\nfunction injectGhostStyles(): void {\n if (stylesInjected)\n return;\n stylesInjected = true;\n const style = document.createElement(`style`);\n style.textContent = `\n .ixfx-drag-ghost {\n position: fixed;\n top: 0;\n left: 0;\n pointer-events: none;\n z-index: 10000;\n will-change: transform;\n opacity: 0.9;\n display: inline-flex;\n align-items: center;\n gap: var(--space-xs, 4px);\n padding: var(--padding, var(--space-m, 8px)) calc(2 * var(--padding, var(--space-m, 8px)));\n background: var(--surface-4);\n color: var(--surface-4-text);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-m, 6px);\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n white-space: nowrap;\n max-width: 240px;\n overflow: hidden;\n text-overflow: ellipsis;\n box-shadow: var(--shadow-m);\n }\n .ixfx-drag-ghost ixfx-icon {\n flex-shrink: 0;\n }\n `;\n document.head.appendChild(style);\n}\n\nexport interface DragGhost {\n /** Position the ghost at (x, y) viewport coords, anchored around the source center. */\n move: (x: number, y: number) => void;\n /** Remove the ghost from the DOM. Idempotent. */\n destroy: () => void;\n /** The underlying ghost element (rarely needed outside this module). */\n readonly element: HTMLElement;\n}\n\nexport interface CreateDragGhostOptions {\n /** Content element to mount inside the ghost. Will be appended on create. */\n content: HTMLElement;\n /**\n * Anchor element — used to find the theme container and to compute the\n * initial offset so the ghost appears centered under the source on first move.\n */\n anchor: HTMLElement;\n /** Optional class name appended to the ghost wrapper for custom styling. */\n className?: string;\n}\n\n/**\n * Create a theme-aware floating ghost element.\n *\n * The ghost is appended to the closest `.theme-dark` / `.theme-light` ancestor\n * of `anchor`, falling back to `document.body`. This preserves CSS variable\n * inheritance for theming.\n */\nexport function createDragGhost(opts: CreateDragGhostOptions): DragGhost {\n injectGhostStyles();\n\n const ghost = document.createElement(`div`);\n ghost.className = `ixfx-drag-ghost`;\n if (opts.className)\n ghost.classList.add(opts.className);\n ghost.appendChild(opts.content);\n\n // Place ghost off-screen until first `move()` call\n ghost.style.transform = `translate3d(-9999px, -9999px, 0)`;\n\n const targetDoc = opts.anchor.ownerDocument;\n const themeContainer = opts.anchor.closest(`.theme-dark, .theme-light`);\n if (themeContainer) {\n themeContainer.appendChild(ghost);\n } else {\n targetDoc.body.appendChild(ghost);\n }\n\n // Anchor offset: distance from the source's top-left to its center.\n const anchorRect = opts.anchor.getBoundingClientRect();\n const offsetX = anchorRect.width / 2;\n const offsetY = anchorRect.height / 2;\n\n return {\n element: ghost,\n move(x: number, y: number): void {\n ghost.style.transform = `translate3d(${x - offsetX}px, ${y - offsetY}px, 0)`;\n },\n destroy(): void {\n ghost.remove();\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;AAYA,IAAI,iBAAiB;AAErB,SAAS,oBAA0B;CACjC,IAAI,gBACF;CACF,iBAAiB;CACjB,MAAM,QAAQ,SAAS,cAAc,OAAO;CAC5C,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BpB,SAAS,KAAK,YAAY,KAAK;AACjC;;;;;;;;AA8BA,SAAgB,gBAAgB,MAAyC;CACvE,kBAAkB;CAElB,MAAM,QAAQ,SAAS,cAAc,KAAK;CAC1C,MAAM,YAAY;CAClB,IAAI,KAAK,WACP,MAAM,UAAU,IAAI,KAAK,SAAS;CACpC,MAAM,YAAY,KAAK,OAAO;CAG9B,MAAM,MAAM,YAAY;CAExB,MAAM,YAAY,KAAK,OAAO;CAC9B,MAAM,iBAAiB,KAAK,OAAO,QAAQ,2BAA2B;CACtE,IAAI,gBACF,eAAe,YAAY,KAAK;MAEhC,UAAU,KAAK,YAAY,KAAK;CAIlC,MAAM,aAAa,KAAK,OAAO,sBAAsB;CACrD,MAAM,UAAU,WAAW,QAAQ;CACnC,MAAM,UAAU,WAAW,SAAS;CAEpC,OAAO;EACL,SAAS;EACT,KAAK,GAAW,GAAiB;GAC/B,MAAM,MAAM,YAAY,eAAe,IAAI,QAAQ,MAAM,IAAI,QAAQ;EACvE;EACA,UAAgB;GACd,MAAM,OAAO;EACf;CACF;AACF"}
@@ -1,5 +1,4 @@
1
1
  import { CSSResult, LitElement, PropertyValues } from "lit";
2
-
3
2
  //#region src/editable-label/editable-label.d.ts
4
3
  type EditableMode = `label` | `editor`;
5
4
  type EntryMode = `free` | `text` | `number` | `percent`;
@@ -70,7 +69,7 @@ declare global {
70
69
  interface HTMLElementTagNameMap {
71
70
  'ixfx-editable-label': EditableLabel;
72
71
  }
73
- } //# sourceMappingURL=editable-label.d.ts.map
72
+ }
74
73
  //#endregion
75
74
  export { DisplayTextLogic, EditableLabel, EditableLabelChangeDetail, EditableLabelChangeEvent, EditableMode, EntryMode };
76
75
  //# sourceMappingURL=editable-label.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"editable-label.d.ts","names":[],"sources":["../src/editable-label/editable-label.ts"],"mappings":";;;KAoCY,YAAA;AAAA,KACA,SAAA;AAAA,KACA,gBAAA;AAAA,KAEA,yBAAA;EAAA,SACD,KAAK;AAAA;AAAA,KAEJ,wBAAA,GAA2B,WAAW,CAAC,yBAAA;AAAA,cAGtC,aAAA,SAAsB,UAAA;EACJ,IAAA,EAAM,YAAA;EACmB,SAAA,EAAW,SAAA;EACpC,KAAA;EACe,QAAA;EAChC,WAAA;EAH0C;EAMb,WAAA;EALZ;;;;;;;EAckB,gBAAA,EAAkB,gBAAA;EASjC;EANuB,WAAA;EASvB;EAN0B,cAAA;EAQvC;EALa,SAAA,IAAa,KAAA;EAOjB;EAJI,SAAA,IAAa,KAAA;EAAA,UAE1B,QAAA;EAAA,cAEL,UAAA,IAAc,WAAA;EAqBlB;EAAA,UAhBA,UAAA;EAED,iBAAA;EAMA,oBAAA;EAAA,UAQC,SAAA;EAAA,UACA,sBAAA;EAAA,UACA,eAAA;EAAA,UACA,sBAAA;EAAA,UAEA,oBAAA;EAAA,QAOF,aAAA;EAAA,QAWA,aAAA;EAAA,UAOE,0BAAA;EAAA,UAUA,qBAAA;EAsCA;EAAA,UA5BA,kBAAA;EAAA,UAWA,YAAA;EAAA,UAMA,YAAA;EAAA,UAMA,WAAA;EAAA,UAKA,cAAA,GAAkB,CAAA,EAAG,aAAA;EAAA,UAgBrB,kBAAA,GAAsB,CAAA,EAAG,UAAA;EAAA,UAQzB,YAAA;EAAA,UAeA,UAAA;EAAA,UAMA,UAAA;EAAA,UAsBA,WAAA;EAAA,UAMA,eAAA;EAAA,UAcA,qBAAA;EAAA,UAoBA,eAAA,CAAgB,IAAA;EAAA,QASlB,iBAAA;EAWC,MAAA,kBAAM,cAAA;EAgBN,OAAA,CAAQ,OAAA,EAAS,cAAA;EAAA,OAcV,MAAA,EAAQ,SAAA;AAAA;AAAA,QA8FlB,MAAA;EAAA,UACI,qBAAA;IACR,qBAAA,EAAuB,aAAa;EAAA;AAAA"}
1
+ {"version":3,"file":"editable-label.d.ts","names":[],"sources":["../src/editable-label/editable-label.ts"],"mappings":";;KAoCY;KACA;KACA;KAEA;WACD;;KAEC,2BAA2B,YAAY;cAGtC,sBAAsB;EACJ,MAAM;EACmB,WAAW;EACpC;EACe;EAChC;;EAG6B;;;;;;;;EASM,kBAAkB;;EAGV;;EAGG;;EAG1B,aAAa;;EAGb,aAAa;YAE1B;gBAEL,cAAc;;YAKlB;EAED;EAMA;YAQC;YACA;YACA;YACA;YAEA;UAOF;UAWA;YAOE;YAUA;;YAUA;YAWA;YAMA;YAMA;YAKA,iBAAkB,GAAG;YAgBrB,qBAAsB,GAAG;YAQzB;YAeA;YAMA;YAsBA;YAMA;YAcA;YAoBA,gBAAgB;UASlB;EAWC,wBAAM;EAgBN,QAAQ,SAAS;SAcV,QAAQ;;QA8FlB;YACI;IACR,uBAAuB"}
@@ -1,5 +1,5 @@
1
1
  import { t as themeFallbacks } from "./fallbacks-DEE1nCTt.js";
2
- import { n as safeCustomElement, t as __decorate } from "./decorate-DdjvVHS-.js";
2
+ import { n as safeCustomElement, t as __decorate } from "./decorate-VRK8rslU.js";
3
3
  import { LitElement, css, html, nothing } from "lit";
4
4
  import { property, state } from "lit/decorators.js";
5
5
  //#region src/editable-label/editable-label.ts
@@ -1 +1 @@
1
- {"version":3,"file":"editable-label.js","names":["customElement"],"sources":["../src/editable-label/editable-label.ts"],"sourcesContent":["/**\n * <ixfx-editable-label> — inline editable text label.\n *\n * Two display modes:\n * label (default) — renders as plain text until clicked, then becomes an editable box.\n * editor — always renders as an editable box; becomes active on focus/click.\n *\n * Entry modes (filter characters as typed):\n * free (default) — no restrictions\n * text — alphabetical characters and spaces only\n * number — digits, decimal point, minus sign\n * percent — digits, decimal point, percent sign\n *\n * Properties (not attributes):\n * validator (value: string) => boolean — override commit validation; default uses entry-mode rules\n * formatter (value: string) => string — transform committed value for display\n *\n * Events:\n * input — CustomEvent<{ value: string }>, bubbles + composed; fired as value changes during editing\n * change — CustomEvent<{ value: string }>, bubbles + composed; fired when value is committed\n *\n * CSS variables:\n * --label-font-size defaults to var(--text-m, 12px)\n * --label-font-family defaults to var(--font-family, system-ui, sans-serif)\n * --label-color defaults to var(--surface-2-text)\n * --label-muted-color placeholder colour, defaults to var(--surface-muted-text)\n * --label-padding defaults to var(--space-xs, 3px) var(--space-s, 4px)\n * --label-radius defaults to var(--radius-s, 3px)\n * --label-align text alignment: left | center (default) | right\n */\nimport type { CSSResult, PropertyValues } from 'lit';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type EditableMode = `label` | `editor`;\nexport type EntryMode = `free` | `text` | `number` | `percent`;\nexport type DisplayTextLogic = `hidden` | `show` | `override` | `transient`;\n\nexport type EditableLabelChangeDetail = {\n readonly value: string;\n};\nexport type EditableLabelChangeEvent = CustomEvent<EditableLabelChangeDetail>;\n\n@customElement(`ixfx-editable-label`)\nexport class EditableLabel extends LitElement {\n @property({ reflect: true }) mode: EditableMode = `label`;\n @property({ attribute: `entry-mode`, reflect: true }) entryMode: EntryMode = `free`;\n @property({ reflect: true }) value = ``;\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property() placeholder = ``;\n\n /** Override displayed text. Bypasses formatter and value. When editing, shows raw value. */\n @property({ attribute: `display-text` }) displayText?: string;\n\n /**\n * Controls when displayText is shown:\n * - 'hidden' (default): never use displayText\n * - 'show': show displayText instead of formatted value, but hide while editing; revert after disappearDelay\n * - 'override': always show displayText, even when editing\n * - 'transient': show displayText by default, switch to formatted value after appearDelay on hover/interaction; revert after disappearDelay\n */\n @property({ attribute: `display-text-logic` }) displayTextLogic: DisplayTextLogic = `hidden`;\n\n /** Delay before showing value in transient mode (ms). Default: 50 */\n @property({ type: Number, attribute: `appear-delay` }) appearDelay = 50;\n\n /** Delay before reverting to displayText after editing ends (ms). Default: 1000 */\n @property({ type: Number, attribute: `disappear-delay` }) disappearDelay = 1000;\n\n /** Override commit validation. Return true to accept, false to reject (reverts). */\n @property({ attribute: false }) validator?: (value: string) => boolean;\n\n /** Transform the committed value for display. Does not affect the stored value. */\n @property({ attribute: false }) formatter?: (value: string) => string;\n\n @state() protected _editing = false;\n\n protected get _contentEl(): HTMLElement | undefined {\n return this.renderRoot?.querySelector<HTMLElement>(`.content`) ?? undefined;\n }\n\n /** Snapshot of value taken when editing begins; restored on cancel. */\n protected _prevValue = ``;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`mouseenter`, this._onMouseEnter);\n this.addEventListener(`mouseleave`, this._onMouseLeave);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`mouseenter`, this._onMouseEnter);\n this.removeEventListener(`mouseleave`, this._onMouseLeave);\n this._clearTransientTimer();\n }\n\n // ── Transient display state ─────────────────────────────────────────────────\n protected _hovering = false;\n protected _transientShowingValue = false;\n protected _transientTimer: number | undefined = undefined;\n protected _showModeWaitingToHide = false;\n\n protected _clearTransientTimer(): void {\n if (this._transientTimer !== undefined) {\n clearTimeout(this._transientTimer);\n this._transientTimer = undefined;\n }\n }\n\n private _onMouseEnter = (): void => {\n if (this.displayTextLogic !== `transient`)\n return;\n this._hovering = true;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n private _onMouseLeave = (): void => {\n if (this.displayTextLogic !== `transient`)\n return;\n this._hovering = false;\n this._startTransientRevertTimer();\n };\n\n protected _startTransientRevertTimer(): void {\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n if (!this._hovering && this.displayTextLogic === `transient`) {\n this._transientShowingValue = false;\n this._requestDisplayUpdate();\n }\n }, this.disappearDelay);\n }\n\n protected _requestDisplayUpdate(): void {\n if (!this._editing) {\n const el = this._contentEl;\n if (el) {\n el.textContent = this._getDisplayText();\n }\n }\n }\n\n /** Called by subclasses when user interacts (drag, keyboard, etc) to temporarily show value in transient mode */\n protected _onUserInteraction(): void {\n if (this.displayTextLogic !== `transient`)\n return;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._startTransientRevertTimer();\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n protected _handleClick = (): void => {\n if (this.mode === `label` && !this.disabled && !this._editing) {\n this._beginEdit();\n }\n };\n\n protected _handleFocus = (): void => {\n if (this.mode === `editor` && !this.disabled && !this._editing) {\n this._beginEdit();\n }\n };\n\n protected _handleBlur = (): void => {\n if (this._editing)\n this._tryCommit();\n };\n\n protected _handleKeydown = (e: KeyboardEvent): void => {\n if (!this._editing)\n return;\n if (e.key === `Enter`) {\n e.preventDefault();\n this._tryCommit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n } else if (e.key === `Escape`) {\n e.preventDefault();\n this._cancelEdit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n }\n };\n\n protected _handleBeforeInput = (e: InputEvent): void => {\n if (e.inputType !== `insertText` || !e.data)\n return;\n if (!this._isAllowedInput(e.data)) {\n e.preventDefault();\n }\n };\n\n protected _handleInput = (): void => {\n if (!this._editing)\n return;\n\n const raw = this._contentEl?.textContent?.trim() ?? ``;\n\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`input`, {\n detail: { value: raw },\n bubbles: true,\n composed: true,\n }));\n };\n\n // ── Core logic ───────────────────────────────────────────────────────────\n\n protected _beginEdit(): void {\n this._prevValue = this.value;\n this._editing = true;\n this.removeAttribute(`invalid`);\n }\n\n protected _tryCommit(): void {\n let raw = this._contentEl?.textContent?.trim() ?? ``;\n if (this.entryMode === `percent`)\n raw = raw.replaceAll(`%`, ``).trim();\n const validate = this.validator ?? this._defaultValidator.bind(this);\n if (validate(raw)) {\n this.removeAttribute(`invalid`);\n const prev = this.value;\n this.value = raw;\n this._editing = false;\n if (raw !== prev) {\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`change`, {\n detail: { value: raw },\n bubbles: true,\n composed: true,\n }));\n }\n } else {\n this._cancelEdit();\n }\n }\n\n protected _cancelEdit(): void {\n this.value = this._prevValue;\n this._editing = false;\n this.removeAttribute(`invalid`);\n }\n\n protected _getDisplayText(): string {\n const useDisplayText = this._shouldUseDisplayText();\n if (useDisplayText && this.displayText !== undefined && this.displayText !== ``) {\n return this.displayText;\n }\n if (!this.value)\n return ``;\n if (this.formatter)\n return this.formatter(this.value);\n if (this.entryMode === `percent`)\n return `${this.value}%`;\n return this.value;\n }\n\n protected _shouldUseDisplayText(): boolean {\n if (this.displayTextLogic === `hidden`)\n return false;\n if (this.displayTextLogic === `override`)\n return true;\n if (this.displayTextLogic === `show`) {\n if (this._editing)\n return false;\n return this._showModeWaitingToHide;\n }\n if (this.displayTextLogic === `transient`) {\n if (this._editing)\n return false;\n if (this._transientShowingValue)\n return false;\n return true;\n }\n return false;\n }\n\n protected _isAllowedInput(char: string): boolean {\n switch (this.entryMode) {\n case `text`: return /^[a-z\\s]$/i.test(char);\n case `number`: return /^[\\d.\\-]$/.test(char);\n case `percent`: return /^[\\d.%]$/.test(char);\n default: return true;\n }\n }\n\n private _defaultValidator(value: string): boolean {\n switch (this.entryMode) {\n case `text`: return /^[a-z\\s]*$/i.test(value);\n case `number`: return value === `` || /^-?\\d*(?:\\.\\d*)?$/.test(value);\n case `percent`: return value === `` || /^\\d*(?:\\.\\d*)?$/.test(value);\n default: return true;\n } // asdf\n }\n\n // ── Render ───────────────────────────────────────────────────────────────\n\n override render() {\n const isEditor = this.mode === `editor`;\n return html`<div\n class=\"content\"\n contenteditable=${this._editing ? `plaintext-only` : `false`}\n data-placeholder=${this.placeholder}\n tabindex=${isEditor && !this._editing ? `0` : nothing}\n @click=${this._handleClick}\n @focus=${this._handleFocus}\n @blur=${this._handleBlur}\n @keydown=${this._handleKeydown}\n @beforeinput=${this._handleBeforeInput}\n @input=${this._handleInput}\n >${this._editing ? nothing : this._getDisplayText()}</div>`;\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has(`_editing`) && this._editing) {\n const el = this._contentEl;\n if (el) {\n el.textContent = this.value;\n el.focus();\n _selectAll(el);\n }\n }\n }\n\n // ── Styles ───────────────────────────────────────────────────────────────\n\n static override styles: CSSResult[] = [themeFallbacks, css`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n --_font-size: var(--label-font-size, var(--text-m, 12px));\n --_font-family: var(--label-font-family, var(--font-family, system-ui, sans-serif));\n --_color: var(--label-color, var(--surface-2-text));\n --_muted: var(--label-muted-color, var(--surface-muted-text, oklch(55% 0.02 240)));\n --_padding: var(--label-padding, var(--space-xs, 3px) var(--space-s, 4px));\n --_radius: var(--label-radius, var(--radius-s, 3px));\n --_align: var(--label-align, center);\n --_min-width: var(--label-min-width, 1ch);\n }\n\n .content {\n box-sizing: border-box;\n width: 100%;\n text-align: var(--_align);\n outline: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: var(--_min-width);\n font-family: var(--_font-family);\n font-size: var(--_font-size);\n color: var(--_color);\n padding: var(--_padding);\n border: 1px solid transparent;\n border-radius: var(--_radius);\n cursor: pointer;\n transition:\n background var(--transition, 0.15s ease-out),\n border-color var(--transition, 0.15s ease-out);\n }\n\n /* Remove overflow clipping while editing so the cursor is never hidden */\n .content[contenteditable=\"plaintext-only\"] {\n overflow: visible;\n text-overflow: clip;\n }\n\n /* ── Label mode ── */\n :host([mode=\"label\"]) .content {\n background: transparent;\n }\n\n :host([mode=\"label\"]) .content[contenteditable=\"plaintext-only\"] {\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n cursor: text;\n }\n\n /* ── Editor mode — always shows box ── */\n :host([mode=\"editor\"]) .content {\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n }\n\n :host([mode=\"editor\"]) .content[contenteditable=\"plaintext-only\"] {\n border-color: var(--accent, oklch(60% 0.15 140));\n cursor: text;\n }\n\n /* ── Placeholder ── */\n .content:empty::before {\n content: attr(data-placeholder);\n color: var(--_muted);\n pointer-events: none;\n }\n\n /* ── Invalid ── */\n :host([invalid]) .content {\n border-color: var(--error, oklch(60% 0.15 20));\n }\n\n /* ── Disabled ── */\n :host([disabled]) .content {\n opacity: var(--disabled-opacity, 0.5);\n cursor: not-allowed;\n pointer-events: none;\n }\n `];\n}\n\nfunction _selectAll(el: HTMLElement): void {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-editable-label': EditableLabel;\n }\n}\n"],"mappings":";;;;;AA8CO,IAAA,gBAAA,MAAM,sBAAsB,WAAW;;;cACM;mBAC2B;eACxC;kBACkB;qBAC7B;0BAY0D;qBAGf;wBAGM;kBAQ7C;oBAOP;mBAgBD;gCACa;yBACa,KAAA;gCACb;6BASC;GAClC,IAAI,KAAK,qBAAqB,aAC5B;GACF,KAAK,YAAY;GACjB,KAAK,qBAAqB;GAC1B,KAAK,kBAAkB,OAAO,iBAAiB;IAC7C,KAAK,yBAAyB;IAC9B,KAAK,sBAAsB;GAC7B,GAAG,KAAK,WAAW;EACrB;6BAEoC;GAClC,IAAI,KAAK,qBAAqB,aAC5B;GACF,KAAK,YAAY;GACjB,KAAK,2BAA2B;EAClC;4BAiCqC;GACnC,IAAI,KAAK,SAAS,WAAW,CAAC,KAAK,YAAY,CAAC,KAAK,UACnD,KAAK,WAAW;EAEpB;4BAEqC;GACnC,IAAI,KAAK,SAAS,YAAY,CAAC,KAAK,YAAY,CAAC,KAAK,UACpD,KAAK,WAAW;EAEpB;2BAEoC;GAClC,IAAI,KAAK,UACP,KAAK,WAAW;EACpB;yBAE4B,MAA2B;GACrD,IAAI,CAAC,KAAK,UACR;GACF,IAAI,EAAE,QAAQ,SAAS;IACrB,EAAE,eAAe;IACjB,KAAK,WAAW;IAChB,IAAI,KAAK,SAAS,UAChB,KAAK,YAAY,KAAK;GAC1B,OAAO,IAAI,EAAE,QAAQ,UAAU;IAC7B,EAAE,eAAe;IACjB,KAAK,YAAY;IACjB,IAAI,KAAK,SAAS,UAChB,KAAK,YAAY,KAAK;GAC1B;EACF;6BAEgC,MAAwB;GACtD,IAAI,EAAE,cAAc,gBAAgB,CAAC,EAAE,MACrC;GACF,IAAI,CAAC,KAAK,gBAAgB,EAAE,IAAI,GAC9B,EAAE,eAAe;EAErB;4BAEqC;GACnC,IAAI,CAAC,KAAK,UACR;GAEF,MAAM,MAAM,KAAK,YAAY,aAAa,KAAK,KAAK;GAEpD,KAAK,cAAc,IAAI,YAAuC,SAAS;IACrE,QAAQ,EAAE,OAAO,IAAI;IACrB,SAAS;IACT,UAAU;GACZ,CAAC,CAAC;EACJ;;CAtIA,IAAc,aAAsC;EAClD,OAAO,KAAK,YAAY,cAA2B,UAAU,KAAK,KAAA;CACpE;CAKA,oBAAmC;EACjC,MAAM,kBAAkB;EACxB,KAAK,iBAAiB,cAAc,KAAK,aAAa;EACtD,KAAK,iBAAiB,cAAc,KAAK,aAAa;CACxD;CAEA,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,KAAK,oBAAoB,cAAc,KAAK,aAAa;EACzD,KAAK,oBAAoB,cAAc,KAAK,aAAa;EACzD,KAAK,qBAAqB;CAC5B;CAQA,uBAAuC;EACrC,IAAI,KAAK,oBAAoB,KAAA,GAAW;GACtC,aAAa,KAAK,eAAe;GACjC,KAAK,kBAAkB,KAAA;EACzB;CACF;CAoBA,6BAA6C;EAC3C,KAAK,qBAAqB;EAC1B,KAAK,kBAAkB,OAAO,iBAAiB;GAC7C,IAAI,CAAC,KAAK,aAAa,KAAK,qBAAqB,aAAa;IAC5D,KAAK,yBAAyB;IAC9B,KAAK,sBAAsB;GAC7B;EACF,GAAG,KAAK,cAAc;CACxB;CAEA,wBAAwC;EACtC,IAAI,CAAC,KAAK,UAAU;GAClB,MAAM,KAAK,KAAK;GAChB,IAAI,IACF,GAAG,cAAc,KAAK,gBAAgB;EAE1C;CACF;;CAGA,qBAAqC;EACnC,IAAI,KAAK,qBAAqB,aAC5B;EACF,KAAK,qBAAqB;EAC1B,KAAK,kBAAkB,OAAO,iBAAiB;GAC7C,KAAK,yBAAyB;GAC9B,KAAK,2BAA2B;GAChC,KAAK,sBAAsB;EAC7B,GAAG,KAAK,WAAW;CACrB;CA0DA,aAA6B;EAC3B,KAAK,aAAa,KAAK;EACvB,KAAK,WAAW;EAChB,KAAK,gBAAgB,SAAS;CAChC;CAEA,aAA6B;EAC3B,IAAI,MAAM,KAAK,YAAY,aAAa,KAAK,KAAK;EAClD,IAAI,KAAK,cAAc,WACrB,MAAM,IAAI,WAAW,KAAK,EAAE,EAAE,KAAK;EAErC,KADiB,KAAK,aAAa,KAAK,kBAAkB,KAAK,IAAI,GACtD,GAAG,GAAG;GACjB,KAAK,gBAAgB,SAAS;GAC9B,MAAM,OAAO,KAAK;GAClB,KAAK,QAAQ;GACb,KAAK,WAAW;GAChB,IAAI,QAAQ,MACV,KAAK,cAAc,IAAI,YAAuC,UAAU;IACtE,QAAQ,EAAE,OAAO,IAAI;IACrB,SAAS;IACT,UAAU;GACZ,CAAC,CAAC;EAEN,OACE,KAAK,YAAY;CAErB;CAEA,cAA8B;EAC5B,KAAK,QAAQ,KAAK;EAClB,KAAK,WAAW;EAChB,KAAK,gBAAgB,SAAS;CAChC;CAEA,kBAAoC;EAElC,IADuB,KAAK,sBACX,KAAK,KAAK,gBAAgB,KAAA,KAAa,KAAK,gBAAgB,IAC3E,OAAO,KAAK;EAEd,IAAI,CAAC,KAAK,OACR,OAAO;EACT,IAAI,KAAK,WACP,OAAO,KAAK,UAAU,KAAK,KAAK;EAClC,IAAI,KAAK,cAAc,WACrB,OAAO,GAAG,KAAK,MAAM;EACvB,OAAO,KAAK;CACd;CAEA,wBAA2C;EACzC,IAAI,KAAK,qBAAqB,UAC5B,OAAO;EACT,IAAI,KAAK,qBAAqB,YAC5B,OAAO;EACT,IAAI,KAAK,qBAAqB,QAAQ;GACpC,IAAI,KAAK,UACP,OAAO;GACT,OAAO,KAAK;EACd;EACA,IAAI,KAAK,qBAAqB,aAAa;GACzC,IAAI,KAAK,UACP,OAAO;GACT,IAAI,KAAK,wBACP,OAAO;GACT,OAAO;EACT;EACA,OAAO;CACT;CAEA,gBAA0B,MAAuB;EAC/C,QAAQ,KAAK,WAAb;GACE,KAAK,QAAQ,OAAO,aAAa,KAAK,IAAI;GAC1C,KAAK,UAAU,OAAO,YAAY,KAAK,IAAI;GAC3C,KAAK,WAAW,OAAO,WAAW,KAAK,IAAI;GAC3C,SAAS,OAAO;EAClB;CACF;CAEA,kBAA0B,OAAwB;EAChD,QAAQ,KAAK,WAAb;GACE,KAAK,QAAQ,OAAO,cAAc,KAAK,KAAK;GAC5C,KAAK,UAAU,OAAO,UAAU,MAAM,oBAAoB,KAAK,KAAK;GACpE,KAAK,WAAW,OAAO,UAAU,MAAM,kBAAkB,KAAK,KAAK;GACnE,SAAS,OAAO;EAClB;CACF;CAIA,SAAkB;EAChB,MAAM,WAAW,KAAK,SAAS;EAC/B,OAAO,IAAI;;wBAES,KAAK,WAAW,mBAAmB,QAAQ;yBAC1C,KAAK,YAAY;iBACzB,YAAY,CAAC,KAAK,WAAW,MAAM,QAAQ;eAC7C,KAAK,aAAa;eAClB,KAAK,aAAa;cACnB,KAAK,YAAY;iBACd,KAAK,eAAe;qBAChB,KAAK,mBAAmB;eAC9B,KAAK,aAAa;OAC1B,KAAK,WAAW,UAAU,KAAK,gBAAgB,EAAE;CACtD;CAEA,QAAiB,SAA+B;EAC9C,MAAM,QAAQ,OAAO;EACrB,IAAI,QAAQ,IAAI,UAAU,KAAK,KAAK,UAAU;GAC5C,MAAM,KAAK,KAAK;GAChB,IAAI,IAAI;IACN,GAAG,cAAc,KAAK;IACtB,GAAG,MAAM;IACT,WAAW,EAAE;GACf;EACF;CACF;;gBAIsC,CAAC,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFzD;;AACH;YApXG,SAAS,EAAE,SAAS,KAAK,CAAC,CAAA,GAAA,cAAA,WAAA,QAAA,KAAA,CAAA;YAC1B,SAAS;CAAE,WAAW;CAAc,SAAS;AAAK,CAAC,CAAA,GAAA,cAAA,WAAA,aAAA,KAAA,CAAA;YACnD,SAAS,EAAE,SAAS,KAAK,CAAC,CAAA,GAAA,cAAA,WAAA,SAAA,KAAA,CAAA;YAC1B,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,cAAA,WAAA,YAAA,KAAA,CAAA;YACzC,SAAS,CAAA,GAAA,cAAA,WAAA,eAAA,KAAA,CAAA;YAGT,SAAS,EAAE,WAAW,eAAe,CAAC,CAAA,GAAA,cAAA,WAAA,eAAA,KAAA,CAAA;YAStC,SAAS,EAAE,WAAW,qBAAqB,CAAC,CAAA,GAAA,cAAA,WAAA,oBAAA,KAAA,CAAA;YAG5C,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAe,CAAC,CAAA,GAAA,cAAA,WAAA,eAAA,KAAA,CAAA;YAGpD,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAkB,CAAC,CAAA,GAAA,cAAA,WAAA,kBAAA,KAAA,CAAA;YAGvD,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,cAAA,WAAA,aAAA,KAAA,CAAA;YAG7B,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,cAAA,WAAA,aAAA,KAAA,CAAA;YAE7B,MAAM,CAAA,GAAA,cAAA,WAAA,YAAA,KAAA,CAAA;4BAhCRA,kBAAc,qBAAqB,CAAA,GAAA,aAAA;AAwXpC,SAAS,WAAW,IAAuB;CACzC,MAAM,QAAQ,SAAS,YAAY;CACnC,MAAM,mBAAmB,EAAE;CAC3B,MAAM,MAAM,OAAO,aAAa;CAChC,KAAK,gBAAgB;CACrB,KAAK,SAAS,KAAK;AACrB"}
1
+ {"version":3,"file":"editable-label.js","names":["customElement"],"sources":["../src/editable-label/editable-label.ts"],"sourcesContent":["/**\n * <ixfx-editable-label> — inline editable text label.\n *\n * Two display modes:\n * label (default) — renders as plain text until clicked, then becomes an editable box.\n * editor — always renders as an editable box; becomes active on focus/click.\n *\n * Entry modes (filter characters as typed):\n * free (default) — no restrictions\n * text — alphabetical characters and spaces only\n * number — digits, decimal point, minus sign\n * percent — digits, decimal point, percent sign\n *\n * Properties (not attributes):\n * validator (value: string) => boolean — override commit validation; default uses entry-mode rules\n * formatter (value: string) => string — transform committed value for display\n *\n * Events:\n * input — CustomEvent<{ value: string }>, bubbles + composed; fired as value changes during editing\n * change — CustomEvent<{ value: string }>, bubbles + composed; fired when value is committed\n *\n * CSS variables:\n * --label-font-size defaults to var(--text-m, 12px)\n * --label-font-family defaults to var(--font-family, system-ui, sans-serif)\n * --label-color defaults to var(--surface-2-text)\n * --label-muted-color placeholder colour, defaults to var(--surface-muted-text)\n * --label-padding defaults to var(--space-xs, 3px) var(--space-s, 4px)\n * --label-radius defaults to var(--radius-s, 3px)\n * --label-align text alignment: left | center (default) | right\n */\nimport type { CSSResult, PropertyValues } from 'lit';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type EditableMode = `label` | `editor`;\nexport type EntryMode = `free` | `text` | `number` | `percent`;\nexport type DisplayTextLogic = `hidden` | `show` | `override` | `transient`;\n\nexport type EditableLabelChangeDetail = {\n readonly value: string;\n};\nexport type EditableLabelChangeEvent = CustomEvent<EditableLabelChangeDetail>;\n\n@customElement(`ixfx-editable-label`)\nexport class EditableLabel extends LitElement {\n @property({ reflect: true }) mode: EditableMode = `label`;\n @property({ attribute: `entry-mode`, reflect: true }) entryMode: EntryMode = `free`;\n @property({ reflect: true }) value = ``;\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property() placeholder = ``;\n\n /** Override displayed text. Bypasses formatter and value. When editing, shows raw value. */\n @property({ attribute: `display-text` }) displayText?: string;\n\n /**\n * Controls when displayText is shown:\n * - 'hidden' (default): never use displayText\n * - 'show': show displayText instead of formatted value, but hide while editing; revert after disappearDelay\n * - 'override': always show displayText, even when editing\n * - 'transient': show displayText by default, switch to formatted value after appearDelay on hover/interaction; revert after disappearDelay\n */\n @property({ attribute: `display-text-logic` }) displayTextLogic: DisplayTextLogic = `hidden`;\n\n /** Delay before showing value in transient mode (ms). Default: 50 */\n @property({ type: Number, attribute: `appear-delay` }) appearDelay = 50;\n\n /** Delay before reverting to displayText after editing ends (ms). Default: 1000 */\n @property({ type: Number, attribute: `disappear-delay` }) disappearDelay = 1000;\n\n /** Override commit validation. Return true to accept, false to reject (reverts). */\n @property({ attribute: false }) validator?: (value: string) => boolean;\n\n /** Transform the committed value for display. Does not affect the stored value. */\n @property({ attribute: false }) formatter?: (value: string) => string;\n\n @state() protected _editing = false;\n\n protected get _contentEl(): HTMLElement | undefined {\n return this.renderRoot?.querySelector<HTMLElement>(`.content`) ?? undefined;\n }\n\n /** Snapshot of value taken when editing begins; restored on cancel. */\n protected _prevValue = ``;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(`mouseenter`, this._onMouseEnter);\n this.addEventListener(`mouseleave`, this._onMouseLeave);\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`mouseenter`, this._onMouseEnter);\n this.removeEventListener(`mouseleave`, this._onMouseLeave);\n this._clearTransientTimer();\n }\n\n // ── Transient display state ─────────────────────────────────────────────────\n protected _hovering = false;\n protected _transientShowingValue = false;\n protected _transientTimer: number | undefined = undefined;\n protected _showModeWaitingToHide = false;\n\n protected _clearTransientTimer(): void {\n if (this._transientTimer !== undefined) {\n clearTimeout(this._transientTimer);\n this._transientTimer = undefined;\n }\n }\n\n private _onMouseEnter = (): void => {\n if (this.displayTextLogic !== `transient`)\n return;\n this._hovering = true;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n private _onMouseLeave = (): void => {\n if (this.displayTextLogic !== `transient`)\n return;\n this._hovering = false;\n this._startTransientRevertTimer();\n };\n\n protected _startTransientRevertTimer(): void {\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n if (!this._hovering && this.displayTextLogic === `transient`) {\n this._transientShowingValue = false;\n this._requestDisplayUpdate();\n }\n }, this.disappearDelay);\n }\n\n protected _requestDisplayUpdate(): void {\n if (!this._editing) {\n const el = this._contentEl;\n if (el) {\n el.textContent = this._getDisplayText();\n }\n }\n }\n\n /** Called by subclasses when user interacts (drag, keyboard, etc) to temporarily show value in transient mode */\n protected _onUserInteraction(): void {\n if (this.displayTextLogic !== `transient`)\n return;\n this._clearTransientTimer();\n this._transientTimer = window.setTimeout(() => {\n this._transientShowingValue = true;\n this._startTransientRevertTimer();\n this._requestDisplayUpdate();\n }, this.appearDelay);\n };\n\n protected _handleClick = (): void => {\n if (this.mode === `label` && !this.disabled && !this._editing) {\n this._beginEdit();\n }\n };\n\n protected _handleFocus = (): void => {\n if (this.mode === `editor` && !this.disabled && !this._editing) {\n this._beginEdit();\n }\n };\n\n protected _handleBlur = (): void => {\n if (this._editing)\n this._tryCommit();\n };\n\n protected _handleKeydown = (e: KeyboardEvent): void => {\n if (!this._editing)\n return;\n if (e.key === `Enter`) {\n e.preventDefault();\n this._tryCommit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n } else if (e.key === `Escape`) {\n e.preventDefault();\n this._cancelEdit();\n if (this.mode === `editor`)\n this._contentEl?.blur();\n }\n };\n\n protected _handleBeforeInput = (e: InputEvent): void => {\n if (e.inputType !== `insertText` || !e.data)\n return;\n if (!this._isAllowedInput(e.data)) {\n e.preventDefault();\n }\n };\n\n protected _handleInput = (): void => {\n if (!this._editing)\n return;\n\n const raw = this._contentEl?.textContent?.trim() ?? ``;\n\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`input`, {\n detail: { value: raw },\n bubbles: true,\n composed: true,\n }));\n };\n\n // ── Core logic ───────────────────────────────────────────────────────────\n\n protected _beginEdit(): void {\n this._prevValue = this.value;\n this._editing = true;\n this.removeAttribute(`invalid`);\n }\n\n protected _tryCommit(): void {\n let raw = this._contentEl?.textContent?.trim() ?? ``;\n if (this.entryMode === `percent`)\n raw = raw.replaceAll(`%`, ``).trim();\n const validate = this.validator ?? this._defaultValidator.bind(this);\n if (validate(raw)) {\n this.removeAttribute(`invalid`);\n const prev = this.value;\n this.value = raw;\n this._editing = false;\n if (raw !== prev) {\n this.dispatchEvent(new CustomEvent<EditableLabelChangeDetail>(`change`, {\n detail: { value: raw },\n bubbles: true,\n composed: true,\n }));\n }\n } else {\n this._cancelEdit();\n }\n }\n\n protected _cancelEdit(): void {\n this.value = this._prevValue;\n this._editing = false;\n this.removeAttribute(`invalid`);\n }\n\n protected _getDisplayText(): string {\n const useDisplayText = this._shouldUseDisplayText();\n if (useDisplayText && this.displayText !== undefined && this.displayText !== ``) {\n return this.displayText;\n }\n if (!this.value)\n return ``;\n if (this.formatter)\n return this.formatter(this.value);\n if (this.entryMode === `percent`)\n return `${this.value}%`;\n return this.value;\n }\n\n protected _shouldUseDisplayText(): boolean {\n if (this.displayTextLogic === `hidden`)\n return false;\n if (this.displayTextLogic === `override`)\n return true;\n if (this.displayTextLogic === `show`) {\n if (this._editing)\n return false;\n return this._showModeWaitingToHide;\n }\n if (this.displayTextLogic === `transient`) {\n if (this._editing)\n return false;\n if (this._transientShowingValue)\n return false;\n return true;\n }\n return false;\n }\n\n protected _isAllowedInput(char: string): boolean {\n switch (this.entryMode) {\n case `text`: return /^[a-z\\s]$/i.test(char);\n case `number`: return /^[\\d.\\-]$/.test(char);\n case `percent`: return /^[\\d.%]$/.test(char);\n default: return true;\n }\n }\n\n private _defaultValidator(value: string): boolean {\n switch (this.entryMode) {\n case `text`: return /^[a-z\\s]*$/i.test(value);\n case `number`: return value === `` || /^-?\\d*(?:\\.\\d*)?$/.test(value);\n case `percent`: return value === `` || /^\\d*(?:\\.\\d*)?$/.test(value);\n default: return true;\n } // asdf\n }\n\n // ── Render ───────────────────────────────────────────────────────────────\n\n override render() {\n const isEditor = this.mode === `editor`;\n return html`<div\n class=\"content\"\n contenteditable=${this._editing ? `plaintext-only` : `false`}\n data-placeholder=${this.placeholder}\n tabindex=${isEditor && !this._editing ? `0` : nothing}\n @click=${this._handleClick}\n @focus=${this._handleFocus}\n @blur=${this._handleBlur}\n @keydown=${this._handleKeydown}\n @beforeinput=${this._handleBeforeInput}\n @input=${this._handleInput}\n >${this._editing ? nothing : this._getDisplayText()}</div>`;\n }\n\n override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has(`_editing`) && this._editing) {\n const el = this._contentEl;\n if (el) {\n el.textContent = this.value;\n el.focus();\n _selectAll(el);\n }\n }\n }\n\n // ── Styles ───────────────────────────────────────────────────────────────\n\n static override styles: CSSResult[] = [themeFallbacks, css`\n :host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n --_font-size: var(--label-font-size, var(--text-m, 12px));\n --_font-family: var(--label-font-family, var(--font-family, system-ui, sans-serif));\n --_color: var(--label-color, var(--surface-2-text));\n --_muted: var(--label-muted-color, var(--surface-muted-text, oklch(55% 0.02 240)));\n --_padding: var(--label-padding, var(--space-xs, 3px) var(--space-s, 4px));\n --_radius: var(--label-radius, var(--radius-s, 3px));\n --_align: var(--label-align, center);\n --_min-width: var(--label-min-width, 1ch);\n }\n\n .content {\n box-sizing: border-box;\n width: 100%;\n text-align: var(--_align);\n outline: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: var(--_min-width);\n font-family: var(--_font-family);\n font-size: var(--_font-size);\n color: var(--_color);\n padding: var(--_padding);\n border: 1px solid transparent;\n border-radius: var(--_radius);\n cursor: pointer;\n transition:\n background var(--transition, 0.15s ease-out),\n border-color var(--transition, 0.15s ease-out);\n }\n\n /* Remove overflow clipping while editing so the cursor is never hidden */\n .content[contenteditable=\"plaintext-only\"] {\n overflow: visible;\n text-overflow: clip;\n }\n\n /* ── Label mode ── */\n :host([mode=\"label\"]) .content {\n background: transparent;\n }\n\n :host([mode=\"label\"]) .content[contenteditable=\"plaintext-only\"] {\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n cursor: text;\n }\n\n /* ── Editor mode — always shows box ── */\n :host([mode=\"editor\"]) .content {\n background: var(--surface-4, oklch(22% 0.02 240));\n border: var(--border, 1px solid oklch(25% 0.02 240));\n }\n\n :host([mode=\"editor\"]) .content[contenteditable=\"plaintext-only\"] {\n border-color: var(--accent, oklch(60% 0.15 140));\n cursor: text;\n }\n\n /* ── Placeholder ── */\n .content:empty::before {\n content: attr(data-placeholder);\n color: var(--_muted);\n pointer-events: none;\n }\n\n /* ── Invalid ── */\n :host([invalid]) .content {\n border-color: var(--error, oklch(60% 0.15 20));\n }\n\n /* ── Disabled ── */\n :host([disabled]) .content {\n opacity: var(--disabled-opacity, 0.5);\n cursor: not-allowed;\n pointer-events: none;\n }\n `];\n}\n\nfunction _selectAll(el: HTMLElement): void {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel?.removeAllRanges();\n sel?.addRange(range);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-editable-label': EditableLabel;\n }\n}\n"],"mappings":";;;;;AA8CO,IAAM,gBAAN,MAAM,sBAAsB,WAAW;;;EACM,KAAA,OAAA;EAC2B,KAAA,YAAA;EACxC,KAAA,QAAA;EACkB,KAAA,WAAA;EAC7B,KAAA,cAAA;EAY0D,KAAA,mBAAA;EAGf,KAAA,cAAA;EAGM,KAAA,iBAAA;EAQ7C,KAAA,WAAA;EAOP,KAAA,aAAA;EAgBD,KAAA,YAAA;EACa,KAAA,yBAAA;EACa,KAAA,kBAAA,KAAA;EACb,KAAA,yBAAA;EASC,KAAA,sBAAA;GAClC,IAAI,KAAK,qBAAqB,aAC5B;GACF,KAAK,YAAY;GACjB,KAAK,qBAAqB;GAC1B,KAAK,kBAAkB,OAAO,iBAAiB;IAC7C,KAAK,yBAAyB;IAC9B,KAAK,sBAAsB;GAC7B,GAAG,KAAK,WAAW;EACrB;EAEoC,KAAA,sBAAA;GAClC,IAAI,KAAK,qBAAqB,aAC5B;GACF,KAAK,YAAY;GACjB,KAAK,2BAA2B;EAClC;EAiCqC,KAAA,qBAAA;GACnC,IAAI,KAAK,SAAS,WAAW,CAAC,KAAK,YAAY,CAAC,KAAK,UACnD,KAAK,WAAW;EAEpB;EAEqC,KAAA,qBAAA;GACnC,IAAI,KAAK,SAAS,YAAY,CAAC,KAAK,YAAY,CAAC,KAAK,UACpD,KAAK,WAAW;EAEpB;EAEoC,KAAA,oBAAA;GAClC,IAAI,KAAK,UACP,KAAK,WAAW;EACpB;EAE4B,KAAA,kBAAA,MAA2B;GACrD,IAAI,CAAC,KAAK,UACR;GACF,IAAI,EAAE,QAAQ,SAAS;IACrB,EAAE,eAAe;IACjB,KAAK,WAAW;IAChB,IAAI,KAAK,SAAS,UAChB,KAAK,YAAY,KAAK;GAC1B,OAAO,IAAI,EAAE,QAAQ,UAAU;IAC7B,EAAE,eAAe;IACjB,KAAK,YAAY;IACjB,IAAI,KAAK,SAAS,UAChB,KAAK,YAAY,KAAK;GAC1B;EACF;EAEgC,KAAA,sBAAA,MAAwB;GACtD,IAAI,EAAE,cAAc,gBAAgB,CAAC,EAAE,MACrC;GACF,IAAI,CAAC,KAAK,gBAAgB,EAAE,IAAI,GAC9B,EAAE,eAAe;EAErB;EAEqC,KAAA,qBAAA;GACnC,IAAI,CAAC,KAAK,UACR;GAEF,MAAM,MAAM,KAAK,YAAY,aAAa,KAAK,KAAK;GAEpD,KAAK,cAAc,IAAI,YAAuC,SAAS;IACrE,QAAQ,EAAE,OAAO,IAAI;IACrB,SAAS;IACT,UAAU;GACZ,CAAC,CAAC;EACJ;;CAtIA,IAAc,aAAsC;EAClD,OAAO,KAAK,YAAY,cAA2B,UAAU,KAAK,KAAA;CACpE;CAKA,oBAAmC;EACjC,MAAM,kBAAkB;EACxB,KAAK,iBAAiB,cAAc,KAAK,aAAa;EACtD,KAAK,iBAAiB,cAAc,KAAK,aAAa;CACxD;CAEA,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,KAAK,oBAAoB,cAAc,KAAK,aAAa;EACzD,KAAK,oBAAoB,cAAc,KAAK,aAAa;EACzD,KAAK,qBAAqB;CAC5B;CAQA,uBAAuC;EACrC,IAAI,KAAK,oBAAoB,KAAA,GAAW;GACtC,aAAa,KAAK,eAAe;GACjC,KAAK,kBAAkB,KAAA;EACzB;CACF;CAoBA,6BAA6C;EAC3C,KAAK,qBAAqB;EAC1B,KAAK,kBAAkB,OAAO,iBAAiB;GAC7C,IAAI,CAAC,KAAK,aAAa,KAAK,qBAAqB,aAAa;IAC5D,KAAK,yBAAyB;IAC9B,KAAK,sBAAsB;GAC7B;EACF,GAAG,KAAK,cAAc;CACxB;CAEA,wBAAwC;EACtC,IAAI,CAAC,KAAK,UAAU;GAClB,MAAM,KAAK,KAAK;GAChB,IAAI,IACF,GAAG,cAAc,KAAK,gBAAgB;EAE1C;CACF;;CAGA,qBAAqC;EACnC,IAAI,KAAK,qBAAqB,aAC5B;EACF,KAAK,qBAAqB;EAC1B,KAAK,kBAAkB,OAAO,iBAAiB;GAC7C,KAAK,yBAAyB;GAC9B,KAAK,2BAA2B;GAChC,KAAK,sBAAsB;EAC7B,GAAG,KAAK,WAAW;CACrB;CA0DA,aAA6B;EAC3B,KAAK,aAAa,KAAK;EACvB,KAAK,WAAW;EAChB,KAAK,gBAAgB,SAAS;CAChC;CAEA,aAA6B;EAC3B,IAAI,MAAM,KAAK,YAAY,aAAa,KAAK,KAAK;EAClD,IAAI,KAAK,cAAc,WACrB,MAAM,IAAI,WAAW,KAAK,EAAE,CAAC,CAAC,KAAK;EAErC,KADiB,KAAK,aAAa,KAAK,kBAAkB,KAAK,IAAI,EAAA,CACtD,GAAG,GAAG;GACjB,KAAK,gBAAgB,SAAS;GAC9B,MAAM,OAAO,KAAK;GAClB,KAAK,QAAQ;GACb,KAAK,WAAW;GAChB,IAAI,QAAQ,MACV,KAAK,cAAc,IAAI,YAAuC,UAAU;IACtE,QAAQ,EAAE,OAAO,IAAI;IACrB,SAAS;IACT,UAAU;GACZ,CAAC,CAAC;EAEN,OACE,KAAK,YAAY;CAErB;CAEA,cAA8B;EAC5B,KAAK,QAAQ,KAAK;EAClB,KAAK,WAAW;EAChB,KAAK,gBAAgB,SAAS;CAChC;CAEA,kBAAoC;EAElC,IADuB,KAAK,sBACX,KAAK,KAAK,gBAAgB,KAAA,KAAa,KAAK,gBAAgB,IAC3E,OAAO,KAAK;EAEd,IAAI,CAAC,KAAK,OACR,OAAO;EACT,IAAI,KAAK,WACP,OAAO,KAAK,UAAU,KAAK,KAAK;EAClC,IAAI,KAAK,cAAc,WACrB,OAAO,GAAG,KAAK,MAAM;EACvB,OAAO,KAAK;CACd;CAEA,wBAA2C;EACzC,IAAI,KAAK,qBAAqB,UAC5B,OAAO;EACT,IAAI,KAAK,qBAAqB,YAC5B,OAAO;EACT,IAAI,KAAK,qBAAqB,QAAQ;GACpC,IAAI,KAAK,UACP,OAAO;GACT,OAAO,KAAK;EACd;EACA,IAAI,KAAK,qBAAqB,aAAa;GACzC,IAAI,KAAK,UACP,OAAO;GACT,IAAI,KAAK,wBACP,OAAO;GACT,OAAO;EACT;EACA,OAAO;CACT;CAEA,gBAA0B,MAAuB;EAC/C,QAAQ,KAAK,WAAb;GACE,KAAK,QAAQ,OAAO,aAAa,KAAK,IAAI;GAC1C,KAAK,UAAU,OAAO,YAAY,KAAK,IAAI;GAC3C,KAAK,WAAW,OAAO,WAAW,KAAK,IAAI;GAC3C,SAAS,OAAO;EAClB;CACF;CAEA,kBAA0B,OAAwB;EAChD,QAAQ,KAAK,WAAb;GACE,KAAK,QAAQ,OAAO,cAAc,KAAK,KAAK;GAC5C,KAAK,UAAU,OAAO,UAAU,MAAM,oBAAoB,KAAK,KAAK;GACpE,KAAK,WAAW,OAAO,UAAU,MAAM,kBAAkB,KAAK,KAAK;GACnE,SAAS,OAAO;EAClB;CACF;CAIA,SAAkB;EAChB,MAAM,WAAW,KAAK,SAAS;EAC/B,OAAO,IAAI;;wBAES,KAAK,WAAW,mBAAmB,QAAQ;yBAC1C,KAAK,YAAY;iBACzB,YAAY,CAAC,KAAK,WAAW,MAAM,QAAQ;eAC7C,KAAK,aAAa;eAClB,KAAK,aAAa;cACnB,KAAK,YAAY;iBACd,KAAK,eAAe;qBAChB,KAAK,mBAAmB;eAC9B,KAAK,aAAa;OAC1B,KAAK,WAAW,UAAU,KAAK,gBAAgB,EAAE;CACtD;CAEA,QAAiB,SAA+B;EAC9C,MAAM,QAAQ,OAAO;EACrB,IAAI,QAAQ,IAAI,UAAU,KAAK,KAAK,UAAU;GAC5C,MAAM,KAAK,KAAK;GAChB,IAAI,IAAI;IACN,GAAG,cAAc,KAAK;IACtB,GAAG,MAAM;IACT,WAAW,EAAE;GACf;EACF;CACF;;EAIsC,KAAA,SAAA,CAAC,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmFzD;;AACH;AApXG,WAAA,CAAA,SAAS,EAAE,SAAS,KAAK,CAAC,CAAA,GAAA,cAAA,WAAA,QAAA,KAAA,CAAA;AAC1B,WAAA,CAAA,SAAS;CAAE,WAAW;CAAc,SAAS;AAAK,CAAC,CAAA,GAAA,cAAA,WAAA,aAAA,KAAA,CAAA;AACnD,WAAA,CAAA,SAAS,EAAE,SAAS,KAAK,CAAC,CAAA,GAAA,cAAA,WAAA,SAAA,KAAA,CAAA;AAC1B,WAAA,CAAA,SAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,cAAA,WAAA,YAAA,KAAA,CAAA;AACzC,WAAA,CAAA,SAAS,CAAA,GAAA,cAAA,WAAA,eAAA,KAAA,CAAA;AAGT,WAAA,CAAA,SAAS,EAAE,WAAW,eAAe,CAAC,CAAA,GAAA,cAAA,WAAA,eAAA,KAAA,CAAA;AAStC,WAAA,CAAA,SAAS,EAAE,WAAW,qBAAqB,CAAC,CAAA,GAAA,cAAA,WAAA,oBAAA,KAAA,CAAA;AAG5C,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAe,CAAC,CAAA,GAAA,cAAA,WAAA,eAAA,KAAA,CAAA;AAGpD,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAkB,CAAC,CAAA,GAAA,cAAA,WAAA,kBAAA,KAAA,CAAA;AAGvD,WAAA,CAAA,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,cAAA,WAAA,aAAA,KAAA,CAAA;AAG7B,WAAA,CAAA,SAAS,EAAE,WAAW,MAAM,CAAC,CAAA,GAAA,cAAA,WAAA,aAAA,KAAA,CAAA;AAE7B,WAAA,CAAA,MAAM,CAAA,GAAA,cAAA,WAAA,YAAA,KAAA,CAAA;AAhCRA,gBAAAA,WAAAA,CAAAA,kBAAc,qBAAqB,CAAA,GAAA,aAAA;AAwXpC,SAAS,WAAW,IAAuB;CACzC,MAAM,QAAQ,SAAS,YAAY;CACnC,MAAM,mBAAmB,EAAE;CAC3B,MAAM,MAAM,OAAO,aAAa;CAChC,KAAK,gBAAgB;CACrB,KAAK,SAAS,KAAK;AACrB"}