@weasel-js/ui 1.7.0 → 1.7.2

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 (416) hide show
  1. package/dist/chunks/ActionBar-xA73vzzF.js +64 -0
  2. package/dist/chunks/ActionBar-xA73vzzF.js.map +1 -0
  3. package/dist/chunks/{Badge-D2aD7xVL.js → Badge-jYQjrTKc.js} +235 -264
  4. package/dist/chunks/{Badge-D2aD7xVL.js.map → Badge-jYQjrTKc.js.map} +1 -1
  5. package/dist/chunks/{BandEditor-Dd0egAgE.js → BandEditor-B4jUAHQ8.js} +13 -13
  6. package/dist/chunks/BandEditor-B4jUAHQ8.js.map +1 -0
  7. package/dist/chunks/{Button-BIdXHQOx.js → Button-XB-T75YL.js} +2 -2
  8. package/dist/chunks/{Button-BIdXHQOx.js.map → Button-XB-T75YL.js.map} +1 -1
  9. package/dist/chunks/{ButtonBar-DIQTe5GQ.js → ButtonBar-CIMKPPRS.js} +7 -9
  10. package/dist/chunks/{ButtonBar-DIQTe5GQ.js.map → ButtonBar-CIMKPPRS.js.map} +1 -1
  11. package/dist/chunks/Callout-BUn0dP_S.js +115 -0
  12. package/dist/chunks/Callout-BUn0dP_S.js.map +1 -0
  13. package/dist/chunks/Checkbox-DFn-x0JO.js +37 -0
  14. package/dist/chunks/Checkbox-DFn-x0JO.js.map +1 -0
  15. package/dist/chunks/{CloseButton-C2J7wVfo.js → CloseButton-BmNmRVtb.js} +3 -3
  16. package/dist/chunks/{CloseButton-C2J7wVfo.js.map → CloseButton-BmNmRVtb.js.map} +1 -1
  17. package/dist/chunks/ColorField-BwlelY26.js +90 -0
  18. package/dist/chunks/ColorField-BwlelY26.js.map +1 -0
  19. package/dist/chunks/{ColorModeControl-BewxA0rX.js → ColorModeControl-DaVJ-SyX.js} +3 -3
  20. package/dist/chunks/{ColorModeControl-BewxA0rX.js.map → ColorModeControl-DaVJ-SyX.js.map} +1 -1
  21. package/dist/chunks/ComboBox-DKln_mOd.js +138 -0
  22. package/dist/chunks/ComboBox-DKln_mOd.js.map +1 -0
  23. package/dist/chunks/{CurveEditor-DUVjd25R.js → CurveEditor-0EE00D6s.js} +90 -87
  24. package/dist/chunks/CurveEditor-0EE00D6s.js.map +1 -0
  25. package/dist/chunks/{DataGrid-LZ2JgY2Y.js → DataGrid-CmHJe57v.js} +23 -18
  26. package/dist/chunks/DataGrid-CmHJe57v.js.map +1 -0
  27. package/dist/chunks/DetailList-BpU50XVe.js +54 -0
  28. package/dist/chunks/DetailList-BpU50XVe.js.map +1 -0
  29. package/dist/chunks/{DetentSlider-5uQPFucv.js → DetentSlider-DNTAk8xP.js} +2 -2
  30. package/dist/chunks/{DetentSlider-5uQPFucv.js.map → DetentSlider-DNTAk8xP.js.map} +1 -1
  31. package/dist/chunks/{Dialog-DGFutQ--.js → Dialog-DKfsk5VN.js} +3 -3
  32. package/dist/chunks/{Dialog-DGFutQ--.js.map → Dialog-DKfsk5VN.js.map} +1 -1
  33. package/dist/chunks/{DragGhost-B5_hb9W9.js → DragGhost-BeYDJyLZ.js} +2 -2
  34. package/dist/chunks/{DragGhost-B5_hb9W9.js.map → DragGhost-BeYDJyLZ.js.map} +1 -1
  35. package/dist/chunks/{FallthroughDiagram-BEHiM5IS.js → FallthroughDiagram-CS1IhQaU.js} +16 -16
  36. package/dist/chunks/FallthroughDiagram-CS1IhQaU.js.map +1 -0
  37. package/dist/chunks/Field-DiX_WByH.js +25 -0
  38. package/dist/chunks/Field-DiX_WByH.js.map +1 -0
  39. package/dist/chunks/FillStrokeSwatch-C4h3rUFM.js +112 -0
  40. package/dist/chunks/FillStrokeSwatch-C4h3rUFM.js.map +1 -0
  41. package/dist/chunks/{FontFamilySelect-DkRgNtag.js → FontFamilySelect-DEvMXyZd.js} +2 -2
  42. package/dist/chunks/FontFamilySelect-DEvMXyZd.js.map +1 -0
  43. package/dist/chunks/FontWeightSelect-BLQ_LMJF.js +49 -0
  44. package/dist/chunks/FontWeightSelect-BLQ_LMJF.js.map +1 -0
  45. package/dist/chunks/{GestureRoute-C_YGl7bJ.js → GestureRoute-BXESrHI0.js} +2 -2
  46. package/dist/chunks/{GestureRoute-C_YGl7bJ.js.map → GestureRoute-BXESrHI0.js.map} +1 -1
  47. package/dist/chunks/GradientEditor-DD2OjQtn.js +325 -0
  48. package/dist/chunks/GradientEditor-DD2OjQtn.js.map +1 -0
  49. package/dist/chunks/{Icon-CcVjdq2C.js → Icon--B1ME-6c.js} +3 -1
  50. package/dist/chunks/Icon--B1ME-6c.js.map +1 -0
  51. package/dist/chunks/{InlineRange-P01ABSzo.js → InlineRange-DPjIsJB3.js} +3 -3
  52. package/dist/chunks/InlineRange-DPjIsJB3.js.map +1 -0
  53. package/dist/chunks/{Input-CHmkfYaD.js → Input-D7SDKbST.js} +10 -15
  54. package/dist/chunks/Input-D7SDKbST.js.map +1 -0
  55. package/dist/chunks/{ItemList-Cm-HUWCi.js → ItemList-CRu9y7hL.js} +2 -2
  56. package/dist/chunks/ItemList-CRu9y7hL.js.map +1 -0
  57. package/dist/chunks/{Jog-DRmfrkCg.js → Jog-BrkzdGV2.js} +8 -8
  58. package/dist/chunks/Jog-BrkzdGV2.js.map +1 -0
  59. package/dist/chunks/{LayerList-wCI1EueM.js → LayerList-Bxj1N6bj.js} +151 -153
  60. package/dist/chunks/LayerList-Bxj1N6bj.js.map +1 -0
  61. package/dist/chunks/ListEditor-OQDzG4A5.js +72 -0
  62. package/dist/chunks/ListEditor-OQDzG4A5.js.map +1 -0
  63. package/dist/chunks/MenuButton-TAFg88Lp.js +75 -0
  64. package/dist/chunks/MenuButton-TAFg88Lp.js.map +1 -0
  65. package/dist/chunks/MeshEditor-DWpvg8H6.js +199 -0
  66. package/dist/chunks/MeshEditor-DWpvg8H6.js.map +1 -0
  67. package/dist/chunks/{NumberField-BnJxcazc.js → NumberField-DS0WSiin.js} +26 -23
  68. package/dist/chunks/NumberField-DS0WSiin.js.map +1 -0
  69. package/dist/chunks/{OptionsBar-ujxYidhj.js → OptionsBar-DeTAjVb7.js} +6 -8
  70. package/dist/chunks/{OptionsBar-ujxYidhj.js.map → OptionsBar-DeTAjVb7.js.map} +1 -1
  71. package/dist/chunks/PaintField-BdmQM53v.js +63 -0
  72. package/dist/chunks/PaintField-BdmQM53v.js.map +1 -0
  73. package/dist/chunks/PaintInput-DaQMeBsI.js +132 -0
  74. package/dist/chunks/PaintInput-DaQMeBsI.js.map +1 -0
  75. package/dist/chunks/PatternPicker-B3HcMZWg.js +135 -0
  76. package/dist/chunks/PatternPicker-B3HcMZWg.js.map +1 -0
  77. package/dist/chunks/{Plot2D-CTXHkL5p.js → Plot2D-BrvQS0dh.js} +7 -7
  78. package/dist/chunks/Plot2D-BrvQS0dh.js.map +1 -0
  79. package/dist/chunks/{PointPlotter-ldI4RrU1.js → PointPlotter-BBXpQ_QD.js} +2 -2
  80. package/dist/chunks/{PointPlotter-ldI4RrU1.js.map → PointPlotter-BBXpQ_QD.js.map} +1 -1
  81. package/dist/chunks/{Powerline-DNyH885r.js → Powerline-6wIFmDik.js} +2 -2
  82. package/dist/chunks/{Powerline-DNyH885r.js.map → Powerline-6wIFmDik.js.map} +1 -1
  83. package/dist/chunks/{Prefs-ByA-x51i.js → Prefs-C4MZ28SX.js} +118 -95
  84. package/dist/chunks/Prefs-C4MZ28SX.js.map +1 -0
  85. package/dist/chunks/{Properties-DmAeQ3mk.js → Properties-DseN56WI.js} +29 -29
  86. package/dist/chunks/{Properties-DmAeQ3mk.js.map → Properties-DseN56WI.js.map} +1 -1
  87. package/dist/chunks/PropertyField-BbNqK8xr.js +743 -0
  88. package/dist/chunks/PropertyField-BbNqK8xr.js.map +1 -0
  89. package/dist/chunks/{RadioGroup-Bh4-12e-.js → RadioGroup-B70_M-gT.js} +2 -2
  90. package/dist/chunks/{RadioGroup-Bh4-12e-.js.map → RadioGroup-B70_M-gT.js.map} +1 -1
  91. package/dist/chunks/{RangeSlider-SEGE-7VF.js → RangeSlider-DO5TZVk7.js} +8 -8
  92. package/dist/chunks/{RangeSlider-SEGE-7VF.js.map → RangeSlider-DO5TZVk7.js.map} +1 -1
  93. package/dist/chunks/RecentColorsProvider-DHcfk25u.js +84 -0
  94. package/dist/chunks/RecentColorsProvider-DHcfk25u.js.map +1 -0
  95. package/dist/chunks/ResizeHandle-CbAgCQOt.js +81 -0
  96. package/dist/chunks/ResizeHandle-CbAgCQOt.js.map +1 -0
  97. package/dist/chunks/Select-ouV8O6cp.js +236 -0
  98. package/dist/chunks/Select-ouV8O6cp.js.map +1 -0
  99. package/dist/chunks/{SelectionPanel-BaQnX4Bs.js → SelectionPanel-C3WzyaZV.js} +14 -13
  100. package/dist/chunks/{SelectionPanel-BaQnX4Bs.js.map → SelectionPanel-C3WzyaZV.js.map} +1 -1
  101. package/dist/chunks/{SidebarPanel-BblDEz4G.js → SidebarPanel-AXQ0jRDx.js} +2 -2
  102. package/dist/chunks/{SidebarPanel-BblDEz4G.js.map → SidebarPanel-AXQ0jRDx.js.map} +1 -1
  103. package/dist/chunks/{Slider-YofwGOI4.js → Slider-DSrlMEq8.js} +19 -19
  104. package/dist/chunks/Slider-DSrlMEq8.js.map +1 -0
  105. package/dist/chunks/{StatusBar-Ca9Dvhhq.js → StatusBar-BEOfOX0D.js} +6 -6
  106. package/dist/chunks/StatusBar-BEOfOX0D.js.map +1 -0
  107. package/dist/chunks/SwatchGrid-9ZPiDmxd.js +78 -0
  108. package/dist/chunks/SwatchGrid-9ZPiDmxd.js.map +1 -0
  109. package/dist/chunks/SwatchStrip-Bi9iPLoh.js +577 -0
  110. package/dist/chunks/SwatchStrip-Bi9iPLoh.js.map +1 -0
  111. package/dist/chunks/{ThemeSwitcher-BlsInAmR.js → ThemeSwitcher-DiBmMh_B.js} +3 -3
  112. package/dist/chunks/{ThemeSwitcher-BlsInAmR.js.map → ThemeSwitcher-DiBmMh_B.js.map} +1 -1
  113. package/dist/chunks/{Timeline-B39cwfMB.js → Timeline-sMCH2fah.js} +293 -280
  114. package/dist/chunks/Timeline-sMCH2fah.js.map +1 -0
  115. package/dist/chunks/Toast-C3ozq11V.js +170 -0
  116. package/dist/chunks/Toast-C3ozq11V.js.map +1 -0
  117. package/dist/chunks/{ToggleBar-BTYkBXU9.js → ToggleBar-Z2jZiguF.js} +6 -8
  118. package/dist/chunks/{ToggleBar-BTYkBXU9.js.map → ToggleBar-Z2jZiguF.js.map} +1 -1
  119. package/dist/chunks/{TokenPanel-CMDAOfYH.js → TokenPanel-WtKGY2Db.js} +32 -32
  120. package/dist/chunks/TokenPanel-WtKGY2Db.js.map +1 -0
  121. package/dist/chunks/{ToolButton-CAHBa08P.js → ToolButton-BURp4YIO.js} +7 -9
  122. package/dist/chunks/ToolButton-BURp4YIO.js.map +1 -0
  123. package/dist/chunks/{ToolOptionsBar-D_GCrBAN.js → ToolOptionsBar-CZTYPoC2.js} +3 -2
  124. package/dist/chunks/{ToolOptionsBar-D_GCrBAN.js.map → ToolOptionsBar-CZTYPoC2.js.map} +1 -1
  125. package/dist/chunks/{ToolPalette-OOWN51Xx.js → ToolPalette-DKDFWOX-.js} +7 -9
  126. package/dist/chunks/{ToolPalette-OOWN51Xx.js.map → ToolPalette-DKDFWOX-.js.map} +1 -1
  127. package/dist/chunks/{Tooltip-Clg2mhSt.js → Tooltip-C6eFCYxw.js} +2 -2
  128. package/dist/chunks/{Tooltip-Clg2mhSt.js.map → Tooltip-C6eFCYxw.js.map} +1 -1
  129. package/dist/chunks/Tree-Cc8lIzgM.js.map +1 -1
  130. package/dist/chunks/checkbox.module-DLQV9tMX.js +5 -0
  131. package/dist/chunks/checkbox.module-DLQV9tMX.js.map +1 -0
  132. package/dist/chunks/{createKeyframeLayer-DVl321_l.js → createKeyframeLayer-DSVf13Su.js} +194 -208
  133. package/dist/chunks/createKeyframeLayer-DSVf13Su.js.map +1 -0
  134. package/dist/chunks/field.module-B27pWv0i.js +15 -0
  135. package/dist/chunks/field.module-B27pWv0i.js.map +1 -0
  136. package/dist/chunks/formatShortcut-DRQrVThu.js.map +1 -1
  137. package/dist/chunks/handles-CqVANLtu.js +17 -0
  138. package/dist/chunks/handles-CqVANLtu.js.map +1 -0
  139. package/dist/chunks/{icons-BhcR1l64.js → icons-Dr2-r30x.js} +2 -2
  140. package/dist/chunks/icons-Dr2-r30x.js.map +1 -0
  141. package/dist/chunks/listbox.module-BcdVJMbm.js +8 -0
  142. package/dist/chunks/listbox.module-BcdVJMbm.js.map +1 -0
  143. package/dist/chunks/model-qsAFK7_0.js +386 -0
  144. package/dist/chunks/model-qsAFK7_0.js.map +1 -0
  145. package/dist/chunks/{portalHost-yTOVuCej.js → portalHost-CE70wLzo.js} +10 -6
  146. package/dist/chunks/portalHost-CE70wLzo.js.map +1 -0
  147. package/dist/chunks/prefField-BE_Ytr2H.js +229 -0
  148. package/dist/chunks/prefField-BE_Ytr2H.js.map +1 -0
  149. package/dist/chunks/{segmentTooltip-CStYHKzd.js → segmentTooltip-CGxCOWNz.js} +2 -2
  150. package/dist/chunks/{segmentTooltip-CStYHKzd.js.map → segmentTooltip-CGxCOWNz.js.map} +1 -1
  151. package/dist/chunks/segmentedControl.module-BzGXUL5G.js +11 -0
  152. package/dist/chunks/segmentedControl.module-BzGXUL5G.js.map +1 -0
  153. package/dist/chunks/useReorderDragList-CStYKjHl.js +133 -0
  154. package/dist/chunks/useReorderDragList-CStYKjHl.js.map +1 -0
  155. package/dist/chunks/useRovingTabIndex-D7u22Ia_.js +91 -0
  156. package/dist/chunks/useRovingTabIndex-D7u22Ia_.js.map +1 -0
  157. package/dist/components/ActionBar/ActionBar.d.ts.map +1 -1
  158. package/dist/components/ActionBar/index.js +1 -1
  159. package/dist/components/Badge/bases/ChamferedRect.d.ts.map +1 -1
  160. package/dist/components/Badge/index.js +1 -1
  161. package/dist/components/BandEditor/BandEditor.d.ts +1 -0
  162. package/dist/components/BandEditor/BandEditor.d.ts.map +1 -1
  163. package/dist/components/BandEditor/index.js +1 -1
  164. package/dist/components/Button/index.js +1 -1
  165. package/dist/components/ButtonBar/ButtonBar.d.ts.map +1 -1
  166. package/dist/components/ButtonBar/index.js +1 -1
  167. package/dist/components/Callout/Callout.d.ts.map +1 -1
  168. package/dist/components/Callout/index.js +1 -1
  169. package/dist/components/Checkbox/Checkbox.d.ts +28 -13
  170. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
  171. package/dist/components/Checkbox/index.js +1 -1
  172. package/dist/components/CloseButton/index.js +1 -1
  173. package/dist/components/ColorField/ColorField.d.ts.map +1 -1
  174. package/dist/components/ColorField/OpacityRange.d.ts +18 -0
  175. package/dist/components/ColorField/OpacityRange.d.ts.map +1 -0
  176. package/dist/components/ColorField/index.js +1 -1
  177. package/dist/components/ColorModeControl/index.js +1 -1
  178. package/dist/components/ComboBox/ComboBox.d.ts +7 -0
  179. package/dist/components/ComboBox/ComboBox.d.ts.map +1 -1
  180. package/dist/components/ComboBox/index.js +1 -1
  181. package/dist/components/CurveEditor/CurveEditor.d.ts.map +1 -1
  182. package/dist/components/CurveEditor/LayeredCurveEditor.d.ts.map +1 -1
  183. package/dist/components/CurveEditor/index.js +2 -2
  184. package/dist/components/DataGrid/DataGrid.d.ts +3 -0
  185. package/dist/components/DataGrid/DataGrid.d.ts.map +1 -1
  186. package/dist/components/DataGrid/index.js +1 -1
  187. package/dist/components/DetailList/DetailList.d.ts +1 -1
  188. package/dist/components/DetailList/DetailList.d.ts.map +1 -1
  189. package/dist/components/DetailList/index.js +1 -1
  190. package/dist/components/DetentSlider/index.js +1 -1
  191. package/dist/components/Dialog/index.js +1 -1
  192. package/dist/components/DragGhost/index.js +1 -1
  193. package/dist/components/FallthroughDiagram/index.js +1 -1
  194. package/dist/components/Field/index.js +1 -1
  195. package/dist/components/FillStrokeSwatch/FillStrokeSwatch.d.ts +5 -2
  196. package/dist/components/FillStrokeSwatch/FillStrokeSwatch.d.ts.map +1 -1
  197. package/dist/components/FillStrokeSwatch/index.js +1 -1
  198. package/dist/components/FontFamilySelect/FontFamilySelect.d.ts +20 -0
  199. package/dist/components/FontFamilySelect/FontFamilySelect.d.ts.map +1 -1
  200. package/dist/components/FontFamilySelect/index.js +1 -1
  201. package/dist/components/FontWeightSelect/FontWeightSelect.d.ts +26 -0
  202. package/dist/components/FontWeightSelect/FontWeightSelect.d.ts.map +1 -0
  203. package/dist/components/FontWeightSelect/index.d.ts +3 -0
  204. package/dist/components/FontWeightSelect/index.d.ts.map +1 -0
  205. package/dist/components/FontWeightSelect/index.js +2 -0
  206. package/dist/components/GestureRoute/index.js +1 -1
  207. package/dist/components/GradientEditor/GradientHandles.d.ts +1 -8
  208. package/dist/components/GradientEditor/GradientHandles.d.ts.map +1 -1
  209. package/dist/components/GradientEditor/SceneGradientHandles.d.ts +7 -5
  210. package/dist/components/GradientEditor/SceneGradientHandles.d.ts.map +1 -1
  211. package/dist/components/GradientEditor/handleOverlay.d.ts +41 -0
  212. package/dist/components/GradientEditor/handleOverlay.d.ts.map +1 -0
  213. package/dist/components/GradientEditor/index.js +1 -1
  214. package/dist/components/InlineRange/index.js +1 -1
  215. package/dist/components/Input/Input.d.ts +1 -1
  216. package/dist/components/Input/Input.d.ts.map +1 -1
  217. package/dist/components/Input/index.js +1 -1
  218. package/dist/components/ItemList/ItemList.d.ts +32 -31
  219. package/dist/components/ItemList/ItemList.d.ts.map +1 -1
  220. package/dist/components/ItemList/index.js +1 -1
  221. package/dist/components/Jog/index.js +1 -1
  222. package/dist/components/LayerList/LayerList.d.ts.map +1 -1
  223. package/dist/components/LayerList/index.js +1 -1
  224. package/dist/components/ListEditor/ListEditor.d.ts.map +1 -1
  225. package/dist/components/ListEditor/index.js +1 -1
  226. package/dist/components/MenuButton/MenuButton.d.ts.map +1 -1
  227. package/dist/components/MenuButton/index.js +1 -1
  228. package/dist/components/MeshEditor/MeshEditor.d.ts +4 -3
  229. package/dist/components/MeshEditor/MeshEditor.d.ts.map +1 -1
  230. package/dist/components/MeshEditor/MeshHandles.d.ts +38 -0
  231. package/dist/components/MeshEditor/MeshHandles.d.ts.map +1 -0
  232. package/dist/components/MeshEditor/index.d.ts +2 -0
  233. package/dist/components/MeshEditor/index.d.ts.map +1 -1
  234. package/dist/components/MeshEditor/index.js +2 -2
  235. package/dist/components/NumberField/NumberField.d.ts +1 -1
  236. package/dist/components/NumberField/NumberField.d.ts.map +1 -1
  237. package/dist/components/NumberField/index.js +1 -1
  238. package/dist/components/OptionsBar/OptionsBar.d.ts.map +1 -1
  239. package/dist/components/OptionsBar/index.js +1 -1
  240. package/dist/components/PaintField/PaintField.d.ts.map +1 -1
  241. package/dist/components/PaintField/index.js +1 -1
  242. package/dist/components/PaintInput/PaintInput.d.ts.map +1 -1
  243. package/dist/components/PaintInput/index.js +1 -1
  244. package/dist/components/PatternPicker/PatternPicker.d.ts +6 -5
  245. package/dist/components/PatternPicker/PatternPicker.d.ts.map +1 -1
  246. package/dist/components/PatternPicker/index.js +1 -1
  247. package/dist/components/Plot2D/index.js +1 -1
  248. package/dist/components/PointPlotter/index.js +1 -1
  249. package/dist/components/Powerline/index.js +2 -2
  250. package/dist/components/Prefs/PrefsForm.d.ts +22 -0
  251. package/dist/components/Prefs/PrefsForm.d.ts.map +1 -1
  252. package/dist/components/Prefs/PrefsRail.d.ts +3 -2
  253. package/dist/components/Prefs/PrefsRail.d.ts.map +1 -1
  254. package/dist/components/Prefs/PrefsRow.d.ts +4 -0
  255. package/dist/components/Prefs/PrefsRow.d.ts.map +1 -1
  256. package/dist/components/Prefs/index.js +2 -2
  257. package/dist/components/Prefs/prefField.d.ts +13 -0
  258. package/dist/components/Prefs/prefField.d.ts.map +1 -1
  259. package/dist/components/Properties/PropertyField.d.ts +13 -2
  260. package/dist/components/Properties/PropertyField.d.ts.map +1 -1
  261. package/dist/components/Properties/PropertyPanel.d.ts +18 -1
  262. package/dist/components/Properties/PropertyPanel.d.ts.map +1 -1
  263. package/dist/components/Properties/index.d.ts +2 -2
  264. package/dist/components/Properties/index.d.ts.map +1 -1
  265. package/dist/components/Properties/index.js +3 -3
  266. package/dist/components/RadioGroup/index.js +1 -1
  267. package/dist/components/RangeSlider/index.js +1 -1
  268. package/dist/components/RecentColors/RecentColorsProvider.d.ts +24 -0
  269. package/dist/components/RecentColors/RecentColorsProvider.d.ts.map +1 -0
  270. package/dist/components/RecentColors/index.d.ts +5 -0
  271. package/dist/components/RecentColors/index.d.ts.map +1 -0
  272. package/dist/components/RecentColors/index.js +2 -0
  273. package/dist/components/RecentColors/recentColors.d.ts +39 -0
  274. package/dist/components/RecentColors/recentColors.d.ts.map +1 -0
  275. package/dist/components/ResizeHandle/ResizeHandle.d.ts.map +1 -1
  276. package/dist/components/ResizeHandle/index.js +1 -1
  277. package/dist/components/Select/Select.d.ts +6 -2
  278. package/dist/components/Select/Select.d.ts.map +1 -1
  279. package/dist/components/Select/index.js +1 -1
  280. package/dist/components/SelectionPanel/index.js +2 -2
  281. package/dist/components/SelectionPanel/renderLeaf.d.ts +12 -2
  282. package/dist/components/SelectionPanel/renderLeaf.d.ts.map +1 -1
  283. package/dist/components/SidebarPanel/index.js +1 -1
  284. package/dist/components/Slider/index.js +1 -1
  285. package/dist/components/StatusBar/StatusBar.d.ts +1 -1
  286. package/dist/components/StatusBar/index.js +1 -1
  287. package/dist/components/SwatchGrid/SwatchGrid.d.ts.map +1 -1
  288. package/dist/components/SwatchGrid/index.js +1 -1
  289. package/dist/components/SwatchStrip/SwatchStrip.d.ts +44 -0
  290. package/dist/components/SwatchStrip/SwatchStrip.d.ts.map +1 -0
  291. package/dist/components/SwatchStrip/index.d.ts +5 -0
  292. package/dist/components/SwatchStrip/index.d.ts.map +1 -0
  293. package/dist/components/SwatchStrip/index.js +2 -0
  294. package/dist/components/SwatchStrip/palettes.d.ts +21 -0
  295. package/dist/components/SwatchStrip/palettes.d.ts.map +1 -0
  296. package/dist/components/ThemeSwitcher/index.js +1 -1
  297. package/dist/components/Timeline/AnimatedTimeline.d.ts +1 -0
  298. package/dist/components/Timeline/AnimatedTimeline.d.ts.map +1 -1
  299. package/dist/components/Timeline/EasingPicker.d.ts +3 -0
  300. package/dist/components/Timeline/EasingPicker.d.ts.map +1 -1
  301. package/dist/components/Timeline/LaneGraph.d.ts +1 -1
  302. package/dist/components/Timeline/LaneGraph.d.ts.map +1 -1
  303. package/dist/components/Timeline/Timeline.d.ts +10 -1
  304. package/dist/components/Timeline/Timeline.d.ts.map +1 -1
  305. package/dist/components/Timeline/Transport.d.ts +6 -0
  306. package/dist/components/Timeline/Transport.d.ts.map +1 -1
  307. package/dist/components/Timeline/index.js +1 -1
  308. package/dist/components/Timeline/keys.d.ts +1 -0
  309. package/dist/components/Timeline/keys.d.ts.map +1 -1
  310. package/dist/components/Toast/Toast.d.ts +12 -3
  311. package/dist/components/Toast/Toast.d.ts.map +1 -1
  312. package/dist/components/Toast/index.js +1 -1
  313. package/dist/components/ToggleBar/ToggleBar.d.ts.map +1 -1
  314. package/dist/components/ToggleBar/index.js +1 -1
  315. package/dist/components/TokenPanel/index.js +1 -1
  316. package/dist/components/TokenPanel/tokenTypes.d.ts +1 -0
  317. package/dist/components/TokenPanel/tokenTypes.d.ts.map +1 -1
  318. package/dist/components/ToolButton/ToolButton.d.ts +1 -10
  319. package/dist/components/ToolButton/ToolButton.d.ts.map +1 -1
  320. package/dist/components/ToolButton/index.js +1 -1
  321. package/dist/components/ToolOptionsBar/index.js +1 -1
  322. package/dist/components/ToolPalette/ToolPalette.d.ts.map +1 -1
  323. package/dist/components/ToolPalette/formatShortcut.d.ts +2 -0
  324. package/dist/components/ToolPalette/formatShortcut.d.ts.map +1 -1
  325. package/dist/components/ToolPalette/index.js +1 -1
  326. package/dist/components/Tooltip/index.js +1 -1
  327. package/dist/components/Tree/Tree.d.ts +27 -26
  328. package/dist/components/Tree/Tree.d.ts.map +1 -1
  329. package/dist/icons/index.d.ts +51 -0
  330. package/dist/icons/index.d.ts.map +1 -1
  331. package/dist/icons/paths.d.ts +2 -0
  332. package/dist/icons/paths.d.ts.map +1 -1
  333. package/dist/index.d.ts +4 -1
  334. package/dist/index.d.ts.map +1 -1
  335. package/dist/index.js +98 -95
  336. package/dist/index.js.map +1 -1
  337. package/dist/overlays/portalHost.d.ts +6 -0
  338. package/dist/overlays/portalHost.d.ts.map +1 -1
  339. package/dist/style.css +1 -1
  340. package/dist/useAsyncOptions.d.ts.map +1 -1
  341. package/dist/useReorderDragList.d.ts.map +1 -1
  342. package/dist/useRovingTabIndex.d.ts +40 -39
  343. package/dist/useRovingTabIndex.d.ts.map +1 -1
  344. package/package.json +9 -9
  345. package/dist/chunks/ActionBar-DCq16yFA.js +0 -57
  346. package/dist/chunks/ActionBar-DCq16yFA.js.map +0 -1
  347. package/dist/chunks/BandEditor-Dd0egAgE.js.map +0 -1
  348. package/dist/chunks/Callout-ndW5_Bqx.js +0 -116
  349. package/dist/chunks/Callout-ndW5_Bqx.js.map +0 -1
  350. package/dist/chunks/Checkbox-DHXTUHO9.js +0 -47
  351. package/dist/chunks/Checkbox-DHXTUHO9.js.map +0 -1
  352. package/dist/chunks/ColorField-Yz_BkcCT.js +0 -69
  353. package/dist/chunks/ColorField-Yz_BkcCT.js.map +0 -1
  354. package/dist/chunks/ComboBox-B34H76CW.js +0 -138
  355. package/dist/chunks/ComboBox-B34H76CW.js.map +0 -1
  356. package/dist/chunks/CurveEditor-DUVjd25R.js.map +0 -1
  357. package/dist/chunks/DataGrid-LZ2JgY2Y.js.map +0 -1
  358. package/dist/chunks/DetailList-BKomDzg5.js +0 -52
  359. package/dist/chunks/DetailList-BKomDzg5.js.map +0 -1
  360. package/dist/chunks/FallthroughDiagram-BEHiM5IS.js.map +0 -1
  361. package/dist/chunks/Field--onYxXTF.js +0 -32
  362. package/dist/chunks/Field--onYxXTF.js.map +0 -1
  363. package/dist/chunks/FillStrokeSwatch-DNb0KXPk.js +0 -111
  364. package/dist/chunks/FillStrokeSwatch-DNb0KXPk.js.map +0 -1
  365. package/dist/chunks/FontFamilySelect-DkRgNtag.js.map +0 -1
  366. package/dist/chunks/GradientEditor-b7v4Ph3i.js +0 -363
  367. package/dist/chunks/GradientEditor-b7v4Ph3i.js.map +0 -1
  368. package/dist/chunks/Icon-CcVjdq2C.js.map +0 -1
  369. package/dist/chunks/InlineRange-P01ABSzo.js.map +0 -1
  370. package/dist/chunks/Input-CHmkfYaD.js.map +0 -1
  371. package/dist/chunks/ItemList-Cm-HUWCi.js.map +0 -1
  372. package/dist/chunks/Jog-DRmfrkCg.js.map +0 -1
  373. package/dist/chunks/LayerList-wCI1EueM.js.map +0 -1
  374. package/dist/chunks/ListEditor-BeA60TAA.js +0 -71
  375. package/dist/chunks/ListEditor-BeA60TAA.js.map +0 -1
  376. package/dist/chunks/MenuButton-BSqEChJE.js +0 -70
  377. package/dist/chunks/MenuButton-BSqEChJE.js.map +0 -1
  378. package/dist/chunks/MeshEditor-D1HLZcAh.js +0 -87
  379. package/dist/chunks/MeshEditor-D1HLZcAh.js.map +0 -1
  380. package/dist/chunks/NumberField-BnJxcazc.js.map +0 -1
  381. package/dist/chunks/PaintField-DadOELMg.js +0 -62
  382. package/dist/chunks/PaintField-DadOELMg.js.map +0 -1
  383. package/dist/chunks/PaintInput-v8Y7MDbH.js +0 -121
  384. package/dist/chunks/PaintInput-v8Y7MDbH.js.map +0 -1
  385. package/dist/chunks/PatternPicker-R_EQtw2Q.js +0 -93
  386. package/dist/chunks/PatternPicker-R_EQtw2Q.js.map +0 -1
  387. package/dist/chunks/Plot2D-CTXHkL5p.js.map +0 -1
  388. package/dist/chunks/Prefs-ByA-x51i.js.map +0 -1
  389. package/dist/chunks/PropertyField-DfIJJ5GS.js +0 -673
  390. package/dist/chunks/PropertyField-DfIJJ5GS.js.map +0 -1
  391. package/dist/chunks/ResizeHandle-rKVWyeTG.js +0 -79
  392. package/dist/chunks/ResizeHandle-rKVWyeTG.js.map +0 -1
  393. package/dist/chunks/Select-ClmKtyWg.js +0 -229
  394. package/dist/chunks/Select-ClmKtyWg.js.map +0 -1
  395. package/dist/chunks/Slider-YofwGOI4.js.map +0 -1
  396. package/dist/chunks/StatusBar-Ca9Dvhhq.js.map +0 -1
  397. package/dist/chunks/SwatchGrid-BYvA8Bmh.js +0 -73
  398. package/dist/chunks/SwatchGrid-BYvA8Bmh.js.map +0 -1
  399. package/dist/chunks/Timeline-B39cwfMB.js.map +0 -1
  400. package/dist/chunks/Toast-BF9GE0HC.js +0 -126
  401. package/dist/chunks/Toast-BF9GE0HC.js.map +0 -1
  402. package/dist/chunks/TokenPanel-CMDAOfYH.js.map +0 -1
  403. package/dist/chunks/ToolButton-CAHBa08P.js.map +0 -1
  404. package/dist/chunks/createKeyframeLayer-DVl321_l.js.map +0 -1
  405. package/dist/chunks/icons-BhcR1l64.js.map +0 -1
  406. package/dist/chunks/model-BaF65rnX.js +0 -365
  407. package/dist/chunks/model-BaF65rnX.js.map +0 -1
  408. package/dist/chunks/portalHost-yTOVuCej.js.map +0 -1
  409. package/dist/chunks/prefField-BopW9bjx.js +0 -201
  410. package/dist/chunks/prefField-BopW9bjx.js.map +0 -1
  411. package/dist/chunks/segmentedControl.module-D6SzYJD7.js +0 -11
  412. package/dist/chunks/segmentedControl.module-D6SzYJD7.js.map +0 -1
  413. package/dist/chunks/useReorderDragList-FCMoFIzH.js +0 -131
  414. package/dist/chunks/useReorderDragList-FCMoFIzH.js.map +0 -1
  415. package/dist/chunks/useRovingTabIndex-Bp_hYm_h.js +0 -65
  416. package/dist/chunks/useRovingTabIndex-Bp_hYm_h.js.map +0 -1
