@weasel-js/ui 1.6.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/dist/chunks/Badge-CTc9Lkwn.js +14 -0
  2. package/dist/chunks/Badge-CTc9Lkwn.js.map +1 -0
  3. package/dist/chunks/{Badge-CyAIZSDo.js → Badge-D2aD7xVL.js} +277 -228
  4. package/dist/chunks/Badge-D2aD7xVL.js.map +1 -0
  5. package/dist/chunks/BandEditor-Dd0egAgE.js +292 -0
  6. package/dist/chunks/BandEditor-Dd0egAgE.js.map +1 -0
  7. package/dist/chunks/{ButtonBar-D5Vi0aj_.js → ButtonBar-DIQTe5GQ.js} +2 -2
  8. package/dist/chunks/{ButtonBar-D5Vi0aj_.js.map → ButtonBar-DIQTe5GQ.js.map} +1 -1
  9. package/dist/chunks/Callout-ndW5_Bqx.js +116 -0
  10. package/dist/chunks/Callout-ndW5_Bqx.js.map +1 -0
  11. package/dist/chunks/CloseButton-C2J7wVfo.js +26 -0
  12. package/dist/chunks/CloseButton-C2J7wVfo.js.map +1 -0
  13. package/dist/chunks/ColorField-Yz_BkcCT.js +69 -0
  14. package/dist/chunks/ColorField-Yz_BkcCT.js.map +1 -0
  15. package/dist/chunks/{ColorModeControl-ke5PXbBa.js → ColorModeControl-BewxA0rX.js} +3 -3
  16. package/dist/chunks/{ColorModeControl-ke5PXbBa.js.map → ColorModeControl-BewxA0rX.js.map} +1 -1
  17. package/dist/chunks/{ComboBox-DpT8lc3p.js → ComboBox-B34H76CW.js} +12 -12
  18. package/dist/chunks/ComboBox-B34H76CW.js.map +1 -0
  19. package/dist/chunks/{CurveEditor-BDJXjEvK.js → CurveEditor-DUVjd25R.js} +2 -2
  20. package/dist/chunks/{CurveEditor-BDJXjEvK.js.map → CurveEditor-DUVjd25R.js.map} +1 -1
  21. package/dist/chunks/{DataGrid-D-dZj1BD.js → DataGrid-LZ2JgY2Y.js} +17 -17
  22. package/dist/chunks/DataGrid-LZ2JgY2Y.js.map +1 -0
  23. package/dist/chunks/DetailList-BKomDzg5.js +52 -0
  24. package/dist/chunks/DetailList-BKomDzg5.js.map +1 -0
  25. package/dist/chunks/{DetentSlider-CL8TlX3S.js → DetentSlider-5uQPFucv.js} +2 -2
  26. package/dist/chunks/{DetentSlider-CL8TlX3S.js.map → DetentSlider-5uQPFucv.js.map} +1 -1
  27. package/dist/chunks/Dialog-DGFutQ--.js +63 -0
  28. package/dist/chunks/Dialog-DGFutQ--.js.map +1 -0
  29. package/dist/chunks/{Disclosure-0G0uh2fa.js → Disclosure-Ch2KxYuB.js} +7 -7
  30. package/dist/chunks/Disclosure-Ch2KxYuB.js.map +1 -0
  31. package/dist/chunks/{DragHandleGlyph-Dr7Fgo0I.js → DragGrip-AoIZXfZb.js} +2 -2
  32. package/dist/chunks/DragGrip-AoIZXfZb.js.map +1 -0
  33. package/dist/chunks/FallthroughDiagram-BEHiM5IS.js +284 -0
  34. package/dist/chunks/FallthroughDiagram-BEHiM5IS.js.map +1 -0
  35. package/dist/chunks/{FontFamilySelect-DXlMKWfK.js → FontFamilySelect-DkRgNtag.js} +2 -2
  36. package/dist/chunks/{FontFamilySelect-DXlMKWfK.js.map → FontFamilySelect-DkRgNtag.js.map} +1 -1
  37. package/dist/chunks/GestureRoute-C_YGl7bJ.js +82 -0
  38. package/dist/chunks/GestureRoute-C_YGl7bJ.js.map +1 -0
  39. package/dist/chunks/GradientEditor-b7v4Ph3i.js +363 -0
  40. package/dist/chunks/GradientEditor-b7v4Ph3i.js.map +1 -0
  41. package/dist/chunks/{Icon-Cgzy8VgC.js → Icon-CcVjdq2C.js} +31 -1
  42. package/dist/chunks/Icon-CcVjdq2C.js.map +1 -0
  43. package/dist/chunks/{InlineRange-eOj6JpJl.js → InlineRange-P01ABSzo.js} +3 -3
  44. package/dist/chunks/InlineRange-P01ABSzo.js.map +1 -0
  45. package/dist/chunks/{Jog-DESxZ44P.js → Jog-DRmfrkCg.js} +3 -3
  46. package/dist/chunks/{Jog-DESxZ44P.js.map → Jog-DRmfrkCg.js.map} +1 -1
  47. package/dist/chunks/{Keycaps-C0H_v2gO.js → Keycaps-C-FJyG8k.js} +14 -14
  48. package/dist/chunks/Keycaps-C-FJyG8k.js.map +1 -0
  49. package/dist/chunks/{LayerList-nz-QYvTF.js → LayerList-wCI1EueM.js} +148 -152
  50. package/dist/chunks/LayerList-wCI1EueM.js.map +1 -0
  51. package/dist/chunks/ListEditor-BeA60TAA.js +71 -0
  52. package/dist/chunks/ListEditor-BeA60TAA.js.map +1 -0
  53. package/dist/chunks/{MenuButton-DtaGenKf.js → MenuButton-BSqEChJE.js} +7 -7
  54. package/dist/chunks/MenuButton-BSqEChJE.js.map +1 -0
  55. package/dist/chunks/{MeshEditor-qqGc6hlD.js → MeshEditor-D1HLZcAh.js} +3 -3
  56. package/dist/chunks/{MeshEditor-qqGc6hlD.js.map → MeshEditor-D1HLZcAh.js.map} +1 -1
  57. package/dist/chunks/NumberField-BnJxcazc.js +206 -0
  58. package/dist/chunks/NumberField-BnJxcazc.js.map +1 -0
  59. package/dist/chunks/{OptionsBar-DbzAgIln.js → OptionsBar-ujxYidhj.js} +2 -2
  60. package/dist/chunks/{OptionsBar-DbzAgIln.js.map → OptionsBar-ujxYidhj.js.map} +1 -1
  61. package/dist/chunks/{PaintField-DaJukRc6.js → PaintField-DadOELMg.js} +2 -2
  62. package/dist/chunks/{PaintField-DaJukRc6.js.map → PaintField-DadOELMg.js.map} +1 -1
  63. package/dist/chunks/PaintInput-v8Y7MDbH.js +121 -0
  64. package/dist/chunks/PaintInput-v8Y7MDbH.js.map +1 -0
  65. package/dist/chunks/{PatternPicker-B-cUt-JT.js → PatternPicker-R_EQtw2Q.js} +2 -2
  66. package/dist/chunks/{PatternPicker-B-cUt-JT.js.map → PatternPicker-R_EQtw2Q.js.map} +1 -1
  67. package/dist/chunks/{PointPlotter-Bxo6haKe.js → PointPlotter-ldI4RrU1.js} +2 -2
  68. package/dist/chunks/{PointPlotter-Bxo6haKe.js.map → PointPlotter-ldI4RrU1.js.map} +1 -1
  69. package/dist/chunks/{Powerline-ExO5GwEr.js → Powerline-DNyH885r.js} +2 -2
  70. package/dist/chunks/{Powerline-ExO5GwEr.js.map → Powerline-DNyH885r.js.map} +1 -1
  71. package/dist/chunks/{Prefs-DpqFKiwY.js → Prefs-ByA-x51i.js} +46 -34
  72. package/dist/chunks/Prefs-ByA-x51i.js.map +1 -0
  73. package/dist/chunks/{Properties-D_KzDN9K.js → Properties-DmAeQ3mk.js} +35 -29
  74. package/dist/chunks/Properties-DmAeQ3mk.js.map +1 -0
  75. package/dist/chunks/PropertyField-DfIJJ5GS.js +673 -0
  76. package/dist/chunks/PropertyField-DfIJJ5GS.js.map +1 -0
  77. package/dist/chunks/{RangeSlider-BKRRTPTZ.js → RangeSlider-SEGE-7VF.js} +8 -8
  78. package/dist/chunks/RangeSlider-SEGE-7VF.js.map +1 -0
  79. package/dist/chunks/{ResizeHandle-BKT0XYpx.js → ResizeHandle-rKVWyeTG.js} +3 -3
  80. package/dist/chunks/ResizeHandle-rKVWyeTG.js.map +1 -0
  81. package/dist/chunks/Select-ClmKtyWg.js +229 -0
  82. package/dist/chunks/Select-ClmKtyWg.js.map +1 -0
  83. package/dist/chunks/SelectionPanel-BaQnX4Bs.js +106 -0
  84. package/dist/chunks/SelectionPanel-BaQnX4Bs.js.map +1 -0
  85. package/dist/chunks/SidebarPanel-BblDEz4G.js +53 -0
  86. package/dist/chunks/SidebarPanel-BblDEz4G.js.map +1 -0
  87. package/dist/chunks/Slider-YofwGOI4.js +389 -0
  88. package/dist/chunks/Slider-YofwGOI4.js.map +1 -0
  89. package/dist/chunks/{StatusBar-DzoPDY4k.js → StatusBar-Ca9Dvhhq.js} +6 -6
  90. package/dist/chunks/StatusBar-Ca9Dvhhq.js.map +1 -0
  91. package/dist/chunks/{SwatchGrid-BARC3rnF.js → SwatchGrid-BYvA8Bmh.js} +3 -3
  92. package/dist/chunks/SwatchGrid-BYvA8Bmh.js.map +1 -0
  93. package/dist/chunks/ThemeSwitcher-BlsInAmR.js +38 -0
  94. package/dist/chunks/ThemeSwitcher-BlsInAmR.js.map +1 -0
  95. package/dist/chunks/{Timeline--58F7MED.js → Timeline-B39cwfMB.js} +207 -203
  96. package/dist/chunks/Timeline-B39cwfMB.js.map +1 -0
  97. package/dist/chunks/{Toast-DNBb-24H.js → Toast-BF9GE0HC.js} +25 -27
  98. package/dist/chunks/Toast-BF9GE0HC.js.map +1 -0
  99. package/dist/chunks/{ToggleBar-DTjGeS0Q.js → ToggleBar-BTYkBXU9.js} +8 -8
  100. package/dist/chunks/ToggleBar-BTYkBXU9.js.map +1 -0
  101. package/dist/chunks/{TokenPanel-CMq7uydV.js → TokenPanel-CMDAOfYH.js} +5 -5
  102. package/dist/chunks/{TokenPanel-CMq7uydV.js.map → TokenPanel-CMDAOfYH.js.map} +1 -1
  103. package/dist/chunks/{ToolButton-CR4sQlxF.js → ToolButton-CAHBa08P.js} +6 -6
  104. package/dist/chunks/ToolButton-CAHBa08P.js.map +1 -0
  105. package/dist/chunks/{ToolOptionsBar-CtzTlaN2.js → ToolOptionsBar-D_GCrBAN.js} +8 -7
  106. package/dist/chunks/ToolOptionsBar-D_GCrBAN.js.map +1 -0
  107. package/dist/chunks/{ToolPalette-CKG9qY6P.js → ToolPalette-OOWN51Xx.js} +3 -3
  108. package/dist/chunks/ToolPalette-OOWN51Xx.js.map +1 -0
  109. package/dist/chunks/{Tree-DVOtc9R5.js → Tree-Cc8lIzgM.js} +2 -2
  110. package/dist/chunks/{Tree-DVOtc9R5.js.map → Tree-Cc8lIzgM.js.map} +1 -1
  111. package/dist/chunks/{createKeyframeLayer-Czj6Y235.js → createKeyframeLayer-DVl321_l.js} +15 -16
  112. package/dist/chunks/createKeyframeLayer-DVl321_l.js.map +1 -0
  113. package/dist/chunks/{icons-Dk8SRS8g.js → icons-BhcR1l64.js} +2 -2
  114. package/dist/chunks/icons-BhcR1l64.js.map +1 -0
  115. package/dist/chunks/{model-Du7Lta4C.js → model-BaF65rnX.js} +95 -90
  116. package/dist/chunks/model-BaF65rnX.js.map +1 -0
  117. package/dist/chunks/{prefField-Dnl7nmjQ.js → prefField-BopW9bjx.js} +17 -13
  118. package/dist/chunks/prefField-BopW9bjx.js.map +1 -0
  119. package/dist/chunks/segmentedControl.module-D6SzYJD7.js +11 -0
  120. package/dist/chunks/segmentedControl.module-D6SzYJD7.js.map +1 -0
  121. package/dist/chunks/{useReorderDragList-B_-5L5Gu.js → useReorderDragList-FCMoFIzH.js} +2 -2
  122. package/dist/chunks/useReorderDragList-FCMoFIzH.js.map +1 -0
  123. package/dist/components/Badge/bases/Powerline.d.ts.map +1 -1
  124. package/dist/components/Badge/bases/edgeProfiles.d.ts +31 -4
  125. package/dist/components/Badge/bases/edgeProfiles.d.ts.map +1 -1
  126. package/dist/components/Badge/index.d.ts +1 -0
  127. package/dist/components/Badge/index.d.ts.map +1 -1
  128. package/dist/components/Badge/index.js +3 -2
  129. package/dist/components/Badge/statusIcons.d.ts +5 -0
  130. package/dist/components/Badge/statusIcons.d.ts.map +1 -0
  131. package/dist/components/BandEditor/BandEditor.d.ts +16 -7
  132. package/dist/components/BandEditor/BandEditor.d.ts.map +1 -1
  133. package/dist/components/BandEditor/bands.d.ts +5 -2
  134. package/dist/components/BandEditor/bands.d.ts.map +1 -1
  135. package/dist/components/BandEditor/index.js +1 -1
  136. package/dist/components/ButtonBar/index.js +1 -1
  137. package/dist/components/Callout/Callout.d.ts +2 -2
  138. package/dist/components/Callout/Callout.d.ts.map +1 -1
  139. package/dist/components/Callout/index.js +1 -1
  140. package/dist/components/CloseButton/CloseButton.d.ts +21 -0
  141. package/dist/components/CloseButton/CloseButton.d.ts.map +1 -0
  142. package/dist/components/CloseButton/index.d.ts +3 -0
  143. package/dist/components/CloseButton/index.d.ts.map +1 -0
  144. package/dist/components/CloseButton/index.js +2 -0
  145. package/dist/components/ColorField/ColorField.d.ts +5 -1
  146. package/dist/components/ColorField/ColorField.d.ts.map +1 -1
  147. package/dist/components/ColorField/index.js +1 -1
  148. package/dist/components/ColorModeControl/index.js +1 -1
  149. package/dist/components/ComboBox/index.js +1 -1
  150. package/dist/components/CurveEditor/index.js +2 -2
  151. package/dist/components/DataGrid/index.js +1 -1
  152. package/dist/components/DetailList/DetailList.d.ts +31 -5
  153. package/dist/components/DetailList/DetailList.d.ts.map +1 -1
  154. package/dist/components/DetailList/index.d.ts +1 -1
  155. package/dist/components/DetailList/index.d.ts.map +1 -1
  156. package/dist/components/DetailList/index.js +1 -1
  157. package/dist/components/DetentSlider/index.js +1 -1
  158. package/dist/components/Dialog/Dialog.d.ts.map +1 -1
  159. package/dist/components/Dialog/index.js +1 -1
  160. package/dist/components/Disclosure/Disclosure.d.ts +1 -1
  161. package/dist/components/Disclosure/index.js +1 -1
  162. package/dist/components/{DragHandleGlyph/DragHandleGlyph.d.ts → DragGrip/DragGrip.d.ts} +4 -4
  163. package/dist/components/DragGrip/DragGrip.d.ts.map +1 -0
  164. package/dist/components/DragGrip/index.d.ts +3 -0
  165. package/dist/components/DragGrip/index.d.ts.map +1 -0
  166. package/dist/components/DragGrip/index.js +2 -0
  167. package/dist/components/FallthroughDiagram/FallthroughDiagram.d.ts +14 -0
  168. package/dist/components/FallthroughDiagram/FallthroughDiagram.d.ts.map +1 -0
  169. package/dist/components/FallthroughDiagram/fixtures.d.ts +17 -0
  170. package/dist/components/FallthroughDiagram/fixtures.d.ts.map +1 -0
  171. package/dist/components/FallthroughDiagram/index.d.ts +3 -0
  172. package/dist/components/FallthroughDiagram/index.d.ts.map +1 -0
  173. package/dist/components/FallthroughDiagram/index.js +2 -0
  174. package/dist/components/FontFamilySelect/index.js +1 -1
  175. package/dist/components/GestureRoute/GestureRoute.d.ts +19 -0
  176. package/dist/components/GestureRoute/GestureRoute.d.ts.map +1 -0
  177. package/dist/components/GestureRoute/index.d.ts +3 -0
  178. package/dist/components/GestureRoute/index.d.ts.map +1 -0
  179. package/dist/components/GestureRoute/index.js +2 -0
  180. package/dist/components/GradientEditor/GradientEditor.d.ts +22 -8
  181. package/dist/components/GradientEditor/GradientEditor.d.ts.map +1 -1
  182. package/dist/components/GradientEditor/index.js +1 -1
  183. package/dist/components/InlineRange/index.js +1 -1
  184. package/dist/components/Jog/index.js +1 -1
  185. package/dist/components/Keycaps/Keycaps.d.ts +11 -5
  186. package/dist/components/Keycaps/Keycaps.d.ts.map +1 -1
  187. package/dist/components/Keycaps/index.d.ts +1 -1
  188. package/dist/components/Keycaps/index.d.ts.map +1 -1
  189. package/dist/components/Keycaps/index.js +1 -1
  190. package/dist/components/LayerList/LayerList.d.ts +1 -1
  191. package/dist/components/LayerList/LayerList.d.ts.map +1 -1
  192. package/dist/components/LayerList/index.js +1 -1
  193. package/dist/components/ListEditor/ListEditor.d.ts.map +1 -1
  194. package/dist/components/ListEditor/index.js +1 -1
  195. package/dist/components/MenuButton/index.js +1 -1
  196. package/dist/components/MeshEditor/index.js +1 -1
  197. package/dist/components/NumberField/UnitField.d.ts +20 -7
  198. package/dist/components/NumberField/UnitField.d.ts.map +1 -1
  199. package/dist/components/NumberField/index.js +1 -1
  200. package/dist/components/OptionsBar/index.js +1 -1
  201. package/dist/components/PaintField/index.js +1 -1
  202. package/dist/components/PaintInput/PaintInput.d.ts.map +1 -1
  203. package/dist/components/PaintInput/index.js +1 -1
  204. package/dist/components/PatternPicker/index.js +1 -1
  205. package/dist/components/PointPlotter/index.js +1 -1
  206. package/dist/components/Powerline/index.d.ts +1 -1
  207. package/dist/components/Powerline/index.d.ts.map +1 -1
  208. package/dist/components/Powerline/index.js +2 -2
  209. package/dist/components/Prefs/PrefsRow.d.ts.map +1 -1
  210. package/dist/components/Prefs/index.d.ts +1 -1
  211. package/dist/components/Prefs/index.d.ts.map +1 -1
  212. package/dist/components/Prefs/index.js +2 -2
  213. package/dist/components/Prefs/prefField.d.ts.map +1 -1
  214. package/dist/components/Prefs/schema.d.ts +2 -2
  215. package/dist/components/Prefs/schema.d.ts.map +1 -1
  216. package/dist/components/Properties/PropertyField.d.ts +22 -30
  217. package/dist/components/Properties/PropertyField.d.ts.map +1 -1
  218. package/dist/components/Properties/PropertyGroup.d.ts.map +1 -1
  219. package/dist/components/Properties/PropertyPanel.d.ts +1 -8
  220. package/dist/components/Properties/PropertyPanel.d.ts.map +1 -1
  221. package/dist/components/Properties/index.d.ts +1 -1
  222. package/dist/components/Properties/index.d.ts.map +1 -1
  223. package/dist/components/Properties/index.js +2 -2
  224. package/dist/components/RangeSlider/index.js +1 -1
  225. package/dist/components/ResizeHandle/index.js +1 -1
  226. package/dist/components/Select/Select.d.ts.map +1 -1
  227. package/dist/components/Select/index.js +1 -1
  228. package/dist/components/SelectionPanel/SelectionPanel.d.ts.map +1 -1
  229. package/dist/components/SelectionPanel/index.js +2 -2
  230. package/dist/components/SelectionPanel/renderLeaf.d.ts +7 -0
  231. package/dist/components/SelectionPanel/renderLeaf.d.ts.map +1 -1
  232. package/dist/components/SidebarPanel/SidebarPanel.d.ts +1 -1
  233. package/dist/components/SidebarPanel/SidebarPanel.d.ts.map +1 -1
  234. package/dist/components/SidebarPanel/index.js +1 -1
  235. package/dist/components/Slider/Slider.d.ts +19 -2
  236. package/dist/components/Slider/Slider.d.ts.map +1 -1
  237. package/dist/components/Slider/index.js +1 -1
  238. package/dist/components/StatusBar/index.js +1 -1
  239. package/dist/components/SwatchGrid/index.js +1 -1
  240. package/dist/components/ThemeSwitcher/ThemeSwitcher.d.ts +38 -0
  241. package/dist/components/ThemeSwitcher/ThemeSwitcher.d.ts.map +1 -0
  242. package/dist/components/ThemeSwitcher/index.d.ts +3 -0
  243. package/dist/components/ThemeSwitcher/index.d.ts.map +1 -0
  244. package/dist/components/ThemeSwitcher/index.js +2 -0
  245. package/dist/components/Timeline/Transport.d.ts.map +1 -1
  246. package/dist/components/Timeline/index.js +1 -1
  247. package/dist/components/Toast/Toast.d.ts.map +1 -1
  248. package/dist/components/Toast/index.js +1 -1
  249. package/dist/components/ToggleBar/index.js +1 -1
  250. package/dist/components/TokenPanel/index.js +1 -1
  251. package/dist/components/ToolButton/index.js +1 -1
  252. package/dist/components/ToolOptionsBar/index.js +1 -1
  253. package/dist/components/ToolPalette/ToolPalette.d.ts +2 -1
  254. package/dist/components/ToolPalette/ToolPalette.d.ts.map +1 -1
  255. package/dist/components/ToolPalette/index.js +1 -1
  256. package/dist/components/Tree/index.js +1 -1
  257. package/dist/components/spin.d.ts +16 -0
  258. package/dist/components/spin.d.ts.map +1 -0
  259. package/dist/components/stanceSurfaces.d.ts.map +1 -1
  260. package/dist/icons/index.d.ts +0 -2
  261. package/dist/icons/index.d.ts.map +1 -1
  262. package/dist/icons/paths.d.ts +10 -0
  263. package/dist/icons/paths.d.ts.map +1 -1
  264. package/dist/index.d.ts +5 -2
  265. package/dist/index.d.ts.map +1 -1
  266. package/dist/index.js +83 -99
  267. package/dist/index.js.map +1 -1
  268. package/dist/paintGradientTrack.d.ts +5 -2
  269. package/dist/paintGradientTrack.d.ts.map +1 -1
  270. package/dist/style.css +1 -1
  271. package/dist/useReorderDragList.d.ts +1 -1
  272. package/dist/useReorderDragList.d.ts.map +1 -1
  273. package/package.json +9 -8
  274. package/dist/chunks/Badge-CyAIZSDo.js.map +0 -1
  275. package/dist/chunks/BandEditor-Dhm_Xrlr.js +0 -248
  276. package/dist/chunks/BandEditor-Dhm_Xrlr.js.map +0 -1
  277. package/dist/chunks/Callout-yEn9iPlh.js +0 -119
  278. package/dist/chunks/Callout-yEn9iPlh.js.map +0 -1
  279. package/dist/chunks/ColorField-BcMcW8Sa.js +0 -60
  280. package/dist/chunks/ColorField-BcMcW8Sa.js.map +0 -1
  281. package/dist/chunks/ComboBox-DpT8lc3p.js.map +0 -1
  282. package/dist/chunks/DataGrid-D-dZj1BD.js.map +0 -1
  283. package/dist/chunks/DetailList-BMER1LUZ.js +0 -43
  284. package/dist/chunks/DetailList-BMER1LUZ.js.map +0 -1
  285. package/dist/chunks/Dialog-BWyNMgpf.js +0 -66
  286. package/dist/chunks/Dialog-BWyNMgpf.js.map +0 -1
  287. package/dist/chunks/Disclosure-0G0uh2fa.js.map +0 -1
  288. package/dist/chunks/DragHandleGlyph-Dr7Fgo0I.js.map +0 -1
  289. package/dist/chunks/GradientEditor-B3a-MsVJ.js +0 -335
  290. package/dist/chunks/GradientEditor-B3a-MsVJ.js.map +0 -1
  291. package/dist/chunks/Icon-Cgzy8VgC.js.map +0 -1
  292. package/dist/chunks/InlineRange-eOj6JpJl.js.map +0 -1
  293. package/dist/chunks/Keycaps-C0H_v2gO.js.map +0 -1
  294. package/dist/chunks/LayerList-nz-QYvTF.js.map +0 -1
  295. package/dist/chunks/ListEditor-BQ6AV3Ac.js +0 -74
  296. package/dist/chunks/ListEditor-BQ6AV3Ac.js.map +0 -1
  297. package/dist/chunks/MenuButton-DtaGenKf.js.map +0 -1
  298. package/dist/chunks/NumberField-CwJOMmQR.js +0 -117
  299. package/dist/chunks/NumberField-CwJOMmQR.js.map +0 -1
  300. package/dist/chunks/PaintInput-Byhna3H-.js +0 -131
  301. package/dist/chunks/PaintInput-Byhna3H-.js.map +0 -1
  302. package/dist/chunks/Prefs-DpqFKiwY.js.map +0 -1
  303. package/dist/chunks/Properties-D_KzDN9K.js.map +0 -1
  304. package/dist/chunks/PropertyField-DGCecAnV.js +0 -758
  305. package/dist/chunks/PropertyField-DGCecAnV.js.map +0 -1
  306. package/dist/chunks/RangeSlider-BKRRTPTZ.js.map +0 -1
  307. package/dist/chunks/ResizeHandle-BKT0XYpx.js.map +0 -1
  308. package/dist/chunks/Select-CzyfaXzp.js +0 -225
  309. package/dist/chunks/Select-CzyfaXzp.js.map +0 -1
  310. package/dist/chunks/SelectionPanel-BgUM1h03.js +0 -103
  311. package/dist/chunks/SelectionPanel-BgUM1h03.js.map +0 -1
  312. package/dist/chunks/SidebarPanel-aoIqxbtq.js +0 -55
  313. package/dist/chunks/SidebarPanel-aoIqxbtq.js.map +0 -1
  314. package/dist/chunks/Slider-CFwQYQ10.js +0 -383
  315. package/dist/chunks/Slider-CFwQYQ10.js.map +0 -1
  316. package/dist/chunks/StatusBar-DzoPDY4k.js.map +0 -1
  317. package/dist/chunks/SwatchGrid-BARC3rnF.js.map +0 -1
  318. package/dist/chunks/Timeline--58F7MED.js.map +0 -1
  319. package/dist/chunks/Toast-DNBb-24H.js.map +0 -1
  320. package/dist/chunks/ToggleBar-DTjGeS0Q.js.map +0 -1
  321. package/dist/chunks/ToolButton-CR4sQlxF.js.map +0 -1
  322. package/dist/chunks/ToolOptionsBar-CtzTlaN2.js.map +0 -1
  323. package/dist/chunks/ToolPalette-CKG9qY6P.js.map +0 -1
  324. package/dist/chunks/createKeyframeLayer-Czj6Y235.js.map +0 -1
  325. package/dist/chunks/icons-Dk8SRS8g.js.map +0 -1
  326. package/dist/chunks/model-Du7Lta4C.js.map +0 -1
  327. package/dist/chunks/number-D3NEx_8r.js +0 -89
  328. package/dist/chunks/number-D3NEx_8r.js.map +0 -1
  329. package/dist/chunks/prefField-Dnl7nmjQ.js.map +0 -1
  330. package/dist/chunks/segmentedControl.module-Bv7DEg8f.js +0 -11
  331. package/dist/chunks/segmentedControl.module-Bv7DEg8f.js.map +0 -1
  332. package/dist/chunks/useReorderDragList-B_-5L5Gu.js.map +0 -1
  333. package/dist/components/DragHandleGlyph/DragHandleGlyph.d.ts.map +0 -1
  334. package/dist/components/DragHandleGlyph/index.d.ts +0 -3
  335. package/dist/components/DragHandleGlyph/index.d.ts.map +0 -1
  336. package/dist/components/DragHandleGlyph/index.js +0 -2
  337. package/dist/format/number.d.ts +0 -56
  338. package/dist/format/number.d.ts.map +0 -1
  339. package/dist/icons/ShapeKindIcon.d.ts +0 -10
  340. package/dist/icons/ShapeKindIcon.d.ts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"DataGrid-D-dZj1BD.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, #2a2018);\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, #e6e7e9); }\n.sortButton:focus-visible {\n outline: 2px solid var(--wzl-focus-ring, var(--wzl-accent, #7fb069));\n outline-offset: -2px;\n}\n.sortActive { color: var(--wzl-fg, #e6e7e9); }\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, #7fb069); }\n.dropAfter > td { box-shadow: inset 0 -2px 0 0 var(--wzl-accent, #7fb069); }\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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"}
