@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
@@ -0,0 +1,229 @@
1
+ import { r as e } from "./portalHost-yTOVuCej.js";
2
+ import { n as t, r as n } from "./segmentTooltip-CStYHKzd.js";
3
+ import { n as r } from "./Field--onYxXTF.js";
4
+ import { pastDragThreshold as i } from "@weasel-js/core";
5
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
6
+ import { Children as s, isValidElement as c, useEffect as l, useLayoutEffect as u, useRef as d, useState as f } from "react";
7
+ import { Button as p, FieldError as m, Header as h, Label as g, ListBox as _, ListBoxItem as v, ListBoxSection as y, Popover as b, Select as x, SelectValue as S, Text as C } from "react-aria-components";
8
+ var w = {
9
+ field: "_field_1dx3a_1",
10
+ row: "_row_1dx3a_11",
11
+ label: "_label_1dx3a_18",
12
+ fit: "_fit_1dx3a_19",
13
+ trigger: "_trigger_1dx3a_19",
14
+ below: "_below_1dx3a_21",
15
+ value: "_value_1dx3a_63",
16
+ bare: "_bare_1dx3a_95",
17
+ chevron: "_chevron_1dx3a_112",
18
+ underlined: "_underlined_1dx3a_124",
19
+ plain: "_plain_1dx3a_135",
20
+ popover: "_popover_1dx3a_148",
21
+ listbox: "_listbox_1dx3a_157",
22
+ option: "_option_1dx3a_170",
23
+ section: "_section_1dx3a_181",
24
+ sectionHeader: "_sectionHeader_1dx3a_188",
25
+ optionLabel: "_optionLabel_1dx3a_195",
26
+ check: "_check_1dx3a_222",
27
+ sizer: "_sizer_1dx3a_255"
28
+ };
29
+ //#endregion
30
+ //#region src/components/Select/Select.tsx
31
+ function T(e) {
32
+ return "options" in e;
33
+ }
34
+ function E(i) {
35
+ let { label: s, orientation: c = "stacked", description: l, errorMessage: u, placeholder: h, options: v, children: y, selectedKey: E, defaultSelectedKey: D, onSelectionChange: k, width: A = "fill", variant: M = "field", indicator: I = M === "bare" ? "underline" : "chevron", popup: L = "over", triggerId: R, className: z, portalContainer: B, shortcut: V, tooltip: H, ...U } = i, { anchor: W, portalProps: G } = e(B), K = d(null), q = d(null), [J, Y] = f(O);
36
+ return /* @__PURE__ */ o(x, {
37
+ ...U,
38
+ selectedKey: E,
39
+ defaultSelectedKey: D,
40
+ onSelectionChange: k ? (e) => k(e) : void 0,
41
+ className: [
42
+ w.field,
43
+ A === "fit" && w.fit,
44
+ M === "bare" && w.bare,
45
+ I === "underline" && w.underlined,
46
+ I === "none" && w.plain,
47
+ r.root,
48
+ c === "row" && r.row,
49
+ c === "row" && w.row,
50
+ z
51
+ ].filter(Boolean).join(" "),
52
+ children: [
53
+ W,
54
+ s !== void 0 && /* @__PURE__ */ a(g, {
55
+ className: `${r.label} ${w.label}`,
56
+ children: s
57
+ }),
58
+ /* @__PURE__ */ a(t, {
59
+ content: n({
60
+ tooltip: H,
61
+ shortcut: V,
62
+ ariaLabel: U["aria-label"],
63
+ label: s
64
+ }),
65
+ disabled: U.isDisabled,
66
+ children: /* @__PURE__ */ o(p, {
67
+ id: R,
68
+ ref: K,
69
+ className: w.trigger,
70
+ onPointerDown: (e) => {
71
+ q.current = {
72
+ x: e.clientX,
73
+ y: e.clientY,
74
+ at: performance.now()
75
+ };
76
+ },
77
+ children: [
78
+ /* @__PURE__ */ a(S, {
79
+ className: w.value,
80
+ children: ({ defaultChildren: e, isPlaceholder: t }) => t ? h ?? e : e
81
+ }),
82
+ A === "fit" && /* @__PURE__ */ o("span", {
83
+ className: w.sizer,
84
+ "aria-hidden": "true",
85
+ children: [h !== void 0 && /* @__PURE__ */ a("span", { children: h }), P(v, y).map((e, t) => /* @__PURE__ */ a("span", { children: e }, t))]
86
+ }),
87
+ I === "chevron" && /* @__PURE__ */ a("svg", {
88
+ className: w.chevron,
89
+ viewBox: "0 0 10 10",
90
+ "aria-hidden": "true",
91
+ children: /* @__PURE__ */ a("path", {
92
+ d: "M2 4 L5 7 L8 4",
93
+ fill: "none",
94
+ stroke: "currentColor",
95
+ strokeWidth: "1.5",
96
+ strokeLinecap: "round",
97
+ strokeLinejoin: "round"
98
+ })
99
+ })
100
+ ]
101
+ })
102
+ }),
103
+ l !== void 0 && /* @__PURE__ */ a(C, {
104
+ slot: "description",
105
+ className: `${r.hint} ${w.below}`,
106
+ children: l
107
+ }),
108
+ /* @__PURE__ */ a(m, {
109
+ className: `${r.error} ${w.below}`,
110
+ children: u
111
+ }),
112
+ /* @__PURE__ */ o(b, {
113
+ className: w.popover,
114
+ "data-weasel-overlay": "",
115
+ placement: "bottom start",
116
+ offset: L === "over" ? J.offset : void 0,
117
+ crossOffset: L === "over" ? J.crossOffset : void 0,
118
+ shouldFlip: L !== "over",
119
+ ...G,
120
+ children: [L === "over" && /* @__PURE__ */ a(j, {
121
+ triggerRef: K,
122
+ pressRef: q,
123
+ applied: J,
124
+ onMeasure: Y
125
+ }), /* @__PURE__ */ a(_, {
126
+ className: w.listbox,
127
+ children: v === void 0 ? y : v.map((e, t) => T(e) ? /* @__PURE__ */ a(F, {
128
+ title: e.title,
129
+ children: e.options.map(N)
130
+ }, `section-${t}`) : N(e))
131
+ })]
132
+ })
133
+ ]
134
+ });
135
+ }
136
+ var D = 500, O = {
137
+ offset: 0,
138
+ crossOffset: 0
139
+ }, k = 12, A = {
140
+ offset: 8,
141
+ crossOffset: 0
142
+ };
143
+ function j({ triggerRef: e, pressRef: t, applied: n, onMeasure: r }) {
144
+ let o = d(null), s = d(0);
145
+ return u(() => {
146
+ let t = e.current, i = o.current?.closest("[data-weasel-overlay]");
147
+ if (!t || !i || s.current > 3) return;
148
+ let a = t.querySelector(`.${w.value}`), c = i.querySelector(`[data-selected] .${w.optionLabel}`);
149
+ if (!a || !c) {
150
+ (n.offset !== A.offset || n.crossOffset !== A.crossOffset) && r(A);
151
+ return;
152
+ }
153
+ let l = getComputedStyle(t).getPropertyValue("--wzl-select-align").trim(), u = l === "right" || l === "end";
154
+ i.dataset.align = u ? "end" : "start";
155
+ let d = i.getBoundingClientRect(), f = t.getBoundingClientRect(), p = c.getBoundingClientRect(), m = a.getBoundingClientRect(), h = m.top + m.height / 2 - f.top - (p.top + p.height / 2 - d.top) - f.height, g = t.ownerDocument.documentElement.clientHeight - k - d.height - f.bottom, _ = {
156
+ offset: Math.max(k - f.bottom, Math.min(h, g)),
157
+ crossOffset: u ? m.right - f.left - (p.right - d.left) : m.left - f.left - (p.left - d.left)
158
+ };
159
+ Math.abs(_.offset - n.offset) < .5 && Math.abs(_.crossOffset - n.crossOffset) < .5 || (s.current += 1, r(_));
160
+ }), l(() => {
161
+ let n = e.current?.ownerDocument;
162
+ if (!n) return;
163
+ let r = (e) => {
164
+ n.removeEventListener("pointerup", r, !0);
165
+ let a = t.current;
166
+ !a || performance.now() - a.at > D || i({
167
+ clientX: a.x,
168
+ clientY: a.y
169
+ }, e) || (e.preventDefault(), e.stopPropagation());
170
+ };
171
+ return n.addEventListener("pointerup", r, !0), () => n.removeEventListener("pointerup", r, !0);
172
+ }, [e, t]), /* @__PURE__ */ a("span", {
173
+ ref: o,
174
+ hidden: !0
175
+ });
176
+ }
177
+ function M() {
178
+ return /* @__PURE__ */ a("svg", {
179
+ className: w.check,
180
+ viewBox: "0 0 10 10",
181
+ "aria-hidden": "true",
182
+ children: /* @__PURE__ */ a("polyline", {
183
+ points: "1.5,5 4,7.5 8.5,3",
184
+ fill: "none",
185
+ stroke: "currentColor",
186
+ strokeWidth: "1.6",
187
+ strokeLinecap: "round",
188
+ strokeLinejoin: "round"
189
+ })
190
+ });
191
+ }
192
+ function N(e) {
193
+ return /* @__PURE__ */ a(L, {
194
+ id: e.value,
195
+ isDisabled: e.isDisabled,
196
+ textValue: e.textValue,
197
+ children: e.label
198
+ }, String(e.value));
199
+ }
200
+ function P(e, t) {
201
+ return e === void 0 ? s.toArray(t).flatMap((e) => c(e) ? e.type === F ? P(void 0, e.props.children) : [e.props.children] : [e]) : e.flatMap((e) => "options" in e ? e.options.map((e) => e.label) : [e.label]);
202
+ }
203
+ function F({ title: e, children: t, className: n }) {
204
+ return /* @__PURE__ */ o(y, {
205
+ className: [w.section, n].filter(Boolean).join(" "),
206
+ children: [e !== void 0 && /* @__PURE__ */ a(h, {
207
+ className: w.sectionHeader,
208
+ children: e
209
+ }), t]
210
+ });
211
+ }
212
+ function I(e, t) {
213
+ return t === void 0 ? typeof e == "string" || typeof e == "number" ? String(e) : void 0 : t;
214
+ }
215
+ function L({ children: e, className: t, textValue: n, ...r }) {
216
+ return /* @__PURE__ */ o(v, {
217
+ ...r,
218
+ textValue: I(e, n),
219
+ className: [w.option, t].filter(Boolean).join(" "),
220
+ children: [/* @__PURE__ */ a(M, {}), /* @__PURE__ */ a("span", {
221
+ className: w.optionLabel,
222
+ children: e
223
+ })]
224
+ });
225
+ }
226
+ //#endregion
227
+ export { L as n, F as r, E as t };
228
+
229
+ //# sourceMappingURL=Select-ClmKtyWg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Select-ClmKtyWg.js","names":["Select","RACSelect","s","RACButton","RACPopover","RACListBox","RACListBoxSection","RACListBoxItem","useOverlayPortal","TriggerTooltip","segmentTooltipContent","fieldClasses","Select_module_default","isGroup","entry","Select$1","variant","rest","props","portalContainer","triggerRef","useRef","pressRef","nudge","setNudge","useState","NO_NUDGE","Select","onSelectionChange","k","width","indicator","orientation","className","anchor","label","Label","Button","triggerId","SelectValue","isPlaceholder","placeholder","defaultChildren","optionLabels","options","children","l","i","description","Text","FieldError","errorMessage","Popover","popup","portalProps","AlignOverTrigger","ListBox","SelectSection","renderOption","CLICK_MS","EDGE","BELOW","markerRef","passes","useLayoutEffect","trigger","popover","value","applied","onMeasure","align","toEnd","box","seat","row","shown","over","lowest","next","useEffect","doc","onUp","press","pastDragThreshold","CheckMark","SelectItem","o","Children","isValidElement","c","g","ListBoxSection","title","Header","textValueOf","explicit","ListBoxItem","textValue"],"sources":["../../src/components/Select/Select.module.css","../../src/components/Select/Select.tsx"],"sourcesContent":[".field {\n display: flex;\n flex-direction: column;\n width: 100%;\n min-width: 0;\n gap: var(--wzl-space-2);\n}\n\n/* `orientation='row'`: the label keeps its own width and the trigger takes the\n rest; description and error wrap onto a line of their own. */\n.field.row {\n flex-direction: row;\n align-items: center;\n flex-wrap: wrap;\n column-gap: var(--wzl-space-4);\n row-gap: var(--wzl-space-2);\n}\n.field.row .label { flex: 0 0 auto; }\n.field.row:not(.fit) .trigger { flex: 1 1 0; min-width: 0; }\n.field.row.fit .trigger { width: auto; }\n.field.row .below { flex-basis: 100%; }\n\n.trigger {\n display: flex;\n width: 100%;\n align-items: center;\n gap: var(--wzl-space-3);\n /* Hooks, each defaulting to what the trigger already drew: the visible box is\n this button, not the `.field` a consumer's `className` lands on, so a\n surface that has to restyle it sets these rather than reaching in here.\n Together they draw the bare look too, for a surface that wants it from\n context rather than from `variant`: a transparent fill, no padding, the\n chevron hidden, the value underlined and an outline for focus. */\n padding: var(--wzl-select-pad, 0 var(--wzl-space-3) 0 var(--wzl-space-5));\n background: var(--wzl-select-bg, var(--wzl-input-surface, var(--wzl-surface-sunken)));\n height: var(--wzl-select-h, var(--wzl-control-h));\n border: var(--wzl-select-border, 1px solid var(--wzl-border));\n border-radius: var(--wzl-radius-sm);\n color: var(--wzl-select-fg, var(--wzl-fg));\n font-family: var(--wzl-font-ui);\n font-size: var(--wzl-font-size);\n line-height: 1;\n cursor: pointer;\n transition: border-color var(--wzl-motion-fast), box-shadow var(--wzl-motion-fast);\n}\n\n.trigger[data-focus-visible] {\n border-color: var(--wzl-select-focus-border, var(--wzl-focus-ring));\n box-shadow: var(--wzl-select-focus-shadow, 0 0 0 1px var(--wzl-focus-ring));\n outline: var(--wzl-select-focus-outline, none);\n outline-offset: 2px;\n}\n\n.field[data-invalid] .trigger {\n border-color: var(--wzl-danger);\n}\n\n.trigger[data-disabled] {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.value {\n flex: 1;\n min-width: 0;\n text-align: var(--wzl-select-align, left);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n /* The ellipsis needs `overflow: hidden`, which makes the line box a clip —\n the trigger's `line-height: 1` would cut this text's ascenders and\n descenders off. `normal` is the font's own leading, so it never can. */\n line-height: normal;\n /* The underline hook: none unless a surface or `indicator` turns it on. */\n text-decoration-line: var(--wzl-select-underline, none);\n text-decoration-style: dotted;\n text-decoration-thickness: 1px;\n text-decoration-color: var(--wzl-fg-subtle);\n text-underline-offset: 0.25em;\n transition: text-decoration-color var(--wzl-motion-fast);\n}\n\n.trigger:hover .value,\n.trigger[data-focus-visible] .value {\n text-decoration-style: solid;\n text-decoration-color: var(--wzl-fg-muted);\n}\n\n.field[data-open] .value {\n text-decoration-style: solid;\n text-decoration-color: var(--wzl-accent);\n}\n\n/* `variant='bare'`: no box. The focus ring moves to an outline, since there is no border to recolor. */\n.bare .trigger {\n padding: 0;\n background: transparent;\n border: var(--wzl-select-border, 1px solid transparent);\n}\n\n.bare .trigger[data-focus-visible] {\n border-color: transparent;\n box-shadow: none;\n outline: 1px solid var(--wzl-focus-ring);\n outline-offset: 2px;\n}\n\n.value[data-placeholder] {\n color: var(--wzl-fg-subtle);\n}\n\n.chevron {\n display: var(--wzl-select-chevron, block);\n width: 10px;\n height: 10px;\n color: var(--wzl-fg-muted);\n flex: 0 0 auto;\n}\n\n/* `indicator='underline'`: the value carries the affordance itself. A text\n decoration rather than a border, so it hugs the word and adds nothing to the\n box — the row's height and the value's width are the same either way. The\n rest of the underline's look sits on `.value`, shared with the hook. */\n.underlined .value {\n text-decoration-line: underline;\n}\n\n.value[data-placeholder] {\n text-decoration-color: var(--wzl-fg-subtle);\n}\n\n/* Nothing sits beside the value, so the row's gap and the padding kept for a\n caret are the value's to spend. */\n.underlined .trigger,\n.plain .trigger {\n gap: 0;\n}\n\n.bare.underlined .trigger,\n.bare.plain .trigger {\n padding: 0;\n}\n\n/* A list that hangs below its trigger takes the trigger's width, so the two\n read as one control. One that opens over it is already tied to the trigger\n by its selected row — widening it to match would only add blank rule beside\n the labels. `data-align` is set on exactly the ones that do. */\n.popover:not([data-align]) {\n min-width: var(--trigger-width);\n}\n\n.popover {\n max-height: inherit;\n outline: none;\n}\n\n.listbox {\n background: var(--wzl-surface-raised);\n border: 1px solid var(--wzl-border);\n border-radius: var(--wzl-radius-md);\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);\n padding: var(--wzl-space-2);\n max-height: 280px;\n overflow: auto;\n outline: none;\n font-family: var(--wzl-font-ui);\n font-size: var(--wzl-font-size);\n}\n\n.option {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-4);\n padding: var(--wzl-space-2) var(--wzl-space-4);\n border-radius: var(--wzl-radius-sm);\n cursor: pointer;\n color: var(--wzl-fg);\n outline: none;\n}\n\n:is(.option, .section) + .section,\n.section + .option {\n margin-top: var(--wzl-space-2);\n padding-top: var(--wzl-space-2);\n border-top: 1px solid var(--wzl-line-subtle);\n}\n\n.sectionHeader {\n padding: var(--wzl-space-2) var(--wzl-space-4);\n font-size: var(--wzl-font-size-sm);\n font-weight: var(--wzl-font-weight-medium);\n color: var(--wzl-fg-subtle);\n}\n\n.optionLabel {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* A trigger that sets its value against its end edge gets a list that does the\n same, so the row that opened over the value stays on top of it. */\n.popover[data-align='end'] .option {\n justify-content: flex-end;\n}\n\n.option[data-focused] {\n background: var(--wzl-surface-hover);\n}\n\n.option[data-selected] {\n color: var(--wzl-fg);\n font-weight: var(--wzl-font-weight-medium);\n}\n\n.option[data-disabled] {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.check {\n width: 10px;\n height: 10px;\n flex: 0 0 auto;\n opacity: 0;\n}\n\n.option[data-selected] .check {\n opacity: 1;\n}\n\n.value .check {\n display: none;\n}\n\n/* `width='fit'`: a hidden stack of every option label shares the value's grid\n cell, so the trigger sizes to its widest option and never resizes on select. */\n.fit {\n width: auto;\n max-width: 100%;\n}\n\n.fit .trigger {\n display: grid;\n grid-template-columns: auto auto;\n}\n\n.fit.underlined .trigger,\n.fit.plain .trigger {\n grid-template-columns: auto;\n}\n\n.fit .value,\n.fit .sizer {\n grid-area: 1 / 1;\n}\n\n.fit .chevron {\n grid-area: 1 / 2;\n}\n\n.sizer {\n display: grid;\n height: 0;\n overflow: hidden;\n visibility: hidden;\n white-space: nowrap;\n}\n\n.sizer > * {\n grid-area: 1 / 1;\n}\n","import {\n Children,\n isValidElement,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport {\n Select as RACSelect,\n Label,\n Button as RACButton,\n SelectValue,\n Popover as RACPopover,\n ListBox as RACListBox,\n ListBoxItem as RACListBoxItem,\n ListBoxSection as RACListBoxSection,\n Header,\n Text,\n FieldError,\n type SelectProps as RACSelectProps,\n type ListBoxItemProps as RACListBoxItemProps,\n type ValidationResult,\n} from 'react-aria-components';\nimport { pastDragThreshold } from '@weasel-js/core';\nimport { fieldClasses, type FieldOrientation } from '../Field/Field';\nimport { useOverlayPortal, type OverlayPortalProps } from '../../overlays/portalHost';\nimport s from './Select.module.css';\nimport { TriggerTooltip, segmentTooltipContent, type SegmentTooltipFields } from '../segmentTooltip';\n\n/** One option in a {@link Select}'s `options` list. */\nexport type SelectOption = {\n value: string;\n label: ReactNode;\n isDisabled?: boolean;\n /**\n * Plain-text form of `label`, for type-to-select and screen readers.\n * Only needed when `label` isn't a bare string — a label built from\n * elements has no text React Aria can read off it. A string label\n * supplies this itself.\n */\n textValue?: string;\n};\n\n/** A titled group of options in a {@link Select}'s `options` list. */\nexport type SelectOptionGroup<T extends Key = string> = {\n title: ReactNode;\n options: ReadonlyArray<SelectOption & { value: T }>;\n};\n\ntype Key = string | number;\n\nfunction isGroup<T extends Key>(\n entry: (SelectOption & { value: T }) | SelectOptionGroup<T>,\n): entry is SelectOptionGroup<T> {\n return 'options' in entry;\n}\n\n/** How a {@link Select} trigger signals that it opens a list. */\nexport type SelectIndicator = 'chevron' | 'underline' | 'none';\n\n/** Where a {@link Select}'s list opens relative to its trigger. */\nexport type SelectPopup = 'over' | 'below';\n\n/**\n * Props for {@link Select}, on top of React Aria's `Select` props, with the\n * selection key narrowed to the option value type.\n */\nexport type SelectProps<T extends Key = string> = Omit<RACSelectProps<object>, 'children' | 'className' | 'selectedKey' | 'defaultSelectedKey' | 'onSelectionChange'> & {\n label?: ReactNode;\n /**\n * `'stacked'` (the default) puts the label above the trigger; `'row'` sets it\n * beside the trigger at its own width, with any description or error on a\n * line below. Same vocabulary as {@link Field}'s `orientation`.\n */\n orientation?: FieldOrientation;\n description?: ReactNode;\n errorMessage?: ReactNode | ((v: ValidationResult) => ReactNode);\n placeholder?: string;\n /**\n * Either pass `options` for a quick render, or `children` for full control.\n * An entry with `title` and `options` of its own is a titled section.\n */\n options?: ReadonlyArray<(SelectOption & { value: T }) | SelectOptionGroup<T>>;\n children?: ReactNode;\n selectedKey?: T | null;\n defaultSelectedKey?: T;\n onSelectionChange?: (key: T) => void;\n /**\n * `'fill'` (the default) takes the width of whatever row the select sits in.\n * `'fit'` sizes the trigger to its widest option, so it neither swallows a\n * toolbar's slack nor changes width as the selection moves.\n */\n width?: 'fill' | 'fit';\n /** `'bare'` drops the box, for a select set in a row of other chrome such as a property row. */\n variant?: 'field' | 'bare';\n /**\n * How the trigger says it opens a list. `'chevron'` draws the caret beside\n * the value; `'underline'` marks the value itself, dotted at rest and solid\n * while it is pointed at or open; `'none'` says nothing. Unset takes the\n * variant's own: a boxed select shows the caret, a bare one — set in a row\n * where 10px of caret is a tenth of the value's width — underlines.\n */\n indicator?: SelectIndicator;\n /**\n * Where the list opens. `'over'` (the default) puts the selected row on the\n * trigger, its label in the trigger's own text column, so choosing what is\n * already chosen moves nothing; `'below'` hangs it under the trigger.\n */\n popup?: SelectPopup;\n /**\n * Id for the trigger button. React Aria puts a plain `id` on the wrapper,\n * which is not labelable, so an outer `<label for>` needs this to reach a\n * control the label can actually own.\n */\n triggerId?: string;\n className?: string;\n} & SegmentTooltipFields & OverlayPortalProps;\n\n/**\n * Form select wrapping React Aria's Select. Pass either `options` for a\n * quick declarative render or `children` of `<SelectItem>` for control over\n * each row; `<SelectSection>` (or an `options` entry with a `title`) groups\n * rows under a heading.\n *\n * The selection key type is parameterized so consumers with a string-literal\n * union for `value` (e.g. `'r' | 'g' | 'b'`) get a typed `onSelectionChange`.\n *\n * `shortcut` puts a kit tooltip on the trigger reading `Name (⌘K)`, named by\n * `aria-label` or a string `label`, as `Button` does; `tooltip` replaces that\n * text.\n */\nexport function Select<T extends Key = string>(props: SelectProps<T>) {\n const {\n label,\n orientation = 'stacked',\n description,\n errorMessage,\n placeholder,\n options,\n children,\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n width = 'fill',\n variant = 'field',\n indicator = variant === 'bare' ? 'underline' : 'chevron',\n popup = 'over',\n triggerId,\n className,\n portalContainer,\n shortcut,\n tooltip,\n ...rest\n } = props;\n\n const { anchor, portalProps } = useOverlayPortal(portalContainer);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const pressRef = useRef<Press | null>(null);\n const [nudge, setNudge] = useState(NO_NUDGE);\n\n return (\n <RACSelect\n {...rest}\n selectedKey={selectedKey}\n defaultSelectedKey={defaultSelectedKey}\n onSelectionChange={onSelectionChange ? (k) => onSelectionChange(k as T) : undefined}\n className={[\n s.field,\n width === 'fit' && s.fit,\n variant === 'bare' && s.bare,\n indicator === 'underline' && s.underlined,\n indicator === 'none' && s.plain,\n fieldClasses.root,\n orientation === 'row' && fieldClasses.row,\n orientation === 'row' && s.row,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {anchor}\n {label !== undefined && <Label className={`${fieldClasses.label} ${s.label}`}>{label}</Label>}\n <TriggerTooltip\n content={segmentTooltipContent({ tooltip, shortcut, ariaLabel: rest['aria-label'], label })}\n disabled={rest.isDisabled}\n >\n <RACButton\n id={triggerId}\n ref={triggerRef}\n className={s.trigger}\n onPointerDown={(e) => {\n pressRef.current = { x: e.clientX, y: e.clientY, at: performance.now() };\n }}\n >\n <SelectValue className={s.value}>\n {({ defaultChildren, isPlaceholder }) =>\n isPlaceholder ? (placeholder ?? defaultChildren) : defaultChildren\n }\n </SelectValue>\n {width === 'fit' && (\n <span className={s.sizer} aria-hidden=\"true\">\n {placeholder !== undefined && <span>{placeholder}</span>}\n {optionLabels(options, children).map((l, i) => (\n <span key={i}>{l}</span>\n ))}\n </span>\n )}\n {indicator === 'chevron' && (\n <svg className={s.chevron} viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <path d=\"M2 4 L5 7 L8 4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </RACButton>\n </TriggerTooltip>\n {description !== undefined && (\n <Text slot=\"description\" className={`${fieldClasses.hint} ${s.below}`}>\n {description}\n </Text>\n )}\n <FieldError className={`${fieldClasses.error} ${s.below}`}>{errorMessage}</FieldError>\n {/* `data-weasel-overlay` marks DOM that belongs to this control but\n renders in a portal, outside the subtree the trigger sits in. Any\n consumer reasoning about \"did focus leave my component?\" via\n `closest()` gets the wrong answer without it — a text editor whose\n font menu lives here would end its session the moment the menu is\n clicked. */}\n <RACPopover\n className={s.popover}\n data-weasel-overlay=\"\"\n placement=\"bottom start\"\n offset={popup === 'over' ? nudge.offset : undefined}\n crossOffset={popup === 'over' ? nudge.crossOffset : undefined}\n shouldFlip={popup !== 'over'}\n {...portalProps}\n >\n {popup === 'over' && (\n <AlignOverTrigger\n triggerRef={triggerRef}\n pressRef={pressRef}\n applied={nudge}\n onMeasure={setNudge}\n />\n )}\n <RACListBox className={s.listbox}>\n {options !== undefined\n ? options.map((entry, i) =>\n isGroup(entry) ? (\n <SelectSection key={`section-${i}`} title={entry.title}>\n {entry.options.map(renderOption)}\n </SelectSection>\n ) : (\n renderOption(entry)\n ),\n )\n : children}\n </RACListBox>\n </RACPopover>\n </RACSelect>\n );\n}\n\ntype Nudge = { offset: number; crossOffset: number };\n\n/** Where and when the pointer went down on the trigger. */\ntype Press = { x: number; y: number; at: number };\n\n/** How long a press may last and how far it may travel and still be a click. */\nconst CLICK_MS = 500;\n\nconst NO_NUDGE: Nudge = { offset: 0, crossOffset: 0 };\n\n/** The gap kept between a list and the viewport edge — React Aria's own\n * `containerPadding` default. */\nconst EDGE = 12;\n\n/** React Aria's own resting place for a popover: hanging under its trigger. */\nconst BELOW: Nudge = { offset: 8, crossOffset: 0 };\n\n/**\n * Lands the list so its selected row covers the trigger: same text column,\n * same line. The shift is handed back as the popover's own `offset` and\n * `crossOffset` rather than a transform, so React Aria keeps owning the\n * position and still holds the list inside the viewport.\n *\n * Measuring needs the list rendered, and the correction is applied by setting\n * state from a layout effect — React finishes that pass before the browser\n * paints, so the list is never seen at the uncorrected position.\n */\nfunction AlignOverTrigger({\n triggerRef,\n pressRef,\n applied,\n onMeasure,\n}: {\n triggerRef: RefObject<HTMLButtonElement | null>;\n pressRef: RefObject<Press | null>;\n applied: Nudge;\n onMeasure: (next: Nudge) => void;\n}) {\n // React Aria positions the popover but hands out no ref to it, so the\n // element is reached from inside: this marker's own parent.\n const markerRef = useRef<HTMLSpanElement>(null);\n // A measurement that settles takes two passes — one to place the list, one\n // to confirm. A cap is what keeps a list whose own placement changes its\n // measurement from renegotiating forever.\n const passes = useRef(0);\n useLayoutEffect(() => {\n const trigger = triggerRef.current;\n const popover = markerRef.current?.closest<HTMLElement>('[data-weasel-overlay]');\n if (!trigger || !popover || passes.current > 3) return;\n const value = trigger.querySelector(`.${s.value}`);\n // Nothing chosen yet, so there is no row that belongs over the trigger —\n // and putting an arbitrary one under the pointer arms it. A select showing\n // its placeholder hangs its list below, like any other dropdown.\n const label = popover.querySelector(`[data-selected] .${s.optionLabel}`);\n if (!value || !label) {\n if (applied.offset !== BELOW.offset || applied.crossOffset !== BELOW.crossOffset)\n onMeasure(BELOW);\n return;\n }\n\n // The trigger's own text alignment decides which edge the two labels are\n // matched on, and the list follows it so the selected row reads as the\n // trigger with the others unfolded around it.\n const align = getComputedStyle(trigger).getPropertyValue('--wzl-select-align').trim();\n const toEnd = align === 'right' || align === 'end';\n popover.dataset.align = toEnd ? 'end' : 'start';\n\n // Stated against each element's own box rather than measured as a gap to\n // close: React Aria repositions after this effect, so what is on screen\n // now is a frame behind, and a correction read off it would be applied to\n // a position that has already moved — the shift compounds every pass.\n // `bottom start` puts the list's top at the trigger's bottom and their\n // left edges together, so the two insets below are the whole story.\n const box = popover.getBoundingClientRect();\n const seat = trigger.getBoundingClientRect();\n const row = label.getBoundingClientRect();\n const shown = value.getBoundingClientRect();\n // React Aria holds the list inside the viewport across the trigger but not\n // along it, and `offset` moves it along: the selected row sits on the\n // trigger only as far as the rest of the list still fits on screen.\n const over = shown.top + shown.height / 2 - seat.top - (row.top + row.height / 2 - box.top) - seat.height;\n const viewHeight = trigger.ownerDocument.documentElement.clientHeight;\n const lowest = viewHeight - EDGE - box.height - seat.bottom;\n const next = {\n offset: Math.max(EDGE - seat.bottom, Math.min(over, lowest)),\n crossOffset: toEnd\n ? shown.right - seat.left - (row.right - box.left)\n : shown.left - seat.left - (row.left - box.left),\n };\n if (Math.abs(next.offset - applied.offset) < 0.5 && Math.abs(next.crossOffset - applied.crossOffset) < 0.5)\n return;\n passes.current += 1;\n onMeasure(next);\n });\n\n // The list covers the trigger, so the release that ends the click opening it\n // lands on a row — and a row selects on release, which shuts the list again\n // before it has been seen. A click is a press and a release in the same\n // place: that one is the opening gesture and belongs to the trigger, and the\n // list keeps every release after it. Press, hold, drag and release still\n // picks a row, which is the gesture a list over its trigger is for.\n useEffect(() => {\n const doc = triggerRef.current?.ownerDocument;\n if (!doc) return;\n const onUp = (e: PointerEvent) => {\n doc.removeEventListener('pointerup', onUp, true);\n const press = pressRef.current;\n if (!press || performance.now() - press.at > CLICK_MS) return;\n if (pastDragThreshold({ clientX: press.x, clientY: press.y }, e)) return;\n e.preventDefault();\n e.stopPropagation();\n };\n doc.addEventListener('pointerup', onUp, true);\n return () => doc.removeEventListener('pointerup', onUp, true);\n }, [triggerRef, pressRef]);\n\n return <span ref={markerRef} hidden />;\n}\n\n/* `SelectValue` copies the selected row into the trigger, mark included; the\n trigger hides it, so the `width='fit'` sizer leaves it out. */\nfunction CheckMark() {\n return (\n <svg className={s.check} viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <polyline points=\"1.5,5 4,7.5 8.5,3\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction renderOption<T extends Key>(o: SelectOption & { value: T }) {\n return (\n <SelectItem key={String(o.value)} id={o.value} isDisabled={o.isDisabled} textValue={o.textValue}>\n {o.label}\n </SelectItem>\n );\n}\n\n/**\n * The labels a `width='fit'` trigger measures itself against. In the children\n * form the label sits one element deep, inside a `SelectItem`, or two inside a\n * `SelectSection`.\n */\nfunction optionLabels(\n options: ReadonlyArray<SelectOption | SelectOptionGroup<Key>> | undefined,\n children: ReactNode,\n): ReactNode[] {\n if (options !== undefined)\n return options.flatMap((o) => ('options' in o ? o.options.map((g) => g.label) : [o.label]));\n return Children.toArray(children).flatMap((c) => {\n if (!isValidElement<{ children?: ReactNode }>(c)) return [c];\n return c.type === SelectSection ? optionLabels(undefined, c.props.children) : [c.props.children];\n });\n}\n\n/** Props for {@link SelectSection}. */\nexport type SelectSectionProps = {\n /** Heading shown above the section's rows; it also names the group for\n * screen readers. */\n title?: ReactNode;\n children?: ReactNode;\n className?: string;\n};\n\n/** A titled group of `SelectItem` rows in a {@link Select}'s list. */\nexport function SelectSection({ title, children, className }: SelectSectionProps) {\n return (\n <RACListBoxSection className={[s.section, className].filter(Boolean).join(' ')}>\n {title !== undefined && <Header className={s.sectionHeader}>{title}</Header>}\n {children}\n </RACListBoxSection>\n );\n}\n\n/** Props for {@link SelectItem}, on top of React Aria's `ListBoxItem` props. */\nexport type SelectItemProps = Omit<RACListBoxItemProps, 'className' | 'children'> & {\n children?: ReactNode;\n className?: string;\n};\n\n/**\n * Every row renders a check mark beside its label, so from React Aria's\n * side the children are never plain text and it can't derive the string\n * type-to-select and screen readers need — it warns once per row. A string\n * label already *is* that string, so derive it rather than making every\n * call site restate it; anything richer has to say what it reads as.\n */\nfunction textValueOf(children: ReactNode, explicit: string | undefined): string | undefined {\n if (explicit !== undefined) return explicit;\n return typeof children === 'string' || typeof children === 'number'\n ? String(children)\n : undefined;\n}\n\n/**\n * One row in a {@link Select}'s list, with a leading check mark when\n * selected. A string child supplies its own `textValue`; anything richer must\n * pass one so type-to-select and screen readers have something to read.\n */\nexport function SelectItem({ children, className, textValue, ...rest }: SelectItemProps) {\n return (\n <RACListBoxItem\n {...rest}\n textValue={textValueOf(children, textValue)}\n className={[s.option, className].filter(Boolean).join(' ')}\n >\n <CheckMark />\n {/* A box around the label, not just text: landing the list over its\n trigger means measuring where this row's label sits. */}\n <span className={s.optionLabel}>{children}</span>\n </RACListBoxItem>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import { d as e, f as t, i as n, l as r, n as i, o as a, r as o, s, t as c, u as l } from "./model-BaF65rnX.js";
2
+ import { asNodeId as u } from "@weasel-js/core";
3
+ import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
4
+ import { Fragment as m, useSyncExternalStore as h } from "react";
5
+ //#region src/components/SelectionPanel/SelectionPanel.tsx
6
+ var g = (e) => e.length === 0 ? e : e[0].toUpperCase() + e.slice(1);
7
+ function _(i) {
8
+ let { scene: c, selection: l, properties: _, routing: y, renderers: b, kindLabel: x = g, emptyState: S = null, className: C } = i;
9
+ h(c.subscribe, c.getVersion, c.getVersion);
10
+ let w = l.current.map((e) => c.get(u(e))).filter((e) => e != null), T = w.map((e) => o(e, y)), E = w.map((e) => e.id).join(","), D = n(T, _);
11
+ if (w.length === 0) return /* @__PURE__ */ f("div", {
12
+ className: [t.root, C].filter(Boolean).join(" "),
13
+ children: S
14
+ });
15
+ let O = (e, t) => {
16
+ let [n, ...i] = e.path.split(".");
17
+ if (i.length === 0) return;
18
+ let a = l.current.map(u);
19
+ c.batch(`Edit ${e.leaf.name}`, () => {
20
+ for (let o of a) {
21
+ let a = c.get(o);
22
+ if (!a) continue;
23
+ let l = t(s(a, e.path));
24
+ n === "pose" ? c.setPose(o, r(a.pose, i, l)) : n === "data" && c.update(o, { data: r(a.data, i, l) });
25
+ }
26
+ });
27
+ };
28
+ return /* @__PURE__ */ p("div", {
29
+ className: [t.root, C].filter(Boolean).join(" "),
30
+ children: [/* @__PURE__ */ f("header", {
31
+ className: t.header,
32
+ children: w.length === 1 ? /* @__PURE__ */ f("span", {
33
+ className: t.kind,
34
+ children: x(T[0])
35
+ }) : /* @__PURE__ */ p(d, { children: [/* @__PURE__ */ p("span", {
36
+ className: t.kind,
37
+ children: [w.length, " selected"]
38
+ }), /* @__PURE__ */ f("span", {
39
+ className: t.breakdown,
40
+ children: a(T)
41
+ })] })
42
+ }), D.map((n) => {
43
+ let r = n.rows.map((t) => ({
44
+ row: t,
45
+ controls: e(t.leaves.map((e) => v(e, t.leaves.length > 1 ? `${t.label} ${e.leaf.name}` : e.leaf.name, w, b, O, E)), b)
46
+ })).filter(({ controls: e }) => e.length > 0);
47
+ return r.length === 0 ? null : /* @__PURE__ */ p("section", {
48
+ className: t.section,
49
+ children: [n.name !== "" && /* @__PURE__ */ f("h3", {
50
+ className: t.sectionTitle,
51
+ children: n.name
52
+ }), r.map(({ row: e, controls: r }) => e.leaves.length === 1 && e.leaves[0].leaf.block ? /* @__PURE__ */ p("div", { children: [n.name === "" && e.leaves[0].leaf.kind !== "object" && /* @__PURE__ */ f("h4", {
53
+ className: t.sectionTitle,
54
+ title: e.leaves[0].leaf.description,
55
+ children: e.leaves[0].leaf.name
56
+ }), r[0].content] }, e.leaves[0].path) : /* @__PURE__ */ p("div", {
57
+ className: t.row,
58
+ children: [/* @__PURE__ */ f("span", {
59
+ className: t.rowLabel,
60
+ title: e.leaves[0].leaf.description,
61
+ children: e.label
62
+ }), /* @__PURE__ */ f("span", {
63
+ className: t.rowControls,
64
+ children: r.map(({ key: e, content: t }) => /* @__PURE__ */ f(m, { children: t }, e))
65
+ })]
66
+ }, e.leaves[0].path))]
67
+ }, n.key);
68
+ })]
69
+ });
70
+ }
71
+ function v(e, t, n, r, a, o) {
72
+ let { path: s, leaf: u } = e, d = i(n, s), f = d === c, p = {
73
+ path: s,
74
+ pref: u,
75
+ value: f ? void 0 : d,
76
+ mixed: f,
77
+ unset: !f && d === void 0,
78
+ setValue: (t) => a(e, () => t),
79
+ update: (t) => a(e, t),
80
+ valueAt: (e) => {
81
+ let t = i(n, e);
82
+ return t === c ? {
83
+ value: void 0,
84
+ mixed: !0
85
+ } : {
86
+ value: t,
87
+ mixed: !1
88
+ };
89
+ },
90
+ selectionKey: o
91
+ };
92
+ return {
93
+ key: s,
94
+ leaf: u,
95
+ ctx: p,
96
+ ariaLabel: t,
97
+ render: () => {
98
+ let e = r?.[s] ?? r?.[u.kind];
99
+ return e ? e(p) : l(p, t, r, o);
100
+ }
101
+ };
102
+ }
103
+ //#endregion
104
+ export { _ as t };
105
+
106
+ //# sourceMappingURL=SelectionPanel-BaQnX4Bs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionPanel-BaQnX4Bs.js","names":["s","_Fragment","Fragment","renderCells","SelectionPanel_module_default","effectiveSections","setAtPath","aggregateValue","kindBreakdown","classifyKind","MIXED","renderBuiltin","Fragment$1","defaultKindLabel","kind","SelectionPanel","props","scene","nodes","selection","asNodeId","id","n","kinds","routing","selectionKey","sections","properties","className","emptyState","commit","head","rest","leaf","ids","node","value","next","nodeValueAt","kindLabel","Fragment","rows","section","row","leafCell","panelLeaf","renderers","controls","content","key","aggregated","path","mixed","ctx","v","fn","at","p","custom","ariaLabel"],"sources":["../../src/components/SelectionPanel/SelectionPanel.tsx"],"sourcesContent":["import { Fragment, useSyncExternalStore, type ReactNode } from 'react';\nimport {\n asNodeId,\n type NodePropertiesEntry,\n type NodeRoutingEntry,\n type Scene,\n type SelectionApi,\n} from '@weasel-js/core';\nimport {\n renderBuiltin,\n renderCells,\n type LeafCell,\n type PropertyRenderContext,\n type PropertyRenderer,\n} from './renderLeaf';\nimport {\n MIXED,\n aggregateValue,\n classifyKind,\n effectiveSections,\n kindBreakdown,\n nodeValueAt,\n setAtPath,\n type AnyNode,\n type PanelLeaf,\n} from './model';\nimport s from './SelectionPanel.module.css';\n\nexport type { PropertyRenderContext, PropertyRenderer } from './renderLeaf';\n\n/** Props for {@link SelectionPanel}. */\nexport interface SelectionPanelProps<TData, TLayer extends string, TPose> {\n /** The scene handle (`useScene`). The panel subscribes itself, so it\n * re-renders on scene mutations regardless of parent renders. */\n scene: Scene<TData, TLayer, TPose>;\n /** Selection handle (`useSelection`). Only `current` is read. */\n selection: Pick<SelectionApi, 'current'>;\n /** Properties-trait entries, e.g. core's `defaultNodeProperties` /\n * `inferredNodeProperties` (+ consumer extras). Memoize or hoist. */\n properties: readonly NodePropertiesEntry[];\n /** Routing-trait classifiers used to derive each node's kind — pass\n * the same list the canvas uses. Memoize or hoist. */\n routing: readonly NodeRoutingEntry[];\n /** Control overrides / app-defined kinds (PrefsForm-style). Keys are\n * leaf paths (`data.fill`, checked first) or leaf kinds (`color`).\n * A renderer returning `null` collapses its leaf (and the row, when\n * every leaf in it collapses). */\n renderers?: Record<string, PropertyRenderer>;\n /** Kind → header label. Default: capitalized kind name. */\n kindLabel?: (kind: string) => string;\n /** Rendered when the selection is empty. */\n emptyState?: ReactNode;\n className?: string;\n}\n\nconst defaultKindLabel = (kind: string): string =>\n kind.length === 0 ? kind : kind[0].toUpperCase() + kind.slice(1);\n\n/**\n * Pre-baked selection properties panel. Shows the selected nodes' kind\n * and the properties-trait schema for that kind; multi-selections show\n * the intersection of the kinds' schemas with per-field Mixed state.\n * Edits commit as one labeled `scene.batch` fan-out per gesture.\n */\nexport function SelectionPanel<TData, TLayer extends string, TPose>(\n props: SelectionPanelProps<TData, TLayer, TPose>,\n) {\n const {\n scene,\n selection,\n properties,\n routing,\n renderers,\n kindLabel = defaultKindLabel,\n emptyState = null,\n className,\n } = props;\n\n useSyncExternalStore(scene.subscribe, scene.getVersion, scene.getVersion);\n\n const nodes = selection.current\n .map((id) => scene.get(asNodeId(id)))\n .filter((n): n is NonNullable<typeof n> => n != null) as readonly AnyNode[];\n\n const kinds = nodes.map((n) => classifyKind(n, routing));\n const selectionKey = nodes.map((n) => n.id).join(',');\n const sections = effectiveSections(kinds, properties);\n\n if (nodes.length === 0) {\n return <div className={[s.root, className].filter(Boolean).join(' ')}>{emptyState}</div>;\n }\n\n /** Writes, into every selected node, what `next` derives from the value\n * that node holds at the leaf's path. */\n const commit = (leaf: PanelLeaf, next: (prev: unknown) => unknown): void => {\n const [head, ...rest] = leaf.path.split('.');\n if (rest.length === 0) return;\n const ids = selection.current.map(asNodeId);\n scene.batch(`Edit ${leaf.leaf.name}`, () => {\n for (const id of ids) {\n const node = scene.get(id);\n if (!node) continue;\n const value = next(nodeValueAt(node as AnyNode, leaf.path));\n // `setAtPath` spreads plain objects/arrays down the schema path;\n // consumer `pose`/`data` are assumed plain-object-shaped along\n // that path (a class instance's prototype would be dropped by\n // the spread) — the `as TPose`/`as TData` casts below rely on it.\n if (head === 'pose') {\n scene.setPose(id, setAtPath(node.pose as object, rest, value) as TPose);\n } else if (head === 'data') {\n scene.update(id, { data: setAtPath(node.data as object, rest, value) as TData });\n }\n }\n });\n };\n\n return (\n <div className={[s.root, className].filter(Boolean).join(' ')}>\n <header className={s.header}>\n {nodes.length === 1 ? (\n <span className={s.kind}>{kindLabel(kinds[0])}</span>\n ) : (\n <>\n <span className={s.kind}>{nodes.length} selected</span>\n <span className={s.breakdown}>{kindBreakdown(kinds)}</span>\n </>\n )}\n </header>\n {sections.map((section) => {\n // Render controls before emitting row chrome so a null-rendering\n // leaf (custom renderer opting out) collapses its cell — and the\n // whole row / section when nothing survives. PrefsForm precedent.\n const rows = section.rows\n .map((row) => {\n const controls = renderCells(\n row.leaves.map((panelLeaf) =>\n leafCell(\n panelLeaf,\n row.leaves.length > 1\n ? `${row.label} ${panelLeaf.leaf.name}`\n : panelLeaf.leaf.name,\n nodes,\n renderers,\n commit,\n selectionKey,\n ),\n ),\n renderers,\n );\n return { row, controls };\n })\n .filter(({ controls }) => controls.length > 0);\n if (rows.length === 0) return null;\n return (\n <section key={section.key} className={s.section}>\n {section.name !== '' && <h3 className={s.sectionTitle}>{section.name}</h3>}\n {rows.map(({ row, controls }) => (\n // A `block` leaf brings its own chrome — it spans the section\n // instead of sitting in a labeled row's control cell. Under a\n // headless section nothing else names it, so it heads itself;\n // an object leaf already renders its own heading.\n row.leaves.length === 1 && row.leaves[0].leaf.block ? (\n <div key={row.leaves[0].path}>\n {section.name === '' && row.leaves[0].leaf.kind !== 'object' && (\n <h4 className={s.sectionTitle} title={row.leaves[0].leaf.description}>\n {row.leaves[0].leaf.name}\n </h4>\n )}\n {controls[0].content}\n </div>\n ) : (\n <div key={row.leaves[0].path} className={s.row}>\n <span className={s.rowLabel} title={row.leaves[0].leaf.description}>\n {row.label}\n </span>\n <span className={s.rowControls}>\n {controls.map(({ key, content }) => (\n <Fragment key={key}>{content}</Fragment>\n ))}\n </span>\n </div>\n )\n ))}\n </section>\n );\n })}\n </div>\n );\n}\n\n\nfunction leafCell(\n panelLeaf: PanelLeaf,\n ariaLabel: string,\n nodes: readonly AnyNode[],\n renderers: Record<string, PropertyRenderer> | undefined,\n commit: (leaf: PanelLeaf, next: (prev: unknown) => unknown) => void,\n selectionKey: string,\n): LeafCell {\n const { path, leaf } = panelLeaf;\n const aggregated = aggregateValue(nodes, path);\n const mixed = aggregated === MIXED;\n const value = mixed ? undefined : aggregated;\n\n const ctx: PropertyRenderContext = {\n path,\n pref: leaf,\n value,\n mixed,\n unset: !mixed && aggregated === undefined,\n setValue: (v) => commit(panelLeaf, () => v),\n update: (fn) => commit(panelLeaf, fn),\n valueAt: (p) => {\n const at = aggregateValue(nodes, p);\n return at === MIXED ? { value: undefined, mixed: true } : { value: at, mixed: false };\n },\n selectionKey,\n };\n\n return {\n key: path,\n leaf,\n ctx,\n ariaLabel,\n render: () => {\n const custom = renderers?.[path] ?? renderers?.[leaf.kind];\n if (custom) return custom(ctx);\n return renderBuiltin(ctx, ariaLabel, renderers, selectionKey);\n },\n };\n}\n\n"],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { t as e } from "./CloseButton-C2J7wVfo.js";
2
+ import { n as t } from "./Disclosure-Ch2KxYuB.js";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ var i = {
5
+ panel: "_panel_1sr1g_1",
6
+ title: "_title_1sr1g_9",
7
+ titleRow: "_titleRow_1sr1g_17",
8
+ titleBox: "_titleBox_1sr1g_27",
9
+ titleButton: "_titleButton_1sr1g_31",
10
+ hideButton: "_hideButton_1sr1g_47",
11
+ collapsed: "_collapsed_1sr1g_51",
12
+ body: "_body_1sr1g_55"
13
+ };
14
+ //#endregion
15
+ //#region src/components/SidebarPanel/SidebarPanel.tsx
16
+ function a(a) {
17
+ let { title: o, collapsed: s, onToggleCollapse: c, onHide: l, children: u, className: d } = a, f = [
18
+ i.panel,
19
+ s && i.collapsed,
20
+ d
21
+ ].filter(Boolean).join(" "), p = c !== void 0;
22
+ return /* @__PURE__ */ r("div", {
23
+ className: f,
24
+ children: [o !== void 0 && /* @__PURE__ */ r("div", {
25
+ className: i.titleRow,
26
+ children: [p ? /* @__PURE__ */ r("button", {
27
+ type: "button",
28
+ className: `${i.titleButton} ${i.titleBox}`,
29
+ onClick: c,
30
+ "aria-expanded": !s,
31
+ children: [/* @__PURE__ */ n(t, { open: !s }), /* @__PURE__ */ n("span", {
32
+ className: i.title,
33
+ children: o
34
+ })]
35
+ }) : /* @__PURE__ */ n("span", {
36
+ className: `${i.title} ${i.titleBox}`,
37
+ children: o
38
+ }), l !== void 0 && /* @__PURE__ */ n(e, {
39
+ className: i.hideButton,
40
+ ariaLabel: "Hide panel",
41
+ tooltip: "Hide panel",
42
+ onClick: l
43
+ })]
44
+ }), !s && /* @__PURE__ */ n("div", {
45
+ className: i.body,
46
+ children: u
47
+ })]
48
+ });
49
+ }
50
+ //#endregion
51
+ export { a as t };
52
+
53
+ //# sourceMappingURL=SidebarPanel-BblDEz4G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidebarPanel-BblDEz4G.js","names":["s","CloseButton","DisclosureMark","SidebarPanel_module_default","SidebarPanel","props","cls","collapsed","className","headerInteractive","onToggleCollapse","title","onHide"],"sources":["../../src/components/SidebarPanel/SidebarPanel.module.css","../../src/components/SidebarPanel/SidebarPanel.tsx"],"sourcesContent":[".panel {\n /* Vertical only: the body spans the panel's full width, and the title row's\n own controls carry the horizontal inset. */\n padding: var(--wzl-space-4) 0;\n background: var(--wzl-surface);\n color: var(--wzl-fg);\n}\n\n.title {\n font-size: var(--wzl-font-size-sm);\n font-weight: var(--wzl-font-weight-bold);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--wzl-fg-muted);\n}\n\n.titleRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: var(--wzl-space-2);\n padding: 0;\n}\n\n/* The title's inset, shared by the static title and the collapse button so the\n two line up. */\n.titleBox {\n padding: var(--wzl-space-2) var(--wzl-space-4);\n}\n\n.titleButton {\n display: inline-flex;\n align-items: center;\n gap: var(--wzl-space-2);\n flex: 1 1 auto;\n background: transparent;\n border: 0;\n cursor: pointer;\n color: inherit;\n font: inherit;\n text-align: left;\n}\n.titleButton:hover {\n color: var(--wzl-fg);\n}\n\n.hideButton {\n margin-inline-end: var(--wzl-space-2);\n}\n\n.panel.collapsed {\n padding-bottom: var(--wzl-space-2);\n}\n\n.body {\n padding: 0;\n}\n","import type { ReactNode } from 'react';\nimport { CloseButton } from '../CloseButton';\nimport { DisclosureMark } from '../Disclosure';\nimport s from './SidebarPanel.module.css';\n\n/** Props for {@link SidebarPanel}. */\nexport interface SidebarPanelProps {\n /** Title rendered in the panel's header row. */\n title?: ReactNode;\n /**\n * Collapsed state — when true, only the header paints; the body is\n * omitted. Caller owns the state (typically via prefs) and flips it\n * back via `onToggleCollapse`.\n */\n collapsed?: boolean;\n /**\n * Click handler for the title row. When provided, the header renders\n * as a button (fold mark + label) and acts as the collapse toggle.\n * When omitted, the title is static text and the panel can't collapse.\n */\n onToggleCollapse?(): void;\n /**\n * Optional close handler — when provided, the header gains a close\n * button on the trailing edge. Caller flips its \"hidden\" state and\n * conditionally unmounts the panel from the parent.\n */\n onHide?(): void;\n children?: ReactNode;\n className?: string;\n}\n\n/**\n * Generic collapsible panel section for sidebars. Pure presentation —\n * caller manages `collapsed`/`hidden` state externally (the pattern is\n * to drive it from app prefs so the Preferences modal and inline\n * fold marks toggle the same map).\n *\n * Pair with `<Sidebar>` for the docked column layout.\n */\nexport function SidebarPanel(props: SidebarPanelProps) {\n const { title, collapsed, onToggleCollapse, onHide, children, className } = props;\n const cls = [s.panel, collapsed && s.collapsed, className].filter(Boolean).join(' ');\n const headerInteractive = onToggleCollapse !== undefined;\n return (\n <div className={cls}>\n {title !== undefined && (\n <div className={s.titleRow}>\n {headerInteractive ? (\n <button\n type=\"button\"\n className={`${s.titleButton} ${s.titleBox}`}\n onClick={onToggleCollapse}\n aria-expanded={!collapsed}\n >\n <DisclosureMark open={!collapsed} />\n <span className={s.title}>{title}</span>\n </button>\n ) : (\n <span className={`${s.title} ${s.titleBox}`}>{title}</span>\n )}\n {onHide !== undefined && (\n <CloseButton\n className={s.hideButton}\n ariaLabel=\"Hide panel\"\n tooltip=\"Hide panel\"\n onClick={onHide}\n />\n )}\n </div>\n )}\n {!collapsed && <div className={s.body}>{children}</div>}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;ACuCA,SAAgBI,EAAa,GAA0B;CACrD,IAAM,EAAE,UAAO,cAAW,qBAAkB,WAAQ,aAAU,iBAAcC,GACtEC,IAAM;EAACN,EAAE;EAAOO,KAAaP,EAAE;EAAWQ;CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,GAC7EC,IAAoBC,MAAqB,KAAA;CAC/C,OACE,kBAAC,OAAD;EAAK,WAAWJ;EAAhB,UAAA,CACGK,MAAU,KAAA,KACT,kBAAC,OAAD;GAAK,WAAWX,EAAE;GAAlB,UAAA,CACGS,IACC,kBAAC,UAAD;IACE,MAAK;IACL,WAAW,GAAGT,EAAE,YAAY,GAAGA,EAAE;IACjC,SAASU;IACT,iBAAe,CAACH;IAJlB,UAAA,CAME,kBAACL,GAAD,EAAgB,MAAM,CAACK,EAAY,CAAA,GACnC,kBAAC,QAAD;KAAM,WAAWP,EAAE;KAAQ,UAAAW;IAAY,CAAA,CACjC;GAER,CAAA,IAAA,kBAAC,QAAD;IAAM,WAAW,GAAGX,EAAE,MAAM,GAAGA,EAAE;IAAa,UAAAW;GAAY,CAAA,GAE3DC,MAAW,KAAA,KACV,kBAACX,GAAD;IACE,WAAWD,EAAE;IACb,WAAU;IACV,SAAQ;IACR,SAASY;GACV,CAAA,CAEA;EAEN,CAAA,GAAA,CAACL,KAAa,kBAAC,OAAD;GAAK,WAAWP,EAAE;GAAO;EAAc,CAAA,CACnD;;AAET"}