@weasel-js/ui 1.6.1 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (517) 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-CTc9Lkwn.js +14 -0
  4. package/dist/chunks/Badge-CTc9Lkwn.js.map +1 -0
  5. package/dist/chunks/{Badge-CyAIZSDo.js → Badge-jYQjrTKc.js} +506 -486
  6. package/dist/chunks/Badge-jYQjrTKc.js.map +1 -0
  7. package/dist/chunks/BandEditor-Dd0egAgE.js +292 -0
  8. package/dist/chunks/BandEditor-Dd0egAgE.js.map +1 -0
  9. package/dist/chunks/{Button-BIdXHQOx.js → Button-XB-T75YL.js} +2 -2
  10. package/dist/chunks/{Button-BIdXHQOx.js.map → Button-XB-T75YL.js.map} +1 -1
  11. package/dist/chunks/{ButtonBar-D5Vi0aj_.js → ButtonBar-CIMKPPRS.js} +7 -9
  12. package/dist/chunks/{ButtonBar-D5Vi0aj_.js.map → ButtonBar-CIMKPPRS.js.map} +1 -1
  13. package/dist/chunks/Callout-BUn0dP_S.js +115 -0
  14. package/dist/chunks/Callout-BUn0dP_S.js.map +1 -0
  15. package/dist/chunks/Checkbox-DFn-x0JO.js +37 -0
  16. package/dist/chunks/Checkbox-DFn-x0JO.js.map +1 -0
  17. package/dist/chunks/CloseButton-BmNmRVtb.js +26 -0
  18. package/dist/chunks/CloseButton-BmNmRVtb.js.map +1 -0
  19. package/dist/chunks/ColorField-BLs9fbeq.js +90 -0
  20. package/dist/chunks/ColorField-BLs9fbeq.js.map +1 -0
  21. package/dist/chunks/{ColorModeControl-ke5PXbBa.js → ColorModeControl-DaVJ-SyX.js} +3 -3
  22. package/dist/chunks/{ColorModeControl-ke5PXbBa.js.map → ColorModeControl-DaVJ-SyX.js.map} +1 -1
  23. package/dist/chunks/ComboBox-CuTLRmUg.js +138 -0
  24. package/dist/chunks/ComboBox-CuTLRmUg.js.map +1 -0
  25. package/dist/chunks/{CurveEditor-BDJXjEvK.js → CurveEditor-jVBEqqdv.js} +90 -87
  26. package/dist/chunks/CurveEditor-jVBEqqdv.js.map +1 -0
  27. package/dist/chunks/{DataGrid-D-dZj1BD.js → DataGrid-BklgBqS0.js} +17 -17
  28. package/dist/chunks/DataGrid-BklgBqS0.js.map +1 -0
  29. package/dist/chunks/DetailList-DFtqdOJj.js +52 -0
  30. package/dist/chunks/DetailList-DFtqdOJj.js.map +1 -0
  31. package/dist/chunks/{DetentSlider-CL8TlX3S.js → DetentSlider-Bh7EpMqT.js} +2 -2
  32. package/dist/chunks/{DetentSlider-CL8TlX3S.js.map → DetentSlider-Bh7EpMqT.js.map} +1 -1
  33. package/dist/chunks/Dialog-DKfsk5VN.js +63 -0
  34. package/dist/chunks/Dialog-DKfsk5VN.js.map +1 -0
  35. package/dist/chunks/{Disclosure-0G0uh2fa.js → Disclosure-Ch2KxYuB.js} +7 -7
  36. package/dist/chunks/Disclosure-Ch2KxYuB.js.map +1 -0
  37. package/dist/chunks/{DragGhost-B5_hb9W9.js → DragGhost-BeYDJyLZ.js} +2 -2
  38. package/dist/chunks/{DragGhost-B5_hb9W9.js.map → DragGhost-BeYDJyLZ.js.map} +1 -1
  39. package/dist/chunks/{DragHandleGlyph-Dr7Fgo0I.js → DragGrip-AoIZXfZb.js} +2 -2
  40. package/dist/chunks/DragGrip-AoIZXfZb.js.map +1 -0
  41. package/dist/chunks/FallthroughDiagram-C7BUe8eU.js +284 -0
  42. package/dist/chunks/FallthroughDiagram-C7BUe8eU.js.map +1 -0
  43. package/dist/chunks/Field-DsBlnFKf.js +25 -0
  44. package/dist/chunks/Field-DsBlnFKf.js.map +1 -0
  45. package/dist/chunks/FillStrokeSwatch-CgsYQgew.js +112 -0
  46. package/dist/chunks/FillStrokeSwatch-CgsYQgew.js.map +1 -0
  47. package/dist/chunks/{FontFamilySelect-DXlMKWfK.js → FontFamilySelect-CGJ5OIOy.js} +2 -2
  48. package/dist/chunks/FontFamilySelect-CGJ5OIOy.js.map +1 -0
  49. package/dist/chunks/FontWeightSelect-RbcXYJPS.js +49 -0
  50. package/dist/chunks/FontWeightSelect-RbcXYJPS.js.map +1 -0
  51. package/dist/chunks/GestureRoute-BXESrHI0.js +82 -0
  52. package/dist/chunks/GestureRoute-BXESrHI0.js.map +1 -0
  53. package/dist/chunks/GradientEditor-DypXzMc-.js +325 -0
  54. package/dist/chunks/GradientEditor-DypXzMc-.js.map +1 -0
  55. package/dist/chunks/{Icon-Cgzy8VgC.js → Icon--B1ME-6c.js} +33 -1
  56. package/dist/chunks/Icon--B1ME-6c.js.map +1 -0
  57. package/dist/chunks/{InlineRange-eOj6JpJl.js → InlineRange-P01ABSzo.js} +3 -3
  58. package/dist/chunks/InlineRange-P01ABSzo.js.map +1 -0
  59. package/dist/chunks/{Input-CHmkfYaD.js → Input-CzwvCZs_.js} +10 -15
  60. package/dist/chunks/Input-CzwvCZs_.js.map +1 -0
  61. package/dist/chunks/{ItemList-Cm-HUWCi.js → ItemList-CRu9y7hL.js} +2 -2
  62. package/dist/chunks/ItemList-CRu9y7hL.js.map +1 -0
  63. package/dist/chunks/{Jog-DESxZ44P.js → Jog-DfNUYejm.js} +8 -8
  64. package/dist/chunks/Jog-DfNUYejm.js.map +1 -0
  65. package/dist/chunks/{Keycaps-C0H_v2gO.js → Keycaps-C-FJyG8k.js} +14 -14
  66. package/dist/chunks/Keycaps-C-FJyG8k.js.map +1 -0
  67. package/dist/chunks/{LayerList-nz-QYvTF.js → LayerList-CsDqwYh-.js} +105 -111
  68. package/dist/chunks/LayerList-CsDqwYh-.js.map +1 -0
  69. package/dist/chunks/ListEditor-BnGzqERm.js +72 -0
  70. package/dist/chunks/ListEditor-BnGzqERm.js.map +1 -0
  71. package/dist/chunks/MenuButton-L9f5vido.js +75 -0
  72. package/dist/chunks/MenuButton-L9f5vido.js.map +1 -0
  73. package/dist/chunks/MeshEditor-GbqqiPk8.js +199 -0
  74. package/dist/chunks/MeshEditor-GbqqiPk8.js.map +1 -0
  75. package/dist/chunks/NumberField-DLXXgh48.js +209 -0
  76. package/dist/chunks/NumberField-DLXXgh48.js.map +1 -0
  77. package/dist/chunks/{OptionsBar-DbzAgIln.js → OptionsBar-DeTAjVb7.js} +6 -8
  78. package/dist/chunks/{OptionsBar-DbzAgIln.js.map → OptionsBar-DeTAjVb7.js.map} +1 -1
  79. package/dist/chunks/PaintField-C0hoXc0Y.js +63 -0
  80. package/dist/chunks/PaintField-C0hoXc0Y.js.map +1 -0
  81. package/dist/chunks/PaintInput-jQRxM95Y.js +132 -0
  82. package/dist/chunks/PaintInput-jQRxM95Y.js.map +1 -0
  83. package/dist/chunks/PatternPicker-CaMYXzhF.js +135 -0
  84. package/dist/chunks/PatternPicker-CaMYXzhF.js.map +1 -0
  85. package/dist/chunks/{Plot2D-CTXHkL5p.js → Plot2D-BHNbgCAl.js} +7 -7
  86. package/dist/chunks/Plot2D-BHNbgCAl.js.map +1 -0
  87. package/dist/chunks/{PointPlotter-Bxo6haKe.js → PointPlotter-BZ_vk6gV.js} +2 -2
  88. package/dist/chunks/{PointPlotter-Bxo6haKe.js.map → PointPlotter-BZ_vk6gV.js.map} +1 -1
  89. package/dist/chunks/{Powerline-ExO5GwEr.js → Powerline-6wIFmDik.js} +2 -2
  90. package/dist/chunks/{Powerline-ExO5GwEr.js.map → Powerline-6wIFmDik.js.map} +1 -1
  91. package/dist/chunks/{Prefs-DpqFKiwY.js → Prefs-CkyldX-e.js} +116 -91
  92. package/dist/chunks/Prefs-CkyldX-e.js.map +1 -0
  93. package/dist/chunks/{Properties-D_KzDN9K.js → Properties-D15c8NP-.js} +53 -47
  94. package/dist/chunks/Properties-D15c8NP-.js.map +1 -0
  95. package/dist/chunks/PropertyField-CV_Gw57S.js +686 -0
  96. package/dist/chunks/PropertyField-CV_Gw57S.js.map +1 -0
  97. package/dist/chunks/{RadioGroup-Bh4-12e-.js → RadioGroup-4dbzqvGy.js} +2 -2
  98. package/dist/chunks/{RadioGroup-Bh4-12e-.js.map → RadioGroup-4dbzqvGy.js.map} +1 -1
  99. package/dist/chunks/{RangeSlider-BKRRTPTZ.js → RangeSlider-BxokZViJ.js} +8 -8
  100. package/dist/chunks/RangeSlider-BxokZViJ.js.map +1 -0
  101. package/dist/chunks/RecentColorsProvider-DHcfk25u.js +84 -0
  102. package/dist/chunks/RecentColorsProvider-DHcfk25u.js.map +1 -0
  103. package/dist/chunks/ResizeHandle-CbAgCQOt.js +81 -0
  104. package/dist/chunks/ResizeHandle-CbAgCQOt.js.map +1 -0
  105. package/dist/chunks/Select-BppLsJTz.js +236 -0
  106. package/dist/chunks/Select-BppLsJTz.js.map +1 -0
  107. package/dist/chunks/SelectionPanel-Cm1qu-ZX.js +107 -0
  108. package/dist/chunks/SelectionPanel-Cm1qu-ZX.js.map +1 -0
  109. package/dist/chunks/SidebarPanel-AXQ0jRDx.js +53 -0
  110. package/dist/chunks/SidebarPanel-AXQ0jRDx.js.map +1 -0
  111. package/dist/chunks/Slider-Cl5RCeZ7.js +389 -0
  112. package/dist/chunks/Slider-Cl5RCeZ7.js.map +1 -0
  113. package/dist/chunks/{StatusBar-DzoPDY4k.js → StatusBar-Ca9Dvhhq.js} +6 -6
  114. package/dist/chunks/StatusBar-Ca9Dvhhq.js.map +1 -0
  115. package/dist/chunks/SwatchGrid-9ZPiDmxd.js +78 -0
  116. package/dist/chunks/SwatchGrid-9ZPiDmxd.js.map +1 -0
  117. package/dist/chunks/SwatchStrip-Cw0l8Om7.js +577 -0
  118. package/dist/chunks/SwatchStrip-Cw0l8Om7.js.map +1 -0
  119. package/dist/chunks/ThemeSwitcher-DiBmMh_B.js +38 -0
  120. package/dist/chunks/ThemeSwitcher-DiBmMh_B.js.map +1 -0
  121. package/dist/chunks/{Timeline--58F7MED.js → Timeline-pqnYk5cV.js} +296 -294
  122. package/dist/chunks/Timeline-pqnYk5cV.js.map +1 -0
  123. package/dist/chunks/Toast-C3ozq11V.js +170 -0
  124. package/dist/chunks/Toast-C3ozq11V.js.map +1 -0
  125. package/dist/chunks/{ToggleBar-DTjGeS0Q.js → ToggleBar-Z2jZiguF.js} +13 -15
  126. package/dist/chunks/ToggleBar-Z2jZiguF.js.map +1 -0
  127. package/dist/chunks/{TokenPanel-CMq7uydV.js → TokenPanel-DAkL6vwQ.js} +33 -33
  128. package/dist/chunks/TokenPanel-DAkL6vwQ.js.map +1 -0
  129. package/dist/chunks/{ToolButton-CR4sQlxF.js → ToolButton-BURp4YIO.js} +12 -14
  130. package/dist/chunks/ToolButton-BURp4YIO.js.map +1 -0
  131. package/dist/chunks/{ToolOptionsBar-CtzTlaN2.js → ToolOptionsBar-COsTJ1cu.js} +9 -7
  132. package/dist/chunks/ToolOptionsBar-COsTJ1cu.js.map +1 -0
  133. package/dist/chunks/{ToolPalette-CKG9qY6P.js → ToolPalette-DKDFWOX-.js} +8 -10
  134. package/dist/chunks/ToolPalette-DKDFWOX-.js.map +1 -0
  135. package/dist/chunks/{Tooltip-Clg2mhSt.js → Tooltip-C6eFCYxw.js} +2 -2
  136. package/dist/chunks/{Tooltip-Clg2mhSt.js.map → Tooltip-C6eFCYxw.js.map} +1 -1
  137. package/dist/chunks/{Tree-DVOtc9R5.js → Tree-Cc8lIzgM.js} +2 -2
  138. package/dist/chunks/Tree-Cc8lIzgM.js.map +1 -0
  139. package/dist/chunks/checkbox.module-DLQV9tMX.js +5 -0
  140. package/dist/chunks/checkbox.module-DLQV9tMX.js.map +1 -0
  141. package/dist/chunks/{createKeyframeLayer-Czj6Y235.js → createKeyframeLayer-BTa4LyJE.js} +208 -223
  142. package/dist/chunks/createKeyframeLayer-BTa4LyJE.js.map +1 -0
  143. package/dist/chunks/field.module-Bh7BTKMh.js +15 -0
  144. package/dist/chunks/field.module-Bh7BTKMh.js.map +1 -0
  145. package/dist/chunks/formatShortcut-DRQrVThu.js.map +1 -1
  146. package/dist/chunks/handles-CqVANLtu.js +17 -0
  147. package/dist/chunks/handles-CqVANLtu.js.map +1 -0
  148. package/dist/chunks/{icons-Dk8SRS8g.js → icons-Dr2-r30x.js} +2 -2
  149. package/dist/chunks/icons-Dr2-r30x.js.map +1 -0
  150. package/dist/chunks/listbox.module-BcdVJMbm.js +8 -0
  151. package/dist/chunks/listbox.module-BcdVJMbm.js.map +1 -0
  152. package/dist/chunks/model-B1-gMBIW.js +386 -0
  153. package/dist/chunks/model-B1-gMBIW.js.map +1 -0
  154. package/dist/chunks/{portalHost-yTOVuCej.js → portalHost-CE70wLzo.js} +10 -6
  155. package/dist/chunks/portalHost-CE70wLzo.js.map +1 -0
  156. package/dist/chunks/prefField-BE_Ytr2H.js +229 -0
  157. package/dist/chunks/prefField-BE_Ytr2H.js.map +1 -0
  158. package/dist/chunks/{segmentTooltip-CStYHKzd.js → segmentTooltip-CGxCOWNz.js} +2 -2
  159. package/dist/chunks/{segmentTooltip-CStYHKzd.js.map → segmentTooltip-CGxCOWNz.js.map} +1 -1
  160. package/dist/chunks/segmentedControl.module-BzGXUL5G.js +11 -0
  161. package/dist/chunks/segmentedControl.module-BzGXUL5G.js.map +1 -0
  162. package/dist/chunks/useReorderDragList-CStYKjHl.js +133 -0
  163. package/dist/chunks/useReorderDragList-CStYKjHl.js.map +1 -0
  164. package/dist/chunks/useRovingTabIndex-D7u22Ia_.js +91 -0
  165. package/dist/chunks/useRovingTabIndex-D7u22Ia_.js.map +1 -0
  166. package/dist/components/ActionBar/ActionBar.d.ts.map +1 -1
  167. package/dist/components/ActionBar/index.js +1 -1
  168. package/dist/components/Badge/bases/ChamferedRect.d.ts.map +1 -1
  169. package/dist/components/Badge/bases/Powerline.d.ts.map +1 -1
  170. package/dist/components/Badge/bases/edgeProfiles.d.ts +31 -4
  171. package/dist/components/Badge/bases/edgeProfiles.d.ts.map +1 -1
  172. package/dist/components/Badge/index.d.ts +1 -0
  173. package/dist/components/Badge/index.d.ts.map +1 -1
  174. package/dist/components/Badge/index.js +3 -2
  175. package/dist/components/Badge/statusIcons.d.ts +5 -0
  176. package/dist/components/Badge/statusIcons.d.ts.map +1 -0
  177. package/dist/components/BandEditor/BandEditor.d.ts +17 -7
  178. package/dist/components/BandEditor/BandEditor.d.ts.map +1 -1
  179. package/dist/components/BandEditor/bands.d.ts +5 -2
  180. package/dist/components/BandEditor/bands.d.ts.map +1 -1
  181. package/dist/components/BandEditor/index.js +1 -1
  182. package/dist/components/Button/index.js +1 -1
  183. package/dist/components/ButtonBar/ButtonBar.d.ts.map +1 -1
  184. package/dist/components/ButtonBar/index.js +1 -1
  185. package/dist/components/Callout/Callout.d.ts +2 -2
  186. package/dist/components/Callout/Callout.d.ts.map +1 -1
  187. package/dist/components/Callout/index.js +1 -1
  188. package/dist/components/Checkbox/Checkbox.d.ts +28 -13
  189. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
  190. package/dist/components/Checkbox/index.js +1 -1
  191. package/dist/components/CloseButton/CloseButton.d.ts +21 -0
  192. package/dist/components/CloseButton/CloseButton.d.ts.map +1 -0
  193. package/dist/components/CloseButton/index.d.ts +3 -0
  194. package/dist/components/CloseButton/index.d.ts.map +1 -0
  195. package/dist/components/CloseButton/index.js +2 -0
  196. package/dist/components/ColorField/ColorField.d.ts +5 -1
  197. package/dist/components/ColorField/ColorField.d.ts.map +1 -1
  198. package/dist/components/ColorField/OpacityRange.d.ts +18 -0
  199. package/dist/components/ColorField/OpacityRange.d.ts.map +1 -0
  200. package/dist/components/ColorField/index.js +1 -1
  201. package/dist/components/ColorModeControl/index.js +1 -1
  202. package/dist/components/ComboBox/ComboBox.d.ts +7 -0
  203. package/dist/components/ComboBox/ComboBox.d.ts.map +1 -1
  204. package/dist/components/ComboBox/index.js +1 -1
  205. package/dist/components/CurveEditor/CurveEditor.d.ts.map +1 -1
  206. package/dist/components/CurveEditor/LayeredCurveEditor.d.ts.map +1 -1
  207. package/dist/components/CurveEditor/index.js +2 -2
  208. package/dist/components/DataGrid/index.js +1 -1
  209. package/dist/components/DetailList/DetailList.d.ts +31 -5
  210. package/dist/components/DetailList/DetailList.d.ts.map +1 -1
  211. package/dist/components/DetailList/index.d.ts +1 -1
  212. package/dist/components/DetailList/index.d.ts.map +1 -1
  213. package/dist/components/DetailList/index.js +1 -1
  214. package/dist/components/DetentSlider/index.js +1 -1
  215. package/dist/components/Dialog/Dialog.d.ts.map +1 -1
  216. package/dist/components/Dialog/index.js +1 -1
  217. package/dist/components/Disclosure/Disclosure.d.ts +1 -1
  218. package/dist/components/Disclosure/index.js +1 -1
  219. package/dist/components/DragGhost/index.js +1 -1
  220. package/dist/components/{DragHandleGlyph/DragHandleGlyph.d.ts → DragGrip/DragGrip.d.ts} +4 -4
  221. package/dist/components/DragGrip/DragGrip.d.ts.map +1 -0
  222. package/dist/components/DragGrip/index.d.ts +3 -0
  223. package/dist/components/DragGrip/index.d.ts.map +1 -0
  224. package/dist/components/DragGrip/index.js +2 -0
  225. package/dist/components/FallthroughDiagram/FallthroughDiagram.d.ts +14 -0
  226. package/dist/components/FallthroughDiagram/FallthroughDiagram.d.ts.map +1 -0
  227. package/dist/components/FallthroughDiagram/fixtures.d.ts +17 -0
  228. package/dist/components/FallthroughDiagram/fixtures.d.ts.map +1 -0
  229. package/dist/components/FallthroughDiagram/index.d.ts +3 -0
  230. package/dist/components/FallthroughDiagram/index.d.ts.map +1 -0
  231. package/dist/components/FallthroughDiagram/index.js +2 -0
  232. package/dist/components/Field/index.js +1 -1
  233. package/dist/components/FillStrokeSwatch/FillStrokeSwatch.d.ts.map +1 -1
  234. package/dist/components/FillStrokeSwatch/index.js +1 -1
  235. package/dist/components/FontFamilySelect/FontFamilySelect.d.ts +20 -0
  236. package/dist/components/FontFamilySelect/FontFamilySelect.d.ts.map +1 -1
  237. package/dist/components/FontFamilySelect/index.js +1 -1
  238. package/dist/components/FontWeightSelect/FontWeightSelect.d.ts +26 -0
  239. package/dist/components/FontWeightSelect/FontWeightSelect.d.ts.map +1 -0
  240. package/dist/components/FontWeightSelect/index.d.ts +3 -0
  241. package/dist/components/FontWeightSelect/index.d.ts.map +1 -0
  242. package/dist/components/FontWeightSelect/index.js +2 -0
  243. package/dist/components/GestureRoute/GestureRoute.d.ts +19 -0
  244. package/dist/components/GestureRoute/GestureRoute.d.ts.map +1 -0
  245. package/dist/components/GestureRoute/index.d.ts +3 -0
  246. package/dist/components/GestureRoute/index.d.ts.map +1 -0
  247. package/dist/components/GestureRoute/index.js +2 -0
  248. package/dist/components/GradientEditor/GradientEditor.d.ts +22 -8
  249. package/dist/components/GradientEditor/GradientEditor.d.ts.map +1 -1
  250. package/dist/components/GradientEditor/GradientHandles.d.ts +1 -8
  251. package/dist/components/GradientEditor/GradientHandles.d.ts.map +1 -1
  252. package/dist/components/GradientEditor/SceneGradientHandles.d.ts +7 -5
  253. package/dist/components/GradientEditor/SceneGradientHandles.d.ts.map +1 -1
  254. package/dist/components/GradientEditor/handleOverlay.d.ts +41 -0
  255. package/dist/components/GradientEditor/handleOverlay.d.ts.map +1 -0
  256. package/dist/components/GradientEditor/index.js +1 -1
  257. package/dist/components/InlineRange/index.js +1 -1
  258. package/dist/components/Input/Input.d.ts +1 -1
  259. package/dist/components/Input/Input.d.ts.map +1 -1
  260. package/dist/components/Input/index.js +1 -1
  261. package/dist/components/ItemList/ItemList.d.ts +32 -31
  262. package/dist/components/ItemList/ItemList.d.ts.map +1 -1
  263. package/dist/components/ItemList/index.js +1 -1
  264. package/dist/components/Jog/index.js +1 -1
  265. package/dist/components/Keycaps/Keycaps.d.ts +11 -5
  266. package/dist/components/Keycaps/Keycaps.d.ts.map +1 -1
  267. package/dist/components/Keycaps/index.d.ts +1 -1
  268. package/dist/components/Keycaps/index.d.ts.map +1 -1
  269. package/dist/components/Keycaps/index.js +1 -1
  270. package/dist/components/LayerList/LayerList.d.ts +1 -1
  271. package/dist/components/LayerList/LayerList.d.ts.map +1 -1
  272. package/dist/components/LayerList/index.js +1 -1
  273. package/dist/components/ListEditor/ListEditor.d.ts.map +1 -1
  274. package/dist/components/ListEditor/index.js +1 -1
  275. package/dist/components/MenuButton/MenuButton.d.ts.map +1 -1
  276. package/dist/components/MenuButton/index.js +1 -1
  277. package/dist/components/MeshEditor/MeshEditor.d.ts +4 -3
  278. package/dist/components/MeshEditor/MeshEditor.d.ts.map +1 -1
  279. package/dist/components/MeshEditor/MeshHandles.d.ts +38 -0
  280. package/dist/components/MeshEditor/MeshHandles.d.ts.map +1 -0
  281. package/dist/components/MeshEditor/index.d.ts +2 -0
  282. package/dist/components/MeshEditor/index.d.ts.map +1 -1
  283. package/dist/components/MeshEditor/index.js +2 -2
  284. package/dist/components/NumberField/NumberField.d.ts +1 -1
  285. package/dist/components/NumberField/NumberField.d.ts.map +1 -1
  286. package/dist/components/NumberField/UnitField.d.ts +20 -7
  287. package/dist/components/NumberField/UnitField.d.ts.map +1 -1
  288. package/dist/components/NumberField/index.js +1 -1
  289. package/dist/components/OptionsBar/OptionsBar.d.ts.map +1 -1
  290. package/dist/components/OptionsBar/index.js +1 -1
  291. package/dist/components/PaintField/PaintField.d.ts.map +1 -1
  292. package/dist/components/PaintField/index.js +1 -1
  293. package/dist/components/PaintInput/PaintInput.d.ts.map +1 -1
  294. package/dist/components/PaintInput/index.js +1 -1
  295. package/dist/components/PatternPicker/PatternPicker.d.ts +6 -5
  296. package/dist/components/PatternPicker/PatternPicker.d.ts.map +1 -1
  297. package/dist/components/PatternPicker/index.js +1 -1
  298. package/dist/components/Plot2D/index.js +1 -1
  299. package/dist/components/PointPlotter/index.js +1 -1
  300. package/dist/components/Powerline/index.d.ts +1 -1
  301. package/dist/components/Powerline/index.d.ts.map +1 -1
  302. package/dist/components/Powerline/index.js +2 -2
  303. package/dist/components/Prefs/PrefsForm.d.ts +8 -0
  304. package/dist/components/Prefs/PrefsForm.d.ts.map +1 -1
  305. package/dist/components/Prefs/PrefsRail.d.ts +3 -2
  306. package/dist/components/Prefs/PrefsRail.d.ts.map +1 -1
  307. package/dist/components/Prefs/PrefsRow.d.ts.map +1 -1
  308. package/dist/components/Prefs/index.d.ts +1 -1
  309. package/dist/components/Prefs/index.d.ts.map +1 -1
  310. package/dist/components/Prefs/index.js +2 -2
  311. package/dist/components/Prefs/prefField.d.ts +13 -0
  312. package/dist/components/Prefs/prefField.d.ts.map +1 -1
  313. package/dist/components/Prefs/schema.d.ts +2 -2
  314. package/dist/components/Prefs/schema.d.ts.map +1 -1
  315. package/dist/components/Properties/PropertyField.d.ts +35 -32
  316. package/dist/components/Properties/PropertyField.d.ts.map +1 -1
  317. package/dist/components/Properties/PropertyGroup.d.ts.map +1 -1
  318. package/dist/components/Properties/PropertyPanel.d.ts +1 -8
  319. package/dist/components/Properties/PropertyPanel.d.ts.map +1 -1
  320. package/dist/components/Properties/index.d.ts +1 -1
  321. package/dist/components/Properties/index.d.ts.map +1 -1
  322. package/dist/components/Properties/index.js +3 -3
  323. package/dist/components/RadioGroup/index.js +1 -1
  324. package/dist/components/RangeSlider/index.js +1 -1
  325. package/dist/components/RecentColors/RecentColorsProvider.d.ts +24 -0
  326. package/dist/components/RecentColors/RecentColorsProvider.d.ts.map +1 -0
  327. package/dist/components/RecentColors/index.d.ts +5 -0
  328. package/dist/components/RecentColors/index.d.ts.map +1 -0
  329. package/dist/components/RecentColors/index.js +2 -0
  330. package/dist/components/RecentColors/recentColors.d.ts +39 -0
  331. package/dist/components/RecentColors/recentColors.d.ts.map +1 -0
  332. package/dist/components/ResizeHandle/ResizeHandle.d.ts.map +1 -1
  333. package/dist/components/ResizeHandle/index.js +1 -1
  334. package/dist/components/Select/Select.d.ts +6 -2
  335. package/dist/components/Select/Select.d.ts.map +1 -1
  336. package/dist/components/Select/index.js +1 -1
  337. package/dist/components/SelectionPanel/SelectionPanel.d.ts.map +1 -1
  338. package/dist/components/SelectionPanel/index.js +2 -2
  339. package/dist/components/SelectionPanel/renderLeaf.d.ts +17 -0
  340. package/dist/components/SelectionPanel/renderLeaf.d.ts.map +1 -1
  341. package/dist/components/SidebarPanel/SidebarPanel.d.ts +1 -1
  342. package/dist/components/SidebarPanel/SidebarPanel.d.ts.map +1 -1
  343. package/dist/components/SidebarPanel/index.js +1 -1
  344. package/dist/components/Slider/Slider.d.ts +19 -2
  345. package/dist/components/Slider/Slider.d.ts.map +1 -1
  346. package/dist/components/Slider/index.js +1 -1
  347. package/dist/components/StatusBar/index.js +1 -1
  348. package/dist/components/SwatchGrid/SwatchGrid.d.ts.map +1 -1
  349. package/dist/components/SwatchGrid/index.js +1 -1
  350. package/dist/components/SwatchStrip/SwatchStrip.d.ts +44 -0
  351. package/dist/components/SwatchStrip/SwatchStrip.d.ts.map +1 -0
  352. package/dist/components/SwatchStrip/index.d.ts +5 -0
  353. package/dist/components/SwatchStrip/index.d.ts.map +1 -0
  354. package/dist/components/SwatchStrip/index.js +2 -0
  355. package/dist/components/SwatchStrip/palettes.d.ts +21 -0
  356. package/dist/components/SwatchStrip/palettes.d.ts.map +1 -0
  357. package/dist/components/ThemeSwitcher/ThemeSwitcher.d.ts +38 -0
  358. package/dist/components/ThemeSwitcher/ThemeSwitcher.d.ts.map +1 -0
  359. package/dist/components/ThemeSwitcher/index.d.ts +3 -0
  360. package/dist/components/ThemeSwitcher/index.d.ts.map +1 -0
  361. package/dist/components/ThemeSwitcher/index.js +2 -0
  362. package/dist/components/Timeline/AnimatedTimeline.d.ts +1 -0
  363. package/dist/components/Timeline/AnimatedTimeline.d.ts.map +1 -1
  364. package/dist/components/Timeline/EasingPicker.d.ts +3 -0
  365. package/dist/components/Timeline/EasingPicker.d.ts.map +1 -1
  366. package/dist/components/Timeline/LaneGraph.d.ts +1 -1
  367. package/dist/components/Timeline/LaneGraph.d.ts.map +1 -1
  368. package/dist/components/Timeline/Timeline.d.ts +10 -1
  369. package/dist/components/Timeline/Timeline.d.ts.map +1 -1
  370. package/dist/components/Timeline/Transport.d.ts +6 -0
  371. package/dist/components/Timeline/Transport.d.ts.map +1 -1
  372. package/dist/components/Timeline/index.js +1 -1
  373. package/dist/components/Timeline/keys.d.ts +1 -0
  374. package/dist/components/Timeline/keys.d.ts.map +1 -1
  375. package/dist/components/Toast/Toast.d.ts +12 -3
  376. package/dist/components/Toast/Toast.d.ts.map +1 -1
  377. package/dist/components/Toast/index.js +1 -1
  378. package/dist/components/ToggleBar/ToggleBar.d.ts.map +1 -1
  379. package/dist/components/ToggleBar/index.js +1 -1
  380. package/dist/components/TokenPanel/index.js +1 -1
  381. package/dist/components/TokenPanel/tokenTypes.d.ts +1 -0
  382. package/dist/components/TokenPanel/tokenTypes.d.ts.map +1 -1
  383. package/dist/components/ToolButton/ToolButton.d.ts +1 -10
  384. package/dist/components/ToolButton/ToolButton.d.ts.map +1 -1
  385. package/dist/components/ToolButton/index.js +1 -1
  386. package/dist/components/ToolOptionsBar/index.js +1 -1
  387. package/dist/components/ToolPalette/ToolPalette.d.ts +2 -1
  388. package/dist/components/ToolPalette/ToolPalette.d.ts.map +1 -1
  389. package/dist/components/ToolPalette/formatShortcut.d.ts +2 -0
  390. package/dist/components/ToolPalette/formatShortcut.d.ts.map +1 -1
  391. package/dist/components/ToolPalette/index.js +1 -1
  392. package/dist/components/Tooltip/index.js +1 -1
  393. package/dist/components/Tree/Tree.d.ts +27 -26
  394. package/dist/components/Tree/Tree.d.ts.map +1 -1
  395. package/dist/components/Tree/index.js +1 -1
  396. package/dist/components/spin.d.ts +16 -0
  397. package/dist/components/spin.d.ts.map +1 -0
  398. package/dist/components/stanceSurfaces.d.ts.map +1 -1
  399. package/dist/icons/index.d.ts +51 -2
  400. package/dist/icons/index.d.ts.map +1 -1
  401. package/dist/icons/paths.d.ts +12 -0
  402. package/dist/icons/paths.d.ts.map +1 -1
  403. package/dist/index.d.ts +9 -3
  404. package/dist/index.d.ts.map +1 -1
  405. package/dist/index.js +98 -111
  406. package/dist/index.js.map +1 -1
  407. package/dist/overlays/portalHost.d.ts +6 -0
  408. package/dist/overlays/portalHost.d.ts.map +1 -1
  409. package/dist/paintGradientTrack.d.ts +5 -2
  410. package/dist/paintGradientTrack.d.ts.map +1 -1
  411. package/dist/style.css +1 -1
  412. package/dist/useAsyncOptions.d.ts.map +1 -1
  413. package/dist/useReorderDragList.d.ts +1 -1
  414. package/dist/useReorderDragList.d.ts.map +1 -1
  415. package/dist/useRovingTabIndex.d.ts +40 -39
  416. package/dist/useRovingTabIndex.d.ts.map +1 -1
  417. package/package.json +9 -8
  418. package/dist/chunks/ActionBar-DCq16yFA.js +0 -57
  419. package/dist/chunks/ActionBar-DCq16yFA.js.map +0 -1
  420. package/dist/chunks/Badge-CyAIZSDo.js.map +0 -1
  421. package/dist/chunks/BandEditor-Dhm_Xrlr.js +0 -248
  422. package/dist/chunks/BandEditor-Dhm_Xrlr.js.map +0 -1
  423. package/dist/chunks/Callout-yEn9iPlh.js +0 -119
  424. package/dist/chunks/Callout-yEn9iPlh.js.map +0 -1
  425. package/dist/chunks/Checkbox-DHXTUHO9.js +0 -47
  426. package/dist/chunks/Checkbox-DHXTUHO9.js.map +0 -1
  427. package/dist/chunks/ColorField-BcMcW8Sa.js +0 -60
  428. package/dist/chunks/ColorField-BcMcW8Sa.js.map +0 -1
  429. package/dist/chunks/ComboBox-DpT8lc3p.js +0 -138
  430. package/dist/chunks/ComboBox-DpT8lc3p.js.map +0 -1
  431. package/dist/chunks/CurveEditor-BDJXjEvK.js.map +0 -1
  432. package/dist/chunks/DataGrid-D-dZj1BD.js.map +0 -1
  433. package/dist/chunks/DetailList-BMER1LUZ.js +0 -43
  434. package/dist/chunks/DetailList-BMER1LUZ.js.map +0 -1
  435. package/dist/chunks/Dialog-BWyNMgpf.js +0 -66
  436. package/dist/chunks/Dialog-BWyNMgpf.js.map +0 -1
  437. package/dist/chunks/Disclosure-0G0uh2fa.js.map +0 -1
  438. package/dist/chunks/DragHandleGlyph-Dr7Fgo0I.js.map +0 -1
  439. package/dist/chunks/Field--onYxXTF.js +0 -32
  440. package/dist/chunks/Field--onYxXTF.js.map +0 -1
  441. package/dist/chunks/FillStrokeSwatch-DNb0KXPk.js +0 -111
  442. package/dist/chunks/FillStrokeSwatch-DNb0KXPk.js.map +0 -1
  443. package/dist/chunks/FontFamilySelect-DXlMKWfK.js.map +0 -1
  444. package/dist/chunks/GradientEditor-B3a-MsVJ.js +0 -335
  445. package/dist/chunks/GradientEditor-B3a-MsVJ.js.map +0 -1
  446. package/dist/chunks/Icon-Cgzy8VgC.js.map +0 -1
  447. package/dist/chunks/InlineRange-eOj6JpJl.js.map +0 -1
  448. package/dist/chunks/Input-CHmkfYaD.js.map +0 -1
  449. package/dist/chunks/ItemList-Cm-HUWCi.js.map +0 -1
  450. package/dist/chunks/Jog-DESxZ44P.js.map +0 -1
  451. package/dist/chunks/Keycaps-C0H_v2gO.js.map +0 -1
  452. package/dist/chunks/LayerList-nz-QYvTF.js.map +0 -1
  453. package/dist/chunks/ListEditor-BQ6AV3Ac.js +0 -74
  454. package/dist/chunks/ListEditor-BQ6AV3Ac.js.map +0 -1
  455. package/dist/chunks/MenuButton-DtaGenKf.js +0 -70
  456. package/dist/chunks/MenuButton-DtaGenKf.js.map +0 -1
  457. package/dist/chunks/MeshEditor-qqGc6hlD.js +0 -87
  458. package/dist/chunks/MeshEditor-qqGc6hlD.js.map +0 -1
  459. package/dist/chunks/NumberField-CwJOMmQR.js +0 -117
  460. package/dist/chunks/NumberField-CwJOMmQR.js.map +0 -1
  461. package/dist/chunks/PaintField-DaJukRc6.js +0 -62
  462. package/dist/chunks/PaintField-DaJukRc6.js.map +0 -1
  463. package/dist/chunks/PaintInput-Byhna3H-.js +0 -131
  464. package/dist/chunks/PaintInput-Byhna3H-.js.map +0 -1
  465. package/dist/chunks/PatternPicker-B-cUt-JT.js +0 -93
  466. package/dist/chunks/PatternPicker-B-cUt-JT.js.map +0 -1
  467. package/dist/chunks/Plot2D-CTXHkL5p.js.map +0 -1
  468. package/dist/chunks/Prefs-DpqFKiwY.js.map +0 -1
  469. package/dist/chunks/Properties-D_KzDN9K.js.map +0 -1
  470. package/dist/chunks/PropertyField-DGCecAnV.js +0 -758
  471. package/dist/chunks/PropertyField-DGCecAnV.js.map +0 -1
  472. package/dist/chunks/RangeSlider-BKRRTPTZ.js.map +0 -1
  473. package/dist/chunks/ResizeHandle-BKT0XYpx.js +0 -79
  474. package/dist/chunks/ResizeHandle-BKT0XYpx.js.map +0 -1
  475. package/dist/chunks/Select-CzyfaXzp.js +0 -225
  476. package/dist/chunks/Select-CzyfaXzp.js.map +0 -1
  477. package/dist/chunks/SelectionPanel-BgUM1h03.js +0 -103
  478. package/dist/chunks/SelectionPanel-BgUM1h03.js.map +0 -1
  479. package/dist/chunks/SidebarPanel-aoIqxbtq.js +0 -55
  480. package/dist/chunks/SidebarPanel-aoIqxbtq.js.map +0 -1
  481. package/dist/chunks/Slider-CFwQYQ10.js +0 -383
  482. package/dist/chunks/Slider-CFwQYQ10.js.map +0 -1
  483. package/dist/chunks/StatusBar-DzoPDY4k.js.map +0 -1
  484. package/dist/chunks/SwatchGrid-BARC3rnF.js +0 -73
  485. package/dist/chunks/SwatchGrid-BARC3rnF.js.map +0 -1
  486. package/dist/chunks/Timeline--58F7MED.js.map +0 -1
  487. package/dist/chunks/Toast-DNBb-24H.js +0 -128
  488. package/dist/chunks/Toast-DNBb-24H.js.map +0 -1
  489. package/dist/chunks/ToggleBar-DTjGeS0Q.js.map +0 -1
  490. package/dist/chunks/TokenPanel-CMq7uydV.js.map +0 -1
  491. package/dist/chunks/ToolButton-CR4sQlxF.js.map +0 -1
  492. package/dist/chunks/ToolOptionsBar-CtzTlaN2.js.map +0 -1
  493. package/dist/chunks/ToolPalette-CKG9qY6P.js.map +0 -1
  494. package/dist/chunks/Tree-DVOtc9R5.js.map +0 -1
  495. package/dist/chunks/createKeyframeLayer-Czj6Y235.js.map +0 -1
  496. package/dist/chunks/icons-Dk8SRS8g.js.map +0 -1
  497. package/dist/chunks/model-Du7Lta4C.js +0 -360
  498. package/dist/chunks/model-Du7Lta4C.js.map +0 -1
  499. package/dist/chunks/number-D3NEx_8r.js +0 -89
  500. package/dist/chunks/number-D3NEx_8r.js.map +0 -1
  501. package/dist/chunks/portalHost-yTOVuCej.js.map +0 -1
  502. package/dist/chunks/prefField-Dnl7nmjQ.js +0 -197
  503. package/dist/chunks/prefField-Dnl7nmjQ.js.map +0 -1
  504. package/dist/chunks/segmentedControl.module-Bv7DEg8f.js +0 -11
  505. package/dist/chunks/segmentedControl.module-Bv7DEg8f.js.map +0 -1
  506. package/dist/chunks/useReorderDragList-B_-5L5Gu.js +0 -131
  507. package/dist/chunks/useReorderDragList-B_-5L5Gu.js.map +0 -1
  508. package/dist/chunks/useRovingTabIndex-Bp_hYm_h.js +0 -65
  509. package/dist/chunks/useRovingTabIndex-Bp_hYm_h.js.map +0 -1
  510. package/dist/components/DragHandleGlyph/DragHandleGlyph.d.ts.map +0 -1
  511. package/dist/components/DragHandleGlyph/index.d.ts +0 -3
  512. package/dist/components/DragHandleGlyph/index.d.ts.map +0 -1
  513. package/dist/components/DragHandleGlyph/index.js +0 -2
  514. package/dist/format/number.d.ts +0 -56
  515. package/dist/format/number.d.ts.map +0 -1
  516. package/dist/icons/ShapeKindIcon.d.ts +0 -10
  517. package/dist/icons/ShapeKindIcon.d.ts.map +0 -1