@@ -0,0 +1,72 @@
1
+ import { t as e } from "./Button-XB-T75YL.js";
2
+ import { t } from "./CloseButton-BmNmRVtb.js";
3
+ import { t as n } from "./field.module-B27pWv0i.js";
4
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
+ import { useEffect as a, useRef as o, useState as s } from "react";
6
+ var c = {
7
+ editor: "_editor_duzaw_1",
8
+ list: "_list_duzaw_8",
9
+ entry: "_entry_duzaw_17",
10
+ input: "_input_duzaw_23",
11
+ empty: "_empty_duzaw_29",
12
+ actions: "_actions_duzaw_35"
13
+ };
14
+ //#endregion
15
+ //#region src/components/ListEditor/ListEditor.tsx
16
+ function l({ value: l, onChange: u, placeholder: d, empty: f = "None", addLabel: p = "Add", "aria-label": m, className: h }) {
17
+ let g = o([]), [_, v] = s(null);
18
+ a(() => {
19
+ _ !== null && (g.current[_]?.focus(), v(null));
20
+ }, [_]);
21
+ let y = (e) => {
22
+ u([
23
+ ...l.slice(0, e),
24
+ "",
25
+ ...l.slice(e)
26
+ ]), v(e);
27
+ }, b = (e) => {
28
+ u(l.filter((t, n) => n !== e)), l.length > 1 && v(Math.max(0, e - 1));
29
+ }, x = (e, t) => {
30
+ e.key === "Enter" ? (e.preventDefault(), y(t + 1)) : e.key === "Backspace" && l[t] === "" && (e.preventDefault(), b(t));
31
+ }, S = (e) => `${m ?? "Entry"} ${e + 1}`;
32
+ return /* @__PURE__ */ i("div", {
33
+ className: [c.editor, h].filter(Boolean).join(" "),
34
+ role: "group",
35
+ "aria-label": m,
36
+ children: [l.length === 0 ? /* @__PURE__ */ r("div", {
37
+ className: c.empty,
38
+ children: f
39
+ }) : /* @__PURE__ */ r("ul", {
40
+ className: c.list,
41
+ children: l.map((e, a) => /* @__PURE__ */ i("li", {
42
+ className: c.entry,
43
+ children: [/* @__PURE__ */ r("input", {
44
+ ref: (e) => {
45
+ g.current[a] = e;
46
+ },
47
+ type: "text",
48
+ className: `${n.frame} ${c.input}`,
49
+ "aria-label": S(a),
50
+ value: e,
51
+ placeholder: d,
52
+ onChange: (e) => u(l.map((t, n) => n === a ? e.target.value : t)),
53
+ onKeyDown: (e) => x(e, a)
54
+ }), /* @__PURE__ */ r(t, {
55
+ ariaLabel: `Remove ${S(a)}`,
56
+ onClick: () => b(a)
57
+ })]
58
+ }, a))
59
+ }), /* @__PURE__ */ r("div", {
60
+ className: c.actions,
61
+ children: /* @__PURE__ */ r(e, {
62
+ size: "sm",
63
+ onClick: () => y(l.length),
64
+ children: p
65
+ })
66
+ })]
67
+ });
68
+ }
69
+ //#endregion
70
+ export { l as t };
71
+
72
+ //# sourceMappingURL=ListEditor-OQDzG4A5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListEditor-OQDzG4A5.js","names":["s","f","Button","field_module_default","ListEditor_module_default","ListEditor","ariaLabel","inputs","useRef","focus","setFocus","useState","insert","onChange","value","at","remove","i","onKeyDown","name","className","empty","el","entry","j","v","CloseButton","addLabel"],"sources":["../../src/components/ListEditor/ListEditor.module.css","../../src/components/ListEditor/ListEditor.tsx"],"sourcesContent":[".editor {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-4);\n min-width: min(28rem, calc(100vw - 64px));\n}\n\n.list {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-2);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.entry {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-2);\n}\n\n.input {\n flex: 1 1 auto;\n min-width: 0;\n padding: 0 var(--wzl-field-pad-x);\n}\n\n.empty {\n font-size: var(--wzl-font-size-sm);\n color: var(--wzl-fg-subtle);\n font-style: italic;\n}\n\n.actions {\n display: flex;\n}\n","import { useEffect, useRef, useState, type KeyboardEvent } from 'react';\nimport { Button } from '../Button';\nimport { CloseButton } from '../CloseButton';\nimport f from '../field.module.css';\nimport s from './ListEditor.module.css';\n\n/** Props for {@link ListEditor}. */\nexport interface ListEditorProps {\n value: readonly string[];\n /** Every edit, add and removal, with the whole list. Entries are written as\n * typed — an empty one stays until it is removed. */\n onChange: (next: string[]) => void;\n /** Shown in an empty entry. */\n placeholder?: string;\n /** Shown in place of the entries when there are none. */\n empty?: string;\n /** Text of the add button. */\n addLabel?: string;\n /** Names the list for assistive tech; each entry is named from it. */\n 'aria-label'?: string;\n className?: string;\n}\n\n/**\n * An editable list of strings: one field per entry, a remove button beside\n * each, and an add button under them. Enter in an entry adds one after it;\n * Backspace in an empty one removes it.\n */\nexport function ListEditor({\n value,\n onChange,\n placeholder,\n empty = 'None',\n addLabel = 'Add',\n 'aria-label': ariaLabel,\n className,\n}: ListEditorProps) {\n const inputs = useRef<(HTMLInputElement | null)[]>([]);\n const [focus, setFocus] = useState<number | null>(null);\n\n useEffect(() => {\n if (focus === null) return;\n inputs.current[focus]?.focus();\n setFocus(null);\n }, [focus]);\n\n const insert = (at: number): void => {\n onChange([...value.slice(0, at), '', ...value.slice(at)]);\n setFocus(at);\n };\n const remove = (at: number): void => {\n onChange(value.filter((_, i) => i !== at));\n if (value.length > 1) setFocus(Math.max(0, at - 1));\n };\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>, at: number): void => {\n if (e.key === 'Enter') {\n e.preventDefault();\n insert(at + 1);\n } else if (e.key === 'Backspace' && value[at] === '') {\n e.preventDefault();\n remove(at);\n }\n };\n const name = (i: number): string => `${ariaLabel ?? 'Entry'} ${i + 1}`;\n\n return (\n <div className={[s.editor, className].filter(Boolean).join(' ')} role=\"group\" aria-label={ariaLabel}>\n {value.length === 0 ? (\n <div className={s.empty}>{empty}</div>\n ) : (\n <ul className={s.list}>\n {value.map((entry, i) => (\n // Entries have no identity beyond their position, and two may be equal.\n <li key={i} className={s.entry}>\n <input\n ref={(el) => {\n inputs.current[i] = el;\n }}\n type=\"text\"\n className={`${f.frame} ${s.input}`}\n aria-label={name(i)}\n value={entry}\n placeholder={placeholder}\n onChange={(e) => onChange(value.map((v, j) => (j === i ? e.target.value : v)))}\n onKeyDown={(e) => onKeyDown(e, i)}\n />\n <CloseButton ariaLabel={`Remove ${name(i)}`} onClick={() => remove(i)} />\n </li>\n ))}\n </ul>\n )}\n <div className={s.actions}>\n <Button size=\"sm\" onClick={() => insert(value.length)}>\n {addLabel}\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AC4BA,SAAgBK,EAAW,EACzB,UACA,aACA,gBACA,WAAQ,QACR,cAAW,OACX,cAAcC,GACd,gBACkB;CAClB,IAAMC,IAASC,EAAoC,CAAC,CAAC,GAC/C,CAACC,GAAOC,KAAYC,EAAwB,IAAI;CAEtD,QAAgB;EACd,AAAIF,MAAU,SACdF,EAAO,QAAQE,EAAM,EAAE,MAAM,GAC7BC,EAAS,IAAI;CACf,GAAG,CAACD,CAAK,CAAC;CAEV,IAAMG,KAAU,MAAqB;EAEnC,AADAC,EAAS;GAAC,GAAGC,EAAM,MAAM,GAAGC,CAAE;GAAG;GAAI,GAAGD,EAAM,MAAMC,CAAE;EAAC,CAAC,GACxDL,EAASK,CAAE;CACb,GACMC,KAAU,MAAqB;EAEnC,AADAH,EAASC,EAAM,QAAQ,GAAG,MAAMG,MAAMF,CAAE,CAAC,GACrCD,EAAM,SAAS,KAAGJ,EAAS,KAAK,IAAI,GAAGK,IAAK,CAAC,CAAC;CACpD,GACMG,KAAa,GAAoC,MAAqB;EAC1E,AAAI,EAAE,QAAQ,WACZ,EAAE,eAAe,GACjBN,EAAOG,IAAK,CAAC,KACJ,EAAE,QAAQ,eAAeD,EAAMC,OAAQ,OAChD,EAAE,eAAe,GACjBC,EAAOD,CAAE;CAEb,GACMI,KAAQ,MAAsB,GAAGb,KAAa,QAAQ,GAAGW,IAAI;CAEnE,OACE,kBAAC,OAAD;EAAK,WAAW,CAACjB,EAAE,QAAQoB,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EAAG,MAAK;EAAQ,cAAYd;EAA1F,UAAA,CACGQ,EAAM,WAAW,IAChB,kBAAC,OAAD;GAAK,WAAWd,EAAE;GAAQ,UAAAqB;EAAW,CAAA,IAErC,kBAAC,MAAD;GAAI,WAAWrB,EAAE;GACd,UAAAc,EAAM,KAAK,GAAO,MAEjB,kBAAC,MAAD;IAAY,WAAWd,EAAE;IAAzB,UAAA,CACE,kBAAC,SAAD;KACE,MAAM,MAAO;MACX,EAAO,QAAQiB,KAAKK;KACtB;KACA,MAAK;KACL,WAAW,GAAGrB,EAAE,MAAM,GAAGD,EAAE;KAC3B,cAAYmB,EAAKF,CAAC;KAClB,OAAOM;KACM;KACb,WAAW,MAAMV,EAASC,EAAM,KAAK,GAAG,MAAOU,MAAMP,IAAI,EAAE,OAAO,QAAQQ,CAAE,CAAC;KAC7E,YAAY,MAAMP,EAAU,GAAGD,CAAC;IACjC,CAAA,GACD,kBAACS,GAAD;KAAa,WAAW,UAAUP,EAAKF,CAAC;KAAK,eAAeD,EAAOC,CAAC;IAAI,CAAA,CACtE;GAdK,GAAAA,CAcL,CACL;EACC,CAAA,GAEN,kBAAC,OAAD;GAAK,WAAWjB,EAAE;GAChB,UAAA,kBAACE,GAAD;IAAQ,MAAK;IAAK,eAAeU,EAAOE,EAAM,MAAM;IACjD,UAAAa;GACK,CAAA;EACL,CAAA,CACF;;AAET"}
@@ -0,0 +1,75 @@
1
+ import { i as e } from "./portalHost-CE70wLzo.js";
2
+ import { n as t, r as n } from "./segmentTooltip-CGxCOWNz.js";
3
+ import { t as r } from "./field.module-B27pWv0i.js";
4
+ import { t as i } from "./listbox.module-BcdVJMbm.js";
5
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
6
+ import { Button as s, Menu as c, MenuItem as l, MenuTrigger as u, Popover as d } from "react-aria-components";
7
+ var f = {
8
+ trigger: "_trigger_qg4sk_1",
9
+ label: "_label_qg4sk_11",
10
+ chevron: "_chevron_qg4sk_15",
11
+ popover: "_popover_qg4sk_22",
12
+ item: "_item_qg4sk_28"
13
+ };
14
+ //#endregion
15
+ //#region src/components/MenuButton/MenuButton.tsx
16
+ function p({ label: p, items: m, onAction: h, isDisabled: g, className: _, "aria-label": v, portalContainer: y, shortcut: b, tooltip: x }) {
17
+ let { anchor: S, portalProps: C } = e(y);
18
+ return /* @__PURE__ */ o(u, { children: [
19
+ S,
20
+ /* @__PURE__ */ a(t, {
21
+ content: n({
22
+ tooltip: x,
23
+ shortcut: b,
24
+ ariaLabel: v,
25
+ label: p
26
+ }),
27
+ disabled: g,
28
+ children: /* @__PURE__ */ o(s, {
29
+ className: [
30
+ r.frame,
31
+ f.trigger,
32
+ _
33
+ ].filter(Boolean).join(" "),
34
+ isDisabled: g,
35
+ "aria-label": v,
36
+ children: [/* @__PURE__ */ a("span", {
37
+ className: f.label,
38
+ children: p
39
+ }), /* @__PURE__ */ a("svg", {
40
+ className: f.chevron,
41
+ viewBox: "0 0 10 10",
42
+ "aria-hidden": "true",
43
+ children: /* @__PURE__ */ a("path", {
44
+ d: "M2 4 L5 7 L8 4",
45
+ fill: "none",
46
+ stroke: "currentColor",
47
+ strokeWidth: "1.5",
48
+ strokeLinecap: "round",
49
+ strokeLinejoin: "round"
50
+ })
51
+ })]
52
+ })
53
+ }),
54
+ /* @__PURE__ */ a(d, {
55
+ className: f.popover,
56
+ "data-weasel-overlay": "",
57
+ ...C,
58
+ children: /* @__PURE__ */ a(c, {
59
+ className: `${i.surface} ${i.list}`,
60
+ onAction: (e) => h(e),
61
+ children: m.map((e) => /* @__PURE__ */ a(l, {
62
+ id: e.value,
63
+ className: f.item,
64
+ isDisabled: e.isDisabled,
65
+ textValue: e.textValue ?? (typeof e.label == "string" ? e.label : void 0),
66
+ children: e.label
67
+ }, e.value))
68
+ })
69
+ })
70
+ ] });
71
+ }
72
+ //#endregion
73
+ export { p as t };
74
+
75
+ //# sourceMappingURL=MenuButton-TAFg88Lp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MenuButton-TAFg88Lp.js","names":["RACButton","f","s","RACPopover","RACMenu","listbox","RACMenuItem","useOverlayPortal","TriggerTooltip","segmentTooltipContent","field_module_default","listbox_module_default","MenuButton_module_default","MenuButton","ariaLabel","portalContainer","MenuTrigger","anchor","isDisabled","Button","className","label","Popover","portalProps","Menu","onAction","key","items","MenuItem","item"],"sources":["../../src/components/MenuButton/MenuButton.module.css","../../src/components/MenuButton/MenuButton.tsx"],"sourcesContent":[".trigger {\n display: inline-flex;\n flex: none;\n align-items: center;\n gap: var(--wzl-space-3);\n padding: 0 var(--wzl-space-3) 0 var(--wzl-space-5);\n white-space: nowrap;\n cursor: pointer;\n}\n\n.label {\n color: var(--wzl-fg-subtle);\n}\n\n.chevron {\n width: 10px;\n height: 10px;\n color: var(--wzl-fg-muted);\n flex: 0 0 auto;\n}\n\n.popover {\n min-width: var(--trigger-width);\n max-height: inherit;\n outline: none;\n}\n\n.item {\n display: flex;\n align-items: center;\n padding: var(--wzl-space-2) var(--wzl-space-4);\n border-radius: var(--wzl-radius-sm);\n cursor: pointer;\n color: var(--wzl-fg);\n white-space: nowrap;\n outline: none;\n}\n\n.item[data-focused] {\n background: var(--wzl-surface-hover);\n}\n\n.item[data-disabled] {\n opacity: 0.4;\n cursor: not-allowed;\n}\n","import type { ReactNode } from 'react';\nimport {\n Button as RACButton,\n Menu as RACMenu,\n MenuItem as RACMenuItem,\n MenuTrigger,\n Popover as RACPopover,\n} from 'react-aria-components';\nimport { useOverlayPortal, type OverlayPortalProps } from '../../overlays/portalHost';\nimport f from '../field.module.css';\nimport listbox from '../listbox.module.css';\nimport s from './MenuButton.module.css';\nimport { TriggerTooltip, segmentTooltipContent, type SegmentTooltipFields } from '../segmentTooltip';\n\n/** One row in a {@link MenuButton}'s list. */\nexport type MenuButtonItem<T extends string = string> = {\n value: T;\n label: ReactNode;\n isDisabled?: boolean;\n /** Plain-text form of `label`, for type-to-select and screen readers. A\n * string label supplies this itself. */\n textValue?: string;\n};\n\n/** Props for {@link MenuButton}. */\nexport type MenuButtonProps<T extends string = string> = {\n /** What the button says. It never changes to show a chosen row. */\n label: ReactNode;\n items: ReadonlyArray<MenuButtonItem<T>>;\n /** Fired with the value of the row chosen. */\n onAction: (value: T) => void;\n isDisabled?: boolean;\n className?: string;\n 'aria-label'?: string;\n} & SegmentTooltipFields & OverlayPortalProps;\n\n/**\n * A button that opens a list and acts on the row chosen — \"Add trial…\",\n * \"Load…\". Unlike a {@link Select} it holds no value, so it sizes to its own\n * label rather than to its widest row.\n *\n * `shortcut` adds a kit tooltip reading `Name (⌘N)`, named by `aria-label` or\n * a string `label`, as `Button` does; `tooltip` replaces that text.\n */\nexport function MenuButton<T extends string = string>({\n label,\n items,\n onAction,\n isDisabled,\n className,\n 'aria-label': ariaLabel,\n portalContainer,\n shortcut,\n tooltip,\n}: MenuButtonProps<T>) {\n const { anchor, portalProps } = useOverlayPortal(portalContainer);\n return (\n <MenuTrigger>\n {anchor}\n <TriggerTooltip\n content={segmentTooltipContent({ tooltip, shortcut, ariaLabel, label })}\n disabled={isDisabled}\n >\n <RACButton\n className={[f.frame, s.trigger, className].filter(Boolean).join(' ')}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n >\n <span className={s.label}>{label}</span>\n <svg className={s.chevron} viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <path d=\"M2 4 L5 7 L8 4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </RACButton>\n </TriggerTooltip>\n {/* `data-weasel-overlay`: see Select — the list renders in a portal,\n outside the subtree the trigger sits in. */}\n <RACPopover className={s.popover} data-weasel-overlay=\"\" {...portalProps}>\n <RACMenu className={`${listbox.surface} ${listbox.list}`} onAction={(key) => onAction(key as T)}>\n {items.map((item) => (\n <RACMenuItem\n key={item.value}\n id={item.value}\n className={s.item}\n isDisabled={item.isDisabled}\n textValue={item.textValue ?? (typeof item.label === 'string' ? item.label : undefined)}\n >\n {item.label}\n </RACMenuItem>\n ))}\n </RACMenu>\n </RACPopover>\n </MenuTrigger>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AC4CA,SAAgBa,EAAsC,EACpD,UACA,UACA,aACA,eACA,cACA,cAAcC,GACd,oBACA,aACA,cACqB;CACrB,IAAM,EAAE,WAAQ,mBAAgBP,EAAiBQ,CAAe;CAChE,OACE,kBAACC,GAAD,EAAA,UAAA;EACGC;EACD,kBAACT,GAAD;GACE,SAASC,EAAsB;IAAE;IAAS;IAAU;IAAW;GAAM,CAAC;GACtE,UAAUS;GAEV,UAAA,kBAAClB,GAAD;IACE,WAAW;KAACC,EAAE;KAAOC,EAAE;KAASkB;IAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;IACvD;IACZ,cAAYN;IAHd,UAAA,CAKE,kBAAC,QAAD;KAAM,WAAWZ,EAAE;KAAQ,UAAAmB;IAAY,CAAA,GACvC,kBAAC,OAAD;KAAK,WAAWnB,EAAE;KAAS,SAAQ;KAAY,eAAY;KACzD,UAAA,kBAAC,QAAD;MAAM,GAAE;MAAiB,MAAK;MAAO,QAAO;MAAe,aAAY;MAAM,eAAc;MAAQ,gBAAe;KAAS,CAAA;IACxH,CAAA,CACI;;EACG,CAAA;EAGhB,kBAACC,GAAD;GAAY,WAAWD,EAAE;GAAS,uBAAoB;GAAG,GAAIqB;GAC3D,UAAA,kBAACnB,GAAD;IAAS,WAAW,GAAGC,EAAQ,QAAQ,GAAGA,EAAQ;IAAQ,WAAW,MAAQoB,EAASC,CAAQ;IAC3F,UAAAC,EAAM,KAAK,MACV,kBAACrB,GAAD;KAEE,IAAIuB,EAAK;KACT,WAAW3B,EAAE;KACb,YAAY2B,EAAK;KACjB,WAAWA,EAAK,cAAc,OAAOA,EAAK,SAAU,WAAWA,EAAK,QAAQ,KAAA;KAE3E,UAAAA,EAAK;IACK,GAPNA,EAAK,KAOC,CACd;GACM,CAAA;EACC,CAAA;CACD,EAAA,CAAA;AAEjB"}
@@ -0,0 +1,199 @@
1
+ import { n as e } from "./handles-CqVANLtu.js";
2
+ import { t } from "./ColorField-BwlelY26.js";
3
+ import { t as n } from "./paintPreview-CuSZiHpR.js";
4
+ import { t as r } from "./ToggleBar-Z2jZiguF.js";
5
+ import { asPaint as i, useHandleDrag as a } from "@weasel-js/core";
6
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
7
+ import { useRef as c } from "react";
8
+ import { isMeshGradientFill as l, meshGuides as u, meshHandles as d, moveMeshHandle as f } from "@weasel-js/core/mesh";
9
+ var p = {
10
+ root: "_root_g12ri_1",
11
+ patch: "_patch_g12ri_7",
12
+ preview: "_preview_g12ri_13",
13
+ corners: "_corners_g12ri_21",
14
+ corner: "_corner_g12ri_21"
15
+ }, m = [
16
+ {
17
+ value: "rgb",
18
+ label: "sRGB"
19
+ },
20
+ {
21
+ value: "oklab",
22
+ label: "OKLab"
23
+ },
24
+ {
25
+ value: "oklch",
26
+ label: "OKLCh"
27
+ }
28
+ ];
29
+ function h(e) {
30
+ let { value: n, onInput: a, onChange: c, spaceSwitch: l = !0, className: u } = e, d = n.interpolate ?? "rgb", f = (e, t, r) => i({
31
+ ...n,
32
+ patches: n.patches.map((n, i) => {
33
+ if (i !== e) return n;
34
+ let [a, o, s, c] = n.colors, l = [
35
+ a,
36
+ o,
37
+ s,
38
+ c
39
+ ];
40
+ return l[t] = r, {
41
+ ...n,
42
+ colors: l
43
+ };
44
+ })
45
+ });
46
+ return /* @__PURE__ */ s("div", {
47
+ className: [p.root, u].filter(Boolean).join(" "),
48
+ children: [n.patches.map((e, r) => /* @__PURE__ */ s("div", {
49
+ className: p.patch,
50
+ children: [/* @__PURE__ */ o("span", {
51
+ className: p.preview,
52
+ "aria-hidden": "true",
53
+ style: { background: g(n, r) }
54
+ }), /* @__PURE__ */ o("div", {
55
+ className: p.corners,
56
+ children: e.colors.map((e, n) => /* @__PURE__ */ o(t, {
57
+ value: e,
58
+ alpha: !0,
59
+ "aria-label": `Patch ${r + 1} corner ${n + 1}`,
60
+ className: p.corner,
61
+ onInput: (e) => a?.(f(r, n, e)),
62
+ onChange: (e) => c(f(r, n, e))
63
+ }, n))
64
+ })]
65
+ }, r)), l && /* @__PURE__ */ o(r, {
66
+ items: m,
67
+ value: d,
68
+ size: "sm",
69
+ ariaLabel: "Blend space",
70
+ onChange: (e) => e && c(i({
71
+ ...n,
72
+ interpolate: e
73
+ }))
74
+ })]
75
+ });
76
+ }
77
+ function g(e, t) {
78
+ return n({
79
+ ...e,
80
+ patches: [e.patches[t]]
81
+ });
82
+ }
83
+ function _(e) {
84
+ return l(e);
85
+ }
86
+ var v = {
87
+ overlay: "_overlay_fgthm_3",
88
+ guide: "_guide_fgthm_13",
89
+ handle: "_handle_fgthm_21",
90
+ control: "_control_fgthm_40",
91
+ edge: "_edge_fgthm_48"
92
+ };
93
+ //#endregion
94
+ //#region src/components/GradientEditor/handleOverlay.tsx
95
+ function y(e) {
96
+ return /* @__PURE__ */ o("svg", {
97
+ className: [v.overlay, e.className].filter(Boolean).join(" "),
98
+ width: e.width,
99
+ height: e.height,
100
+ children: e.children
101
+ });
102
+ }
103
+ function b(e) {
104
+ return /* @__PURE__ */ o("line", {
105
+ className: v.guide,
106
+ ...e
107
+ });
108
+ }
109
+ function x({ points: e }) {
110
+ let [t, n, r, i] = e;
111
+ return /* @__PURE__ */ o("path", {
112
+ className: v.edge,
113
+ d: `M${t.x} ${t.y}C${n.x} ${n.y} ${r.x} ${r.y} ${i.x} ${i.y}`
114
+ });
115
+ }
116
+ function S({ at: e, label: t, radius: n, variant: r = "handle", onDrag: i }) {
117
+ let s = c(e), l = a({
118
+ onStart: () => {
119
+ s.current = e;
120
+ },
121
+ onMove: (e) => {
122
+ i(e, "input");
123
+ },
124
+ onEnd: ({ point: e, moved: t }) => {
125
+ t && i(e, "commit");
126
+ },
127
+ onCancel: () => {
128
+ i(s.current, "input");
129
+ }
130
+ });
131
+ return /* @__PURE__ */ o("circle", {
132
+ className: r === "control" ? `${v.handle} ${v.control}` : v.handle,
133
+ cx: e.x,
134
+ cy: e.y,
135
+ r: n,
136
+ role: "button",
137
+ "aria-label": t,
138
+ tabIndex: 0,
139
+ onKeyDown: (t) => {
140
+ let n = t.shiftKey ? C * 10 : C, r = 0, a = 0;
141
+ if (t.key === "ArrowLeft") r = -n;
142
+ else if (t.key === "ArrowRight") r = n;
143
+ else if (t.key === "ArrowUp") a = -n;
144
+ else if (t.key === "ArrowDown") a = n;
145
+ else return;
146
+ t.preventDefault();
147
+ let o = {
148
+ x: e.x + r,
149
+ y: e.y + a
150
+ };
151
+ i(o, "input"), i(o, "commit");
152
+ },
153
+ ...l
154
+ });
155
+ }
156
+ var C = 1, w = e("--wzl-handle-size-lg"), T = e("--wzl-handle-size");
157
+ function E(e) {
158
+ let { value: t, toScreen: n, toLocal: r, onInput: a, onChange: c, width: l, height: p, className: m } = e, { edges: h, arms: g } = u(t), _ = d(t), v = (e, n, o) => {
159
+ let s = i(f(t, e, r(n)));
160
+ o === "input" ? a?.(s) : c(s);
161
+ }, C = [..._.filter((e) => e.kind !== "corner"), ..._.filter((e) => e.kind === "corner")];
162
+ return /* @__PURE__ */ s(y, {
163
+ width: l,
164
+ height: p,
165
+ className: m,
166
+ children: [
167
+ h.map((e, t) => /* @__PURE__ */ o(x, { points: [
168
+ n(e[0]),
169
+ n(e[1]),
170
+ n(e[2]),
171
+ n(e[3])
172
+ ] }, `e${t}`)),
173
+ g.map(([e, t], r) => {
174
+ let i = n(e), a = n(t);
175
+ return /* @__PURE__ */ o(b, {
176
+ x1: i.x,
177
+ y1: i.y,
178
+ x2: a.x,
179
+ y2: a.y
180
+ }, `a${r}`);
181
+ }),
182
+ C.map((e) => /* @__PURE__ */ o(S, {
183
+ at: n(e.at),
184
+ label: D(e),
185
+ radius: e.kind === "corner" ? w : T,
186
+ variant: e.kind === "corner" ? "handle" : "control",
187
+ onDrag: (t, n) => v(e, t, n)
188
+ }, e.id))
189
+ ]
190
+ });
191
+ }
192
+ function D(e) {
193
+ let { patch: t, index: n } = e.refs[0], r = `Patch ${t + 1}`;
194
+ return e.kind === "corner" ? `${r} corner ${n / 3 + 1}` : e.kind === "interior" ? `${r} interior ${n - 11}` : `${r} edge ${Math.floor(n / 3) + 1} control ${n % 3}`;
195
+ }
196
+ //#endregion
197
+ export { v as a, y as i, S as n, h as o, b as r, _ as s, E as t };
198
+
199
+ //# sourceMappingURL=MeshEditor-DWpvg8H6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MeshEditor-DWpvg8H6.js","names":["s","s","handleHalf","paintPreviewCss","ToggleBar","MeshEditor_module_default","SPACES","MeshEditor","props","space","value","withCorner","asPaint","patchIndex","patch","b","c","d","next","corner","color","className","previewOf","ColorField","onInput","onChange","spaceSwitch","isMeshPaint","isMeshGradientFill","fill","handleOverlay_module_default","HandleOverlay","Guide","Edge","a","points","DragPoint","start","useRef","at","drag","useHandleDrag","p","moved","onDrag","point","variant","radius","label","amount","e","KEY_STEP","dx","dy","CORNER_RADIUS","CONTROL_RADIUS","MeshHandles","meshGuides","handles","meshHandles","emit","moveMeshHandle","handle","toLocal","phase","ordered","h","edges","toScreen","edge","i","arms","from","to","labelOf","prefix","index"],"sources":["../../src/components/MeshEditor/MeshEditor.module.css","../../src/components/MeshEditor/MeshEditor.tsx","../../src/components/GradientEditor/handleOverlay.module.css","../../src/components/GradientEditor/handleOverlay.tsx","../../src/components/MeshEditor/MeshHandles.tsx"],"sourcesContent":[".root {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-4);\n}\n\n.patch {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-4);\n}\n\n.preview {\n inline-size: 34px;\n block-size: 34px;\n flex: 0 0 auto;\n border-radius: var(--wzl-radius-sm);\n box-shadow: inset 0 0 0 1px var(--wzl-border);\n}\n\n.corners {\n display: grid;\n grid-template-columns: repeat(2, auto);\n gap: var(--wzl-space-2) var(--wzl-space-3);\n min-inline-size: 0;\n}\n\n.corner {\n min-inline-size: 0;\n}\n","import { type ReactElement } from 'react';\nimport { asPaint, type ColorSpace, type FillStyle } from '@weasel-js/core';\nimport { isMeshGradientFill, type MeshGradientFill } from '@weasel-js/core/mesh';\nimport { ColorField } from '../ColorField';\nimport { ToggleBar, type ToggleBarItem } from '../ToggleBar';\nimport { paintPreviewCss } from '../../paintPreview';\nimport s from './MeshEditor.module.css';\n\nconst SPACES: readonly ToggleBarItem<ColorSpace>[] = [\n { value: 'rgb', label: 'sRGB' },\n { value: 'oklab', label: 'OKLab' },\n { value: 'oklch', label: 'OKLCh' },\n];\n\n/** Props for {@link MeshEditor}. `onInput` fires throughout a gesture and\n * `onChange` once at its end. */\nexport interface MeshEditorProps {\n value: MeshGradientFill;\n /** Emitted as a `FillStyle`, which is what every paint control passes\n * around — `FillStyle`'s discriminant stays closed over the built-in\n * members, so a registered kind's own shape only travels through it. */\n onInput?: (next: FillStyle) => void;\n onChange: (next: FillStyle) => void;\n /** Show the sRGB / OKLab / OKLCh switch. Default true. */\n spaceSwitch?: boolean;\n className?: string;\n}\n\n/**\n * Editor for a mesh gradient's colors.\n *\n * Geometry is absent for the same reason it is absent from `GradientEditor`:\n * a patch's twelve control points are a thing to drag on the artwork\n * (`MeshHandles`), not a column of numbers in a panel. What is left is what a panel is good at — the\n * color at each corner, and the space the four of them blend through.\n *\n * Corners are numbered in the patch's own walk order, which is the order the\n * paint stores them in, so a corner's number is stable while it is dragged.\n */\nexport function MeshEditor(props: MeshEditorProps): ReactElement {\n const { value, onInput, onChange, spaceSwitch = true, className } = props;\n const space = value.interpolate ?? 'rgb';\n\n const withCorner = (patchIndex: number, corner: number, color: string): FillStyle => asPaint({\n ...value,\n patches: value.patches.map((patch, i) => {\n if (i !== patchIndex) return patch;\n const [a, b, c, d] = patch.colors;\n const next: [string, string, string, string] = [a, b, c, d];\n next[corner] = color;\n return { ...patch, colors: next };\n }),\n });\n\n return (\n <div className={[s.root, className].filter(Boolean).join(' ')}>\n {value.patches.map((patch, patchIndex) => (\n // A patch has no id; its position in the list is its identity, the way\n // a gradient stop's is.\n <div key={patchIndex} className={s.patch}>\n <span\n className={s.preview}\n aria-hidden=\"true\"\n style={{ background: previewOf(value, patchIndex) }}\n />\n <div className={s.corners}>\n {patch.colors.map((color, corner) => (\n <ColorField\n key={corner}\n value={color}\n alpha\n aria-label={`Patch ${patchIndex + 1} corner ${corner + 1}`}\n className={s.corner}\n onInput={(next) => onInput?.(withCorner(patchIndex, corner, next))}\n onChange={(next) => onChange(withCorner(patchIndex, corner, next))}\n />\n ))}\n </div>\n </div>\n ))}\n\n {spaceSwitch && (\n <ToggleBar<ColorSpace>\n items={SPACES}\n value={space}\n size=\"sm\"\n ariaLabel=\"Blend space\"\n onChange={(next) => next && onChange(asPaint({ ...value, interpolate: next }))}\n />\n )}\n </div>\n );\n}\n\n/** One patch as a swatch: the paint with the other patches taken out, so a\n * multi-patch mesh shows which row belongs to which part of it. */\nfunction previewOf(value: MeshGradientFill, patchIndex: number): string | undefined {\n return paintPreviewCss(\n { ...value, patches: [value.patches[patchIndex]] } as unknown as FillStyle,\n );\n}\n\n/** Narrowing for a consumer rendering this behind a kind switch. */\nexport function isMeshPaint(fill: FillStyle | null | undefined): fill is FillStyle & MeshGradientFill {\n return isMeshGradientFill(fill);\n}\n","/* The overlay covers the canvas but must not intercept tool input; only the\n * handles opt back into hit-testing. */\n.overlay {\n position: absolute;\n inset: 0;\n pointer-events: none;\n}\n\n/* These sit over artwork of unknown color, not over the app's own surface,\n * so they are deliberately not themed: a themed handle disappears against\n * whatever the user painted underneath. White-on-dark reads on anything,\n * which is why every editor draws handles this way. */\n.guide {\n fill: none;\n stroke: #ffffff;\n stroke-opacity: 0.7;\n stroke-dasharray: 4 4;\n paint-order: stroke;\n}\n\n.handle {\n fill: #ffffff;\n stroke: #222222;\n stroke-width: 2;\n cursor: grab;\n pointer-events: auto;\n}\n\n.handle:active {\n cursor: grabbing;\n}\n\n.handle:focus-visible {\n outline: 2px solid var(--wzl-accent);\n outline-offset: 2px;\n}\n\n/* A point that shapes an edge rather than ending one — drawn dark-on-light,\n * the inverse of the handle it hangs off, so the two read apart at a glance. */\n.control {\n fill: #222222;\n stroke: #ffffff;\n stroke-width: 1.5;\n}\n\n/* A patch edge: the outline the handles reshape, solid so it reads as the\n * artwork's structure rather than as a construction line. */\n.edge {\n fill: none;\n stroke: #ffffff;\n stroke-opacity: 0.85;\n stroke-width: 1;\n}\n","import { useRef, type KeyboardEvent as ReactKeyboardEvent, type ReactElement, type ReactNode } from 'react';\nimport { useHandleDrag } from '@weasel-js/core';\nimport s from './handleOverlay.module.css';\n\n/** The pieces every paint-geometry overlay draws with — `GradientHandles`\n * and `MeshHandles` — kept here so the two drag, step and look alike. */\n\nexport interface OverlayPoint {\n x: number;\n y: number;\n}\n\n/** Which half of a gesture an edit belongs to: a live preview, or the one\n * write that ends it. */\nexport type EditPhase = 'input' | 'commit';\n\n/** The SVG overlay itself: covers its container, passes pointer input\n * through everywhere but the handles. */\nexport function HandleOverlay(props: {\n width: number;\n height: number;\n className?: string;\n children: ReactNode;\n}): ReactElement {\n return (\n <svg\n className={[s.overlay, props.className].filter(Boolean).join(' ')}\n width={props.width}\n height={props.height}\n >\n {props.children}\n </svg>\n );\n}\n\nexport function Guide(props: { x1: number; y1: number; x2: number; y2: number }): ReactElement {\n return <line className={s.guide} {...props} />;\n}\n\n/** A cubic Bézier edge through four overlay-space points. */\nexport function Edge({ points }: { points: readonly [OverlayPoint, OverlayPoint, OverlayPoint, OverlayPoint] }): ReactElement {\n const [a, b, c, d] = points;\n return <path className={s.edge} d={`M${a.x} ${a.y}C${b.x} ${b.y} ${c.x} ${c.y} ${d.x} ${d.y}`} />;\n}\n\n/**\n * One draggable point. `onDrag` receives overlay pixels; a press that never\n * moved writes nothing, and a canceled gesture puts the preview back.\n */\nexport function DragPoint({\n at,\n label,\n radius,\n variant = 'handle',\n onDrag,\n}: {\n at: OverlayPoint;\n label: string;\n radius: number;\n /** `control` draws the inverted style a secondary point wears. */\n variant?: 'handle' | 'control';\n onDrag: (p: OverlayPoint, phase: EditPhase) => void;\n}): ReactElement {\n const start = useRef<OverlayPoint>(at);\n const drag = useHandleDrag<SVGCircleElement>({\n onStart: () => { start.current = at; },\n onMove: (p) => { onDrag(p, 'input'); },\n onEnd: ({ point, moved }) => {\n if (moved) onDrag(point, 'commit');\n },\n onCancel: () => { onDrag(start.current, 'input'); },\n });\n const onKeyDown = (e: ReactKeyboardEvent<SVGCircleElement>): void => {\n const amount = e.shiftKey ? KEY_STEP * 10 : KEY_STEP;\n let dx = 0;\n let dy = 0;\n if (e.key === 'ArrowLeft') dx = -amount;\n else if (e.key === 'ArrowRight') dx = amount;\n else if (e.key === 'ArrowUp') dy = -amount;\n else if (e.key === 'ArrowDown') dy = amount;\n else return;\n e.preventDefault();\n const next = { x: at.x + dx, y: at.y + dy };\n onDrag(next, 'input');\n onDrag(next, 'commit');\n };\n return (\n <circle\n className={variant === 'control' ? `${s.handle} ${s.control}` : s.handle}\n cx={at.x}\n cy={at.y}\n r={radius}\n // Not `slider`: the handle carries a 2-D position, not one value, so\n // it has no `aria-valuenow` to honor the role's contract with.\n role=\"button\"\n aria-label={label}\n tabIndex={0}\n onKeyDown={onKeyDown}\n {...drag}\n />\n );\n}\n\n/** One arrow-key step, in overlay pixels. */\nconst KEY_STEP = 1;\n","import { type ReactElement } from 'react';\nimport { asPaint, type FillStyle } from '@weasel-js/core';\nimport {\n meshGuides,\n meshHandles,\n moveMeshHandle,\n type MeshGradientFill,\n type MeshHandle,\n} from '@weasel-js/core/mesh';\nimport { handleHalf } from '../../handles';\nimport {\n DragPoint,\n Edge,\n Guide,\n HandleOverlay,\n type EditPhase,\n type OverlayPoint as Point,\n} from '../GradientEditor/handleOverlay';\n\n/** Props for {@link MeshHandles}. `onInput` fires throughout a drag and\n * `onChange` once at its end. */\nexport interface MeshHandlesProps {\n /** The mesh whose points these handles move, in the space `toScreen`\n * maps from. A `units: 'bounds'` mesh is resolved first with\n * `fillInPoseFrame(fill, box)`, and edits converted back with\n * `fillToBoundsFrame(next, box)`. */\n value: MeshGradientFill;\n /** Mesh space → overlay pixels. */\n toScreen: (p: Point) => Point;\n /** Overlay pixels → mesh space. Must invert `toScreen`. */\n toLocal: (p: Point) => Point;\n /** Live during a drag — wire for preview, do not write to history. Emitted\n * as a `FillStyle`, which is what every paint control passes around. */\n onInput?: (next: FillStyle) => void;\n /** Committed at drag end: one call per gesture. */\n onChange: (next: FillStyle) => void;\n /** Overlay size in CSS pixels. */\n width: number;\n height: number;\n className?: string;\n}\n\nconst CORNER_RADIUS = handleHalf('--wzl-handle-size-lg');\nconst CONTROL_RADIUS = handleHalf('--wzl-handle-size');\n\n/**\n * Direct-manipulation handles for a mesh gradient's geometry, drawn as an\n * SVG overlay: every patch corner, the two controls of each edge, and a\n * tensor patch's interior points, over the patch outlines they shape.\n *\n * Dragging a corner carries its controls with it. Points two patches share\n * are one handle, so a drag moves the seam instead of tearing it.\n *\n * The overlay ignores pointer events except on the handles themselves.\n */\nexport function MeshHandles(props: MeshHandlesProps): ReactElement {\n const { value, toScreen, toLocal, onInput, onChange, width, height, className } = props;\n const { edges, arms } = meshGuides(value);\n const handles = meshHandles(value);\n\n const emit = (handle: MeshHandle, p: Point, phase: EditPhase): void => {\n const next = asPaint(moveMeshHandle(value, handle, toLocal(p)));\n if (phase === 'input') onInput?.(next);\n else onChange(next);\n };\n\n // Corners last, so where a control collapses onto its corner the corner\n // is the one on top.\n const ordered = [\n ...handles.filter((h) => h.kind !== 'corner'),\n ...handles.filter((h) => h.kind === 'corner'),\n ];\n\n return (\n <HandleOverlay width={width} height={height} className={className}>\n {edges.map((edge, i) => (\n // Guides have no identity beyond their place in the walk.\n <Edge key={`e${i}`} points={[toScreen(edge[0]), toScreen(edge[1]), toScreen(edge[2]), toScreen(edge[3])]} />\n ))}\n {arms.map(([from, to], i) => {\n const a = toScreen(from);\n const b = toScreen(to);\n return <Guide key={`a${i}`} x1={a.x} y1={a.y} x2={b.x} y2={b.y} />;\n })}\n {ordered.map((handle) => (\n <DragPoint\n key={handle.id}\n at={toScreen(handle.at)}\n label={labelOf(handle)}\n radius={handle.kind === 'corner' ? CORNER_RADIUS : CONTROL_RADIUS}\n variant={handle.kind === 'corner' ? 'handle' : 'control'}\n onDrag={(p, phase) => emit(handle, p, phase)}\n />\n ))}\n </HandleOverlay>\n );\n}\n\n/** Numbered in the patch's own walk, matching `MeshEditor`'s corner fields. */\nfunction labelOf(handle: MeshHandle): string {\n const { patch, index } = handle.refs[0];\n const prefix = `Patch ${patch + 1}`;\n if (handle.kind === 'corner') return `${prefix} corner ${index / 3 + 1}`;\n if (handle.kind === 'interior') return `${prefix} interior ${index - 11}`;\n return `${prefix} edge ${Math.floor(index / 3) + 1} control ${index % 3}`;\n}\n"],"mappings":"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"}
@@ -1,37 +1,36 @@
1
- import { n as e } from "./Field--onYxXTF.js";
1
+ import { t as e } from "./field.module-B27pWv0i.js";
2
2
  import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
