@ixfx/components 0.13.3 → 0.13.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/bundle/index.d.ts +1449 -11
  2. package/bundle/index.js +1529 -45918
  3. package/bundle/rolldown-runtime-CEoa-xHZ.js +1 -0
  4. package/dist/ac-text.d.ts +2 -3
  5. package/dist/ac-text.js +0 -2
  6. package/dist/{ac-token-TCLAZeVg.d.ts → ac-token--_vCHXWw.d.ts} +2 -3
  7. package/dist/ac-token.d.ts +1 -1
  8. package/dist/ac-token.js +0 -2
  9. package/dist/button-B7mgqtxR.js +0 -2
  10. package/dist/{button-CTL45aBl.d.ts → button-BYuf72aR.d.ts} +2 -3
  11. package/dist/button.d.ts +1 -1
  12. package/dist/checkbox.d.ts +1 -2
  13. package/dist/checkbox.js +0 -2
  14. package/dist/checked-select-CglRukbP.d.ts +1 -2
  15. package/dist/checked-select-lDgAQQ7v.js +0 -2
  16. package/dist/colour-picker-BCMU7W7R.js +0 -2
  17. package/dist/colour-picker.d.ts +1 -1
  18. package/dist/crumbs.d.ts +2 -3
  19. package/dist/crumbs.js +1 -3
  20. package/dist/data-controller-DOlmqNKb.js +0 -2
  21. package/dist/data-display.d.ts +1 -2
  22. package/dist/data-display.js +0 -2
  23. package/dist/{data-grid-DHWJN66w.d.ts → data-grid-BtBZt8M1.d.ts} +5 -6
  24. package/dist/data-grid-FHr7wZ_k.js +2108 -0
  25. package/dist/data-grid.d.ts +1 -1
  26. package/dist/data-grid.js +1 -2013
  27. package/dist/data-provider-35TyWclX.js +0 -2
  28. package/dist/data-provider-BAn_-oR1.d.ts +1 -2
  29. package/dist/decorate-VRK8rslU.js +0 -2
  30. package/dist/defaults-B4ePs4LB.js +0 -2
  31. package/dist/{detail-list-C96B5Txz.js → detail-list-BfYHNh6B.js} +1 -3
  32. package/dist/{detail-list-dX7jLO6b.d.ts → detail-list-u2rWnAXQ.d.ts} +4 -5
  33. package/dist/detail-list.d.ts +2 -2
  34. package/dist/detail-list.js +1 -1
  35. package/dist/drag-ghost-DtSDvjri.js +0 -2
  36. package/dist/editable-label-rzXkjf1H.d.ts +1 -2
  37. package/dist/editable-label.js +0 -2
  38. package/dist/fallbacks-DQ_5OsmR.js +0 -2
  39. package/dist/{flat-list-Y98IqH00.d.ts → flat-list-DNnTQ65v.d.ts} +3 -4
  40. package/dist/flat-list.d.ts +1 -1
  41. package/dist/flat-list.js +0 -2
  42. package/dist/form-CsXJX15p.js +0 -2
  43. package/dist/form.d.ts +1 -2
  44. package/dist/{grid-list-CoT9e1jB.d.ts → grid-list-BLnV9oZE.d.ts} +2 -3
  45. package/dist/{grid-list-DeqAd9-h.js → grid-list-CkU8gHCh.js} +1 -3
  46. package/dist/grid-list.d.ts +1 -1
  47. package/dist/grid-list.js +1 -1
  48. package/dist/{grouped-item-lister-Bhyo-dkH.d.ts → grouped-item-lister-DETte0Dh.d.ts} +2 -3
  49. package/dist/grouped-item-lister.d.ts +1 -1
  50. package/dist/grouped-item-lister.js +0 -2
  51. package/dist/grouping-CUKgmkMm.d.ts +1 -2
  52. package/dist/grouping-RYPnHkrS.js +0 -2
  53. package/dist/handle-DAXs7kbJ.js +0 -2
  54. package/dist/hex-editor-Caq8vNQk.d.ts +1 -2
  55. package/dist/hex-editor-DiYpgIKs.js +0 -2
  56. package/dist/highlight-B-eQrhhb.js +0 -2
  57. package/dist/icon-1gpwtPx8.js +0 -2
  58. package/dist/{icon-DR_3rSyZ.d.ts → icon-CDGprSdE.d.ts} +2 -3
  59. package/dist/icons.d.ts +2 -2
  60. package/dist/icons.js +0 -2
  61. package/dist/incr-search-JIhwB49y.js +0 -2
  62. package/dist/incr-search.d.ts +1 -1
  63. package/dist/{index-Dq30pOnn.d.ts → index-B-hzcIP0.d.ts} +3 -4
  64. package/dist/{index-Dlah7Zfi.d.ts → index-BYIRgv49.d.ts} +2 -3
  65. package/dist/{index-CnQPCywE.d.ts → index-CCC0G1nO.d.ts} +2 -3
  66. package/dist/{index-garxxqgV.d.ts → index-CYndvTWH.d.ts} +2 -3
  67. package/dist/{index-BUB5SICW.d.ts → index-CoqtMSd9.d.ts} +2 -3
  68. package/dist/index-DV3iaUBW.d.ts +1 -2
  69. package/dist/{index-CJ5fshD3.d.ts → index-UvnoZUAo.d.ts} +2 -3
  70. package/dist/index-o-CWDt11.d.ts +1 -2
  71. package/dist/{index-BOUaDIW-.d.ts → index-tq6f8007.d.ts} +2 -3
  72. package/dist/index.d.ts +21 -22
  73. package/dist/index.js +4 -6
  74. package/dist/item-appearance-BjcMyauw.js +0 -2
  75. package/dist/keyboard-B5xD7Fz-.js +0 -2
  76. package/dist/labelled-input-base-BFa4xlYV.js +0 -2
  77. package/dist/{labelled-input-base-Dp_9KP0G.d.ts → labelled-input-base-DiTme1JO.d.ts} +2 -3
  78. package/dist/labelled-radial-input.d.ts +3 -4
  79. package/dist/labelled-radial-input.js +0 -2
  80. package/dist/labelled-range-input.d.ts +1 -1
  81. package/dist/labelled-range-input.js +0 -2
  82. package/dist/labelled-slider-input-FdCRi6st.js +0 -2
  83. package/dist/labelled-slider-input.d.ts +1 -1
  84. package/dist/led.d.ts +1 -2
  85. package/dist/led.js +0 -2
  86. package/dist/list-group-header.d.ts +2 -3
  87. package/dist/list-group-header.js +0 -2
  88. package/dist/list-item-animation-BUoEKi5s.js +0 -2
  89. package/dist/list-native-drag-controller-B9xO0XWn.js +0 -2
  90. package/dist/list-native-drag-controller-ChIi3eK5.d.ts +1 -2
  91. package/dist/list-selection-controller-BeE70lbB.js +0 -2
  92. package/dist/list-selection-types-PjKdhF-a.d.ts +1 -2
  93. package/dist/list-viewport-types-BRZsLcvp.d.ts +1 -2
  94. package/dist/menu-CwcXXeLM.js +0 -2
  95. package/dist/menu-item-BDEekBVy.js +0 -2
  96. package/dist/{menu-item-B0zqw2xp.d.ts → menu-item-bF6narIz.d.ts} +2 -3
  97. package/dist/menu.d.ts +2 -2
  98. package/dist/miller.d.ts +2 -3
  99. package/dist/miller.js +0 -2
  100. package/dist/narrowed-text.js +0 -2
  101. package/dist/notification-pill-DyZydXoZ.d.ts +1 -2
  102. package/dist/notifier.js +0 -2
  103. package/dist/pan-text-CoYmt2qd.d.ts +1 -2
  104. package/dist/pan-text-CqtvjPyK.js +0 -2
  105. package/dist/panel.d.ts +2 -3
  106. package/dist/panel.js +0 -2
  107. package/dist/polar-pad.d.ts +1 -2
  108. package/dist/polar-pad.js +0 -2
  109. package/dist/popup-D80sj2QC.js +0 -2
  110. package/dist/prominence-DlFShic3.js +0 -2
  111. package/dist/radial-input-DU6t2hYO.d.ts +1 -2
  112. package/dist/radial-input-KMVltQfe.js +0 -2
  113. package/dist/range-input.d.ts +1 -2
  114. package/dist/range-input.js +0 -2
  115. package/dist/range.d.ts +1 -2
  116. package/dist/range.js +0 -2
  117. package/dist/registry-BEtb8_wB.js +0 -2
  118. package/dist/{scroll-fade-BrNUIYnm.js → scroll-fade-Xx28D7mH.js} +11 -7
  119. package/dist/select-horiz.d.ts +1 -2
  120. package/dist/select-horiz.js +1 -3
  121. package/dist/slider-input-BxURAAmD.d.ts +1 -2
  122. package/dist/slider-input-ByHdotzp.js +0 -2
  123. package/dist/snackbar.d.ts +1 -2
  124. package/dist/snackbar.js +0 -2
  125. package/dist/snap-container.d.ts +1 -2
  126. package/dist/snap-container.js +0 -2
  127. package/dist/split-layout-Deoxy47d.js +0 -2
  128. package/dist/{split-layout-C5SYbDrq.d.ts → split-layout-JK3xWVX2.d.ts} +2 -3
  129. package/dist/split-layout.d.ts +1 -1
  130. package/dist/swipe.d.ts +1 -2
  131. package/dist/swipe.js +0 -2
  132. package/dist/{tab-list-D_dmImJM.d.ts → tab-list-CexFFg6O.d.ts} +2 -3
  133. package/dist/tabs.d.ts +1 -1
  134. package/dist/tabs.js +1 -3
  135. package/dist/tickled-controller-D-HZymaZ.js +0 -2
  136. package/dist/tickled-controller-DodxD3eQ.d.ts +1 -2
  137. package/dist/tickled-styles-BrAHEj1q.js +0 -2
  138. package/dist/timeline-BP1Ux2EV.js +0 -2
  139. package/dist/{titlebar-B5zSTZnF.d.ts → titlebar-Tqu-VvMU.d.ts} +2 -3
  140. package/dist/titlebar.d.ts +1 -1
  141. package/dist/titlebar.js +0 -2
  142. package/dist/tooltip-BlvBUQxx.d.ts +1 -2
  143. package/dist/tooltip-CJt3WLmN.js +0 -2
  144. package/dist/transitory-label.d.ts +1 -2
  145. package/dist/transitory-label.js +0 -2
  146. package/dist/tree-DD8OaqsK.js +0 -2
  147. package/dist/tree-component-Cj8V3uar.d.ts +1 -2
  148. package/dist/tree.d.ts +1 -1
  149. package/dist/types-DQ7KOUIj.d.ts +1 -2
  150. package/dist/{vertical-list-lj_19DCx.d.ts → vertical-list-m7GJtXwv.d.ts} +2 -3
  151. package/dist/vertical-list.d.ts +1 -1
  152. package/dist/vertical-list.js +1 -3
  153. package/dist/wheel-nudge-By5s_ioH.d.ts +1 -2
  154. package/dist/wheel-nudge-D5rmht3v.js +0 -2
  155. package/dist/xy-axis-CyMd_Bn1.js +0 -2
  156. package/dist/xy-axis-DQqd2yXJ.d.ts +1 -2
  157. package/dist/xy-pad.d.ts +1 -2
  158. package/dist/xy-pad.js +0 -2
  159. package/docs-user/index.json +2 -2
  160. package/package.json +1 -1
  161. package/bundle/index.d.ts.map +0 -1
  162. package/bundle/index.js.map +0 -1
  163. package/bundle/rolldown-runtime-D7D4PA-g.js +0 -13
  164. package/dist/ac-text.d.ts.map +0 -1
  165. package/dist/ac-text.js.map +0 -1
  166. package/dist/ac-token-TCLAZeVg.d.ts.map +0 -1
  167. package/dist/ac-token.js.map +0 -1
  168. package/dist/button-B7mgqtxR.js.map +0 -1
  169. package/dist/button-CTL45aBl.d.ts.map +0 -1
  170. package/dist/checkbox.d.ts.map +0 -1
  171. package/dist/checkbox.js.map +0 -1
  172. package/dist/checked-select-CglRukbP.d.ts.map +0 -1
  173. package/dist/checked-select-lDgAQQ7v.js.map +0 -1
  174. package/dist/colour-picker-BCMU7W7R.js.map +0 -1
  175. package/dist/crumbs.d.ts.map +0 -1
  176. package/dist/crumbs.js.map +0 -1
  177. package/dist/data-controller-DOlmqNKb.js.map +0 -1
  178. package/dist/data-display.d.ts.map +0 -1
  179. package/dist/data-display.js.map +0 -1
  180. package/dist/data-grid-DHWJN66w.d.ts.map +0 -1
  181. package/dist/data-grid.js.map +0 -1
  182. package/dist/data-provider-35TyWclX.js.map +0 -1
  183. package/dist/data-provider-BAn_-oR1.d.ts.map +0 -1
  184. package/dist/decorate-VRK8rslU.js.map +0 -1
  185. package/dist/defaults-B4ePs4LB.js.map +0 -1
  186. package/dist/detail-list-C96B5Txz.js.map +0 -1
  187. package/dist/detail-list-dX7jLO6b.d.ts.map +0 -1
  188. package/dist/drag-ghost-DtSDvjri.js.map +0 -1
  189. package/dist/editable-label-rzXkjf1H.d.ts.map +0 -1
  190. package/dist/editable-label.js.map +0 -1
  191. package/dist/fallbacks-DQ_5OsmR.js.map +0 -1
  192. package/dist/flat-list-Y98IqH00.d.ts.map +0 -1
  193. package/dist/flat-list.js.map +0 -1
  194. package/dist/form-CsXJX15p.js.map +0 -1
  195. package/dist/form.d.ts.map +0 -1
  196. package/dist/grid-list-CoT9e1jB.d.ts.map +0 -1
  197. package/dist/grid-list-DeqAd9-h.js.map +0 -1
  198. package/dist/grouped-item-lister-Bhyo-dkH.d.ts.map +0 -1
  199. package/dist/grouped-item-lister.js.map +0 -1
  200. package/dist/grouping-CUKgmkMm.d.ts.map +0 -1
  201. package/dist/grouping-RYPnHkrS.js.map +0 -1
  202. package/dist/handle-DAXs7kbJ.js.map +0 -1
  203. package/dist/hex-editor-Caq8vNQk.d.ts.map +0 -1
  204. package/dist/hex-editor-DiYpgIKs.js.map +0 -1
  205. package/dist/highlight-B-eQrhhb.js.map +0 -1
  206. package/dist/icon-1gpwtPx8.js.map +0 -1
  207. package/dist/icon-DR_3rSyZ.d.ts.map +0 -1
  208. package/dist/icons.js.map +0 -1
  209. package/dist/incr-search-JIhwB49y.js.map +0 -1
  210. package/dist/index-BOUaDIW-.d.ts.map +0 -1
  211. package/dist/index-BUB5SICW.d.ts.map +0 -1
  212. package/dist/index-CJ5fshD3.d.ts.map +0 -1
  213. package/dist/index-CnQPCywE.d.ts.map +0 -1
  214. package/dist/index-DV3iaUBW.d.ts.map +0 -1
  215. package/dist/index-Dlah7Zfi.d.ts.map +0 -1
  216. package/dist/index-Dq30pOnn.d.ts.map +0 -1
  217. package/dist/index-garxxqgV.d.ts.map +0 -1
  218. package/dist/index-o-CWDt11.d.ts.map +0 -1
  219. package/dist/index.d.ts.map +0 -1
  220. package/dist/index.js.map +0 -1
  221. package/dist/item-appearance-BjcMyauw.js.map +0 -1
  222. package/dist/keyboard-B5xD7Fz-.js.map +0 -1
  223. package/dist/labelled-input-base-BFa4xlYV.js.map +0 -1
  224. package/dist/labelled-input-base-Dp_9KP0G.d.ts.map +0 -1
  225. package/dist/labelled-radial-input.d.ts.map +0 -1
  226. package/dist/labelled-radial-input.js.map +0 -1
  227. package/dist/labelled-range-input.js.map +0 -1
  228. package/dist/labelled-slider-input-FdCRi6st.js.map +0 -1
  229. package/dist/led.d.ts.map +0 -1
  230. package/dist/led.js.map +0 -1
  231. package/dist/list-group-header.d.ts.map +0 -1
  232. package/dist/list-group-header.js.map +0 -1
  233. package/dist/list-item-animation-BUoEKi5s.js.map +0 -1
  234. package/dist/list-native-drag-controller-B9xO0XWn.js.map +0 -1
  235. package/dist/list-native-drag-controller-ChIi3eK5.d.ts.map +0 -1
  236. package/dist/list-selection-controller-BeE70lbB.js.map +0 -1
  237. package/dist/list-selection-types-PjKdhF-a.d.ts.map +0 -1
  238. package/dist/list-viewport-types-BRZsLcvp.d.ts.map +0 -1
  239. package/dist/menu-CwcXXeLM.js.map +0 -1
  240. package/dist/menu-item-B0zqw2xp.d.ts.map +0 -1
  241. package/dist/menu-item-BDEekBVy.js.map +0 -1
  242. package/dist/miller.d.ts.map +0 -1
  243. package/dist/miller.js.map +0 -1
  244. package/dist/narrowed-text.js.map +0 -1
  245. package/dist/notification-pill-DyZydXoZ.d.ts.map +0 -1
  246. package/dist/notifier.js.map +0 -1
  247. package/dist/pan-text-CoYmt2qd.d.ts.map +0 -1
  248. package/dist/pan-text-CqtvjPyK.js.map +0 -1
  249. package/dist/panel.d.ts.map +0 -1
  250. package/dist/panel.js.map +0 -1
  251. package/dist/polar-pad.d.ts.map +0 -1
  252. package/dist/polar-pad.js.map +0 -1
  253. package/dist/popup-D80sj2QC.js.map +0 -1
  254. package/dist/prominence-DlFShic3.js.map +0 -1
  255. package/dist/radial-input-DU6t2hYO.d.ts.map +0 -1
  256. package/dist/radial-input-KMVltQfe.js.map +0 -1
  257. package/dist/range-input.d.ts.map +0 -1
  258. package/dist/range-input.js.map +0 -1
  259. package/dist/range.d.ts.map +0 -1
  260. package/dist/range.js.map +0 -1
  261. package/dist/registry-BEtb8_wB.js.map +0 -1
  262. package/dist/scroll-fade-BrNUIYnm.js.map +0 -1
  263. package/dist/select-horiz.d.ts.map +0 -1
  264. package/dist/select-horiz.js.map +0 -1
  265. package/dist/slider-input-BxURAAmD.d.ts.map +0 -1
  266. package/dist/slider-input-ByHdotzp.js.map +0 -1
  267. package/dist/snackbar.d.ts.map +0 -1
  268. package/dist/snackbar.js.map +0 -1
  269. package/dist/snap-container.d.ts.map +0 -1
  270. package/dist/snap-container.js.map +0 -1
  271. package/dist/split-layout-C5SYbDrq.d.ts.map +0 -1
  272. package/dist/split-layout-Deoxy47d.js.map +0 -1
  273. package/dist/swipe.d.ts.map +0 -1
  274. package/dist/swipe.js.map +0 -1
  275. package/dist/tab-list-D_dmImJM.d.ts.map +0 -1
  276. package/dist/tabs.js.map +0 -1
  277. package/dist/tickled-controller-D-HZymaZ.js.map +0 -1
  278. package/dist/tickled-controller-DodxD3eQ.d.ts.map +0 -1
  279. package/dist/tickled-styles-BrAHEj1q.js.map +0 -1
  280. package/dist/timeline-BP1Ux2EV.js.map +0 -1
  281. package/dist/titlebar-B5zSTZnF.d.ts.map +0 -1
  282. package/dist/titlebar.js.map +0 -1
  283. package/dist/tooltip-BlvBUQxx.d.ts.map +0 -1
  284. package/dist/tooltip-CJt3WLmN.js.map +0 -1
  285. package/dist/transitory-label.d.ts.map +0 -1
  286. package/dist/transitory-label.js.map +0 -1
  287. package/dist/tree-DD8OaqsK.js.map +0 -1
  288. package/dist/tree-component-Cj8V3uar.d.ts.map +0 -1
  289. package/dist/types-DQ7KOUIj.d.ts.map +0 -1
  290. package/dist/vertical-list-lj_19DCx.d.ts.map +0 -1
  291. package/dist/vertical-list.js.map +0 -1
  292. package/dist/wheel-nudge-By5s_ioH.d.ts.map +0 -1
  293. package/dist/wheel-nudge-D5rmht3v.js.map +0 -1
  294. package/dist/xy-axis-CyMd_Bn1.js.map +0 -1
  295. package/dist/xy-axis-DQqd2yXJ.d.ts.map +0 -1
  296. package/dist/xy-pad.d.ts.map +0 -1
  297. package/dist/xy-pad.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"slider-input-ByHdotzp.js","names":["#currentCrossPx","#currentLongPx","#onKeyDown","#ensureUserGradientDefs","#applySwipeFromPointer","#relativeFromTrackPos","#lastInteractedHandle","#dragHandle","#setSingleValueFromRelative","#dragging","#activePointerId","#dragStartClientPos","#poleValueAtDragStart","#onPointerMove","#onPointerUp","#getRelativeValueA","#getRelativeValueB","#poleA","#poleB","#getRelativeValueC","#lowKey","#highKey","#lengthDragStart","#lengthDragLowKey","#lengthDragHighKey","#lengthDragLength","#lengthDragStartLow","#lengthDragStartRelative","#setDualOrTripleValueFromRelative","#applyLengthDragFromRelative","#onPointerMoveCursor","#lastPointerClient","#poleC","#low","#stepHandleByRelativeDelta","#cursorAtRelative","#lanes","#onHostKeyDown","#onSwipePointerDown","#onSwipePointerMove","#onSwipePointerEnter","#syncGradientDefs","#gradientObserver","#sizeObserver","#onHostResize","#userGradientDefs","#quantise","#isUserInteraction","#applySingleStyleValueLane","#emitInputAndChange","#resolvePoleChange","#poles","#syncPoleProperties","#detectChanged","#high","#hasInitialisedValueC","#getEffectiveValueMin","#buildInputDetail","#buildChangeDetail","#scheduleChangeEvent","#fireChangeEvent","#changeDebounceTimer","#laneWidthNumber","#currentLanePxMax","#getCssVar","#dotRadiusPx","#dotRadiusFraction","#activeMarkerStyles","#contentFraction","#currentInsetStart","#currentInsetEnd","#relativeFromSwipePointer","#currentCross","#getCssVarColor","#laneStrokePx","#circleRadiiUnits","#measureLanes","#computeCross","#computeInsets","#isMultiHandle","#renderHandleGroup","#renderValueMarker","#viewBox","#onPointerDown","#onPointerLeaveCursor","#onFocusIn","#renderTrack","#renderLane","#renderMidpointMarker","customElement"],"sources":["../src/slider-input/svg-utils.ts","../src/slider-input/slider-input.ts"],"sourcesContent":["/**\n * SVG utilities for the slider-input component.\n * Linear track geometry helpers (mirrors radial-input's svg-utils for arc maths).\n */\n\nimport type { SliderOrientation, SliderSingleStyle } from './types.js';\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n/**\n * Track geometry in viewBox units.\n * Horizontal: trackStart = insetStart, trackEnd = 100 - insetEnd (along x).\n * Vertical: trackStart = insetStart, trackEnd = 100 - insetEnd (along y,\n * top = high). \"Start\" is the low-value end (left / bottom).\n */\nexport interface TrackBounds {\n trackStart: number;\n trackEnd: number;\n /** Centre along the long axis (midpoint of the drawn track span). */\n centre: number;\n /** Cross-axis size of the viewBox (dynamic per instance; CROSS is the legacy default). */\n cross: number;\n /** Centre along the cross axis (cross / 2). */\n crossCentre: number;\n}\n\nexport const INSET = 5;\nexport const LONG = 100;\nexport const CROSS = 24;\n\n/**\n * Get the track bounds in viewBox units for a given orientation.\n *\n * `cross` is the dynamic cross-axis size (see `SliderInputElement`'s\n * cross computation); `insetStart`/`insetEnd` are the long-axis end\n * paddings (low-value end / high-value end). LONG stays fixed at 100.\n */\nexport function getTrackBounds(\n orientation: SliderOrientation,\n cross: number = CROSS,\n insetStart: number = INSET,\n insetEnd: number = INSET,\n): TrackBounds {\n const trackStart = insetStart;\n const trackEnd = LONG - insetEnd;\n if (orientation === `horizontal`) {\n return {\n trackStart,\n trackEnd,\n centre: (trackStart + trackEnd) / 2,\n cross,\n crossCentre: cross / 2,\n };\n }\n // Vertical: viewBox is 0 0 cross LONG; the track runs along the y axis from\n // insetStart to LONG-insetEnd. `centre` is the middle of the drawn track\n // span; `crossCentre` is the middle of the cross (x) axis.\n return {\n trackStart,\n trackEnd,\n centre: (trackStart + trackEnd) / 2,\n cross,\n crossCentre: cross / 2,\n };\n}\n\n/**\n * Map a relative value (0..1) to a leader point on the track for the given\n * orientation and single-style.\n *\n * Range: grows from trackStart to trackEnd.\n * Bipolar: track centre is 0.5; values spread from centre outward.\n * Unipolar: spread symmetrically around centre.\n *\n * For vertical orientation, higher values are toward the top of the track,\n * matching the spec (\"higher values → top of track\").\n */\nexport function valueToPosition(\n relativeValue: number,\n singleStyle: SliderSingleStyle,\n trackBounds: TrackBounds,\n orientation: SliderOrientation,\n): Point {\n const span = trackBounds.trackEnd - trackBounds.trackStart;\n const centre = trackBounds.centre;\n const crossCentre = trackBounds.crossCentre;\n\n let pos: number;\n if (singleStyle === `range`) {\n pos = trackBounds.trackStart + relativeValue * span;\n } else if (singleStyle === `bipolar`) {\n // Mid (0.5) -> centre; <0.5 below centre, >0.5 above.\n if (relativeValue <= 0.5) {\n const t = relativeValue / 0.5;\n pos = trackBounds.trackStart + t * (centre - trackBounds.trackStart);\n } else {\n const t = (relativeValue - 0.5) / 0.5;\n pos = centre + t * (trackBounds.trackEnd - centre);\n }\n } else {\n // unipolar: spread symmetrically around centre\n const halfLen = (relativeValue * span) / 2;\n pos = centre + halfLen;\n }\n\n if (orientation === `horizontal`) {\n return { x: pos, y: crossCentre };\n }\n // Vertical: higher values toward top (smaller y). `pos` is a value along the\n // long axis (0..LONG), so the SVG y coordinate (0 at top) is LONG - pos.\n return { x: crossCentre, y: LONG - pos };\n}\n\n/**\n * Get the segment endpoints for a 'value' lane. The lane is drawn from\n * the lane's lower relative value to its upper relative value.\n *\n * For 'range' and 'bipolar' styles, the endpoints are obtained by mapping\n * each value through `valueToPosition`. For 'unipolar', the bar is centred\n * on the track centre with length proportional to valueMax (valueMin is\n * ignored), matching the spec: \"spreads symmetrically around centre\".\n */\nexport function getValueSegment(\n valueMin: number,\n valueMax: number,\n singleStyle: SliderSingleStyle,\n trackBounds: TrackBounds,\n orientation: SliderOrientation,\n): { start: Point; end: Point } {\n if (singleStyle === `unipolar`) {\n const span = trackBounds.trackEnd - trackBounds.trackStart;\n const centre = trackBounds.centre;\n const crossCentre = trackBounds.crossCentre;\n const halfLen = (valueMax * span) / 2;\n if (orientation === `horizontal`) {\n return {\n start: { x: centre - halfLen, y: crossCentre },\n end: { x: centre + halfLen, y: crossCentre },\n };\n }\n // Vertical: spread the bar symmetrically around the track centre along y.\n return {\n start: { x: crossCentre, y: centre - halfLen },\n end: { x: crossCentre, y: centre + halfLen },\n };\n }\n\n return {\n start: valueToPosition(valueMin, singleStyle, trackBounds, orientation),\n end: valueToPosition(valueMax, singleStyle, trackBounds, orientation),\n };\n}\n\n/**\n * Get the segment endpoints for an 'anchored' lane. The lane is centered\n * on the current value, with length controlled by laneValue (0..1).\n */\nexport function getAnchoredSegment(\n relativeValue: number,\n laneValue: number,\n singleStyle: SliderSingleStyle,\n trackBounds: TrackBounds,\n orientation: SliderOrientation,\n): { start: Point; end: Point } {\n const span = trackBounds.trackEnd - trackBounds.trackStart;\n const halfLen = (laneValue * span) / 2;\n\n // For unipolar, the value represents the size of a bar centred on the track\n // centre, not a spatial position. Anchor the lane to the track centre so it\n // follows the value's \"magnitude\" rather than the bar's right-end.\n // Mirrors radial-input's getAnchoredArcAngles for unipolar.\n // `centre.x` is along the track axis; `centre.y` is perpendicular. For\n // horizontal that's (LONG/2, cross/2); for vertical that's (cross/2, LONG/2).\n const centre = singleStyle === `unipolar`\n ? (orientation === `horizontal`\n ? { x: trackBounds.centre, y: trackBounds.crossCentre }\n : { x: trackBounds.crossCentre, y: trackBounds.centre })\n : valueToPosition(relativeValue, singleStyle, trackBounds, orientation);\n\n // Compute along-axis offsets\n let startPos: number;\n let endPos: number;\n if (orientation === `horizontal`) {\n startPos = centre.x - halfLen;\n endPos = centre.x + halfLen;\n } else {\n startPos = centre.y - halfLen;\n endPos = centre.y + halfLen;\n }\n\n const start = orientation === `horizontal`\n ? { x: startPos, y: centre.y }\n : { x: centre.x, y: startPos };\n const end = orientation === `horizontal`\n ? { x: endPos, y: centre.y }\n : { x: centre.x, y: endPos };\n return { start, end };\n}\n\n/**\n * Generate an SVG path string for a straight line. Returns '' for a\n * zero-length segment (start ≈ end), mirroring the radial-input arc\n * helper's edge case.\n */\nexport function generateLinePath(start: Point, end: Point): string {\n if (Math.abs(start.x - end.x) < 0.001 && Math.abs(start.y - end.y) < 0.001) {\n return ``;\n }\n return `M ${start.x} ${start.y} L ${end.x} ${end.y}`;\n}\n\n/**\n * Generate a closed SVG `<path>` for a filled rectangle (used for filled\n * lane segments). `halfWidth` is the perpendicular half-thickness; `perpOffset`\n * shifts the rect perpendicularly from the track centreline.\n */\nexport function generateRectPath(\n start: Point,\n end: Point,\n halfWidth: number,\n perpOffset: number,\n orientation: SliderOrientation,\n): string {\n // Direction vector along the track\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len < 0.001)\n return ``;\n\n // Unit perpendicular\n const perpX = -dy / len;\n const perpY = dx / len;\n\n // Inset corners slightly so the rect's ends don't extend past the start/end\n const insetX = (dx / len) * halfWidth;\n const insetY = (dy / len) * halfWidth;\n\n const sIn = { x: start.x + insetX, y: start.y + insetY };\n const eIn = { x: end.x - insetX, y: end.y - insetY };\n\n const c1 = { x: sIn.x + perpX * (halfWidth + perpOffset), y: sIn.y + perpY * (halfWidth + perpOffset) };\n const c2 = { x: eIn.x + perpX * (halfWidth + perpOffset), y: eIn.y + perpY * (halfWidth + perpOffset) };\n const c3 = { x: eIn.x + perpX * (-halfWidth + perpOffset), y: eIn.y + perpY * (-halfWidth + perpOffset) };\n const c4 = { x: sIn.x + perpX * (-halfWidth + perpOffset), y: sIn.y + perpY * (-halfWidth + perpOffset) };\n\n // Silence unused-orientation warning — kept for API parity\n void orientation;\n\n return `M ${c1.x} ${c1.y} L ${c2.x} ${c2.y} L ${c3.x} ${c3.y} L ${c4.x} ${c4.y} Z`;\n}\n\n/**\n * Clamp `value` to the [min, max] range.\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Linear-reinterpolate `value` from [fromMin, fromMax] to [toMin, toMax].\n */\nexport function scale(\n value: number,\n fromMin: number,\n fromMax: number,\n toMin: number,\n toMax: number,\n): number {\n if (fromMax === fromMin)\n return toMin;\n const normalized = (value - fromMin) / (fromMax - fromMin);\n return toMin + normalized * (toMax - toMin);\n}\n\n/**\n * Convert a relative value (0..1) to an absolute value in the min..max range.\n */\nexport function relativeToValue(\n relativeValue: number,\n min: number,\n max: number,\n): number {\n return scale(relativeValue, 0, 1, min, max);\n}\n\n/**\n * Convert an absolute value to a relative (0..1) position.\n */\nexport function valueToRelative(\n value: number,\n min: number,\n max: number,\n): number {\n return scale(value, min, max, 0, 1);\n}\n\n/**\n * Convert a pointer client position (clientX or clientY depending on\n * orientation) to a relative value (0..1) given the host element's\n * bounding rect on the long axis.\n */\nexport function clientPosToRelative(\n clientPos: number,\n hostStart: number,\n hostSize: number,\n): number {\n if (hostSize <= 0)\n return 0;\n return clamp((clientPos - hostStart) / hostSize, 0, 1);\n}\n\n/**\n * Inverse: relative value (0..1) → client position offset from host start.\n */\nexport function relativeToClientPos(\n relativeValue: number,\n hostStart: number,\n hostSize: number,\n): number {\n return hostStart + relativeValue * hostSize;\n}\n","/* eslint-disable ts/no-unsafe-declaration-merging */\n/**\n * <ixfx-slider-input> — linear SVG-based slider.\n *\n * Mirrors `ixfx-radial-input` as closely as possible, swapping arc geometry\n * for a linear track. Supports horizontal and vertical orientations, three\n * value modes (single/dual/triple), triple-segment \"value\" lanes, and\n * `value-drag` length-drag gestures for dual/triple modes.\n *\n * Attributes / properties\n * value-a, value-b, value-c — primary/secondary/tertiary handle values\n * min, max — value range\n * step, stops — keyboard/wheel/pointer step resolution\n * value-mode — 'single' | 'dual' | 'triple'\n * single-style — 'range' | 'bipolar' | 'unipolar' (single mode only)\n * orientation — 'horizontal' | 'vertical'\n * marker-style — 'needle' | 'dot' | 'none'\n * crossover — 'none' | 'allow' (dual/triple modes)\n * value-drag — 'none' | 'stop' | 'flex' (dual/triple modes)\n * value-min — minimum gap between A and B (dual/triple modes)\n * disabled — boolean\n * lighttouch — boolean — wheel adjusts value on hover instead of requiring focus\n * swipeable — boolean — swipe-to-draw gesture (no pointer capture,\n * enter/move with buttons pressed sets value, for\n * step-sequencer layouts; mirrors ixfx-range-input)\n *\n * Events\n * input — fires continuously during user interaction\n * change — debounced 150ms after interaction; immediate for programmatic\n *\n * Mouse wheel (via WheelNudgeMixin): up = increase, down = decrease. In multi-handle\n * modes wheel targets the last-interacted-with handle (focus or pointerdown).\n * Shift+wheel halves the step. See docs/infra-mousewheel.md.\n */\nimport type { PropertyValues } from 'lit';\nimport type { WheelDirection } from '../mixins/wheel-nudge.js';\nimport type { Point } from './svg-utils.js';\nimport type {\n SliderChangedField,\n SliderCrossover,\n SliderHandleKey,\n SliderInputChangeDetail,\n SliderInputElementEventMap,\n SliderInputInputDetail,\n SliderLaneData,\n SliderLaneType,\n SliderMarkerStyle,\n SliderOrientation,\n SliderSingleStyle,\n SliderValueCFollow,\n SliderValueDrag,\n SliderValueMode,\n} from './types.js';\nimport { css, html, LitElement, svg } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { resolveAxisStep } from '../keyboard.js';\nimport { WheelNudgeMixin } from '../mixins/wheel-nudge.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { prominenceStyles } from '../styles/prominence.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport {\n clamp,\n CROSS,\n generateLinePath,\n getAnchoredSegment,\n getTrackBounds,\n getValueSegment,\n INSET,\n LONG,\n scale,\n valueToPosition,\n valueToRelative,\n} from './svg-utils.js';\n\nconst HANDLE_HIT_RADIUS = 0.06;\nconst DEFAULT_VALUE_MIN_FRACTION = 0.01;\nconst CHANGE_DEBOUNCE_MS = 150;\n\n/**\n * Evaluate a simple arithmetic expression (decimal numbers, `+ - * /` and\n * parentheses). Returns `undefined` when the string contains anything else.\n * Used for CSS `calc()`-derived values — a safe substitute for `new Function`.\n */\nfunction evaluateArithmetic(source: string): number | undefined {\n let pos = 0;\n\n const skipSpaces = (): void => {\n while (pos < source.length) {\n const c = source[pos];\n if (c !== ` ` && c !== `\\t` && c !== `\\n` && c !== `\\r`)\n break;\n pos++;\n }\n };\n\n // Function declarations (hoisted): the grammar is mutually recursive\n // (`(` sum `)` inside factor), which const arrows cannot express in order.\n function parseNumber(): number | undefined {\n skipSpaces();\n // Disjoint alternatives (leading digit vs leading dot) so the branches\n // cannot exchange characters while backtracking.\n const match = /^(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?/i.exec(source.slice(pos));\n if (!match)\n return undefined;\n pos += match[0].length;\n return Number.parseFloat(match[0]);\n }\n\n function parseFactor(): number | undefined {\n skipSpaces();\n const c = source[pos];\n if (c === `+` || c === `-`) {\n pos++;\n const value = parseFactor();\n return value === undefined ? undefined : c === `-` ? -value : value;\n }\n if (c === `(`) {\n pos++;\n const value = parseSum();\n if (value === undefined)\n return undefined;\n skipSpaces();\n if (source[pos] !== `)`)\n return undefined;\n pos++;\n return value;\n }\n return parseNumber();\n }\n\n function parseProduct(): number | undefined {\n let value = parseFactor();\n if (value === undefined)\n return undefined;\n while (true) {\n skipSpaces();\n const op = source[pos];\n if (op !== `*` && op !== `/`)\n return value;\n pos++;\n const rhs = parseFactor();\n if (rhs === undefined)\n return undefined;\n value = op === `*` ? value * rhs : value / rhs;\n }\n }\n\n function parseSum(): number | undefined {\n let value = parseProduct();\n if (value === undefined)\n return undefined;\n while (true) {\n skipSpaces();\n const op = source[pos];\n if (op !== `+` && op !== `-`)\n return value;\n pos++;\n const rhs = parseProduct();\n if (rhs === undefined)\n return undefined;\n value = op === `+` ? value + rhs : value - rhs;\n }\n }\n\n const value = parseSum();\n if (value === undefined)\n return undefined;\n skipSpaces();\n return pos === source.length ? value : undefined;\n}\n\n@customElement(`ixfx-slider-input`)\nexport class SliderInputElement extends WheelNudgeMixin(LitElement) {\n // ─── Public properties ───────────────────────────────────────────────\n @property({ type: Number, attribute: `value-a` })\n valueA = 50;\n\n @property({ type: Number, attribute: `value-b` })\n valueB = 0;\n\n /**\n * Triple-mode middle handle. `undefined` until first willUpdate, then\n * defaulted to the midpoint of valueA/valueB (matching radial-input's\n * deferred lane-correction pattern).\n */\n @property({ type: Number, attribute: `value-c` })\n valueC: number | undefined = undefined;\n\n @property({ type: Number })\n min = 0;\n\n @property({ type: Number })\n max = 100;\n\n @property({ type: Number })\n step: number | undefined = undefined;\n\n @property({ type: Number })\n stops: number | undefined = undefined;\n\n @property({ type: String, attribute: `value-mode` })\n valueMode: SliderValueMode = `single`;\n\n @property({ type: String, attribute: `single-style` })\n singleStyle: SliderSingleStyle = `range`;\n\n @property({ type: String })\n orientation: SliderOrientation = `horizontal`;\n\n @property({ type: String, attribute: `marker-style` })\n markerStyle: SliderMarkerStyle = `needle`;\n\n /**\n * Optional marker-style override for the C handle in triple mode. Lets\n * consumers give C a different shape (e.g. dot) from the global\n * `markerStyle` applied to A/B.\n */\n @property({ type: String, attribute: `marker-style-c` })\n markerStyleC: SliderMarkerStyle | undefined = undefined;\n\n @property({ type: String })\n crossover: SliderCrossover = `allow`;\n\n @property({ type: String, attribute: `value-drag` })\n valueDrag: SliderValueDrag = `none`;\n\n /**\n * In triple mode, how the C handle reacts when A or B moves the [A, B]\n * band. `none` (default): C keeps its value unless pushed outside the\n * new band. `proportional`: C is re-anchored at the same fractional\n * position it had within the *old* band, so it moves with A/B.\n */\n @property({ type: String, attribute: `value-c-follow` })\n valueCFollow: SliderValueCFollow = `none`;\n\n @property({ type: Number, attribute: `value-min` })\n valueMin = 1;\n\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /**\n * Swipe-to-draw gesture, mirroring `ixfx-range-input[swipeable]`.\n * When active, pressing down on the slider or entering it while the\n * pointer is pressed sets the value from the cursor coordinate.\n * Pointer capture is NOT held, so the cursor can move to adjacent\n * swipeable sliders and update them too (step-sequencer style).\n * Leaving the slider (above/below for horizontal, left/right for\n * vertical) freezes the value; re-entering re-engages.\n *\n * Single mode sets value-A directly. Dual/triple modes move the\n * nearest handle to the cursor.\n */\n @property({ type: Boolean, reflect: true })\n swipeable = false;\n\n // ─── Internal state ──────────────────────────────────────────────────\n #lanes: Map<string, SliderLaneData> = new Map();\n\n /** Raw pole values: independent of which is \"low\" or \"high\". */\n #poleA = 50;\n #poleB = 0;\n #poleC: number | undefined = undefined;\n\n #dragging = false;\n /** Pointer ID being tracked (fixes radial-input's hardcoded pointerId). */\n #activePointerId: number | undefined = undefined;\n #dragStartClientPos = 0;\n #poleValueAtDragStart = 0;\n /** Which handle is currently being dragged, or 'length' for segment drag. */\n #dragHandle: SliderHandleKey | `length` | undefined = undefined;\n /** Snapshotted poles at length-drag start. */\n #lengthDragStart: { poleA: number; poleB: number } | undefined = undefined;\n /** Track the low/high identity at length-drag start (so we know which raw pole gets which end). */\n #lengthDragLowKey: SliderHandleKey | undefined = undefined;\n #lengthDragHighKey: SliderHandleKey | undefined = undefined;\n #lengthDragLength = 0;\n #lengthDragStartLow = 0;\n /**\n * Where the pointer was when the length drag began (in host-relative\n * 0..1 terms). Preserves the grab offset so dragging the bar doesn't snap\n * its low edge under the cursor.\n */\n #lengthDragStartRelative = 0;\n\n /** The handle that last received direct interaction (pointerdown/keydown/wheel/focus). */\n #lastInteractedHandle: SliderHandleKey = `a`;\n\n /**\n * Last pointer client position seen by #onPointerMoveCursor, used to\n * recompute the cursor after a drag ends (without waiting for a fresh\n * pointermove).\n */\n #lastPointerClient = { x: 0, y: 0 };\n\n #changeDebounceTimer: number | undefined = undefined;\n #isUserInteraction = false;\n #hasInitialisedValueC = false;\n\n /**\n * Holds `<linearGradient>`/`<radialGradient>` elements authored as light-DOM\n * children of this element, once relocated into the shadow root (see\n * `#syncGradientDefs`). Lets consumers reference `url(#id)` paint servers\n * from `--lane-*-color` / `--track-color` etc. — CSS custom properties\n * pierce the shadow boundary, but `url(#id)` paint-server *resolution* does\n * not, so the gradient definitions themselves must physically live inside\n * this element's shadow root to be resolvable by lanes/track painted there.\n */\n #userGradientDefs: SVGDefsElement | undefined;\n #gradientObserver: MutationObserver | undefined;\n /**\n * Lane strokes are resolved to screen px per render (see #laneStrokePx), so\n * a host resize must re-render to keep them (and the measured box) exact.\n */\n #sizeObserver: ResizeObserver | undefined;\n\n // ─── Construction ───────────────────────────────────────────────────\n constructor() {\n super();\n // Make the host focusable so users can Tab to the slider. The actual\n // focus indicator + keyboard listener are on the inner <svg> (which\n // sits inside the shadow DOM), but the host needs an HTML tabindex\n // attribute to be reachable from the document's tab order.\n if (!this.disabled) {\n this.setAttribute(`tabindex`, `0`);\n }\n this.#lanes.set(`track`, {\n key: `track`,\n value: 1,\n type: `fixed`,\n offset: 0,\n width: 0.16,\n });\n this.#lanes.set(`value`, {\n key: `value`,\n valueMin: 0,\n valueMax: 0,\n type: `value`,\n offset: 0,\n width: 0.24,\n });\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.setAttribute(`tabindex`, this.disabled ? `-1` : `0`);\n // Listen for keydown on the host itself (in addition to the SVG in\n // shadow DOM) so the keyboard handler fires when the host has focus\n // from Tab navigation. The host is the focusable element (via its\n // tabindex attribute set in the constructor); events fired while the\n // host is focused don't reach the inner <svg>'s lit listener.\n this.addEventListener(`keydown`, this.#onHostKeyDown as EventListener);\n this.addEventListener(`pointerdown`, this.#onSwipePointerDown as EventListener);\n this.addEventListener(`pointermove`, this.#onSwipePointerMove as EventListener);\n this.addEventListener(`pointerenter`, this.#onSwipePointerEnter as EventListener);\n this.#syncGradientDefs();\n this.#gradientObserver = new MutationObserver(this.#syncGradientDefs);\n this.#gradientObserver.observe(this, { childList: true, subtree: true });\n this.#sizeObserver = new ResizeObserver(this.#onHostResize);\n this.#sizeObserver.observe(this);\n }\n\n #onHostResize = (): void => {\n const rect = this.getBoundingClientRect();\n const crossPx = this.orientation === `vertical` ? rect.width : rect.height;\n const longPx = this.orientation === `vertical` ? rect.height : rect.width;\n if (crossPx !== this.#currentCrossPx || longPx !== this.#currentLongPx) {\n this.requestUpdate();\n }\n };\n\n #onHostKeyDown = (event: KeyboardEvent): void => {\n this.#onKeyDown(event);\n };\n\n // ─── Gradient defs relocation ───────────────────────────────────────\n /**\n * Lazily creates the inert `<svg><defs>` carrier that user-authored\n * gradients get moved into. Kept entirely outside Lit's managed template —\n * it's a plain sibling of the interactive `<svg class=\"slider-svg\">` inside\n * the shadow root, so `url(#id)` references from lane/track paint\n * properties resolve against it regardless of render() re-runs.\n */\n #ensureUserGradientDefs(): SVGDefsElement {\n if (this.#userGradientDefs)\n return this.#userGradientDefs;\n const svgNs = `http://www.w3.org/2000/svg`;\n const carrier = document.createElementNS(svgNs, `svg`);\n carrier.setAttribute(`width`, `0`);\n carrier.setAttribute(`height`, `0`);\n carrier.setAttribute(`aria-hidden`, `true`);\n // Inline (not classed) so no shadow stylesheet rule — including a broad\n // `svg { width: 100%; ... }` selector — can ever stretch this carrier\n // into a click-blocking overlay; `:host` has no explicit `position`, so\n // an accidentally-enlarged `position: absolute` box here would escape to\n // whatever ancestor up the *light* DOM happens to be positioned.\n carrier.style.cssText = `position: absolute; width: 0; height: 0; overflow: hidden; pointer-events: none;`;\n const defs = document.createElementNS(svgNs, `defs`) as SVGDefsElement;\n carrier.append(defs);\n this.renderRoot.append(carrier);\n this.#userGradientDefs = defs;\n return defs;\n }\n\n /**\n * Moves any `<linearGradient>`/`<radialGradient>` authored as light-DOM\n * descendants of this element into the shadow root (see\n * `#ensureUserGradientDefs`). This *reparents* rather than clones the\n * nodes, so consumers get normal, live SVG paint-server semantics — e.g.\n * animating a `<stop>`'s `stop-color` \"just works\" — with no gradient\n * management on the component's part. Idempotent: once moved, a node is no\n * longer a light-DOM descendant of `this`, so it won't be found again.\n */\n #syncGradientDefs = (): void => {\n const found = this.querySelectorAll(`linearGradient, radialGradient`);\n if (found.length === 0)\n return;\n const defs = this.#ensureUserGradientDefs();\n for (const node of found) {\n defs.append(node);\n }\n };\n\n // ─── Lane management API ────────────────────────────────────────────\n addLane(\n key: string,\n options?: {\n value?: number;\n valueMin?: number;\n valueMax?: number;\n type?: SliderLaneType;\n offset?: number;\n width?: number;\n },\n ): void {\n const rel = this.#getRelativeValueA();\n this.#lanes.set(key, {\n key,\n value: options?.value ?? rel,\n valueMin: options?.valueMin ?? 0,\n valueMax: options?.valueMax ?? rel,\n type: options?.type ?? `value`,\n offset: options?.offset ?? 0,\n width: options?.width ?? 0.1,\n });\n this.requestUpdate();\n }\n\n setLaneValue(key: string, value: number): void {\n const lane = this.#lanes.get(key);\n if (lane) {\n lane.value = clamp(value, 0, 1);\n this.requestUpdate();\n }\n }\n\n setLaneRange(key: string, valueMin: number, valueMax: number): void {\n const lane = this.#lanes.get(key);\n if (!lane)\n return;\n const lo = clamp(Math.min(valueMin, valueMax), 0, 1);\n const hi = clamp(Math.max(valueMin, valueMax), 0, 1);\n lane.valueMin = lo;\n lane.valueMax = hi;\n this.requestUpdate();\n }\n\n removeLane(key: string): void {\n this.#lanes.delete(key);\n this.requestUpdate();\n }\n\n getLanes(): ReadonlyMap<string, SliderLaneData> {\n return new Map(this.#lanes);\n }\n\n getLane(key: string): SliderLaneData | undefined {\n return this.#lanes.get(key);\n }\n\n // ─── Derived getters ────────────────────────────────────────────────\n #getRelativeValueA(): number {\n return valueToRelative(this.valueA, this.min, this.max);\n }\n\n #getRelativeValueB(): number {\n return valueToRelative(this.valueB, this.min, this.max);\n }\n\n #getRelativeValueC(): number {\n const c = this.valueC ?? (this.#poleA + this.#poleB) / 2;\n return valueToRelative(c, this.min, this.max);\n }\n\n #low(): number {\n return Math.min(this.#poleA, this.#poleB);\n }\n\n #high(): number {\n return Math.max(this.#poleA, this.#poleB);\n }\n\n #lowKey(): SliderHandleKey {\n return this.#poleA <= this.#poleB ? `a` : `b`;\n }\n\n #highKey(): SliderHandleKey {\n return this.#poleA > this.#poleB ? `a` : `b`;\n }\n\n /**\n * Effective `valueMin` in value units between A and B. Mirrors radial-input's\n * default of 1% of max-min when the property holds the literal minimum.\n */\n #getEffectiveValueMin(): number {\n const range = this.max - this.min;\n if (this.valueMin && this.valueMin > 0)\n return this.valueMin;\n return range * DEFAULT_VALUE_MIN_FRACTION;\n }\n\n #quantise(value: number): number {\n if (this.stops && this.stops > 1) {\n const range = this.max - this.min;\n const step = range / this.stops;\n const snapped = Math.round((value - this.min) / step) * step + this.min;\n return clamp(snapped, this.min, this.max);\n }\n if (this.step !== undefined && this.step > 0) {\n const snapped = Math.round((value - this.min) / this.step) * this.step + this.min;\n return clamp(snapped, this.min, this.max);\n }\n return value;\n }\n\n // ─── Value setting ──────────────────────────────────────────────────\n #setSingleValueFromRelative(relativeValue: number, isUserInteraction = false): void {\n const newValue = scale(relativeValue, 0, 1, this.min, this.max);\n const clampedValue = this.#quantise(clamp(newValue, this.min, this.max));\n\n if (clampedValue === this.valueA)\n return;\n\n const previousValue = this.valueA;\n this.valueA = clampedValue;\n this.#poleA = clampedValue;\n this.#isUserInteraction = isUserInteraction;\n\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n this.#applySingleStyleValueLane(valueLane, this.#getRelativeValueA());\n }\n\n if (this.hasAttribute(`data-tooltip-live`)) {\n const percentage = Math.round(this.#getRelativeValueA() * 100);\n this.setAttribute(`data-tooltip`, `${percentage}%`);\n }\n\n this.#emitInputAndChange(\n { previousValue },\n isUserInteraction,\n );\n }\n\n #setDualOrTripleValueFromRelative(\n relativeValue: number,\n handle: SliderHandleKey,\n isUserInteraction = false,\n ): void {\n const newValue = scale(relativeValue, 0, 1, this.min, this.max);\n const clamped = clamp(newValue, this.min, this.max);\n\n const result = this.#resolvePoleChange(handle, clamped, this.#lastInteractedHandle);\n if (!result)\n return;\n\n const previous = { ...this.#poles() };\n this.#poleA = result.poleA;\n this.#poleB = result.poleB;\n if (result.poleC !== undefined)\n this.#poleC = result.poleC;\n this.#syncPoleProperties();\n\n const changed = this.#detectChanged(previous, this.#poles());\n this.#isUserInteraction = isUserInteraction;\n\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n valueLane.valueMin = valueToRelative(this.#low(), this.min, this.max);\n valueLane.valueMax = valueToRelative(this.#high(), this.min, this.max);\n }\n\n if (this.hasAttribute(`data-tooltip-live`)) {\n const percentage = Math.round(valueToRelative(this.#high(), this.min, this.max) * 100);\n this.setAttribute(`data-tooltip`, `${percentage}%`);\n }\n\n this.#emitInputAndChange(\n {\n previousValue: Math.max(previous.poleA, previous.poleB),\n previousValueMin: Math.min(previous.poleA, previous.poleB),\n previousValueMax: Math.max(previous.poleA, previous.poleB),\n previousValueC: previous.poleC,\n },\n isUserInteraction,\n changed,\n );\n }\n\n #poles(): { poleA: number; poleB: number; poleC: number | undefined } {\n return { poleA: this.#poleA, poleB: this.#poleB, poleC: this.#poleC };\n }\n\n #syncPoleProperties(): void {\n this.valueA = this.#poleA;\n this.valueB = this.#poleB;\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n this.valueC = this.#poleC;\n this.#hasInitialisedValueC = true;\n }\n }\n\n #resolvePoleChange(\n handle: SliderHandleKey,\n proposed: number,\n originalHandle: SliderHandleKey,\n ): { poleA: number; poleB: number; poleC?: number } | null {\n let poleA = this.#poleA;\n let poleB = this.#poleB;\n let poleC = this.#poleC;\n\n if (this.valueMode === `triple` && handle === `c`) {\n const lo = this.#low();\n const hi = this.#high();\n const clamped = clamp(proposed, lo, hi);\n const quantised = this.#quantise(clamped);\n if (quantised === this.#poleC)\n return null;\n return { poleA, poleB, poleC: quantised };\n }\n\n const gap = this.#getEffectiveValueMin();\n const other = handle === `a` ? poleB : poleA;\n\n let desired = this.#quantise(clamp(proposed, this.min, this.max));\n\n if (this.crossover === `none`) {\n // Pin to the side this handle started on relative to the other one.\n const startedLow = (handle === `a` ? poleA : poleB) <= other;\n if (startedLow) {\n desired = Math.min(desired, other - gap);\n } else {\n desired = Math.max(desired, other + gap);\n }\n } else {\n // 'allow' — snap into the forbidden band, but allow crossover beyond.\n if (desired > other - gap && desired < other + gap) {\n // Within forbidden band; snap to nearer edge.\n const distToLow = Math.abs(desired - (other - gap));\n const distToHigh = Math.abs(desired - (other + gap));\n desired = distToLow <= distToHigh ? other - gap : other + gap;\n }\n }\n\n // Final clamp to [min, max]\n desired = clamp(desired, this.min, this.max);\n\n if (handle === `a`) {\n if (desired === poleA)\n return null;\n poleA = desired;\n } else {\n if (desired === poleB)\n return null;\n poleB = desired;\n }\n\n // Triple-mode: re-anchor C relative to the new [low, high]\n if (this.valueMode === `triple` && poleC !== undefined) {\n const oldLo = Math.min(this.#poleA, this.#poleB);\n const oldHi = Math.max(this.#poleA, this.#poleB);\n const newLo = Math.min(poleA, poleB);\n const newHi = Math.max(poleA, poleB);\n if (this.valueCFollow === `proportional` && oldHi > oldLo) {\n const frac = clamp((poleC - oldLo) / (oldHi - oldLo), 0, 1);\n poleC = newLo + frac * (newHi - newLo);\n } else {\n if (poleC < newLo)\n poleC = newLo;\n if (poleC > newHi)\n poleC = newHi;\n }\n }\n\n // Avoid unused-warning for originalHandle (used in caller for tie-breaking)\n void originalHandle;\n return { poleA, poleB, poleC };\n }\n\n #detectChanged(\n prev: { poleA: number; poleB: number; poleC: number | undefined },\n curr: { poleA: number; poleB: number; poleC: number | undefined },\n ): SliderChangedField {\n const aDiff = prev.poleA !== curr.poleA;\n const bDiff = prev.poleB !== curr.poleB;\n const cDiff = prev.poleC !== curr.poleC;\n\n if (this.valueMode === `triple`) {\n if (aDiff && bDiff && !cDiff)\n return `both`;\n if (aDiff && bDiff)\n return `both`;\n if (aDiff)\n return `min`;\n if (bDiff)\n return `max`;\n if (cDiff)\n return `c`;\n return `min`;\n }\n if (aDiff && bDiff)\n return `both`;\n if (aDiff)\n return `min`;\n if (bDiff)\n return `max`;\n return `min`;\n }\n\n #emitInputAndChange(\n previous: {\n previousValue: number;\n previousValueMin?: number;\n previousValueMax?: number;\n previousValueC?: number;\n },\n isUserInteraction: boolean,\n changed?: SliderChangedField,\n ): void {\n const detailInput = this.#buildInputDetail(changed);\n const detailChange = this.#buildChangeDetail(previous, changed);\n\n if (isUserInteraction) {\n this.dispatchEvent(\n new CustomEvent<SliderInputInputDetail>(`input`, {\n detail: detailInput,\n bubbles: true,\n composed: true,\n }),\n );\n this.#scheduleChangeEvent(detailChange);\n } else {\n this.#fireChangeEvent(detailChange);\n }\n }\n\n #buildInputDetail(changed?: SliderChangedField): SliderInputInputDetail {\n if (this.valueMode === `single`) {\n return {\n value: this.valueA,\n valueRelative: this.#getRelativeValueA(),\n };\n }\n\n const lo = this.#low();\n const hi = this.#high();\n const valueMinRel = valueToRelative(lo, this.min, this.max);\n const valueMaxRel = valueToRelative(hi, this.min, this.max);\n\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n return {\n value: hi,\n valueRelative: valueMaxRel,\n valueMin: lo,\n valueMax: hi,\n valueMinRelative: valueMinRel,\n valueMaxRelative: valueMaxRel,\n valueC: this.#poleC,\n valueCRelative: valueToRelative(this.#poleC, this.min, this.max),\n changed,\n };\n }\n\n return {\n value: hi,\n valueRelative: valueMaxRel,\n valueMin: lo,\n valueMax: hi,\n valueMinRelative: valueMinRel,\n valueMaxRelative: valueMaxRel,\n changed,\n };\n }\n\n #buildChangeDetail(\n previous: {\n previousValue: number;\n previousValueMin?: number;\n previousValueMax?: number;\n previousValueC?: number;\n },\n changed?: SliderChangedField,\n ): SliderInputChangeDetail {\n if (this.valueMode === `single`) {\n return {\n value: this.valueA,\n valueRelative: this.#getRelativeValueA(),\n previousValue: previous.previousValue,\n };\n }\n\n const lo = this.#low();\n const hi = this.#high();\n const valueMaxRel = valueToRelative(hi, this.min, this.max);\n\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n return {\n value: hi,\n valueRelative: valueMaxRel,\n previousValue: previous.previousValue,\n valueMin: lo,\n valueMax: hi,\n previousValueMin: previous.previousValueMin ?? lo,\n previousValueMax: previous.previousValueMax ?? hi,\n valueC: this.#poleC,\n previousValueC: previous.previousValueC ?? this.#poleC,\n changed,\n };\n }\n\n return {\n value: hi,\n valueRelative: valueMaxRel,\n previousValue: previous.previousValue,\n valueMin: lo,\n valueMax: hi,\n previousValueMin: previous.previousValueMin ?? lo,\n previousValueMax: previous.previousValueMax ?? hi,\n changed,\n };\n }\n\n #scheduleChangeEvent(detail: SliderInputChangeDetail): void {\n if (this.#changeDebounceTimer !== undefined) {\n clearTimeout(this.#changeDebounceTimer);\n }\n this.#changeDebounceTimer = window.setTimeout(() => {\n this.#fireChangeEvent(detail);\n this.#changeDebounceTimer = undefined;\n }, CHANGE_DEBOUNCE_MS);\n }\n\n #fireChangeEvent(detail: SliderInputChangeDetail): void {\n this.dispatchEvent(\n new CustomEvent<SliderInputChangeDetail>(`change`, {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n // ─── Dynamic cross-axis sizing ────────────────────────────────────\n /**\n * Cross-axis viewBox size for this render, hugging the actual content.\n * Computed once per render into `#currentCross` (sub-renderers read it\n * via `getTrackBounds(orientation, cross)` / `bounds.cross`).\n *\n * LONG stays fixed; only the cross axis and the long-axis end inset\n * tighten. Pointer mapping is calibrated to the drawn track span, so\n * clicks on the visible track ends hit min/max exactly.\n */\n #currentCross = CROSS;\n\n /**\n * Long-axis end insets (viewBox units) for this render: low-value end /\n * high-value end (left/right horizontal, bottom/top vertical).\n */\n #currentInsetStart = INSET;\n #currentInsetEnd = INSET;\n\n /**\n * Lane width variable cascade for `key`:\n * 1. `--lane-<key>-width` (explicit per-lane width)\n * 2. for the `value` lane only: `--lane-track-width`, so the value bar\n * matches a customised track thickness automatically\n * 3. for custom lanes only: the generic `--lane-width`\n * 4. `fallback` (0.08 track / 0.12 value / 0.16 custom)\n *\n * Mirrors the `var()` fallback chains in `#renderLane` — the two must stay\n * in sync or the measured viewBox diverges from the drawn strokes.\n */\n #laneWidthNumber(key: string, fallback: number): number {\n const style = getComputedStyle(this);\n const parse = (raw: string): number | undefined => {\n const trimmed = raw.trim();\n if (!trimmed)\n return undefined;\n const parsed = Number.parseFloat(trimmed);\n return Number.isNaN(parsed) ? undefined : parsed;\n };\n const perLane = parse(style.getPropertyValue(`--lane-${key}-width`));\n if (perLane !== undefined)\n return perLane;\n if (key === `value`) {\n const track = parse(style.getPropertyValue(`--lane-track-width`));\n if (track !== undefined)\n return track;\n return fallback;\n }\n if (key !== `track`) {\n const generic = parse(style.getPropertyValue(`--lane-width`));\n if (generic !== undefined)\n return generic;\n }\n return fallback;\n }\n\n /**\n * Lane `key` as screen px: width fraction × measured cross-axis px. Lane\n * widths are fractions of the cross axis, so multiplying by the host's\n * cross px (measured per render in #measureLanes) is exact — unlike the old\n * `calc(var * 24%)` percentage, which resolved against the\n * host-size-independent viewBox diagonal and painted ~10x too thin.\n */\n #laneStrokePx(key: string): number {\n const fallback = key === `track` ? 0.08 : key === `value` ? 0.12 : 0.16;\n return this.#laneWidthNumber(key, fallback) * this.#currentCrossPx;\n }\n\n /**\n * Widest lane stroke in screen px + the host's cross-axis px, measured\n * once per render. Lane strokes render as JS-computed px (see\n * #laneStrokePx) with `non-scaling-stroke`, so the number paints verbatim\n * in screen px regardless of the viewBox.\n */\n #currentLanePxMax = 0;\n #currentCrossPx = 0;\n #currentLongPx = 0;\n\n #measureLanes(): void {\n const rect = this.getBoundingClientRect();\n const crossPx = this.orientation === `vertical` ? rect.width : rect.height;\n this.#currentCrossPx = crossPx;\n this.#currentLongPx = this.orientation === `vertical` ? rect.height : rect.width;\n if (rect.width <= 0 || rect.height <= 0) {\n this.#currentLanePxMax = 0;\n return;\n }\n let max = 0;\n for (const lane of this.#lanes.values()) {\n const fallback = lane.key === `track` ? 0.08 : lane.key === `value` ? 0.12 : 0.16;\n max = Math.max(max, Math.abs(this.#laneWidthNumber(lane.key, fallback)) * crossPx);\n }\n this.#currentLanePxMax = max;\n }\n\n /**\n * Dot radius as a fraction of the cross axis. The fractional\n * `--marker-thickness` size shrinks with the tight box, so a screen-px\n * floor (widest lane + 2px) guarantees the dot always reads larger than\n * the value track it sits on.\n */\n #dotRadiusFraction(): number {\n if (this.#currentCrossPx <= 0) {\n const markerThickness = Math.abs(this.#getCssVar(`--marker-thickness`, 0.15));\n return markerThickness / 2;\n }\n return this.#dotRadiusPx() / this.#currentCrossPx;\n }\n\n /** Desired dot radius in screen px (fractional size vs lane-based floor). */\n #dotRadiusPx(): number {\n const markerThickness = Math.abs(this.#getCssVar(`--marker-thickness`, 0.15));\n if (this.#currentCrossPx <= 0)\n return 0;\n return Math.max(markerThickness * this.#currentCrossPx / 2, this.#currentLanePxMax / 2 + 1);\n }\n\n /**\n * Radii (viewBox units) for a screen-space circle of `rPx` px.\n * `preserveAspectRatio=\"none\"` scales axes differently, so a viewBox\n * `<circle>` renders as an oval — pre-compensate with an `<ellipse>`.\n */\n #circleRadiiUnits(rPx: number, cross: number): { rx: number; ry: number } {\n const longPx = this.#currentLongPx;\n const crossPx = this.#currentCrossPx;\n if (longPx <= 0 || crossPx <= 0 || cross <= 0)\n return { rx: rPx, ry: rPx };\n const longScale = longPx / 100;\n const crossScale = crossPx / cross;\n if (this.orientation === `vertical`)\n return { rx: rPx / crossScale, ry: rPx / longScale };\n return { rx: rPx / longScale, ry: rPx / crossScale };\n }\n\n /** Marker styles actually rendered this render (global + triple C override). */\n #activeMarkerStyles(): SliderMarkerStyle[] {\n if (this.valueMode === `single`)\n return [this.markerStyle];\n if (this.valueMode === `triple` && this.markerStyleC)\n return [...new Set([this.markerStyle, this.markerStyleC])];\n return [this.markerStyle];\n }\n\n /**\n * Largest fractional half-extent of the content, as a fraction of the\n * (unknown) cross size: boxHalf = F * cross + pad. Markers, lane widths\n * and offsets are all defined as fractions of the cross axis, so the\n * tightest box is the fixed point cross = pad / (0.5 - F).\n */\n #contentFraction(): number {\n let f = 0;\n\n for (const lane of this.#lanes.values()) {\n const fallback = lane.key === `track` ? 0.08 : lane.key === `value` ? 0.12 : 0.16;\n const w = this.#laneWidthNumber(lane.key, fallback);\n f = Math.max(f, Math.abs(w) / 2 + Math.abs(lane.offset) / 2);\n }\n\n const markerOffset = Math.abs(this.#getCssVar(`--marker-offset`, 0));\n const markerLength = Math.abs(this.#getCssVar(`--marker-length`, 0.8));\n const styleF = (marker: SliderMarkerStyle): number => {\n if (marker === `none`)\n return 0;\n if (marker === `dot`)\n return this.#dotRadiusFraction() + markerOffset / 2;\n // needle + triangle extend markerLength/4 from the centreline\n return markerLength / 4 + markerOffset / 2;\n };\n for (const marker of this.#activeMarkerStyles()) {\n f = Math.max(f, styleF(marker));\n }\n\n if (this.valueMode === `single` && (this.singleStyle === `bipolar` || this.singleStyle === `unipolar`)) {\n const midLength = Math.abs(this.#getCssVar(`--midpoint-length`, 0.15));\n f = Math.max(f, midLength / 4);\n }\n\n const trackWidth = Math.abs(this.#getCssVar(`--track-width`, 2));\n // Track width is absolute viewBox units (legacy CROSS=24 scale).\n f = Math.max(f, trackWidth / 2 / CROSS);\n\n // Clamp so the fixed point stays finite and leaves room for strokes.\n return Math.min(f, 0.45);\n }\n\n #computeCross(): number {\n const pad = 2;\n const cross = pad / (0.5 - this.#contentFraction());\n return clamp(cross, 4, 40);\n }\n\n /**\n * Long-axis end inset (viewBox units) hugging the markers: dot/triangle\n * markers extend half their width past the track ends at min/max, so the\n * inset is that extent plus a stroke pad. Needle markers are\n * perpendicular to the track and need no along-axis room beyond the pad.\n *\n * Authored `--track-margin` (both ends) / `--track-margin-start` /\n * `--track-margin-end` (viewBox units) are added on top, so demos can\n * reserve room for things like anchored lanes that overhang the value\n * at the extremes. Start = low-value end (left / bottom).\n */\n #computeInsets(cross: number): { start: number; end: number } {\n const markerThickness = Math.abs(this.#getCssVar(`--marker-thickness`, 0.15));\n // Dot along-axis half-width: aspect-corrected rx (falls back to the\n // cross-axis radius when unlaid-out).\n const dotHalf = this.#currentLongPx > 0\n ? this.#dotRadiusPx() * 100 / this.#currentLongPx\n : this.#dotRadiusFraction() * cross;\n let half = 0;\n for (const marker of this.#activeMarkerStyles()) {\n if (marker === `dot`)\n half = Math.max(half, dotHalf);\n else if (marker === `triangle`)\n half = Math.max(half, markerThickness * cross / 4);\n }\n const base = clamp(half + 1.5, 1, INSET);\n const both = Math.max(0, this.#getCssVar(`--track-margin`, 0));\n const extraStart = Math.max(0, this.#getCssVar(`--track-margin-start`, both));\n const extraEnd = Math.max(0, this.#getCssVar(`--track-margin-end`, both));\n let start = base + extraStart;\n let end = base + extraEnd;\n // Keep a usable track span: scale back proportionally if overbooked.\n const maxTotal = LONG - 10;\n if (start + end > maxTotal && start + end > 0) {\n const scale = maxTotal / (start + end);\n start *= scale;\n end *= scale;\n }\n return { start, end };\n }\n\n /**\n * Pointer client position (clientX/clientY along the long axis) mapped\n * onto the *drawn track span* (0 at track start, 1 at track end, clamped;\n * flipped for vertical where the top is the high value). Mapping to the\n * track rather than the host edges means the visible track ends hit\n * min/max exactly and no horizontal space is dead.\n */\n #relativeFromTrackPos(clientPos: number): number {\n const rect = this.getBoundingClientRect();\n const isVertical = this.orientation === `vertical`;\n const hostStart = isVertical ? rect.top : rect.left;\n const hostSize = isVertical ? rect.height : rect.width;\n if (hostSize <= 0)\n return 0;\n const trackStart = hostStart + hostSize * this.#currentInsetStart / LONG;\n const trackSpan = hostSize * (LONG - this.#currentInsetStart - this.#currentInsetEnd) / LONG;\n if (trackSpan <= 0)\n return 0;\n const raw = clamp((clientPos - trackStart) / trackSpan, 0, 1);\n return isVertical ? 1 - raw : raw;\n }\n\n // ─── CSS-var lookup ────────────────────────────────────────────────\n #getCssVar(name: string, defaultValue: number): number {\n const style = getComputedStyle(this);\n const val = style.getPropertyValue(name).trim();\n if (!val)\n return defaultValue;\n\n if (val.includes(`calc(`)) {\n const valueRelative = style.getPropertyValue(`--value-relative`).trim();\n if (!valueRelative) {\n const parsed = Number.parseFloat(val.replace(/[^0-9.-]/g, ``));\n return Number.isNaN(parsed) ? defaultValue : parsed;\n }\n const evalStr = val.replace(/var\\(--value-relative\\)/g, valueRelative);\n const result = evaluateArithmetic(evalStr.replace(/calc\\s*\\(([^)]+)\\)/g, `$1`));\n if (result !== undefined)\n return Number.isNaN(result) ? defaultValue : result;\n const parsed = Number.parseFloat(val.replace(/[^0-9.-]/g, ``));\n return Number.isNaN(parsed) ? defaultValue : parsed;\n }\n\n const parsed = Number.parseFloat(val);\n return Number.isNaN(parsed) ? defaultValue : parsed;\n }\n\n // ─── Swipeable mode (mirrors ixfx-range-input) ──────────────────────\n /**\n * Track-span-relative 0..1 position for a pointer event, with vertical\n * flip and unipolar V-shape mapping applied. Positions outside the drawn\n * track are clamped to 0..1.\n */\n #relativeFromSwipePointer(event: PointerEvent): number {\n const clientPos = this.orientation === `vertical` ? event.clientY : event.clientX;\n const relativeValue = this.#relativeFromTrackPos(clientPos);\n if (this.valueMode === `single` && this.singleStyle === `unipolar`) {\n return Math.abs(2 * relativeValue - 1);\n }\n return relativeValue;\n }\n\n /**\n * Apply a swipe value from a pointer coordinate. Single mode sets\n * value-A directly; dual/triple modes move the nearest handle.\n * Focus follows the slider being controlled, so keyboard/wheel keep\n * working on the slider under the cursor as a swipe travels across\n * adjacent sliders (no-op when already focused).\n */\n #applySwipeFromPointer(event: PointerEvent): void {\n this.focus();\n const relativeValue = this.#relativeFromSwipePointer(event);\n if (this.valueMode === `single`) {\n this.#lastInteractedHandle = `a`;\n this.#setSingleValueFromRelative(relativeValue, true);\n return;\n }\n const aRel = this.#getRelativeValueA();\n const bRel = this.#getRelativeValueB();\n let nearest: SliderHandleKey = Math.abs(relativeValue - aRel) <= Math.abs(relativeValue - bRel) ? `a` : `b`;\n if (this.valueMode === `triple`) {\n const cRel = this.#getRelativeValueC();\n const distA = Math.abs(relativeValue - aRel);\n const distB = Math.abs(relativeValue - bRel);\n const distC = Math.abs(relativeValue - cRel);\n nearest = distA <= distB && distA <= distC ? `a` : distB <= distC ? `b` : `c`;\n }\n // Raw-pole identity for tie-breaking is irrelevant here (unlike the\n // drag hit-test which distinguishes overlapping handles); nearest wins.\n if (nearest === `a` || nearest === `b`) {\n this.#lastInteractedHandle = nearest;\n } else {\n this.#lastInteractedHandle = `c`;\n }\n this.#setDualOrTripleValueFromRelative(relativeValue, nearest, true);\n }\n\n #onSwipePointerDown = (event: PointerEvent): void => {\n if (!this.swipeable || this.disabled)\n return;\n event.preventDefault();\n this.#applySwipeFromPointer(event);\n };\n\n #onSwipePointerMove = (event: PointerEvent): void => {\n if (!this.swipeable || this.disabled || event.buttons === 0)\n return;\n this.#applySwipeFromPointer(event);\n };\n\n #onSwipePointerEnter = (event: PointerEvent): void => {\n if (!this.swipeable || this.disabled || event.buttons === 0)\n return;\n this.#applySwipeFromPointer(event);\n };\n\n // ─── Pointer interaction ────────────────────────────────────────────\n #onPointerDown = (event: PointerEvent): void => {\n if (this.disabled)\n return;\n // In swipeable mode the host-level swipe handlers own the gesture\n // (no pointer capture, so the pointer can travel across sliders).\n if (this.swipeable)\n return;\n\n const svg = this.renderRoot.querySelector(`svg.slider-svg`) as SVGElement | null;\n if (!svg)\n return;\n\n event.preventDefault();\n\n // Move focus to the host so keyboard interaction (arrows, wheel)\n // continues to work after a click/drag, and the focus indicator shows.\n this.focus();\n\n // Force the dragging cursor immediately, since the pointer may move\n // outside the SVG bounds while dragged (and #onPointerMoveCursor is\n // bound to the SVG only).\n svg.style.cursor = `grabbing`;\n\n const clientPos = this.orientation === `vertical` ? event.clientY : event.clientX;\n // Calibrated to the drawn track span (track ends hit min/max exactly).\n let relativeValue = this.#relativeFromTrackPos(clientPos);\n // For unipolar (single mode), the value bar is symmetric around the track\n // centre, so the click position maps to the value via a V-shape: 0 at\n // the centre, 1 at either end. Clicking 25% in from either side sets\n // the same value (0.5), as does clicking at the very start or end (1).\n if (this.valueMode === `single` && this.singleStyle === `unipolar`) {\n relativeValue = Math.abs(2 * relativeValue - 1);\n }\n\n // Resolve handle\n if (this.valueMode === `single`) {\n this.#lastInteractedHandle = `a`;\n this.#dragHandle = `a`;\n this.#setSingleValueFromRelative(relativeValue, true);\n this.#dragging = true;\n this.toggleAttribute(`dragging`, true);\n this.#activePointerId = event.pointerId;\n try {\n svg.setPointerCapture(event.pointerId);\n } catch {\n // ignore\n }\n this.#dragStartClientPos = clientPos;\n this.#poleValueAtDragStart = this.valueA;\n window.addEventListener(`pointermove`, this.#onPointerMove);\n window.addEventListener(`pointerup`, this.#onPointerUp);\n window.addEventListener(`pointercancel`, this.#onPointerUp);\n return;\n }\n\n // Multi-handle: hit-test\n const aRel = this.#getRelativeValueA();\n const bRel = this.#getRelativeValueB();\n const lo = Math.min(aRel, bRel);\n const hi = Math.max(aRel, bRel);\n const aHandle = this.#poleA <= this.#poleB ? `a` : `b`;\n const bHandle = this.#poleA > this.#poleB ? `a` : `b`;\n const posA = aRel;\n const posB = bRel;\n const isTriple = this.valueMode === `triple`;\n const cRel = isTriple ? this.#getRelativeValueC() : 0;\n const posC = cRel;\n const nearA = Math.abs(relativeValue - posA) < HANDLE_HIT_RADIUS;\n const nearB = Math.abs(relativeValue - posB) < HANDLE_HIT_RADIUS;\n const nearC = isTriple && Math.abs(relativeValue - posC) < HANDLE_HIT_RADIUS;\n\n let chosenHandle: SliderHandleKey | `length` | undefined;\n\n // When two or more handles overlap (e.g. A and C, A and B, etc.), pick\n // the one whose raw pole was NOT last-interacted, so repeated clicks\n // on a near-coincident pair alternate rather than sticking.\n const pickNonLast = (candidates: SliderHandleKey[]): SliderHandleKey => {\n const notLast = candidates.find(h => h !== this.#lastInteractedHandle);\n return notLast ?? candidates[0];\n };\n if (nearA && nearB && nearC) {\n chosenHandle = pickNonLast([aHandle, bHandle, `c`]);\n } else if (nearA && nearB) {\n chosenHandle = pickNonLast([aHandle, bHandle]);\n } else if (nearA && nearC) {\n chosenHandle = pickNonLast([aHandle, `c`]);\n } else if (nearB && nearC) {\n chosenHandle = pickNonLast([bHandle, `c`]);\n } else if (nearA) {\n chosenHandle = aHandle;\n } else if (nearB) {\n chosenHandle = bHandle;\n } else if (nearC) {\n chosenHandle = `c`;\n } else if (this.valueDrag !== `none` && relativeValue > lo && relativeValue < hi) {\n chosenHandle = `length`;\n } else if (this.valueDrag === `none` && relativeValue <= lo) {\n // Dead zone on low side — click-to-set low handle (only when\n // value-drag is off; otherwise clicks outside the bar are a no-op).\n chosenHandle = this.#lowKey();\n } else if (this.valueDrag === `none` && relativeValue >= hi) {\n // Dead zone on high side — click-to-set high handle (only when\n // value-drag is off; otherwise clicks outside the bar are a no-op).\n chosenHandle = this.#highKey();\n } else {\n // Not on a handle, not on a draggable segment, not on a click-to-set\n // dead zone (when value-drag is off). No-op — the pointer event will\n // still register and release cleanly via #onPointerUp, but no value\n // changes.\n chosenHandle = undefined;\n }\n\n this.#dragging = true;\n this.toggleAttribute(`dragging`, true);\n this.#activePointerId = event.pointerId;\n try {\n svg.setPointerCapture(event.pointerId);\n } catch {\n // ignore\n }\n this.#dragStartClientPos = clientPos;\n\n if (chosenHandle === undefined) {\n // Linger-as-track-click but no drag started.\n window.addEventListener(`pointermove`, this.#onPointerMove);\n window.addEventListener(`pointerup`, this.#onPointerUp);\n window.addEventListener(`pointercancel`, this.#onPointerUp);\n return;\n }\n\n this.#dragHandle = chosenHandle;\n\n if (chosenHandle === `length`) {\n this.#lengthDragStart = { poleA: this.#poleA, poleB: this.#poleB };\n this.#lengthDragLowKey = this.#lowKey();\n this.#lengthDragHighKey = this.#highKey();\n this.#lengthDragLength = this.#poleB - this.#poleA < 0\n ? this.#poleA - this.#poleB\n : this.#poleB - this.#poleA;\n this.#lengthDragStartLow = Math.min(this.#poleA, this.#poleB);\n // Remember where the user grabbed the bar (host-relative). Without\n // this, the low edge would jump under the cursor at drag-start.\n this.#lengthDragStartRelative = relativeValue;\n } else {\n this.#lastInteractedHandle = chosenHandle;\n this.#poleValueAtDragStart = chosenHandle === `a` ? this.#poleA : this.#poleB;\n // Click-to-set immediately\n this.#setDualOrTripleValueFromRelative(relativeValue, chosenHandle, true);\n }\n\n window.addEventListener(`pointermove`, this.#onPointerMove);\n window.addEventListener(`pointerup`, this.#onPointerUp);\n window.addEventListener(`pointercancel`, this.#onPointerUp);\n };\n\n #onPointerMove = (event: PointerEvent): void => {\n if (!this.#dragging)\n return;\n\n event.preventDefault();\n\n const clientPos = this.orientation === `vertical` ? event.clientY : event.clientX;\n let relativeValue = this.#relativeFromTrackPos(clientPos);\n if (this.valueMode === `single` && this.singleStyle === `unipolar`) {\n relativeValue = Math.abs(2 * relativeValue - 1);\n }\n\n if (this.valueMode === `single`) {\n this.#setSingleValueFromRelative(relativeValue, true);\n return;\n }\n\n if (this.#dragHandle === `length`) {\n this.#applyLengthDragFromRelative(relativeValue);\n } else if (this.#dragHandle) {\n this.#setDualOrTripleValueFromRelative(relativeValue, this.#dragHandle, true);\n }\n };\n\n #applyLengthDragFromRelative(relativeValue: number): void {\n if (!this.#lengthDragStart)\n return;\n const range = this.max - this.min;\n const deltaR = relativeValue - this.#lengthDragStartRelative;\n const deltaValue = deltaR * range;\n\n let proposedLow = this.#lengthDragStartLow + deltaValue;\n let proposedHigh = proposedLow + this.#lengthDragLength;\n\n if (this.valueDrag === `stop`) {\n const originalLength = this.#lengthDragLength;\n let candidateLow = proposedLow;\n let candidateHigh = proposedLow + originalLength;\n if (candidateLow < this.min) {\n const maxDelta = this.min - this.#lengthDragStartLow;\n candidateLow = this.#lengthDragStartLow + maxDelta;\n candidateHigh = candidateLow + originalLength;\n }\n if (candidateHigh > this.max) {\n // Translate back so high sits at max.\n const shift = this.max - candidateHigh;\n candidateLow += shift;\n candidateHigh += shift;\n }\n proposedLow = candidateLow;\n proposedHigh = candidateHigh;\n } else if (this.valueDrag === `flex`) {\n proposedLow = clamp(proposedLow, this.min, this.max);\n proposedHigh = clamp(proposedHigh, this.min, this.max);\n }\n\n const lowKey = this.#lengthDragLowKey ?? this.#lowKey();\n const highKey = this.#lengthDragHighKey ?? this.#highKey();\n\n const previous = this.#poles();\n const newPoleA = lowKey === `a` ? proposedLow : proposedHigh;\n const newPoleB = highKey === `b` ? proposedHigh : proposedLow;\n this.#poleA = newPoleA;\n this.#poleB = newPoleB;\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n const oldLo = Math.min(previous.poleA, previous.poleB);\n const oldHi = Math.max(previous.poleA, previous.poleB);\n const newLo = Math.min(newPoleA, newPoleB);\n const newHi = Math.max(newPoleA, newPoleB);\n if (this.valueCFollow === `proportional` && oldHi > oldLo) {\n const frac = clamp((this.#poleC - oldLo) / (oldHi - oldLo), 0, 1);\n this.#poleC = newLo + frac * (newHi - newLo);\n } else {\n if (this.#poleC < newLo)\n this.#poleC = newLo;\n if (this.#poleC > newHi)\n this.#poleC = newHi;\n }\n }\n this.#syncPoleProperties();\n\n const changed: SliderChangedField = `both`;\n this.#isUserInteraction = true;\n\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n valueLane.valueMin = valueToRelative(this.#low(), this.min, this.max);\n valueLane.valueMax = valueToRelative(this.#high(), this.min, this.max);\n }\n\n this.#emitInputAndChange(\n {\n previousValue: previous.poleA,\n previousValueMin: Math.min(previous.poleA, previous.poleB),\n previousValueMax: Math.max(previous.poleA, previous.poleB),\n previousValueC: previous.poleC,\n },\n true,\n changed,\n );\n }\n\n #onPointerUp = (): void => {\n this.#dragging = false;\n this.#dragHandle = undefined;\n this.#lengthDragStart = undefined;\n this.#lengthDragLowKey = undefined;\n this.#lengthDragHighKey = undefined;\n this.toggleAttribute(`dragging`, false);\n\n // Re-evaluate cursor at the last known pointer position so the cursor\n // doesn't stay stuck at `grabbing` after release.\n this.#onPointerMoveCursor(\n new PointerEvent(`pointermove`, {\n clientX: this.#lastPointerClient.x,\n clientY: this.#lastPointerClient.y,\n }),\n );\n\n const svg = this.renderRoot.querySelector(`svg.slider-svg`);\n if (\n svg\n && this.#activePointerId !== undefined\n && `hasPointerCapture` in svg\n && typeof (svg as Element & { hasPointerCapture?: (id: number) => boolean }).hasPointerCapture === `function`\n ) {\n const has = (svg as Element & { hasPointerCapture: (id: number) => boolean }).hasPointerCapture;\n if (has.call(svg, this.#activePointerId)) {\n try {\n (svg as Element & { releasePointerCapture: (id: number) => void }).releasePointerCapture(this.#activePointerId);\n } catch {\n // ignore\n }\n }\n }\n this.#activePointerId = undefined;\n\n window.removeEventListener(`pointermove`, this.#onPointerMove);\n window.removeEventListener(`pointerup`, this.#onPointerUp);\n window.removeEventListener(`pointercancel`, this.#onPointerUp);\n };\n\n // ─── Keyboard interaction ───────────────────────────────────────────\n #onKeyDown = (event: KeyboardEvent): void => {\n if (this.disabled)\n return;\n\n const range = this.max - this.min;\n const effectiveStep = resolveAxisStep(range, this.stops, this.step, event.shiftKey);\n\n // Determine which handle to act on\n let handle: SliderHandleKey = `a`;\n const target = event.target as Element | null;\n if (target && typeof target.closest === `function`) {\n const handleEl = target.closest(`[data-handle]`) as HTMLElement | null;\n if (handleEl) {\n const h = handleEl.dataset?.handle as SliderHandleKey | undefined;\n if (h === `a` || h === `b` || h === `c`)\n handle = h;\n }\n }\n if (this.valueMode === `single`)\n handle = `a`;\n this.#lastInteractedHandle = handle;\n\n let handled = false;\n\n switch (event.key) {\n case `ArrowUp`:\n case `ArrowRight`:\n if (this.valueMode === `single`) {\n const r = this.#getRelativeValueA() + effectiveStep / range;\n this.#setSingleValueFromRelative(clamp(r, 0, 1), true);\n } else {\n const current = handle === `a` ? this.#poleA : (handle === `b` ? this.#poleB : (this.#poleC ?? this.#low()));\n const r = valueToRelative(current, this.min, this.max) + effectiveStep / range;\n this.#stepHandleByRelativeDelta(handle, r);\n }\n handled = true;\n break;\n\n case `ArrowDown`:\n case `ArrowLeft`:\n if (this.valueMode === `single`) {\n const r = this.#getRelativeValueA() - effectiveStep / range;\n this.#setSingleValueFromRelative(clamp(r, 0, 1), true);\n } else {\n const current = handle === `a` ? this.#poleA : (handle === `b` ? this.#poleB : (this.#poleC ?? this.#low()));\n const r = valueToRelative(current, this.min, this.max) - effectiveStep / range;\n this.#stepHandleByRelativeDelta(handle, r);\n }\n handled = true;\n break;\n\n case `Home`:\n if (this.valueMode === `single`) {\n this.#setSingleValueFromRelative(0, true);\n } else {\n this.#stepHandleByRelativeDelta(handle, 0);\n }\n handled = true;\n break;\n\n case `End`:\n if (this.valueMode === `single`) {\n this.#setSingleValueFromRelative(1, true);\n } else {\n this.#stepHandleByRelativeDelta(handle, 1);\n }\n handled = true;\n break;\n }\n\n if (handled)\n event.preventDefault();\n };\n\n #stepHandleByRelativeDelta(handle: SliderHandleKey, targetRelative: number): void {\n if (this.valueMode === `single`) {\n this.#setSingleValueFromRelative(clamp(targetRelative, 0, 1), true);\n return;\n }\n if (handle === `c`) {\n const lo = this.#low();\n const hi = this.#high();\n const proposed = scale(clamp(targetRelative, 0, 1), 0, 1, this.min, this.max);\n const clamped = clamp(proposed, lo, hi);\n const q = this.#quantise(clamped);\n if (q === this.#poleC)\n return;\n const previous = this.#poles();\n this.#poleC = q;\n this.#syncPoleProperties();\n this.#isUserInteraction = true;\n this.#emitInputAndChange(\n {\n previousValue: previous.poleA,\n previousValueMin: Math.min(previous.poleA, previous.poleB),\n previousValueMax: Math.max(previous.poleA, previous.poleB),\n previousValueC: previous.poleC,\n },\n true,\n `c`,\n );\n return;\n }\n\n this.#setDualOrTripleValueFromRelative(clamp(targetRelative, 0, 1), handle, true);\n }\n\n // ─── Wheel interaction ──────────────────────────────────────────────\n // The WheelNudgeMixin installs a host-level `wheel` listener; this method is\n // called once per handled tick with the resolved direction.\n override _applyWheelDelta(direction: WheelDirection, event: WheelEvent): void {\n // Resolve target handle from event target, falling back to last-interacted.\n let handle: SliderHandleKey = this.#lastInteractedHandle;\n const target = event.target as Element | null;\n if (target && typeof target.closest === `function`) {\n const handleEl = target.closest(`[data-handle]`) as HTMLElement | null;\n if (handleEl) {\n const h = handleEl.dataset?.handle as SliderHandleKey | undefined;\n if (h === `a` || h === `b` || h === `c`)\n handle = h;\n }\n }\n if (this.valueMode === `single`)\n handle = `a`;\n this.#lastInteractedHandle = handle;\n\n const range = this.max - this.min;\n const effectiveStep = resolveAxisStep(range, this.stops, this.step, event.shiftKey);\n\n const current = handle === `a`\n ? this.#poleA\n : handle === `b`\n ? this.#poleB\n : (this.#poleC ?? this.#low());\n const currentRel = valueToRelative(current, this.min, this.max);\n // Negate the direction so \"wheel forward\" always increases the value,\n // regardless of the platform's deltaY convention (Windows reports\n // deltaY < 0 for forward, Mac natural-scrolling reports deltaY > 0).\n // Shift narrows the step but doesn't change polarity.\n const targetRel = clamp(currentRel - direction * effectiveStep / range, 0, 1);\n\n this.#stepHandleByRelativeDelta(handle, targetRel);\n }\n\n #onFocusIn = (event: FocusEvent): void => {\n const target = event.target as Element | null;\n if (target && typeof target.closest === `function`) {\n const handleEl = target.closest(`[data-handle]`) as HTMLElement | null;\n if (handleEl) {\n const h = handleEl.dataset?.handle as SliderHandleKey | undefined;\n if (h === `a` || h === `b` || h === `c`)\n this.#lastInteractedHandle = h;\n }\n }\n };\n\n // ─── Rendering ──────────────────────────────────────────────────────\n #viewBox(): string {\n const cross = this.#currentCross;\n if (this.orientation === `horizontal`)\n return `0 0 ${LONG} ${cross}`;\n return `0 0 ${cross} ${LONG}`;\n }\n\n #renderTrack() {\n const isVertical = this.orientation === `vertical`;\n const cross = this.#currentCross;\n const insetStart = this.#currentInsetStart;\n const insetEnd = this.#currentInsetEnd;\n const strokeWidth = this.#getCssVar(`--track-width`, 2);\n const color = this.#getCssVarColor(`--track-color`, `var(--surface-4)`);\n const fill = this.#getCssVarColor(`--track-fill`, `transparent`);\n\n if (isVertical) {\n return svg`\n <rect\n class=\"track\"\n x=\"${cross / 2 - strokeWidth / 2}\"\n y=\"${insetStart}\"\n width=\"${strokeWidth}\"\n height=\"${LONG - insetStart - insetEnd}\"\n fill=\"${fill}\"\n stroke=\"${color}\"\n stroke-width=\"0\"\n />\n `;\n }\n return svg`\n <rect\n class=\"track\"\n x=\"${insetStart}\"\n y=\"${cross / 2 - strokeWidth / 2}\"\n width=\"${LONG - insetStart - insetEnd}\"\n height=\"${strokeWidth}\"\n fill=\"${fill}\"\n stroke=\"${color}\"\n stroke-width=\"0\"\n />\n `;\n }\n\n #getCssVarColor(name: string, fallback: string): string {\n const style = getComputedStyle(this);\n const val = style.getPropertyValue(name).trim();\n return val || fallback;\n }\n\n #renderLane(lane: SliderLaneData) {\n const bounds = getTrackBounds(this.orientation, this.#currentCross, this.#currentInsetStart, this.#currentInsetEnd);\n let path = ``;\n\n if (lane.type === `fixed`) {\n const start = this.orientation === `horizontal`\n ? { x: bounds.trackStart, y: bounds.crossCentre }\n : { x: bounds.crossCentre, y: bounds.trackStart };\n const end = this.orientation === `horizontal`\n ? { x: bounds.trackEnd, y: bounds.crossCentre }\n : { x: bounds.crossCentre, y: bounds.trackEnd };\n path = generateLinePath(start, end);\n } else if (lane.type === `anchored`) {\n const rel = this.#getRelativeValueA();\n const seg = getAnchoredSegment(rel, lane.value ?? 0.1, this.singleStyle, bounds, this.orientation);\n path = generateLinePath(seg.start, seg.end);\n } else {\n // 'value' lane: from valueMin to valueMax.\n const lo = lane.valueMin ?? 0;\n const hi = lane.valueMax ?? 0;\n const seg = getValueSegment(lo, hi, this.singleStyle, bounds, this.orientation);\n path = generateLinePath(seg.start, seg.end);\n }\n\n if (!path)\n return svg``;\n\n // Lane widths are true fractions of the cross axis, resolved to screen px\n // per render (see #laneStrokePx). A `calc(var * 24%)` percentage cannot do\n // this: percentages resolve against the viewBox-local diagonal (~71 units\n // and host-size independent), so documented 0..1 fractions painted ~10x\n // too thin and never scaled with the host. With `non-scaling-stroke` the\n // px number below renders verbatim, keeping dashes frozen as before.\n // Width cascade mirrors #laneWidthNumber: the value lane follows the\n // track width unless explicitly overridden, so a thick track doesn't end\n // up with a hairline value bar.\n const w = `${this.#laneStrokePx(lane.key)}px`;\n // Offsets are likewise cross-relative (see SliderLaneData), not legacy\n // CROSS units.\n const offsetPx = lane.offset * this.#currentCrossPx / 2;\n const transform = this.orientation === `horizontal`\n ? `translateY(${offsetPx}px)`\n : `translateX(${offsetPx}px)`;\n\n return svg`\n <path\n class=\"lane\"\n data-lane-key=\"${lane.key}\"\n part=\"lane lane-${lane.key}\"\n d=\"${path}\"\n style=\"\n stroke-width: ${w};\n stroke-linecap: var(--lane-linecap, round);\n transform: ${transform};\n \"\n />\n `;\n }\n\n #renderValueMarker(handle: SliderHandleKey | undefined, defs: unknown[]) {\n const bounds = getTrackBounds(this.orientation, this.#currentCross, this.#currentInsetStart, this.#currentInsetEnd);\n const cross = bounds.cross;\n const isHorizontal = this.orientation === `horizontal`;\n\n let value: number;\n if (this.valueMode === `single`) {\n value = this.#getRelativeValueA();\n } else {\n if (handle === `a`)\n value = this.#getRelativeValueA();\n else if (handle === `b`)\n value = this.#getRelativeValueB();\n else value = this.#getRelativeValueC();\n }\n\n const pos = valueToPosition(value, this.singleStyle, bounds, this.orientation);\n\n const markerOffset = this.#getCssVar(`--marker-offset`, 0);\n const markerLength = this.#getCssVar(`--marker-length`, 0.8);\n const markerThickness = this.#getCssVar(`--marker-thickness`, 0.15);\n const markerBorderWidth = this.#getCssVar(`--marker-border-width`, 0);\n\n const center = isHorizontal\n ? { x: pos.x, y: bounds.crossCentre + markerOffset * (cross / 2) }\n : { x: bounds.crossCentre + markerOffset * (cross / 2), y: pos.y };\n\n // For unipolar, the value bar is symmetric around the track centre, so\n // the \"low end\" is the reflection of the high end across the centre.\n const isUnipolarSingle = this.valueMode === `single` && this.singleStyle === `unipolar`;\n const lowCenter = isUnipolarSingle\n ? (isHorizontal\n ? { x: 2 * bounds.centre - center.x, y: center.y }\n : { x: center.x, y: 2 * bounds.centre - center.y })\n : undefined;\n\n const id = handle ?? `s`;\n\n // Per-handle marker-style override: in triple mode the C handle can\n // take a different shape than the global `markerStyle` applied to A/B.\n const effectiveMarkerStyle = handle === `c` && this.markerStyleC\n ? this.markerStyleC\n : this.markerStyle;\n\n if (effectiveMarkerStyle === `dot`) {\n const { rx, ry } = this.#circleRadiiUnits(this.#dotRadiusPx(), cross);\n const renderDot = (cx: number, cy: number, mid: string) => {\n if (markerBorderWidth > 0) {\n defs.push(svg`<ellipse id=\"dot-${mid}-path\" cx=\"${cx}\" cy=\"${cy}\" rx=\"${rx}\" ry=\"${ry}\" />`);\n return svg`\n <use href=\"#dot-${mid}-path\" class=\"marker-border\" />\n <use href=\"#dot-${mid}-path\" class=\"marker-fill\" />\n `;\n }\n return svg`<ellipse cx=\"${cx}\" cy=\"${cy}\" rx=\"${rx}\" ry=\"${ry}\" />`;\n };\n\n const high = renderDot(center.x, center.y, id);\n if (lowCenter) {\n return svg`${high}${renderDot(lowCenter.x, lowCenter.y, `${id}-low`)}`;\n }\n return high;\n }\n\n if (effectiveMarkerStyle === `needle`) {\n const halfLen = (markerLength * cross) / 4;\n // Draw perpendicular to the track\n const renderNeedle = (cx: number, cy: number, mid: string) => {\n let start: Point;\n let end: Point;\n if (isHorizontal) {\n start = { x: cx, y: cy - halfLen };\n end = { x: cx, y: cy + halfLen };\n } else {\n start = { x: cx - halfLen, y: cy };\n end = { x: cx + halfLen, y: cy };\n }\n const path = `M ${start.x} ${start.y} L ${end.x} ${end.y}`;\n if (markerBorderWidth > 0) {\n defs.push(svg`<path id=\"needle-${mid}-path\" d=\"${path}\" />`);\n return svg`\n <use href=\"#needle-${mid}-path\" class=\"marker-border\" />\n <use href=\"#needle-${mid}-path\" class=\"marker-fill\" />\n `;\n }\n return svg`<path d=\"${path}\" stroke-linecap=\"round\" />`;\n };\n\n const high = renderNeedle(center.x, center.y, id);\n if (lowCenter) {\n return svg`${high}${renderNeedle(lowCenter.x, lowCenter.y, `${id}-low`)}`;\n }\n return high;\n }\n\n if (effectiveMarkerStyle === `triangle`) {\n // Apex sits on the value-track centreline at `center`; base sits\n // perpendicular to the track, offset *outward* by markerLength so the\n // shape hangs outside the value band with its point facing in.\n const halfLen = (markerLength * cross) / 4;\n // Narrow base: half the cross-fraction so the triangle reads as a\n // pointer rather than a flattened wedge once axes are scaled.\n const halfBase = (markerThickness * cross) / 4;\n const renderTriangle = (cx: number, cy: number, mid: string) => {\n let apex: Point;\n let base1: Point;\n let base2: Point;\n if (isHorizontal) {\n apex = { x: cx, y: cy };\n base1 = { x: cx - halfBase, y: cy + halfLen };\n base2 = { x: cx + halfBase, y: cy + halfLen };\n } else {\n apex = { x: cx, y: cy };\n base1 = { x: cx + halfLen, y: cy - halfBase };\n base2 = { x: cx + halfLen, y: cy + halfBase };\n }\n const points = `${apex.x},${apex.y} ${base1.x},${base1.y} ${base2.x},${base2.y}`;\n if (markerBorderWidth > 0) {\n defs.push(svg`<polygon id=\"triangle-${mid}-path\" points=\"${points}\" />`);\n return svg`\n <use href=\"#triangle-${mid}-path\" class=\"marker-border\" />\n <use href=\"#triangle-${mid}-path\" class=\"marker-fill\" />\n `;\n }\n return svg`<polygon points=\"${points}\" />`;\n };\n\n const high = renderTriangle(center.x, center.y, id);\n if (lowCenter) {\n return svg`${high}${renderTriangle(lowCenter.x, lowCenter.y, `${id}-low`)}`;\n }\n return high;\n }\n\n return svg``;\n }\n\n #renderMidpointMarker() {\n if (this.valueMode !== `single`)\n return svg``;\n if (this.singleStyle !== `bipolar` && this.singleStyle !== `unipolar`)\n return svg``;\n const bounds = getTrackBounds(this.orientation, this.#currentCross, this.#currentInsetStart, this.#currentInsetEnd);\n const cross = bounds.cross;\n const isHorizontal = this.orientation === `horizontal`;\n const length = this.#getCssVar(`--midpoint-length`, 0.15);\n const halfLen = (length * cross) / 4;\n\n const center = isHorizontal\n ? { x: bounds.centre, y: bounds.crossCentre }\n : { x: bounds.crossCentre, y: bounds.centre };\n\n if (this.markerStyle === `dot`) {\n const size = this.#getCssVar(`--midpoint-thickness`, 0.08);\n const rPx = this.#currentCrossPx > 0 ? size * this.#currentCrossPx / 2 : size * (cross / 2);\n const { rx, ry } = this.#circleRadiiUnits(rPx, cross);\n return svg`\n <g class=\"midpoint-marker\" part=\"midpoint-marker\">\n <ellipse cx=\"${center.x}\" cy=\"${center.y}\" rx=\"${rx}\" ry=\"${ry}\" />\n </g>\n `;\n }\n\n let start: Point;\n let end: Point;\n if (isHorizontal) {\n start = { x: center.x, y: center.y - halfLen };\n end = { x: center.x, y: center.y + halfLen };\n } else {\n start = { x: center.x - halfLen, y: center.y };\n end = { x: center.x + halfLen, y: center.y };\n }\n\n return svg`\n <g class=\"midpoint-marker\" part=\"midpoint-marker\">\n <line x1=\"${start.x}\" y1=\"${start.y}\" x2=\"${end.x}\" y2=\"${end.y}\" />\n </g>\n `;\n }\n\n #renderHandleGroup(handle: SliderHandleKey | undefined, content: unknown) {\n if (!handle) {\n // Single-mode: don't put tabindex on the `<g>`. The host itself is\n // the focusable element (the inner SVG is tabindex=-1 so there is\n // exactly one tab stop and one focus outline), and keydown reaches\n // the handler via the host-level listener.\n return svg`<g role=\"slider\"\n class=\"value-marker\"\n aria-orientation=\"${this.orientation}\"\n aria-valuemin=\"${this.min}\" aria-valuemax=\"${this.max}\"\n aria-valuenow=\"${this.valueA}\"\n part=\"value-marker\">${content}</g>`;\n }\n const partName = `value-marker value-marker-${handle}`;\n const value = handle === `a`\n ? this.valueA\n : handle === `b`\n ? this.valueB\n : (this.valueC ?? (this.#poleA + this.#poleB) / 2);\n // Multi-handle: each handle is its own focusable group so Tab moves\n // between them independently.\n return svg`<g tabindex=\"${this.disabled ? -1 : 0}\" role=\"slider\"\n class=\"value-marker\"\n data-handle=\"${handle}\"\n aria-label=\"${handle}\"\n aria-orientation=\"${this.orientation}\"\n aria-valuemin=\"${this.min}\" aria-valuemax=\"${this.max}\"\n aria-valuenow=\"${value}\"\n part=\"${partName}\">${content}</g>`;\n }\n\n #isMultiHandle(): boolean {\n return this.valueMode !== `single`;\n }\n\n // ─── Lifecycle ──────────────────────────────────────────────────────\n protected override willUpdate(changed: PropertyValues): void {\n super.willUpdate(changed);\n\n // Sync internal poles from public properties\n if (changed.has(`valueA`) || changed.has(`valueB`) || !this.hasUpdated) {\n this.#poleA = this.valueA;\n this.#poleB = this.valueB;\n }\n\n // Initial / mode-change valueC defaulting\n if (this.valueMode === `triple`) {\n if (\n this.valueC === undefined\n || !this.#hasInitialisedValueC\n || changed.has(`valueMode`)\n ) {\n this.#poleC = (this.#poleA + this.#poleB) / 2;\n this.valueC = this.#poleC;\n this.#hasInitialisedValueC = true;\n } else {\n this.#poleC = this.valueC;\n }\n // Clamp C to [low, high]\n const lo = Math.min(this.#poleA, this.#poleB);\n const hi = Math.max(this.#poleA, this.#poleB);\n if (this.#poleC < lo)\n this.#poleC = lo;\n if (this.#poleC > hi)\n this.#poleC = hi;\n this.valueC = this.#poleC;\n } else {\n this.#poleC = undefined;\n }\n\n // Sync value lane before render\n if (\n changed.has(`valueA`)\n || changed.has(`valueB`)\n || changed.has(`valueMode`)\n || changed.has(`singleStyle`)\n || !this.hasUpdated\n ) {\n const valueLane = this.#lanes.get(`value`);\n if (valueLane && valueLane.type === `value`) {\n if (this.valueMode === `single`) {\n this.#applySingleStyleValueLane(valueLane, this.#getRelativeValueA());\n } else {\n valueLane.valueMin = valueToRelative(this.#low(), this.min, this.max);\n valueLane.valueMax = valueToRelative(this.#high(), this.min, this.max);\n }\n }\n }\n }\n\n /**\n * Sync the default 'value' lane's valueMin/valueMax for single-mode single-styles.\n * Range: bar from trackStart to value.\n * Bipolar: bar grows from track centre outward to value (or value to centre if below midpoint).\n * Unipolar: bar is centred on the track centre with length proportional to value.\n */\n #applySingleStyleValueLane(valueLane: SliderLaneData, relativeValue: number): void {\n if (this.singleStyle === `bipolar`) {\n valueLane.valueMin = Math.min(0.5, relativeValue);\n valueLane.valueMax = Math.max(0.5, relativeValue);\n } else {\n valueLane.valueMin = 0;\n valueLane.valueMax = relativeValue;\n }\n }\n\n override render(): unknown {\n // Size the viewBox to hug this render's content (markers, lanes,\n // track) before any sub-renderer reads the current insets.\n // Lane measuring comes first (dot floor + box math depend on it);\n // insets need the cross (dot/triangle along-axis extent scales with it).\n this.#measureLanes();\n this.#currentCross = this.#computeCross();\n const insets = this.#computeInsets(this.#currentCross);\n this.#currentInsetStart = insets.start;\n this.#currentInsetEnd = insets.end;\n const lanes = Array.from(this.#lanes.values());\n\n // Initial cursor before the first pointermove arrives. The dynamic\n // cursor (#onPointerMoveCursor) takes over as soon as the user moves\n // the pointer. In single mode the default `pointer` matches \"click to\n // set\"; in multi mode `default` matches \"no implicit interaction for\n // arbitrary track positions\".\n const cursor = this.disabled\n ? `not-allowed`\n : this.valueMode === `single`\n ? `pointer`\n : `default`;\n\n const handles: SliderHandleKey[] = this.#isMultiHandle()\n ? (this.valueMode === `triple` ? [`a`, `b`, `c`] : [`a`, `b`])\n : [];\n\n // Halo shapes for --marker-border-width>0 are pushed here so they end up\n // inside a single root <defs>, matching radial-input's pattern.\n // Compute marker content first so the defs list is populated, then\n // reference both in the template below.\n const markerDefs: unknown[] = [];\n const handleGroups = this.#isMultiHandle()\n ? handles.map(h => this.#renderHandleGroup(h, this.#renderValueMarker(h, markerDefs)))\n : this.#renderHandleGroup(undefined, this.#renderValueMarker(undefined, markerDefs));\n\n return html`\n <svg\n class=\"slider-svg\"\n viewBox=\"${this.#viewBox()}\"\n preserveAspectRatio=\"none\"\n tabindex=\"-1\"\n style=\"cursor: ${cursor}; width: 100%; height: 100%;\"\n @pointerdown=\"${this.#onPointerDown}\"\n @pointermove=\"${this.#onPointerMoveCursor}\"\n @pointerleave=\"${this.#onPointerLeaveCursor}\"\n @keydown=\"${this.#onKeyDown}\"\n @focusin=\"${this.#onFocusIn}\"\n >\n ${markerDefs.length > 0 ? svg`<defs>${markerDefs}</defs>` : svg``}\n ${this.#renderTrack()}\n ${lanes.map(lane => this.#renderLane(lane))}\n ${this.#renderMidpointMarker()}\n ${handleGroups}\n </svg>\n `;\n }\n\n /**\n * Compute the cursor for the current pointer position. The mapping:\n * - `grab` over a marker handle (single A, or multi A/B/C)\n * - `move` over a draggable segment (between A and B when value-drag is on)\n * - `pointer` over empty track where clicking sets a value (single mode,\n * or the dead zones outside A/B in multi mode)\n * - `default` over no-op segments (between A and B in dual mode when\n * value-drag is none, or between A-C/C-B in triple when value-drag is none)\n * - `not-allowed` when disabled\n *\n * `relativeValue` is in the host's long-axis space (0 = start, 1 = end,\n * already flipped for vertical). For unipolar single mode, the value\n * bar's marker positions are computed in the same space; the abs(2x-1)\n * remap only applies when setting the value on click/drag.\n */\n #cursorAtRelative(relativeValue: number): string {\n if (this.disabled)\n return `not-allowed`;\n if (this.#dragging)\n return `grabbing`;\n\n const HANDLE_HIT = 0.06;\n\n if (this.valueMode === `single`) {\n if (this.singleStyle === `unipolar`) {\n // In unipolar the bar is symmetric around the track centre; the\n // value bar's two ends sit at `0.5 ± value/2`.\n const halfLen = this.#getRelativeValueA() / 2;\n const low = 0.5 - halfLen;\n const high = 0.5 + halfLen;\n if (\n Math.abs(relativeValue - low) < HANDLE_HIT\n || Math.abs(relativeValue - high) < HANDLE_HIT\n ) {\n return `grab`;\n }\n return `pointer`;\n }\n const aRel = this.#getRelativeValueA();\n if (Math.abs(relativeValue - aRel) < HANDLE_HIT) {\n return `grab`;\n }\n return `pointer`;\n }\n\n const aRel = this.#getRelativeValueA();\n const bRel = this.#getRelativeValueB();\n const lo = Math.min(aRel, bRel);\n const hi = Math.max(aRel, bRel);\n\n // Over a handle: grab\n if (Math.abs(relativeValue - aRel) < HANDLE_HIT)\n return `grab`;\n if (Math.abs(relativeValue - bRel) < HANDLE_HIT)\n return `grab`;\n if (this.valueMode === `triple`) {\n const cRel = this.#getRelativeValueC();\n if (Math.abs(relativeValue - cRel) < HANDLE_HIT)\n return `grab`;\n }\n\n // Inside the segment between A and B\n if (relativeValue > lo && relativeValue < hi) {\n return this.valueDrag !== `none` ? `move` : `default`;\n }\n\n // Outside A/B (dead zone) — clicking here jumps A or B to that position\n return `pointer`;\n }\n\n #onPointerMoveCursor = (event: PointerEvent): void => {\n const svg = this.renderRoot.querySelector(`svg.slider-svg`) as SVGElement | null;\n if (!svg)\n return;\n this.#lastPointerClient = { x: event.clientX, y: event.clientY };\n const clientPos = this.orientation === `vertical` ? event.clientY : event.clientX;\n // Unipolar click mapping is NOT applied here — it's only for click-to-set;\n // the cursor needs the track-relative position to find the markers.\n const relativeValue = this.#relativeFromTrackPos(clientPos);\n const cursor = this.#cursorAtRelative(relativeValue);\n if (svg.style.cursor !== cursor) {\n svg.style.cursor = cursor;\n }\n };\n\n #onPointerLeaveCursor = (): void => {\n // Reset to the default cursor (whatever the host sets) when the pointer\n // leaves the slider area, so the cursor doesn't stay stuck on `grab` etc.\n const svg = this.renderRoot.querySelector(`svg.slider-svg`) as SVGElement | null;\n if (!svg)\n return;\n const cursor = this.disabled ? `not-allowed` : `default`;\n if (svg.style.cursor !== cursor) {\n svg.style.cursor = cursor;\n }\n };\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n\n // Update --value-relative / min/max/c CSS variables unconditionally\n if (this.valueMode === `single`) {\n this.style.setProperty(`--value-relative`, this.#getRelativeValueA().toString());\n } else {\n const lo = valueToRelative(this.#low(), this.min, this.max);\n const hi = valueToRelative(this.#high(), this.min, this.max);\n this.style.setProperty(`--value-min-relative`, lo.toString());\n this.style.setProperty(`--value-max-relative`, hi.toString());\n this.style.setProperty(`--value-relative`, hi.toString());\n if (this.valueMode === `triple` && this.#poleC !== undefined) {\n this.style.setProperty(`--value-c-relative`, valueToRelative(this.#poleC, this.min, this.max).toString());\n }\n }\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`keydown`, this.#onHostKeyDown);\n this.removeEventListener(`pointerdown`, this.#onSwipePointerDown as EventListener);\n this.removeEventListener(`pointermove`, this.#onSwipePointerMove as EventListener);\n this.removeEventListener(`pointerenter`, this.#onSwipePointerEnter as EventListener);\n this.#gradientObserver?.disconnect();\n this.#gradientObserver = undefined;\n this.#sizeObserver?.disconnect();\n this.#sizeObserver = undefined;\n if (this.#changeDebounceTimer !== undefined) {\n clearTimeout(this.#changeDebounceTimer);\n this.#changeDebounceTimer = undefined;\n }\n this.#onPointerUp();\n }\n\n static override styles = [themeFallbacks, prominenceStyles, css`\n :host {\n display: inline-block;\n width: 200px;\n height: 12px;\n touch-action: none;\n user-select: none;\n tabindex: 0;\n --value-relative: 0;\n --value-min-relative: 0;\n --value-max-relative: 0;\n --value-c-relative: 0;\n\n --lane-width: 0.16;\n }\n\n :host([orientation=\"vertical\"]) {\n width: 12px;\n height: 200px;\n }\n\n :host([disabled]) {\n cursor: not-allowed;\n }\n\n :host {\n outline: none;\n }\n\n :host(:focus-visible) {\n outline: var(--slider-input-svg-focus-outline, 2px solid var(--accent));\n outline-offset: var(--slider-input-svg-focus-outline-offset, 2px);\n }\n\n svg.slider-svg {\n display: block;\n width: 100%;\n height: 100%;\n outline: none;\n overflow: visible;\n }\n\n svg.slider-svg:focus {\n outline: none;\n }\n\n svg.slider-svg:focus-visible {\n outline: var(--slider-input-svg-focus-outline, 2px solid var(--accent));\n outline-offset: var(--slider-input-svg-focus-outline-offset, 2px);\n }\n\n .track {\n stroke: var(--track-color, var(--surface-4));\n /* Default 0 (not the stroke-width=\"0\" attribute below, which this\n rule overrides): the lanes carry the default visuals, so the rect\n is an opt-in backdrop via --track-fill / --track-width. A nonzero\n default here ballooned with the tight viewBox (2 units ≈ 60% of\n the cross axis) and swamped the lanes. */\n stroke-width: var(--track-width, 0);\n }\n\n .lane {\n fill: none;\n /* Rounded ends by default; set --lane-linecap: butt for square ends\n (reads cleaner under a needle/line marker). The inline style on the\n <path> repeats this so it wins over authored .lane rules. */\n stroke-linecap: var(--lane-linecap, round);\n stroke-dasharray: var(--lane-dasharray, none);\n stroke-dashoffset: var(--lane-dashoffset, 0);\n vector-effect: non-scaling-stroke;\n }\n\n .lane[data-lane-key='track'] {\n stroke: var(--lane-track-color, var(--surface-4));\n }\n\n .lane[data-lane-key='value'] {\n stroke: var(--lane-value-color, var(--accent));\n }\n\n .lane:not([data-lane-key='track']):not([data-lane-key='value']) {\n stroke: var(--lane-color, var(--accent));\n }\n\n .value-marker > path:not(.marker-border):not(.marker-fill),\n .value-marker > .marker-fill {\n stroke: var(--marker-color, var(--accent));\n stroke-width: calc(var(--marker-thickness, 0.15) * 12px);\n stroke-linecap: round;\n stroke-dasharray: var(--marker-dasharray, none);\n stroke-dashoffset: var(--marker-dashoffset, 0);\n vector-effect: non-scaling-stroke;\n }\n\n .value-marker > .marker-border {\n stroke: var(--marker-border-color, transparent);\n stroke-width: calc((var(--marker-thickness, 0.15) + var(--marker-border-width, 0) * 2) * 12px);\n stroke-linecap: round;\n vector-effect: non-scaling-stroke;\n }\n\n .value-marker .marker-fill,\n .value-marker circle,\n .value-marker polygon {\n fill: var(--marker-color, var(--accent));\n stroke-width: calc(var(--marker-thickness, 0.15) * 12px);\n }\n\n .value-marker[data-handle=\"a\"] > path:not(.marker-border):not(.marker-fill),\n .value-marker[data-handle=\"a\"] > .marker-fill,\n .value-marker[data-handle=\"a\"] > circle,\n .value-marker[data-handle=\"a\"] > polygon {\n stroke: var(--marker-a-color, var(--marker-color, var(--accent)));\n fill: var(--marker-a-color, var(--marker-color, var(--accent)));\n }\n\n .value-marker[data-handle=\"b\"] > path:not(.marker-border):not(.marker-fill),\n .value-marker[data-handle=\"b\"] > .marker-fill,\n .value-marker[data-handle=\"b\"] > circle,\n .value-marker[data-handle=\"b\"] > polygon {\n stroke: var(--marker-b-color, var(--marker-color, var(--accent)));\n fill: var(--marker-b-color, var(--marker-color, var(--accent)));\n }\n\n .value-marker[data-handle=\"c\"] > path:not(.marker-border):not(.marker-fill),\n .value-marker[data-handle=\"c\"] > .marker-fill,\n .value-marker[data-handle=\"c\"] > circle,\n .value-marker[data-handle=\"c\"] > polygon {\n stroke: var(--marker-c-color, var(--marker-color, var(--accent)));\n fill: var(--marker-c-color, var(--marker-color, var(--accent)));\n }\n\n .midpoint-marker line {\n stroke: var(--midpoint-color, var(--surface-muted-text));\n stroke-width: var(--midpoint-thickness, 1px);\n stroke-linecap: round;\n vector-effect: non-scaling-stroke;\n }\n\n .midpoint-marker circle {\n fill: var(--midpoint-color, var(--surface-muted-text));\n stroke: var(--midpoint-border-color, transparent);\n stroke-width: var(--midpoint-border-width, 0);\n vector-effect: non-scaling-stroke;\n }\n `];\n}\n\n// ─── Tag-name registration ───────────────────────────────────────────\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-slider-input': SliderInputElement;\n }\n}\n\n// ─── Module-scope interface merge (typed addEventListener) ─────────────\nexport interface SliderInputElement {\n addEventListener: (<K extends keyof SliderInputElementEventMap>(\n type: K,\n listener: (this: SliderInputElement, event: SliderInputElementEventMap[K]) => void,\n options?: boolean | AddEventListenerOptions,\n ) => void) & ((\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"snackbar.d.ts","names":[],"sources":["../src/snackbar/snackbar.ts"],"mappings":";;KAMY;KACA;KACA;;;;;;;cAWC,wBAAwB;EACP;EACA,MAAM;EACS,WAAW;EAC1B,SAAS;EACgB;EACA;UAEpC;UAQT;mBAES;UAET;UACA;UACA;UACA;UACA;mBAES;mBACA;mBAQA;mBACA;mBACA;mBAKA;mBAQA;MAKb;EAIJ;EAUA;EAUA;EAkBS;EAYA;EAUA,QAAQ,SAAS,IAAI;UAOtB;UAOA;UAwCA;UA4BA;UAUA;UAUA;UAOA;SAOQ,sBAAM;YA0DH,wBAAM;;QAKnB;YACI;IACR,iBAAiB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"snackbar.js","names":["customElement"],"sources":["../src/snackbar/snackbar.ts"],"sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { popupSurfaceStyles } from '../styles/popup.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type SnackbarMode = `explicit` | `manual` | `implicit`;\nexport type SnackbarPlacement = `top` | `bottom` | `left` | `right`;\nexport type SnackbarDismiss = `auto` | `manual`;\n\nlet _instanceCounter = 0;\n\n/**\n * `ixfx-snackbar` is itself the popover panel (`popover=\"auto\"` set on the host) -\n * unlike `ixfx-menu-trigger`/`ixfx-colour-picker-popup` there's no separate always-visible\n * trigger living inside the component to keep out of the top layer; the trigger is the\n * external `for` target, so the whole host can be the popover content.\n */\n@customElement(`ixfx-snackbar`)\nexport class SnackbarElement extends LitElement {\n @property({ type: String }) for = ``;\n @property({ type: String }) mode: SnackbarMode = `explicit`;\n @property({ type: String, reflect: true }) placement: SnackbarPlacement = `top`;\n @property({ type: String }) dismiss: SnackbarDismiss = `auto`;\n @property({ type: Number, attribute: `show-delay` }) showDelay = 150;\n @property({ type: Number, attribute: `hide-delay` }) hideDelay = 500;\n\n @state() private _isOpen = false;\n\n // When a close wasn't initiated by our own code (light-dismiss: click outside or\n // Escape) the popover is already closed before the click that triggered it dispatches.\n // toggle() consults this to avoid immediately re-opening via togglePopover(). The\n // timestamp window is deliberately tiny — light-dismiss and the ensuing click happen\n // in the same event dispatch, microseconds apart, so it can't swallow a later, real\n // toggle (e.g. clicking a toggle button after having dismissed the popover earlier).\n private _recentCloseAt: number | undefined;\n\n private readonly _anchorName = `--ixfx-snackbar-anchor-${++_instanceCounter}`;\n\n private _target: HTMLElement | undefined;\n private _addedTabindex = false;\n private _addedRole = false;\n private _showTimeout: number | undefined;\n private _hideTimeout: number | undefined;\n\n private readonly _onTargetClick = (): void => this.toggle();\n private readonly _onTargetKeydown = (e: KeyboardEvent): void => {\n if (e.key !== `Enter` && e.key !== ` `)\n return;\n e.preventDefault();\n this.toggle();\n };\n\n // Shared by both the target and the panel itself - hovering/focusing either keeps it open.\n private readonly _onTickleIn = (): void => this._scheduleShow();\n private readonly _onTickleOut = (): void => this._scheduleHide();\n private readonly _onPanelClick = (): void => {\n if (this.dismiss === `auto`)\n this.hide();\n };\n\n private readonly _onToggle = (e: Event): void => {\n const { newState } = e as ToggleEvent;\n this._isOpen = newState === `open`;\n if (newState === `closed` && this.contains(document.activeElement)) {\n this._target?.focus();\n }\n };\n\n private readonly _onBeforeToggle = (e: Event): void => {\n const { newState } = e as ToggleEvent;\n this._recentCloseAt = newState === `closed` ? performance.now() : undefined;\n };\n\n get isOpen(): boolean {\n return this._isOpen;\n }\n\n show(): void {\n if (!this.popover)\n return;\n try {\n this.showPopover();\n } catch {\n // already open, or popover API unsupported\n }\n }\n\n hide(): void {\n if (!this.popover)\n return;\n try {\n this.hidePopover();\n } catch {\n // already closed\n }\n }\n\n toggle(): void {\n if (!this.popover)\n return;\n // If the popover was just closed by light-dismiss as part of this same click\n // (click outside closes an `auto` popover before the click event dispatches),\n // togglePopover() would re-open it. Honour the dismiss instead: the popover is\n // already closed, so the toggle is a no-op.\n if (this._recentCloseAt !== undefined && performance.now() - this._recentCloseAt < 50) {\n this._recentCloseAt = undefined;\n return;\n }\n try {\n this.togglePopover();\n } catch {\n // popover API unsupported\n }\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n if (!this.hasAttribute(`popover`))\n this.popover = `auto`;\n this.classList.add(`popup-surface`);\n this.addEventListener(`toggle`, this._onToggle);\n this.addEventListener(`beforetoggle`, this._onBeforeToggle);\n this.addEventListener(`click`, this._onPanelClick);\n this.style.setProperty(`position-anchor`, this._anchorName);\n this._attachToTarget();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(`toggle`, this._onToggle);\n this.removeEventListener(`beforetoggle`, this._onBeforeToggle);\n this.removeEventListener(`click`, this._onPanelClick);\n this._detachFromTarget();\n this._cancelShow();\n this._cancelHide();\n }\n\n override updated(changed: Map<PropertyKey, unknown>): void {\n super.updated(changed);\n if (changed.has(`for`) || changed.has(`mode`)) {\n this._attachToTarget();\n }\n }\n\n private _resolveTarget(): HTMLElement | undefined {\n if (!this.for)\n return undefined;\n const root = this.getRootNode() as Document | ShadowRoot;\n return root.getElementById(this.for) ?? undefined;\n }\n\n private _attachToTarget(): void {\n this._detachFromTarget();\n\n const target = this._resolveTarget();\n if (!target) {\n if (this.for)\n console.warn(`ixfx-snackbar: no element found with id \"${this.for}\"`);\n return;\n }\n this._target = target;\n target.style.setProperty(`anchor-name`, this._anchorName);\n\n if (this.mode === `explicit`) {\n const alreadyFocusable = target.tabIndex >= 0;\n if (!alreadyFocusable) {\n target.setAttribute(`tabindex`, `0`);\n this._addedTabindex = true;\n }\n if (!target.hasAttribute(`role`) && !alreadyFocusable) {\n target.setAttribute(`role`, `button`);\n this._addedRole = true;\n }\n target.setAttribute(`aria-haspopup`, `true`);\n target.addEventListener(`click`, this._onTargetClick);\n // Native interactive elements (button, a[href], ...) already turn Enter/Space into a\n // click; a target we just made focusable via role=\"button\" does not get that for free.\n if (!alreadyFocusable)\n target.addEventListener(`keydown`, this._onTargetKeydown);\n } else if (this.mode === `implicit`) {\n target.addEventListener(`pointerenter`, this._onTickleIn);\n target.addEventListener(`focus`, this._onTickleIn);\n target.addEventListener(`pointerleave`, this._onTickleOut);\n target.addEventListener(`blur`, this._onTickleOut);\n this.addEventListener(`pointerenter`, this._onTickleIn);\n this.addEventListener(`focusin`, this._onTickleIn);\n this.addEventListener(`pointerleave`, this._onTickleOut);\n this.addEventListener(`focusout`, this._onTickleOut);\n }\n }\n\n private _detachFromTarget(): void {\n const target = this._target;\n if (!target)\n return;\n\n target.style.removeProperty(`anchor-name`);\n if (this._addedTabindex) {\n target.removeAttribute(`tabindex`);\n this._addedTabindex = false;\n }\n if (this._addedRole) {\n target.removeAttribute(`role`);\n this._addedRole = false;\n }\n target.removeAttribute(`aria-haspopup`);\n target.removeEventListener(`click`, this._onTargetClick);\n target.removeEventListener(`keydown`, this._onTargetKeydown);\n target.removeEventListener(`pointerenter`, this._onTickleIn);\n target.removeEventListener(`focus`, this._onTickleIn);\n target.removeEventListener(`pointerleave`, this._onTickleOut);\n target.removeEventListener(`blur`, this._onTickleOut);\n this.removeEventListener(`pointerenter`, this._onTickleIn);\n this.removeEventListener(`focusin`, this._onTickleIn);\n this.removeEventListener(`pointerleave`, this._onTickleOut);\n this.removeEventListener(`focusout`, this._onTickleOut);\n this._target = undefined;\n }\n\n private _scheduleShow(): void {\n this._cancelHide();\n this._cancelShow();\n if (this.showDelay <= 0) {\n this.show();\n return;\n }\n this._showTimeout = window.setTimeout(() => this.show(), this.showDelay);\n }\n\n private _scheduleHide(): void {\n this._cancelShow();\n this._cancelHide();\n if (this.hideDelay <= 0) {\n this.hide();\n return;\n }\n this._hideTimeout = window.setTimeout(() => this.hide(), this.hideDelay);\n }\n\n private _cancelShow(): void {\n if (this._showTimeout !== undefined) {\n window.clearTimeout(this._showTimeout);\n this._showTimeout = undefined;\n }\n }\n\n private _cancelHide(): void {\n if (this._hideTimeout !== undefined) {\n window.clearTimeout(this._hideTimeout);\n this._hideTimeout = undefined;\n }\n }\n\n static override styles = [\n themeFallbacks,\n popupSurfaceStyles,\n css`\n :host {\n display: flex;\n align-items: center;\n gap: var(--space-s);\n padding: var(--space-s);\n\n position: fixed;\n inset: unset;\n margin: 0;\n z-index: 100;\n position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;\n\n opacity: 0;\n scale: 0.97;\n pointer-events: none;\n transition: opacity 0.12s ease-out, scale 0.12s ease-out,\n display 0.12s allow-discrete, overlay 0.12s allow-discrete;\n }\n\n :host(:popover-open) {\n opacity: 1;\n scale: 1;\n pointer-events: auto;\n }\n\n @starting-style {\n :host(:popover-open) {\n opacity: 0;\n scale: 0.97;\n }\n }\n\n :host([placement=\"top\"]) {\n position-area: block-start;\n margin-block-end: var(--space-s);\n }\n\n :host([placement=\"bottom\"]) {\n position-area: block-end;\n margin-block-start: var(--space-s);\n }\n\n :host([placement=\"left\"]) {\n position-area: inline-start;\n margin-inline-end: var(--space-s);\n }\n\n :host([placement=\"right\"]) {\n position-area: inline-end;\n margin-inline-start: var(--space-s);\n }\n `,\n ];\n\n protected override render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-snackbar': SnackbarElement;\n }\n}\n"],"mappings":";;;;;;AAUA,IAAI,mBAAmB;AAShB,IAAM,kBAAN,MAAM,wBAAwB,WAAW;;;EACZ,KAAA,MAAA;EACe,KAAA,OAAA;EACyB,KAAA,YAAA;EACnB,KAAA,UAAA;EACU,KAAA,YAAA;EACA,KAAA,YAAA;EAEtC,KAAA,UAAA;EAUI,KAAA,cAAA,0BAA0B,EAAE;EAGlC,KAAA,iBAAA;EACJ,KAAA,aAAA;EAIyB,KAAA,uBAAA,KAAK,OAAO;EACrB,KAAA,oBAAA,MAA2B;GAC9D,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KACjC;GACF,EAAE,eAAe;GACjB,KAAK,OAAO;EACd;EAG2C,KAAA,oBAAA,KAAK,cAAc;EAClB,KAAA,qBAAA,KAAK,cAAc;EAClB,KAAA,sBAAA;GAC3C,IAAI,KAAK,YAAY,QACnB,KAAK,KAAK;EACd;EAE8B,KAAA,aAAA,MAAmB;GAC/C,MAAM,EAAE,aAAa;GACrB,KAAK,UAAU,aAAa;GAC5B,IAAI,aAAa,YAAY,KAAK,SAAS,SAAS,aAAa,GAC/D,KAAK,SAAS,MAAM;EAExB;EAEoC,KAAA,mBAAA,MAAmB;GACrD,MAAM,EAAE,aAAa;GACrB,KAAK,iBAAiB,aAAa,WAAW,YAAY,IAAI,IAAI,KAAA;EACpE;;CAEA,IAAI,SAAkB;EACpB,OAAO,KAAK;CACd;CAEA,OAAa;EACX,IAAI,CAAC,KAAK,SACR;EACF,IAAI;GACF,KAAK,YAAY;EACnB,QAAQ,CAER;CACF;CAEA,OAAa;EACX,IAAI,CAAC,KAAK,SACR;EACF,IAAI;GACF,KAAK,YAAY;EACnB,QAAQ,CAER;CACF;CAEA,SAAe;EACb,IAAI,CAAC,KAAK,SACR;EAKF,IAAI,KAAK,mBAAmB,KAAA,KAAa,YAAY,IAAI,IAAI,KAAK,iBAAiB,IAAI;GACrF,KAAK,iBAAiB,KAAA;GACtB;EACF;EACA,IAAI;GACF,KAAK,cAAc;EACrB,QAAQ,CAER;CACF;CAEA,oBAAmC;EACjC,MAAM,kBAAkB;EACxB,IAAI,CAAC,KAAK,aAAa,SAAS,GAC9B,KAAK,UAAU;EACjB,KAAK,UAAU,IAAI,eAAe;EAClC,KAAK,iBAAiB,UAAU,KAAK,SAAS;EAC9C,KAAK,iBAAiB,gBAAgB,KAAK,eAAe;EAC1D,KAAK,iBAAiB,SAAS,KAAK,aAAa;EACjD,KAAK,MAAM,YAAY,mBAAmB,KAAK,WAAW;EAC1D,KAAK,gBAAgB;CACvB;CAEA,uBAAsC;EACpC,MAAM,qBAAqB;EAC3B,KAAK,oBAAoB,UAAU,KAAK,SAAS;EACjD,KAAK,oBAAoB,gBAAgB,KAAK,eAAe;EAC7D,KAAK,oBAAoB,SAAS,KAAK,aAAa;EACpD,KAAK,kBAAkB;EACvB,KAAK,YAAY;EACjB,KAAK,YAAY;CACnB;CAEA,QAAiB,SAA0C;EACzD,MAAM,QAAQ,OAAO;EACrB,IAAI,QAAQ,IAAI,KAAK,KAAK,QAAQ,IAAI,MAAM,GAC1C,KAAK,gBAAgB;CAEzB;CAEA,iBAAkD;EAChD,IAAI,CAAC,KAAK,KACR,OAAO,KAAA;EAET,OADa,KAAK,YACR,CAAC,CAAC,eAAe,KAAK,GAAG,KAAK,KAAA;CAC1C;CAEA,kBAAgC;EAC9B,KAAK,kBAAkB;EAEvB,MAAM,SAAS,KAAK,eAAe;EACnC,IAAI,CAAC,QAAQ;GACX,IAAI,KAAK,KACP,QAAQ,KAAK,4CAA4C,KAAK,IAAI,EAAE;GACtE;EACF;EACA,KAAK,UAAU;EACf,OAAO,MAAM,YAAY,eAAe,KAAK,WAAW;EAExD,IAAI,KAAK,SAAS,YAAY;GAC5B,MAAM,mBAAmB,OAAO,YAAY;GAC5C,IAAI,CAAC,kBAAkB;IACrB,OAAO,aAAa,YAAY,GAAG;IACnC,KAAK,iBAAiB;GACxB;GACA,IAAI,CAAC,OAAO,aAAa,MAAM,KAAK,CAAC,kBAAkB;IACrD,OAAO,aAAa,QAAQ,QAAQ;IACpC,KAAK,aAAa;GACpB;GACA,OAAO,aAAa,iBAAiB,MAAM;GAC3C,OAAO,iBAAiB,SAAS,KAAK,cAAc;GAGpD,IAAI,CAAC,kBACH,OAAO,iBAAiB,WAAW,KAAK,gBAAgB;EAC5D,OAAO,IAAI,KAAK,SAAS,YAAY;GACnC,OAAO,iBAAiB,gBAAgB,KAAK,WAAW;GACxD,OAAO,iBAAiB,SAAS,KAAK,WAAW;GACjD,OAAO,iBAAiB,gBAAgB,KAAK,YAAY;GACzD,OAAO,iBAAiB,QAAQ,KAAK,YAAY;GACjD,KAAK,iBAAiB,gBAAgB,KAAK,WAAW;GACtD,KAAK,iBAAiB,WAAW,KAAK,WAAW;GACjD,KAAK,iBAAiB,gBAAgB,KAAK,YAAY;GACvD,KAAK,iBAAiB,YAAY,KAAK,YAAY;EACrD;CACF;CAEA,oBAAkC;EAChC,MAAM,SAAS,KAAK;EACpB,IAAI,CAAC,QACH;EAEF,OAAO,MAAM,eAAe,aAAa;EACzC,IAAI,KAAK,gBAAgB;GACvB,OAAO,gBAAgB,UAAU;GACjC,KAAK,iBAAiB;EACxB;EACA,IAAI,KAAK,YAAY;GACnB,OAAO,gBAAgB,MAAM;GAC7B,KAAK,aAAa;EACpB;EACA,OAAO,gBAAgB,eAAe;EACtC,OAAO,oBAAoB,SAAS,KAAK,cAAc;EACvD,OAAO,oBAAoB,WAAW,KAAK,gBAAgB;EAC3D,OAAO,oBAAoB,gBAAgB,KAAK,WAAW;EAC3D,OAAO,oBAAoB,SAAS,KAAK,WAAW;EACpD,OAAO,oBAAoB,gBAAgB,KAAK,YAAY;EAC5D,OAAO,oBAAoB,QAAQ,KAAK,YAAY;EACpD,KAAK,oBAAoB,gBAAgB,KAAK,WAAW;EACzD,KAAK,oBAAoB,WAAW,KAAK,WAAW;EACpD,KAAK,oBAAoB,gBAAgB,KAAK,YAAY;EAC1D,KAAK,oBAAoB,YAAY,KAAK,YAAY;EACtD,KAAK,UAAU,KAAA;CACjB;CAEA,gBAA8B;EAC5B,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,IAAI,KAAK,aAAa,GAAG;GACvB,KAAK,KAAK;GACV;EACF;EACA,KAAK,eAAe,OAAO,iBAAiB,KAAK,KAAK,GAAG,KAAK,SAAS;CACzE;CAEA,gBAA8B;EAC5B,KAAK,YAAY;EACjB,KAAK,YAAY;EACjB,IAAI,KAAK,aAAa,GAAG;GACvB,KAAK,KAAK;GACV;EACF;EACA,KAAK,eAAe,OAAO,iBAAiB,KAAK,KAAK,GAAG,KAAK,SAAS;CACzE;CAEA,cAA4B;EAC1B,IAAI,KAAK,iBAAiB,KAAA,GAAW;GACnC,OAAO,aAAa,KAAK,YAAY;GACrC,KAAK,eAAe,KAAA;EACtB;CACF;CAEA,cAA4B;EAC1B,IAAI,KAAK,iBAAiB,KAAA,GAAW;GACnC,OAAO,aAAa,KAAK,YAAY;GACrC,KAAK,eAAe,KAAA;EACtB;CACF;;EAEyB,KAAA,SAAA;GACvB;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqDL;;CAEA,SAA4B;EAC1B,OAAO,IAAI;CACb;AACF;AAvSG,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,gBAAA,WAAA,OAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,gBAAA,WAAA,QAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,gBAAA,WAAA,aAAA,KAAA,CAAA;AACxC,WAAA,CAAA,SAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,gBAAA,WAAA,WAAA,KAAA,CAAA;AACzB,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAa,CAAC,CAAA,GAAA,gBAAA,WAAA,aAAA,KAAA,CAAA;AAClD,WAAA,CAAA,SAAS;CAAE,MAAM;CAAQ,WAAW;AAAa,CAAC,CAAA,GAAA,gBAAA,WAAA,aAAA,KAAA,CAAA;AAElD,WAAA,CAAA,MAAM,CAAA,GAAA,gBAAA,WAAA,WAAA,KAAA,CAAA;AATRA,kBAAAA,WAAAA,CAAAA,kBAAc,eAAe,CAAA,GAAA,eAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"snap-container.d.ts","names":[],"sources":["../src/snap-container/snap-container.ts"],"mappings":";;KAIY;KACA;cAGC,sBAAsB;SACjB,sBAAM;EA0DtB;EAGA;EAGA,WAAW;EAGX;EAGA;UAGQ;UAEA;UACA;UACA;UACA;UACA;cAEI;UAIJ;UAMA;UAwCA;UA8BA;UAWA;UAwBA;UA0DA;UAyBA;UA2BA;EAoCC;EAKA,QAAQ,mBAAmB;EAM3B,UAAU,kBAAkB;;KAc3B;WACD;WACA;;KAGC,kBAAkB,YAAY;KAE9B;WACD;;KAGC,iBAAiB,YAAY;QAEjC;YACI;IACR,uBAAuB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"snap-container.js","names":["customElement"],"sources":["../src/snap-container/snap-container.ts"],"sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { property, state } from 'lit/decorators.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\nexport type SnapLogic = `centre` | `balanced`;\nexport type ClickSnapMode = `closest` | `step`;\n\n@customElement(`ixfx-snap-container`)\nexport class SnapContainer extends LitElement {\n static override styles = css`\n :host {\n display: block;\n position: relative;\n overflow: hidden;\n touch-action: none;\n user-select: none;\n --transition-duration: 200ms;\n }\n \n :host([orientation=\"horizontal\"]) {\n width: 100%;\n height: auto;\n min-height: 25px;\n }\n \n :host([orientation=\"vertical\"]) {\n height: 100%;\n width: auto;\n min-width: 25px;\n }\n \n :host(:not([orientation])) {\n width: 100%;\n min-height: 25px;\n }\n \n .container {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: inherit;\n min-width: inherit;\n }\n \n ::slotted(*) {\n position: absolute;\n transition: left var(--transition-duration) ease-out, \n top var(--transition-duration) ease-out;\n cursor: grab;\n will-change: left, top;\n }\n \n ::slotted(*:active) {\n cursor: grabbing;\n }\n \n :host([orientation=\"vertical\"]) ::slotted(*) {\n transition: top var(--transition-duration) ease-out,\n left var(--transition-duration) ease-out;\n }\n \n .dragging {\n transition: none !important;\n }\n `;\n\n @property({ type: String, attribute: `orientation` })\n orientation: `horizontal` | `vertical` = `horizontal`;\n\n @property({ type: Number, attribute: `snap-positions` })\n snapPositions = 3;\n\n @property({ type: String, attribute: `snap-logic` })\n snapLogic: SnapLogic = `balanced`;\n\n @property({ type: String, attribute: `click-snap` })\n clickSnap: `closest` | `step` = `closest`;\n\n @property({ type: Number })\n snap = 0;\n\n @state()\n private _dragging = false;\n\n private _dragStart = 0;\n private _dragThreshold = 10;\n private _thresholdReached = false;\n private _currentDragIndex = 0;\n private _child: HTMLElement | null = null;\n\n private get _isHorizontal(): boolean {\n return this.orientation !== `vertical`;\n }\n\n private _getChild(): HTMLElement | null {\n if (this._child)\n return this._child;\n return this.firstElementChild as HTMLElement | null;\n }\n\n private _computeSnapPositions(): number[] {\n const positions: number[] = [];\n const containerSize = this._isHorizontal ? this.clientWidth : this.clientHeight;\n const child = this._getChild();\n const childSize = child\n ? (this._isHorizontal ? child.offsetWidth : child.offsetHeight)\n : 0;\n\n if (containerSize === 0 || childSize === 0)\n return [];\n\n const availableSpace = containerSize - childSize;\n\n if (this.snapLogic === `centre`) {\n for (let i = 0; i < this.snapPositions; i++) {\n const fraction = i / (this.snapPositions - 1 || 1);\n positions.push(fraction * availableSpace);\n }\n } else {\n const firstPosition = 0;\n const lastPosition = availableSpace;\n\n if (this.snapPositions === 1) {\n positions.push(availableSpace / 2);\n } else if (this.snapPositions === 2) {\n positions.push(firstPosition, lastPosition);\n } else {\n positions.push(firstPosition);\n const middleCount = this.snapPositions - 2;\n for (let i = 1; i <= middleCount; i++) {\n const fraction = i / (middleCount + 1);\n positions.push(firstPosition + fraction * (lastPosition - firstPosition));\n }\n positions.push(lastPosition);\n }\n }\n\n return positions;\n }\n\n private _getSnapIndex(clientPos: number, containerRect: DOMRect): number {\n const offsetInAxis = this._isHorizontal\n ? clientPos - containerRect.left\n : clientPos - containerRect.top;\n\n const snapPositions = this._computeSnapPositions();\n if (snapPositions.length === 0)\n return 0;\n\n const child = this._getChild();\n const childSize = child\n ? (this._isHorizontal ? child.offsetWidth : child.offsetHeight)\n : 0;\n\n const halfChild = childSize / 2;\n let closestIndex = 0;\n let closestDistance = Infinity;\n\n for (let i = 0; i < snapPositions.length; i++) {\n const snapCenter = snapPositions[i] + halfChild;\n const distance = Math.abs(offsetInAxis - snapCenter);\n if (distance < closestDistance) {\n closestDistance = distance;\n closestIndex = i;\n }\n }\n\n return closestIndex;\n }\n\n private _clampChildPosition(position: number): number {\n const containerSize = this._isHorizontal ? this.clientWidth : this.clientHeight;\n const child = this._getChild();\n const childSize = child\n ? (this._isHorizontal ? child.offsetWidth : child.offsetHeight)\n : 0;\n\n const maxPosition = containerSize - childSize;\n return Math.max(0, Math.min(position, maxPosition));\n }\n\n private _updateChildPosition(index: number): void {\n const snapPositions = this._computeSnapPositions();\n if (snapPositions.length === 0)\n return;\n\n const clampedIndex = Math.max(0, Math.min(index, snapPositions.length - 1));\n const position = snapPositions[clampedIndex];\n\n const child = this._getChild();\n if (!child)\n return;\n\n if (this._isHorizontal) {\n const clampedPosition = this._clampChildPosition(position);\n child.style.left = `${clampedPosition}px`;\n child.style.top = `0px`;\n } else {\n const clampedPosition = this._clampChildPosition(position);\n child.style.top = `${clampedPosition}px`;\n child.style.left = `0px`;\n }\n child.style.setProperty(`--snap-index`, String(clampedIndex));\n }\n\n private _onPointerDown = (e: PointerEvent): void => {\n const child = this._getChild();\n if (!child)\n return;\n\n const containerRect = this.getBoundingClientRect();\n const newIndex = this._getSnapIndex(\n this._isHorizontal ? e.clientX : e.clientY,\n containerRect,\n );\n\n if (child.contains(e.target as Node)) {\n e.preventDefault();\n e.stopPropagation();\n this._dragging = true;\n this._thresholdReached = false;\n this._dragStart = this._isHorizontal ? e.clientX : e.clientY;\n this._currentDragIndex = newIndex;\n child.classList.add(`dragging`);\n\n document.addEventListener(`pointermove`, this._onPointerMove);\n document.addEventListener(`pointerup`, this._onPointerUp);\n } else {\n let targetIndex: number;\n\n if (this.clickSnap === `step`) {\n targetIndex = this.snap;\n const childRect = child.getBoundingClientRect();\n const childCenter = this._isHorizontal\n ? childRect.left + childRect.width / 2\n : childRect.top + childRect.height / 2;\n const clickPos = this._isHorizontal ? e.clientX : e.clientY;\n\n if (clickPos > childCenter) {\n targetIndex = Math.min(this.snapPositions - 1, this.snap + 1);\n } else if (clickPos < childCenter) {\n targetIndex = Math.max(0, this.snap - 1);\n }\n } else {\n targetIndex = newIndex;\n }\n\n if (targetIndex !== this.snap) {\n const previousSnap = this.snap;\n this.snap = targetIndex;\n this._updateChildPosition(this.snap);\n\n this.dispatchEvent(new CustomEvent<SnapChangeDetail>(`snap-change`, {\n detail: { previousSnap, newSnap: this.snap },\n bubbles: true,\n composed: true,\n }));\n } else {\n this._updateChildPosition(this.snap);\n }\n }\n };\n\n private _onPointerMove = (e: PointerEvent): void => {\n if (!this._dragging)\n return;\n\n const currentPos = this._isHorizontal ? e.clientX : e.clientY;\n const delta = currentPos - this._dragStart;\n const containerRect = this.getBoundingClientRect();\n\n if (!this._thresholdReached && Math.abs(delta) < this._dragThreshold) {\n return;\n }\n\n this._thresholdReached = true;\n\n const newIndex = this._getSnapIndex(currentPos, containerRect);\n this._currentDragIndex = newIndex;\n this._updateChildPosition(newIndex);\n\n this.dispatchEvent(new CustomEvent<SnapInputDetail>(`snap-input`, {\n detail: { index: newIndex },\n bubbles: true,\n composed: true,\n }));\n };\n\n private _onPointerUp = (): void => {\n if (!this._dragging)\n return;\n\n this._dragging = false;\n const child = this._getChild();\n if (child)\n child.classList.remove(`dragging`);\n\n document.removeEventListener(`pointermove`, this._onPointerMove);\n document.removeEventListener(`pointerup`, this._onPointerUp);\n\n if (this._thresholdReached && this._currentDragIndex !== this.snap) {\n const previousSnap = this.snap;\n this.snap = this._currentDragIndex;\n this._updateChildPosition(this.snap);\n\n this.dispatchEvent(new CustomEvent<SnapChangeDetail>(`snap-change`, {\n detail: { previousSnap, newSnap: this.snap },\n bubbles: true,\n composed: true,\n }));\n } else {\n this._updateChildPosition(this.snap);\n }\n };\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n let newSnap = this.snap;\n\n if (this._isHorizontal) {\n if (e.key === `ArrowLeft`) {\n newSnap = Math.max(0, this.snap - 1);\n } else if (e.key === `ArrowRight`) {\n newSnap = Math.min(this.snapPositions - 1, this.snap + 1);\n } else {\n return;\n }\n } else {\n if (e.key === `ArrowUp`) {\n newSnap = Math.max(0, this.snap - 1);\n } else if (e.key === `ArrowDown`) {\n newSnap = Math.min(this.snapPositions - 1, this.snap + 1);\n } else {\n return;\n }\n }\n\n e.preventDefault();\n\n if (newSnap !== this.snap) {\n const previousSnap = this.snap;\n this.snap = newSnap;\n this._updateChildPosition(this.snap);\n\n this.dispatchEvent(new CustomEvent<SnapChangeDetail>(`snap-change`, {\n detail: { previousSnap, newSnap: this.snap },\n bubbles: true,\n composed: true,\n }));\n }\n };\n\n override firstUpdated(): void {\n this._child = this.firstElementChild as HTMLElement | null;\n this._updateChildPosition(this.snap);\n }\n\n override updated(changedProperties: Map<string, unknown>): void {\n if (changedProperties.has(`snap`) && !this._dragging) {\n this._updateChildPosition(this.snap);\n }\n }\n\n override render(): ReturnType<typeof html> {\n return html`\n <div \n class=\"container\"\n @pointerdown=${this._onPointerDown}\n tabindex=\"0\"\n @keydown=${this._onKeyDown}\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\nexport type SnapChangeDetail = {\n readonly previousSnap: number;\n readonly newSnap: number;\n};\n\nexport type SnapChangeEvent = CustomEvent<SnapChangeDetail>;\n\nexport type SnapInputDetail = {\n readonly index: number;\n};\n\nexport type SnapInputEvent = CustomEvent<SnapInputDetail>;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-snap-container': SnapContainer;\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"split-layout-C5SYbDrq.d.ts","names":[],"sources":["../src/split-layout/types.ts","../src/split-layout/split-panel.ts","../src/split-layout/split-layout.ts"],"mappings":";;KAAY;KAEA;UAEK;EACf;EACA;EACA,IAAI;EACJ;EACA;EACA;EACA;EACA,WAAW;EACX;EACA;;UAGe;EACf;EACA;EACA,IAAI;EACJ,MAAM;EACN,UAAU;EACV;EACA;;KAGU,aAAa,YAAY;UAEpB;EACf;EACA;EACA;EACA;EACA,WAAW;;UAGI;EACf;EACA,MAAM;;UAGS;EACf;EACA,IAAI;EACJ;EACA;EACA;EACA;EACA;EACA;EACA,WAAW;;UAGI;EACf,OAAO;EACP;;KAGU,mBAAmB,YAAY;UAE1B;EACf;EACA;;KAGU,qBAAqB,YAAY;UAE5B;EACf;EACA;;KAGU,mBAAmB,YAAY;UAE1B;EACf;EACA;;KAGU,kBAAkB,YAAY;UAEzB;EACf,QAAQ;;KAGE,mBAAmB,YAAY;UAE1B;EACf,qBAAqB;EACrB,uBAAuB;EACvB,qBAAqB;EACrB,oBAAoB;EACpB,qBAAqB;;;;cCvFV,0BAA0B;EAErC;EAGA;EAGA;EAGA;EAGA;EAGA;EAGA;EAGA;EAGA;EAES,wBAAM;SAIC,sBAAM;;QAiBhB;YACI;IACR,oBAAoB;;;;;cC7CX,2BAA2B;EAEtC,WAAW;EAGX;EAGA;EAGA;UAGQ;UAGA;UAGA;UAEA;UACA;UACA;UACA;EASC;EAKA;EAKA;UAID;UAcA;MAaJ,UAAU;EAuBd,aAAa;EAMb,UAAU,GAAG;EAUb,SAAS,oBAAoB;EAY7B,SAAS,oBAAoB,wBAAwB;EA4BrD,SAAS,iBAAiB;EAI1B,OAAO,iBAAiB;EAIxB,OAAO,iBAAiB;EAOxB,WAAW,iBAAiB;;;;;;EAmC5B,kBAAkB;;;;;;;;;EAelB,gBAAgB,qBAAqB,mBAAmB,iBAAiB;UAwBjE;UA2DA;UAQA;UAOA;UAwBA;UAQA;UAKA;UAMA;UAiFA;UAWA;UAuBA;UAeA;UAsBA;UAIA;UAMA;UAcA;YAYW,wBAAM,2BAAA;UA2BjB;UAQA;UAgCA;SAuBQ,sBAAM;;QAsHhB;YACI;IACR,qBAAqB;;YAGb;IACR,qBAAqB,YAAY;IACjC,uBAAuB,YAAY;IACnC,qBAAqB,YAAY;IACjC,oBAAoB,YAAY;IAChC,qBAAqB,YAAY"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"split-layout-Deoxy47d.js","names":["customElement","customElement"],"sources":["../src/split-layout/split-drag.ts","../src/split-layout/split-model.ts","../src/split-layout/split-panel.ts","../src/split-layout/split-layout.ts"],"sourcesContent":["import type { DistributeResult } from './split-model.js';\n\nexport interface DragState {\n isDragging: boolean;\n groupId: string;\n gutterIndex: number;\n startPointerX: number;\n startPointerY: number;\n containerRect: DOMRect;\n trackSizes: number[];\n minConstraints: number[];\n maxConstraints: Array<number | null>;\n fixedConstraints: Array<number | null>;\n whenSmallConstraints: string[];\n}\n\nexport interface DragHandlers {\n onDragStart: (state: DragState) => void;\n onDragMove: (state: DragState, deltaX: number, deltaY: number) => void;\n onDragEnd: (state: DragState) => void;\n distribute: (\n sizesPx: number[],\n gutterIndex: number,\n deltaPx: number,\n constraints: Array<{ minPx: number; maxPx: number | null; fixedPx: number | null; whenSmall: string }>,\n ) => DistributeResult;\n}\n\nexport function createDragMachine(handlers: DragHandlers) {\n let state: DragState | null = null;\n let rafId: number | null = null;\n let pendingMove: { deltaX: number; deltaY: number } | null = null;\n\n function startGutterDrag(\n groupId: string,\n gutterIndex: number,\n _pointerId: number,\n clientX: number,\n clientY: number,\n containerRect: DOMRect,\n trackSizes: number[],\n constraints: Array<{ minPx: number; maxPx: number | null; fixedPx: number | null; whenSmall: string }>,\n ) {\n state = {\n isDragging: true,\n groupId,\n gutterIndex,\n startPointerX: clientX,\n startPointerY: clientY,\n containerRect,\n trackSizes,\n minConstraints: constraints.map(c => c.minPx),\n maxConstraints: constraints.map(c => c.maxPx),\n fixedConstraints: constraints.map(c => c.fixedPx),\n whenSmallConstraints: constraints.map(c => c.whenSmall),\n };\n\n handlers.onDragStart(state);\n }\n\n function move(pointerEvent: PointerEvent) {\n if (!state || !state.isDragging)\n return;\n\n const deltaX = pointerEvent.clientX - state.startPointerX;\n const deltaY = pointerEvent.clientY - state.startPointerY;\n\n pendingMove = { deltaX, deltaY };\n\n if (rafId === null) {\n rafId = requestAnimationFrame(flushMove);\n }\n }\n\n function flushMove() {\n if (!state || !pendingMove) {\n rafId = null;\n return;\n }\n\n const { deltaX, deltaY } = pendingMove;\n pendingMove = null;\n rafId = null;\n\n handlers.onDragMove(state, deltaX, deltaY);\n }\n\n function end(_pointerEvent: PointerEvent) {\n if (!state || !state.isDragging)\n return;\n\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n\n pendingMove = null;\n handlers.onDragEnd(state);\n state = null;\n }\n\n return {\n startGutterDrag,\n move,\n end,\n getState: () => state,\n };\n}\n","import type {\n Axis,\n GroupNode,\n LayoutNode,\n LayoutSnapshot,\n PanelNode,\n SnapshotNode,\n WhenSmall,\n} from './types.js';\n\nlet panelIdCounter = 0;\nlet groupIdCounter = 0;\n\nfunction generatePanelId(): string {\n return `p-${++panelIdCounter}`;\n}\n\nfunction generateGroupId(): string {\n return `g-${++groupIdCounter}`;\n}\n\nfunction resetIdCounters(): void {\n panelIdCounter = 0;\n groupIdCounter = 0;\n}\n\n// A child's own `size`/`weight` attribute takes precedence over the parent's\n// positional `sizes` list. Both are read so hand-authored markup can use\n// either form.\nfunction readOwnWeight(el: HTMLElement): number | undefined {\n const attr = el.getAttribute(`size`) ?? el.getAttribute(`weight`);\n if (attr === null)\n return undefined;\n const value = Number.parseFloat(attr);\n return Number.isNaN(value) ? undefined : value;\n}\n\nexport function buildModel(rootEl: HTMLElement): GroupNode {\n resetIdCounters();\n return buildGroupFromElement(rootEl, null);\n}\n\nfunction buildGroupFromElement(el: HTMLElement, _parentAxis: Axis | null): GroupNode {\n const isNestedLayout = el.tagName === `IXFX-SPLIT-LAYOUT`;\n const directionAttr = el.getAttribute(`direction`);\n const axis: Axis = directionAttr === `column` ? `column` : `row`;\n\n const group: GroupNode = {\n kind: `group`,\n id: el.id || generateGroupId(),\n el: isNestedLayout ? el : null,\n axis,\n children: [],\n weight: readOwnWeight(el) ?? 1,\n fixedPx: null,\n };\n\n const sizesAttr = el.getAttribute(`sizes`);\n const sizes = sizesAttr ? sizesAttr.split(/\\s+/).map(s => Number.parseFloat(s)).filter(n => !Number.isNaN(n)) : [];\n\n const childNodes = Array.from(el.children);\n let sizeIndex = 0;\n\n for (const child of childNodes) {\n // Every child consumes a positional size; a child's own `size`/`weight`\n // attribute (read inside each builder) takes precedence over it.\n const positional = sizeIndex < sizes.length ? sizes[sizeIndex] : undefined;\n sizeIndex++;\n if (child.tagName === `IXFX-SPLIT-LAYOUT`) {\n group.children.push(buildGroupFromElement(child as HTMLElement, axis));\n } else if (child.tagName === `IXFX-SPLIT-PANEL`) {\n group.children.push(buildPanelNode(child as HTMLElement, positional));\n } else {\n const wrapper = createImplicitPanel(child as HTMLElement, positional);\n group.children.push(wrapper);\n }\n }\n\n if (group.children.length === 0) {\n const implicitPanel = createImplicitPanelWithoutId();\n group.children.push(implicitPanel);\n }\n\n return group;\n}\n\nfunction createImplicitPanel(el: HTMLElement, size?: number): PanelNode {\n const minAttr = el.getAttribute(`min`);\n const maxAttr = el.getAttribute(`max`);\n const whenSmallAttr = el.getAttribute(`when-small`) as WhenSmall | null;\n const fixedAttr = el.getAttribute(`fixed`);\n const collapsedAttr = el.hasAttribute(`collapsed`);\n\n let minPx = 0;\n if (minAttr) {\n minPx = parseLength(minAttr, 0);\n }\n\n let maxPx: number | null = null;\n if (maxAttr) {\n maxPx = parseLength(maxAttr, 0);\n }\n\n let fixedPx: number | null = null;\n if (fixedAttr) {\n fixedPx = fixedAttr === `` ? 100 : parseLength(fixedAttr, 100);\n }\n\n const weight = readOwnWeight(el) ?? size ?? 1;\n\n return {\n kind: `panel`,\n id: el.id || generatePanelId(),\n el,\n weight,\n fixedPx,\n minPx,\n maxPx,\n whenSmall: whenSmallAttr || `prevent`,\n collapsed: collapsedAttr,\n restoreWeight: weight,\n };\n}\n\nfunction createImplicitPanelWithoutId(size?: number): PanelNode {\n return {\n kind: `panel`,\n id: generatePanelId(),\n el: document.createElement(`div`),\n weight: size ?? 1,\n fixedPx: null,\n minPx: 0,\n maxPx: null,\n whenSmall: `prevent`,\n collapsed: false,\n restoreWeight: size ?? 1,\n };\n}\n\nfunction buildPanelNode(el: HTMLElement, size?: number): PanelNode {\n const sizeAttr = el.getAttribute(`size`) || el.getAttribute(`weight`);\n const minAttr = el.getAttribute(`min`);\n const maxAttr = el.getAttribute(`max`);\n const whenSmallAttr = el.getAttribute(`when-small`) as WhenSmall | null;\n const fixedAttr = el.getAttribute(`fixed`);\n const collapsedAttr = el.hasAttribute(`collapsed`);\n\n let weight = size ?? 1;\n if (sizeAttr) {\n weight = Number.parseFloat(sizeAttr);\n }\n\n let minPx = 0;\n if (minAttr) {\n minPx = parseLength(minAttr, 0);\n }\n\n let maxPx: number | null = null;\n if (maxAttr) {\n maxPx = parseLength(maxAttr, 0);\n }\n\n let fixedPx: number | null = null;\n if (fixedAttr) {\n fixedPx = fixedAttr === `` ? 100 : parseLength(fixedAttr, 100);\n }\n\n return {\n kind: `panel`,\n id: el.id || generatePanelId(),\n el,\n weight,\n fixedPx,\n minPx,\n maxPx,\n whenSmall: whenSmallAttr || `prevent`,\n collapsed: collapsedAttr,\n restoreWeight: weight,\n };\n}\n\nfunction parseLength(value: string, fallback: number): number {\n if (value.endsWith(`px`)) {\n return Number.parseFloat(value.replace(`px`, ``));\n }\n if (value.endsWith(`%`)) {\n return fallback;\n }\n const num = Number.parseFloat(value);\n return Number.isNaN(num) ? fallback : num;\n}\n\nexport function normalise(group: GroupNode): GroupNode {\n const flexibleWeights: number[] = [];\n let totalFlexibleWeight = 0;\n\n for (const child of group.children) {\n if (child.kind === `panel`) {\n if (child.fixedPx !== null) {\n // fixed-size panels sit outside the weighted flow\n } else if (!child.collapsed) {\n flexibleWeights.push(child.weight);\n totalFlexibleWeight += child.weight;\n }\n } else {\n flexibleWeights.push(child.weight);\n totalFlexibleWeight += child.weight;\n }\n }\n\n if (totalFlexibleWeight === 0) {\n totalFlexibleWeight = 1;\n }\n\n const normalizedChildren: LayoutNode[] = [];\n for (let i = 0; i < group.children.length; i++) {\n const child = group.children[i];\n if (child.kind === `panel`) {\n if (child.fixedPx === null && !child.collapsed) {\n normalizedChildren.push({\n ...child,\n weight: child.weight / totalFlexibleWeight,\n });\n } else {\n normalizedChildren.push(child);\n }\n } else {\n normalizedChildren.push({\n ...child,\n weight: child.weight / totalFlexibleWeight,\n });\n }\n }\n\n return {\n ...group,\n children: normalizedChildren,\n };\n}\n\nexport interface DistributeResult {\n sizesPx: number[];\n belowMin: number[];\n}\n\nexport function distribute(\n sizesPx: number[],\n gutterIndex: number,\n deltaPx: number,\n constraints: Array<{ minPx: number; maxPx: number | null; fixedPx: number | null; whenSmall: WhenSmall }>,\n): DistributeResult {\n const result = [...sizesPx];\n const belowMin: number[] = [];\n\n if (deltaPx === 0) {\n return { sizesPx: result, belowMin };\n }\n\n const growSide = deltaPx > 0 ? gutterIndex : gutterIndex + 1;\n const shrinkSide = deltaPx > 0 ? gutterIndex + 1 : gutterIndex;\n\n let remaining = Math.abs(deltaPx);\n\n for (let i = shrinkSide; i >= 0 && remaining > 0; i--) {\n const c = constraints[i];\n if (c.fixedPx !== null)\n continue;\n\n const currentSize = result[i];\n const room = currentSize - c.minPx;\n\n if (room > 0) {\n const take = Math.min(room, remaining);\n result[i] -= take;\n remaining -= take;\n if (c.whenSmall !== `prevent` && result[i] <= c.minPx && result[i] > 0) {\n belowMin.push(i);\n break;\n }\n } else if (c.whenSmall !== `prevent` && currentSize > 0) {\n const take = Math.min(currentSize, remaining);\n result[i] -= take;\n remaining -= take;\n if (result[i] <= c.minPx) {\n belowMin.push(i);\n break;\n }\n }\n }\n\n const actualMoved = Math.abs(deltaPx) - remaining;\n if (actualMoved > 0) {\n result[growSide] += actualMoved;\n remaining = 0;\n }\n\n if (remaining > 0) {\n for (let i = growSide; i < result.length && remaining > 0; i++) {\n const c = constraints[i];\n if (c.fixedPx !== null)\n continue;\n\n const maxRoom = c.maxPx !== null ? c.maxPx - result[i] : Infinity;\n if (maxRoom <= 0)\n continue;\n\n const give = Math.min(maxRoom, remaining);\n result[i] += give;\n remaining -= give;\n }\n }\n\n return { sizesPx: result, belowMin };\n}\n\nexport function resolveTracks(group: GroupNode, _containerPx: number): string {\n const parts: string[] = [];\n\n const gutterSize = `var(--split-gutter-size, 6px)`;\n\n for (let i = 0; i < group.children.length; i++) {\n const child = group.children[i];\n let track: string;\n\n if (child.kind === `panel`) {\n if (child.collapsed) {\n track = `var(--split-collapsed-size, 0px)`;\n } else if (child.fixedPx !== null) {\n track = `${child.fixedPx}px`;\n } else {\n const min = child.minPx > 0 ? `${child.minPx}px` : `0px`;\n track = `minmax(${min}, var(--s${i}))`;\n }\n } else {\n track = `minmax(0, var(--s${i}))`;\n }\n\n parts.push(track);\n\n if (i < group.children.length - 1) {\n parts.push(gutterSize);\n }\n }\n\n return parts.join(` `);\n}\n\nexport function toSnapshot(group: GroupNode): LayoutSnapshot {\n const root = snapshotNode(group);\n return {\n version: 1,\n root,\n };\n}\n\nfunction snapshotNode(node: LayoutNode): SnapshotNode {\n if (node.kind === `panel`) {\n return {\n kind: `panel`,\n id: node.id,\n weight: node.weight,\n collapsed: node.collapsed,\n };\n }\n\n const children = node.children.map(c => snapshotNode(c));\n return {\n kind: `group`,\n id: node.id,\n weight: node.weight,\n children,\n };\n}\n\nexport function applySnapshot(group: GroupNode, snapshot: LayoutSnapshot): GroupNode {\n return applySnapshotToGroup(group, snapshot.root);\n}\n\nfunction applySnapshotToGroup(group: GroupNode, snapshot: SnapshotNode): GroupNode {\n if (snapshot.kind !== `group`) {\n return group;\n }\n\n const weightMap = new Map<string, number>();\n const collapsedMap = new Map<string, boolean>();\n\n collectWeights(snapshot, weightMap, collapsedMap);\n\n const newChildren: LayoutNode[] = [];\n\n for (const child of group.children) {\n if (child.kind === `panel`) {\n const newWeight = weightMap.get(child.id);\n const collapsed = collapsedMap.get(child.id);\n\n newChildren.push({\n ...child,\n weight: newWeight !== undefined ? newWeight : child.weight,\n collapsed: collapsed !== undefined ? collapsed : child.collapsed,\n });\n } else {\n const childSnapshot = snapshot.children?.find(c => c.id === child.id);\n if (childSnapshot) {\n newChildren.push(applySnapshotToGroup(child, childSnapshot));\n } else {\n newChildren.push(child);\n }\n }\n }\n\n return {\n ...group,\n children: newChildren,\n };\n}\n\nfunction collectWeights(snapshot: SnapshotNode, weights: Map<string, number>, collapsed: Map<string, boolean>): void {\n if (snapshot.kind === `panel`) {\n weights.set(snapshot.id, snapshot.weight ?? 1);\n if (snapshot.collapsed !== undefined) {\n collapsed.set(snapshot.id, snapshot.collapsed);\n }\n } else if (snapshot.children) {\n for (const child of snapshot.children) {\n collectWeights(child, weights, collapsed);\n }\n }\n}\n\n// Copies each panel's live `weight` onto its own `restoreWeight`, recursively.\n// Used just before collapsing a panel, so `preserveRestoreWeights` can carry\n// that stashed value through the rebuild that collapse triggers.\nexport function setPanelRestoreWeight(group: GroupNode, id: string, restoreWeight: number): GroupNode {\n const children = group.children.map((child) => {\n if (child.kind === `panel`) {\n return child.id === id ? { ...child, restoreWeight } : child;\n }\n return setPanelRestoreWeight(child, id, restoreWeight);\n });\n return { ...group, children };\n}\n\n// `buildModel` re-derives every `restoreWeight` from the DOM (defaulting it\n// back to the panel's current `weight`), discarding anything stashed at\n// collapse time. Carry the previous tree's `restoreWeight` values forward\n// onto the freshly built tree, matched by panel id, so a stash survives the\n// rebuild that collapse/expand triggers.\nexport function preserveRestoreWeights(previous: GroupNode | null, next: GroupNode): GroupNode {\n if (!previous)\n return next;\n\n const previousById = new Map(previous.children.map(child => [child.id, child]));\n const children = next.children.map((child) => {\n const match = previousById.get(child.id);\n if (!match || match.kind !== child.kind)\n return child;\n if (child.kind === `panel` && match.kind === `panel`) {\n return { ...child, restoreWeight: match.restoreWeight };\n }\n return preserveRestoreWeights(match as GroupNode, child as GroupNode);\n });\n return { ...next, children };\n}\n\nexport function findPanelNode(group: GroupNode, id: string): PanelNode | undefined {\n for (const child of group.children) {\n if (child.kind === `panel`) {\n if (child.id === id)\n return child;\n } else {\n const found = findPanelNode(child, id);\n if (found)\n return found;\n }\n }\n return undefined;\n}\n\nexport function walk(group: GroupNode, visitor: (node: LayoutNode, path: number[]) => void): void {\n walkInner(group, [], visitor);\n}\n\nfunction walkInner(node: LayoutNode, path: number[], visitor: (node: LayoutNode, path: number[]) => void): void {\n visitor(node, path);\n\n if (node.kind === `group`) {\n for (let i = 0; i < node.children.length; i++) {\n walkInner(node.children[i], [...path, i], visitor);\n }\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\n\n@customElement(`ixfx-split-panel`)\nexport class SplitPanelElement extends LitElement {\n @property({ type: String, reflect: true })\n id = ``;\n\n @property({ type: String })\n size = ``;\n\n @property({ type: String })\n weight = ``;\n\n @property({ type: String })\n fixed = ``;\n\n @property({ type: String })\n min = ``;\n\n @property({ type: String })\n max = ``;\n\n @property({ type: String, attribute: `when-small` })\n whenSmall = `prevent`;\n\n @property({ type: Boolean, reflect: true })\n collapsed = false;\n\n @property({ type: String })\n snap = ``;\n\n override render() {\n return html`<slot></slot>`;\n }\n\n static override styles = [\n themeFallbacks,\n css`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n\n :host([collapsed]) {\n visibility: hidden;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-split-panel': SplitPanelElement;\n }\n}\n","import type { DragState } from './split-drag.js';\nimport type { Axis, GroupNode, LayoutSnapshot, PanelInfo, SplitChangeDetail, SplitCloseDetail, SplitCollapseDetail, SplitExpandDetail, SplitResizeDetail } from './types.js';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\nimport { themeFallbacks } from '../styles/fallbacks.js';\nimport { handleStyles } from '../styles/handle.js';\nimport { safeCustomElement as customElement } from '../util/custom-elements.js';\nimport { createDragMachine } from './split-drag.js';\nimport { applySnapshot, buildModel, distribute, findPanelNode, normalise, preserveRestoreWeights, setPanelRestoreWeight, toSnapshot, walk } from './split-model.js';\nimport './split-panel.js';\n\n@customElement(`ixfx-split-layout`)\nexport class SplitLayoutElement extends LitElement {\n @property({ type: String, reflect: true })\n direction: Axis = `row`;\n\n @property({ type: String })\n sizes = ``;\n\n @property({ type: String, attribute: `gutter-size` })\n gutterSize = ``;\n\n @property({ type: String })\n snap = ``;\n\n @state()\n private _model: GroupNode | null = null;\n\n @state()\n private _resizing = false;\n\n @query(`.grid`)\n private _groupEl?: HTMLElement;\n\n private _observer: MutationObserver | null = null;\n private _applyingOwnMutation = false;\n private _dragStructurallyChanged = false;\n private _dragMachine = createDragMachine({\n onDragStart: state => this._handleDragStart(state),\n onDragMove: (state, deltaX, deltaY) => this._handleDragMove(state, deltaX, deltaY),\n onDragEnd: state => this._handleDragEnd(state),\n distribute: (sizes, idx, delta, constraints) => {\n return distribute(sizes, idx, delta, constraints as any);\n },\n });\n\n override connectedCallback() {\n super.connectedCallback();\n this._setupObserver();\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this._observer?.disconnect();\n }\n\n override firstUpdated() {\n this._rebuildModel();\n }\n\n private _setupObserver() {\n this._observer = new MutationObserver(() => {\n if (!this._applyingOwnMutation) {\n Promise.resolve().then(() => this._rebuildModel());\n }\n });\n\n this._observer.observe(this, {\n childList: true,\n subtree: true,\n attributeFilter: [`size`, `weight`, `min`, `max`, `when-small`, `fixed`, `direction`, `collapsed`, `sizes`],\n });\n }\n\n private _rebuildModel() {\n // Named slots are always rendered as `panel-0`..`panel-(n-1)`, so every\n // light-DOM child must carry the matching `slot`. Re-assert this on every\n // rebuild: children may have been added (with a stale/ad-hoc slot name) or\n // removed since the model was last built, which would otherwise leave an\n // orphaned child projected nowhere and an empty grid track.\n this._reindexSlots();\n const model = buildModel(this);\n const normalized = normalise(model);\n this._model = preserveRestoreWeights(this._model, normalized);\n this.requestUpdate();\n }\n\n get panels(): PanelInfo[] {\n if (!this._model)\n return [];\n\n const panels: PanelInfo[] = [];\n walk(this._model, (node, path) => {\n if (node.kind === `panel`) {\n panels.push({\n id: node.id,\n el: node.el,\n index: path[path.length - 1],\n path: path.join(`-`),\n weight: node.weight,\n collapsed: node.collapsed,\n min: node.minPx,\n max: node.maxPx,\n whenSmall: node.whenSmall,\n });\n }\n });\n return panels;\n }\n\n getLayout(): LayoutSnapshot | null {\n if (!this._model)\n return null;\n return toSnapshot(this._model);\n }\n\n setLayout(s: LayoutSnapshot): void {\n if (!this._model)\n return;\n this._applyingOwnMutation = true;\n this._model = applySnapshot(this._model, s);\n this.requestUpdate();\n this._applyingOwnMutation = false;\n this._emitChange();\n }\n\n getSizes(_groupId?: string): Record<string, number> {\n if (!this._model)\n return {};\n const result: Record<string, number> = {};\n if (this._model.children) {\n this._model.children.forEach((child) => {\n result[child.id] = child.weight;\n });\n }\n return result;\n }\n\n setSizes(weights: number[] | Record<string, number>, _groupId?: string): void {\n if (!this._model)\n return;\n\n this._applyingOwnMutation = true;\n\n if (Array.isArray(weights)) {\n this._model.children.forEach((child, i) => {\n if (i < weights.length) {\n child.weight = weights[i];\n }\n });\n } else {\n for (const [id, weight] of Object.entries(weights)) {\n const child = this._model.children.find(c => c.id === id);\n if (child) {\n child.weight = weight;\n }\n }\n }\n\n this._model = normalise(this._model);\n this.requestUpdate();\n this._applyingOwnMutation = false;\n this._emitResize();\n this._emitChange();\n }\n\n collapse(idOrEl: string | HTMLElement): void {\n this._setCollapsedState(idOrEl, true);\n }\n\n expand(idOrEl: string | HTMLElement): void {\n this._setCollapsedState(idOrEl, false);\n }\n\n toggle(idOrEl: string | HTMLElement): void {\n const panel = this._findPanel(idOrEl);\n if (panel) {\n this._setCollapsedState(panel.id, !panel.collapsed);\n }\n }\n\n closePanel(idOrEl: string | HTMLElement): boolean {\n const panel = this._findPanel(idOrEl);\n if (!panel)\n return false;\n\n const event = new CustomEvent<SplitCloseDetail>(`ixfx-split-close`, {\n detail: { id: panel.id, index: panel.index },\n bubbles: true,\n composed: true,\n cancelable: true,\n });\n\n this.dispatchEvent(event);\n if (event.defaultPrevented)\n return false;\n\n this._applyingOwnMutation = true;\n panel.el.remove();\n this._rebuildModel();\n // Discard the records for our own mutations: the observer callback runs in a\n // microtask, by which point the flag below is already cleared, so without\n // this it would schedule a redundant rebuild from the DOM.\n this._observer?.takeRecords();\n this._applyingOwnMutation = false;\n\n this._emitResize();\n this._emitChange();\n return true;\n }\n\n /**\n * Bounding rects of the gutter elements, in gutter index order. lets\n * callers (e.g. dock junction handles) hit-test gutters without reaching\n * into the shadow DOM.\n */\n getGutterRects(): DOMRect[] {\n const gutters = this.shadowRoot?.querySelectorAll<HTMLElement>(`.gutter`);\n if (gutters === undefined || gutters === null)\n return [];\n return Array.from(gutters, g => g.getBoundingClientRect());\n }\n\n /**\n * Programmatically begin dragging the gutter at `gutterIndex`, as if the\n * user had pressed on it at (`clientX`, `clientY`). The drag then follows\n * the pointer `pointerId` until pointerup, exactly like a native gutter\n * drag. Returns false when the index is out of range or the layout isn't\n * ready. Intended for composite resize affordances — e.g. a junction handle\n * that starts this drag alongside perpendicular drags on other layouts.\n */\n beginGutterDrag(gutterIndex: number, pointerId: number, clientX: number, clientY: number): boolean {\n if (!this._groupEl || !this._model)\n return false;\n if (gutterIndex < 0 || gutterIndex >= this._model.children.length - 1)\n return false;\n\n const { rect, trackSizes, constraints } = this._snapshotTracks();\n\n this._dragMachine.startGutterDrag(\n this._model.id,\n gutterIndex,\n pointerId,\n clientX,\n clientY,\n rect,\n trackSizes,\n constraints,\n );\n\n window.addEventListener(`pointermove`, this._onPointerMove);\n window.addEventListener(`pointerup`, this._onPointerUp);\n return true;\n }\n\n private _setCollapsedState(idOrEl: string | HTMLElement, collapsed: boolean, revealWeight?: number): void {\n const panel = this._findPanel(idOrEl);\n if (!panel || panel.collapsed === collapsed)\n return;\n\n this._applyingOwnMutation = true;\n\n if (collapsed) {\n // Stash the panel's live weight (which may have come from a drag, never\n // written back to a DOM attribute) so a later expand can restore it\n // instead of falling back to the stale weight `_rebuildModel` reads off\n // the DOM.\n if (this._model) {\n this._model = setPanelRestoreWeight(this._model, panel.id, panel.weight);\n }\n panel.el.setAttribute(`collapsed`, ``);\n panel.el.setAttribute(`data-collapsed`, ``);\n } else {\n panel.el.removeAttribute(`collapsed`);\n panel.el.removeAttribute(`data-collapsed`);\n }\n\n this._rebuildModel();\n if (!collapsed) {\n const restoreWeight = revealWeight ?? (this._model ? findPanelNode(this._model, panel.id)?.restoreWeight : undefined);\n if (restoreWeight !== undefined) {\n this._setFlexibleWeight(panel.id, restoreWeight);\n }\n }\n this.requestUpdate();\n // The observer callback runs in a microtask, after the flag below is\n // cleared; draining our own records stops it rebuilding from the DOM and\n // wiping the weights just set (e.g. the drag-to-reveal size).\n this._observer?.takeRecords();\n this._applyingOwnMutation = false;\n\n if (collapsed) {\n this.dispatchEvent(new CustomEvent<SplitCollapseDetail>(`ixfx-split-collapse`, {\n detail: { id: panel.id, index: panel.index },\n bubbles: true,\n composed: true,\n }));\n } else {\n this.dispatchEvent(new CustomEvent<SplitExpandDetail>(`ixfx-split-expand`, {\n detail: { id: panel.id, index: panel.index },\n bubbles: true,\n composed: true,\n }));\n }\n\n this._emitResize();\n this._emitChange();\n }\n\n // Force every direct child onto the slot the renderer expects for its\n // position (`panel-<domIndex>`). Callers may append children with any slot\n // name (or none), and removals leave gaps; this keeps projection in sync\n // with the `panel-0`..`panel-(n-1)` slots `render()` emits. `slot` is not in\n // the observer's attributeFilter, so this does not re-trigger a rebuild.\n private _reindexSlots(): void {\n Array.from(this.children).forEach((child, i) => {\n const name = `panel-${i}`;\n if (child.getAttribute(`slot`) !== name)\n child.setAttribute(`slot`, name);\n });\n }\n\n private _findPanel(idOrEl: string | HTMLElement): PanelInfo | undefined {\n const id = typeof idOrEl === `string` ? idOrEl : idOrEl.id;\n return this.panels.find(p => p.id === id);\n }\n\n // Give one flexible child a target share of the weighted flow, shrinking the\n // other flexible children proportionally to make room.\n private _setFlexibleWeight(id: string, weight: number): void {\n if (!this._model)\n return;\n\n const isFlexible = (c: GroupNode[`children`][number]) =>\n c.kind === `group` || (c.fixedPx === null && !c.collapsed);\n const flexible = this._model.children.filter(isFlexible);\n const target = flexible.find(c => c.id === id);\n if (!target)\n return;\n\n const t = Math.min(Math.max(weight, 0), 0.9);\n const others = flexible.filter(c => c !== target);\n const othersTotal = others.reduce((sum, c) => sum + c.weight, 0) || 1;\n const scale = (1 - t) / othersTotal;\n for (const c of others) {\n c.weight *= scale;\n }\n target.weight = t;\n\n this._model = normalise(this._model);\n }\n\n // Pixel drag distance past a collapsed panel's gutter before it re-expands.\n private _snapPx(): number {\n const fromProp = Number.parseFloat(this.snap);\n if (!Number.isNaN(fromProp))\n return fromProp;\n const fromVar = Number.parseFloat(getComputedStyle(this).getPropertyValue(`--split-snap`));\n return Number.isNaN(fromVar) ? 24 : fromVar;\n }\n\n private _collapsedPx(): number {\n const v = Number.parseFloat(getComputedStyle(this).getPropertyValue(`--split-collapsed-size`));\n return Number.isNaN(v) ? 0 : v;\n }\n\n private _handleDragStart(_state: DragState) {\n this._resizing = true;\n this._dragStructurallyChanged = false;\n this.setAttribute(`data-dragging`, ``);\n }\n\n private _handleDragMove(state: DragState, deltaX: number, deltaY: number) {\n if (!this._model)\n return;\n\n // A panel was closed/collapsed on an earlier frame of this drag. The\n // captured drag state (track sizes, constraints, gutter index) no longer\n // lines up with the model, so continuing would operate on the wrong\n // panels and cascade. Ignore further movement until the pointer is released.\n if (this._dragStructurallyChanged)\n return;\n\n const axis = this.direction;\n const delta = axis === `row` ? deltaX : deltaY;\n const gutterIndex = state.gutterIndex;\n\n // Dragging a gutter away from a collapsed neighbour re-expands it.\n // Collapsed panels are outside the normal size-distribution flow, so this\n // has to be handled before `distribute`. The panel stays hidden until the\n // drag has travelled far enough to reveal it at its `min` size (it may not\n // render well any smaller); without a `min`, the snap threshold is used.\n const growSide = delta > 0 ? gutterIndex : gutterIndex + 1;\n const growNeighbour = this._model.children[growSide];\n if (growNeighbour?.kind === `panel` && growNeighbour.collapsed) {\n const revealPx = growNeighbour.minPx > 0 ? growNeighbour.minPx : this._snapPx();\n if (Math.abs(delta) >= revealPx) {\n const axisPx = axis === `row` ? state.containerRect.width : state.containerRect.height;\n this._setCollapsedState(growNeighbour.id, false, axisPx > 0 ? revealPx / axisPx : undefined);\n // Re-anchor the drag to the current pointer position and the new layout\n // so the same gesture keeps growing the panel past its min size.\n this._reseedDragState(state, state.startPointerX + deltaX, state.startPointerY + deltaY);\n }\n return;\n }\n\n const constraints = state.minConstraints.map((min, i) => ({\n minPx: min,\n maxPx: state.maxConstraints[i],\n fixedPx: state.fixedConstraints[i],\n whenSmall: state.whenSmallConstraints[i] as any,\n }));\n\n const result = distribute(\n state.trackSizes,\n gutterIndex,\n delta,\n constraints,\n );\n\n const totalSize = state.trackSizes.reduce((a, b) => a + b, 0);\n result.sizesPx.forEach((size, i) => {\n const child = this._model!.children[i];\n if (child && child.kind === `panel`) {\n child.weight = size / totalSize;\n }\n });\n\n if (result.belowMin.length > 0) {\n let processed = false;\n for (const idx of result.belowMin) {\n if (processed)\n break;\n const child = this._model!.children[idx];\n if (child && child.kind === `panel`) {\n const whenSmall = child.whenSmall;\n if (whenSmall === `collapse` && !child.collapsed) {\n this._setCollapsedState(child.id, true);\n processed = true;\n this._dragStructurallyChanged = true;\n } else if (whenSmall === `close`) {\n this.closePanel(child.id);\n processed = true;\n this._dragStructurallyChanged = true;\n }\n }\n }\n }\n\n this._model = normalise(this._model);\n this.requestUpdate();\n }\n\n private _handleDragEnd(_state: DragState) {\n this._resizing = false;\n this.removeAttribute(`data-dragging`);\n this._emitResize();\n this._emitChange();\n }\n\n // Snapshot of the current gutter geometry, used to seed (and mid-drag\n // re-seed) the drag machine. Collapsed / fixed panels sit outside the\n // weighted flow, so their raw `weight` is meaningless — use their real\n // rendered track size instead.\n private _snapshotTracks() {\n const rect = this._groupEl!.getBoundingClientRect();\n const axisSize = this.direction === `row` ? rect.width : rect.height;\n const collapsedPx = this._collapsedPx();\n const children = this._model!.children;\n\n const trackSizes = children.map((c) => {\n if (c.kind === `panel` && c.collapsed)\n return collapsedPx;\n if (c.kind === `panel` && c.fixedPx !== null)\n return c.fixedPx;\n return c.weight * axisSize;\n });\n const constraints = children.map((c) => {\n if (c.kind === `panel`) {\n return { minPx: c.minPx, maxPx: c.maxPx, fixedPx: c.fixedPx, whenSmall: c.whenSmall };\n }\n return { minPx: 0, maxPx: null as number | null, fixedPx: null as number | null, whenSmall: `prevent` as const };\n });\n\n return { rect, trackSizes, constraints };\n }\n\n private _reseedDragState(state: DragState, pointerX: number, pointerY: number): void {\n if (!this._groupEl || !this._model)\n return;\n\n const { rect, trackSizes, constraints } = this._snapshotTracks();\n state.startPointerX = pointerX;\n state.startPointerY = pointerY;\n state.containerRect = rect;\n state.trackSizes = trackSizes;\n state.minConstraints = constraints.map(c => c.minPx);\n state.maxConstraints = constraints.map(c => c.maxPx);\n state.fixedConstraints = constraints.map(c => c.fixedPx);\n state.whenSmallConstraints = constraints.map(c => c.whenSmall);\n }\n\n private _onGutterPointerDown = (e: PointerEvent, groupId: string, gutterIndex: number) => {\n e.preventDefault();\n if (!this._groupEl || !this._model)\n return;\n\n const { rect, trackSizes, constraints } = this._snapshotTracks();\n\n this._dragMachine.startGutterDrag(\n groupId,\n gutterIndex,\n e.pointerId,\n e.clientX,\n e.clientY,\n rect,\n trackSizes,\n constraints,\n );\n\n window.addEventListener(`pointermove`, this._onPointerMove);\n window.addEventListener(`pointerup`, this._onPointerUp);\n };\n\n private _onPointerMove = (e: PointerEvent) => {\n this._dragMachine.move(e);\n };\n\n private _onPointerUp = (e: PointerEvent) => {\n this._dragMachine.end(e);\n window.removeEventListener(`pointermove`, this._onPointerMove);\n window.removeEventListener(`pointerup`, this._onPointerUp);\n };\n\n private _emitResize() {\n if (!this._model)\n return;\n const detail: SplitResizeDetail = {\n sizes: this.getSizes(),\n groupId: this._model.id,\n };\n this.dispatchEvent(new CustomEvent<SplitResizeDetail>(`ixfx-split-resize`, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n private _emitChange() {\n const layout = this.getLayout();\n if (!layout)\n return;\n const detail: SplitChangeDetail = { layout };\n this.dispatchEvent(new CustomEvent<SplitChangeDetail>(`ixfx-split-change`, {\n detail,\n bubbles: true,\n composed: true,\n }));\n }\n\n protected override render() {\n if (!this._model)\n return nothing;\n\n const isRow = this._model.axis === `row`;\n const trackSizes = this._resolveTracks(this._model);\n\n const cssVars = this._model.children.map((child, i) => {\n return `--s${i}: ${child.weight * 100}%`;\n }).join(`; `);\n\n const gridStyle = isRow\n ? `grid-template-columns: ${trackSizes}; grid-template-rows: 1fr; ${cssVars}`\n : `grid-template-rows: ${trackSizes}; grid-template-columns: 1fr; ${cssVars}`;\n\n return html`\n <div class=\"grid\" style=\"${gridStyle}\">\n ${this._model.children.map((_, i) => html`\n <div part=\"panel\" style=\"grid-column: ${isRow ? i * 2 + 1 : 1}; grid-row: ${isRow ? 1 : i * 2 + 1}; display: flex; flex-direction: ${isRow ? `row` : `column`}; overflow: hidden;\">\n <slot name=\"panel-${i}\"></slot>\n </div>\n `)}\n ${this._model.children.slice(0, -1).map((_, i) => this._renderGutter(this._model!.id, i, isRow))}\n </div>\n `;\n }\n\n private _getTrackSizes(count: number): string[] {\n const sizes: string[] = [];\n for (let i = 0; i < count; i++) {\n sizes.push(`var(--s${i}, 1fr)`);\n }\n return sizes;\n }\n\n private _resolveTracks(model: GroupNode): string {\n const _isRow = model.axis === `row`;\n const parts: string[] = [];\n const gutterSize = `var(--split-gutter-size, 6px)`;\n\n for (let i = 0; i < model.children.length; i++) {\n const child = model.children[i];\n let track: string;\n\n if (child.kind === `panel`) {\n if (child.collapsed) {\n track = `var(--split-collapsed-size, 0px)`;\n } else if (child.fixedPx !== null) {\n track = `${child.fixedPx}px`;\n } else {\n const min = child.minPx > 0 ? `${child.minPx}px` : `0px`;\n track = `minmax(${min}, var(--s${i}, 1fr))`;\n }\n } else {\n track = `minmax(0, var(--s${i}, 1fr))`;\n }\n\n parts.push(track);\n\n if (i < model.children.length - 1) {\n parts.push(gutterSize);\n }\n }\n\n return parts.join(` `);\n }\n\n private _renderGutter(groupId: string, index: number, isRow: boolean) {\n const cursor = isRow ? `ew-resize` : `ns-resize`;\n const gridColumn = isRow ? `${(index + 1) * 2}` : `1`;\n const gridRow = isRow ? `1` : `${(index + 1) * 2}`;\n\n return html`\n <div\n class=\"gutter\"\n data-group=\"${groupId}\"\n data-index=\"${index}\"\n style=\"cursor: ${cursor}; grid-column: ${gridColumn}; grid-row: ${gridRow};\"\n @pointerdown=${(e: PointerEvent) => this._onGutterPointerDown(e, groupId, index)}\n >\n <span\n class=\"ixfx-handle\"\n part=\"grip\"\n data-handle=\"dimpled\"\n data-shape=${isRow ? `vertical` : `horizontal`}\n ></span>\n </div>\n `;\n }\n\n static override styles = [\n themeFallbacks,\n handleStyles,\n css`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n --split-gutter-size: 6px;\n --split-gutter-hit-size: 12px;\n --split-gutter-color: transparent;\n --split-gutter-hover-color: var(--surface-6);\n --split-gutter-active-color: var(--accent);\n --split-collapsed-size: 0px;\n --split-snap: 24px;\n\n /* Gutter grip — shared handle primitive (docs/infra-handle.md). */\n --ixfx-handle-length: 16px;\n --ixfx-handle-thickness: 8px;\n }\n\n * {\n box-sizing: border-box;\n }\n\n .grid {\n display: grid;\n width: 100%;\n height: 100%;\n }\n\n .grid slot {\n display: block;\n min-width: 0;\n min-height: 0;\n width: 100%;\n height: 100%;\n }\n\n ::part(panel) {\n width: 100%;\n height: 100%;\n }\n\n /* ::part() doesn't match inside our own shadow root, so target directly. */\n [part=\"panel\"] {\n contain: strict;\n }\n\n .gutter {\n z-index: 2;\n background: var(--split-gutter-color);\n transition: background-color var(--transition, 0.2s);\n pointer-events: auto;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n }\n\n .gutter::before {\n content: '';\n position: absolute;\n pointer-events: auto;\n background: transparent;\n }\n\n :host([direction=\"row\"]) .gutter {\n width: var(--split-gutter-size);\n cursor: ew-resize;\n min-height: 100%;\n }\n\n :host([direction=\"row\"]) .gutter::before {\n width: var(--split-gutter-hit-size, 12px);\n height: 100%;\n left: 50%;\n transform: translateX(-50%);\n }\n\n :host([direction=\"column\"]) .gutter {\n height: var(--split-gutter-size);\n cursor: ns-resize;\n min-width: 100%;\n }\n\n :host([direction=\"column\"]) .gutter::before {\n height: var(--split-gutter-hit-size, 12px);\n width: 100%;\n top: 50%;\n transform: translateY(-50%);\n }\n\n .gutter:hover,\n .gutter[data-active] {\n background: var(--split-gutter-hover-color);\n }\n\n :host([data-dragging]) .gutter {\n background: var(--split-gutter-active-color);\n }\n\n :host([data-dragging]) * {\n transition: none !important;\n user-select: none;\n }\n\n :host([data-dragging]) .gutter .ixfx-handle {\n display: none;\n }\n\n :host(:not([data-dragging])) .gutter:hover .ixfx-handle {\n display: none;\n }\n `,\n ];\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ixfx-split-layout': SplitLayoutElement;\n }\n\n interface HTMLElementEventMap {\n 'ixfx-split-resize': CustomEvent<SplitResizeDetail>;\n 'ixfx-split-collapse': CustomEvent<SplitCollapseDetail>;\n 'ixfx-split-expand': CustomEvent<SplitExpandDetail>;\n 'ixfx-split-close': CustomEvent<SplitCloseDetail>;\n 'ixfx-split-change': CustomEvent<SplitChangeDetail>;\n }\n}\n"],"mappings":"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"}