@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
@@ -1,7 +1,9 @@
1
1
  import { t as e } from "./dlog-F0I8KsIW.js";
2
- import { a as t, i as n, l as r, s as i, u as a } from "./createKeyframeLayer-Czj6Y235.js";
3
- import { Fragment as o, jsx as s, jsxs as c } from "react/jsx-runtime";
4
- import { useCallback as l, useEffect as u, useMemo as d, useRef as f, useState as p } from "react";
2
+ import { a as t, i as n, o as r, s as i } from "./createKeyframeLayer-BTa4LyJE.js";
3
+ import { n as a } from "./handles-CqVANLtu.js";
4
+ import { useLatest as o } from "@weasel-js/core";
5
+ import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
6
+ import { useCallback as u, useEffect as d, useMemo as f, useState as p } from "react";
5
7
  //#region src/components/CurveEditor/catmullRom.ts
6
8
  function m(e, t, n) {
7
9
  let r = t.x - e.x, i = t.y - e.y;
@@ -128,7 +130,7 @@ function x(e, t, n) {
128
130
  }
129
131
  //#endregion
130
132
  //#region src/components/CurveEditor/createFunctionLayer.tsx
131
- var S = 16, C = i("--wzl-handle-size-lg"), w = i("--wzl-handle-size-sm"), T = 12, E = 8, D = .01, O = 10, k = (e) => String(Number(e.toFixed(3)));
133
+ var S = 16, C = a("--wzl-handle-size-lg"), w = a("--wzl-handle-size-sm"), T = 12, E = 8, D = .01, O = 10, k = (e) => String(Number(e.toFixed(3)));
132
134
  function A(e, t) {
133
135
  let n = t.modelRange, r = Math.min(n.xMin, n.xMax), i = Math.max(n.xMin, n.xMax), a = Math.min(n.yMin, n.yMax), o = Math.max(n.yMin, n.yMax);
134
136
  return {
@@ -155,9 +157,9 @@ function P(e) {
155
157
  return (e.constrain ?? "none") === "function" ? "monotone" : e.interpolation ?? "catmull-rom";
156
158
  }
157
159
  function F(n = {}) {
158
- let i = n.id ?? "function", l = n.domain ?? "2d", u = n.endpoints ?? "free", d = n.constrain ?? "none", f = n.addPointMode ?? "click-curve", p = P(n), m = n.interactive !== !1, h = n.curve !== !1 && n.curve !== null;
160
+ let a = n.id ?? "function", o = n.domain ?? "2d", u = n.endpoints ?? "free", d = n.constrain ?? "none", f = n.addPointMode ?? "click-curve", p = P(n), m = n.interactive !== !1, h = n.curve !== !1 && n.curve !== null;
159
161
  function g(e, r) {
160
- let { points: i, activeIndex: a } = e, l = M(i, r), d = "", f = null;
162
+ let { points: i, activeIndex: a } = e, o = M(i, r), d = "", f = null;
161
163
  if (i.length >= 2) {
162
164
  let e = x(i, S, p).map((e) => r.toPlot(e)), t = [`M${e[0].x.toFixed(2)},${e[0].y.toFixed(2)}`];
163
165
  for (let n = 1; n < e.length; n++) t.push(`L${e[n].x.toFixed(2)},${e[n].y.toFixed(2)}`);
@@ -166,23 +168,23 @@ function F(n = {}) {
166
168
  s.push(`L${o.x.toFixed(2)},${i.toFixed(2)}`), s.push(`L${a.x.toFixed(2)},${i.toFixed(2)}`), s.push("Z"), f = s.join("");
167
169
  }
168
170
  }
169
- return /* @__PURE__ */ c(o, { children: [
170
- f && /* @__PURE__ */ s("path", {
171
+ return /* @__PURE__ */ l(s, { children: [
172
+ f && /* @__PURE__ */ c("path", {
171
173
  "data-curve-element": "fill",
172
174
  className: t.fill,
173
175
  d: f,
174
176
  fill: n.fill ? n.fill.color : void 0
175
177
  }),
176
- d && h && /* @__PURE__ */ s("path", {
178
+ d && h && /* @__PURE__ */ c("path", {
177
179
  className: t.curve,
178
180
  d,
179
181
  fill: "none"
180
182
  }),
181
- m && l.map((e, r) => {
182
- let o = j(r, i.length, u), c = i[r]?.locked === !0;
183
- if ((c || o) && n.hideNonInteractive) return null;
183
+ m && o.map((e, r) => {
184
+ let o = j(r, i.length, u), s = i[r]?.locked === !0;
185
+ if ((s || o) && n.hideNonInteractive) return null;
184
186
  let l = a === r, d = h && (r === 0 || r === i.length - 1), f = {
185
- ...!c && !(u === "pinned-both" && o) ? { tabIndex: 0 } : {},
187
+ ...!s && !(u === "pinned-both" && o) ? { tabIndex: 0 } : {},
186
188
  role: "button",
187
189
  "aria-label": `${n.label ?? "Point"} ${r + 1} at ${k(i[r].x)}, ${k(i[r].y)}`
188
190
  };
@@ -193,11 +195,11 @@ function F(n = {}) {
193
195
  cx: e.x,
194
196
  cy: e.y,
195
197
  isActive: l,
196
- isLocked: c,
198
+ isLocked: s,
197
199
  isPinnedEndpoint: o,
198
200
  isEndpoint: d
199
201
  });
200
- if (t != null) return /* @__PURE__ */ s("g", {
202
+ if (t != null) return /* @__PURE__ */ c("g", {
201
203
  "data-anchor-index": r,
202
204
  ...f,
203
205
  children: t
@@ -206,13 +208,13 @@ function F(n = {}) {
206
208
  let p = [
207
209
  t.anchor,
208
210
  d && t.endpoint,
209
- (o || c) && t.pinned,
210
- c && t.locked,
211
+ (o || s) && t.pinned,
212
+ s && t.locked,
211
213
  l && t.active
212
214
  ].filter(Boolean).join(" ");
213
- if (d || c) {
214
- let t = c ? w : C;
215
- return /* @__PURE__ */ s("rect", {
215
+ if (d || s) {
216
+ let t = s ? w : C;
217
+ return /* @__PURE__ */ c("rect", {
216
218
  className: p,
217
219
  x: e.x - t,
218
220
  y: e.y - t,
@@ -223,7 +225,7 @@ function F(n = {}) {
223
225
  ...f
224
226
  }, r);
225
227
  }
226
- return /* @__PURE__ */ s("circle", {
228
+ return /* @__PURE__ */ c("circle", {
227
229
  className: p,
228
230
  cx: e.x,
229
231
  cy: e.y,
@@ -236,18 +238,18 @@ function F(n = {}) {
236
238
  }
237
239
  function _(e, t, n) {
238
240
  if (!m) return null;
239
- let i = M(e.points, n), o = r(i, t, T);
241
+ let a = M(e.points, n), o = r(a, t, T);
240
242
  if (o) return {
241
243
  kind: "anchor",
242
244
  payload: { index: o.index }
243
245
  };
244
246
  if (f === "click-curve" && h) {
245
- let r = N(e.points, p, n), i = a(r, t, E);
246
- if (i) return {
247
+ let r = N(e.points, p, n), a = i(r, t, E);
248
+ if (a) return {
247
249
  kind: "curve",
248
250
  payload: {
249
- segIdx: i.segIdx,
250
- t: i.t
251
+ segIdx: a.segIdx,
252
+ t: a.t
251
253
  }
252
254
  };
253
255
  }
@@ -256,14 +258,14 @@ function F(n = {}) {
256
258
  function v(e, t, r, i) {
257
259
  let a = e.points;
258
260
  if (t < 0 || t >= a.length) return e;
259
- let o = i.modelRange, s = n.xClamp ? n.xClamp[0] : o.xMin, c = n.xClamp ? n.xClamp[1] : o.xMax, f = r.x, p = r.y, m = t === 0 || t === a.length - 1;
261
+ let s = i.modelRange, c = n.xClamp ? n.xClamp[0] : s.xMin, l = n.xClamp ? n.xClamp[1] : s.xMax, f = r.x, p = r.y, m = t === 0 || t === a.length - 1;
260
262
  if (u === "pinned-both" && m) f = a[t].x, p = a[t].y;
261
- else if (u === "pinned-x" && m) f = t === 0 ? s : c;
262
- else if (d === "function" || l === "1d") {
263
- let e = d === "function" ? (c - s) / 1e3 : 0, n = t > 0 ? a[t - 1].x + e : s, r = t < a.length - 1 ? a[t + 1].x - e : c;
263
+ else if (u === "pinned-x" && m) f = t === 0 ? c : l;
264
+ else if (d === "function" || o === "1d") {
265
+ let e = d === "function" ? (l - c) / 1e3 : 0, n = t > 0 ? a[t - 1].x + e : c, r = t < a.length - 1 ? a[t + 1].x - e : l;
264
266
  f = Math.max(n, Math.min(r, f));
265
267
  }
266
- f = Math.max(Math.min(s, c), Math.min(Math.max(s, c), f));
268
+ f = Math.max(Math.min(c, l), Math.min(Math.max(c, l), f));
267
269
  let h = A({
268
270
  x: f,
269
271
  y: p
@@ -297,80 +299,80 @@ function F(n = {}) {
297
299
  }
298
300
  };
299
301
  }
300
- function b(t, r, a, o, s) {
302
+ function b(t, r, i, s, c) {
301
303
  if (r.kind === "anchor") {
302
- let { index: c } = r.payload;
304
+ let { index: o } = r.payload;
303
305
  if (e("function-layer", "anchor-down", {
304
- id: i,
305
- index: c,
306
- shift: o.modifiers.shift,
307
- button: a.button
308
- }), t.points[c]?.locked) return;
309
- if (o.modifiers.shift) {
310
- if (j(c, t.points.length, u) || n.minPoints !== void 0 && t.points.length <= n.minPoints) return;
311
- s.commit({
306
+ id: a,
307
+ index: o,
308
+ shift: s.modifiers.shift,
309
+ button: i.button
310
+ }), t.points[o]?.locked) return;
311
+ if (s.modifiers.shift) {
312
+ if (j(o, t.points.length, u) || n.minPoints !== void 0 && t.points.length <= n.minPoints) return;
313
+ c.commit({
312
314
  ...t,
313
- points: t.points.filter((e, t) => t !== c),
315
+ points: t.points.filter((e, t) => t !== o),
314
316
  activeIndex: null
315
317
  });
316
318
  return;
317
319
  }
318
- return a.button === 2 ? void 0 : (s.commit({
320
+ return i.button === 2 ? void 0 : (c.commit({
319
321
  ...t,
320
- activeIndex: c
321
- }), y(c));
322
+ activeIndex: o
323
+ }), y(o));
322
324
  }
323
325
  if (r.kind === "curve") {
324
326
  let { segIdx: e } = r.payload;
325
327
  if (n.maxPoints !== void 0 && t.points.length >= n.maxPoints) return;
326
- let i = e + 1, a = A(s.model, o);
327
- if (d === "function" || l === "1d") {
328
- let e = d === "function" ? (o.modelRange.xMax - o.modelRange.xMin) / 1e3 : 0, n = i > 0 ? t.points[i - 1] : null, r = i < t.points.length ? t.points[i] : null;
329
- if (n && Math.abs(a.x - n.x) < e * 2) return s.commit({
328
+ let i = e + 1, a = A(c.model, s);
329
+ if (d === "function" || o === "1d") {
330
+ let e = d === "function" ? (s.modelRange.xMax - s.modelRange.xMin) / 1e3 : 0, n = i > 0 ? t.points[i - 1] : null, r = i < t.points.length ? t.points[i] : null;
331
+ if (n && Math.abs(a.x - n.x) < e * 2) return c.commit({
330
332
  ...t,
331
333
  activeIndex: i - 1
332
334
  }), y(i - 1);
333
- if (r && Math.abs(a.x - r.x) < e * 2) return s.commit({
335
+ if (r && Math.abs(a.x - r.x) < e * 2) return c.commit({
334
336
  ...t,
335
337
  activeIndex: i
336
338
  }), y(i);
337
339
  }
338
- let c = [
340
+ let l = [
339
341
  ...t.points.slice(0, i),
340
342
  a,
341
343
  ...t.points.slice(i)
342
344
  ];
343
- return s.commit({
345
+ return c.commit({
344
346
  ...t,
345
- points: c,
347
+ points: l,
346
348
  activeIndex: i
347
349
  }), y(i);
348
350
  }
349
351
  }
350
352
  function F(e, t, r, i, a) {
351
353
  if (!m || f !== "click-empty" || n.maxPoints !== void 0 && e.points.length >= n.maxPoints) return;
352
- let o = A(t, i), s = e.points.length;
353
- if (l === "1d") {
354
- for (let t = 0; t < e.points.length; t++) if (e.points[t].x > o.x) {
355
- s = t;
354
+ let s = A(t, i), c = e.points.length;
355
+ if (o === "1d") {
356
+ for (let t = 0; t < e.points.length; t++) if (e.points[t].x > s.x) {
357
+ c = t;
356
358
  break;
357
359
  }
358
360
  }
359
- let c = [
360
- ...e.points.slice(0, s),
361
- o,
362
- ...e.points.slice(s)
361
+ let l = [
362
+ ...e.points.slice(0, c),
363
+ s,
364
+ ...e.points.slice(c)
363
365
  ];
364
366
  a.commit({
365
367
  ...e,
366
- points: c,
368
+ points: l,
367
369
  activeIndex: null
368
370
  });
369
371
  }
370
- function I(e, t, r, a) {
372
+ function I(e, t, r, i) {
371
373
  if (!m) return;
372
374
  let o = t.target;
373
- if (o?.closest?.("[data-layer-id]")?.getAttribute("data-layer-id") !== i) return;
375
+ if (o?.closest?.("[data-layer-id]")?.getAttribute("data-layer-id") !== a) return;
374
376
  let s = o.closest("[data-anchor-index]");
375
377
  if (!s) return;
376
378
  let c = t.key === "ArrowRight" ? 1 : t.key === "ArrowLeft" ? -1 : 0, l = t.key === "ArrowUp" ? 1 : t.key === "ArrowDown" ? -1 : 0;
@@ -382,13 +384,13 @@ function F(n = {}) {
382
384
  x: d.x + c * Math.abs(h) * D * p,
383
385
  y: d.y + l * Math.abs(f.yMax - f.yMin) * D * p
384
386
  }, r), _ = g.points[u];
385
- (_.x !== d.x || _.y !== d.y) && a.commit({
387
+ (_.x !== d.x || _.y !== d.y) && i.commit({
386
388
  ...g,
387
389
  activeIndex: null
388
390
  });
389
391
  }
390
392
  return {
391
- id: i,
393
+ id: a,
392
394
  render: g,
393
395
  hitTest: _,
394
396
  onPointerDown: b,
@@ -405,11 +407,11 @@ function I(e) {
405
407
  //#endregion
406
408
  //#region src/components/CurveEditor/CurveEditor.tsx
407
409
  function L(e) {
408
- let { value: t, onInput: r, onChange: i, domain: a, endpoints: o, interpolation: c, constrain: m, addPointMode: h, minPoints: g, maxPoints: _, curve: v, fill: y, hideNonInteractive: b, renderAnchor: x, width: S, height: C, xRange: w, yRange: T, grid: E, axes: D, xTicks: O, yTicks: k, history: A, className: j, style: M, decorations: N } = e, P = d(() => F({
410
+ let { value: t, onInput: r, onChange: i, domain: a, endpoints: s, interpolation: l, constrain: m, addPointMode: h, minPoints: g, maxPoints: _, curve: v, fill: y, hideNonInteractive: b, renderAnchor: x, width: S, height: C, xRange: w, yRange: T, grid: E, axes: D, xTicks: O, yTicks: k, history: A, className: j, style: M, decorations: N } = e, P = f(() => F({
409
411
  id: "function",
410
412
  domain: a,
411
- endpoints: o,
412
- interpolation: c,
413
+ endpoints: s,
414
+ interpolation: l,
413
415
  constrain: m,
414
416
  addPointMode: h,
415
417
  minPoints: g,
@@ -420,8 +422,8 @@ function L(e) {
420
422
  renderAnchor: x
421
423
  }), [
422
424
  a,
423
- o,
424
- c,
425
+ s,
426
+ l,
425
427
  m,
426
428
  h,
427
429
  g,
@@ -433,46 +435,47 @@ function L(e) {
433
435
  ]), [I, L] = p(() => ({
434
436
  points: t,
435
437
  activeIndex: null
436
- })), R = f(I);
437
- R.current = I, u(() => {
438
+ })), R = o(I);
439
+ d(() => {
438
440
  R.current.activeIndex === null && R.current.points !== t && L({
439
441
  points: t,
440
442
  activeIndex: null
441
443
  });
442
- }, [t]);
443
- let z = l((e, t) => {
444
+ }, [t, R]);
445
+ let z = u((e, t) => {
444
446
  let n = t, i = R.current.points;
445
447
  L(n), n.points !== i && r(n.points);
446
- }, [r]), B = l((e, t, n) => {
448
+ }, [r, R]), B = u((e, t, n) => {
447
449
  if (!i) return;
448
450
  let r = t, a = n;
449
451
  r.points !== a.points && i?.(r.points, a.points);
450
- }, [i]), V = l((e) => {
452
+ }, [i]), V = u((e) => {
451
453
  let t = e.target?.closest?.("[data-anchor-index]");
452
454
  if (!t) return;
453
455
  e.preventDefault(), e.stopPropagation();
454
456
  let n = t.getAttribute("data-anchor-index");
455
457
  if (n === null) return;
456
- let a = Number(n), s = R.current.points;
457
- if (!Number.isInteger(a) || a < 0 || a >= s.length || s[a]?.locked || o !== void 0 && o !== "free" && (a === 0 || a === s.length - 1) || g !== void 0 && s.length <= g) return;
458
- let c = s.filter((e, t) => t !== a);
458
+ let a = Number(n), o = R.current.points;
459
+ if (!Number.isInteger(a) || a < 0 || a >= o.length || o[a]?.locked || s !== void 0 && s !== "free" && (a === 0 || a === o.length - 1) || g !== void 0 && o.length <= g) return;
460
+ let c = o.filter((e, t) => t !== a);
459
461
  L({
460
462
  points: c,
461
463
  activeIndex: null
462
- }), r(c), i?.(c, s);
464
+ }), r(c), i?.(c, o);
463
465
  }, [
464
- o,
466
+ s,
465
467
  g,
466
468
  r,
467
- i
468
- ]), H = d(() => [{
469
+ i,
470
+ R
471
+ ]), H = f(() => [{
469
472
  layer: P,
470
473
  state: I
471
474
  }], [P, I]);
472
- return /* @__PURE__ */ s("div", {
475
+ return /* @__PURE__ */ c("div", {
473
476
  onContextMenu: V,
474
477
  style: { display: "contents" },
475
- children: /* @__PURE__ */ s(n, {
478
+ children: /* @__PURE__ */ c(n, {
476
479
  layers: H,
477
480
  onLayerChange: z,
478
481
  onLayerCommit: B,
@@ -530,4 +533,4 @@ function z(e, t) {
530
533
  //#endregion
531
534
  export { x as a, I as i, L as n, F as r, R as t };
532
535
 
533
- //# sourceMappingURL=CurveEditor-BDJXjEvK.js.map
536
+ //# sourceMappingURL=CurveEditor-jVBEqqdv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CurveEditor-jVBEqqdv.js","names":["_Fragment","s","dlog","CurveEditor_module_default","LayeredCurveEditor","hitTestAnchor","hitTestCurve","handleHalf","knot","dx","b","a","dy","alpha","segmentSampleAt","t1","p0","p1","t2","p2","t3","p3","t","u","a1x","a1y","a2x","a2y","a3x","a3y","b1x","b1y","b2x","b2y","sampleCatmullRom","anchors","samplesPerSegment","n","out","reflectStart","reflectEnd","i","tStart","s","tangents","ys","m","avg","mag","hermite","m0","m1","sampleMonotone","xs","tx","ty","startStep","sampleLinear","sampleByInterpolation","mode","SAMPLES_PER_SEGMENT","ENDPOINT_HALF","LOCKED_HALF","ANCHOR_SNAP_PX","CURVE_HIT_PX","KEY_STEP_FRACTION","SHIFT_MULTIPLIER","formatCoord","clampToModelRange","ctx","xLo","xHi","yLo","yHi","p","isPinnedEndpointAt","endpoints","index","count","projectAnchors","points","segmentSamples","all","interpolation","start","end","slice","resolveInterpolation","cfg","createFunctionLayer","id","domain","constrain","addPointMode","interactive","curveVisible","render","state","plotAnchors","pathD","fillD","samples","parts","closingY","first","last","fillParts","Fragment","pinned","locked","active","activeIndex","isEndpoint","a11y","node","anchorCls","half","hitTest","plot","segs","c","moveAnchor","mr","xMin","xMax","nx","model","ny","epsilon","left","right","clamped","next","makeDragGesture","onPointerDown","hit","e","extra","insertIndex","segIdx","modelPt","nextPoints","onEmptyPointerDown","onKeyDown","target","el","mult","xSpan","moved","functionLayerState","CurveEditor","props","layer","useMemo","minPoints","maxPoints","curve","fill","hideNonInteractive","renderAnchor","layerState","setLayerState","useState","value","layerStateRef","useLatest","handleLayerChange","useCallback","nextUnknown","prevPoints","onInput","handleLayerCommit","onChange","prev","prevUnknown","onContextMenu","idxAttr","idx","layers","decorations","createSetCurveOp","args","controlPointsEqual","from","to"],"sources":["../../src/components/CurveEditor/catmullRom.ts","../../src/components/CurveEditor/monotone.ts","../../src/components/CurveEditor/interpolation.ts","../../src/components/CurveEditor/createFunctionLayer.tsx","../../src/components/CurveEditor/CurveEditor.tsx","../../src/components/CurveEditor/setCurveOp.ts"],"sourcesContent":["/**\n * Catmull-Rom spline sampling, parameterized by α.\n *\n * α = 0 → uniform parameterization (original Catmull-Rom). Fast, can\n * produce cusps and self-intersections at sharp 2D angles.\n * α = 0.5 → centripetal (Yuksel/Schneider 2011). No cusps, no\n * self-intersection. The \"safe default\" for 2D.\n * α = 1 → chordal. Smoother than uniform, different artifacts.\n *\n * `sampleCurve(...)` is the convenience alias for centripetal (α=0.5).\n */\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nfunction knot(a: Point, b: Point, alpha: number): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return Math.pow(Math.sqrt(dx * dx + dy * dy), alpha);\n}\n\n/**\n * Sample the Catmull-Rom segment between p1 and p2 at parameter\n * t ∈ [0, 1]. p0 and p3 are the surrounding control points (use phantom\n * reflection at endpoints — see sampleCatmullRom below).\n *\n * Returns p1 at t=0 and p2 at t=1. `alpha` controls parameterization.\n */\nexport function segmentSampleAt(\n p0: Point, p1: Point, p2: Point, p3: Point, t: number,\n alpha: number = 0.5,\n): Point {\n const t0 = 0;\n const t1 = t0 + knot(p0, p1, alpha);\n const t2 = t1 + knot(p1, p2, alpha);\n const t3 = t2 + knot(p2, p3, alpha);\n\n // Degenerate: coincident p1/p2 → linear interpolation fallback.\n if (t2 - t1 === 0) {\n return { x: p1.x + (p2.x - p1.x) * t, y: p1.y + (p2.y - p1.y) * t };\n }\n\n const u = t1 + t * (t2 - t1);\n\n const a1x = ((t1 - u) * p0.x + (u - t0) * p1.x) / (t1 - t0);\n const a1y = ((t1 - u) * p0.y + (u - t0) * p1.y) / (t1 - t0);\n const a2x = ((t2 - u) * p1.x + (u - t1) * p2.x) / (t2 - t1);\n const a2y = ((t2 - u) * p1.y + (u - t1) * p2.y) / (t2 - t1);\n const a3x = ((t3 - u) * p2.x + (u - t2) * p3.x) / (t3 - t2);\n const a3y = ((t3 - u) * p2.y + (u - t2) * p3.y) / (t3 - t2);\n\n const b1x = ((t2 - u) * a1x + (u - t0) * a2x) / (t2 - t0);\n const b1y = ((t2 - u) * a1y + (u - t0) * a2y) / (t2 - t0);\n const b2x = ((t3 - u) * a2x + (u - t1) * a3x) / (t3 - t1);\n const b2y = ((t3 - u) * a2y + (u - t1) * a3y) / (t3 - t1);\n\n const cx = ((t2 - u) * b1x + (u - t1) * b2x) / (t2 - t1);\n const cy = ((t2 - u) * b1y + (u - t1) * b2y) / (t2 - t1);\n return { x: cx, y: cy };\n}\n\n/**\n * Sample the whole curve through `anchors` using Catmull-Rom with the\n * given α. Returns `(n-1) * samplesPerSegment + 1` points. Phantom\n * endpoints by reflection so the first/last segments are tangent to\n * the chord into/out of the endpoints. Returns `[]` for fewer than 2\n * anchors.\n */\nexport function sampleCatmullRom(\n anchors: readonly Point[],\n samplesPerSegment: number,\n alpha: number = 0.5,\n): Point[] {\n if (anchors.length < 2) return [];\n if (samplesPerSegment < 1) samplesPerSegment = 1;\n\n const n = anchors.length;\n const out: Point[] = [];\n\n const reflectStart: Point = {\n x: 2 * anchors[0].x - anchors[1].x,\n y: 2 * anchors[0].y - anchors[1].y,\n };\n const reflectEnd: Point = {\n x: 2 * anchors[n - 1].x - anchors[n - 2].x,\n y: 2 * anchors[n - 1].y - anchors[n - 2].y,\n };\n\n for (let i = 0; i < n - 1; i++) {\n const p0 = i === 0 ? reflectStart : anchors[i - 1];\n const p1 = anchors[i];\n const p2 = anchors[i + 1];\n const p3 = i + 2 < n ? anchors[i + 2] : reflectEnd;\n const tStart = i === 0 ? 0 : 1;\n for (let s = tStart; s <= samplesPerSegment; s++) {\n if (s === 0) {\n out.push(p1);\n continue;\n }\n if (s === samplesPerSegment) {\n out.push(p2);\n continue;\n }\n const t = s / samplesPerSegment;\n out.push(segmentSampleAt(p0, p1, p2, p3, t, alpha));\n }\n }\n return out;\n}\n\n/** Convenience alias for centripetal Catmull-Rom (α=0.5). The most\n * common choice; safe default for 2D paths. */\nexport function sampleCurve(\n anchors: readonly Point[],\n samplesPerSegment: number,\n): Point[] {\n return sampleCatmullRom(anchors, samplesPerSegment, 0.5);\n}\n","/**\n * Monotone cubic interpolation (Fritsch-Carlson / Steffen variant).\n *\n * Passes through every anchor and guarantees the curve never\n * overshoots `min(neighbors)` / `max(neighbors)` along either axis.\n * The right choice for animation timing curves (no anticipation) or\n * audio envelopes (no out-of-range values).\n *\n * Parameterized by index — works for both 1D (function-shaped) and\n * 2D (parametric) anchor sequences. The x and y coordinates are\n * interpolated independently as functions of the anchor index.\n *\n * Reference: Fritsch & Carlson 1980, \"Monotone piecewise cubic\n * interpolation.\" Steffen's 1990 refinement is conceptually the same;\n * we use a min-clamp variant that's monotonicity-preserving by\n * construction.\n */\n\nimport type { Point } from './catmullRom';\n\n/** Per-axis tangent computation for a 1D series of y-values sampled at\n * unit intervals (index-parameterized). Returns one tangent per\n * anchor. */\nfunction tangents(ys: readonly number[]): number[] {\n const n = ys.length;\n if (n === 0) return [];\n if (n === 1) return [0];\n\n // Secant slopes (dx = 1 in index parameterization).\n const m: number[] = new Array(n - 1);\n for (let i = 0; i < n - 1; i++) m[i] = ys[i + 1] - ys[i];\n\n const t: number[] = new Array(n);\n t[0] = m[0];\n t[n - 1] = m[n - 2];\n\n for (let i = 1; i < n - 1; i++) {\n if (m[i - 1] * m[i] <= 0) {\n // Sign change or flat → local extremum; tangent is zero (forces\n // the curve to settle without overshoot).\n t[i] = 0;\n } else {\n // Weighted average of adjacent secants (with dx_i = dx_{i-1} = 1,\n // this is just the arithmetic mean). Clamped by Steffen's rule\n // so the cubic stays monotone within each segment.\n const avg = (m[i - 1] + m[i]) / 2;\n const mag = Math.min(Math.abs(m[i - 1]), Math.abs(m[i]), Math.abs(avg));\n t[i] = Math.sign(avg) * mag;\n }\n }\n return t;\n}\n\n/** Cubic Hermite basis at parameter t ∈ [0, 1] given endpoint values\n * p0, p1 and endpoint tangents m0, m1. */\nfunction hermite(\n p0: number, p1: number, m0: number, m1: number, t: number,\n): number {\n const t2 = t * t;\n const t3 = t2 * t;\n return (\n (2 * t3 - 3 * t2 + 1) * p0 +\n (t3 - 2 * t2 + t) * m0 +\n (-2 * t3 + 3 * t2) * p1 +\n (t3 - t2) * m1\n );\n}\n\n/**\n * Sample the monotone-cubic curve through `anchors`. Returns\n * `(n-1) * samplesPerSegment + 1` points (same shape as\n * `sampleCatmullRom`). `[]` for fewer than 2 anchors.\n */\nexport function sampleMonotone(\n anchors: readonly Point[],\n samplesPerSegment: number,\n): Point[] {\n if (anchors.length < 2) return [];\n if (samplesPerSegment < 1) samplesPerSegment = 1;\n\n const n = anchors.length;\n const xs = anchors.map((a) => a.x);\n const ys = anchors.map((a) => a.y);\n const tx = tangents(xs);\n const ty = tangents(ys);\n\n const out: Point[] = [];\n for (let i = 0; i < n - 1; i++) {\n const startStep = i === 0 ? 0 : 1; // skip duplicate boundary\n for (let s = startStep; s <= samplesPerSegment; s++) {\n if (s === 0) { out.push(anchors[i]); continue; }\n if (s === samplesPerSegment) { out.push(anchors[i + 1]); continue; }\n const t = s / samplesPerSegment;\n out.push({\n x: hermite(xs[i], xs[i + 1], tx[i], tx[i + 1], t),\n y: hermite(ys[i], ys[i + 1], ty[i], ty[i + 1], t),\n });\n }\n }\n return out;\n}\n","/**\n * Interpolation mode dispatcher for CurveEditor. The vocabulary of\n * supported algorithms and the unified `sample(...)` entry point that\n * picks the right one. All algorithms produce\n * `(n-1) * samplesPerSegment + 1` points and pass through every\n * anchor — CurveEditor is strictly interpolating, never approximating.\n */\n\nimport { sampleCatmullRom, type Point } from './catmullRom';\nimport { sampleMonotone } from './monotone';\n\n/** Supported interpolation modes. All are interpolating (pass through\n * every anchor); the differences are in tangent computation and\n * parameterization. */\nexport type InterpolationMode =\n | 'linear'\n | 'catmull-rom' // centripetal (α=0.5) — safe default\n | 'catmull-rom-uniform' // α=0; can cusp on sharp 2D angles\n | 'catmull-rom-chordal' // α=1; smoother than uniform\n | 'monotone'; // Fritsch-Carlson / Steffen; no overshoot\n\n/** Sample anchors as a polyline. Produces the same sample count shape\n * as the Catmull-Rom variants so downstream segment-slicing logic\n * (hit testing, fill path construction) works uniformly. */\nfunction sampleLinear(\n anchors: readonly Point[],\n samplesPerSegment: number,\n): Point[] {\n if (anchors.length < 2) return [];\n if (samplesPerSegment < 1) samplesPerSegment = 1;\n\n const out: Point[] = [];\n for (let i = 0; i < anchors.length - 1; i++) {\n const a = anchors[i];\n const b = anchors[i + 1];\n const startStep = i === 0 ? 0 : 1;\n for (let s = startStep; s <= samplesPerSegment; s++) {\n if (s === 0) { out.push(a); continue; }\n if (s === samplesPerSegment) { out.push(b); continue; }\n const t = s / samplesPerSegment;\n out.push({ x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t });\n }\n }\n return out;\n}\n\n/** Sample `anchors` using the chosen interpolation mode. */\nexport function sampleByInterpolation(\n anchors: readonly Point[],\n samplesPerSegment: number,\n mode: InterpolationMode,\n): Point[] {\n switch (mode) {\n case 'linear':\n return sampleLinear(anchors, samplesPerSegment);\n case 'catmull-rom-uniform':\n return sampleCatmullRom(anchors, samplesPerSegment, 0);\n case 'catmull-rom-chordal':\n return sampleCatmullRom(anchors, samplesPerSegment, 1);\n case 'monotone':\n return sampleMonotone(anchors, samplesPerSegment);\n case 'catmull-rom':\n default:\n return sampleCatmullRom(anchors, samplesPerSegment, 0.5);\n }\n}\n","/**\n * Built-in function/curve layer for LayeredCurveEditor. Bundles the\n * curve-render + anchor-render + drag/insert/delete gestures that were\n * the entirety of the original `CurveEditor`. Multiple instances coexist\n * by id; consumers can compose several to plot e.g. a primary function\n * and a derived (read-only) curve on the same chart.\n */\nimport type { ReactNode } from 'react';\nimport { sampleByInterpolation, type InterpolationMode } from './interpolation';\nimport { hitTestAnchor, hitTestCurve } from './hitTest';\nimport { handleHalf } from '../../handles';\nimport { dlog } from '../../dlog';\nimport s from './CurveEditor.module.css';\nimport type {\n CurveLayer, LayerCtx, LayerGesture, LayerRenderCtx, ModelPoint, PlotPoint,\n EmptyDownArgs, KeyDownArgs,\n} from './layerTypes';\n\n// ── Public types ─────────────────────────────────────────────────────\n\n/** One anchor of a curve, in model space. */\nexport interface ControlPoint {\n x: number;\n y: number;\n /** When true, this control point can't be moved or deleted by the\n * user. Render as a smaller diamond with locked styling. */\n locked?: boolean;\n}\n\n/**\n * Whether a curve's points keep their x order. In `'1d'` an anchor cannot be\n * dragged past its neighbors and a new point is inserted at its x position;\n * in `'2d'` points are free to move anywhere and keep their list order.\n */\nexport type CurveDomain = '1d' | '2d';\n/**\n * How much of a curve's first and last anchor the user may move: everything,\n * only their y, or nothing.\n */\nexport type EndpointMode = 'free' | 'pinned-x' | 'pinned-both';\n/**\n * Where a click adds a new anchor — on the curve itself, anywhere in the\n * plot, or nowhere.\n */\nexport type AddPointMode = 'click-curve' | 'click-empty' | 'never';\n\n/**\n * What a `renderAnchor` function is given for one anchor: the point, its\n * index, its position in plot space (`cx`/`cy`), and the states that change\n * how it should look.\n */\nexport interface AnchorRenderProps {\n point: ControlPoint;\n index: number;\n cx: number;\n cy: number;\n isActive: boolean;\n isLocked: boolean;\n isPinnedEndpoint: boolean;\n isEndpoint: boolean;\n}\n\n/**\n * Per-instance curve-rendering overrides. Currently empty — passing `{}`\n * means \"draw the curve\", and `false`/`null` means don't.\n */\nexport type CurveSettings = object;\n\n/** Shades the region between the curve and one edge of the plot. */\nexport interface FillSettings {\n side: 'below' | 'above';\n color?: string;\n}\n\n/** Configuration for {@link createFunctionLayer}. */\nexport interface FunctionLayerConfig {\n /** Layer id; default `'function'`. Two instances on the same editor\n * must have distinct ids. */\n id?: string;\n domain?: CurveDomain;\n endpoints?: EndpointMode;\n interpolation?: InterpolationMode;\n constrain?: 'none' | 'function';\n addPointMode?: AddPointMode;\n minPoints?: number;\n maxPoints?: number;\n curve?: CurveSettings | false | null;\n fill?: FillSettings | false | null;\n hideNonInteractive?: boolean;\n renderAnchor?: (info: AnchorRenderProps) => ReactNode;\n /** When false, the layer renders the curve+fill but doesn't render\n * anchors and doesn't accept pointer input. For derived read-only\n * curves (e.g. plotting f'(x) alongside f(x)). Default true. */\n interactive?: boolean;\n /** Override x clamp range for drags and pinned endpoints. Defaults\n * to the editor's modelRange x. Use this to constrain a layer to a\n * sub-range of the plot (e.g. a bevel curve occupying x ∈ [0, b]\n * while the editor's xRange is [0, halfWidth]). */\n xClamp?: readonly [number, number];\n /** Names the curve in each anchor's accessible name. Default `'Point'`. */\n label?: string;\n}\n\n/**\n * The state a function layer owns. Treat it as opaque and round-trip it\n * through `LayeredCurveEditor`'s `onLayerChange`; `points` is the part worth\n * reading.\n */\nexport interface FunctionLayerState {\n points: readonly ControlPoint[];\n /** Layer-internal: the index of the anchor currently being dragged.\n * Cleared between gestures. Consumers treat the whole state as\n * opaque and round-trip it via onLayerChange. */\n activeIndex: number | null;\n}\n\nconst SAMPLES_PER_SEGMENT = 16;\nconst ENDPOINT_HALF = handleHalf('--wzl-handle-size-lg');\nconst LOCKED_HALF = handleHalf('--wzl-handle-size-sm');\nconst ANCHOR_SNAP_PX = 12;\nconst CURVE_HIT_PX = 8;\n/** An arrow-key nudge, as a fraction of the range; shift takes ten. */\nconst KEY_STEP_FRACTION = 0.01;\nconst SHIFT_MULTIPLIER = 10;\n\nconst formatCoord = (n: number): string => String(Number(n.toFixed(3)));\n\n// ── Helpers ───────────────────────────────────────────────────────────\n\nfunction clampToModelRange(p: ModelPoint, ctx: LayerCtx): ModelPoint {\n const m = ctx.modelRange;\n const xLo = Math.min(m.xMin, m.xMax);\n const xHi = Math.max(m.xMin, m.xMax);\n const yLo = Math.min(m.yMin, m.yMax);\n const yHi = Math.max(m.yMin, m.yMax);\n return {\n x: Math.max(xLo, Math.min(xHi, p.x)),\n y: Math.max(yLo, Math.min(yHi, p.y)),\n };\n}\n\nfunction isPinnedEndpointAt(index: number, count: number, endpoints: EndpointMode): boolean {\n if (endpoints === 'free') return false;\n return index === 0 || index === count - 1;\n}\n\nfunction projectAnchors(points: readonly ControlPoint[], ctx: LayerCtx): PlotPoint[] {\n return points.map((p) => ctx.toPlot(p));\n}\n\nfunction segmentSamples(\n points: readonly ControlPoint[],\n interpolation: InterpolationMode,\n ctx: LayerCtx,\n): PlotPoint[][] {\n if (points.length < 2) return [];\n const all = sampleByInterpolation(points, SAMPLES_PER_SEGMENT, interpolation);\n const out: PlotPoint[][] = [];\n for (let i = 0; i < points.length - 1; i++) {\n const start = i * SAMPLES_PER_SEGMENT;\n const end = start + SAMPLES_PER_SEGMENT;\n const slice = all.slice(start, end + 1);\n out.push(slice.map((p) => ctx.toPlot(p)));\n }\n return out;\n}\n\nfunction resolveInterpolation(cfg: FunctionLayerConfig): InterpolationMode {\n return (cfg.constrain ?? 'none') === 'function'\n ? 'monotone'\n : (cfg.interpolation ?? 'catmull-rom');\n}\n\n// ── Factory ───────────────────────────────────────────────────────────\n\n/**\n * Builds the built-in curve layer for `LayeredCurveEditor`: it draws the\n * interpolated curve and its anchors, and handles dragging, inserting and\n * deleting them.\n *\n * Several can coexist on one editor as long as their ids differ — plotting a\n * derived read-only curve beside an editable one is the case it is shaped\n * for, via `interactive: false`.\n */\nexport function createFunctionLayer(cfg: FunctionLayerConfig = {}): CurveLayer<FunctionLayerState> {\n const id = cfg.id ?? 'function';\n const domain = cfg.domain ?? '2d';\n const endpoints = cfg.endpoints ?? 'free';\n const constrain = cfg.constrain ?? 'none';\n const addPointMode = cfg.addPointMode ?? 'click-curve';\n const interpolation = resolveInterpolation(cfg);\n const interactive = cfg.interactive !== false;\n const curveVisible = cfg.curve !== false && cfg.curve !== null;\n\n // ── render ──────────────────────────────────────────────────────────\n function render(state: FunctionLayerState, ctx: LayerRenderCtx): ReactNode {\n const { points, activeIndex } = state;\n const plotAnchors = projectAnchors(points, ctx);\n\n let pathD = '';\n let fillD: string | null = null;\n if (points.length >= 2) {\n const samples = sampleByInterpolation(points, SAMPLES_PER_SEGMENT, interpolation)\n .map((p) => ctx.toPlot(p));\n const parts: string[] = [`M${samples[0].x.toFixed(2)},${samples[0].y.toFixed(2)}`];\n for (let i = 1; i < samples.length; i++) {\n parts.push(`L${samples[i].x.toFixed(2)},${samples[i].y.toFixed(2)}`);\n }\n pathD = parts.join('');\n\n if (cfg.fill) {\n const closingY = cfg.fill.side === 'below' ? ctx.plotSize.height : 0;\n const first = samples[0];\n const last = samples[samples.length - 1];\n const fillParts = [...parts];\n fillParts.push(`L${last.x.toFixed(2)},${closingY.toFixed(2)}`);\n fillParts.push(`L${first.x.toFixed(2)},${closingY.toFixed(2)}`);\n fillParts.push('Z');\n fillD = fillParts.join('');\n }\n }\n\n return (\n <>\n {fillD && (\n <path\n data-curve-element=\"fill\"\n className={s.fill}\n d={fillD}\n fill={cfg.fill ? cfg.fill.color : undefined}\n />\n )}\n {pathD && curveVisible && (\n <path\n className={s.curve}\n d={pathD}\n fill=\"none\"\n />\n )}\n {interactive && plotAnchors.map((a, i) => {\n const pinned = isPinnedEndpointAt(i, points.length, endpoints);\n const locked = points[i]?.locked === true;\n if ((locked || pinned) && cfg.hideNonInteractive) return null;\n const active = activeIndex === i;\n const isEndpoint = curveVisible && (i === 0 || i === points.length - 1);\n const focus = !locked && !(endpoints === 'pinned-both' && pinned)\n ? { tabIndex: 0 }\n : {};\n const a11y = {\n ...focus,\n role: 'button',\n 'aria-label': `${cfg.label ?? 'Point'} ${i + 1} at ${formatCoord(points[i].x)}, ${formatCoord(points[i].y)}`,\n };\n if (cfg.renderAnchor) {\n const node = cfg.renderAnchor({\n point: points[i], index: i,\n cx: a.x, cy: a.y,\n isActive: active, isLocked: locked,\n isPinnedEndpoint: pinned, isEndpoint,\n });\n if (node !== null && node !== undefined) {\n return <g key={i} data-anchor-index={i} {...a11y}>{node}</g>;\n }\n }\n const anchorCls = [\n s.anchor,\n isEndpoint && s.endpoint,\n (pinned || locked) && s.pinned,\n locked && s.locked,\n active && s.active,\n ].filter(Boolean).join(' ');\n const renderAsDiamond = isEndpoint || locked;\n if (renderAsDiamond) {\n const half = locked ? LOCKED_HALF : ENDPOINT_HALF;\n return (\n <rect\n key={i}\n className={anchorCls}\n x={a.x - half}\n y={a.y - half}\n width={half * 2}\n height={half * 2}\n transform={`rotate(45 ${a.x} ${a.y})`}\n data-anchor-index={i}\n {...a11y}\n />\n );\n }\n return (\n <circle\n key={i}\n className={anchorCls}\n cx={a.x}\n cy={a.y}\n r={4}\n data-anchor-index={i}\n {...a11y}\n />\n );\n })}\n </>\n );\n }\n\n // ── hit test ────────────────────────────────────────────────────────\n function hitTest(state: FunctionLayerState, plot: PlotPoint, ctx: LayerCtx) {\n if (!interactive) return null;\n const plotAnchors = projectAnchors(state.points, ctx);\n const a = hitTestAnchor(plotAnchors, plot, ANCHOR_SNAP_PX);\n if (a) return { kind: 'anchor' as const, payload: { index: a.index } };\n if (addPointMode === 'click-curve' && curveVisible) {\n const segs = segmentSamples(state.points, interpolation, ctx);\n const c = hitTestCurve(segs, plot, CURVE_HIT_PX);\n if (c) return { kind: 'curve' as const, payload: { segIdx: c.segIdx, t: c.t } };\n }\n return null;\n }\n\n // ── move constraint, shared by drag and keyboard ────────────────────\n function moveAnchor(state: FunctionLayerState, index: number, model: ModelPoint, ctx: LayerCtx): FunctionLayerState {\n const points = state.points;\n if (index < 0 || index >= points.length) return state;\n const mr = ctx.modelRange;\n const xMin = cfg.xClamp ? cfg.xClamp[0] : mr.xMin;\n const xMax = cfg.xClamp ? cfg.xClamp[1] : mr.xMax;\n let nx = model.x;\n let ny = model.y;\n const isEndpoint = index === 0 || index === points.length - 1;\n\n if (endpoints === 'pinned-both' && isEndpoint) {\n nx = points[index].x;\n ny = points[index].y;\n } else if (endpoints === 'pinned-x' && isEndpoint) {\n nx = index === 0 ? xMin : xMax;\n } else if (constrain === 'function' || domain === '1d') {\n const epsilon = constrain === 'function'\n ? (xMax - xMin) / 1000\n : 0;\n const left = index > 0 ? points[index - 1].x + epsilon : xMin;\n const right = index < points.length - 1 ? points[index + 1].x - epsilon : xMax;\n nx = Math.max(left, Math.min(right, nx));\n }\n\n // Always clamp x to the layer's own range (so free-mode\n // interior anchors of a sub-range layer can't escape it).\n // Normalize bounds for inverted ranges.\n {\n const lo = Math.min(xMin, xMax);\n const hi = Math.max(xMin, xMax);\n nx = Math.max(lo, Math.min(hi, nx));\n }\n const clamped = clampToModelRange({ x: nx, y: ny }, ctx);\n const next = points.slice();\n next[index] = { ...points[index], x: clamped.x, y: clamped.y };\n return { ...state, points: next, activeIndex: index };\n }\n\n // ── drag gesture ────────────────────────────────────────────────────\n function makeDragGesture(index: number): LayerGesture<FunctionLayerState> {\n return {\n onMove(state, model, _e, ctx) { return moveAnchor(state, index, model, ctx); },\n onCommit(state) { return { ...state, activeIndex: null }; },\n onCancel(state) { return { ...state, activeIndex: null }; },\n };\n }\n\n // ── pointerdown on a positive hit ───────────────────────────────────\n function onPointerDown(\n state: FunctionLayerState,\n hit: { kind: string; payload?: unknown },\n e: PointerEvent,\n ctx: LayerCtx,\n extra: EmptyDownArgs<FunctionLayerState>,\n ): LayerGesture<FunctionLayerState> | void {\n if (hit.kind === 'anchor') {\n const { index } = hit.payload as { index: number };\n dlog('function-layer', 'anchor-down', { id, index, shift: ctx.modifiers.shift, button: e.button });\n if (state.points[index]?.locked) return;\n if (ctx.modifiers.shift) {\n if (isPinnedEndpointAt(index, state.points.length, endpoints)) return;\n if (cfg.minPoints !== undefined && state.points.length <= cfg.minPoints) return;\n extra.commit({\n ...state,\n points: state.points.filter((_, i) => i !== index),\n activeIndex: null,\n });\n return;\n }\n if (e.button === 2) return;\n extra.commit({ ...state, activeIndex: index });\n return makeDragGesture(index);\n }\n if (hit.kind === 'curve') {\n const { segIdx } = hit.payload as { segIdx: number; t: number };\n if (cfg.maxPoints !== undefined && state.points.length >= cfg.maxPoints) return;\n const insertIndex = segIdx + 1;\n const modelPt = clampToModelRange(extra.model, ctx);\n\n // function/1d: refuse insert that would be immediately clamped\n // against a neighbor (mouse jitter would otherwise drop a phantom\n // point directly above an existing anchor). Snap to dragging the\n // neighbor instead.\n if (constrain === 'function' || domain === '1d') {\n const epsilon = constrain === 'function'\n ? (ctx.modelRange.xMax - ctx.modelRange.xMin) / 1000\n : 0;\n const left = insertIndex > 0 ? state.points[insertIndex - 1] : null;\n const right = insertIndex < state.points.length ? state.points[insertIndex] : null;\n if (left && Math.abs(modelPt.x - left.x) < epsilon * 2) {\n extra.commit({ ...state, activeIndex: insertIndex - 1 });\n return makeDragGesture(insertIndex - 1);\n }\n if (right && Math.abs(modelPt.x - right.x) < epsilon * 2) {\n extra.commit({ ...state, activeIndex: insertIndex });\n return makeDragGesture(insertIndex);\n }\n }\n\n const nextPoints = [...state.points.slice(0, insertIndex), modelPt, ...state.points.slice(insertIndex)];\n extra.commit({ ...state, points: nextPoints, activeIndex: insertIndex });\n return makeDragGesture(insertIndex);\n }\n }\n\n // ── empty-space click ───────────────────────────────────────────────\n function onEmptyPointerDown(\n state: FunctionLayerState,\n model: ModelPoint,\n _e: PointerEvent,\n ctx: LayerCtx,\n extra: EmptyDownArgs<FunctionLayerState>,\n ): LayerGesture<FunctionLayerState> | void {\n if (!interactive) return;\n if (addPointMode !== 'click-empty') return;\n if (cfg.maxPoints !== undefined && state.points.length >= cfg.maxPoints) return;\n\n const clamped = clampToModelRange(model, ctx);\n let insertIndex = state.points.length;\n if (domain === '1d') {\n for (let i = 0; i < state.points.length; i++) {\n if (state.points[i].x > clamped.x) { insertIndex = i; break; }\n }\n }\n const nextPoints = [...state.points.slice(0, insertIndex), clamped, ...state.points.slice(insertIndex)];\n extra.commit({ ...state, points: nextPoints, activeIndex: null });\n return;\n }\n\n // ── keyboard ────────────────────────────────────────────────────────\n function onKeyDown(\n state: FunctionLayerState,\n e: KeyboardEvent,\n ctx: LayerCtx,\n extra: KeyDownArgs<FunctionLayerState>,\n ): void {\n if (!interactive) return;\n const target = e.target as Element | null;\n if (target?.closest?.('[data-layer-id]')?.getAttribute('data-layer-id') !== id) return;\n const el = target.closest('[data-anchor-index]');\n if (!el) return;\n const dx = e.key === 'ArrowRight' ? 1 : e.key === 'ArrowLeft' ? -1 : 0;\n const dy = e.key === 'ArrowUp' ? 1 : e.key === 'ArrowDown' ? -1 : 0;\n if (dx === 0 && dy === 0) return;\n e.preventDefault();\n const index = Number(el.getAttribute('data-anchor-index'));\n const p = state.points[index];\n if (!p || p.locked) return;\n const m = ctx.modelRange;\n const mult = e.shiftKey ? SHIFT_MULTIPLIER : 1;\n const xSpan = cfg.xClamp ? cfg.xClamp[1] - cfg.xClamp[0] : m.xMax - m.xMin;\n const next = moveAnchor(state, index, {\n x: p.x + dx * Math.abs(xSpan) * KEY_STEP_FRACTION * mult,\n y: p.y + dy * Math.abs(m.yMax - m.yMin) * KEY_STEP_FRACTION * mult,\n }, ctx);\n const moved = next.points[index];\n if (moved.x === p.x && moved.y === p.y) return;\n extra.commit({ ...next, activeIndex: null });\n }\n\n return {\n id,\n render,\n hitTest,\n onPointerDown,\n onEmptyPointerDown,\n onKeyDown,\n };\n}\n\n/** Convenience: build a function-layer state from a points array. */\nexport function functionLayerState(points: readonly ControlPoint[]): FunctionLayerState {\n return { points, activeIndex: null };\n}\n","/**\n * Back-compat wrapper around `LayeredCurveEditor` that preserves the\n * original single-curve API. New consumers wanting multi-layer\n * composition should reach for `LayeredCurveEditor` + `createFunctionLayer`\n * directly.\n */\nimport {\n useCallback, useEffect, useMemo, useState,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from 'react';\nimport {\n type GridSettings,\n type AxesSettings,\n type TickSettings,\n} from '../Plot2D';\nimport type { InterpolationMode } from './interpolation';\nimport {\n createFunctionLayer,\n type ControlPoint,\n type CurveDomain,\n type EndpointMode,\n type AddPointMode,\n type CurveSettings,\n type FillSettings,\n type AnchorRenderProps,\n type FunctionLayerState,\n} from './createFunctionLayer';\nimport { LayeredCurveEditor } from './LayeredCurveEditor';\nimport { useLatest } from '@weasel-js/core';\n\nexport type { GridSettings, AxesSettings, TickSettings };\nexport type {\n ControlPoint, CurveDomain, EndpointMode, AddPointMode,\n CurveSettings, FillSettings, AnchorRenderProps,\n};\n\n/**\n * Props for {@link CurveEditor}. `onInput` fires throughout a gesture and\n * `onChange` once at its end, with the pre-gesture points as `prev`.\n */\nexport interface CurveEditorProps {\n value: readonly ControlPoint[];\n onInput: (next: ControlPoint[]) => void;\n onChange?: (next: ControlPoint[], prev: readonly ControlPoint[]) => void;\n domain?: CurveDomain;\n interpolation?: InterpolationMode;\n endpoints?: EndpointMode;\n xRange?: readonly [number, number];\n yRange?: readonly [number, number];\n width: number;\n height: number;\n grid?: GridSettings | false | null;\n axes?: AxesSettings | false | null;\n xTicks?: TickSettings | false | null;\n yTicks?: TickSettings | false | null;\n curve?: CurveSettings | false | null;\n fill?: FillSettings | false | null;\n hideNonInteractive?: boolean;\n constrain?: 'none' | 'function';\n history?: boolean;\n minPoints?: number;\n maxPoints?: number;\n addPointMode?: AddPointMode;\n renderAnchor?: (info: AnchorRenderProps) => ReactNode;\n /** Extra SVG content rendered behind the curve and anchors. */\n decorations?: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Editable curve through a list of control points: drag anchors, click to\n * insert, right-click to delete, with optional built-in undo.\n *\n * This is the single-curve API, implemented as one `createFunctionLayer` on\n * a `LayeredCurveEditor`. Reach for those directly to stack several curves\n * on one plot.\n */\nexport function CurveEditor(props: CurveEditorProps) {\n const {\n value, onInput, onChange,\n domain, endpoints, interpolation, constrain, addPointMode,\n minPoints, maxPoints, curve, fill, hideNonInteractive, renderAnchor,\n width, height, xRange, yRange, grid, axes, xTicks, yTicks, history,\n className, style, decorations,\n } = props;\n\n // Layer is config-only; rebuild only when *config* changes.\n const layer = useMemo(() => createFunctionLayer({\n id: 'function',\n domain, endpoints, interpolation, constrain, addPointMode,\n minPoints, maxPoints, curve, fill, hideNonInteractive, renderAnchor,\n }), [\n domain, endpoints, interpolation, constrain, addPointMode,\n minPoints, maxPoints, curve, fill, hideNonInteractive, renderAnchor,\n ]);\n\n // Hybrid controlled-state: the wrapper holds the full FunctionLayerState\n // locally so that consumers using the original CurveEditor API don't\n // have to wire their `value` prop back through on every drag tick to\n // keep the in-flight gesture advancing. We adopt the consumer's\n // `value` prop when it changes externally (and no gesture is active).\n const [layerState, setLayerState] = useState<FunctionLayerState>(\n () => ({ points: value, activeIndex: null }),\n );\n // Ref mirror so the layerChange callback can compare against the\n // freshest state without re-binding on every render.\n const layerStateRef = useLatest(layerState);\n\n // Sync from controlled `value` when the consumer updates it externally\n // and we're idle. Skip the update during a gesture so drag-in-flight\n // points aren't clobbered by a stale `value`.\n useEffect(() => {\n if (layerStateRef.current.activeIndex !== null) return;\n if (layerStateRef.current.points === value) return;\n setLayerState({ points: value, activeIndex: null });\n }, [value, layerStateRef]);\n\n const handleLayerChange = useCallback((_id: string, nextUnknown: unknown) => {\n const next = nextUnknown as FunctionLayerState;\n const prevPoints = layerStateRef.current.points;\n setLayerState(next);\n if (next.points !== prevPoints) {\n onInput(next.points as ControlPoint[]);\n }\n }, [onInput, layerStateRef]);\n\n const handleLayerCommit = useCallback((_id: string, nextUnknown: unknown, prevUnknown: unknown) => {\n if (!onChange) return;\n const next = nextUnknown as FunctionLayerState;\n const prev = prevUnknown as FunctionLayerState;\n if (next.points !== prev.points) {\n onChange?.(next.points as ControlPoint[], prev.points);\n }\n }, [onChange]);\n\n // Right-click on an anchor → delete (preserves original CurveEditor\n // behavior). LayeredCurveEditor doesn't model contextmenu as a\n // gesture; we intercept at the wrapper level by walking the DOM\n // target for `data-anchor-index`.\n const onContextMenu = useCallback((e: ReactMouseEvent<HTMLDivElement>) => {\n const target = e.target as Element | null;\n const node = target?.closest?.('[data-anchor-index]') as Element | null;\n if (!node) return;\n e.preventDefault();\n e.stopPropagation();\n const idxAttr = node.getAttribute('data-anchor-index');\n if (idxAttr === null) return;\n const idx = Number(idxAttr);\n const points = layerStateRef.current.points;\n if (!Number.isInteger(idx) || idx < 0 || idx >= points.length) return;\n if (points[idx]?.locked) return;\n if (endpoints !== undefined && endpoints !== 'free' && (idx === 0 || idx === points.length - 1)) return;\n if (minPoints !== undefined && points.length <= minPoints) return;\n const next = points.filter((_, i) => i !== idx);\n setLayerState({ points: next, activeIndex: null });\n onInput(next as ControlPoint[]);\n onChange?.(next as ControlPoint[], points);\n }, [endpoints, minPoints, onInput, onChange, layerStateRef]);\n\n const layers = useMemo(() => [{ layer, state: layerState }], [layer, layerState]);\n\n return (\n <div\n onContextMenu={onContextMenu}\n style={{ display: 'contents' }}\n >\n <LayeredCurveEditor\n layers={layers}\n onLayerChange={handleLayerChange}\n onLayerCommit={handleLayerCommit}\n width={width}\n height={height}\n xRange={xRange}\n yRange={yRange}\n grid={grid}\n axes={axes}\n xTicks={xTicks}\n yTicks={yTicks}\n history={history}\n className={className}\n style={style}\n >\n {decorations}\n </LayeredCurveEditor>\n </div>\n );\n}\n","import type { Op } from '@weasel-js/core';\nimport type { ControlPoint } from './CurveEditor';\n\n/**\n * The adapter contract for {@link createSetCurveOp}. Consumers wire\n * this to whatever state container holds the curve's value — typically\n * a small callback that calls a React state setter or dispatches a\n * Redux/Zustand action.\n */\nexport interface SetCurveAdapter {\n setValue(id: string, next: readonly ControlPoint[]): void;\n}\n\n/**\n * Arguments for {@link createSetCurveOp}. `coalesceKey` merges consecutive\n * edits sharing it into one history entry.\n */\nexport interface CreateSetCurveOpArgs {\n /** Stable id the consumer uses for this curve. Used so a single\n * adapter can handle multiple curves; the op's apply routes by id. */\n id: string;\n from: readonly ControlPoint[];\n to: readonly ControlPoint[];\n label?: string;\n coalesceKey?: string;\n}\n\n/**\n * Op factory for editing a CurveEditor's value through weasel-history.\n *\n * history.applyOps(\n * [createSetCurveOp({ id: 'easing', from, to, label: 'Edit easing' })],\n * 'Edit easing',\n * );\n *\n * The op's `apply(adapter)` calls `adapter.setValue(id, to)`. `invert()`\n * returns a mirror op with `from`/`to` swapped. When `from` and `to`\n * are structurally equal, `apply` returns `false` so history can skip\n * the entry — same convention as `createSetPathOp`.\n */\nexport function createSetCurveOp(args: CreateSetCurveOpArgs): Op {\n const { id, from, to, label, coalesceKey } = args;\n return {\n name: 'setCurve',\n args: { id, from, to, label, coalesceKey },\n label,\n coalesceKey,\n apply(adapter) {\n if (controlPointsEqual(from, to)) return false;\n (adapter as SetCurveAdapter).setValue(id, to);\n return undefined;\n },\n invert() {\n return createSetCurveOp({ id, from: to, to: from, label, coalesceKey });\n },\n };\n}\n\nfunction controlPointsEqual(\n a: readonly ControlPoint[],\n b: readonly ControlPoint[],\n): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i].x !== b[i].x || a[i].y !== b[i].y) return false;\n }\n return true;\n}\n"],"mappings":"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"}
@@ -1,22 +1,22 @@
1
- import { t as e } from "./useReorderDragList-B_-5L5Gu.js";
2
- import { t } from "./Disclosure-0G0uh2fa.js";
1
+ import { t as e } from "./useReorderDragList-CStYKjHl.js";
2
+ import { t } from "./Disclosure-Ch2KxYuB.js";
3
3
  import { Fragment as n, jsx as r, jsxs as i } from "react/jsx-runtime";
4
4
  import { Fragment as a, useId as o, useMemo as s, useState as c } from "react";
5
5
  var l = {
6
- grid: "_grid_12i61_1",
7
- table: "_table_12i61_6",
8
- sortButton: "_sortButton_12i61_32",
9
- sortActive: "_sortActive_12i61_44",
10
- empty: "_empty_12i61_46",
11
- handleCol: "_handleCol_12i61_54",
12
- handleCell: "_handleCell_12i61_55",
13
- dragging: "_dragging_12i61_64",
14
- dropBefore: "_dropBefore_12i61_66",
15
- dropAfter: "_dropAfter_12i61_67",
16
- clickable: "_clickable_12i61_70",
17
- detailCol: "_detailCol_12i61_78",
18
- detailCell: "_detailCell_12i61_79",
19
- detailRow: "_detailRow_12i61_85"
6
+ grid: "_grid_18g0w_1",
7
+ table: "_table_18g0w_6",
8
+ sortButton: "_sortButton_18g0w_32",
9
+ sortActive: "_sortActive_18g0w_44",
10
+ empty: "_empty_18g0w_46",
11
+ handleCol: "_handleCol_18g0w_54",
12
+ handleCell: "_handleCell_18g0w_55",
13
+ dragging: "_dragging_18g0w_64",
14
+ dropBefore: "_dropBefore_18g0w_66",
15
+ dropAfter: "_dropAfter_18g0w_67",
16
+ clickable: "_clickable_18g0w_70",
17
+ detailCol: "_detailCol_18g0w_78",
18
+ detailCell: "_detailCell_18g0w_79",
19
+ detailRow: "_detailRow_18g0w_85"
20
20
  }, u = "a[href], button, input, select, textarea, label, summary, [role=\"button\"], [contenteditable=\"true\"]";
21
21
  function d(e) {
22
22
  let t = e.target?.closest?.(u);
@@ -149,4 +149,4 @@ function f(u) {
149
149
  //#endregion
150
150
  export { f as t };
151
151
 
152
- //# sourceMappingURL=DataGrid-D-dZj1BD.js.map
152
+ //# sourceMappingURL=DataGrid-BklgBqS0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataGrid-BklgBqS0.js","names":["s","_Fragment","Fragment","useReorderDragList","Fragment$1","DataGrid_module_default","INTERACTIVE","fromControl","hit","DataGrid","props","sort","setSort","useState","defaultSort","ownExpanded","setOwnExpanded","defaultExpandedIds","expanded","expandedIds","detailIdBase","useId","toggleExpanded","next","id","onExpandedChange","sortedRows","useMemo","rows","col","columns","c","get","row","dir","av","a","bv","b","cycleSort","cur","columnId","drag","r","onReorder","dragEnabled","detailEnabled","renderDetail","colCount","cls","className","sortable","active","indicator","Fragment","empty","isDragging","target","expandable","rowExpandable","isExpanded","detail","detailId","rowCls","onRowClick","i","rowClassName","e","Disclosure","content"],"sources":["../../src/components/DataGrid/DataGrid.module.css","../../src/components/DataGrid/DataGrid.tsx"],"sourcesContent":[".grid {\n position: relative;\n width: 100%;\n}\n\n.table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--wzl-font-size-sm);\n}\n\n.table th,\n.table td {\n text-align: left;\n padding: 3px var(--wzl-space-3);\n vertical-align: middle;\n}\n.table tbody tr {\n border-bottom: 1px solid var(--wzl-line-subtle);\n}\n\n.table th {\n font-weight: var(--wzl-font-weight-bold);\n color: var(--wzl-fg-muted);\n position: sticky;\n top: 0;\n background: var(--wzl-surface);\n z-index: 1;\n border-bottom: 1px solid var(--wzl-border);\n}\n\n.sortButton {\n all: unset;\n cursor: pointer;\n user-select: none;\n display: block;\n width: 100%;\n}\n.sortButton:hover { color: var(--wzl-fg); }\n.sortButton:focus-visible {\n outline: 2px solid var(--wzl-focus-ring);\n outline-offset: -2px;\n}\n.sortActive { color: var(--wzl-fg); }\n\n.empty {\n color: var(--wzl-fg-muted);\n font-style: italic;\n padding: var(--wzl-space-4) 0;\n text-align: center;\n}\n\n/* Drag-handle column. */\n.handleCol { width: 14px; }\n.handleCell {\n width: 14px;\n cursor: grab;\n color: var(--wzl-fg-muted);\n user-select: none;\n text-align: center;\n}\n.handleCell:active { cursor: grabbing; }\n\n.dragging { opacity: 0.4; }\n\n.dropBefore > td { box-shadow: inset 0 2px 0 0 var(--wzl-accent); }\n.dropAfter > td { box-shadow: inset 0 -2px 0 0 var(--wzl-accent); }\n\n/* Row activation (`onRowClick`). */\n.clickable { cursor: pointer; }\n.clickable:hover > td { background: var(--wzl-surface-hover); }\n.clickable:focus-visible {\n outline: 2px solid var(--wzl-focus-ring);\n outline-offset: -2px;\n}\n\n/* Disclosure column and the detail row it opens. */\n.detailCol,\n.detailCell {\n width: var(--wzl-control-h-sm);\n padding-inline: 0;\n text-align: center;\n}\n.table .detailCell { padding-block: 0; }\n.detailRow > td {\n padding: var(--wzl-space-2) var(--wzl-space-3) var(--wzl-space-3);\n background: var(--wzl-surface-sunken);\n}\n","/**\n * Lightweight sortable data grid. Use for inspector tables — action\n * registries, route maps, telemetry rows. Intentionally narrow:\n *\n * - Sortable columns (click header to cycle asc → desc → none)\n * - Custom cell render via per-column `render`\n * - Optional drag handles for row reordering (when `onReorder` is set)\n * - Per-row class, row activation, and expandable full-width detail rows\n *\n * Not: virtual scrolling, column resizing, multi-column sort, filtering,\n * inline editing. Reach for a real grid library when you need those.\n */\nimport { Fragment, useId, useMemo, useState } from 'react';\nimport type { KeyboardEvent, MouseEvent, ReactNode } from 'react';\nimport { useReorderDragList } from '../../useReorderDragList';\nimport { Disclosure } from '../Disclosure';\nimport s from './DataGrid.module.css';\n\n/**\n * One column of a {@link DataGrid}. `id` doubles as the default property name\n * read off each row when no `accessor` is given.\n */\nexport interface DataGridColumn<Row> {\n id: string;\n header: ReactNode;\n /** Pull a sortable value from the row. Defaults to `(row as any)[column.id]`. */\n accessor?: (row: Row) => string | number | null | undefined;\n /** Render the cell. Defaults to `String(accessor(row) ?? '')`. */\n render?: (row: Row) => ReactNode;\n /** Default true. Set false to suppress the sort affordance on this column. */\n sortable?: boolean;\n /** Optional CSS class on every <td> in this column. */\n className?: string;\n}\n\n/** Props for {@link DataGrid}. */\nexport interface DataGridProps<Row extends { id: string }> {\n rows: readonly Row[];\n columns: readonly DataGridColumn<Row>[];\n /** Initial sort. Omit for unsorted (rows render in input order). */\n defaultSort?: { columnId: string; direction: 'asc' | 'desc' };\n /** Enable drag handles in a leading column. Receives the reorder spec\n * (the existing `useReorderDragList` semantics — see weasel-ui). */\n onReorder?: (ids: string[], targetIndex: number) => void;\n /** Empty-state row text. Default `'—'`. */\n empty?: ReactNode;\n className?: string;\n /** Extra class on a row's `<tr>`, for row-level state such as a verdict. */\n rowClassName?: (row: Row) => string | undefined;\n /**\n * Activate a row. Makes each row focusable: a click anywhere in it, or\n * Enter/Space while it has focus, calls this. Clicks and keys landing on a\n * control inside a cell (button, link, input, …) are left to that control.\n */\n onRowClick?: (row: Row) => void;\n /**\n * Content for a full-width detail row under `row`, shown while the row is\n * expanded. Setting it adds a leading disclosure column. Return `null` for\n * no detail row.\n */\n renderDetail?: (row: Row) => ReactNode;\n /** Which rows offer the disclosure. Default: every row. */\n rowExpandable?: (row: Row) => boolean;\n /** Expanded row ids, controlled. Pair with `onExpandedChange`. */\n expandedIds?: ReadonlySet<string>;\n /** Initially expanded row ids when uncontrolled. */\n defaultExpandedIds?: Iterable<string>;\n /** Called with the next expanded set when a disclosure toggles. */\n onExpandedChange?: (ids: ReadonlySet<string>) => void;\n}\n\ntype SortState = { columnId: string; direction: 'asc' | 'desc' } | null;\n\nconst INTERACTIVE = 'a[href], button, input, select, textarea, label, summary, [role=\"button\"], [contenteditable=\"true\"]';\n\n/** Did this event start on a control inside the row rather than on the row itself? */\nfunction fromControl(e: MouseEvent | KeyboardEvent): boolean {\n const target = e.target as Element | null;\n const hit = target?.closest?.(INTERACTIVE);\n return !!hit && e.currentTarget.contains(hit);\n}\n\n/**\n * Sortable table for inspector-style data. Rows are keyed by `id`. Clicking a\n * sortable header cycles ascending, descending, unsorted; nullish values sort\n * last regardless of direction. Passing `onReorder` adds a leading drag-handle\n * column — note that the drag indices it reports are into the *sorted* row\n * order, not the input order.\n */\nexport function DataGrid<Row extends { id: string }>(props: DataGridProps<Row>) {\n const {\n rows, columns, defaultSort, onReorder, empty = '—', className,\n rowClassName, onRowClick, renderDetail, rowExpandable, expandedIds, defaultExpandedIds, onExpandedChange,\n } = props;\n const [sort, setSort] = useState<SortState>(defaultSort ?? null);\n const [ownExpanded, setOwnExpanded] = useState<ReadonlySet<string>>(() => new Set(defaultExpandedIds));\n const expanded = expandedIds ?? ownExpanded;\n const detailIdBase = useId();\n\n const toggleExpanded = (id: string) => {\n const next = new Set(expanded);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n if (!expandedIds) setOwnExpanded(next);\n onExpandedChange?.(next);\n };\n\n const sortedRows = useMemo(() => {\n if (!sort) return [...rows];\n const col = columns.find((c) => c.id === sort.columnId);\n if (!col) return [...rows];\n const get = col.accessor ?? ((row: Row) => (row as unknown as Record<string, unknown>)[col.id] as string | number | null | undefined);\n const dir = sort.direction === 'asc' ? 1 : -1;\n return [...rows].sort((a, b) => {\n const av = get(a);\n const bv = get(b);\n if (av == null && bv == null) return 0;\n if (av == null) return 1;\n if (bv == null) return -1;\n if (av < bv) return -1 * dir;\n if (av > bv) return 1 * dir;\n return 0;\n });\n }, [rows, columns, sort]);\n\n const cycleSort = (columnId: string) => {\n setSort((cur) => {\n if (!cur || cur.columnId !== columnId) return { columnId, direction: 'asc' };\n if (cur.direction === 'asc') return { columnId, direction: 'desc' };\n return null;\n });\n };\n\n // Drag handles via useReorderDragList. Adapter: the hook expects\n // `{ id, label }`-shaped items; we map our rows to that shape (label\n // unused — the hook only uses id and locked).\n const drag = useReorderDragList({\n items: sortedRows.map((r) => ({ id: r.id, label: '' })),\n selectedIds: [],\n onReorder: onReorder ?? (() => {}),\n rowSelector: ':not([data-detail-of])',\n });\n const dragEnabled = !!onReorder;\n const detailEnabled = !!renderDetail;\n const colCount = columns.length + (dragEnabled ? 1 : 0) + (detailEnabled ? 1 : 0);\n\n const cls = [s.grid, className].filter(Boolean).join(' ');\n\n return (\n <div\n className={cls}\n >\n <table className={s.table}>\n <thead>\n <tr>\n {dragEnabled && <th className={s.handleCol} aria-label=\"drag\" />}\n {detailEnabled && <th className={s.detailCol} aria-label=\"details\" />}\n {columns.map((col) => {\n const sortable = col.sortable !== false;\n const active = sort?.columnId === col.id;\n const indicator = active ? (sort.direction === 'asc' ? ' ↑' : ' ↓') : '';\n return (\n <th\n key={col.id}\n className={[col.className, active ? s.sortActive : ''].filter(Boolean).join(' ')}\n aria-sort={sortable ? (active ? (sort.direction === 'asc' ? 'ascending' : 'descending') : 'none') : undefined}\n >\n {sortable ? (\n <button type=\"button\" className={s.sortButton} onClick={() => cycleSort(col.id)}>\n {col.header}{indicator}\n </button>\n ) : (\n <>{col.header}{indicator}</>\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody ref={dragEnabled ? (drag.containerProps.ref as React.RefCallback<HTMLTableSectionElement>) : undefined}>\n {sortedRows.length === 0 && (\n <tr>\n <td colSpan={colCount} className={s.empty}>\n {empty}\n </td>\n </tr>\n )}\n {sortedRows.map((row, i) => {\n const isDragging = drag.state.draggedIds?.includes(row.id) ?? false;\n const target = drag.state.targetIndex;\n const expandable = detailEnabled && (rowExpandable?.(row) ?? true);\n const isExpanded = expandable && expanded.has(row.id);\n const detail = isExpanded ? renderDetail!(row) : null;\n const detailId = `${detailIdBase}-detail-${row.id}`;\n const rowCls = [\n onRowClick && s.clickable,\n isDragging && s.dragging,\n target === i && s.dropBefore,\n target === sortedRows.length && i === sortedRows.length - 1 && s.dropAfter,\n rowClassName?.(row),\n ].filter(Boolean).join(' ');\n return (\n <Fragment key={row.id}>\n <tr\n className={rowCls || undefined}\n data-expanded={isExpanded || undefined}\n tabIndex={onRowClick ? 0 : undefined}\n onClick={onRowClick ? (e) => { if (!fromControl(e)) onRowClick(row); } : undefined}\n onKeyDown={onRowClick ? (e) => {\n if (e.target !== e.currentTarget || (e.key !== 'Enter' && e.key !== ' ')) return;\n e.preventDefault();\n onRowClick(row);\n } : undefined}\n >\n {dragEnabled && (\n <td\n className={s.handleCell}\n onPointerDown={(e) => drag.rowProps(row.id, i).onPointerDown(e)}\n >\n <span aria-hidden=\"true\">⋮⋮</span>\n </td>\n )}\n {detailEnabled && (\n <td className={s.detailCell}>\n {expandable && (\n <Disclosure\n open={isExpanded}\n onToggle={() => toggleExpanded(row.id)}\n label={isExpanded ? 'Hide details' : 'Show details'}\n controls={detail != null ? detailId : undefined}\n />\n )}\n </td>\n )}\n {columns.map((col) => {\n const get = col.accessor ?? ((r: Row) => (r as unknown as Record<string, unknown>)[col.id] as string | number | null | undefined);\n const content = col.render ? col.render(row) : String(get(row) ?? '');\n return (\n <td key={col.id} className={col.className}>\n {content}\n </td>\n );\n })}\n </tr>\n {detail != null && (\n <tr id={detailId} className={s.detailRow} data-detail-of={row.id}>\n <td colSpan={colCount}>{detail}</td>\n </tr>\n )}\n </Fragment>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n"],"mappings":"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"}