3
  import { forwardRef as r, useEffect as i, useRef as a, useState as o } from "react";
4
4
  import { Button as s, FieldError as c, Group as l, Input as u, Label as d, NumberField as f, Text as p } from "react-aria-components";
5
5
  import { decimal as m, parseAs as h, parseNumber as g, qty as _ } from "@weasel-js/quantity";
6
6
  var v = {
7
- field: "_field_hpkvf_1",
8
- row: "_row_hpkvf_12",
9
- label: "_label_hpkvf_19",
10
- fit: "_fit_hpkvf_20",
11
- frame: "_frame_hpkvf_20",
12
- below: "_below_hpkvf_22",
13
- steppers: "_steppers_hpkvf_72",
14
- stepper: "_stepper_hpkvf_72",
15
- ghost: "_ghost_hpkvf_122"
7
+ frame: "_frame_2zacd_1 _numeric_zns9n_4",
8
+ steppers: "_steppers_2zacd_20",
9
+ stepper: "_stepper_2zacd_20",
10
+ ghost: "_ghost_2zacd_70",
11
+ fit: "_fit_2zacd_93"
16
12
  }, y = r(function(r, i) {
17
13
  let { label: a, orientation: o = "stacked", description: m, errorMessage: h, hideSteppers: g, ghost: _, placeholder: y, width: b = "fill", className: x, ...S } = r;
18
14
  return /* @__PURE__ */ n(f, {
19
15
  ...S,
20
16
  className: [
21
- v.field,
22
- b === "fit" && v.fit,
23
- e.root,
17
+ e.field,
18
+ e.control,
19
+ b === "fit" && `${e.fit} ${v.fit}`,
24
20
  o === "row" && e.row,
25
- o === "row" && v.row,
26
21
  x
27
22
  ].filter(Boolean).join(" "),
28
23
  children: [
29
24
  a !== void 0 && /* @__PURE__ */ t(d, {
30
- className: `${e.label} ${v.label}`,
25
+ className: e.label,
31
26
  children: a
32
27
  }),
33
28
  /* @__PURE__ */ n(l, {
34
- className: _ ? `${v.frame} ${v.ghost}` : v.frame,
29
+ className: [
30
+ e.frame,
31
+ v.frame,
32
+ _ && v.ghost
33
+ ].filter(Boolean).join(" "),
35
34
  children: [/* @__PURE__ */ t(u, {
36
35
  ref: i,
37
36
  placeholder: y
@@ -52,11 +51,11 @@ var v = {
52
51
  }),
53
52
  m !== void 0 && /* @__PURE__ */ t(p, {
54
53
  slot: "description",
55
- className: `${e.hint} ${v.below}`,
54
+ className: `${e.hint} ${e.below}`,
56
55
  children: m
57
56
  }),
58
57
  /* @__PURE__ */ t(c, {
59
- className: `${e.error} ${v.below}`,
58
+ className: `${e.error} ${e.below}`,
60
59
  children: h
61
60
  })
62
61
  ]
@@ -150,13 +149,17 @@ function E({ value: r, onChange: s, onInput: c, minValue: l, maxValue: u, step:
150
149
  });
151
150
  return /* @__PURE__ */ t("div", {
152
151
  className: [
153
- v.field,
154
- E === "fit" && v.fit,
155
- e.root,
152
+ e.field,
153
+ e.control,
154
+ E === "fit" && `${e.fit} ${v.fit}`,
156
155
  D
157
156
  ].filter(Boolean).join(" "),
158
157
  children: /* @__PURE__ */ n("div", {
159
- className: x ? `${v.frame} ${v.ghost}` : v.frame,
158
+ className: [
159
+ e.frame,
160
+ v.frame,
161
+ x && v.ghost
162
+ ].filter(Boolean).join(" "),
160
163
  children: [/* @__PURE__ */ t("input", {
161
164
  ref: N,
162
165
  id: O,
@@ -203,4 +206,4 @@ function E({ value: r, onChange: s, onInput: c, minValue: l, maxValue: u, step:
203
206
  //#endregion
204
207
  export { S as n, y as r, E as t };
205
208
 
206
- //# sourceMappingURL=NumberField-BnJxcazc.js.map
209
+ //# sourceMappingURL=NumberField-DS0WSiin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NumberField-DS0WSiin.js","names":["NumberField","RACNumberField","f","s","RACInput","RACButton","s","f","field_module_default","NumberField_module_default","NumberField$1","forwardRef","rest","props","NumberField","width","orientation","className","label","Label","Group","ghost","Input","hideSteppers","Button","description","Text","FieldError","errorMessage","clampToBounds","max","min","n","placesOf","text","e","dot","spinKey","by","places","from","bounds","key","FULL_PRECISION","decimal","REPEAT_DELAY_MS","REPEAT_EVERY_MS","UnitField","ariaLabel","draft","setDraft","useState","canceled","useRef","input","known","value","qty","display","read","accepts","parseNumber","typed","parseAs","minValue","maxValue","stepTo","onInput","next","onChange","spin","latestSpin","useEffect","el","onWheel","repeat","stopRepeat","startRepeat","tick","delay","stepper","atBound","glyph","steppers"],"sources":["../../src/components/NumberField/NumberField.module.css","../../src/components/NumberField/NumberField.tsx","../../src/components/spin.ts","../../src/components/NumberField/UnitField.tsx"],"sourcesContent":[".frame {\n composes: numeric from '@weasel-js/theme/numeric.module.css';\n display: flex;\n align-items: stretch;\n overflow: hidden;\n}\n\n.frame input {\n padding: 0 var(--wzl-field-pad-x);\n text-align: right;\n -moz-appearance: textfield;\n}\n\n.frame input::-webkit-outer-spin-button,\n.frame input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\n.steppers {\n display: flex;\n flex-direction: column;\n border-left: 1px solid var(--wzl-border);\n}\n\n.stepper {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wzl-control-h-xs);\n flex: 1;\n /* The two share the frame's height; left to their glyphs' line boxes they\n overflow it, and the frame clips the lower one. */\n min-height: 0;\n height: auto;\n overflow: hidden;\n background: transparent;\n border: none;\n color: var(--wzl-fg-muted);\n cursor: pointer;\n padding: 0;\n font: inherit;\n font-size: min(var(--wzl-font-size-2xs), calc(var(--wzl-field-h, var(--wzl-control-h)) * 0.35));\n line-height: 1;\n}\n\n.stepper:not(:last-child) {\n border-bottom: 1px solid var(--wzl-border);\n}\n\n.stepper[data-hovered]:not([data-disabled]),\n.stepper:hover:not(:disabled):not([data-rac]) {\n background: var(--wzl-surface-hover);\n color: var(--wzl-fg);\n}\n\n.stepper[data-pressed]:not([data-disabled]),\n.stepper:active:not(:disabled):not([data-rac]) {\n background: var(--wzl-surface-pressed);\n}\n\n.stepper[data-disabled],\n.stepper:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n/* Mirrors the property rows' editable readout (`.readoutInput`), so a number\n sitting inside other chrome does not draw a second box around itself. */\n.ghost {\n --_frame-h: auto;\n --_frame-bg: transparent;\n --_frame-border: 1px solid transparent;\n --_frame-fg: var(--wzl-accent-fg);\n --_frame-focus-shadow: none;\n font-weight: var(--wzl-font-weight-medium);\n}\n\n.ghost input {\n padding: 1px 0;\n}\n\n.ghost:hover {\n background: color-mix(in srgb, currentColor 8%, transparent);\n}\n\n.ghost:focus-within {\n background: var(--wzl-surface-sunken);\n}\n\n/* `width='fit'` states the field's width in characters: left alone an `<input>`\n asks for its 20-character intrinsic width, wider than most rows it sits in. */\n.fit .frame {\n width: fit-content;\n max-width: 100%;\n}\n\n.fit .frame input {\n flex: 0 0 auto;\n width: var(--wzl-number-field-width, 9ch);\n}\n","import { forwardRef, type ReactNode, type Ref } from 'react';\nimport {\n NumberField as RACNumberField,\n Label,\n Input as RACInput,\n Group,\n Button as RACButton,\n Text,\n FieldError,\n type NumberFieldProps as RACNumberFieldProps,\n type ValidationResult,\n} from 'react-aria-components';\nimport type { FieldOrientation } from '../Field/Field';\nimport f from '../field.module.css';\nimport s from './NumberField.module.css';\n\n/** Props for {@link NumberField}, on top of React Aria's `NumberField` props. */\nexport type NumberFieldProps = Omit<RACNumberFieldProps, 'children' | 'className'> & {\n label?: ReactNode;\n /**\n * `'stacked'` (the default) puts the label above the field; `'row'` sets it\n * beside the field at its own width, with any description or error on a\n * line below. Same vocabulary as {@link Field}'s `orientation`.\n */\n orientation?: FieldOrientation;\n description?: ReactNode;\n errorMessage?: ReactNode | ((v: ValidationResult) => ReactNode);\n /** Hide the up/down stepper buttons. Defaults to false. */\n hideSteppers?: boolean;\n /** Render with no box until focused — the readout treatment the property\n * rows use, for a value that sits inside other chrome rather than in a form. */\n ghost?: boolean;\n /** Native input placeholder — e.g. `'Mixed'` for a multi-selection\n * editor with no shared value. */\n placeholder?: string;\n /**\n * `'fill'` (the default) takes the width of whatever row the field sits in.\n * `'fit'` sizes it to `--wzl-number-field-width` (`9ch` by default) plus its\n * own chrome, rather than to the input's 20-character intrinsic width.\n */\n width?: 'fill' | 'fit';\n className?: string;\n};\n\n/**\n * Numeric input with stepper buttons, wrapping React Aria's NumberField and\n * supplying the same label / description / errorMessage slots as `Input`.\n * Arrow keys and scroll step the value; parsing and formatting are React\n * Aria's.\n *\n * `ref` forwards to the underlying `<input>`.\n */\nexport const NumberField = forwardRef(function NumberField(\n props: NumberFieldProps,\n ref: Ref<HTMLInputElement>,\n) {\n const {\n label,\n orientation = 'stacked',\n description,\n errorMessage,\n hideSteppers,\n ghost,\n placeholder,\n width = 'fill',\n className,\n ...rest\n } = props;\n return (\n <RACNumberField\n {...rest}\n className={[\n f.field,\n f.control,\n width === 'fit' && `${f.fit} ${s.fit}`,\n orientation === 'row' && f.row,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {label !== undefined && <Label className={f.label}>{label}</Label>}\n <Group className={[f.frame, s.frame, ghost && s.ghost].filter(Boolean).join(' ')}>\n <RACInput ref={ref} placeholder={placeholder} />\n {!hideSteppers && (\n <div className={s.steppers}>\n <RACButton slot=\"increment\" className={s.stepper} aria-label=\"Increment\">▲</RACButton>\n <RACButton slot=\"decrement\" className={s.stepper} aria-label=\"Decrement\">▼</RACButton>\n </div>\n )}\n </Group>\n {description !== undefined && (\n <Text slot=\"description\" className={`${f.hint} ${f.below}`}>\n {description}\n </Text>\n )}\n <FieldError className={`${f.error} ${f.below}`}>{errorMessage}</FieldError>\n </RACNumberField>\n );\n});\n","/** The bounds a spin key moves a value within. */\nexport interface SpinBounds {\n step: number;\n min?: number;\n max?: number;\n}\n\n/** `n` held within the bounds. */\nexport function clampToBounds(n: number, { min, max }: SpinBounds): number {\n return Math.min(max ?? Infinity, Math.max(min ?? -Infinity, n));\n}\n\n/** Decimal places `n` is written with, up to ten. */\nfunction placesOf(n: number): number {\n if (!Number.isFinite(n)) return 0;\n const text = String(n);\n const e = text.indexOf('e-');\n if (e >= 0) return Math.min(10, Number(text.slice(e + 2)));\n const dot = text.indexOf('.');\n return dot < 0 ? 0 : Math.min(10, text.length - dot - 1);\n}\n\n/**\n * The value a spin-button key moves `from` to, or `null` for a key that does\n * not spin: the arrows by a step, Page Up and Page Down by ten, and Home and\n * End to a bound, where there is one. A sum of steps is rounded to the places\n * its operands carry, so `0.1 + 0.2` lands on `0.3`.\n */\nexport function spinKey(key: string, from: number, bounds: SpinBounds): number | null {\n const by = (n: number) => {\n const places = Math.max(placesOf(from), placesOf(bounds.step));\n return clampToBounds(Number((from + n * bounds.step).toFixed(places)), bounds);\n };\n switch (key) {\n case 'ArrowUp':\n return by(1);\n case 'ArrowDown':\n return by(-1);\n case 'PageUp':\n return by(10);\n case 'PageDown':\n return by(-10);\n case 'Home':\n return bounds.min ?? null;\n case 'End':\n return bounds.max ?? null;\n default:\n return null;\n }\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { decimal, parseAs, parseNumber, qty, type Display, type UnitTable } from '@weasel-js/quantity';\nimport { clampToBounds, spinKey } from '../spin';\nimport f from '../field.module.css';\nimport s from './NumberField.module.css';\n\n/** Props for {@link UnitField}. */\nexport interface UnitFieldProps {\n /** The value in the unit the field shows. NaN shows an empty field. */\n value: number;\n /** The committed value, read and clamped, in the unit the field shows: on\n * blur or Enter, and on every step. */\n onChange: (value: number) => void;\n /** The live value: every keystroke that reads as a number, and every step. */\n onInput?: (value: number) => void;\n minValue?: number;\n maxValue?: number;\n /** What an arrow key, a stepper or a wheel notch adds or takes away; Page Up\n * and Page Down move ten. Defaults to 1. */\n step?: number;\n /** Units a person may type, each mapped to the factor that turns a number\n * in it into the unit the field shows: `{ mm: 0.1, cm: 1 }`. */\n accepts?: Readonly<UnitTable>;\n /** How the value shows, is spoken, and reads back when typed: `fraction()`\n * shows `1/12` and reads `1/12` typed. `accepts`, when given, does the\n * reading instead. Default: the number with every decimal it has. */\n display?: Display;\n placeholder?: string;\n /** Up and down buttons beside the value, which repeat while held. */\n steppers?: boolean;\n /** Render with no box until focused, as {@link NumberField}'s `ghost` does. */\n ghost?: boolean;\n /** As {@link NumberField}'s `width`. */\n width?: 'fill' | 'fit';\n className?: string;\n /** Id for the input, for a `<label htmlFor>` outside it. */\n id?: string;\n 'aria-label'?: string;\n}\n\nconst FULL_PRECISION = decimal({ maxPlaces: 20, grouping: false });\n\nconst REPEAT_DELAY_MS = 400;\nconst REPEAT_EVERY_MS = 60;\n\n/**\n * A number typed as text, so it can carry a unit: `12mm` in a field showing\n * centimeters commits `1.2`. Commits on blur or Enter, reverts on Escape or on\n * text it cannot read, and clamps to its bounds. Steps like a spin button —\n * arrows, Page Up and Down, Home and End to a bound, the wheel while focused,\n * and optional steppers. React Aria's `NumberField` refuses letters as they\n * are typed, which is why this is not that.\n */\nexport function UnitField({\n value,\n onChange,\n onInput,\n minValue,\n maxValue,\n step = 1,\n accepts,\n display = FULL_PRECISION,\n placeholder,\n steppers,\n ghost,\n width = 'fill',\n className,\n id,\n 'aria-label': ariaLabel,\n}: UnitFieldProps) {\n const [draft, setDraft] = useState<string | null>(null);\n const canceled = useRef(false);\n const input = useRef<HTMLInputElement>(null);\n const known = Number.isFinite(value);\n const text = known ? qty(value, display).text : '';\n const read = (typed: string) => (accepts ? parseNumber(typed, accepts) : parseAs(typed, display));\n const bounds = { step, min: minValue, max: maxValue };\n\n // What a step starts from: the text as typed where it reads, else the value.\n const from = (): number => {\n const typed = draft === null ? value : read(draft);\n return Number.isFinite(typed) ? typed : Number.isFinite(value) ? value : 0;\n };\n const stepTo = (next: number) => {\n setDraft(null);\n onInput?.(next);\n if (next !== value) onChange(next);\n };\n const spin = (key: string): boolean => {\n const next = spinKey(key, from(), bounds);\n if (next === null) return false;\n stepTo(next);\n return true;\n };\n\n // The latest `spin`, for the listeners below, which outlive a render.\n const latestSpin = useRef(spin);\n useEffect(() => {\n latestSpin.current = spin;\n });\n\n // The wheel steps only a focused field, so scrolling past one changes nothing.\n // Not passive, so it can keep the page from scrolling under it.\n useEffect(() => {\n const el = input.current;\n if (!el) return;\n const onWheel = (e: WheelEvent) => {\n if (document.activeElement !== el || e.deltaY === 0) return;\n e.preventDefault();\n latestSpin.current(e.deltaY < 0 ? 'ArrowUp' : 'ArrowDown');\n };\n el.addEventListener('wheel', onWheel, { passive: false });\n return () => el.removeEventListener('wheel', onWheel);\n }, []);\n\n const repeat = useRef<ReturnType<typeof setTimeout> | null>(null);\n const stopRepeat = () => {\n if (repeat.current !== null) clearTimeout(repeat.current);\n repeat.current = null;\n };\n useEffect(() => stopRepeat, []);\n const startRepeat = (key: 'ArrowUp' | 'ArrowDown') => {\n stopRepeat();\n latestSpin.current(key);\n const tick = (delay: number) => {\n repeat.current = setTimeout(() => {\n latestSpin.current(key);\n tick(REPEAT_EVERY_MS);\n }, delay);\n };\n tick(REPEAT_DELAY_MS);\n };\n const stepper = (key: 'ArrowUp' | 'ArrowDown', label: string, glyph: string, atBound: boolean) => (\n <button\n type=\"button\"\n className={s.stepper}\n aria-label={label}\n tabIndex={-1}\n disabled={atBound}\n // Keeps focus in the input, where a press on the button would take it.\n onPointerDown={(e) => {\n e.preventDefault();\n startRepeat(key);\n }}\n onPointerUp={stopRepeat}\n onPointerLeave={stopRepeat}\n onPointerCancel={stopRepeat}\n // A click with no pointer down before it — assistive tech, or a test.\n onClick={(e) => {\n if (e.detail === 0) latestSpin.current(key);\n }}\n >\n {glyph}\n </button>\n );\n\n return (\n <div\n className={[f.field, f.control, width === 'fit' && `${f.fit} ${s.fit}`, className]\n .filter(Boolean)\n .join(' ')}\n >\n <div className={[f.frame, s.frame, ghost && s.ghost].filter(Boolean).join(' ')}>\n <input\n ref={input}\n id={id}\n type=\"text\"\n role=\"spinbutton\"\n inputMode=\"decimal\"\n autoComplete=\"off\"\n aria-label={ariaLabel}\n aria-valuenow={known ? value : undefined}\n aria-valuetext={known ? qty(value, display).spoken : undefined}\n aria-valuemin={minValue}\n aria-valuemax={maxValue}\n placeholder={placeholder}\n value={draft ?? text}\n onChange={(e) => {\n const typed = e.target.value;\n setDraft(typed);\n const n = read(typed);\n if (onInput && typed.trim() !== '' && Number.isFinite(n)) onInput(clampToBounds(n, bounds));\n }}\n onFocus={() => {\n canceled.current = false;\n }}\n onBlur={() => {\n if (draft !== null && !canceled.current) {\n const n = read(draft);\n if (Number.isFinite(n)) {\n const next = clampToBounds(n, bounds);\n if (next !== value) onChange(next);\n }\n }\n setDraft(null);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.currentTarget.blur();\n } else if (e.key === 'Escape') {\n canceled.current = true;\n e.currentTarget.blur();\n } else if (spin(e.key)) {\n e.preventDefault();\n }\n }}\n />\n {steppers && (\n <div className={s.steppers}>\n {stepper('ArrowUp', 'Increment', '▲', known && maxValue !== undefined && value >= maxValue)}\n {stepper('ArrowDown', 'Decrement', '▼', known && minValue !== undefined && value <= minValue)}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { t as e } from "./useRovingTabIndex-Bp_hYm_h.js";
2
- import { t } from "./segmentedControl.module-D6SzYJD7.js";
1
+ import { t as e } from "./useRovingTabIndex-D7u22Ia_.js";
2
+ import { t } from "./segmentedControl.module-BzGXUL5G.js";
3
3
  import { jsx as n } from "react/jsx-runtime";
4
4
  import "react";
5
5
  //#region src/components/OptionsBar/OptionsBar.tsx
@@ -8,10 +8,9 @@ function r(r) {
8
8
  let t = i[e];
9
9
  t.disabled || t.onChange(!t.selected);
10
10
  }, d = e({
11
- items: i,
12
- itemClassName: t.segment,
11
+ itemSelector: `.${t.segment}`,
13
12
  onActivate: u
14
- }), f = s === void 0 ? void 0 : { "--wzl-tb-height": `${s}px` }, p = [
13
+ }), f = s === void 0 ? void 0 : { "--tb-h": `${s}px` }, p = [
15
14
  t.root,
16
15
  c && t[`size_${c}`],
17
16
  l && t[`variant_${l}`],
@@ -19,6 +18,7 @@ function r(r) {
19
18
  ].filter(Boolean).join(" ");
20
19
  return /* @__PURE__ */ n("div", {
21
20
  ref: d.rootRef,
21
+ onKeyDown: d.onKeyDown,
22
22
  className: p,
23
23
  role: "group",
24
24
  "aria-label": a,
@@ -30,10 +30,8 @@ function r(r) {
30
30
  "aria-pressed": e.selected,
31
31
  "aria-label": e.ariaLabel,
32
32
  disabled: e.disabled,
33
- tabIndex: d.tabIndexFor(r),
34
33
  className: i,
35
34
  onClick: () => u(r),
36
- onKeyDown: d.onKeyDown(r),
37
35
  children: e.label
38
36
  }, e.value);
39
37
  })
@@ -42,4 +40,4 @@ function r(r) {
42
40
  //#endregion
43
41
  export { r as t };
44
42
 
45
- //# sourceMappingURL=OptionsBar-ujxYidhj.js.map
43
+ //# sourceMappingURL=OptionsBar-DeTAjVb7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OptionsBar-ujxYidhj.js","names":["s","useRovingTabIndex","OptionsBar","props","toggle","item","items","index","roving","segmentedControl_module_default","style","height","rootCls","size","variant","className","ariaLabel","cls","i"],"sources":["../../src/components/OptionsBar/OptionsBar.tsx"],"sourcesContent":["import { type CSSProperties, type ReactElement, type ReactNode } from 'react';\nimport s from '../segmentedControl.module.css';\nimport { useRovingTabIndex } from '../../useRovingTabIndex';\n\n/**\n * One segment of an {@link OptionsBar}. Unlike `ToggleBar`, each item carries\n * its own selected state and its own `onChange`.\n */\nexport type OptionsBarItem<V extends string | number = string> = {\n value: V;\n label?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n selected: boolean;\n onChange: (next: boolean) => void;\n};\n\n/** Segment height and type scale for an {@link OptionsBar}. */\nexport type OptionsBarSize = 'sm' | 'md';\n/** Visual treatment of an {@link OptionsBar}. */\nexport type OptionsBarVariant = 'default' | 'minimal';\n\n/** Props for {@link OptionsBar}. */\nexport type OptionsBarProps<V extends string | number = string> = {\n items: readonly OptionsBarItem<V>[];\n ariaLabel?: string;\n className?: string;\n height?: number;\n /** Size variant. `sm` is ~60% of the default height with reduced padding\n * and font size — sized for dense surfaces like lab control panels. */\n size?: OptionsBarSize;\n /** Visual variant. `minimal` strips the pill track and glass treatment;\n * selection becomes a flat accent. For dense diagnostic surfaces. */\n variant?: OptionsBarVariant;\n};\n\n/**\n * Segmented strip of independent on/off options, each owning its own state.\n * Use it when the segments are unrelated booleans; use `ToggleBar` when they\n * are values of one setting.\n */\nexport function OptionsBar<V extends string | number = string>(props: OptionsBarProps<V>): ReactElement {\n const { items, ariaLabel, className, height, size, variant } = props;\n\n const toggle = (index: number) => {\n const item = items[index];\n if (item.disabled) return;\n item.onChange(!item.selected);\n };\n\n const roving = useRovingTabIndex({ items, itemClassName: s.segment, onActivate: toggle });\n\n const style: CSSProperties | undefined = height !== undefined\n ? ({ ['--wzl-tb-height' as string]: `${height}px` } as CSSProperties)\n : undefined;\n\n const rootCls = [\n s.root,\n size && s[`size_${size}`],\n variant && s[`variant_${variant}`],\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <div\n ref={roving.rootRef}\n className={rootCls}\n role=\"group\"\n aria-label={ariaLabel}\n style={style}\n >\n {items.map((item, i) => {\n const cls = `${s.segment}${item.selected ? ` ${s.segmentSelected}` : ''}`;\n return (\n <button\n key={item.value}\n type=\"button\"\n aria-pressed={item.selected}\n aria-label={item.ariaLabel}\n disabled={item.disabled}\n tabIndex={roving.tabIndexFor(i)}\n className={cls}\n onClick={() => toggle(i)}\n onKeyDown={roving.onKeyDown(i)}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n );\n}\n"],"mappings":";;;;;AAyCA,SAAgBE,EAA+C,GAAyC;CACtG,IAAM,EAAE,UAAO,cAAW,cAAW,WAAQ,SAAM,eAAYC,GAEzDC,KAAU,MAAkB;EAChC,IAAMC,IAAOC,EAAMC;EACnB,AAAIF,EAAK,YACTA,EAAK,SAAS,CAACA,EAAK,QAAQ;CAC9B,GAEMG,IAASP,EAAkB;EAAE;EAAO,eAAeD,EAAE;EAAS,YAAYI;CAAO,CAAC,GAElFM,IAAmCC,MAAW,KAAA,IAEhD,KAAA,IADC,EAAG,mBAA8B,GAAGA,EAAO,IAAI,GAG9CC,IAAU;EACdZ,EAAE;EACFa,KAAQb,EAAE,QAAQa;EAClBC,KAAWd,EAAE,WAAWc;EACxBC;CACF,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAE1B,OACE,kBAAC,OAAD;EACE,KAAKP,EAAO;EACZ,WAAWI;EACX,MAAK;EACL,cAAYI;EACL;EAEN,UAAAV,EAAM,KAAK,GAAM,MAAM;GACtB,IAAMW,IAAM,GAAGjB,EAAE,UAAUK,EAAK,WAAW,IAAIL,EAAE,oBAAoB;GACrE,OACE,kBAAC,UAAD;IAEE,MAAK;IACL,gBAAcK,EAAK;IACnB,cAAYA,EAAK;IACjB,UAAUA,EAAK;IACf,UAAUG,EAAO,YAAYU,CAAC;IAC9B,WAAWD;IACX,eAAeb,EAAOc,CAAC;IACvB,WAAWV,EAAO,UAAUU,CAAC;IAE5B,UAAAb,EAAK;GACA,GAXDA,EAAK,KAWJ;EAEZ,CAAC;CACE,CAAA;AAET"}
1
+ {"version":3,"file":"OptionsBar-DeTAjVb7.js","names":["s","useRovingTabIndex","OptionsBar","props","toggle","item","items","index","roving","segmentedControl_module_default","style","height","rootCls","size","variant","className","ariaLabel","cls","i"],"sources":["../../src/components/OptionsBar/OptionsBar.tsx"],"sourcesContent":["import { type CSSProperties, type ReactElement, type ReactNode } from 'react';\nimport s from '../segmentedControl.module.css';\nimport { useRovingTabIndex } from '../../useRovingTabIndex';\n\n/**\n * One segment of an {@link OptionsBar}. Unlike `ToggleBar`, each item carries\n * its own selected state and its own `onChange`.\n */\nexport type OptionsBarItem<V extends string | number = string> = {\n value: V;\n label?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n selected: boolean;\n onChange: (next: boolean) => void;\n};\n\n/** Segment height and type scale for an {@link OptionsBar}. */\nexport type OptionsBarSize = 'sm' | 'md';\n/** Visual treatment of an {@link OptionsBar}. */\nexport type OptionsBarVariant = 'default' | 'minimal';\n\n/** Props for {@link OptionsBar}. */\nexport type OptionsBarProps<V extends string | number = string> = {\n items: readonly OptionsBarItem<V>[];\n ariaLabel?: string;\n className?: string;\n height?: number;\n /** Size variant. `sm` is ~60% of the default height with reduced padding\n * and font size — sized for dense surfaces like lab control panels. */\n size?: OptionsBarSize;\n /** Visual variant. `minimal` strips the pill track and glass treatment;\n * selection becomes a flat accent. For dense diagnostic surfaces. */\n variant?: OptionsBarVariant;\n};\n\n/**\n * Segmented strip of independent on/off options, each owning its own state.\n * Use it when the segments are unrelated booleans; use `ToggleBar` when they\n * are values of one setting.\n */\nexport function OptionsBar<V extends string | number = string>(props: OptionsBarProps<V>): ReactElement {\n const { items, ariaLabel, className, height, size, variant } = props;\n\n const toggle = (index: number) => {\n const item = items[index];\n if (item.disabled) return;\n item.onChange(!item.selected);\n };\n\n const roving = useRovingTabIndex({ itemSelector: `.${s.segment}`, onActivate: toggle });\n\n const style: CSSProperties | undefined = height !== undefined\n ? ({ ['--tb-h' as string]: `${height}px` } as CSSProperties)\n : undefined;\n\n const rootCls = [\n s.root,\n size && s[`size_${size}`],\n variant && s[`variant_${variant}`],\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <div\n ref={roving.rootRef}\n onKeyDown={roving.onKeyDown}\n className={rootCls}\n role=\"group\"\n aria-label={ariaLabel}\n style={style}\n >\n {items.map((item, i) => {\n const cls = `${s.segment}${item.selected ? ` ${s.segmentSelected}` : ''}`;\n return (\n <button\n key={item.value}\n type=\"button\"\n aria-pressed={item.selected}\n aria-label={item.ariaLabel}\n disabled={item.disabled}\n className={cls}\n onClick={() => toggle(i)}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n );\n}\n"],"mappings":";;;;;AAyCA,SAAgBE,EAA+C,GAAyC;CACtG,IAAM,EAAE,UAAO,cAAW,cAAW,WAAQ,SAAM,eAAYC,GAEzDC,KAAU,MAAkB;EAChC,IAAMC,IAAOC,EAAMC;EACnB,AAAIF,EAAK,YACTA,EAAK,SAAS,CAACA,EAAK,QAAQ;CAC9B,GAEMG,IAASP,EAAkB;EAAE,cAAc,IAAID,EAAE;EAAW,YAAYI;CAAO,CAAC,GAEhFM,IAAmCC,MAAW,KAAA,IAEhD,KAAA,IADC,EAAG,UAAqB,GAAGA,EAAO,IAAI,GAGrCC,IAAU;EACdZ,EAAE;EACFa,KAAQb,EAAE,QAAQa;EAClBC,KAAWd,EAAE,WAAWc;EACxBC;CACF,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAE1B,OACE,kBAAC,OAAD;EACE,KAAKP,EAAO;EACZ,WAAWA,EAAO;EAClB,WAAWI;EACX,MAAK;EACL,cAAYI;EACL;EAEN,UAAAV,EAAM,KAAK,GAAM,MAAM;GACtB,IAAMW,IAAM,GAAGjB,EAAE,UAAUK,EAAK,WAAW,IAAIL,EAAE,oBAAoB;GACrE,OACE,kBAAC,UAAD;IAEE,MAAK;IACL,gBAAcK,EAAK;IACnB,cAAYA,EAAK;IACjB,UAAUA,EAAK;IACf,WAAWY;IACX,eAAeb,EAAOc,CAAC;IAEtB,UAAAb,EAAK;GACA,GATDA,EAAK,KASJ;EAEZ,CAAC;CACE,CAAA;AAET"}