@@ -0,0 +1,292 @@
1
+ import { t as e } from "./snap-DRjbOiG9.js";
2
+ import { openPointerSession as t } from "@weasel-js/core";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ import { Fragment as i, useEffect as a, useId as o, useRef as s, useState as c } from "react";
5
+ import { amount as l, decimal as u, qty as d, retag as f } from "@weasel-js/quantity";
6
+ var p = {
7
+ root: "_root_1muzo_1",
8
+ label: "_label_1muzo_11",
9
+ ruler: "_ruler_1muzo_19",
10
+ tick: "_tick_1muzo_25",
11
+ tickLabel: "_tickLabel_1muzo_35",
12
+ bands: "_bands_1muzo_45",
13
+ band: "_band_1muzo_45",
14
+ selected: "_selected_1muzo_92",
15
+ bandContent: "_bandContent_1muzo_99",
16
+ bandGhost: "_bandGhost_1muzo_107",
17
+ seamGhost: "_seamGhost_1muzo_118",
18
+ seam: "_seam_1muzo_118"
19
+ };
20
+ //#endregion
21
+ //#region src/components/BandEditor/scale.ts
22
+ function m(e) {
23
+ return e < 0 ? 0 : e > 1 ? 1 : e;
24
+ }
25
+ var h = {
26
+ toUnit: (e, t, n) => n === t ? 0 : (e - t) / (n - t),
27
+ fromUnit: (e, t, n) => t + e * (n - t)
28
+ }, g = {
29
+ toUnit: (e, t, n) => {
30
+ let r = Math.log(t), i = Math.log(n);
31
+ return i === r ? 0 : (Math.log(e) - r) / (i - r);
32
+ },
33
+ fromUnit: (e, t, n) => {
34
+ let r = Math.log(t);
35
+ return Math.exp(r + e * (Math.log(n) - r));
36
+ }
37
+ }, _ = !1;
38
+ function v() {
39
+ return typeof process < "u" ? process.env.NODE_ENV !== "production" : !0;
40
+ }
41
+ function y(e, t) {
42
+ let n = e === void 0 || e === "log" ? g : e === "linear" ? h : e;
43
+ return n !== g || t > 0 ? n : (v() && !_ && (_ = !0, console.warn(`BandEditor: a log scale needs min > 0, but min is ${t}. Falling back to a linear scale. Pass scale="linear" to silence this.`)), h);
44
+ }
45
+ //#endregion
46
+ //#region src/components/BandEditor/bands.ts
47
+ function b(e, t) {
48
+ let n = e.map((e) => ({ ...e }));
49
+ return n.length > 0 && (n[0].from = t), n;
50
+ }
51
+ function x(e, t, n, r) {
52
+ return [t === 0 ? n : e[t].from, t === e.length - 1 ? r : e[t + 1].from];
53
+ }
54
+ function S(e, t, n, r) {
55
+ return [t === 0 ? n : e[t].from, t + 2 <= e.length - 1 ? e[t + 2].from : r];
56
+ }
57
+ function C(e, t, n, r, i) {
58
+ let [a, o] = S(e, t, r, i);
59
+ return Math.max(a, Math.min(o, n));
60
+ }
61
+ function w(e, t, n) {
62
+ if (e[t + 1] === void 0 || e[t + 1].from === n) return e;
63
+ let r = e.map((e) => ({ ...e }));
64
+ return r[t + 1].from = n, r;
65
+ }
66
+ function ee(e, t, n, r) {
67
+ let i = e.map((e, i) => i === 0 ? 0 : m(t.toUnit(e.from, n, r)));
68
+ return i.push(1), i;
69
+ }
70
+ function te(e, t, n) {
71
+ let r = t === 0, i = t === e.length - 2;
72
+ if (r || i) return 0;
73
+ let a = e[t - 1] - e[t], o = e[t + 2] - e[t + 1];
74
+ return Math.max(a, Math.min(o, n));
75
+ }
76
+ function ne(e, t, n, r) {
77
+ let i = e.map((e) => ({ ...e }));
78
+ return i[t].from = n, i[t + 1] !== void 0 && (i[t + 1].from = r), i;
79
+ }
80
+ function re(e, t, n, r, i) {
81
+ if (e.length === 0 || t <= n || t >= r) return e;
82
+ let a = -1;
83
+ for (let i = 0; i < e.length; i++) {
84
+ let [o, s] = x(e, i, n, r);
85
+ if (t > o && t < s) {
86
+ a = i;
87
+ break;
88
+ }
89
+ }
90
+ if (a < 0) return e;
91
+ let o = e.map((e) => ({ ...e }));
92
+ return o.splice(a + 1, 0, {
93
+ from: t,
94
+ data: i(t, e[a].data)
95
+ }), o;
96
+ }
97
+ function ie(e, t) {
98
+ return t <= 0 || t >= e.length ? e : e.filter((e, n) => n !== t).map((e) => ({ ...e }));
99
+ }
100
+ //#endregion
101
+ //#region src/components/BandEditor/BandEditor.tsx
102
+ var T = u();
103
+ function E(e) {
104
+ return typeof e.from == "number" ? e : {
105
+ from: l(e.from),
106
+ data: e.data
107
+ };
108
+ }
109
+ function D(e, t) {
110
+ let n = e.find((e) => typeof e.from != "number");
111
+ return n ? t.map((r, i) => {
112
+ let a = (t.length === e.length ? e[i] : e.find((e) => e.data === r.data)) ?? n;
113
+ return {
114
+ from: f(a.from, r.from),
115
+ data: r.data
116
+ };
117
+ }) : t;
118
+ }
119
+ var O = .01;
120
+ function k(e) {
121
+ return `${m(e) * 100}%`;
122
+ }
123
+ function A(e, t) {
124
+ return t;
125
+ }
126
+ function ae(e) {
127
+ if (!(e instanceof HTMLElement)) return !1;
128
+ if (e.isContentEditable) return !0;
129
+ let t = e.tagName;
130
+ return t === "INPUT" || t === "TEXTAREA" || t === "SELECT";
131
+ }
132
+ function j(l) {
133
+ let { value: u, display: f = T, min: h, max: g, scale: _, ticks: v, renderBand: j, selectedIndex: M, onSelect: N, label: P, className: F } = l, I = l.snap ?? !0, oe = l.splitBand ?? A, L = s(null), R = s(null);
134
+ a(() => () => {
135
+ R.current?.cancel();
136
+ }, []);
137
+ let z = o(), [B, V] = c(null), H = u.map(E), U = (e) => D(u, e), W = l.onInput && ((e) => l.onInput?.(U(e))), G = (e) => l.onChange(U(e)), K = b(H, h), q = B?.bands ?? K, J = U(q), Y = y(_, h), X = (e) => m(Y.toUnit(e, h, g)), Z = (e) => Y.fromUnit(m(e), h, g), se = () => L.current?.getBoundingClientRect().width ?? 0, Q = (e) => {
138
+ let t = L.current?.getBoundingClientRect();
139
+ return !t || t.width === 0 ? 0 : m((e - t.left) / t.width);
140
+ }, ce = (t, n) => {
141
+ if (!I || n || !v || v.length === 0) return t;
142
+ let r = se();
143
+ return r === 0 ? t : e(t, v.map((e) => X(e.at)), 6 / r);
144
+ }, $ = (e, n, r) => {
145
+ R.current?.cancel(), R.current = t(e.currentTarget, e, {
146
+ onMove: n,
147
+ onEnd: () => {
148
+ R.current = null, V(null), r();
149
+ },
150
+ onCancel: () => {
151
+ R.current = null, V(null);
152
+ }
153
+ }, { capture: !1 });
154
+ }, le = (e) => (t) => {
155
+ if (typeof t.button == "number" && t.button > 0) return;
156
+ t.preventDefault(), t.stopPropagation();
157
+ let n = K, r = null;
158
+ $(t, (t) => {
159
+ let i = C(n, e, Z(ce(Q(t.clientX), t.altKey)), h, g);
160
+ r = w(n, e, i), V({
161
+ bands: r,
162
+ ghost: { seam: e }
163
+ }), W?.(r);
164
+ }, () => {
165
+ r && G(r);
166
+ });
167
+ }, ue = (e) => (t) => {
168
+ let [n, r] = S(K, e, h, g), i;
169
+ if (t.key === "Home") i = n;
170
+ else if (t.key === "End") i = r;
171
+ else {
172
+ let n = 0;
173
+ if (t.key === "ArrowRight" || t.key === "ArrowUp") n = t.shiftKey ? O * 10 : O;
174
+ else if (t.key === "ArrowLeft" || t.key === "ArrowDown") n = t.shiftKey ? -.1 : -.01;
175
+ else return;
176
+ i = Z(X(K[e + 1].from) + n);
177
+ }
178
+ t.preventDefault();
179
+ let a = w(K, e, C(K, e, i, h, g));
180
+ a !== K && G(a);
181
+ }, de = (e) => (t) => {
182
+ if (typeof t.button == "number" && t.button > 0 || (e !== M && N?.(e), e === 0 || e === K.length - 1)) return;
183
+ let n = K, r = ee(n, Y, h, g), i = Q(t.clientX), a = null;
184
+ $(t, (t) => {
185
+ let o = te(r, e, Q(t.clientX) - i);
186
+ a = ne(n, e, Z(r[e] + o), Z(r[e + 1] + o)), V({
187
+ bands: a,
188
+ ghost: { band: e }
189
+ }), W?.(a);
190
+ }, () => {
191
+ a && G(a);
192
+ });
193
+ }, fe = (e) => () => {
194
+ e !== M && N?.(e);
195
+ };
196
+ return /* @__PURE__ */ r("div", {
197
+ className: [p.root, F].filter(Boolean).join(" "),
198
+ role: "group",
199
+ "aria-label": typeof P == "string" ? P : void 0,
200
+ "aria-labelledby": P !== void 0 && typeof P != "string" ? z : void 0,
201
+ onKeyDown: (e) => {
202
+ if (e.key !== "x" && e.key !== "Delete" || e.metaKey || e.ctrlKey || e.altKey || ae(e.target) || M == null) return;
203
+ let t = ie(K, M);
204
+ t !== K && (e.preventDefault(), G(t), N?.(M - 1));
205
+ },
206
+ children: [
207
+ P !== void 0 && /* @__PURE__ */ n("div", {
208
+ id: z,
209
+ className: p.label,
210
+ children: P
211
+ }),
212
+ /* @__PURE__ */ n("div", {
213
+ className: p.ruler,
214
+ ref: L,
215
+ "data-band-ruler": "",
216
+ onPointerDown: (e) => {
217
+ if (typeof e.button == "number" && e.button > 0) return;
218
+ e.preventDefault();
219
+ let t = re(K, Z(Q(e.clientX)), h, g, oe);
220
+ t !== K && G(t);
221
+ },
222
+ children: v?.map((e, t) => /* @__PURE__ */ n("span", {
223
+ className: p.tick,
224
+ "data-tick-at": e.at,
225
+ style: { "--be-at": k(X(e.at)) },
226
+ children: (e.label !== void 0 || l.display !== void 0) && /* @__PURE__ */ n("span", {
227
+ className: p.tickLabel,
228
+ children: e.label ?? d(e.at, l.display).text
229
+ })
230
+ }, t))
231
+ }),
232
+ /* @__PURE__ */ r("div", {
233
+ className: p.bands,
234
+ children: [
235
+ q.map((e, t) => {
236
+ let [a, o] = x(q, t, h, g), s = M === t;
237
+ return /* @__PURE__ */ r(i, { children: [/* @__PURE__ */ n("button", {
238
+ type: "button",
239
+ className: [p.band, s ? p.selected : null].filter(Boolean).join(" "),
240
+ style: {
241
+ "--be-from": k(X(a)),
242
+ "--be-to": k(X(o))
243
+ },
244
+ "aria-label": `Band ${t + 1}`,
245
+ "aria-pressed": s,
246
+ "data-band-index": t,
247
+ onPointerDown: de(t),
248
+ onFocus: fe(t),
249
+ children: /* @__PURE__ */ n("span", {
250
+ className: p.bandContent,
251
+ children: j?.(J[t], t)
252
+ })
253
+ }), t < q.length - 1 && /* @__PURE__ */ n("div", {
254
+ role: "slider",
255
+ tabIndex: 0,
256
+ className: p.seam,
257
+ style: { "--be-at": k(X(q[t + 1].from)) },
258
+ "aria-label": `Seam ${t + 1}`,
259
+ "aria-orientation": "horizontal",
260
+ "aria-valuemin": S(q, t, h, g)[0],
261
+ "aria-valuemax": S(q, t, h, g)[1],
262
+ "aria-valuenow": q[t + 1].from,
263
+ "aria-valuetext": d(J[t + 1].from, f).spoken,
264
+ "data-seam-index": t,
265
+ onPointerDown: le(t),
266
+ onKeyDown: ue(t)
267
+ })] }, t);
268
+ }),
269
+ B && "band" in B.ghost && /* @__PURE__ */ n("div", {
270
+ className: p.bandGhost,
271
+ "data-band-ghost": "",
272
+ "aria-hidden": "true",
273
+ style: {
274
+ "--be-from": k(X(x(K, B.ghost.band, h, g)[0])),
275
+ "--be-to": k(X(x(K, B.ghost.band, h, g)[1]))
276
+ }
277
+ }),
278
+ B && "seam" in B.ghost && /* @__PURE__ */ n("div", {
279
+ className: p.seamGhost,
280
+ "data-band-ghost": "",
281
+ "aria-hidden": "true",
282
+ style: { "--be-at": k(X(K[B.ghost.seam + 1].from)) }
283
+ })
284
+ ]
285
+ })
286
+ ]
287
+ });
288
+ }
289
+ //#endregion
290
+ export { h as n, g as r, j as t };
291
+
292
+ //# sourceMappingURL=BandEditor-Dd0egAgE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BandEditor-Dd0egAgE.js","names":["s","Fragment","snapToNearest","Fragment$1","BandEditor_module_default","clamp01","u","linearScale","max","min","value","unit","logScale","lo","hi","warnedNonPositiveMin","isDev","resolveScale","requested","scale","normalizeBands","bands","b","bandBounds","index","seamBounds","clampSeamTo","to","setSeam","next","unitEdges","edges","clampBandShift","isFirst","isLast","shift","moveBandEdges","from","splitBands","at","makeData","mergeBand","i","SEAM_DISPLAY","decimal","untag","band","amount","retagBands","firstTagged","input","source","retag","KEY_STEP","pct","keepData","isTextEntry","target","tag","BandEditor","tagged","props","snap","splitBand","trackRef","useRef","sessionRef","labelId","useId","draft","setDraft","useState","retagged","onInput","onChange","committed","shown","sc","toUnit","v","fromUnit","trackWidth","unitAt","rect","clientX","snapped","altKey","ticks","width","tick","drag","openPointerSession","down","onEnd","onSeamPointerDown","e","base","latest","ev","onSeamKeyDown","delta","onBandPointerDown","selectedIndex","onSelect","startUnit","onBandFocus","className","label","qty","isSelected","renderBand","display"],"sources":["../../src/components/BandEditor/BandEditor.module.css","../../src/components/BandEditor/scale.ts","../../src/components/BandEditor/bands.ts","../../src/components/BandEditor/BandEditor.tsx"],"sourcesContent":[".root {\n position: relative;\n user-select: none;\n -webkit-user-select: none;\n touch-action: none;\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-1);\n}\n\n.label {\n font: var(--wzl-font-weight-medium) var(--wzl-font-size-sm) / var(--wzl-leading-tight) var(--wzl-font-ui);\n color: var(--wzl-fg-muted);\n}\n\n/* The ruler carries the ticks and is the split affordance: a click anywhere\n * on it divides the band underneath. The band strip below owns selection and\n * body drags, so neither gesture has to guess which the pointer meant. */\n.ruler {\n position: relative;\n height: var(--be-ruler-height, 20px);\n cursor: crosshair;\n}\n\n.tick {\n position: absolute;\n left: var(--be-at);\n bottom: 0;\n width: 1px;\n height: 6px;\n background: var(--wzl-fg-subtle);\n pointer-events: none;\n}\n\n.tickLabel {\n position: absolute;\n bottom: 7px;\n left: 0;\n transform: translateX(-50%);\n font: var(--wzl-font-weight-medium) var(--wzl-font-size-xs) / var(--wzl-leading-tight) var(--wzl-font-mono);\n color: var(--wzl-fg-muted);\n white-space: nowrap;\n}\n\n.bands {\n position: relative;\n height: var(--be-band-height, 34px);\n}\n\n.band {\n position: absolute;\n top: 0;\n bottom: 0;\n left: var(--be-from);\n width: calc(var(--be-to) - var(--be-from));\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n padding: 0 var(--wzl-space-2);\n margin: 0;\n background: var(--wzl-surface-raised);\n border: 1px solid var(--wzl-border);\n border-radius: var(--wzl-radius-sm);\n color: var(--wzl-fg);\n font: var(--wzl-font-weight-medium) var(--wzl-font-size-sm) / var(--wzl-leading-tight) var(--wzl-font-ui);\n cursor: grab;\n}\n\n.band:hover {\n background: var(--wzl-surface-hover);\n}\n\n.band:active {\n cursor: grabbing;\n}\n\n.band:focus-visible {\n outline: 2px solid var(--wzl-accent);\n outline-offset: -2px;\n}\n\n/* First and last bands are pinned to `min` / `max`, so their bodies do not\n * translate — the cursor should not promise otherwise. */\n.band:first-of-type,\n.band:last-of-type {\n cursor: default;\n}\n\n/* Accent mixed toward transparent rather than a flat token, so the tint\n reads over whatever surface the consumer's theme puts behind it. */\n.selected {\n background: color-mix(in srgb, var(--wzl-accent) 22%, transparent);\n border-color: var(--wzl-accent);\n box-shadow: inset 0 0 0 1px var(--wzl-accent);\n color: var(--wzl-fg);\n}\n\n.bandContent {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n pointer-events: none;\n}\n\n/* Where a dragged band or seam started, held until the drag ends. */\n.bandGhost {\n position: absolute;\n top: 0;\n bottom: 0;\n left: var(--be-from);\n width: calc(var(--be-to) - var(--be-from));\n border: 1px dashed var(--wzl-border-strong);\n border-radius: var(--wzl-radius-sm);\n pointer-events: none;\n}\n\n.seamGhost {\n position: absolute;\n left: var(--be-at);\n top: -3px;\n bottom: -3px;\n width: 0;\n border-left: 1px dashed var(--wzl-border-strong);\n pointer-events: none;\n}\n\n/* Wider than the line it draws: a 1px seam is unhittable. */\n.seam {\n position: absolute;\n left: var(--be-at);\n top: -3px;\n bottom: -3px;\n width: 11px;\n margin-left: -5px;\n z-index: 1;\n cursor: ew-resize;\n background: none;\n border: none;\n}\n\n.seam::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: 5px;\n width: 1px;\n background: var(--wzl-border-strong);\n}\n\n.seam:hover::before,\n.seam:focus-visible::before {\n background: var(--wzl-accent);\n width: 2px;\n}\n\n.seam:focus-visible {\n outline: 2px solid var(--wzl-accent);\n outline-offset: 0;\n border-radius: var(--wzl-radius-sm);\n}\n","/** Maps a domain value onto its position along the track, and back. */\nexport interface BandScale {\n /** Domain → position in [0,1]. Must be monotonic increasing. */\n toUnit(value: number, min: number, max: number): number;\n /** Inverse of `toUnit`. */\n fromUnit(unit: number, min: number, max: number): number;\n}\n\nexport function clamp01(u: number): number {\n return u < 0 ? 0 : u > 1 ? 1 : u;\n}\n\n/** Even domain steps take even track steps. */\nexport const linearScale: BandScale = {\n toUnit: (value, min, max) => (max === min ? 0 : (value - min) / (max - min)),\n fromUnit: (unit, min, max) => min + unit * (max - min),\n};\n\n/** Even *ratios* take even track steps. Requires `min > 0`. */\nexport const logScale: BandScale = {\n toUnit: (value, min, max) => {\n const lo = Math.log(min);\n const hi = Math.log(max);\n return hi === lo ? 0 : (Math.log(value) - lo) / (hi - lo);\n },\n fromUnit: (unit, min, max) => {\n const lo = Math.log(min);\n return Math.exp(lo + unit * (Math.log(max) - lo));\n },\n};\n\nlet warnedNonPositiveMin = false;\n\nfunction isDev(): boolean {\n return typeof process !== 'undefined' ? process.env.NODE_ENV !== 'production' : true;\n}\n\n/**\n * Resolves the `scale` prop, substituting `linearScale` for a `logScale`\n * that `min` would send to `NaN`.\n */\nexport function resolveScale(\n scale: 'linear' | 'log' | BandScale | undefined,\n min: number,\n): BandScale {\n const requested =\n scale === undefined || scale === 'log'\n ? logScale\n : scale === 'linear'\n ? linearScale\n : scale;\n\n if (requested !== logScale || min > 0) return requested;\n\n if (isDev() && !warnedNonPositiveMin) {\n warnedNonPositiveMin = true;\n console.warn(\n `BandEditor: a log scale needs min > 0, but min is ${min}. Falling back to a linear scale. ` +\n `Pass scale=\"linear\" to silence this.`,\n );\n }\n return linearScale;\n}\n","import type { Quantity } from '@weasel-js/quantity';\nimport type { BandScale } from './scale';\nimport { clamp01 } from './scale';\n\n/** One band. `from` may be a tagged quantity, which keeps its display and\n * unit through every edit: see `BandEditor`. */\nexport interface Band<T, F extends Quantity = number> {\n /** Domain value where this band starts. The first band's is normalized to `min`. */\n from: F;\n data: T;\n}\n\n/**\n * A band list covers `[min, max]` exactly: N bands, N−1 interior seams, no\n * gaps and no overlaps. Seam *k* is `bands[k + 1].from`, and lives between\n * `bands[k].from` and the start of the band after next (or `max`).\n *\n * Every function here preserves that. Each returns the array it was given\n * when the edit would be a no-op, so callers can skip a callback with `===`.\n */\n\n/** Pins the first band's start to `min`; leaves the rest alone. */\nexport function normalizeBands<T>(value: readonly Band<T>[], min: number): Band<T>[] {\n const bands = value.map((b) => ({ ...b }));\n if (bands.length > 0) bands[0].from = min;\n return bands;\n}\n\n/** `[from, to]` of band `index` in domain space. */\nexport function bandBounds<T>(\n bands: readonly Band<T>[],\n index: number,\n min: number,\n max: number,\n): [number, number] {\n const from = index === 0 ? min : bands[index].from;\n const to = index === bands.length - 1 ? max : bands[index + 1].from;\n return [from, to];\n}\n\n/** How far seam `index` can travel before it would cross a neighbour. */\nexport function seamBounds<T>(\n bands: readonly Band<T>[],\n index: number,\n min: number,\n max: number,\n): [number, number] {\n const lo = index === 0 ? min : bands[index].from;\n const hi = index + 2 <= bands.length - 1 ? bands[index + 2].from : max;\n return [lo, hi];\n}\n\n/** Clamps a target position for seam `index` to its neighbours, inclusive. */\nexport function clampSeamTo<T>(\n bands: readonly Band<T>[],\n index: number,\n to: number,\n min: number,\n max: number,\n): number {\n const [lo, hi] = seamBounds(bands, index, min, max);\n return Math.max(lo, Math.min(hi, to));\n}\n\nexport function setSeam<T>(bands: readonly Band<T>[], index: number, to: number): Band<T>[] {\n if (bands[index + 1] === undefined || bands[index + 1].from === to) return bands as Band<T>[];\n const next = bands.map((b) => ({ ...b }));\n next[index + 1].from = to;\n return next;\n}\n\n/** Band edges as track positions: `length + 1` values from 0 to 1. */\nexport function unitEdges<T>(\n bands: readonly Band<T>[],\n scale: BandScale,\n min: number,\n max: number,\n): number[] {\n const edges = bands.map((b, i) => (i === 0 ? 0 : clamp01(scale.toUnit(b.from, min, max))));\n edges.push(1);\n return edges;\n}\n\n/**\n * Largest part of `shift` band `index` can take without pushing a neighbour's\n * far edge past it. Zero for the first and last band, whose outer edges are\n * `min` and `max` and do not move.\n */\nexport function clampBandShift(edges: readonly number[], index: number, shift: number): number {\n const isFirst = index === 0;\n const isLast = index === edges.length - 2;\n if (isFirst || isLast) return 0;\n const lo = edges[index - 1] - edges[index];\n const hi = edges[index + 2] - edges[index + 1];\n return Math.max(lo, Math.min(hi, shift));\n}\n\n/** Moves both edges of band `index`, which is the same as moving two seams. */\nexport function moveBandEdges<T>(\n bands: readonly Band<T>[],\n index: number,\n from: number,\n to: number,\n): Band<T>[] {\n const next = bands.map((b) => ({ ...b }));\n next[index].from = from;\n if (next[index + 1] !== undefined) next[index + 1].from = to;\n return next;\n}\n\n/**\n * Splits the band containing `at` in two, the new band starting there.\n * A position already on a seam or on `min` / `max` splits nothing.\n */\nexport function splitBands<T>(\n bands: readonly Band<T>[],\n at: number,\n min: number,\n max: number,\n makeData: (at: number, from: T) => T,\n): Band<T>[] {\n if (bands.length === 0 || at <= min || at >= max) return bands as Band<T>[];\n let index = -1;\n for (let i = 0; i < bands.length; i++) {\n const [from, to] = bandBounds(bands, i, min, max);\n if (at > from && at < to) {\n index = i;\n break;\n }\n }\n if (index < 0) return bands as Band<T>[];\n const next = bands.map((b) => ({ ...b }));\n next.splice(index + 1, 0, { from: at, data: makeData(at, bands[index].data) });\n return next;\n}\n\n/**\n * Merges band `index` into its left neighbour, which keeps its payload and\n * absorbs the span. The first band has no left neighbour and cannot be\n * merged away — a partition always has at least one part.\n */\nexport function mergeBand<T>(bands: readonly Band<T>[], index: number): Band<T>[] {\n if (index <= 0 || index >= bands.length) return bands as Band<T>[];\n return bands.filter((_, i) => i !== index).map((b) => ({ ...b }));\n}\n","import {\n Fragment,\n useEffect,\n useId,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { openPointerSession, type PointerSession } from '@weasel-js/core';\nimport { amount, decimal, qty, retag, type Display, type Quantity } from '@weasel-js/quantity';\nimport s from './BandEditor.module.css';\nimport { SNAP_RADIUS_PX, snapToNearest } from '../../snap';\nimport { clamp01, resolveScale, type BandScale } from './scale';\nimport {\n bandBounds,\n clampBandShift,\n clampSeamTo,\n mergeBand,\n moveBandEdges,\n normalizeBands,\n seamBounds,\n setSeam,\n splitBands,\n unitEdges,\n type Band,\n} from './bands';\n\nexport type { Band, BandScale };\n\n/** Props for {@link BandEditor}. */\nexport interface BandEditorProps<T, F extends Quantity = number> {\n /** Ascending by `from`. `value[0].from` is normalized to `min` on read. A\n * tagged `from` stays tagged through every edit, with its display and unit. */\n value: Band<T, F>[];\n /** Live during a drag — wire for preview, do not write to history. */\n onInput?: (next: Band<T, F>[]) => void;\n /** Committed at gesture end: one call per gesture. */\n onChange: (next: Band<T, F>[]) => void;\n min: number;\n max: number;\n /** Default `'log'`. */\n scale?: 'linear' | 'log' | BandScale;\n /** A tick with no `label` of its own is labeled through `display`, when given. */\n ticks?: { at: number; label?: ReactNode }[];\n /**\n * How a seam's value shows and is spoken — `fraction()` makes a seam at\n * 1/12 announce `1 over 12` rather than `0.08333333333333333`. A tagged\n * `from` uses its own display instead. Default: three decimals.\n */\n display?: Display;\n /** Snap a dragged seam to a tick within ~6px. Default true; `alt` defeats it per-drag. */\n snap?: boolean;\n renderBand?: (band: Band<T, F>, index: number) => ReactNode;\n selectedIndex?: number | null;\n onSelect?: (index: number) => void;\n /** Payload for a band split off an existing one. Default duplicates `from`. */\n splitBand?: (at: number, from: T) => T;\n label?: ReactNode;\n className?: string;\n}\n\n/** A drag under way: the bands as the pointer has them, and which edges it took from where. */\ntype Draft<T> = { bands: Band<T>[]; ghost: { seam: number } | { band: number } };\n\nconst SEAM_DISPLAY = decimal();\n\nfunction untag<T, F extends Quantity>(band: Band<T, F>): Band<T> {\n return typeof band.from === 'number' ? (band as Band<T>) : { from: amount(band.from), data: band.data };\n}\n\n/**\n * `next` with each `from` in the shape the consumer gave it. A band keeps the\n * tag of the band at its index when the count is unchanged; after a split or\n * a merge it takes the tag of the input band carrying the same payload, else\n * the first tagged one — a split band inherits its parent's presentation.\n */\nfunction retagBands<T, F extends Quantity>(input: readonly Band<T, F>[], next: readonly Band<T>[]): Band<T, F>[] {\n const firstTagged = input.find((b) => typeof b.from !== 'number');\n if (!firstTagged) return next as Band<T, F>[];\n return next.map((band, i) => {\n const source =\n (next.length === input.length ? input[i] : input.find((b) => b.data === band.data)) ?? firstTagged;\n return { from: retag(source.from, band.from), data: band.data };\n });\n}\n\n/** One arrow-key step, as a fraction of the track. */\nconst KEY_STEP = 0.01;\n\nfunction pct(unit: number): string {\n return `${clamp01(unit) * 100}%`;\n}\n\nfunction keepData<T>(_at: number, from: T): T {\n return from;\n}\n\nfunction isTextEntry(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.isContentEditable) return true;\n const tag = target.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';\n}\n\n/**\n * Divides a numeric axis into contiguous bands and lets you drag the seams\n * between them. Each band carries a payload the consumer supplies and\n * renders through `renderBand`; the control itself knows nothing about what\n * a band means.\n *\n * The axis is always fully covered — N bands, N−1 interior seams, no gaps and\n * no overlaps — so editing is editing a sorted list of seam positions. Seams\n * clamp at their neighbours rather than crossing, which means a drag can\n * never destroy a band: removal is only ever the explicit `x` / `Delete`\n * merge. The first band is doubly exceptional, its left edge pinned to `min`\n * and its body immovable, and it has no left neighbour to merge into.\n *\n * | Gesture | Effect |\n * |---|---|\n * | drag a seam | resize the two bands either side |\n * | drag a band body | move both its seams, preserving its span |\n * | click the ruler | split the band under the pointer |\n * | `x` / `Delete` | merge the selected band into its left neighbour |\n * | click a band | select it |\n * | `←` `→` on a focused seam | move it by one step; `shift` for ten |\n *\n * `scale` defaults to `'log'`, because the interesting part of a width axis\n * is usually its narrow end.\n */\nexport function BandEditor<T, F extends Quantity = number>(props: BandEditorProps<T, F>): ReactElement {\n const {\n value: tagged,\n display = SEAM_DISPLAY,\n min,\n max,\n scale,\n ticks,\n renderBand,\n selectedIndex,\n onSelect,\n label,\n className,\n } = props;\n const snap = props.snap ?? true;\n const splitBand = props.splitBand ?? keepData;\n\n const trackRef = useRef<HTMLDivElement | null>(null);\n const sessionRef = useRef<PointerSession | null>(null);\n useEffect(() => () => { sessionRef.current?.cancel(); }, []);\n const labelId = useId();\n const [draft, setDraft] = useState<Draft<T> | null>(null);\n const value = tagged.map(untag);\n const retagged = (next: Band<T>[]): Band<T, F>[] => retagBands(tagged, next);\n const onInput = props.onInput && ((next: Band<T>[]) => props.onInput?.(retagged(next)));\n const onChange = (next: Band<T>[]) => props.onChange(retagged(next));\n const committed = normalizeBands(value, min);\n // Drawn from the drag while one is under way, so the control moves with the pointer whether or not the consumer\n // wires `onInput`. Every edit reads `committed`.\n const bands = draft?.bands ?? committed;\n const shown = retagged(bands);\n const sc = resolveScale(scale, min);\n const toUnit = (v: number): number => clamp01(sc.toUnit(v, min, max));\n const fromUnit = (u: number): number => sc.fromUnit(clamp01(u), min, max);\n\n const trackWidth = (): number => trackRef.current?.getBoundingClientRect().width ?? 0;\n\n const unitAt = (clientX: number): number => {\n const rect = trackRef.current?.getBoundingClientRect();\n if (!rect || rect.width === 0) return 0;\n return clamp01((clientX - rect.left) / rect.width);\n };\n\n const snapped = (unit: number, altKey: boolean): number => {\n if (!snap || altKey || !ticks || ticks.length === 0) return unit;\n const width = trackWidth();\n if (width === 0) return unit;\n return snapToNearest(unit, ticks.map((tick) => toUnit(tick.at)), SNAP_RADIUS_PX / width);\n };\n\n // No pointer capture: a band body is a `<button>` whose content the consumer\n // renders, and capture would retarget pointerup and kill the click on it.\n // A drag that ends without a release commits nothing.\n const drag = (\n down: ReactPointerEvent<HTMLElement>,\n onMove: (ev: PointerEvent) => void,\n onEnd: () => void,\n ): void => {\n sessionRef.current?.cancel();\n sessionRef.current = openPointerSession(down.currentTarget, down, {\n onMove,\n onEnd: () => { sessionRef.current = null; setDraft(null); onEnd(); },\n onCancel: () => { sessionRef.current = null; setDraft(null); },\n }, { capture: false });\n };\n\n const onSeamPointerDown = (index: number) => (e: ReactPointerEvent<HTMLDivElement>): void => {\n if (typeof e.button === 'number' && e.button > 0) return;\n e.preventDefault();\n e.stopPropagation();\n const base = committed;\n let latest: Band<T>[] | null = null;\n drag(\n e,\n (ev) => {\n const to = clampSeamTo(base, index, fromUnit(snapped(unitAt(ev.clientX), ev.altKey)), min, max);\n latest = setSeam(base, index, to);\n setDraft({ bands: latest, ghost: { seam: index } });\n onInput?.(latest);\n },\n () => {\n if (latest) onChange(latest);\n },\n );\n };\n\n const onSeamKeyDown = (index: number) => (e: ReactKeyboardEvent<HTMLDivElement>): void => {\n const [lo, hi] = seamBounds(committed, index, min, max);\n let target: number;\n if (e.key === 'Home') target = lo;\n else if (e.key === 'End') target = hi;\n else {\n let delta = 0;\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') delta = e.shiftKey ? KEY_STEP * 10 : KEY_STEP;\n else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') delta = e.shiftKey ? -KEY_STEP * 10 : -KEY_STEP;\n else return;\n target = fromUnit(toUnit(committed[index + 1].from) + delta);\n }\n e.preventDefault();\n const next = setSeam(committed, index, clampSeamTo(committed, index, target, min, max));\n if (next !== committed) onChange(next);\n };\n\n const onBandPointerDown = (index: number) => (e: ReactPointerEvent<HTMLButtonElement>): void => {\n if (typeof e.button === 'number' && e.button > 0) return;\n if (index !== selectedIndex) onSelect?.(index);\n // The first and last bands' outer edges are `min` and `max`, which do not\n // move, so their bodies have nothing to translate.\n if (index === 0 || index === committed.length - 1) return;\n const base = committed;\n const edges = unitEdges(base, sc, min, max);\n const startUnit = unitAt(e.clientX);\n let latest: Band<T>[] | null = null;\n drag(\n e,\n (ev) => {\n const shift = clampBandShift(edges, index, unitAt(ev.clientX) - startUnit);\n latest = moveBandEdges(\n base,\n index,\n fromUnit(edges[index] + shift),\n fromUnit(edges[index + 1] + shift),\n );\n setDraft({ bands: latest, ghost: { band: index } });\n onInput?.(latest);\n },\n () => {\n if (latest) onChange(latest);\n },\n );\n };\n\n const onBandFocus = (index: number) => (): void => {\n if (index !== selectedIndex) onSelect?.(index);\n };\n\n const onTrackPointerDown = (e: ReactPointerEvent<HTMLDivElement>): void => {\n if (typeof e.button === 'number' && e.button > 0) return;\n e.preventDefault();\n const next = splitBands(committed, fromUnit(unitAt(e.clientX)), min, max, splitBand);\n if (next !== committed) onChange(next);\n };\n\n const onRootKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>): void => {\n if (e.key !== 'x' && e.key !== 'Delete') return;\n // `x` is a bare letter and Cmd/Ctrl+X is cut: neither may be swallowed\n // when the keystroke belongs to something a consumer put in a band.\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isTextEntry(e.target)) return;\n if (selectedIndex === null || selectedIndex === undefined) return;\n const next = mergeBand(committed, selectedIndex);\n if (next === committed) return;\n e.preventDefault();\n onChange(next);\n onSelect?.(selectedIndex - 1);\n };\n\n return (\n <div\n className={[s.root, className].filter(Boolean).join(' ')}\n role=\"group\"\n aria-label={typeof label === 'string' ? label : undefined}\n aria-labelledby={label !== undefined && typeof label !== 'string' ? labelId : undefined}\n onKeyDown={onRootKeyDown}\n >\n {label !== undefined && <div id={labelId} className={s.label}>{label}</div>}\n <div className={s.ruler} ref={trackRef} data-band-ruler=\"\" onPointerDown={onTrackPointerDown}>\n {ticks?.map((tick, i) => (\n <span\n key={i}\n className={s.tick}\n data-tick-at={tick.at}\n style={{ '--be-at': pct(toUnit(tick.at)) } as CSSProperties}\n >\n {(tick.label !== undefined || props.display !== undefined) && (\n <span className={s.tickLabel}>{tick.label ?? qty(tick.at, props.display).text}</span>\n )}\n </span>\n ))}\n </div>\n <div className={s.bands}>\n {bands.map((_, i) => {\n const [from, to] = bandBounds(bands, i, min, max);\n const isSelected = selectedIndex === i;\n return (\n <Fragment key={i}>\n <button\n type=\"button\"\n className={[s.band, isSelected ? s.selected : null].filter(Boolean).join(' ')}\n style={{ '--be-from': pct(toUnit(from)), '--be-to': pct(toUnit(to)) } as CSSProperties}\n aria-label={`Band ${i + 1}`}\n aria-pressed={isSelected}\n data-band-index={i}\n onPointerDown={onBandPointerDown(i)}\n onFocus={onBandFocus(i)}\n >\n <span className={s.bandContent}>{renderBand?.(shown[i]!, i)}</span>\n </button>\n {i < bands.length - 1 && (\n <div\n role=\"slider\"\n tabIndex={0}\n className={s.seam}\n style={{ '--be-at': pct(toUnit(bands[i + 1].from)) } as CSSProperties}\n aria-label={`Seam ${i + 1}`}\n aria-orientation=\"horizontal\"\n aria-valuemin={seamBounds(bands, i, min, max)[0]}\n aria-valuemax={seamBounds(bands, i, min, max)[1]}\n aria-valuenow={bands[i + 1].from}\n aria-valuetext={qty(shown[i + 1]!.from, display).spoken}\n data-seam-index={i}\n onPointerDown={onSeamPointerDown(i)}\n onKeyDown={onSeamKeyDown(i)}\n />\n )}\n </Fragment>\n );\n })}\n {draft && 'band' in draft.ghost && (\n <div\n className={s.bandGhost}\n data-band-ghost=\"\"\n aria-hidden=\"true\"\n style={{\n '--be-from': pct(toUnit(bandBounds(committed, draft.ghost.band, min, max)[0])),\n '--be-to': pct(toUnit(bandBounds(committed, draft.ghost.band, min, max)[1])),\n } as CSSProperties}\n />\n )}\n {draft && 'seam' in draft.ghost && (\n <div\n className={s.seamGhost}\n data-band-ghost=\"\"\n aria-hidden=\"true\"\n style={{ '--be-at': pct(toUnit(committed[draft.ghost.seam + 1].from)) } as CSSProperties}\n />\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { t as e } from "./stance-BFQpS_fL.js";
2
- import { r as t, t as n } from "./segmentTooltip-CStYHKzd.js";
2
+ import { r as t, t as n } from "./segmentTooltip-CGxCOWNz.js";
3
3
  import { jsx as r, jsxs as i } from "react/jsx-runtime";