@@ -1,43 +0,0 @@
1
- import { jsx as e, jsxs as t } from "react/jsx-runtime";
2
- import { useId as n } from "react";
3
- var r = {
4
- list: "_list_1jpmp_1",
5
- row: "_row_1jpmp_14",
6
- label: "_label_1jpmp_22",
7
- value: "_value_1jpmp_36",
8
- title: "_title_1jpmp_49"
9
- };
10
- //#endregion
11
- //#region src/components/DetailList/DetailList.tsx
12
- function i({ children: i, title: a, layout: o = "inline", className: s }) {
13
- let c = n(), l = /* @__PURE__ */ e("dl", {
14
- className: s && a == null ? `${r.list} ${s}` : r.list,
15
- "data-layout": o,
16
- "aria-labelledby": a == null ? void 0 : c,
17
- children: i
18
- });
19
- return a == null ? l : /* @__PURE__ */ t("section", {
20
- className: s,
21
- children: [/* @__PURE__ */ e("h3", {
22
- id: c,
23
- className: r.title,
24
- children: a
25
- }), l]
26
- });
27
- }
28
- function a({ label: n, children: i, className: a }) {
29
- return /* @__PURE__ */ t("div", {
30
- className: a ? `${r.row} ${a}` : r.row,
31
- children: [/* @__PURE__ */ e("dt", {
32
- className: r.label,
33
- children: n
34
- }), /* @__PURE__ */ e("dd", {
35
- className: r.value,
36
- children: i
37
- })]
38
- });
39
- }
40
- //#endregion
41
- export { a as n, i as t };
42
-
43
- //# sourceMappingURL=DetailList-BMER1LUZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DetailList-BMER1LUZ.js","names":["s","DetailList_module_default","DetailList","titleId","useId","list","className","title","layout","DetailRow","label"],"sources":["../../src/components/DetailList/DetailList.module.css","../../src/components/DetailList/DetailList.tsx"],"sourcesContent":[".list {\n display: grid;\n grid-template-columns: var(--wzl-params-label-width, auto) minmax(0, 1fr);\n column-gap: var(--wzl-space-6);\n row-gap: var(--wzl-space-1);\n margin: 0;\n font-size: var(--wzl-font-size-md);\n}\n\n.list[data-layout='block'] {\n grid-template-columns: minmax(0, 1fr);\n}\n\n.row {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: subgrid;\n /* A label meets the first line of its value, however many lines that runs to. */\n align-items: baseline;\n}\n\n.label {\n display: flex;\n align-items: baseline;\n justify-content: var(--wzl-params-label-align, start);\n gap: var(--wzl-space-2);\n font-family: var(--wzl-font-display);\n font-weight: var(--wzl-font-weight-light);\n font-size: var(--wzl-font-size-sm);\n line-height: var(--wzl-leading-snug);\n color: var(--wzl-fg-muted);\n text-transform: var(--wzl-params-label-case, uppercase);\n letter-spacing: var(--wzl-params-label-tracking, var(--wzl-tracking-wide));\n}\n\n.value {\n margin: 0;\n min-width: 0;\n /* The floor a property row stands on, so the two share a rhythm side by side. */\n min-height: var(--wzl-prop-row-h, var(--wzl-field-h, var(--wzl-control-h)));\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wzl-space-2);\n overflow-wrap: anywhere;\n color: var(--wzl-fg);\n}\n\n.title {\n margin: 0 0 var(--wzl-space-3);\n font-family: var(--wzl-font-display);\n font-weight: var(--wzl-font-weight-light);\n font-size: var(--wzl-font-size-sm);\n color: var(--wzl-fg-muted);\n text-transform: var(--wzl-params-label-case, uppercase);\n letter-spacing: var(--wzl-params-label-tracking, var(--wzl-tracking-wide));\n}\n","import { type ReactNode, useId } from 'react';\nimport s from './DetailList.module.css';\n\n/** Whether a row's label sits beside its value or above it. */\nexport type DetailListLayout = 'inline' | 'block';\n\n/** Props for {@link DetailList}. */\nexport interface DetailListProps {\n /** {@link DetailRow}s. */\n children: ReactNode;\n /** Heading drawn above the list, which also names it. */\n title?: ReactNode;\n /**\n * `inline` puts every label in one rail beside the values; `block` stacks\n * each label over its value, for a column too narrow to hold both.\n */\n layout?: DetailListLayout;\n /** Class on the outermost element: the `<dl>`, or the `<section>` holding\n * the heading and the list when there is a `title`. */\n className?: string;\n}\n\n/** Props for {@link DetailRow}. */\nexport interface DetailRowProps {\n label: ReactNode;\n /** The value: text, or any run of elements — code chips, badges, keycaps,\n * links. Several children wrap as a line of items. */\n children: ReactNode;\n className?: string;\n}\n\n/**\n * A read-only list of labelled values — the `<dl>` a property panel would be\n * if its rows held facts instead of controls. Labels take the params label\n * recipe and rail: `--wzl-params-label-width` sets the rail, so a detail list\n * and a property panel beside it line their labels up from one declaration.\n */\nexport function DetailList({ children, title, layout = 'inline', className }: DetailListProps) {\n const titleId = useId();\n const list = (\n <dl\n className={className && title == null ? `${s.list} ${className}` : s.list}\n data-layout={layout}\n aria-labelledby={title != null ? titleId : undefined}\n >\n {children}\n </dl>\n );\n if (title == null) return list;\n return (\n <section className={className}>\n <h3 id={titleId} className={s.title}>{title}</h3>\n {list}\n </section>\n );\n}\n\n/** One label and its value in a {@link DetailList}. */\nexport function DetailRow({ label, children, className }: DetailRowProps) {\n return (\n <div className={className ? `${s.row} ${className}` : s.row}>\n <dt className={s.label}>{label}</dt>\n <dd className={s.value}>{children}</dd>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;ACqCA,SAAgBE,EAAW,EAAE,aAAU,UAAO,YAAS,UAAU,gBAA8B;CAC7F,IAAMC,IAAUC,EAAM,GAChBC,IACJ,kBAAC,MAAD;EACE,WAAWC,KAAaC,KAAS,OAAO,GAAGP,EAAE,KAAK,GAAGM,MAAcN,EAAE;EACrE,eAAaQ;EACb,mBAAiBD,KAAS,OAAiB,KAAA,IAAVJ;EAEhC;CACC,CAAA;CAGN,OADII,KAAS,OAAaF,IAExB,kBAAC,WAAD;EAAoB;EAApB,UAAA,CACE,kBAAC,MAAD;GAAI,IAAIF;GAAS,WAAWH,EAAE;GAAQ,UAAAO;EAAU,CAAA,GAC/CF,CACM;;AAEb;AAGA,SAAgBI,EAAU,EAAE,UAAO,aAAU,gBAA6B;CACxE,OACE,kBAAC,OAAD;EAAK,WAAWH,IAAY,GAAGN,EAAE,IAAI,GAAGM,MAAcN,EAAE;EAAxD,UAAA,CACE,kBAAC,MAAD;GAAI,WAAWA,EAAE;GAAQ,UAAAU;EAAU,CAAA,GACnC,kBAAC,MAAD;GAAI,WAAWV,EAAE;GAAQ;EAAa,CAAA,CACnC;;AAET"}
@@ -1,66 +0,0 @@
1
- import { r as e } from "./portalHost-yTOVuCej.js";
2
- import { t } from "./stance-BFQpS_fL.js";
3
- import { Fragment as n, jsx as r, jsxs as i } from "react/jsx-runtime";
4
- import { Dialog as a, Heading as o, Modal as s, ModalOverlay as c } from "react-aria-components";
5
- var l = {
6
- overlay: "_overlay_122x3_1",
7
- modal: "_modal_122x3_29",
8
- dialog: "_dialog_122x3_223",
9
- header: "_header_122x3_231",
10
- title: "_title_122x3_240",
11
- close: "_close_122x3_251",
12
- body: "_body_122x3_273",
13
- footer: "_footer_122x3_288"
14
- };
15
- //#endregion
16
- //#region src/components/Dialog/Dialog.tsx
17
- function u(u) {
18
- let { title: d, showCloseButton: f, children: p, footer: m, role: h = "dialog", className: g, bodyClassName: _, isOpen: v, onOpenChange: y, portalContainer: b, stance: x, tone: S, ...C } = u, w = t({
19
- stance: x,
20
- tone: S
21
- }), T = f ?? !!y, { anchor: E, portalProps: D } = e(b);
22
- return /* @__PURE__ */ i(n, { children: [E, /* @__PURE__ */ r(c, {
23
- ...C,
24
- isOpen: v,
25
- onOpenChange: y,
26
- className: l.overlay,
27
- "data-weasel-overlay": "",
28
- ...D,
29
- children: /* @__PURE__ */ r(s, {
30
- className: [l.modal, g].filter(Boolean).join(" "),
31
- ...w,
32
- children: /* @__PURE__ */ r(a, {
33
- role: h,
34
- className: l.dialog,
35
- children: ({ close: e }) => /* @__PURE__ */ i(n, { children: [
36
- (d !== void 0 || T) && /* @__PURE__ */ i("header", {
37
- className: l.header,
38
- children: [d !== void 0 && /* @__PURE__ */ r(o, {
39
- slot: "title",
40
- className: l.title,
41
- children: d
42
- }), T && /* @__PURE__ */ r("button", {
43
- type: "button",
44
- className: l.close,
45
- onClick: e,
46
- "aria-label": "Close dialog",
47
- children: "×"
48
- })]
49
- }),
50
- /* @__PURE__ */ r("div", {
51
- className: [l.body, _].filter(Boolean).join(" "),
52
- children: p
53
- }),
54
- m !== void 0 && /* @__PURE__ */ r("footer", {
55
- className: l.footer,
56
- children: m
57
- })
58
- ] })
59
- })
60
- })
61
- })] });
62
- }
63
- //#endregion
64
- export { u as t };
65
-
66
- //# sourceMappingURL=Dialog-BWyNMgpf.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Dialog-BWyNMgpf.js","names":["Dialog","_Fragment","s","RACModal","RACDialog","useOverlayPortal","Dialog_module_default","Dialog$1","rest","props","stanced","useStance","showClose","showCloseButton","onOpenChange","portalContainer","Fragment","anchor","ModalOverlay","portalProps","Modal","className","Dialog","title","Heading","close","bodyClassName","footer"],"sources":["../../src/components/Dialog/Dialog.module.css","../../src/components/Dialog/Dialog.tsx"],"sourcesContent":[".overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n opacity: 0;\n transition: opacity var(--wzl-motion-fast);\n}\n\n.overlay[data-entering] {\n opacity: 0;\n}\n\n.overlay[data-entering][data-rac] {\n opacity: 1;\n}\n\n.overlay[data-exiting] {\n opacity: 0;\n}\n\n.overlay[data-rac]:not([data-entering]):not([data-exiting]) {\n opacity: 1;\n}\n\n.modal {\n background: var(--_s-fill);\n border: var(--_s-border-width) var(--_s-border-style) var(--_s-border-color);\n border-radius: var(--_s-radius);\n box-shadow: 0 24px 64px rgba(0, 0, 0, 0.45);\n color: var(--wzl-fg);\n font-family: var(--wzl-font-ui);\n max-width: min(900px, calc(100vw - 32px));\n max-height: calc(100vh - 32px);\n display: flex;\n flex-direction: column;\n outline: none;\n}\n\n/* BEGIN GENERATED stance rules: dialog — `npm run gen:stances`, do not edit. */\n\n.modal {\n --wzl-tone: initial;\n}\n\n.modal {\n --_s-surface: var(--wzl-surface);\n --_s-border-color: var(--wzl-border);\n --_s-border-style: solid;\n --_s-border-width: 1px;\n --_s-radius: var(--wzl-radius-md);\n --_s-tone-mix: var(--wzl-panel-tone-mix);\n --_s-tone: var(--wzl-tone, var(--_s-surface));\n --_s-accent: var(--wzl-tone);\n --_s-title-font: var(--wzl-font-ui);\n --_s-title-weight: var(--wzl-font-weight-bold);\n --_s-title-size: var(--wzl-font-size);\n --_s-title-case: none;\n --_s-title-tracking: normal;\n --_s-title-color: var(--wzl-fg);\n}\n\n.modal[data-stance='scope'] {\n --_s-surface: var(--wzl-stance-scope-surface, var(--wzl-surface));\n --_s-border-color: var(--wzl-stance-scope-border-color, var(--wzl-border));\n --_s-border-style: var(--wzl-stance-scope-border-style, solid);\n --_s-border-width: var(--wzl-stance-scope-border-width, 1px);\n --_s-radius: var(--wzl-stance-scope-radius, var(--wzl-radius-md));\n --_s-tone-mix: var(--wzl-stance-scope-tone-mix, var(--wzl-panel-tone-mix));\n --_s-tone: var(--wzl-tone, var(--wzl-stance-scope-tone, var(--_s-surface)));\n --_s-accent: var(--wzl-stance-scope-accent, var(--wzl-tone));\n --_s-title-font: var(--wzl-stance-scope-title-font, var(--wzl-font-ui));\n --_s-title-weight: var(--wzl-stance-scope-title-weight, var(--wzl-font-weight-bold));\n --_s-title-size: var(--wzl-stance-scope-title-size, var(--wzl-font-size));\n --_s-title-case: var(--wzl-stance-scope-title-case, none);\n --_s-title-tracking: var(--wzl-stance-scope-title-tracking, normal);\n --_s-title-color: var(--wzl-stance-scope-title-color, var(--wzl-fg));\n}\n\n.modal[data-stance='aside'] {\n --_s-surface: var(--wzl-stance-aside-surface, var(--wzl-surface));\n --_s-border-color: var(--wzl-stance-aside-border-color, var(--wzl-border));\n --_s-border-style: var(--wzl-stance-aside-border-style, solid);\n --_s-border-width: var(--wzl-stance-aside-border-width, 1px);\n --_s-radius: var(--wzl-stance-aside-radius, var(--wzl-radius-md));\n --_s-tone-mix: var(--wzl-stance-aside-tone-mix, var(--wzl-panel-tone-mix));\n --_s-tone: var(--wzl-tone, var(--wzl-stance-aside-tone, var(--_s-surface)));\n --_s-accent: var(--wzl-stance-aside-accent, var(--wzl-tone));\n --_s-title-font: var(--wzl-stance-aside-title-font, var(--wzl-font-ui));\n --_s-title-weight: var(--wzl-stance-aside-title-weight, var(--wzl-font-weight-bold));\n --_s-title-size: var(--wzl-stance-aside-title-size, var(--wzl-font-size));\n --_s-title-case: var(--wzl-stance-aside-title-case, none);\n --_s-title-tracking: var(--wzl-stance-aside-title-tracking, normal);\n --_s-title-color: var(--wzl-stance-aside-title-color, var(--wzl-fg));\n}\n\n.modal[data-stance='advanced'] {\n --_s-surface: var(--wzl-stance-advanced-surface, var(--wzl-surface));\n --_s-border-color: var(--wzl-stance-advanced-border-color, var(--wzl-border));\n --_s-border-style: var(--wzl-stance-advanced-border-style, solid);\n --_s-border-width: var(--wzl-stance-advanced-border-width, 1px);\n --_s-radius: var(--wzl-stance-advanced-radius, var(--wzl-radius-md));\n --_s-tone-mix: var(--wzl-stance-advanced-tone-mix, var(--wzl-panel-tone-mix));\n --_s-tone: var(--wzl-tone, var(--wzl-stance-advanced-tone, var(--_s-surface)));\n --_s-accent: var(--wzl-stance-advanced-accent, var(--wzl-tone));\n --_s-title-font: var(--wzl-stance-advanced-title-font, var(--wzl-font-ui));\n --_s-title-weight: var(--wzl-stance-advanced-title-weight, var(--wzl-font-weight-bold));\n --_s-title-size: var(--wzl-stance-advanced-title-size, var(--wzl-font-size));\n --_s-title-case: var(--wzl-stance-advanced-title-case, none);\n --_s-title-tracking: var(--wzl-stance-advanced-title-tracking, normal);\n --_s-title-color: var(--wzl-stance-advanced-title-color, var(--wzl-fg));\n}\n\n.modal[data-stance='debug'] {\n --_s-surface: var(--wzl-stance-debug-surface, var(--wzl-surface));\n --_s-border-color: var(--wzl-stance-debug-border-color, var(--wzl-border));\n --_s-border-style: var(--wzl-stance-debug-border-style, solid);\n --_s-border-width: var(--wzl-stance-debug-border-width, 1px);\n --_s-radius: var(--wzl-stance-debug-radius, var(--wzl-radius-md));\n --_s-tone-mix: var(--wzl-stance-debug-tone-mix, var(--wzl-panel-tone-mix));\n --_s-tone: var(--wzl-tone, var(--wzl-stance-debug-tone, var(--_s-surface)));\n --_s-accent: var(--wzl-stance-debug-accent, var(--wzl-tone));\n --_s-title-font: var(--wzl-stance-debug-title-font, var(--wzl-font-ui));\n --_s-title-weight: var(--wzl-stance-debug-title-weight, var(--wzl-font-weight-bold));\n --_s-title-size: var(--wzl-stance-debug-title-size, var(--wzl-font-size));\n --_s-title-case: var(--wzl-stance-debug-title-case, none);\n --_s-title-tracking: var(--wzl-stance-debug-title-tracking, normal);\n --_s-title-color: var(--wzl-stance-debug-title-color, var(--wzl-fg));\n}\n\n.modal[data-stance='danger'] {\n --_s-surface: var(--wzl-stance-danger-surface, var(--wzl-surface));\n --_s-border-color: var(--wzl-stance-danger-border-color, var(--wzl-border));\n --_s-border-style: var(--wzl-stance-danger-border-style, solid);\n --_s-border-width: var(--wzl-stance-danger-border-width, 1px);\n --_s-radius: var(--wzl-stance-danger-radius, var(--wzl-radius-md));\n --_s-tone-mix: var(--wzl-stance-danger-tone-mix, var(--wzl-panel-tone-mix));\n --_s-tone: var(--wzl-tone, var(--wzl-stance-danger-tone, var(--_s-surface)));\n --_s-accent: var(--wzl-stance-danger-accent, var(--wzl-tone));\n --_s-title-font: var(--wzl-stance-danger-title-font, var(--wzl-font-ui));\n --_s-title-weight: var(--wzl-stance-danger-title-weight, var(--wzl-font-weight-bold));\n --_s-title-size: var(--wzl-stance-danger-title-size, var(--wzl-font-size));\n --_s-title-case: var(--wzl-stance-danger-title-case, none);\n --_s-title-tracking: var(--wzl-stance-danger-title-tracking, normal);\n --_s-title-color: var(--wzl-stance-danger-title-color, var(--wzl-fg));\n}\n\n.modal[data-stance='notice'] {\n --_s-surface: var(--wzl-stance-notice-surface, var(--wzl-surface));\n --_s-border-color: var(--wzl-stance-notice-border-color, var(--wzl-border));\n --_s-border-style: var(--wzl-stance-notice-border-style, solid);\n --_s-border-width: var(--wzl-stance-notice-border-width, 1px);\n --_s-radius: var(--wzl-stance-notice-radius, var(--wzl-radius-md));\n --_s-tone-mix: var(--wzl-stance-notice-tone-mix, var(--wzl-panel-tone-mix));\n --_s-tone: var(--wzl-tone, var(--wzl-stance-notice-tone, var(--_s-surface)));\n --_s-accent: var(--wzl-stance-notice-accent, var(--wzl-tone));\n --_s-title-font: var(--wzl-stance-notice-title-font, var(--wzl-font-ui));\n --_s-title-weight: var(--wzl-stance-notice-title-weight, var(--wzl-font-weight-bold));\n --_s-title-size: var(--wzl-stance-notice-title-size, var(--wzl-font-size));\n --_s-title-case: var(--wzl-stance-notice-title-case, none);\n --_s-title-tracking: var(--wzl-stance-notice-title-tracking, normal);\n --_s-title-color: var(--wzl-stance-notice-title-color, var(--wzl-fg));\n}\n\n.modal[data-stance='important'] {\n --_s-surface: var(--wzl-stance-important-surface, var(--wzl-surface));\n --_s-border-color: var(--wzl-stance-important-border-color, var(--wzl-border));\n --_s-border-style: var(--wzl-stance-important-border-style, solid);\n --_s-border-width: var(--wzl-stance-important-border-width, 1px);\n --_s-radius: var(--wzl-stance-important-radius, var(--wzl-radius-md));\n --_s-tone-mix: var(--wzl-stance-important-tone-mix, var(--wzl-panel-tone-mix));\n --_s-tone: var(--wzl-tone, var(--wzl-stance-important-tone, var(--_s-surface)));\n --_s-accent: var(--wzl-stance-important-accent, var(--wzl-tone));\n --_s-title-font: var(--wzl-stance-important-title-font, var(--wzl-font-ui));\n --_s-title-weight: var(--wzl-stance-important-title-weight, var(--wzl-font-weight-bold));\n --_s-title-size: var(--wzl-stance-important-title-size, var(--wzl-font-size));\n --_s-title-case: var(--wzl-stance-important-title-case, none);\n --_s-title-tracking: var(--wzl-stance-important-title-tracking, normal);\n --_s-title-color: var(--wzl-stance-important-title-color, var(--wzl-fg));\n}\n\n.modal[data-stance='preview'] {\n --_s-surface: var(--wzl-stance-preview-surface, var(--wzl-surface));\n --_s-border-color: var(--wzl-stance-preview-border-color, var(--wzl-border));\n --_s-border-style: var(--wzl-stance-preview-border-style, solid);\n --_s-border-width: var(--wzl-stance-preview-border-width, 1px);\n --_s-radius: var(--wzl-stance-preview-radius, var(--wzl-radius-md));\n --_s-tone-mix: var(--wzl-stance-preview-tone-mix, var(--wzl-panel-tone-mix));\n --_s-tone: var(--wzl-tone, var(--wzl-stance-preview-tone, var(--_s-surface)));\n --_s-accent: var(--wzl-stance-preview-accent, var(--wzl-tone));\n --_s-title-font: var(--wzl-stance-preview-title-font, var(--wzl-font-ui));\n --_s-title-weight: var(--wzl-stance-preview-title-weight, var(--wzl-font-weight-bold));\n --_s-title-size: var(--wzl-stance-preview-title-size, var(--wzl-font-size));\n --_s-title-case: var(--wzl-stance-preview-title-case, none);\n --_s-title-tracking: var(--wzl-stance-preview-title-tracking, normal);\n --_s-title-color: var(--wzl-stance-preview-title-color, var(--wzl-fg));\n}\n\n.modal {\n --_s-fill: var(--_s-surface);\n}\n\n.modal[data-tone],\n.modal[data-stance] {\n --_s-fill: color-mix(in oklab, var(--_s-tone) var(--_s-tone-mix), var(--_s-surface));\n}\n\n.modal[data-tone] {\n --wzl-accent: var(--_s-accent);\n --wzl-accent-base: var(--_s-accent);\n --wzl-accent-strong: color-mix(in oklab, var(--_s-accent) 70%, var(--wzl-fg));\n --wzl-accent-soft: color-mix(in oklab, var(--_s-accent) 45%, var(--wzl-surface));\n --wzl-accent-hover: var(--wzl-accent-strong);\n --wzl-accent-fg: var(--wzl-accent-strong);\n --wzl-focus-ring: var(--wzl-accent-strong);\n}\n\n/* END GENERATED stance rules: dialog */\n\n.dialog {\n display: flex;\n flex-direction: column;\n min-height: 0;\n flex: 1;\n outline: none;\n}\n\n.header {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-6);\n padding: var(--wzl-space-7) var(--wzl-space-8);\n border-bottom: 1px solid var(--wzl-border);\n flex: 0 0 auto;\n}\n\n.title {\n flex: 1;\n margin: 0;\n font-family: var(--_s-title-font);\n font-size: var(--_s-title-size);\n font-weight: var(--_s-title-weight);\n text-transform: var(--_s-title-case);\n letter-spacing: var(--_s-title-tracking);\n color: var(--_s-title-color);\n}\n\n.close {\n flex: 0 0 auto;\n width: var(--wzl-icon-button-size);\n height: var(--wzl-icon-button-size);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: 1px solid transparent;\n border-radius: var(--wzl-radius-sm);\n color: var(--wzl-fg-muted);\n cursor: pointer;\n padding: 0;\n font-size: var(--wzl-font-size-lg);\n line-height: 1;\n}\n\n.close:hover {\n background: var(--wzl-surface-hover);\n color: var(--wzl-fg);\n}\n\n.body {\n flex: 1;\n}\n\n/* Defaults, not rules: `bodyClassName` exists to turn these off for content\n that scrolls itself, and a plain class would tie with it on specificity and\n be decided by stylesheet order. `min-height` is here for the same reason —\n left in the rule above it silently beat a consumer class asking the body to\n hold a height, and the dialog resized itself around every pane. */\n:where(.body) {\n min-height: 0;\n overflow: auto;\n padding: var(--wzl-space-8);\n}\n\n.footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--wzl-space-4);\n padding: var(--wzl-space-6) var(--wzl-space-8);\n border-top: 1px solid var(--wzl-border);\n flex: 0 0 auto;\n}\n","import type { ReactNode } from 'react';\nimport {\n Modal as RACModal,\n ModalOverlay,\n Dialog as RACDialog,\n Heading,\n type ModalOverlayProps,\n type DialogProps as RACDialogProps,\n} from 'react-aria-components';\nimport { useOverlayPortal, type OverlayPortalProps, type WithoutPortalTarget } from '../../overlays/portalHost';\nimport { type StanceProps, useStance } from '../stance';\nimport s from './Dialog.module.css';\n\n/** Props for {@link Dialog}, on top of React Aria's `ModalOverlay` props. */\nexport type DialogProps = Omit<\n WithoutPortalTarget<ModalOverlayProps>,\n 'children' | 'className'\n> &\n OverlayPortalProps &\n StanceProps & {\n /** Heading rendered in the dialog's default header. Omit when supplying\n * a custom `header` slot via children. */\n title?: ReactNode;\n /** Show the built-in close button. Defaults to true when `onOpenChange`\n * is wired so the user has an escape hatch. */\n showCloseButton?: boolean;\n /** Body content. */\n children?: ReactNode;\n /** Footer slot — typically action buttons. */\n footer?: ReactNode;\n /** ARIA role. Defaults to `dialog`. Use `alertdialog` for confirms. */\n role?: RACDialogProps['role'];\n /** Class applied to the modal box (inside the overlay). */\n className?: string;\n /** Class applied to the scrolling body. For content that owns its own\n * scrolling — a form with a fixed navigation rail beside a scrolling\n * pane — this is where the body's padding and overflow come off. */\n bodyClassName?: string;\n };\n\n/**\n * Modal dialog wrapping React Aria. Supplies a default header (title +\n * close), scrollable body, and footer slot. Pass `isOpen` + `onOpenChange`\n * for controlled visibility, or omit both and use a `<DialogTrigger>` from\n * `react-aria-components` upstream of this component.\n *\n * Escape, click-outside, focus trap, and scroll lock all come from the\n * underlying primitives. `stance` and `tone` work as on `<PropertyPanel>` —\n * a destructive confirm is `stance=\"danger\"`.\n */\nexport function Dialog(props: DialogProps) {\n const {\n title,\n showCloseButton,\n children,\n footer,\n role = 'dialog',\n className,\n bodyClassName,\n isOpen,\n onOpenChange,\n portalContainer,\n stance,\n tone,\n ...rest\n } = props;\n const stanced = useStance({ stance, tone });\n\n const showClose = showCloseButton ?? Boolean(onOpenChange);\n const { anchor, portalProps } = useOverlayPortal(portalContainer);\n\n return (\n <>\n {anchor}\n <ModalOverlay\n {...rest}\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n className={s.overlay}\n data-weasel-overlay=\"\"\n {...portalProps}\n >\n <RACModal className={[s.modal, className].filter(Boolean).join(' ')} {...stanced}>\n <RACDialog role={role} className={s.dialog}>\n {({ close }) => (\n <>\n {(title !== undefined || showClose) && (\n <header className={s.header}>\n {title !== undefined && (\n <Heading slot=\"title\" className={s.title}>{title}</Heading>\n )}\n {showClose && (\n <button\n type=\"button\"\n className={s.close}\n onClick={close}\n aria-label=\"Close dialog\"\n >\n ×\n </button>\n )}\n </header>\n )}\n <div className={[s.body, bodyClassName].filter(Boolean).join(' ')}>{children}</div>\n {footer !== undefined && <footer className={s.footer}>{footer}</footer>}\n </>\n )}\n </RACDialog>\n </RACModal>\n </ModalOverlay>\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;ACkDA,SAAgBA,EAAO,GAAoB;CACzC,IAAM,EACJ,UACA,oBACA,aACA,WACA,UAAO,UACP,cACA,kBACA,WACA,iBACA,oBACA,WACA,SACA,GAAGQ,MACDC,GACEC,IAAUC,EAAU;EAAE;EAAQ;CAAK,CAAC,GAEpCC,IAAYC,KAAmB,EAAQC,GACvC,EAAE,WAAQ,mBAAgBT,EAAiBU,CAAe;CAEhE,OACE,kBAAAd,GAAA,EAAA,UAAA,CACGgB,GACD,kBAACC,GAAD;EACE,GAAIV;EACI;EACM;EACd,WAAWN,EAAE;EACb,uBAAoB;EACpB,GAAIiB;EAEJ,UAAA,kBAAChB,GAAD;GAAU,WAAW,CAACD,EAAE,OAAOmB,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;GAAG,GAAIX;GACvE,UAAA,kBAACN,GAAD;IAAiB;IAAM,WAAWF,EAAE;IAChC,WAAA,EAAE,eACF,kBAAAD,GAAA,EAAA,UAAA;MACIsB,MAAU,KAAA,KAAaX,MACvB,kBAAC,UAAD;MAAQ,WAAWV,EAAE;MAArB,UAAA,CACGqB,MAAU,KAAA,KACT,kBAACC,GAAD;OAAS,MAAK;OAAQ,WAAWtB,EAAE;OAAQ,UAAAqB;MAAe,CAAA,GAE3DX,KACC,kBAAC,UAAD;OACE,MAAK;OACL,WAAWV,EAAE;OACb,SAASuB;OACT,cAAW;OACZ,UAAA;MAEO,CAAA,CAEJ;;KAEV,kBAAC,OAAD;MAAK,WAAW,CAACvB,EAAE,MAAMwB,CAAa,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;MAAI;KAAc,CAAA;KACjFC,MAAW,KAAA,KAAa,kBAAC,UAAD;MAAQ,WAAWzB,EAAE;MAAS,UAAAyB;KAAe,CAAA;IACtE,EAAA,CAAA;GAEK,CAAA;EACH,CAAA;CACE,CAAA,CACd,EAAA,CAAA;AAEN"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Disclosure-0G0uh2fa.js","names":["s","Disclosure_module_default","DisclosureMark","className","size","open","Disclosure","controls","label","onToggle","DisclosureRow","twisty"],"sources":["../../src/components/Disclosure/Disclosure.module.css","../../src/components/Disclosure/Disclosure.tsx"],"sourcesContent":["/* Every dimension is stated because a host app's bare-element defaults can be\n authored at zero specificity — labkit's `:where(.lk-root) :where(button)`\n sets `height: var(--wzl-control-h)` and horizontal padding, which would\n otherwise stretch a 12px mark into a full-height control. */\n.twisty {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n /* A floor, not a size: a control sized to a 12px glyph is a 12px target,\n which is under every pointer-size guideline there is. Stated as a minimum\n so a larger mark grows the target with it rather than being shrunk to fit\n — a flex item's default `flex-shrink: 1` would otherwise crush it. */\n min-width: var(--wzl-disclosure-target, var(--wzl-control-h-sm));\n min-height: var(--wzl-disclosure-target, var(--wzl-control-h-sm));\n padding: 0;\n border: 0;\n border-radius: var(--wzl-radius-sm);\n background: none;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n line-height: 1;\n cursor: pointer;\n}\n\n.twisty:focus-visible {\n outline: 2px solid var(--wzl-focus-ring);\n outline-offset: -2px;\n}\n\n.twisty:disabled {\n cursor: not-allowed;\n}\n\n.mark {\n display: block;\n flex: none;\n}\n\n.lozenge {\n fill: var(--wzl-disclosure-fill, var(--wzl-accent-fg));\n transition: fill var(--wzl-motion-fast, 90ms) var(--wzl-ease-out-cubic);\n}\n\n.twisty:hover:not(:disabled) .lozenge {\n fill: color-mix(in oklab, var(--wzl-disclosure-fill, var(--wzl-accent-fg)), white 15%);\n}\n\n.twisty:disabled .lozenge {\n fill: var(--wzl-fg-subtle);\n}\n\n.sign {\n fill: none;\n stroke: var(--wzl-fg-on-accent);\n stroke-width: 1;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .lozenge {\n transition: none;\n }\n}\n\n.row {\n display: flex;\n align-items: center;\n gap: var(--wzl-disclosure-gap, 4px);\n}\n\n/* The row's content takes the rest and is allowed to shrink; the twisty is\n not, so a long label truncates rather than crushing the control. */\n.rowBody {\n flex: 1 1 auto;\n min-width: 0;\n}\n","import type { ReactNode } from 'react';\nimport s from './Disclosure.module.css';\n\n/** Props for `<DisclosureMark>`. */\nexport interface DisclosureMarkProps {\n /** Whether the section it stands for is open: `−` when open, `+` when shut. */\n open: boolean;\n /** Mark size in px, square. Default 13. */\n size?: number;\n className?: string;\n}\n\n/**\n * The fold mark alone: a dark violet rounded square holding a `+` while its section is\n * shut and a `−` while it is open. Decorative — it carries no role or label —\n * for a row that is itself the control, such as a tree item or a header\n * button. Anywhere the mark has to be the control, use `<Disclosure>`.\n *\n * Deliberately not part of the icon register, on the same grounds as\n * `DragHandleGlyph`: that register is outline strokes at a fixed weight, and\n * this mark is filled.\n */\nexport function DisclosureMark({ open, size = 13, className }: DisclosureMarkProps) {\n return (\n <svg\n className={className ? `${s.mark} ${className}` : s.mark}\n viewBox=\"0 0 13 13\"\n width={size}\n height={size}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <rect className={s.lozenge} width=\"13\" height=\"13\" rx=\"3\" />\n {/* One-unit bars centered on 6.5 in an odd box, so at the default size\n both edges land on the pixel grid rather than blurring across it. */}\n <path className={s.sign} d={open ? 'M3 6.5 H10' : 'M3 6.5 H10 M6.5 3 V10'} />\n </svg>\n );\n}\n\n/** Props for `<Disclosure>`. */\nexport interface DisclosureProps {\n /** Whether the section it controls is open. The consumer owns this. */\n open: boolean;\n onToggle: () => void;\n /**\n * Names the section, for a screen reader. The control has no text of its\n * own, so without this it announces as an unlabeled button.\n */\n label: string;\n /**\n * `id` of the element this expands. Sets `aria-controls`, which lets a\n * screen reader move to the revealed content.\n */\n controls?: string;\n /** Mark size in px. The hit target is at least 20px and grows with it.\n * Default 13. */\n size?: number;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * The twisty on a collapsible section: a `<DisclosureMark>` in a button.\n *\n * Presentational — it holds no open/closed state and renders no children.\n * The consumer owns the state and the panel; this is the control that toggles\n * it, and `aria-expanded` is what ties the two together.\n *\n * Three things it settles that a hand-rolled twisty keeps getting wrong. The\n * mark is drawn rather than typed, because `--wzl-font-ui` carries no ▸/▾ and\n * a text glyph falls back to whatever the system offers at whatever size that\n * font renders it. The hit target is larger than the mark. And it is a sibling\n * of the row's label rather than a child, so clicking to expand does not\n * actuate the label's own control.\n */\nexport function Disclosure({ open, onToggle, label, controls, size = 13, disabled, className }: DisclosureProps) {\n return (\n <button\n type=\"button\"\n className={className ? `${s.twisty} ${className}` : s.twisty}\n aria-expanded={open}\n aria-controls={controls}\n aria-label={label}\n disabled={disabled}\n onClick={onToggle}\n >\n <DisclosureMark open={open} size={size} />\n </button>\n );\n}\n\n/** Props for `<DisclosureRow>`. */\nexport interface DisclosureRowProps extends Omit<DisclosureProps, 'className'> {\n /** The row's own content — a label, a checkbox, a count. */\n children: ReactNode;\n className?: string;\n}\n\n/**\n * A `<Disclosure>` and a row of content beside it, laid out so the twisty\n * leads and the content takes the rest.\n *\n * The layout is the point: the twisty sits *outside* whatever the row puts in\n * it, so a row whose content is a `<label>` wrapping a checkbox stays\n * clickable as a label without the twisty actuating it.\n */\nexport function DisclosureRow({ children, className, ...twisty }: DisclosureRowProps) {\n return (\n <div className={className ? `${s.row} ${className}` : s.row}>\n <Disclosure {...twisty} />\n <div className={s.rowBody}>{children}</div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;ACsBA,SAAgBE,EAAe,EAAE,SAAM,UAAO,IAAI,gBAAkC;CAClF,OACE,kBAAC,OAAD;EACE,WAAWC,IAAY,GAAGH,EAAE,KAAK,GAAGG,MAAcH,EAAE;EACpD,SAAQ;EACR,OAAOI;EACP,QAAQA;EACR,eAAY;EACZ,WAAU;EANZ,UAAA,CAQE,kBAAC,QAAD;GAAM,WAAWJ,EAAE;GAAS,OAAM;GAAK,QAAO;GAAK,IAAG;EAAK,CAAA,GAG3D,kBAAC,QAAD;GAAM,WAAWA,EAAE;GAAM,GAAGK,IAAO,eAAe;EAA0B,CAAA,CACzE;;AAET;AAsCA,SAAgBC,EAAW,EAAE,SAAM,aAAU,UAAO,aAAU,UAAO,IAAI,aAAU,gBAA8B;CAC/G,OACE,kBAAC,UAAD;EACE,MAAK;EACL,WAAWH,IAAY,GAAGH,EAAE,OAAO,GAAGG,MAAcH,EAAE;EACtD,iBAAeK;EACf,iBAAeE;EACf,cAAYC;EACF;EACV,SAASC;EAET,UAAA,kBAACP,GAAD;GAAsB;GAAY;EAAO,CAAA;CACnC,CAAA;AAEZ;AAiBA,SAAgBQ,EAAc,EAAE,aAAU,cAAW,GAAGC,KAA8B;CACpF,OACE,kBAAC,OAAD;EAAK,WAAWR,IAAY,GAAGH,EAAE,IAAI,GAAGG,MAAcH,EAAE;EAAxD,UAAA,CACE,kBAACM,GAAD,EAAY,GAAIK,EAAS,CAAA,GACzB,kBAAC,OAAD;GAAK,WAAWX,EAAE;GAAU;EAAc,CAAA,CACvC;;AAET"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"DragHandleGlyph-Dr7Fgo0I.js","names":["DragHandleGlyph","size"],"sources":["../../src/components/DragHandleGlyph/DragHandleGlyph.tsx"],"sourcesContent":["/** Props for `<DragHandleGlyph>`. */\nexport interface DragHandleGlyphProps {\n /** Height in px; width scales with it. Default 16. */\n size?: number;\n}\n\n/** The two-column dot grip used on anything draggable by a handle.\n *\n * Deliberately not part of the icon register: that register is outline strokes\n * at a fixed weight, and a grip is filled dots. Forcing it in would either\n * break the register's rule or produce a worse glyph. */\nexport function DragHandleGlyph({ size = 16 }: DragHandleGlyphProps) {\n return (\n <svg\n width={(size * 8) / 16}\n height={size}\n viewBox=\"0 0 8 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <circle cx=\"2\" cy=\"3\" r=\"1.1\" />\n <circle cx=\"6\" cy=\"3\" r=\"1.1\" />\n <circle cx=\"2\" cy=\"8\" r=\"1.1\" />\n <circle cx=\"6\" cy=\"8\" r=\"1.1\" />\n <circle cx=\"2\" cy=\"13\" r=\"1.1\" />\n <circle cx=\"6\" cy=\"13\" r=\"1.1\" />\n </svg>\n );\n}\n"],"mappings":";;AAWA,SAAgBA,EAAgB,EAAE,UAAO,MAA4B;CACnE,OACE,kBAAC,OAAD;EACE,OAAQC,IAAO,IAAK;EACpB,QAAQA;EACR,SAAQ;EACR,MAAK;EACL,eAAY;EALd,UAAA;GAOE,kBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAI,GAAE;GAAO,CAAA;GAC/B,kBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAI,GAAE;GAAO,CAAA;GAC/B,kBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAI,GAAE;GAAO,CAAA;GAC/B,kBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAI,GAAE;GAAO,CAAA;GAC/B,kBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAK,GAAE;GAAO,CAAA;GAChC,kBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAK,GAAE;GAAO,CAAA;EAC7B;;AAET"}
@@ -1,335 +0,0 @@
1
- import { t as e } from "./ColorField-BcMcW8Sa.js";
2
- import { t } from "./Slider-CFwQYQ10.js";
3
- import { t as n } from "./ToggleBar-DTjGeS0Q.js";
4
- import { fillInPoseFrame as r, fillToBoundsFrame as i, gradientGeometry as a, isGradientFill as o, sampleGradientStops as s, useHandleDrag as c, useNodeOverlayFrame as l, useOngoingAction as u, withGradientKind as d } from "@weasel-js/core";
5
- import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
6
- import { useCallback as h, useRef as g } from "react";
7
- //#region src/paintGradientTrack.tsx
8
- var _ = {
9
- angleDeg: 135,
10
- stripe: 2,
11
- gap: 4,
12
- dim: 75
13
- };
14
- function v(e) {
15
- let { gradient: t, samples: n = 16, activeRange: r, hatch: i } = e;
16
- return (e) => {
17
- let a = [];
18
- for (let e = 0; e <= n; e++) {
19
- let r = e / n;
20
- a.push(`${t(r)} ${(r * 100).toFixed(1)}%`);
21
- }
22
- let o = `linear-gradient(to right, ${a.join(", ")})`, s = [];
23
- if (r) {
24
- let t = e.valueToFraction(r[0]) * 100, n = e.valueToFraction(r[1]) * 100, a = {
25
- ..._,
26
- ...i
27
- }, o = `repeating-linear-gradient(${a.angleDeg}deg, transparent 0 ${a.stripe}px, var(--wzl-surface) ${a.stripe}px ${a.stripe + a.gap}px)`, c = `color-mix(in srgb, var(--wzl-surface) ${a.dim}%, transparent)`, l = `linear-gradient(${c}, ${c})`;
28
- if (t > 0 && (s.push(`${l} left 0 / ${t.toFixed(2)}% 100% no-repeat`), s.push(`${o} left 0 / ${t.toFixed(2)}% 100% no-repeat`)), n < 100) {
29
- let e = (100 - n).toFixed(2);
30
- s.push(`${l} right 0 / ${e}% 100% no-repeat`), s.push(`${o} right 0 / ${e}% 100% no-repeat`);
31
- }
32
- }
33
- s.push(o);
34
- let c = {
35
- position: "absolute",
36
- inset: 0,
37
- background: s.join(", ")
38
- };
39
- return /* @__PURE__ */ p("div", { style: c });
40
- };
41
- }
42
- var y = {
43
- root: "_root_c0ev4_1",
44
- swatches: "_swatches_c0ev4_8",
45
- swatch: "_swatch_c0ev4_8"
46
- }, b = [
47
- {
48
- value: "linear-gradient",
49
- label: "Linear"
50
- },
51
- {
52
- value: "radial-gradient",
53
- label: "Radial"
54
- },
55
- {
56
- value: "conic-gradient",
57
- label: "Conic"
58
- }
59
- ], x = [
60
- {
61
- value: "rgb",
62
- label: "sRGB"
63
- },
64
- {
65
- value: "oklab",
66
- label: "OKLab"
67
- },
68
- {
69
- value: "oklch",
70
- label: "OKLCh"
71
- }
72
- ], S = 2;
73
- function C(r) {
74
- let { value: i, onInput: a, onChange: o, kindSwitch: c = !0, spaceSwitch: l = !0, className: u } = r, f = i.stops, g = i.interpolate ?? "rgb", _ = h((e) => ({
75
- ...i,
76
- stops: e
77
- }), [i]), C = f.map((e) => ({
78
- value: e.offset,
79
- color: e.color
80
- })), w = (e) => e.map((e) => ({
81
- offset: e.value,
82
- color: e.color
83
- })), T = (e, t) => f.map((n, r) => r === e ? {
84
- ...n,
85
- color: t
86
- } : n), E = f.map((e, t) => ({
87
- stop: e,
88
- index: t
89
- })).sort((e, t) => e.stop.offset - t.stop.offset);
90
- return /* @__PURE__ */ m("div", {
91
- className: [y.root, u].filter(Boolean).join(" "),
92
- children: [
93
- c && /* @__PURE__ */ p(n, {
94
- items: b,
95
- value: i.fill,
96
- size: "sm",
97
- ariaLabel: "Gradient kind",
98
- onChange: (e) => e && o(d(i, e))
99
- }),
100
- /* @__PURE__ */ p(t, {
101
- min: 0,
102
- max: 1,
103
- step: .005,
104
- constraint: "free",
105
- thumbs: C,
106
- ariaLabel: "Gradient stops",
107
- readoutPlacement: "none",
108
- onInput: (e) => a?.(_(w(e))),
109
- onChange: (e) => o(_(w(e))),
110
- onAddThumb: (e) => ({
111
- value: e,
112
- color: s(f, e, g)
113
- }),
114
- onRemoveThumb: () => f.length > S,
115
- renderTrack: v({
116
- gradient: (e) => s(f, e, g),
117
- samples: g === "rgb" ? 32 : 64
118
- })
119
- }),
120
- l && /* @__PURE__ */ p(n, {
121
- items: x,
122
- value: g,
123
- size: "sm",
124
- ariaLabel: "Blend space",
125
- onChange: (e) => e && o({
126
- ...i,
127
- interpolate: e
128
- })
129
- }),
130
- /* @__PURE__ */ p("div", {
131
- className: y.swatches,
132
- children: E.map(({ stop: t, index: n }) => /* @__PURE__ */ p(e, {
133
- value: t.color,
134
- alpha: !0,
135
- "aria-label": `Stop ${n + 1} at ${Math.round(t.offset * 100)}%`,
136
- className: y.swatch,
137
- onInput: (e) => a?.(_(T(n, e))),
138
- onChange: (e) => o(_(T(n, e)))
139
- }, n))
140
- })
141
- ]
142
- });
143
- }
144
- var w = {
145
- overlay: "_overlay_6yu3h_3",
146
- guide: "_guide_6yu3h_13",
147
- handle: "_handle_6yu3h_21"
148
- };
149
- //#endregion
150
- //#region src/components/GradientEditor/GradientHandles.tsx
151
- function T(e) {
152
- let { value: t, toScreen: n, toLocal: r, onInput: i, onChange: a, width: o, height: s, className: c } = e;
153
- return /* @__PURE__ */ p("svg", {
154
- className: [w.overlay, c].filter(Boolean).join(" "),
155
- width: o,
156
- height: s,
157
- children: E(t, n, r, i, a)
158
- });
159
- }
160
- function E(e, t, n, r, i) {
161
- let o = (e, t) => {
162
- t === "input" ? r?.(e) : i(e);
163
- };
164
- if (e.fill === "linear-gradient") {
165
- let r = t(e.from), i = t(e.to);
166
- return /* @__PURE__ */ m(f, { children: [
167
- /* @__PURE__ */ p(O, {
168
- x1: r.x,
169
- y1: r.y,
170
- x2: i.x,
171
- y2: i.y
172
- }),
173
- /* @__PURE__ */ p(k, {
174
- at: r,
175
- label: "Gradient start",
176
- onDrag: (t, r) => o({
177
- ...e,
178
- from: n(t)
179
- }, r)
180
- }),
181
- /* @__PURE__ */ p(k, {
182
- at: i,
183
- label: "Gradient end",
184
- onDrag: (t, r) => o({
185
- ...e,
186
- to: n(t)
187
- }, r)
188
- })
189
- ] });
190
- }
191
- if (e.fill === "radial-gradient") {
192
- let r = t(e.center), i = t({
193
- x: e.center.x + e.radius,
194
- y: e.center.y
195
- }), a = Math.hypot(i.x - r.x, i.y - r.y);
196
- return /* @__PURE__ */ m(f, { children: [
197
- /* @__PURE__ */ p("circle", {
198
- className: w.guide,
199
- cx: r.x,
200
- cy: r.y,
201
- r: a
202
- }),
203
- /* @__PURE__ */ p(k, {
204
- at: r,
205
- label: "Gradient center",
206
- onDrag: (t, r) => o({
207
- ...e,
208
- center: n(t)
209
- }, r)
210
- }),
211
- /* @__PURE__ */ p(k, {
212
- at: i,
213
- label: "Gradient radius",
214
- onDrag: (t, r) => {
215
- let i = n(t), a = Math.hypot(i.x - e.center.x, i.y - e.center.y);
216
- o({
217
- ...e,
218
- radius: Math.max(D, a)
219
- }, r);
220
- }
221
- })
222
- ] });
223
- }
224
- let s = t(e.center), { radius: c } = a(e), l = t({
225
- x: e.center.x + Math.cos(e.angle) * c,
226
- y: e.center.y + Math.sin(e.angle) * c
227
- });
228
- return /* @__PURE__ */ m(f, { children: [
229
- /* @__PURE__ */ p(O, {
230
- x1: s.x,
231
- y1: s.y,
232
- x2: l.x,
233
- y2: l.y
234
- }),
235
- /* @__PURE__ */ p(k, {
236
- at: s,
237
- label: "Gradient center",
238
- onDrag: (t, r) => o({
239
- ...e,
240
- center: n(t)
241
- }, r)
242
- }),
243
- /* @__PURE__ */ p(k, {
244
- at: l,
245
- label: "Gradient angle",
246
- onDrag: (t, r) => {
247
- let i = n(t), a = Math.atan2(i.y - e.center.y, i.x - e.center.x);
248
- o({
249
- ...e,
250
- angle: a
251
- }, r);
252
- }
253
- })
254
- ] });
255
- }
256
- var D = 1;
257
- function O(e) {
258
- return /* @__PURE__ */ p("line", {
259
- className: w.guide,
260
- ...e
261
- });
262
- }
263
- function k({ at: e, label: t, onDrag: n }) {
264
- let r = g(e), i = c({
265
- onStart: () => {
266
- r.current = e;
267
- },
268
- onMove: (e) => {
269
- n(e, "input");
270
- },
271
- onEnd: ({ point: e, moved: t }) => {
272
- t && n(e, "commit");
273
- },
274
- onCancel: () => {
275
- n(r.current, "input");
276
- }
277
- });
278
- return /* @__PURE__ */ p("circle", {
279
- className: w.handle,
280
- cx: e.x,
281
- cy: e.y,
282
- r: A,
283
- role: "button",
284
- "aria-label": t,
285
- tabIndex: 0,
286
- onKeyDown: (t) => {
287
- let r = t.shiftKey ? j * 10 : j, i = 0, a = 0;
288
- if (t.key === "ArrowLeft") i = -r;
289
- else if (t.key === "ArrowRight") i = r;
290
- else if (t.key === "ArrowUp") a = -r;
291
- else if (t.key === "ArrowDown") a = r;
292
- else return;
293
- t.preventDefault();
294
- let o = {
295
- x: e.x + i,
296
- y: e.y + a
297
- };
298
- n(o, "input"), n(o, "commit");
299
- },
300
- ...i
301
- });
302
- }
303
- var A = 7, j = 1;
304
- //#endregion
305
- //#region src/components/GradientEditor/SceneGradientHandles.tsx
306
- function M(e) {
307
- let { scene: t, containerRef: n, nodeId: a, slot: o, view: s, className: c } = e, d = l(t, n, a, { view: s }), f = u(o === "fill" ? "setFill" : "setStroke"), m = d ? P(N(t, a, o)) : null;
308
- if (!d || !m) return null;
309
- let h = (e, t) => {
310
- let n = i(e, d.box);
311
- t === "commit" ? f.commit({ paint: n }) : f.input({ paint: n });
312
- };
313
- return /* @__PURE__ */ p(T, {
314
- value: r(m, d.box),
315
- toScreen: d.toScreen,
316
- toLocal: d.toLocal,
317
- width: d.width,
318
- height: d.height,
319
- className: c,
320
- onInput: (e) => h(e, "input"),
321
- onChange: (e) => h(e, "commit")
322
- });
323
- }
324
- function N(e, t, n) {
325
- if (t == null) return;
326
- let r = e.nodes.get(t)?.data;
327
- if (r) return n === "fill" ? r.fill : r.stroke?.paint;
328
- }
329
- function P(e) {
330
- return o(e) ? e : null;
331
- }
332
- //#endregion
333
- export { v as i, T as n, C as r, M as t };
334
-
335
- //# sourceMappingURL=GradientEditor-B3a-MsVJ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GradientEditor-B3a-MsVJ.js","names":["s","s","_Fragment","ColorField","ToggleBar","DEFAULT_HATCH","paintGradientTrack","opts","stops","i","samples","t","gradient","baseGradient","layers","activeRange","lowPct","ctx","highPct","h","hatch","stripe","dimColor","dimOverlay","wR","style","GradientEditor_module_default","KINDS","SPACES","MIN_STOPS","GradientEditor","props","value","space","withStops","useCallback","next","thumbs","stop","applyThumbs","setStopColor","index","ordered","a","b","className","kindSwitch","kind","onChange","withGradientKind","Slider","onInput","at","sampleGradientStops","spaceSwitch","hex","GradientHandles_module_default","GradientHandles","renderForKind","toScreen","toLocal","emit","phase","from","to","Fragment","Guide","DragPoint","p","center","edge","screenRadius","local","radius","MIN_RADIUS","gradientGeometry","tip","angle","start","useRef","drag","useHandleDrag","moved","onDrag","point","HANDLE_RADIUS","label","amount","e","KEY_STEP","dx","dy","SceneGradientHandles","frame","useNodeOverlayFrame","scene","containerRef","nodeId","edit","useOngoingAction","slot","gradientInSlot","paintOf","dispatch","paint","fillToBoundsFrame","fillInPoseFrame","data","isGradientFill"],"sources":["../../src/paintGradientTrack.tsx","../../src/components/GradientEditor/GradientEditor.module.css","../../src/components/GradientEditor/GradientEditor.tsx","../../src/components/GradientEditor/GradientHandles.module.css","../../src/components/GradientEditor/GradientHandles.tsx","../../src/components/GradientEditor/SceneGradientHandles.tsx"],"sourcesContent":["import type { ReactNode, CSSProperties } from 'react';\nimport type { TrackCtx } from './components/Slider';\n\n/**\n * Options for {@link paintGradientTrack}.\n *\n * `gradient` maps a normalized position along the track (0 to 1) to a CSS\n * color; `samples` is how many stops the resulting linear-gradient uses.\n * `activeRange`, given in the slider's own value units, keeps that span at\n * full strength and dims + hatches the rest.\n */\nexport type GradientTrackOpts = {\n gradient: (t: number) => string;\n samples?: number;\n activeRange?: [number, number];\n hatch?: {\n angleDeg?: number;\n stripe?: number;\n gap?: number;\n dim?: number;\n };\n};\n\nconst DEFAULT_HATCH = { angleDeg: 135, stripe: 2, gap: 4, dim: 75 };\n\n/**\n * Builds a `Slider` `renderTrack` function that paints the track as a\n * sampled color gradient, optionally dimming and hatching the portions\n * outside an active range.\n */\nexport function paintGradientTrack(opts: GradientTrackOpts): (ctx: TrackCtx) => ReactNode {\n const { gradient, samples = 16, activeRange, hatch } = opts;\n\n return (ctx: TrackCtx) => {\n const stops: string[] = [];\n for (let i = 0; i <= samples; i++) {\n const t = i / samples;\n stops.push(`${gradient(t)} ${(t * 100).toFixed(1)}%`);\n }\n const baseGradient = `linear-gradient(to right, ${stops.join(', ')})`;\n\n const layers: string[] = [];\n if (activeRange) {\n const lowPct = ctx.valueToFraction(activeRange[0]) * 100;\n const highPct = ctx.valueToFraction(activeRange[1]) * 100;\n const h = { ...DEFAULT_HATCH, ...hatch };\n const stripe = `repeating-linear-gradient(${h.angleDeg}deg, transparent 0 ${h.stripe}px, var(--wzl-surface) ${h.stripe}px ${h.stripe + h.gap}px)`;\n const dimColor = `color-mix(in srgb, var(--wzl-surface) ${h.dim}%, transparent)`;\n const dimOverlay = `linear-gradient(${dimColor}, ${dimColor})`;\n\n if (lowPct > 0) {\n layers.push(`${dimOverlay} left 0 / ${lowPct.toFixed(2)}% 100% no-repeat`);\n layers.push(`${stripe} left 0 / ${lowPct.toFixed(2)}% 100% no-repeat`);\n }\n if (highPct < 100) {\n const wR = (100 - highPct).toFixed(2);\n layers.push(`${dimOverlay} right 0 / ${wR}% 100% no-repeat`);\n layers.push(`${stripe} right 0 / ${wR}% 100% no-repeat`);\n }\n }\n layers.push(baseGradient);\n\n const style: CSSProperties = {\n position: 'absolute',\n inset: 0,\n background: layers.join(', '),\n };\n return <div style={style} />;\n };\n}\n",".root {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-4);\n min-inline-size: 0;\n}\n\n.swatches {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wzl-space-3);\n}\n\n/* Each stop's opacity slider would otherwise stretch the row to a width no\n * properties panel has; the chip stays legible, the slider yields. */\n.swatch {\n flex: 0 1 auto;\n min-inline-size: 0;\n}\n","import { useCallback, type ReactElement } from 'react';\nimport {\n sampleGradientStops,\n withGradientKind,\n type ColorSpace,\n type GradStop,\n type GradientFill,\n type GradientKind,\n} from '@weasel-js/core';\nimport { Slider, type Thumb } from '../Slider';\nimport { ColorField } from '../ColorField';\nimport { ToggleBar, type ToggleBarItem } from '../ToggleBar';\nimport { paintGradientTrack } from '../../paintGradientTrack';\nimport s from './GradientEditor.module.css';\n\nconst KINDS: readonly ToggleBarItem<GradientKind>[] = [\n { value: 'linear-gradient', label: 'Linear' },\n { value: 'radial-gradient', label: 'Radial' },\n { value: 'conic-gradient', label: 'Conic' },\n];\n\nconst SPACES: readonly ToggleBarItem<ColorSpace>[] = [\n { value: 'rgb', label: 'sRGB' },\n { value: 'oklab', label: 'OKLab' },\n { value: 'oklch', label: 'OKLCh' },\n];\n\n/** Fewer than two stops is not a gradient any renderer can ramp between. */\nconst MIN_STOPS = 2;\n\n/**\n * Props for {@link GradientEditor}. `onInput` fires throughout a gesture and\n * `onChange` once at its end.\n */\nexport interface GradientEditorProps {\n /** The gradient being edited. */\n value: GradientFill;\n /**\n * Live value during a gesture — a stop drag, a color-picker scrub. Wire\n * it for preview; it fires many times per gesture and must not be\n * written to history.\n */\n onInput?: (next: GradientFill) => void;\n /** Committed value: one call per completed gesture. Pair with an\n * undoable write. */\n onChange: (next: GradientFill) => void;\n /** Show the linear / radial / conic switch. Default true; turn it off\n * when the surrounding UI already owns the kind. */\n kindSwitch?: boolean;\n /** Show the sRGB / OKLab / OKLCh switch, which writes `interpolate`.\n * Default true. */\n spaceSwitch?: boolean;\n className?: string;\n}\n\ntype StopThumb = Thumb & { color: string };\n\n/**\n * Editor for a gradient's kind and stop list.\n *\n * Geometry (`from`/`to`, `center`, `radius`, `angle`) is deliberately not\n * edited here — on a canvas that belongs on the artwork, via\n * `<GradientHandles>`. This component owns the parts with no spatial\n * meaning, so it composes into a properties panel at any width.\n *\n * Stops are addressed by their position in `value.stops`, which is never\n * reordered — dragging one stop past another leaves both indices alone, so\n * a drag can cross a neighbour without the two swapping under the pointer.\n * Rendering sorts a copy.\n */\nexport function GradientEditor(props: GradientEditorProps): ReactElement {\n const { value, onInput, onChange, kindSwitch = true, spaceSwitch = true, className } = props;\n const stops = value.stops;\n const space = value.interpolate ?? 'rgb';\n\n const withStops = useCallback(\n (next: GradStop[]): GradientFill => ({ ...value, stops: next }),\n [value],\n );\n\n const thumbs: StopThumb[] = stops.map((stop) => ({ value: stop.offset, color: stop.color }));\n\n const applyThumbs = (next: StopThumb[]): GradStop[] =>\n next.map((t) => ({ offset: t.value, color: t.color }));\n\n const setStopColor = (index: number, color: string): GradStop[] =>\n stops.map((stop, i) => (i === index ? { ...stop, color } : stop));\n\n // Sorted view for the swatch row, carrying each stop's real index so a\n // recolor writes back to the right entry.\n const ordered = stops\n .map((stop, index) => ({ stop, index }))\n .sort((a, b) => a.stop.offset - b.stop.offset);\n\n return (\n <div className={[s.root, className].filter(Boolean).join(' ')}>\n {kindSwitch && (\n <ToggleBar<GradientKind>\n items={KINDS}\n value={value.fill}\n size=\"sm\"\n ariaLabel=\"Gradient kind\"\n onChange={(kind) => kind && onChange(withGradientKind(value, kind))}\n />\n )}\n\n <Slider<StopThumb>\n min={0}\n max={1}\n step={0.005}\n constraint=\"free\"\n thumbs={thumbs}\n ariaLabel=\"Gradient stops\"\n readoutPlacement=\"none\"\n onInput={(next) => onInput?.(withStops(applyThumbs(next)))}\n onChange={(next) => onChange(withStops(applyThumbs(next)))}\n onAddThumb={(at) => ({ value: at, color: sampleGradientStops(stops, at, space) })}\n onRemoveThumb={() => stops.length > MIN_STOPS}\n renderTrack={paintGradientTrack({\n gradient: (t) => sampleGradientStops(stops, t, space),\n // The track lerps between samples in sRGB whatever the gradient does,\n // so a hue arc needs more of them to not read as a straight line.\n samples: space === 'rgb' ? 32 : 64,\n })}\n />\n\n {spaceSwitch && (\n <ToggleBar<ColorSpace>\n items={SPACES}\n value={space}\n size=\"sm\"\n ariaLabel=\"Blend space\"\n onChange={(next) => next && onChange({ ...value, interpolate: next })}\n />\n )}\n\n <div className={s.swatches}>\n {ordered.map(({ stop, index }) => (\n <ColorField\n key={index}\n value={stop.color}\n alpha\n aria-label={`Stop ${index + 1} at ${Math.round(stop.offset * 100)}%`}\n className={s.swatch}\n onInput={(hex) => onInput?.(withStops(setStopColor(index, hex)))}\n onChange={(hex) => onChange(withStops(setStopColor(index, hex)))}\n />\n ))}\n </div>\n </div>\n );\n}\n","/* The overlay covers the canvas but must not intercept tool input; only the\n * handles opt back into hit-testing. */\n.overlay {\n position: absolute;\n inset: 0;\n pointer-events: none;\n}\n\n/* These sit over artwork of unknown color, not over the app's own surface,\n * so they are deliberately not themed: a themed handle disappears against\n * whatever the user painted underneath. White-on-dark reads on anything,\n * which is why every editor draws handles this way. */\n.guide {\n fill: none;\n stroke: #ffffff;\n stroke-opacity: 0.7;\n stroke-dasharray: 4 4;\n paint-order: stroke;\n}\n\n.handle {\n fill: #ffffff;\n stroke: #222222;\n stroke-width: 2;\n cursor: grab;\n pointer-events: auto;\n}\n\n.handle:active {\n cursor: grabbing;\n}\n\n.handle:focus-visible {\n outline: 2px solid var(--wzl-accent, #4a9eff);\n outline-offset: 2px;\n}\n","import { useRef, type KeyboardEvent as ReactKeyboardEvent, type ReactElement, type ReactNode } from 'react';\nimport { useHandleDrag, gradientGeometry, type GradientFill } from '@weasel-js/core';\nimport s from './GradientHandles.module.css';\n\n/** Structural, and deliberately not exported — `Plot2D` and `CurveEditor`\n * each publish their own `Point`, and a third would only be ambiguous at\n * the package barrel. Consumers pass any `{ x, y }`. */\ninterface Point {\n x: number;\n y: number;\n}\n\n/**\n * Props for {@link GradientHandles}. `onInput` fires throughout a drag and\n * `onChange` once at its end.\n */\nexport interface GradientHandlesProps {\n /**\n * The gradient whose geometry these handles move, in a **resolved,\n * isotropic** frame — one where `radius` is a length in the same units as\n * `center.x` and a right angle is a right angle.\n *\n * A `units: 'bounds'` gradient is not such a frame: `x` and `y` are\n * fractions of two different lengths, so a circle there is an ellipse on\n * screen and polar math silently mixes scales. Resolve it first with\n * `fillInPoseFrame(fill, box)` and convert edits back with\n * `fillToBoundsFrame(next, box)`.\n */\n value: GradientFill;\n /**\n * Gradient space → overlay pixels. For a `units: 'local'` gradient this\n * is the node's local-to-screen transform; for `'world'`, the view.\n */\n toScreen: (p: Point) => Point;\n /** Overlay pixels → gradient space. Must invert `toScreen`. */\n toLocal: (p: Point) => Point;\n /** Live during a drag — wire for preview, do not write to history. */\n onInput?: (next: GradientFill) => void;\n /** Committed at drag end: one call per gesture. */\n onChange: (next: GradientFill) => void;\n /** Overlay size in CSS pixels. */\n width: number;\n height: number;\n className?: string;\n}\n\n/**\n * Direct-manipulation handles for a gradient's geometry, drawn as an SVG\n * overlay above a canvas: endpoints for linear, center and radius for\n * radial, center and angle arm for conic.\n *\n * Positioning is entirely the consumer's `toScreen` / `toLocal` — this\n * component never sees a view or a scene node, so the same handles serve a\n * node-local gradient, a world-space one, and a plain unzoomed preview.\n *\n * The overlay ignores pointer events except on the handles themselves, so\n * it can sit over live canvas content without swallowing tool input.\n */\nexport function GradientHandles(props: GradientHandlesProps): ReactElement {\n const { value, toScreen, toLocal, onInput, onChange, width, height, className } = props;\n\n return (\n <svg\n className={[s.overlay, className].filter(Boolean).join(' ')}\n width={width}\n height={height}\n >\n {renderForKind(value, toScreen, toLocal, onInput, onChange)}\n </svg>\n );\n}\n\nfunction renderForKind(\n value: GradientFill,\n toScreen: (p: Point) => Point,\n toLocal: (p: Point) => Point,\n onInput: ((next: GradientFill) => void) | undefined,\n onChange: (next: GradientFill) => void,\n): ReactNode {\n const emit = (next: GradientFill, phase: 'input' | 'commit'): void => {\n if (phase === 'input') onInput?.(next);\n else onChange(next);\n };\n\n if (value.fill === 'linear-gradient') {\n const from = toScreen(value.from);\n const to = toScreen(value.to);\n return (\n <>\n <Guide x1={from.x} y1={from.y} x2={to.x} y2={to.y} />\n <DragPoint\n at={from}\n label=\"Gradient start\"\n onDrag={(p, phase) => emit({ ...value, from: toLocal(p) }, phase)}\n />\n <DragPoint\n at={to}\n label=\"Gradient end\"\n onDrag={(p, phase) => emit({ ...value, to: toLocal(p) }, phase)}\n />\n </>\n );\n }\n\n if (value.fill === 'radial-gradient') {\n const center = toScreen(value.center);\n // The radius handle rides the +x axis of gradient space, so it stays on\n // the drawn circle under a rotated or anisotropic transform.\n const edge = toScreen({ x: value.center.x + value.radius, y: value.center.y });\n const screenRadius = Math.hypot(edge.x - center.x, edge.y - center.y);\n return (\n <>\n <circle className={s.guide} cx={center.x} cy={center.y} r={screenRadius} />\n <DragPoint\n at={center}\n label=\"Gradient center\"\n onDrag={(p, phase) => emit({ ...value, center: toLocal(p) }, phase)}\n />\n <DragPoint\n at={edge}\n label=\"Gradient radius\"\n onDrag={(p, phase) => {\n const local = toLocal(p);\n const radius = Math.hypot(local.x - value.center.x, local.y - value.center.y);\n emit({ ...value, radius: Math.max(MIN_RADIUS, radius) }, phase);\n }}\n />\n </>\n );\n }\n\n const center = toScreen(value.center);\n const { radius } = gradientGeometry(value);\n const tip = toScreen({\n x: value.center.x + Math.cos(value.angle) * radius,\n y: value.center.y + Math.sin(value.angle) * radius,\n });\n return (\n <>\n <Guide x1={center.x} y1={center.y} x2={tip.x} y2={tip.y} />\n <DragPoint\n at={center}\n label=\"Gradient center\"\n onDrag={(p, phase) => emit({ ...value, center: toLocal(p) }, phase)}\n />\n <DragPoint\n at={tip}\n label=\"Gradient angle\"\n onDrag={(p, phase) => {\n const local = toLocal(p);\n const angle = Math.atan2(local.y - value.center.y, local.x - value.center.x);\n emit({ ...value, angle }, phase);\n }}\n />\n </>\n );\n}\n\n/** A radius of zero divides by zero in the shader's `t`; keep it off the floor. */\nconst MIN_RADIUS = 1;\n\nfunction Guide(props: { x1: number; y1: number; x2: number; y2: number }): ReactElement {\n return <line className={s.guide} {...props} />;\n}\n\nfunction DragPoint({\n at,\n label,\n onDrag,\n}: {\n at: Point;\n label: string;\n onDrag: (p: Point, phase: 'input' | 'commit') => void;\n}): ReactElement {\n const start = useRef<Point>(at);\n const drag = useHandleDrag<SVGCircleElement>({\n onStart: () => { start.current = at; },\n onMove: (p) => { onDrag(p, 'input'); },\n onEnd: ({ point, moved }) => {\n // A press that never moved is not an edit and must not write anything.\n if (moved) onDrag(point, 'commit');\n },\n // An abandoned gesture is not an edit either — put the live preview back\n // where it started rather than committing where it was left.\n onCancel: () => { onDrag(start.current, 'input'); },\n });\n const onKeyDown = (e: ReactKeyboardEvent<SVGCircleElement>): void => {\n const amount = e.shiftKey ? KEY_STEP * 10 : KEY_STEP;\n let dx = 0;\n let dy = 0;\n if (e.key === 'ArrowLeft') dx = -amount;\n else if (e.key === 'ArrowRight') dx = amount;\n else if (e.key === 'ArrowUp') dy = -amount;\n else if (e.key === 'ArrowDown') dy = amount;\n else return;\n e.preventDefault();\n const next = { x: at.x + dx, y: at.y + dy };\n onDrag(next, 'input');\n onDrag(next, 'commit');\n };\n return (\n <circle\n className={s.handle}\n cx={at.x}\n cy={at.y}\n r={HANDLE_RADIUS}\n // Not `slider`: the handle carries a 2-D position, not one value, so\n // it has no `aria-valuenow` to honor the role's contract with.\n role=\"button\"\n aria-label={label}\n tabIndex={0}\n onKeyDown={onKeyDown}\n {...drag}\n />\n );\n}\n\nconst HANDLE_RADIUS = 7;\n\n/** One arrow-key step, in overlay pixels. */\nconst KEY_STEP = 1;\n","import { type ReactElement, type RefObject } from 'react';\nimport {\n fillInPoseFrame,\n fillToBoundsFrame,\n isGradientFill,\n useNodeOverlayFrame,\n useOngoingAction,\n type FillStyle,\n type GradientFill,\n type RectPose,\n type Scene,\n type Stroke,\n type View,\n} from '@weasel-js/core';\nimport { GradientHandles } from './GradientHandles';\n\n/** The paint slots a node carries. Either may hold a gradient, and each has\n * its own action, so the overlay is told which one it is editing. */\nexport type PaintSlot = 'fill' | 'stroke';\n\n/** What `SceneGradientHandles` reads off a node. Every field is optional, so\n * any richer app data shape satisfies it. */\nexport interface PaintedNodeData {\n fill?: FillStyle | null;\n stroke?: Stroke | null;\n}\n\nexport interface SceneGradientHandlesProps<\n TData extends PaintedNodeData,\n TLayer extends string,\n TPose extends RectPose,\n> {\n scene: Scene<TData, TLayer, TPose>;\n /** The element the overlay is positioned in. Must be the canvas's own box,\n * or the handles land somewhere other than the paint. */\n containerRef: RefObject<HTMLElement | null>;\n /** The node whose paint is being edited — usually the lone selected id. */\n nodeId: string | null | undefined;\n /** Which of the node's two paints these handles move. */\n slot: PaintSlot;\n /** Current viewport; a thunk is re-read per projection. See\n * `useNodeOverlayFrame`. */\n view?: View | (() => View);\n className?: string;\n}\n\n/**\n * Scene-aware `GradientHandles`: on-canvas geometry handles for the gradient\n * in one node's `fill` or `stroke`, committed through the `setFill` /\n * `setStroke` actions as a single undo entry per drag.\n *\n * Renders nothing unless the targeted slot holds a gradient. The node stores\n * its gradient in `units: 'bounds'` — fractions of its own box, so the paint\n * survives pan, zoom and resize — which is not a frame polar math can work\n * in; the handles get it resolved onto the box and every edit is normalized\n * back on the way out.\n *\n * `slot` is a prop rather than state the kit keeps: an app that edits fill\n * and stroke separately already knows which one has focus.\n */\nexport function SceneGradientHandles<\n TData extends PaintedNodeData,\n TLayer extends string,\n TPose extends RectPose,\n>(props: SceneGradientHandlesProps<TData, TLayer, TPose>): ReactElement | null {\n const { scene, containerRef, nodeId, slot, view, className } = props;\n const frame = useNodeOverlayFrame(scene, containerRef, nodeId, { view });\n const edit = useOngoingAction(slot === 'fill' ? 'setFill' : 'setStroke');\n\n const gradient = frame ? gradientInSlot(paintOf(scene, nodeId, slot)) : null;\n if (!frame || !gradient) return null;\n\n const dispatch = (next: GradientFill, phase: 'input' | 'commit'): void => {\n const paint = fillToBoundsFrame(next, frame.box);\n if (phase === 'commit') edit.commit({ paint });\n else edit.input({ paint });\n };\n\n return (\n <GradientHandles\n value={fillInPoseFrame(gradient, frame.box) as GradientFill}\n toScreen={frame.toScreen}\n toLocal={frame.toLocal}\n width={frame.width}\n height={frame.height}\n className={className}\n onInput={(next) => dispatch(next, 'input')}\n onChange={(next) => dispatch(next, 'commit')}\n />\n );\n}\n\nfunction paintOf<TData extends PaintedNodeData, TLayer extends string, TPose extends RectPose>(\n scene: Scene<TData, TLayer, TPose>,\n nodeId: string | null | undefined,\n slot: PaintSlot,\n): FillStyle | null | undefined {\n if (nodeId == null) return undefined;\n const data = (scene.nodes as ReadonlyMap<string, { data: TData }>).get(nodeId)?.data;\n if (!data) return undefined;\n return slot === 'fill' ? data.fill : data.stroke?.paint;\n}\n\nfunction gradientInSlot(paint: FillStyle | null | undefined): GradientFill | null {\n return isGradientFill(paint) ? paint : null;\n}\n"],"mappings":"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"}