4
4
  import { forwardRef as a } from "react";
5
5
  var o = {
@@ -108,4 +108,4 @@ var c = a(function(a, c) {
108
108
  //#endregion
109
109
  export { c as t };
110
110
 
111
- //# sourceMappingURL=Button-BIdXHQOx.js.map
111
+ //# sourceMappingURL=Button-XB-T75YL.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Button-BIdXHQOx.js","names":["s","useStance","segmentTooltipContent","SegmentTooltip","Button_module_default","Spinner","Button","forwardRef","props","cls","variant","size","fullWidth","pressed","iconOnly","loading","className","showLeading","leadingIcon","stanced","children","style","status","ariaLabel","trailingIcon"],"sources":["../../src/components/Button/Button.module.css","../../src/components/Button/Button.tsx"],"sourcesContent":["/* Aqua-glass button. Every visual parameter is exposed as a CSS custom\n property so the Button Lab can override per-instance via inline style. */\n.button {\n /* ---- Tunables (with Aqua-biased defaults) ---- */\n /* Corner radius = 10% of the button's height (the shorter axis on every\n realistic button shape). Using calc against --btn-height keeps the\n corners circular rather than elliptical, which a % value would\n otherwise produce on a wide-but-short pill. */\n --btn-radius: calc(var(--btn-height) * 0.1);\n --btn-fontweight: var(--wzl-font-weight-medium);\n --btn-fontsize: var(--wzl-font-size);\n --btn-height: var(--wzl-control-h);\n --btn-padx: var(--wzl-space-6);\n\n /* Body gradient — alpha-laced top, opaque bottom. Percentages are\n \"color-mix accent ratio\" so 45% = 45% accent + 55% transparent. */\n --btn-top-alpha: 45%;\n --btn-upper-alpha: 70%;\n --btn-equator: 52%; /* vertical position of the bright-to-deep transition */\n --btn-equator-spread: 12%; /* half-width of the equator transition band */\n --btn-equator-tint: 95%; /* accent vs white at equator */\n --btn-base-tint: 70%; /* accent vs black at base */\n --btn-blur: 6px;\n --btn-saturate: 1.3;\n\n /* Specular gloss (::before) */\n --btn-gloss-top: 0.42;\n --btn-gloss-mid: 0.12;\n --btn-gloss-bottom: 50%; /* inset from bottom — 50% = upper hemisphere */\n\n /* 3D shadows */\n --btn-rim: 0.22;\n --btn-drop-near: 0.30;\n --btn-drop-far: 0.18;\n --btn-inset-hi: 0.42;\n --btn-inset-lo: 0.3;\n\n /* Text — main shadow + a second engraving shadow you can angle.\n `inset-x` / `inset-y` are pre-projected offsets from `inset-angle` so\n the lab can drive them with a single slider. */\n --btn-text-shadow: 0.35;\n --btn-text-inset: 0.55;\n --btn-text-inset-x: 0px;\n --btn-text-inset-y: 1px;\n\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--wzl-space-3);\n border: none;\n border-radius: var(--btn-radius);\n font-family: var(--wzl-font-ui);\n font-weight: var(--btn-fontweight);\n font-style: normal;\n font-size: var(--btn-fontsize);\n height: var(--btn-height);\n padding: 0 var(--btn-padx);\n line-height: 1;\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n isolation: isolate;\n overflow: hidden;\n transition: filter var(--wzl-motion-fast), box-shadow var(--wzl-motion-fast), transform 80ms;\n}\n\n/* Specular gloss — covers the upper hemisphere of the pill with a bright\n white sheen that fades to nothing by the equator. The single detail that\n sells the glass-cylinder illusion. */\n.button::before {\n content: '';\n position: absolute;\n inset: 1px 1px var(--btn-gloss-bottom) 1px;\n /* Top corners hug the button's outline; bottom corners are flat so the\n gloss terminates in a straight line at the equator rather than two\n little arcs that read as `)(` brackets at smaller radii. */\n border-top-left-radius: var(--btn-radius);\n border-top-right-radius: var(--btn-radius);\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n background: linear-gradient(\n 180deg,\n rgba(255, 255, 255, var(--btn-gloss-top)) 0%,\n rgba(255, 255, 255, var(--btn-gloss-mid)) 60%,\n rgba(255, 255, 255, 0) 100%\n );\n pointer-events: none;\n z-index: 1;\n transition: opacity var(--wzl-motion-fast);\n}\n\n.button > * {\n position: relative;\n z-index: 2;\n}\n\n.button:focus-visible {\n outline: 2px solid var(--wzl-focus-ring);\n outline-offset: 1px;\n}\n\n.button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ---------- Sizes — set defaults for the custom props ---------- */\n\n.size_sm { --btn-height: var(--wzl-control-h-sm); --btn-padx: var(--wzl-space-4); --btn-fontsize: var(--wzl-font-size-sm); }\n.size_md { --btn-height: var(--wzl-control-h); --btn-padx: var(--wzl-space-6); --btn-fontsize: var(--wzl-font-size); }\n\n.iconOnly.size_sm { width: var(--wzl-control-h-sm); --btn-padx: 0; }\n.iconOnly.size_md { width: var(--wzl-control-h); --btn-padx: 0; }\n\n/* ---------- Variants ---------- */\n\n/* Primary: tinted aqua glass — body uses --wzl-accent. The upper / equator\n / lower stops are positioned around --btn-equator so dragging the equator\n shifts the entire transition zone as one block. */\n.variant_primary {\n background: linear-gradient(\n 180deg,\n color-mix(in srgb, var(--wzl-accent) var(--btn-top-alpha), transparent) 0%,\n color-mix(in srgb, var(--wzl-accent) var(--btn-upper-alpha), transparent) calc(var(--btn-equator) - var(--btn-equator-spread)),\n color-mix(in srgb, var(--wzl-accent) var(--btn-equator-tint), white) var(--btn-equator),\n var(--wzl-accent) calc(var(--btn-equator) + var(--btn-equator-spread) * 1.6),\n color-mix(in srgb, var(--wzl-accent) var(--btn-base-tint), black) 100%\n );\n backdrop-filter: blur(var(--btn-blur)) saturate(var(--btn-saturate));\n -webkit-backdrop-filter: blur(var(--btn-blur)) saturate(var(--btn-saturate));\n color: var(--wzl-fg-on-accent);\n /* Main shadow below for legibility, then a second engraving shadow at a\n configurable angle (defaults below) — a near-black, lower-alpha stamp\n that sits underneath the glyphs and reads as recessed type. */\n text-shadow:\n 0 1px 0 rgba(0, 0, 0, var(--btn-text-shadow)),\n var(--btn-text-inset-x) var(--btn-text-inset-y) 0 rgba(0, 0, 0, var(--btn-text-inset)),\n 0 0 6px rgba(0, 0, 0, calc(var(--btn-text-shadow) * 0.5));\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, var(--btn-inset-hi)),\n inset 0 -1px 2px rgba(0, 0, 0, var(--btn-inset-lo)),\n 0 0 0 1px rgba(0, 0, 0, var(--btn-rim)),\n 0 1px 2px rgba(0, 0, 0, var(--btn-drop-near)),\n 0 3px 6px rgba(0, 0, 0, var(--btn-drop-far));\n}\n\n.variant_primary:hover:not(:disabled) {\n filter: brightness(1.08) saturate(1.06);\n}\n\n.variant_primary:active:not(:disabled) {\n background: linear-gradient(\n 180deg,\n color-mix(in srgb, var(--wzl-accent) 80%, black) 0%,\n color-mix(in srgb, var(--wzl-accent) 95%, black) 50%,\n color-mix(in srgb, var(--wzl-accent) 60%, white) 100%\n );\n box-shadow:\n inset 0 2px 4px rgba(0, 0, 0, 0.35),\n inset 0 -1px 0 rgba(255, 255, 255, 0.25),\n 0 0 0 1px rgba(0, 0, 0, calc(var(--btn-rim) + 0.06));\n transform: translateY(0.5px);\n}\n.variant_primary:active::before { opacity: 0.3; }\n\n/* Secondary: neutral glass — drained of color. */\n.variant_secondary {\n background: linear-gradient(\n 180deg,\n color-mix(in srgb, var(--wzl-fg) 25%, transparent) 0%,\n color-mix(in srgb, var(--wzl-fg) 10%, transparent) calc(var(--btn-equator) - var(--btn-equator-spread)),\n color-mix(in srgb, var(--wzl-surface-raised) 90%, white) var(--btn-equator),\n var(--wzl-surface-raised) calc(var(--btn-equator) + var(--btn-equator-spread) * 1.6),\n color-mix(in srgb, var(--wzl-surface-sunken) 80%, black) 100%\n );\n backdrop-filter: blur(var(--btn-blur)) saturate(var(--btn-saturate));\n -webkit-backdrop-filter: blur(var(--btn-blur)) saturate(var(--btn-saturate));\n color: var(--wzl-fg);\n text-shadow:\n 0 1px 0 rgba(0, 0, 0, calc(var(--btn-text-shadow) * 0.7)),\n var(--btn-text-inset-x) var(--btn-text-inset-y) 0 rgba(0, 0, 0, calc(var(--btn-text-inset) * 0.7));\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, calc(var(--btn-inset-hi) * 0.5)),\n inset 0 -1px 2px rgba(0, 0, 0, calc(var(--btn-inset-lo) * 0.83)),\n 0 0 0 1px rgba(0, 0, 0, calc(var(--btn-rim) + 0.03)),\n 0 1px 2px rgba(0, 0, 0, calc(var(--btn-drop-near) * 0.93)),\n 0 3px 6px rgba(0, 0, 0, calc(var(--btn-drop-far) * 0.89));\n}\n\n.variant_secondary:hover:not(:disabled) { filter: brightness(1.1); }\n\n.variant_secondary:active:not(:disabled) {\n background: linear-gradient(180deg, var(--wzl-surface-sunken) 0%, var(--wzl-surface-raised) 100%);\n box-shadow:\n inset 0 2px 4px rgba(0, 0, 0, 0.4),\n 0 0 0 1px rgba(0, 0, 0, 0.3);\n transform: translateY(0.5px);\n}\n.variant_secondary:active::before { opacity: 0.2; }\n\n/* Ghost: silhouette only — no glass body, no gloss. */\n.variant_ghost {\n background: transparent;\n color: var(--wzl-fg);\n box-shadow: none;\n}\n.variant_ghost::before { display: none; }\n\n.variant_ghost:hover:not(:disabled):not(.pressed) {\n background: var(--wzl-surface-hover);\n}\n\n.variant_ghost:active:not(:disabled) {\n background: var(--wzl-surface-pressed);\n}\n\n/* Link: text only, sized by the surrounding text rather than the control scale. */\n.variant_link {\n display: inline;\n height: auto;\n padding: 0;\n border-radius: var(--wzl-radius-sm);\n background: transparent;\n box-shadow: none;\n text-shadow: none;\n font: inherit;\n line-height: inherit;\n text-align: start;\n overflow: visible;\n /* A peer tone or a stance's accent paints over the status. */\n color: var(--_s-accent, var(--btn-link-fg, var(--wzl-accent-fg)));\n text-decoration: underline;\n text-underline-offset: 0.15em;\n}\n.variant_link[data-status='neutral'] { --btn-link-fg: var(--wzl-fg); }\n.variant_link[data-status='muted'] { --btn-link-fg: var(--wzl-fg-muted); }\n.variant_link[data-status='accent'] { --btn-link-fg: var(--wzl-accent-fg); }\n.variant_link[data-status='success'] { --btn-link-fg: var(--wzl-success); }\n.variant_link[data-status='warn'] { --btn-link-fg: var(--wzl-warning); }\n.variant_link[data-status='danger'] { --btn-link-fg: var(--wzl-danger); }\n\n.variant_link::before { display: none; }\n.variant_link .label { display: inline; }\n\n.variant_link:hover:not(:disabled) {\n text-decoration-thickness: 2px;\n}\n\n/* ---------- Modifiers ---------- */\n\n.pressed:not(:disabled) {\n background: var(--wzl-surface-pressed);\n color: var(--wzl-fg);\n box-shadow: inset 0 1px 2px rgb(0 0 0 / 18%);\n}\n\n.variant_primary.pressed:not(:disabled) { filter: brightness(0.92); }\n\n.fullWidth { width: 100%; }\n.loading .label { opacity: 0.7; }\n\n/* ---------- Slots ---------- */\n\n.iconSlot {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n}\n\n.size_sm .iconSlot > svg { width: 12px; height: 12px; }\n.size_md .iconSlot > svg { width: 14px; height: 14px; }\n\n.label { display: inline-block; }\n\n/* ---------- Spinner ---------- */\n\n.spinner {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n animation: wzl-btn-spin 0.7s linear infinite;\n}\n\n@keyframes wzl-btn-spin {\n to { transform: rotate(360deg); }\n}\n\n/* BEGIN GENERATED stance rules: button — `npm run gen:stances`, do not edit. */\n\n.button {\n --wzl-tone: initial;\n}\n\n.button {\n --_s-accent: var(--wzl-tone);\n}\n\n.button[data-stance='scope'] {\n --_s-accent: var(--wzl-stance-scope-accent, var(--wzl-tone));\n}\n\n.button[data-stance='aside'] {\n --_s-accent: var(--wzl-stance-aside-accent, var(--wzl-tone));\n}\n\n.button[data-stance='advanced'] {\n --_s-accent: var(--wzl-stance-advanced-accent, var(--wzl-tone));\n}\n\n.button[data-stance='debug'] {\n --_s-accent: var(--wzl-stance-debug-accent, var(--wzl-tone));\n}\n\n.button[data-stance='danger'] {\n --_s-accent: var(--wzl-stance-danger-accent, var(--wzl-tone));\n}\n\n.button[data-stance='notice'] {\n --_s-accent: var(--wzl-stance-notice-accent, var(--wzl-tone));\n}\n\n.button[data-stance='important'] {\n --_s-accent: var(--wzl-stance-important-accent, var(--wzl-tone));\n}\n\n.button[data-stance='preview'] {\n --_s-accent: var(--wzl-stance-preview-accent, var(--wzl-tone));\n}\n\n.button[data-tone] {\n --wzl-accent: var(--_s-accent);\n --wzl-accent-base: var(--_s-accent);\n --wzl-accent-strong: color-mix(in oklab, var(--_s-accent) 70%, var(--wzl-fg));\n --wzl-accent-soft: color-mix(in oklab, var(--_s-accent) 45%, var(--wzl-surface));\n --wzl-accent-hover: var(--wzl-accent-strong);\n --wzl-accent-fg: var(--wzl-accent-strong);\n --wzl-focus-ring: var(--wzl-accent-strong);\n}\n\n/* END GENERATED stance rules: button */\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode, type Ref } from 'react';\nimport s from './Button.module.css';\nimport { SegmentTooltip, segmentTooltipContent, type SegmentTooltipFields } from '../segmentTooltip';\nimport { type StanceProps, useStance } from '../stance';\n\n/** Visual weight of a button. Defaults to `secondary`. `link` drops the\n * control box entirely and reads as a hyperlink in running text -- for an\n * in-page navigation that is still a button, not an `<a href>`. */\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'link';\n/** Text color of a `link` button — the same set as `Code`'s statuses. */\nexport type ButtonStatus = 'neutral' | 'muted' | 'accent' | 'success' | 'warn' | 'danger';\n/** Button height and type scale. */\nexport type ButtonSize = 'sm' | 'md';\n\ntype ButtonBase = {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Text color of the `link` variant, which is `accent` unless told\n * otherwise. The boxed variants carry their weight in their fill and\n * ignore it. A peer `tone`, or a stance's accent, paints over it. */\n status?: ButtonStatus;\n /** A button that stays down: renders `aria-pressed` and holds the active\n * treatment while it is on. For a control that reports a state rather than\n * firing an action -- a panel toggle, a mode switch. Left off, the button\n * announces no pressed state at all, which is what an action button wants. */\n pressed?: boolean;\n disabled?: boolean;\n loading?: boolean;\n leadingIcon?: ReactNode;\n trailingIcon?: ReactNode;\n fullWidth?: boolean;\n type?: 'button' | 'submit' | 'reset';\n className?: string;\n style?: ButtonHTMLAttributes<HTMLButtonElement>['style'];\n children?: ReactNode;\n onClick?: ButtonHTMLAttributes<HTMLButtonElement>['onClick'];\n} & StanceProps & SegmentTooltipFields;\n\ntype ButtonRegular = ButtonBase & {\n iconOnly?: false;\n ariaLabel?: string;\n};\n\ntype ButtonIconOnly = ButtonBase & {\n iconOnly: true;\n ariaLabel: string;\n};\n\n/**\n * Props for {@link Button}. Setting `iconOnly` makes `ariaLabel` required,\n * since an icon-only button has no text for a screen reader to announce.\n */\nexport type ButtonProps = ButtonRegular | ButtonIconOnly;\n\nfunction Spinner(): ReactNode {\n return (\n <span className={s.spinner} aria-hidden=\"true\">\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\">\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeOpacity=\"0.25\"\n />\n <path\n d=\"M 8 2 A 6 6 0 0 1 14 8\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n </span>\n );\n}\n\n/**\n * Standard button. `loading` swaps the leading icon for a spinner, marks the\n * button `aria-busy`, and leaves the label in place; it does not disable the\n * button, so pass `disabled` too if the click should be blocked.\n *\n * `shortcut` adds a kit tooltip reading `Name (⌘S)`, named by `ariaLabel` or\n * string children, the way `ToolButton` and `ButtonBar` items show theirs;\n * `tooltip` replaces that text with any content.\n *\n * `ref` forwards to the underlying `<button>`.\n */\nexport const Button = forwardRef(function Button(\n props: ButtonProps,\n ref: Ref<HTMLButtonElement>,\n) {\n const {\n variant = 'secondary',\n size = 'md',\n status,\n stance,\n tone,\n pressed,\n disabled,\n loading,\n leadingIcon,\n trailingIcon,\n fullWidth,\n iconOnly,\n ariaLabel,\n type = 'button',\n className,\n style,\n children,\n onClick,\n shortcut,\n tooltip,\n } = props;\n\n const cls = [\n s.button,\n s[`variant_${variant}`],\n s[`size_${size}`],\n fullWidth && s.fullWidth,\n pressed && s.pressed,\n iconOnly && s.iconOnly,\n loading && s.loading,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const showLeading = !iconOnly && (loading || leadingIcon);\n const stanced = useStance({ stance, tone });\n\n return (\n <SegmentTooltip\n content={segmentTooltipContent({ tooltip, shortcut, ariaLabel, label: children })}\n disabled={disabled}\n >\n <button\n ref={ref}\n type={type}\n className={cls}\n data-stance={stanced['data-stance']}\n data-tone={stanced['data-tone']}\n style={stanced.style || style ? { ...stanced.style, ...style } : undefined}\n disabled={disabled}\n aria-busy={loading ? true : undefined}\n aria-pressed={pressed}\n data-status={status}\n aria-label={ariaLabel}\n onClick={onClick}\n >\n {showLeading && (\n <span className={s.iconSlot}>{loading ? <Spinner /> : leadingIcon}</span>\n )}\n {iconOnly ? (\n loading ? <Spinner /> : <span className={s.iconSlot}>{children}</span>\n ) : (\n children !== undefined && <span className={s.label}>{children}</span>\n )}\n {!iconOnly && trailingIcon && (\n <span className={s.iconSlot}>{trailingIcon}</span>\n )}\n </button>\n </SegmentTooltip>\n );\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;ACsDA,SAASK,IAAqB;CAC5B,OACE,kBAAC,QAAD;EAAM,WAAWL,EAAE;EAAS,eAAY;EACtC,UAAA,kBAAC,OAAD;GAAK,SAAQ;GAAY,OAAM;GAAK,QAAO;GAA3C,UAAA,CACE,kBAAC,UAAD;IACE,IAAG;IACH,IAAG;IACH,GAAE;IACF,MAAK;IACL,QAAO;IACP,aAAY;IACZ,eAAc;GACf,CAAA,GACD,kBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,QAAO;IACP,aAAY;IACZ,eAAc;GACf,CAAA,CACE;;CACD,CAAA;AAEV;AAaA,IAAaM,IAASC,EAAW,SAC/B,GACA,GACA;CACA,IAAM,EACJ,aAAU,aACV,UAAO,MACP,WACA,WACA,SACA,YACA,aACA,YACA,gBACA,iBACA,cACA,aACA,cACA,UAAO,UACP,cACA,UACA,aACA,YACA,aACA,eACEC,GAEEC,IAAM;EACVT,EAAE;EACFA,EAAE,WAAWU;EACbV,EAAE,QAAQW;EACVC,KAAaZ,EAAE;EACfa,KAAWb,EAAE;EACbc,KAAYd,EAAE;EACde,KAAWf,EAAE;EACbgB;CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,GAELC,IAAc,CAACH,MAAaC,KAAWG,IACvCC,IAAUlB,EAAU;EAAE;EAAQ;CAAK,CAAC;CAE1C,OACE,kBAACE,GAAD;EACE,SAASD,EAAsB;GAAE;GAAS;GAAU;GAAW,OAAOkB;EAAS,CAAC;EACtE;EAEV,UAAA,kBAAC,UAAD;GACO;GACC;GACN,WAAWX;GACX,eAAaU,EAAQ;GACrB,aAAWA,EAAQ;GACnB,OAAOA,EAAQ,SAASE,IAAQ;IAAE,GAAGF,EAAQ;IAAO,GAAGE;GAAM,IAAI,KAAA;GACvD;GACV,aAAWN,IAAU,KAAO,KAAA;GAC5B,gBAAcF;GACd,eAAaS;GACb,cAAYC;GACH;GAZX,UAAA;IAcGN,KACC,kBAAC,QAAD;KAAM,WAAWjB,EAAE;KAAW,UAAAe,IAAU,kBAACV,GAAD,CAAU,CAAA,IAAIa;IAAkB,CAAA;IAEzEJ,IACCC,IAAU,kBAACV,GAAD,CAAU,CAAA,IAAI,kBAAC,QAAD;KAAM,WAAWL,EAAE;KAAW;IAAe,CAAA,IAErEoB,MAAa,KAAA,KAAa,kBAAC,QAAD;KAAM,WAAWpB,EAAE;KAAQ;IAAe,CAAA;IAErE,CAACc,KAAYU,KACZ,kBAAC,QAAD;KAAM,WAAWxB,EAAE;KAAW,UAAAwB;IAAmB,CAAA;GAE7C;;CACM,CAAA;AAEpB,CAAC"}
1
+ {"version":3,"file":"Button-XB-T75YL.js","names":["s","useStance","segmentTooltipContent","SegmentTooltip","Button_module_default","Spinner","Button","forwardRef","props","cls","variant","size","fullWidth","pressed","iconOnly","loading","className","showLeading","leadingIcon","stanced","children","style","status","ariaLabel","trailingIcon"],"sources":["../../src/components/Button/Button.module.css","../../src/components/Button/Button.tsx"],"sourcesContent":["/* Aqua-glass button. Every visual parameter is exposed as a CSS custom\n property so the Button Lab can override per-instance via inline style. */\n.button {\n /* ---- Tunables (with Aqua-biased defaults) ---- */\n /* Corner radius = 10% of the button's height (the shorter axis on every\n realistic button shape). Using calc against --btn-height keeps the\n corners circular rather than elliptical, which a % value would\n otherwise produce on a wide-but-short pill. */\n --btn-radius: calc(var(--btn-height) * 0.1);\n --btn-fontweight: var(--wzl-font-weight-medium);\n --btn-fontsize: var(--wzl-font-size);\n --btn-height: var(--wzl-control-h);\n --btn-padx: var(--wzl-space-6);\n\n /* Body gradient — alpha-laced top, opaque bottom. Percentages are\n \"color-mix accent ratio\" so 45% = 45% accent + 55% transparent. */\n --btn-top-alpha: 45%;\n --btn-upper-alpha: 70%;\n --btn-equator: 52%; /* vertical position of the bright-to-deep transition */\n --btn-equator-spread: 12%; /* half-width of the equator transition band */\n --btn-equator-tint: 95%; /* accent vs white at equator */\n --btn-base-tint: 70%; /* accent vs black at base */\n --btn-blur: 6px;\n --btn-saturate: 1.3;\n\n /* Specular gloss (::before) */\n --btn-gloss-top: 0.42;\n --btn-gloss-mid: 0.12;\n --btn-gloss-bottom: 50%; /* inset from bottom — 50% = upper hemisphere */\n\n /* 3D shadows */\n --btn-rim: 0.22;\n --btn-drop-near: 0.30;\n --btn-drop-far: 0.18;\n --btn-inset-hi: 0.42;\n --btn-inset-lo: 0.3;\n\n /* Text — main shadow + a second engraving shadow you can angle.\n `inset-x` / `inset-y` are pre-projected offsets from `inset-angle` so\n the lab can drive them with a single slider. */\n --btn-text-shadow: 0.35;\n --btn-text-inset: 0.55;\n --btn-text-inset-x: 0px;\n --btn-text-inset-y: 1px;\n\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--wzl-space-3);\n border: none;\n border-radius: var(--btn-radius);\n font-family: var(--wzl-font-ui);\n font-weight: var(--btn-fontweight);\n font-style: normal;\n font-size: var(--btn-fontsize);\n height: var(--btn-height);\n padding: 0 var(--btn-padx);\n line-height: 1;\n cursor: pointer;\n user-select: none;\n -webkit-user-select: none;\n isolation: isolate;\n overflow: hidden;\n transition: filter var(--wzl-motion-fast), box-shadow var(--wzl-motion-fast), transform 80ms;\n}\n\n/* Specular gloss — covers the upper hemisphere of the pill with a bright\n white sheen that fades to nothing by the equator. The single detail that\n sells the glass-cylinder illusion. */\n.button::before {\n content: '';\n position: absolute;\n inset: 1px 1px var(--btn-gloss-bottom) 1px;\n /* Top corners hug the button's outline; bottom corners are flat so the\n gloss terminates in a straight line at the equator rather than two\n little arcs that read as `)(` brackets at smaller radii. */\n border-top-left-radius: var(--btn-radius);\n border-top-right-radius: var(--btn-radius);\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n background: linear-gradient(\n 180deg,\n rgba(255, 255, 255, var(--btn-gloss-top)) 0%,\n rgba(255, 255, 255, var(--btn-gloss-mid)) 60%,\n rgba(255, 255, 255, 0) 100%\n );\n pointer-events: none;\n z-index: 1;\n transition: opacity var(--wzl-motion-fast);\n}\n\n.button > * {\n position: relative;\n z-index: 2;\n}\n\n.button:focus-visible {\n outline: 2px solid var(--wzl-focus-ring);\n outline-offset: 1px;\n}\n\n.button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ---------- Sizes — set defaults for the custom props ---------- */\n\n.size_sm { --btn-height: var(--wzl-control-h-sm); --btn-padx: var(--wzl-space-4); --btn-fontsize: var(--wzl-font-size-sm); }\n.size_md { --btn-height: var(--wzl-control-h); --btn-padx: var(--wzl-space-6); --btn-fontsize: var(--wzl-font-size); }\n\n.iconOnly.size_sm { width: var(--wzl-control-h-sm); --btn-padx: 0; }\n.iconOnly.size_md { width: var(--wzl-control-h); --btn-padx: 0; }\n\n/* ---------- Variants ---------- */\n\n/* Primary: tinted aqua glass — body uses --wzl-accent. The upper / equator\n / lower stops are positioned around --btn-equator so dragging the equator\n shifts the entire transition zone as one block. */\n.variant_primary {\n background: linear-gradient(\n 180deg,\n color-mix(in srgb, var(--wzl-accent) var(--btn-top-alpha), transparent) 0%,\n color-mix(in srgb, var(--wzl-accent) var(--btn-upper-alpha), transparent) calc(var(--btn-equator) - var(--btn-equator-spread)),\n color-mix(in srgb, var(--wzl-accent) var(--btn-equator-tint), white) var(--btn-equator),\n var(--wzl-accent) calc(var(--btn-equator) + var(--btn-equator-spread) * 1.6),\n color-mix(in srgb, var(--wzl-accent) var(--btn-base-tint), black) 100%\n );\n backdrop-filter: blur(var(--btn-blur)) saturate(var(--btn-saturate));\n -webkit-backdrop-filter: blur(var(--btn-blur)) saturate(var(--btn-saturate));\n color: var(--wzl-fg-on-accent);\n /* Main shadow below for legibility, then a second engraving shadow at a\n configurable angle (defaults below) — a near-black, lower-alpha stamp\n that sits underneath the glyphs and reads as recessed type. */\n text-shadow:\n 0 1px 0 rgba(0, 0, 0, var(--btn-text-shadow)),\n var(--btn-text-inset-x) var(--btn-text-inset-y) 0 rgba(0, 0, 0, var(--btn-text-inset)),\n 0 0 6px rgba(0, 0, 0, calc(var(--btn-text-shadow) * 0.5));\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, var(--btn-inset-hi)),\n inset 0 -1px 2px rgba(0, 0, 0, var(--btn-inset-lo)),\n 0 0 0 1px rgba(0, 0, 0, var(--btn-rim)),\n 0 1px 2px rgba(0, 0, 0, var(--btn-drop-near)),\n 0 3px 6px rgba(0, 0, 0, var(--btn-drop-far));\n}\n\n.variant_primary:hover:not(:disabled) {\n filter: brightness(1.08) saturate(1.06);\n}\n\n.variant_primary:active:not(:disabled) {\n background: linear-gradient(\n 180deg,\n color-mix(in srgb, var(--wzl-accent) 80%, black) 0%,\n color-mix(in srgb, var(--wzl-accent) 95%, black) 50%,\n color-mix(in srgb, var(--wzl-accent) 60%, white) 100%\n );\n box-shadow:\n inset 0 2px 4px rgba(0, 0, 0, 0.35),\n inset 0 -1px 0 rgba(255, 255, 255, 0.25),\n 0 0 0 1px rgba(0, 0, 0, calc(var(--btn-rim) + 0.06));\n transform: translateY(0.5px);\n}\n.variant_primary:active::before { opacity: 0.3; }\n\n/* Secondary: neutral glass — drained of color. */\n.variant_secondary {\n background: linear-gradient(\n 180deg,\n color-mix(in srgb, var(--wzl-fg) 25%, transparent) 0%,\n color-mix(in srgb, var(--wzl-fg) 10%, transparent) calc(var(--btn-equator) - var(--btn-equator-spread)),\n color-mix(in srgb, var(--wzl-surface-raised) 90%, white) var(--btn-equator),\n var(--wzl-surface-raised) calc(var(--btn-equator) + var(--btn-equator-spread) * 1.6),\n color-mix(in srgb, var(--wzl-surface-sunken) 80%, black) 100%\n );\n backdrop-filter: blur(var(--btn-blur)) saturate(var(--btn-saturate));\n -webkit-backdrop-filter: blur(var(--btn-blur)) saturate(var(--btn-saturate));\n color: var(--wzl-fg);\n text-shadow:\n 0 1px 0 rgba(0, 0, 0, calc(var(--btn-text-shadow) * 0.7)),\n var(--btn-text-inset-x) var(--btn-text-inset-y) 0 rgba(0, 0, 0, calc(var(--btn-text-inset) * 0.7));\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, calc(var(--btn-inset-hi) * 0.5)),\n inset 0 -1px 2px rgba(0, 0, 0, calc(var(--btn-inset-lo) * 0.83)),\n 0 0 0 1px rgba(0, 0, 0, calc(var(--btn-rim) + 0.03)),\n 0 1px 2px rgba(0, 0, 0, calc(var(--btn-drop-near) * 0.93)),\n 0 3px 6px rgba(0, 0, 0, calc(var(--btn-drop-far) * 0.89));\n}\n\n.variant_secondary:hover:not(:disabled) { filter: brightness(1.1); }\n\n.variant_secondary:active:not(:disabled) {\n background: linear-gradient(180deg, var(--wzl-surface-sunken) 0%, var(--wzl-surface-raised) 100%);\n box-shadow:\n inset 0 2px 4px rgba(0, 0, 0, 0.4),\n 0 0 0 1px rgba(0, 0, 0, 0.3);\n transform: translateY(0.5px);\n}\n.variant_secondary:active::before { opacity: 0.2; }\n\n/* Ghost: silhouette only — no glass body, no gloss. */\n.variant_ghost {\n background: transparent;\n color: var(--wzl-fg);\n box-shadow: none;\n}\n.variant_ghost::before { display: none; }\n\n.variant_ghost:hover:not(:disabled):not(.pressed) {\n background: var(--wzl-surface-hover);\n}\n\n.variant_ghost:active:not(:disabled) {\n background: var(--wzl-surface-pressed);\n}\n\n/* Link: text only, sized by the surrounding text rather than the control scale. */\n.variant_link {\n display: inline;\n height: auto;\n padding: 0;\n border-radius: var(--wzl-radius-sm);\n background: transparent;\n box-shadow: none;\n text-shadow: none;\n font: inherit;\n line-height: inherit;\n text-align: start;\n overflow: visible;\n /* A peer tone or a stance's accent paints over the status. */\n color: var(--_s-accent, var(--btn-link-fg, var(--wzl-accent-fg)));\n text-decoration: underline;\n text-underline-offset: 0.15em;\n}\n.variant_link[data-status='neutral'] { --btn-link-fg: var(--wzl-fg); }\n.variant_link[data-status='muted'] { --btn-link-fg: var(--wzl-fg-muted); }\n.variant_link[data-status='accent'] { --btn-link-fg: var(--wzl-accent-fg); }\n.variant_link[data-status='success'] { --btn-link-fg: var(--wzl-success); }\n.variant_link[data-status='warn'] { --btn-link-fg: var(--wzl-warning); }\n.variant_link[data-status='danger'] { --btn-link-fg: var(--wzl-danger); }\n\n.variant_link::before { display: none; }\n.variant_link .label { display: inline; }\n\n.variant_link:hover:not(:disabled) {\n text-decoration-thickness: 2px;\n}\n\n/* ---------- Modifiers ---------- */\n\n.pressed:not(:disabled) {\n background: var(--wzl-surface-pressed);\n color: var(--wzl-fg);\n box-shadow: inset 0 1px 2px rgb(0 0 0 / 18%);\n}\n\n.variant_primary.pressed:not(:disabled) { filter: brightness(0.92); }\n\n.fullWidth { width: 100%; }\n.loading .label { opacity: 0.7; }\n\n/* ---------- Slots ---------- */\n\n.iconSlot {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n}\n\n.size_sm .iconSlot > svg { width: 12px; height: 12px; }\n.size_md .iconSlot > svg { width: 14px; height: 14px; }\n\n.label { display: inline-block; }\n\n/* ---------- Spinner ---------- */\n\n.spinner {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n animation: wzl-btn-spin 0.7s linear infinite;\n}\n\n@keyframes wzl-btn-spin {\n to { transform: rotate(360deg); }\n}\n\n/* BEGIN GENERATED stance rules: button — `npm run gen:stances`, do not edit. */\n\n.button {\n --wzl-tone: initial;\n}\n\n.button {\n --_s-accent: var(--wzl-tone);\n}\n\n.button[data-stance='scope'] {\n --_s-accent: var(--wzl-stance-scope-accent, var(--wzl-tone));\n}\n\n.button[data-stance='aside'] {\n --_s-accent: var(--wzl-stance-aside-accent, var(--wzl-tone));\n}\n\n.button[data-stance='advanced'] {\n --_s-accent: var(--wzl-stance-advanced-accent, var(--wzl-tone));\n}\n\n.button[data-stance='debug'] {\n --_s-accent: var(--wzl-stance-debug-accent, var(--wzl-tone));\n}\n\n.button[data-stance='danger'] {\n --_s-accent: var(--wzl-stance-danger-accent, var(--wzl-tone));\n}\n\n.button[data-stance='notice'] {\n --_s-accent: var(--wzl-stance-notice-accent, var(--wzl-tone));\n}\n\n.button[data-stance='important'] {\n --_s-accent: var(--wzl-stance-important-accent, var(--wzl-tone));\n}\n\n.button[data-stance='preview'] {\n --_s-accent: var(--wzl-stance-preview-accent, var(--wzl-tone));\n}\n\n.button[data-tone] {\n --wzl-accent: var(--_s-accent);\n --wzl-accent-base: var(--_s-accent);\n --wzl-accent-strong: color-mix(in oklab, var(--_s-accent) 70%, var(--wzl-fg));\n --wzl-accent-soft: color-mix(in oklab, var(--_s-accent) 45%, var(--wzl-surface));\n --wzl-accent-hover: var(--wzl-accent-strong);\n --wzl-accent-fg: var(--wzl-accent-strong);\n --wzl-focus-ring: var(--wzl-accent-strong);\n}\n\n/* END GENERATED stance rules: button */\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode, type Ref } from 'react';\nimport s from './Button.module.css';\nimport { SegmentTooltip, segmentTooltipContent, type SegmentTooltipFields } from '../segmentTooltip';\nimport { type StanceProps, useStance } from '../stance';\n\n/** Visual weight of a button. Defaults to `secondary`. `link` drops the\n * control box entirely and reads as a hyperlink in running text -- for an\n * in-page navigation that is still a button, not an `<a href>`. */\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'link';\n/** Text color of a `link` button — the same set as `Code`'s statuses. */\nexport type ButtonStatus = 'neutral' | 'muted' | 'accent' | 'success' | 'warn' | 'danger';\n/** Button height and type scale. */\nexport type ButtonSize = 'sm' | 'md';\n\ntype ButtonBase = {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Text color of the `link` variant, which is `accent` unless told\n * otherwise. The boxed variants carry their weight in their fill and\n * ignore it. A peer `tone`, or a stance's accent, paints over it. */\n status?: ButtonStatus;\n /** A button that stays down: renders `aria-pressed` and holds the active\n * treatment while it is on. For a control that reports a state rather than\n * firing an action -- a panel toggle, a mode switch. Left off, the button\n * announces no pressed state at all, which is what an action button wants. */\n pressed?: boolean;\n disabled?: boolean;\n loading?: boolean;\n leadingIcon?: ReactNode;\n trailingIcon?: ReactNode;\n fullWidth?: boolean;\n type?: 'button' | 'submit' | 'reset';\n className?: string;\n style?: ButtonHTMLAttributes<HTMLButtonElement>['style'];\n children?: ReactNode;\n onClick?: ButtonHTMLAttributes<HTMLButtonElement>['onClick'];\n} & StanceProps & SegmentTooltipFields;\n\ntype ButtonRegular = ButtonBase & {\n iconOnly?: false;\n ariaLabel?: string;\n};\n\ntype ButtonIconOnly = ButtonBase & {\n iconOnly: true;\n ariaLabel: string;\n};\n\n/**\n * Props for {@link Button}. Setting `iconOnly` makes `ariaLabel` required,\n * since an icon-only button has no text for a screen reader to announce.\n */\nexport type ButtonProps = ButtonRegular | ButtonIconOnly;\n\nfunction Spinner(): ReactNode {\n return (\n <span className={s.spinner} aria-hidden=\"true\">\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\">\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeOpacity=\"0.25\"\n />\n <path\n d=\"M 8 2 A 6 6 0 0 1 14 8\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n </span>\n );\n}\n\n/**\n * Standard button. `loading` swaps the leading icon for a spinner, marks the\n * button `aria-busy`, and leaves the label in place; it does not disable the\n * button, so pass `disabled` too if the click should be blocked.\n *\n * `shortcut` adds a kit tooltip reading `Name (⌘S)`, named by `ariaLabel` or\n * string children, the way `ToolButton` and `ButtonBar` items show theirs;\n * `tooltip` replaces that text with any content.\n *\n * `ref` forwards to the underlying `<button>`.\n */\nexport const Button = forwardRef(function Button(\n props: ButtonProps,\n ref: Ref<HTMLButtonElement>,\n) {\n const {\n variant = 'secondary',\n size = 'md',\n status,\n stance,\n tone,\n pressed,\n disabled,\n loading,\n leadingIcon,\n trailingIcon,\n fullWidth,\n iconOnly,\n ariaLabel,\n type = 'button',\n className,\n style,\n children,\n onClick,\n shortcut,\n tooltip,\n } = props;\n\n const cls = [\n s.button,\n s[`variant_${variant}`],\n s[`size_${size}`],\n fullWidth && s.fullWidth,\n pressed && s.pressed,\n iconOnly && s.iconOnly,\n loading && s.loading,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const showLeading = !iconOnly && (loading || leadingIcon);\n const stanced = useStance({ stance, tone });\n\n return (\n <SegmentTooltip\n content={segmentTooltipContent({ tooltip, shortcut, ariaLabel, label: children })}\n disabled={disabled}\n >\n <button\n ref={ref}\n type={type}\n className={cls}\n data-stance={stanced['data-stance']}\n data-tone={stanced['data-tone']}\n style={stanced.style || style ? { ...stanced.style, ...style } : undefined}\n disabled={disabled}\n aria-busy={loading ? true : undefined}\n aria-pressed={pressed}\n data-status={status}\n aria-label={ariaLabel}\n onClick={onClick}\n >\n {showLeading && (\n <span className={s.iconSlot}>{loading ? <Spinner /> : leadingIcon}</span>\n )}\n {iconOnly ? (\n loading ? <Spinner /> : <span className={s.iconSlot}>{children}</span>\n ) : (\n children !== undefined && <span className={s.label}>{children}</span>\n )}\n {!iconOnly && trailingIcon && (\n <span className={s.iconSlot}>{trailingIcon}</span>\n )}\n </button>\n </SegmentTooltip>\n );\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;ACsDA,SAASK,IAAqB;CAC5B,OACE,kBAAC,QAAD;EAAM,WAAWL,EAAE;EAAS,eAAY;EACtC,UAAA,kBAAC,OAAD;GAAK,SAAQ;GAAY,OAAM;GAAK,QAAO;GAA3C,UAAA,CACE,kBAAC,UAAD;IACE,IAAG;IACH,IAAG;IACH,GAAE;IACF,MAAK;IACL,QAAO;IACP,aAAY;IACZ,eAAc;GACf,CAAA,GACD,kBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,QAAO;IACP,aAAY;IACZ,eAAc;GACf,CAAA,CACE;;CACD,CAAA;AAEV;AAaA,IAAaM,IAASC,EAAW,SAC/B,GACA,GACA;CACA,IAAM,EACJ,aAAU,aACV,UAAO,MACP,WACA,WACA,SACA,YACA,aACA,YACA,gBACA,iBACA,cACA,aACA,cACA,UAAO,UACP,cACA,UACA,aACA,YACA,aACA,eACEC,GAEEC,IAAM;EACVT,EAAE;EACFA,EAAE,WAAWU;EACbV,EAAE,QAAQW;EACVC,KAAaZ,EAAE;EACfa,KAAWb,EAAE;EACbc,KAAYd,EAAE;EACde,KAAWf,EAAE;EACbgB;CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,GAELC,IAAc,CAACH,MAAaC,KAAWG,IACvCC,IAAUlB,EAAU;EAAE;EAAQ;CAAK,CAAC;CAE1C,OACE,kBAACE,GAAD;EACE,SAASD,EAAsB;GAAE;GAAS;GAAU;GAAW,OAAOkB;EAAS,CAAC;EACtE;EAEV,UAAA,kBAAC,UAAD;GACO;GACC;GACN,WAAWX;GACX,eAAaU,EAAQ;GACrB,aAAWA,EAAQ;GACnB,OAAOA,EAAQ,SAASE,IAAQ;IAAE,GAAGF,EAAQ;IAAO,GAAGE;GAAM,IAAI,KAAA;GACvD;GACV,aAAWN,IAAU,KAAO,KAAA;GAC5B,gBAAcF;GACd,eAAaS;GACb,cAAYC;GACH;GAZX,UAAA;IAcGN,KACC,kBAAC,QAAD;KAAM,WAAWjB,EAAE;KAAW,UAAAe,IAAU,kBAACV,GAAD,CAAU,CAAA,IAAIa;IAAkB,CAAA;IAEzEJ,IACCC,IAAU,kBAACV,GAAD,CAAU,CAAA,IAAI,kBAAC,QAAD;KAAM,WAAWL,EAAE;KAAW;IAAe,CAAA,IAErEoB,MAAa,KAAA,KAAa,kBAAC,QAAD;KAAM,WAAWpB,EAAE;KAAQ;IAAe,CAAA;IAErE,CAACc,KAAYU,KACZ,kBAAC,QAAD;KAAM,WAAWxB,EAAE;KAAW,UAAAwB;IAAmB,CAAA;GAE7C;;CACM,CAAA;AAEpB,CAAC"}
@@ -1,6 +1,6 @@
1
- import { r as e, t } from "./segmentTooltip-CStYHKzd.js";
2
- import { t as n } from "./useRovingTabIndex-Bp_hYm_h.js";
3
- import { t as r } from "./segmentedControl.module-Bv7DEg8f.js";
1
+ import { r as e, t } from "./segmentTooltip-CGxCOWNz.js";
2
+ import { t as n } from "./useRovingTabIndex-D7u22Ia_.js";
3
+ import { t as r } from "./segmentedControl.module-BzGXUL5G.js";
4
4
  import { jsx as i } from "react/jsx-runtime";
5
5
  import "react";
6
6
  //#region src/components/ButtonBar/ButtonBar.tsx
@@ -9,10 +9,9 @@ function a(a) {
9
9
  let t = o[e];
10
10
  t.disabled || t.onAction();
11
11
  }, p = n({
12
- items: o,
13
- itemClassName: r.segment,
12
+ itemSelector: `.${r.segment}`,
14
13
  onActivate: f
15
- }), m = l === void 0 ? void 0 : { "--wzl-tb-height": `${l}px` }, h = [
14
+ }), m = l === void 0 ? void 0 : { "--tb-h": `${l}px` }, h = [
16
15
  r.root,
17
16
  u && r[`size_${u}`],
18
17
  d && r[`variant_${d}`],
@@ -20,6 +19,7 @@ function a(a) {
20
19
  ].filter(Boolean).join(" ");
21
20
  return /* @__PURE__ */ i("div", {
22
21
  ref: p.rootRef,
22
+ onKeyDown: p.onKeyDown,
23
23
  className: h,
24
24
  role: "toolbar",
25
25
  "aria-label": s,
@@ -31,10 +31,8 @@ function a(a) {
31
31
  type: "button",
32
32
  "aria-label": n.ariaLabel,
33
33
  disabled: n.disabled,
34
- tabIndex: p.tabIndexFor(a),
35
34
  className: r.segment,
36
35
  onClick: () => f(a),
37
- onKeyDown: p.onKeyDown(a),
38
36
  children: n.label
39
37
  })
40
38
  }, n.value))
@@ -43,4 +41,4 @@ function a(a) {
43
41
  //#endregion
44
42
  export { a as t };
45
43
 
46
- //# sourceMappingURL=ButtonBar-D5Vi0aj_.js.map
44
+ //# sourceMappingURL=ButtonBar-CIMKPPRS.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ButtonBar-D5Vi0aj_.js","names":["s","segmentTooltipContent","useRovingTabIndex","segmentedControl_module_default","ButtonBar","props","fire","item","items","index","roving","style","height","rootCls","size","variant","className","ariaLabel","SegmentTooltip","i"],"sources":["../../src/components/ButtonBar/ButtonBar.tsx"],"sourcesContent":["import { type CSSProperties, type ReactElement, type ReactNode } from 'react';\nimport s from '../segmentedControl.module.css';\nimport { useRovingTabIndex } from '../../useRovingTabIndex';\nimport { SegmentTooltip, segmentTooltipContent, type SegmentTooltipFields } from '../segmentTooltip';\n\n/**\n * One button in an {@link ButtonBar}. `value` is only a React key; the item\n * carries no selected state.\n */\nexport type ButtonBarItem<V extends string | number = string> = {\n value: V;\n label?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n onAction: () => void;\n} & SegmentTooltipFields;\n\n/** Segment height and type scale for an {@link ButtonBar}. */\nexport type ButtonBarSize = 'sm' | 'md';\n/** Visual treatment of an {@link ButtonBar}. */\nexport type ButtonBarVariant = 'default' | 'minimal';\n\n/** Props for {@link ButtonBar}. */\nexport type ButtonBarProps<V extends string | number = string> = {\n items: readonly ButtonBarItem<V>[];\n ariaLabel?: string;\n className?: string;\n height?: number;\n size?: ButtonBarSize;\n variant?: ButtonBarVariant;\n};\n\n/**\n * Segmented strip of momentary buttons — each press fires and nothing stays\n * selected. Shares the look and the arrow-key navigation of `ToggleBar` and\n * `OptionsBar`.\n *\n * This is a plain callback bar. For buttons driven by the kit's actions\n * registry, use `ActionBar` instead.\n */\nexport function ButtonBar<V extends string | number = string>(props: ButtonBarProps<V>): ReactElement {\n const { items, ariaLabel, className, height, size, variant } = props;\n\n const fire = (index: number) => {\n const item = items[index];\n if (item.disabled) return;\n item.onAction();\n };\n\n const roving = useRovingTabIndex({ items, itemClassName: s.segment, onActivate: fire });\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=\"toolbar\"\n aria-label={ariaLabel}\n style={style}\n >\n {items.map((item, i) => (\n <SegmentTooltip key={item.value} content={segmentTooltipContent(item)} disabled={item.disabled}>\n <button\n type=\"button\"\n aria-label={item.ariaLabel}\n disabled={item.disabled}\n tabIndex={roving.tabIndexFor(i)}\n className={s.segment}\n onClick={() => fire(i)}\n onKeyDown={roving.onKeyDown(i)}\n >\n {item.label}\n </button>\n </SegmentTooltip>\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;;AAwCA,SAAgBI,EAA8C,GAAwC;CACpG,IAAM,EAAE,UAAO,cAAW,cAAW,WAAQ,SAAM,eAAYC,GAEzDC,KAAQ,MAAkB;EAC9B,IAAMC,IAAOC,EAAMC;EACnB,AAAIF,EAAK,YACTA,EAAK,SAAS;CAChB,GAEMG,IAASR,EAAkB;EAAE;EAAO,eAAeF,EAAE;EAAS,YAAYM;CAAK,CAAC,GAEhFK,IAAmCC,MAAW,KAAA,IAEhD,KAAA,IADC,EAAG,mBAA8B,GAAGA,EAAO,IAAI,GAG9CC,IAAU;EACdb,EAAE;EACFc,KAAQd,EAAE,QAAQc;EAClBC,KAAWf,EAAE,WAAWe;EACxBC;CACF,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAE1B,OACE,kBAAC,OAAD;EACE,KAAKN,EAAO;EACZ,WAAWG;EACX,MAAK;EACL,cAAYI;EACL;EAEN,UAAAT,EAAM,KAAK,GAAM,MAChB,kBAACU,GAAD;GAAiC,SAASjB,EAAsBM,CAAI;GAAG,UAAUA,EAAK;GACpF,UAAA,kBAAC,UAAD;IACE,MAAK;IACL,cAAYA,EAAK;IACjB,UAAUA,EAAK;IACf,UAAUG,EAAO,YAAYS,CAAC;IAC9B,WAAWnB,EAAE;IACb,eAAeM,EAAKa,CAAC;IACrB,WAAWT,EAAO,UAAUS,CAAC;IAE5B,UAAAZ,EAAK;GACA,CAAA;EACM,GAZKA,EAAK,KAYV,CACjB;CACE,CAAA;AAET"}
1
+ {"version":3,"file":"ButtonBar-CIMKPPRS.js","names":["s","segmentTooltipContent","useRovingTabIndex","segmentedControl_module_default","ButtonBar","props","fire","item","items","index","roving","style","height","rootCls","size","variant","className","ariaLabel","SegmentTooltip","i"],"sources":["../../src/components/ButtonBar/ButtonBar.tsx"],"sourcesContent":["import { type CSSProperties, type ReactElement, type ReactNode } from 'react';\nimport s from '../segmentedControl.module.css';\nimport { useRovingTabIndex } from '../../useRovingTabIndex';\nimport { SegmentTooltip, segmentTooltipContent, type SegmentTooltipFields } from '../segmentTooltip';\n\n/**\n * One button in an {@link ButtonBar}. `value` is only a React key; the item\n * carries no selected state.\n */\nexport type ButtonBarItem<V extends string | number = string> = {\n value: V;\n label?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n onAction: () => void;\n} & SegmentTooltipFields;\n\n/** Segment height and type scale for an {@link ButtonBar}. */\nexport type ButtonBarSize = 'sm' | 'md';\n/** Visual treatment of an {@link ButtonBar}. */\nexport type ButtonBarVariant = 'default' | 'minimal';\n\n/** Props for {@link ButtonBar}. */\nexport type ButtonBarProps<V extends string | number = string> = {\n items: readonly ButtonBarItem<V>[];\n ariaLabel?: string;\n className?: string;\n height?: number;\n size?: ButtonBarSize;\n variant?: ButtonBarVariant;\n};\n\n/**\n * Segmented strip of momentary buttons — each press fires and nothing stays\n * selected. Shares the look and the arrow-key navigation of `ToggleBar` and\n * `OptionsBar`.\n *\n * This is a plain callback bar. For buttons driven by the kit's actions\n * registry, use `ActionBar` instead.\n */\nexport function ButtonBar<V extends string | number = string>(props: ButtonBarProps<V>): ReactElement {\n const { items, ariaLabel, className, height, size, variant } = props;\n\n const fire = (index: number) => {\n const item = items[index];\n if (item.disabled) return;\n item.onAction();\n };\n\n const roving = useRovingTabIndex({ itemSelector: `.${s.segment}`, onActivate: fire });\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=\"toolbar\"\n aria-label={ariaLabel}\n style={style}\n >\n {items.map((item, i) => (\n <SegmentTooltip key={item.value} content={segmentTooltipContent(item)} disabled={item.disabled}>\n <button\n type=\"button\"\n aria-label={item.ariaLabel}\n disabled={item.disabled}\n className={s.segment}\n onClick={() => fire(i)}\n >\n {item.label}\n </button>\n </SegmentTooltip>\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;;AAwCA,SAAgBI,EAA8C,GAAwC;CACpG,IAAM,EAAE,UAAO,cAAW,cAAW,WAAQ,SAAM,eAAYC,GAEzDC,KAAQ,MAAkB;EAC9B,IAAMC,IAAOC,EAAMC;EACnB,AAAIF,EAAK,YACTA,EAAK,SAAS;CAChB,GAEMG,IAASR,EAAkB;EAAE,cAAc,IAAIF,EAAE;EAAW,YAAYM;CAAK,CAAC,GAE9EK,IAAmCC,MAAW,KAAA,IAEhD,KAAA,IADC,EAAG,UAAqB,GAAGA,EAAO,IAAI,GAGrCC,IAAU;EACdb,EAAE;EACFc,KAAQd,EAAE,QAAQc;EAClBC,KAAWf,EAAE,WAAWe;EACxBC;CACF,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAE1B,OACE,kBAAC,OAAD;EACE,KAAKN,EAAO;EACZ,WAAWA,EAAO;EAClB,WAAWG;EACX,MAAK;EACL,cAAYI;EACL;EAEN,UAAAT,EAAM,KAAK,GAAM,MAChB,kBAACU,GAAD;GAAiC,SAASjB,EAAsBM,CAAI;GAAG,UAAUA,EAAK;GACpF,UAAA,kBAAC,UAAD;IACE,MAAK;IACL,cAAYA,EAAK;IACjB,UAAUA,EAAK;IACf,WAAWP,EAAE;IACb,eAAeM,EAAKa,CAAC;IAEpB,UAAAZ,EAAK;GACA,CAAA;EACM,GAVKA,EAAK,KAUV,CACjB;CACE,CAAA;AAET"}