@weasel-js/ui 1.6.1 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (517) hide show
  1. package/dist/chunks/ActionBar-xA73vzzF.js +64 -0
  2. package/dist/chunks/ActionBar-xA73vzzF.js.map +1 -0
  3. package/dist/chunks/Badge-CTc9Lkwn.js +14 -0
  4. package/dist/chunks/Badge-CTc9Lkwn.js.map +1 -0
  5. package/dist/chunks/{Badge-CyAIZSDo.js → Badge-jYQjrTKc.js} +506 -486
  6. package/dist/chunks/Badge-jYQjrTKc.js.map +1 -0
  7. package/dist/chunks/BandEditor-Dd0egAgE.js +292 -0
  8. package/dist/chunks/BandEditor-Dd0egAgE.js.map +1 -0
  9. package/dist/chunks/{Button-BIdXHQOx.js → Button-XB-T75YL.js} +2 -2
  10. package/dist/chunks/{Button-BIdXHQOx.js.map → Button-XB-T75YL.js.map} +1 -1
  11. package/dist/chunks/{ButtonBar-D5Vi0aj_.js → ButtonBar-CIMKPPRS.js} +7 -9
  12. package/dist/chunks/{ButtonBar-D5Vi0aj_.js.map → ButtonBar-CIMKPPRS.js.map} +1 -1
  13. package/dist/chunks/Callout-BUn0dP_S.js +115 -0
  14. package/dist/chunks/Callout-BUn0dP_S.js.map +1 -0
  15. package/dist/chunks/Checkbox-DFn-x0JO.js +37 -0
  16. package/dist/chunks/Checkbox-DFn-x0JO.js.map +1 -0
  17. package/dist/chunks/CloseButton-BmNmRVtb.js +26 -0
  18. package/dist/chunks/CloseButton-BmNmRVtb.js.map +1 -0
  19. package/dist/chunks/ColorField-BLs9fbeq.js +90 -0
  20. package/dist/chunks/ColorField-BLs9fbeq.js.map +1 -0
  21. package/dist/chunks/{ColorModeControl-ke5PXbBa.js → ColorModeControl-DaVJ-SyX.js} +3 -3
  22. package/dist/chunks/{ColorModeControl-ke5PXbBa.js.map → ColorModeControl-DaVJ-SyX.js.map} +1 -1
  23. package/dist/chunks/ComboBox-CuTLRmUg.js +138 -0
  24. package/dist/chunks/ComboBox-CuTLRmUg.js.map +1 -0
  25. package/dist/chunks/{CurveEditor-BDJXjEvK.js → CurveEditor-jVBEqqdv.js} +90 -87
  26. package/dist/chunks/CurveEditor-jVBEqqdv.js.map +1 -0
  27. package/dist/chunks/{DataGrid-D-dZj1BD.js → DataGrid-BklgBqS0.js} +17 -17
  28. package/dist/chunks/DataGrid-BklgBqS0.js.map +1 -0
  29. package/dist/chunks/DetailList-DFtqdOJj.js +52 -0
  30. package/dist/chunks/DetailList-DFtqdOJj.js.map +1 -0
  31. package/dist/chunks/{DetentSlider-CL8TlX3S.js → DetentSlider-Bh7EpMqT.js} +2 -2
  32. package/dist/chunks/{DetentSlider-CL8TlX3S.js.map → DetentSlider-Bh7EpMqT.js.map} +1 -1
  33. package/dist/chunks/Dialog-DKfsk5VN.js +63 -0
  34. package/dist/chunks/Dialog-DKfsk5VN.js.map +1 -0
  35. package/dist/chunks/{Disclosure-0G0uh2fa.js → Disclosure-Ch2KxYuB.js} +7 -7
  36. package/dist/chunks/Disclosure-Ch2KxYuB.js.map +1 -0
  37. package/dist/chunks/{DragGhost-B5_hb9W9.js → DragGhost-BeYDJyLZ.js} +2 -2
  38. package/dist/chunks/{DragGhost-B5_hb9W9.js.map → DragGhost-BeYDJyLZ.js.map} +1 -1
  39. package/dist/chunks/{DragHandleGlyph-Dr7Fgo0I.js → DragGrip-AoIZXfZb.js} +2 -2
  40. package/dist/chunks/DragGrip-AoIZXfZb.js.map +1 -0
  41. package/dist/chunks/FallthroughDiagram-C7BUe8eU.js +284 -0
  42. package/dist/chunks/FallthroughDiagram-C7BUe8eU.js.map +1 -0
  43. package/dist/chunks/Field-DsBlnFKf.js +25 -0
  44. package/dist/chunks/Field-DsBlnFKf.js.map +1 -0
  45. package/dist/chunks/FillStrokeSwatch-CgsYQgew.js +112 -0
  46. package/dist/chunks/FillStrokeSwatch-CgsYQgew.js.map +1 -0
  47. package/dist/chunks/{FontFamilySelect-DXlMKWfK.js → FontFamilySelect-CGJ5OIOy.js} +2 -2
  48. package/dist/chunks/FontFamilySelect-CGJ5OIOy.js.map +1 -0
  49. package/dist/chunks/FontWeightSelect-RbcXYJPS.js +49 -0
  50. package/dist/chunks/FontWeightSelect-RbcXYJPS.js.map +1 -0
  51. package/dist/chunks/GestureRoute-BXESrHI0.js +82 -0
  52. package/dist/chunks/GestureRoute-BXESrHI0.js.map +1 -0
  53. package/dist/chunks/GradientEditor-DypXzMc-.js +325 -0
  54. package/dist/chunks/GradientEditor-DypXzMc-.js.map +1 -0
  55. package/dist/chunks/{Icon-Cgzy8VgC.js → Icon--B1ME-6c.js} +33 -1
  56. package/dist/chunks/Icon--B1ME-6c.js.map +1 -0
  57. package/dist/chunks/{InlineRange-eOj6JpJl.js → InlineRange-P01ABSzo.js} +3 -3
  58. package/dist/chunks/InlineRange-P01ABSzo.js.map +1 -0
  59. package/dist/chunks/{Input-CHmkfYaD.js → Input-CzwvCZs_.js} +10 -15
  60. package/dist/chunks/Input-CzwvCZs_.js.map +1 -0
  61. package/dist/chunks/{ItemList-Cm-HUWCi.js → ItemList-CRu9y7hL.js} +2 -2
  62. package/dist/chunks/ItemList-CRu9y7hL.js.map +1 -0
  63. package/dist/chunks/{Jog-DESxZ44P.js → Jog-DfNUYejm.js} +8 -8
  64. package/dist/chunks/Jog-DfNUYejm.js.map +1 -0
  65. package/dist/chunks/{Keycaps-C0H_v2gO.js → Keycaps-C-FJyG8k.js} +14 -14
  66. package/dist/chunks/Keycaps-C-FJyG8k.js.map +1 -0
  67. package/dist/chunks/{LayerList-nz-QYvTF.js → LayerList-CsDqwYh-.js} +105 -111
  68. package/dist/chunks/LayerList-CsDqwYh-.js.map +1 -0
  69. package/dist/chunks/ListEditor-BnGzqERm.js +72 -0
  70. package/dist/chunks/ListEditor-BnGzqERm.js.map +1 -0
  71. package/dist/chunks/MenuButton-L9f5vido.js +75 -0
  72. package/dist/chunks/MenuButton-L9f5vido.js.map +1 -0
  73. package/dist/chunks/MeshEditor-GbqqiPk8.js +199 -0
  74. package/dist/chunks/MeshEditor-GbqqiPk8.js.map +1 -0
  75. package/dist/chunks/NumberField-DLXXgh48.js +209 -0
  76. package/dist/chunks/NumberField-DLXXgh48.js.map +1 -0
  77. package/dist/chunks/{OptionsBar-DbzAgIln.js → OptionsBar-DeTAjVb7.js} +6 -8
  78. package/dist/chunks/{OptionsBar-DbzAgIln.js.map → OptionsBar-DeTAjVb7.js.map} +1 -1
  79. package/dist/chunks/PaintField-C0hoXc0Y.js +63 -0
  80. package/dist/chunks/PaintField-C0hoXc0Y.js.map +1 -0
  81. package/dist/chunks/PaintInput-jQRxM95Y.js +132 -0
  82. package/dist/chunks/PaintInput-jQRxM95Y.js.map +1 -0
  83. package/dist/chunks/PatternPicker-CaMYXzhF.js +135 -0
  84. package/dist/chunks/PatternPicker-CaMYXzhF.js.map +1 -0
  85. package/dist/chunks/{Plot2D-CTXHkL5p.js → Plot2D-BHNbgCAl.js} +7 -7
  86. package/dist/chunks/Plot2D-BHNbgCAl.js.map +1 -0
  87. package/dist/chunks/{PointPlotter-Bxo6haKe.js → PointPlotter-BZ_vk6gV.js} +2 -2
  88. package/dist/chunks/{PointPlotter-Bxo6haKe.js.map → PointPlotter-BZ_vk6gV.js.map} +1 -1
  89. package/dist/chunks/{Powerline-ExO5GwEr.js → Powerline-6wIFmDik.js} +2 -2
  90. package/dist/chunks/{Powerline-ExO5GwEr.js.map → Powerline-6wIFmDik.js.map} +1 -1
  91. package/dist/chunks/{Prefs-DpqFKiwY.js → Prefs-CkyldX-e.js} +116 -91
  92. package/dist/chunks/Prefs-CkyldX-e.js.map +1 -0
  93. package/dist/chunks/{Properties-D_KzDN9K.js → Properties-D15c8NP-.js} +53 -47
  94. package/dist/chunks/Properties-D15c8NP-.js.map +1 -0
  95. package/dist/chunks/PropertyField-CV_Gw57S.js +686 -0
  96. package/dist/chunks/PropertyField-CV_Gw57S.js.map +1 -0
  97. package/dist/chunks/{RadioGroup-Bh4-12e-.js → RadioGroup-4dbzqvGy.js} +2 -2
  98. package/dist/chunks/{RadioGroup-Bh4-12e-.js.map → RadioGroup-4dbzqvGy.js.map} +1 -1
  99. package/dist/chunks/{RangeSlider-BKRRTPTZ.js → RangeSlider-BxokZViJ.js} +8 -8
  100. package/dist/chunks/RangeSlider-BxokZViJ.js.map +1 -0
  101. package/dist/chunks/RecentColorsProvider-DHcfk25u.js +84 -0
  102. package/dist/chunks/RecentColorsProvider-DHcfk25u.js.map +1 -0
  103. package/dist/chunks/ResizeHandle-CbAgCQOt.js +81 -0
  104. package/dist/chunks/ResizeHandle-CbAgCQOt.js.map +1 -0
  105. package/dist/chunks/Select-BppLsJTz.js +236 -0
  106. package/dist/chunks/Select-BppLsJTz.js.map +1 -0
  107. package/dist/chunks/SelectionPanel-Cm1qu-ZX.js +107 -0
  108. package/dist/chunks/SelectionPanel-Cm1qu-ZX.js.map +1 -0
  109. package/dist/chunks/SidebarPanel-AXQ0jRDx.js +53 -0
  110. package/dist/chunks/SidebarPanel-AXQ0jRDx.js.map +1 -0
  111. package/dist/chunks/Slider-Cl5RCeZ7.js +389 -0
  112. package/dist/chunks/Slider-Cl5RCeZ7.js.map +1 -0
  113. package/dist/chunks/{StatusBar-DzoPDY4k.js → StatusBar-Ca9Dvhhq.js} +6 -6
  114. package/dist/chunks/StatusBar-Ca9Dvhhq.js.map +1 -0
  115. package/dist/chunks/SwatchGrid-9ZPiDmxd.js +78 -0
  116. package/dist/chunks/SwatchGrid-9ZPiDmxd.js.map +1 -0
  117. package/dist/chunks/SwatchStrip-Cw0l8Om7.js +577 -0
  118. package/dist/chunks/SwatchStrip-Cw0l8Om7.js.map +1 -0
  119. package/dist/chunks/ThemeSwitcher-DiBmMh_B.js +38 -0
  120. package/dist/chunks/ThemeSwitcher-DiBmMh_B.js.map +1 -0
  121. package/dist/chunks/{Timeline--58F7MED.js → Timeline-pqnYk5cV.js} +296 -294
  122. package/dist/chunks/Timeline-pqnYk5cV.js.map +1 -0
  123. package/dist/chunks/Toast-C3ozq11V.js +170 -0
  124. package/dist/chunks/Toast-C3ozq11V.js.map +1 -0
  125. package/dist/chunks/{ToggleBar-DTjGeS0Q.js → ToggleBar-Z2jZiguF.js} +13 -15
  126. package/dist/chunks/ToggleBar-Z2jZiguF.js.map +1 -0
  127. package/dist/chunks/{TokenPanel-CMq7uydV.js → TokenPanel-DAkL6vwQ.js} +33 -33
  128. package/dist/chunks/TokenPanel-DAkL6vwQ.js.map +1 -0
  129. package/dist/chunks/{ToolButton-CR4sQlxF.js → ToolButton-BURp4YIO.js} +12 -14
  130. package/dist/chunks/ToolButton-BURp4YIO.js.map +1 -0
  131. package/dist/chunks/{ToolOptionsBar-CtzTlaN2.js → ToolOptionsBar-COsTJ1cu.js} +9 -7
  132. package/dist/chunks/ToolOptionsBar-COsTJ1cu.js.map +1 -0
  133. package/dist/chunks/{ToolPalette-CKG9qY6P.js → ToolPalette-DKDFWOX-.js} +8 -10
  134. package/dist/chunks/ToolPalette-DKDFWOX-.js.map +1 -0
  135. package/dist/chunks/{Tooltip-Clg2mhSt.js → Tooltip-C6eFCYxw.js} +2 -2
  136. package/dist/chunks/{Tooltip-Clg2mhSt.js.map → Tooltip-C6eFCYxw.js.map} +1 -1
  137. package/dist/chunks/{Tree-DVOtc9R5.js → Tree-Cc8lIzgM.js} +2 -2
  138. package/dist/chunks/Tree-Cc8lIzgM.js.map +1 -0
  139. package/dist/chunks/checkbox.module-DLQV9tMX.js +5 -0
  140. package/dist/chunks/checkbox.module-DLQV9tMX.js.map +1 -0
  141. package/dist/chunks/{createKeyframeLayer-Czj6Y235.js → createKeyframeLayer-BTa4LyJE.js} +208 -223
  142. package/dist/chunks/createKeyframeLayer-BTa4LyJE.js.map +1 -0
  143. package/dist/chunks/field.module-Bh7BTKMh.js +15 -0
  144. package/dist/chunks/field.module-Bh7BTKMh.js.map +1 -0
  145. package/dist/chunks/formatShortcut-DRQrVThu.js.map +1 -1
  146. package/dist/chunks/handles-CqVANLtu.js +17 -0
  147. package/dist/chunks/handles-CqVANLtu.js.map +1 -0
  148. package/dist/chunks/{icons-Dk8SRS8g.js → icons-Dr2-r30x.js} +2 -2
  149. package/dist/chunks/icons-Dr2-r30x.js.map +1 -0
  150. package/dist/chunks/listbox.module-BcdVJMbm.js +8 -0
  151. package/dist/chunks/listbox.module-BcdVJMbm.js.map +1 -0
  152. package/dist/chunks/model-B1-gMBIW.js +386 -0
  153. package/dist/chunks/model-B1-gMBIW.js.map +1 -0
  154. package/dist/chunks/{portalHost-yTOVuCej.js → portalHost-CE70wLzo.js} +10 -6
  155. package/dist/chunks/portalHost-CE70wLzo.js.map +1 -0
  156. package/dist/chunks/prefField-BE_Ytr2H.js +229 -0
  157. package/dist/chunks/prefField-BE_Ytr2H.js.map +1 -0
  158. package/dist/chunks/{segmentTooltip-CStYHKzd.js → segmentTooltip-CGxCOWNz.js} +2 -2
  159. package/dist/chunks/{segmentTooltip-CStYHKzd.js.map → segmentTooltip-CGxCOWNz.js.map} +1 -1
  160. package/dist/chunks/segmentedControl.module-BzGXUL5G.js +11 -0
  161. package/dist/chunks/segmentedControl.module-BzGXUL5G.js.map +1 -0
  162. package/dist/chunks/useReorderDragList-CStYKjHl.js +133 -0
  163. package/dist/chunks/useReorderDragList-CStYKjHl.js.map +1 -0
  164. package/dist/chunks/useRovingTabIndex-D7u22Ia_.js +91 -0
  165. package/dist/chunks/useRovingTabIndex-D7u22Ia_.js.map +1 -0
  166. package/dist/components/ActionBar/ActionBar.d.ts.map +1 -1
  167. package/dist/components/ActionBar/index.js +1 -1
  168. package/dist/components/Badge/bases/ChamferedRect.d.ts.map +1 -1
  169. package/dist/components/Badge/bases/Powerline.d.ts.map +1 -1
  170. package/dist/components/Badge/bases/edgeProfiles.d.ts +31 -4
  171. package/dist/components/Badge/bases/edgeProfiles.d.ts.map +1 -1
  172. package/dist/components/Badge/index.d.ts +1 -0
  173. package/dist/components/Badge/index.d.ts.map +1 -1
  174. package/dist/components/Badge/index.js +3 -2
  175. package/dist/components/Badge/statusIcons.d.ts +5 -0
  176. package/dist/components/Badge/statusIcons.d.ts.map +1 -0
  177. package/dist/components/BandEditor/BandEditor.d.ts +17 -7
  178. package/dist/components/BandEditor/BandEditor.d.ts.map +1 -1
  179. package/dist/components/BandEditor/bands.d.ts +5 -2
  180. package/dist/components/BandEditor/bands.d.ts.map +1 -1
  181. package/dist/components/BandEditor/index.js +1 -1
  182. package/dist/components/Button/index.js +1 -1
  183. package/dist/components/ButtonBar/ButtonBar.d.ts.map +1 -1
  184. package/dist/components/ButtonBar/index.js +1 -1
  185. package/dist/components/Callout/Callout.d.ts +2 -2
  186. package/dist/components/Callout/Callout.d.ts.map +1 -1
  187. package/dist/components/Callout/index.js +1 -1
  188. package/dist/components/Checkbox/Checkbox.d.ts +28 -13
  189. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
  190. package/dist/components/Checkbox/index.js +1 -1
  191. package/dist/components/CloseButton/CloseButton.d.ts +21 -0
  192. package/dist/components/CloseButton/CloseButton.d.ts.map +1 -0
  193. package/dist/components/CloseButton/index.d.ts +3 -0
  194. package/dist/components/CloseButton/index.d.ts.map +1 -0
  195. package/dist/components/CloseButton/index.js +2 -0
  196. package/dist/components/ColorField/ColorField.d.ts +5 -1
  197. package/dist/components/ColorField/ColorField.d.ts.map +1 -1
  198. package/dist/components/ColorField/OpacityRange.d.ts +18 -0
  199. package/dist/components/ColorField/OpacityRange.d.ts.map +1 -0
  200. package/dist/components/ColorField/index.js +1 -1
  201. package/dist/components/ColorModeControl/index.js +1 -1
  202. package/dist/components/ComboBox/ComboBox.d.ts +7 -0
  203. package/dist/components/ComboBox/ComboBox.d.ts.map +1 -1
  204. package/dist/components/ComboBox/index.js +1 -1
  205. package/dist/components/CurveEditor/CurveEditor.d.ts.map +1 -1
  206. package/dist/components/CurveEditor/LayeredCurveEditor.d.ts.map +1 -1
  207. package/dist/components/CurveEditor/index.js +2 -2
  208. package/dist/components/DataGrid/index.js +1 -1
  209. package/dist/components/DetailList/DetailList.d.ts +31 -5
  210. package/dist/components/DetailList/DetailList.d.ts.map +1 -1
  211. package/dist/components/DetailList/index.d.ts +1 -1
  212. package/dist/components/DetailList/index.d.ts.map +1 -1
  213. package/dist/components/DetailList/index.js +1 -1
  214. package/dist/components/DetentSlider/index.js +1 -1
  215. package/dist/components/Dialog/Dialog.d.ts.map +1 -1
  216. package/dist/components/Dialog/index.js +1 -1
  217. package/dist/components/Disclosure/Disclosure.d.ts +1 -1
  218. package/dist/components/Disclosure/index.js +1 -1
  219. package/dist/components/DragGhost/index.js +1 -1
  220. package/dist/components/{DragHandleGlyph/DragHandleGlyph.d.ts → DragGrip/DragGrip.d.ts} +4 -4
  221. package/dist/components/DragGrip/DragGrip.d.ts.map +1 -0
  222. package/dist/components/DragGrip/index.d.ts +3 -0
  223. package/dist/components/DragGrip/index.d.ts.map +1 -0
  224. package/dist/components/DragGrip/index.js +2 -0
  225. package/dist/components/FallthroughDiagram/FallthroughDiagram.d.ts +14 -0
  226. package/dist/components/FallthroughDiagram/FallthroughDiagram.d.ts.map +1 -0
  227. package/dist/components/FallthroughDiagram/fixtures.d.ts +17 -0
  228. package/dist/components/FallthroughDiagram/fixtures.d.ts.map +1 -0
  229. package/dist/components/FallthroughDiagram/index.d.ts +3 -0
  230. package/dist/components/FallthroughDiagram/index.d.ts.map +1 -0
  231. package/dist/components/FallthroughDiagram/index.js +2 -0
  232. package/dist/components/Field/index.js +1 -1
  233. package/dist/components/FillStrokeSwatch/FillStrokeSwatch.d.ts.map +1 -1
  234. package/dist/components/FillStrokeSwatch/index.js +1 -1
  235. package/dist/components/FontFamilySelect/FontFamilySelect.d.ts +20 -0
  236. package/dist/components/FontFamilySelect/FontFamilySelect.d.ts.map +1 -1
  237. package/dist/components/FontFamilySelect/index.js +1 -1
  238. package/dist/components/FontWeightSelect/FontWeightSelect.d.ts +26 -0
  239. package/dist/components/FontWeightSelect/FontWeightSelect.d.ts.map +1 -0
  240. package/dist/components/FontWeightSelect/index.d.ts +3 -0
  241. package/dist/components/FontWeightSelect/index.d.ts.map +1 -0
  242. package/dist/components/FontWeightSelect/index.js +2 -0
  243. package/dist/components/GestureRoute/GestureRoute.d.ts +19 -0
  244. package/dist/components/GestureRoute/GestureRoute.d.ts.map +1 -0
  245. package/dist/components/GestureRoute/index.d.ts +3 -0
  246. package/dist/components/GestureRoute/index.d.ts.map +1 -0
  247. package/dist/components/GestureRoute/index.js +2 -0
  248. package/dist/components/GradientEditor/GradientEditor.d.ts +22 -8
  249. package/dist/components/GradientEditor/GradientEditor.d.ts.map +1 -1
  250. package/dist/components/GradientEditor/GradientHandles.d.ts +1 -8
  251. package/dist/components/GradientEditor/GradientHandles.d.ts.map +1 -1
  252. package/dist/components/GradientEditor/SceneGradientHandles.d.ts +7 -5
  253. package/dist/components/GradientEditor/SceneGradientHandles.d.ts.map +1 -1
  254. package/dist/components/GradientEditor/handleOverlay.d.ts +41 -0
  255. package/dist/components/GradientEditor/handleOverlay.d.ts.map +1 -0
  256. package/dist/components/GradientEditor/index.js +1 -1
  257. package/dist/components/InlineRange/index.js +1 -1
  258. package/dist/components/Input/Input.d.ts +1 -1
  259. package/dist/components/Input/Input.d.ts.map +1 -1
  260. package/dist/components/Input/index.js +1 -1
  261. package/dist/components/ItemList/ItemList.d.ts +32 -31
  262. package/dist/components/ItemList/ItemList.d.ts.map +1 -1
  263. package/dist/components/ItemList/index.js +1 -1
  264. package/dist/components/Jog/index.js +1 -1
  265. package/dist/components/Keycaps/Keycaps.d.ts +11 -5
  266. package/dist/components/Keycaps/Keycaps.d.ts.map +1 -1
  267. package/dist/components/Keycaps/index.d.ts +1 -1
  268. package/dist/components/Keycaps/index.d.ts.map +1 -1
  269. package/dist/components/Keycaps/index.js +1 -1
  270. package/dist/components/LayerList/LayerList.d.ts +1 -1
  271. package/dist/components/LayerList/LayerList.d.ts.map +1 -1
  272. package/dist/components/LayerList/index.js +1 -1
  273. package/dist/components/ListEditor/ListEditor.d.ts.map +1 -1
  274. package/dist/components/ListEditor/index.js +1 -1
  275. package/dist/components/MenuButton/MenuButton.d.ts.map +1 -1
  276. package/dist/components/MenuButton/index.js +1 -1
  277. package/dist/components/MeshEditor/MeshEditor.d.ts +4 -3
  278. package/dist/components/MeshEditor/MeshEditor.d.ts.map +1 -1
  279. package/dist/components/MeshEditor/MeshHandles.d.ts +38 -0
  280. package/dist/components/MeshEditor/MeshHandles.d.ts.map +1 -0
  281. package/dist/components/MeshEditor/index.d.ts +2 -0
  282. package/dist/components/MeshEditor/index.d.ts.map +1 -1
  283. package/dist/components/MeshEditor/index.js +2 -2
  284. package/dist/components/NumberField/NumberField.d.ts +1 -1
  285. package/dist/components/NumberField/NumberField.d.ts.map +1 -1
  286. package/dist/components/NumberField/UnitField.d.ts +20 -7
  287. package/dist/components/NumberField/UnitField.d.ts.map +1 -1
  288. package/dist/components/NumberField/index.js +1 -1
  289. package/dist/components/OptionsBar/OptionsBar.d.ts.map +1 -1
  290. package/dist/components/OptionsBar/index.js +1 -1
  291. package/dist/components/PaintField/PaintField.d.ts.map +1 -1
  292. package/dist/components/PaintField/index.js +1 -1
  293. package/dist/components/PaintInput/PaintInput.d.ts.map +1 -1
  294. package/dist/components/PaintInput/index.js +1 -1
  295. package/dist/components/PatternPicker/PatternPicker.d.ts +6 -5
  296. package/dist/components/PatternPicker/PatternPicker.d.ts.map +1 -1
  297. package/dist/components/PatternPicker/index.js +1 -1
  298. package/dist/components/Plot2D/index.js +1 -1
  299. package/dist/components/PointPlotter/index.js +1 -1
  300. package/dist/components/Powerline/index.d.ts +1 -1
  301. package/dist/components/Powerline/index.d.ts.map +1 -1
  302. package/dist/components/Powerline/index.js +2 -2
  303. package/dist/components/Prefs/PrefsForm.d.ts +8 -0
  304. package/dist/components/Prefs/PrefsForm.d.ts.map +1 -1
  305. package/dist/components/Prefs/PrefsRail.d.ts +3 -2
  306. package/dist/components/Prefs/PrefsRail.d.ts.map +1 -1
  307. package/dist/components/Prefs/PrefsRow.d.ts.map +1 -1
  308. package/dist/components/Prefs/index.d.ts +1 -1
  309. package/dist/components/Prefs/index.d.ts.map +1 -1
  310. package/dist/components/Prefs/index.js +2 -2
  311. package/dist/components/Prefs/prefField.d.ts +13 -0
  312. package/dist/components/Prefs/prefField.d.ts.map +1 -1
  313. package/dist/components/Prefs/schema.d.ts +2 -2
  314. package/dist/components/Prefs/schema.d.ts.map +1 -1
  315. package/dist/components/Properties/PropertyField.d.ts +35 -32
  316. package/dist/components/Properties/PropertyField.d.ts.map +1 -1
  317. package/dist/components/Properties/PropertyGroup.d.ts.map +1 -1
  318. package/dist/components/Properties/PropertyPanel.d.ts +1 -8
  319. package/dist/components/Properties/PropertyPanel.d.ts.map +1 -1
  320. package/dist/components/Properties/index.d.ts +1 -1
  321. package/dist/components/Properties/index.d.ts.map +1 -1
  322. package/dist/components/Properties/index.js +3 -3
  323. package/dist/components/RadioGroup/index.js +1 -1
  324. package/dist/components/RangeSlider/index.js +1 -1
  325. package/dist/components/RecentColors/RecentColorsProvider.d.ts +24 -0
  326. package/dist/components/RecentColors/RecentColorsProvider.d.ts.map +1 -0
  327. package/dist/components/RecentColors/index.d.ts +5 -0
  328. package/dist/components/RecentColors/index.d.ts.map +1 -0
  329. package/dist/components/RecentColors/index.js +2 -0
  330. package/dist/components/RecentColors/recentColors.d.ts +39 -0
  331. package/dist/components/RecentColors/recentColors.d.ts.map +1 -0
  332. package/dist/components/ResizeHandle/ResizeHandle.d.ts.map +1 -1
  333. package/dist/components/ResizeHandle/index.js +1 -1
  334. package/dist/components/Select/Select.d.ts +6 -2
  335. package/dist/components/Select/Select.d.ts.map +1 -1
  336. package/dist/components/Select/index.js +1 -1
  337. package/dist/components/SelectionPanel/SelectionPanel.d.ts.map +1 -1
  338. package/dist/components/SelectionPanel/index.js +2 -2
  339. package/dist/components/SelectionPanel/renderLeaf.d.ts +17 -0
  340. package/dist/components/SelectionPanel/renderLeaf.d.ts.map +1 -1
  341. package/dist/components/SidebarPanel/SidebarPanel.d.ts +1 -1
  342. package/dist/components/SidebarPanel/SidebarPanel.d.ts.map +1 -1
  343. package/dist/components/SidebarPanel/index.js +1 -1
  344. package/dist/components/Slider/Slider.d.ts +19 -2
  345. package/dist/components/Slider/Slider.d.ts.map +1 -1
  346. package/dist/components/Slider/index.js +1 -1
  347. package/dist/components/StatusBar/index.js +1 -1
  348. package/dist/components/SwatchGrid/SwatchGrid.d.ts.map +1 -1
  349. package/dist/components/SwatchGrid/index.js +1 -1
  350. package/dist/components/SwatchStrip/SwatchStrip.d.ts +44 -0
  351. package/dist/components/SwatchStrip/SwatchStrip.d.ts.map +1 -0
  352. package/dist/components/SwatchStrip/index.d.ts +5 -0
  353. package/dist/components/SwatchStrip/index.d.ts.map +1 -0
  354. package/dist/components/SwatchStrip/index.js +2 -0
  355. package/dist/components/SwatchStrip/palettes.d.ts +21 -0
  356. package/dist/components/SwatchStrip/palettes.d.ts.map +1 -0
  357. package/dist/components/ThemeSwitcher/ThemeSwitcher.d.ts +38 -0
  358. package/dist/components/ThemeSwitcher/ThemeSwitcher.d.ts.map +1 -0
  359. package/dist/components/ThemeSwitcher/index.d.ts +3 -0
  360. package/dist/components/ThemeSwitcher/index.d.ts.map +1 -0
  361. package/dist/components/ThemeSwitcher/index.js +2 -0
  362. package/dist/components/Timeline/AnimatedTimeline.d.ts +1 -0
  363. package/dist/components/Timeline/AnimatedTimeline.d.ts.map +1 -1
  364. package/dist/components/Timeline/EasingPicker.d.ts +3 -0
  365. package/dist/components/Timeline/EasingPicker.d.ts.map +1 -1
  366. package/dist/components/Timeline/LaneGraph.d.ts +1 -1
  367. package/dist/components/Timeline/LaneGraph.d.ts.map +1 -1
  368. package/dist/components/Timeline/Timeline.d.ts +10 -1
  369. package/dist/components/Timeline/Timeline.d.ts.map +1 -1
  370. package/dist/components/Timeline/Transport.d.ts +6 -0
  371. package/dist/components/Timeline/Transport.d.ts.map +1 -1
  372. package/dist/components/Timeline/index.js +1 -1
  373. package/dist/components/Timeline/keys.d.ts +1 -0
  374. package/dist/components/Timeline/keys.d.ts.map +1 -1
  375. package/dist/components/Toast/Toast.d.ts +12 -3
  376. package/dist/components/Toast/Toast.d.ts.map +1 -1
  377. package/dist/components/Toast/index.js +1 -1
  378. package/dist/components/ToggleBar/ToggleBar.d.ts.map +1 -1
  379. package/dist/components/ToggleBar/index.js +1 -1
  380. package/dist/components/TokenPanel/index.js +1 -1
  381. package/dist/components/TokenPanel/tokenTypes.d.ts +1 -0
  382. package/dist/components/TokenPanel/tokenTypes.d.ts.map +1 -1
  383. package/dist/components/ToolButton/ToolButton.d.ts +1 -10
  384. package/dist/components/ToolButton/ToolButton.d.ts.map +1 -1
  385. package/dist/components/ToolButton/index.js +1 -1
  386. package/dist/components/ToolOptionsBar/index.js +1 -1
  387. package/dist/components/ToolPalette/ToolPalette.d.ts +2 -1
  388. package/dist/components/ToolPalette/ToolPalette.d.ts.map +1 -1
  389. package/dist/components/ToolPalette/formatShortcut.d.ts +2 -0
  390. package/dist/components/ToolPalette/formatShortcut.d.ts.map +1 -1
  391. package/dist/components/ToolPalette/index.js +1 -1
  392. package/dist/components/Tooltip/index.js +1 -1
  393. package/dist/components/Tree/Tree.d.ts +27 -26
  394. package/dist/components/Tree/Tree.d.ts.map +1 -1
  395. package/dist/components/Tree/index.js +1 -1
  396. package/dist/components/spin.d.ts +16 -0
  397. package/dist/components/spin.d.ts.map +1 -0
  398. package/dist/components/stanceSurfaces.d.ts.map +1 -1
  399. package/dist/icons/index.d.ts +51 -2
  400. package/dist/icons/index.d.ts.map +1 -1
  401. package/dist/icons/paths.d.ts +12 -0
  402. package/dist/icons/paths.d.ts.map +1 -1
  403. package/dist/index.d.ts +9 -3
  404. package/dist/index.d.ts.map +1 -1
  405. package/dist/index.js +98 -111
  406. package/dist/index.js.map +1 -1
  407. package/dist/overlays/portalHost.d.ts +6 -0
  408. package/dist/overlays/portalHost.d.ts.map +1 -1
  409. package/dist/paintGradientTrack.d.ts +5 -2
  410. package/dist/paintGradientTrack.d.ts.map +1 -1
  411. package/dist/style.css +1 -1
  412. package/dist/useAsyncOptions.d.ts.map +1 -1
  413. package/dist/useReorderDragList.d.ts +1 -1
  414. package/dist/useReorderDragList.d.ts.map +1 -1
  415. package/dist/useRovingTabIndex.d.ts +40 -39
  416. package/dist/useRovingTabIndex.d.ts.map +1 -1
  417. package/package.json +9 -8
  418. package/dist/chunks/ActionBar-DCq16yFA.js +0 -57
  419. package/dist/chunks/ActionBar-DCq16yFA.js.map +0 -1
  420. package/dist/chunks/Badge-CyAIZSDo.js.map +0 -1
  421. package/dist/chunks/BandEditor-Dhm_Xrlr.js +0 -248
  422. package/dist/chunks/BandEditor-Dhm_Xrlr.js.map +0 -1
  423. package/dist/chunks/Callout-yEn9iPlh.js +0 -119
  424. package/dist/chunks/Callout-yEn9iPlh.js.map +0 -1
  425. package/dist/chunks/Checkbox-DHXTUHO9.js +0 -47
  426. package/dist/chunks/Checkbox-DHXTUHO9.js.map +0 -1
  427. package/dist/chunks/ColorField-BcMcW8Sa.js +0 -60
  428. package/dist/chunks/ColorField-BcMcW8Sa.js.map +0 -1
  429. package/dist/chunks/ComboBox-DpT8lc3p.js +0 -138
  430. package/dist/chunks/ComboBox-DpT8lc3p.js.map +0 -1
  431. package/dist/chunks/CurveEditor-BDJXjEvK.js.map +0 -1
  432. package/dist/chunks/DataGrid-D-dZj1BD.js.map +0 -1
  433. package/dist/chunks/DetailList-BMER1LUZ.js +0 -43
  434. package/dist/chunks/DetailList-BMER1LUZ.js.map +0 -1
  435. package/dist/chunks/Dialog-BWyNMgpf.js +0 -66
  436. package/dist/chunks/Dialog-BWyNMgpf.js.map +0 -1
  437. package/dist/chunks/Disclosure-0G0uh2fa.js.map +0 -1
  438. package/dist/chunks/DragHandleGlyph-Dr7Fgo0I.js.map +0 -1
  439. package/dist/chunks/Field--onYxXTF.js +0 -32
  440. package/dist/chunks/Field--onYxXTF.js.map +0 -1
  441. package/dist/chunks/FillStrokeSwatch-DNb0KXPk.js +0 -111
  442. package/dist/chunks/FillStrokeSwatch-DNb0KXPk.js.map +0 -1
  443. package/dist/chunks/FontFamilySelect-DXlMKWfK.js.map +0 -1
  444. package/dist/chunks/GradientEditor-B3a-MsVJ.js +0 -335
  445. package/dist/chunks/GradientEditor-B3a-MsVJ.js.map +0 -1
  446. package/dist/chunks/Icon-Cgzy8VgC.js.map +0 -1
  447. package/dist/chunks/InlineRange-eOj6JpJl.js.map +0 -1
  448. package/dist/chunks/Input-CHmkfYaD.js.map +0 -1
  449. package/dist/chunks/ItemList-Cm-HUWCi.js.map +0 -1
  450. package/dist/chunks/Jog-DESxZ44P.js.map +0 -1
  451. package/dist/chunks/Keycaps-C0H_v2gO.js.map +0 -1
  452. package/dist/chunks/LayerList-nz-QYvTF.js.map +0 -1
  453. package/dist/chunks/ListEditor-BQ6AV3Ac.js +0 -74
  454. package/dist/chunks/ListEditor-BQ6AV3Ac.js.map +0 -1
  455. package/dist/chunks/MenuButton-DtaGenKf.js +0 -70
  456. package/dist/chunks/MenuButton-DtaGenKf.js.map +0 -1
  457. package/dist/chunks/MeshEditor-qqGc6hlD.js +0 -87
  458. package/dist/chunks/MeshEditor-qqGc6hlD.js.map +0 -1
  459. package/dist/chunks/NumberField-CwJOMmQR.js +0 -117
  460. package/dist/chunks/NumberField-CwJOMmQR.js.map +0 -1
  461. package/dist/chunks/PaintField-DaJukRc6.js +0 -62
  462. package/dist/chunks/PaintField-DaJukRc6.js.map +0 -1
  463. package/dist/chunks/PaintInput-Byhna3H-.js +0 -131
  464. package/dist/chunks/PaintInput-Byhna3H-.js.map +0 -1
  465. package/dist/chunks/PatternPicker-B-cUt-JT.js +0 -93
  466. package/dist/chunks/PatternPicker-B-cUt-JT.js.map +0 -1
  467. package/dist/chunks/Plot2D-CTXHkL5p.js.map +0 -1
  468. package/dist/chunks/Prefs-DpqFKiwY.js.map +0 -1
  469. package/dist/chunks/Properties-D_KzDN9K.js.map +0 -1
  470. package/dist/chunks/PropertyField-DGCecAnV.js +0 -758
  471. package/dist/chunks/PropertyField-DGCecAnV.js.map +0 -1
  472. package/dist/chunks/RangeSlider-BKRRTPTZ.js.map +0 -1
  473. package/dist/chunks/ResizeHandle-BKT0XYpx.js +0 -79
  474. package/dist/chunks/ResizeHandle-BKT0XYpx.js.map +0 -1
  475. package/dist/chunks/Select-CzyfaXzp.js +0 -225
  476. package/dist/chunks/Select-CzyfaXzp.js.map +0 -1
  477. package/dist/chunks/SelectionPanel-BgUM1h03.js +0 -103
  478. package/dist/chunks/SelectionPanel-BgUM1h03.js.map +0 -1
  479. package/dist/chunks/SidebarPanel-aoIqxbtq.js +0 -55
  480. package/dist/chunks/SidebarPanel-aoIqxbtq.js.map +0 -1
  481. package/dist/chunks/Slider-CFwQYQ10.js +0 -383
  482. package/dist/chunks/Slider-CFwQYQ10.js.map +0 -1
  483. package/dist/chunks/StatusBar-DzoPDY4k.js.map +0 -1
  484. package/dist/chunks/SwatchGrid-BARC3rnF.js +0 -73
  485. package/dist/chunks/SwatchGrid-BARC3rnF.js.map +0 -1
  486. package/dist/chunks/Timeline--58F7MED.js.map +0 -1
  487. package/dist/chunks/Toast-DNBb-24H.js +0 -128
  488. package/dist/chunks/Toast-DNBb-24H.js.map +0 -1
  489. package/dist/chunks/ToggleBar-DTjGeS0Q.js.map +0 -1
  490. package/dist/chunks/TokenPanel-CMq7uydV.js.map +0 -1
  491. package/dist/chunks/ToolButton-CR4sQlxF.js.map +0 -1
  492. package/dist/chunks/ToolOptionsBar-CtzTlaN2.js.map +0 -1
  493. package/dist/chunks/ToolPalette-CKG9qY6P.js.map +0 -1
  494. package/dist/chunks/Tree-DVOtc9R5.js.map +0 -1
  495. package/dist/chunks/createKeyframeLayer-Czj6Y235.js.map +0 -1
  496. package/dist/chunks/icons-Dk8SRS8g.js.map +0 -1
  497. package/dist/chunks/model-Du7Lta4C.js +0 -360
  498. package/dist/chunks/model-Du7Lta4C.js.map +0 -1
  499. package/dist/chunks/number-D3NEx_8r.js +0 -89
  500. package/dist/chunks/number-D3NEx_8r.js.map +0 -1
  501. package/dist/chunks/portalHost-yTOVuCej.js.map +0 -1
  502. package/dist/chunks/prefField-Dnl7nmjQ.js +0 -197
  503. package/dist/chunks/prefField-Dnl7nmjQ.js.map +0 -1
  504. package/dist/chunks/segmentedControl.module-Bv7DEg8f.js +0 -11
  505. package/dist/chunks/segmentedControl.module-Bv7DEg8f.js.map +0 -1
  506. package/dist/chunks/useReorderDragList-B_-5L5Gu.js +0 -131
  507. package/dist/chunks/useReorderDragList-B_-5L5Gu.js.map +0 -1
  508. package/dist/chunks/useRovingTabIndex-Bp_hYm_h.js +0 -65
  509. package/dist/chunks/useRovingTabIndex-Bp_hYm_h.js.map +0 -1
  510. package/dist/components/DragHandleGlyph/DragHandleGlyph.d.ts.map +0 -1
  511. package/dist/components/DragHandleGlyph/index.d.ts +0 -3
  512. package/dist/components/DragHandleGlyph/index.d.ts.map +0 -1
  513. package/dist/components/DragHandleGlyph/index.js +0 -2
  514. package/dist/format/number.d.ts +0 -56
  515. package/dist/format/number.d.ts.map +0 -1
  516. package/dist/icons/ShapeKindIcon.d.ts +0 -10
  517. package/dist/icons/ShapeKindIcon.d.ts.map +0 -1
@@ -1,4 +1,4 @@
1
- import { n as e } from "./CurveEditor-BDJXjEvK.js";
1
+ import { n as e } from "./CurveEditor-jVBEqqdv.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/components/PointPlotter/PointPlotter.tsx
4
4
  function n(n) {
@@ -14,4 +14,4 @@ function n(n) {
14
14
  //#endregion
15
15
  export { n as t };
16
16
 
17
- //# sourceMappingURL=PointPlotter-Bxo6haKe.js.map
17
+ //# sourceMappingURL=PointPlotter-BZ_vk6gV.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PointPlotter-Bxo6haKe.js","names":["CurveEditor","PointPlotter","curveProps","props"],"sources":["../../src/components/PointPlotter/PointPlotter.tsx"],"sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\nimport {\n CurveEditor,\n type AnchorRenderProps,\n type ControlPoint,\n type CurveEditorProps,\n} from '../CurveEditor';\nimport type { GridSettings, AxesSettings, TickSettings } from '../Plot2D';\n\n/** Props for {@link PointPlotter}. */\nexport interface PointPlotterProps {\n /** Plotted points; caller-owned. */\n value: readonly ControlPoint[];\n /** Fires every frame during drag with the live in-flight value. */\n onInput: (next: ControlPoint[]) => void;\n /** Fires once per discrete user action (drag-end, add, delete) with\n * the new value and the value at gesture start. Wire history here. */\n onChange?: (next: ControlPoint[], prev: readonly ControlPoint[]) => void;\n /** Model-space x range. Default [0, 1]. */\n xRange?: readonly [number, number];\n /** Model-space y range. Default [0, 1]. */\n yRange?: readonly [number, number];\n width: number;\n height: number;\n grid?: GridSettings | false | null;\n axes?: AxesSettings | false | null;\n xTicks?: TickSettings | false | null;\n yTicks?: TickSettings | false | null;\n /** Minimum allowed point count. User-initiated deletion is refused\n * while `value.length <= minPoints`. */\n minPoints?: number;\n /** Maximum allowed point count. User-initiated insertion is refused\n * while `value.length >= maxPoints`. */\n maxPoints?: number;\n /** How new points are added. Default `'click-empty'`. Set to `'never'`\n * to disable insertion entirely. */\n addPointMode?: 'click-empty' | 'never';\n /** Built-in undo/redo via keyboard when the component has focus.\n * Default `true`. See `CurveEditor.history` for details. */\n history?: boolean;\n /** Custom per-anchor renderer. See `CurveEditor.renderAnchor`. */\n renderAnchor?: (info: AnchorRenderProps) => ReactNode;\n /** Extra SVG content beneath the anchors. See `CurveEditor.decorations`. */\n decorations?: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * 2D point plotter — a CurveEditor with the curve hidden. Anchors,\n * drag, shift+click delete, right-click delete, and click-empty insert\n * are inherited from CurveEditor verbatim, so the two components share\n * gesture semantics and stay in sync as CurveEditor evolves.\n *\n * Differences from CurveEditor: no curve `<path>` drawn, no fill, no\n * endpoint pinning, no interpolation, default `addPointMode` is\n * `'click-empty'` (CurveEditor defaults to `'click-curve'`, which\n * doesn't make sense without a curve to hit-test against).\n */\nexport function PointPlotter(props: PointPlotterProps) {\n const curveProps: CurveEditorProps = {\n ...props,\n addPointMode: props.addPointMode ?? 'click-empty',\n curve: false,\n fill: false,\n endpoints: 'free',\n };\n return <CurveEditor {...curveProps} />;\n}\n"],"mappings":";;;AA2DA,SAAgBC,EAAa,GAA0B;CACrD,IAAMC,IAA+B;EACnC,GAAGC;EACH,cAAcA,EAAM,gBAAgB;EACpC,OAAO;EACP,MAAM;EACN,WAAW;CACb;CACA,OAAO,kBAACH,GAAD,EAAa,GAAIE,EAAa,CAAA;AACvC"}
1
+ {"version":3,"file":"PointPlotter-BZ_vk6gV.js","names":["CurveEditor","PointPlotter","curveProps","props"],"sources":["../../src/components/PointPlotter/PointPlotter.tsx"],"sourcesContent":["import type { CSSProperties, ReactNode } from 'react';\nimport {\n CurveEditor,\n type AnchorRenderProps,\n type ControlPoint,\n type CurveEditorProps,\n} from '../CurveEditor';\nimport type { GridSettings, AxesSettings, TickSettings } from '../Plot2D';\n\n/** Props for {@link PointPlotter}. */\nexport interface PointPlotterProps {\n /** Plotted points; caller-owned. */\n value: readonly ControlPoint[];\n /** Fires every frame during drag with the live in-flight value. */\n onInput: (next: ControlPoint[]) => void;\n /** Fires once per discrete user action (drag-end, add, delete) with\n * the new value and the value at gesture start. Wire history here. */\n onChange?: (next: ControlPoint[], prev: readonly ControlPoint[]) => void;\n /** Model-space x range. Default [0, 1]. */\n xRange?: readonly [number, number];\n /** Model-space y range. Default [0, 1]. */\n yRange?: readonly [number, number];\n width: number;\n height: number;\n grid?: GridSettings | false | null;\n axes?: AxesSettings | false | null;\n xTicks?: TickSettings | false | null;\n yTicks?: TickSettings | false | null;\n /** Minimum allowed point count. User-initiated deletion is refused\n * while `value.length <= minPoints`. */\n minPoints?: number;\n /** Maximum allowed point count. User-initiated insertion is refused\n * while `value.length >= maxPoints`. */\n maxPoints?: number;\n /** How new points are added. Default `'click-empty'`. Set to `'never'`\n * to disable insertion entirely. */\n addPointMode?: 'click-empty' | 'never';\n /** Built-in undo/redo via keyboard when the component has focus.\n * Default `true`. See `CurveEditor.history` for details. */\n history?: boolean;\n /** Custom per-anchor renderer. See `CurveEditor.renderAnchor`. */\n renderAnchor?: (info: AnchorRenderProps) => ReactNode;\n /** Extra SVG content beneath the anchors. See `CurveEditor.decorations`. */\n decorations?: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * 2D point plotter — a CurveEditor with the curve hidden. Anchors,\n * drag, shift+click delete, right-click delete, and click-empty insert\n * are inherited from CurveEditor verbatim, so the two components share\n * gesture semantics and stay in sync as CurveEditor evolves.\n *\n * Differences from CurveEditor: no curve `<path>` drawn, no fill, no\n * endpoint pinning, no interpolation, default `addPointMode` is\n * `'click-empty'` (CurveEditor defaults to `'click-curve'`, which\n * doesn't make sense without a curve to hit-test against).\n */\nexport function PointPlotter(props: PointPlotterProps) {\n const curveProps: CurveEditorProps = {\n ...props,\n addPointMode: props.addPointMode ?? 'click-empty',\n curve: false,\n fill: false,\n endpoints: 'free',\n };\n return <CurveEditor {...curveProps} />;\n}\n"],"mappings":";;;AA2DA,SAAgBC,EAAa,GAA0B;CACrD,IAAMC,IAA+B;EACnC,GAAGC;EACH,cAAcA,EAAM,gBAAgB;EACpC,OAAO;EACP,MAAM;EACN,WAAW;CACb;CACA,OAAO,kBAACH,GAAD,EAAa,GAAIE,EAAa,CAAA;AACvC"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "./Badge-CyAIZSDo.js";
1
+ import { t as e } from "./Badge-jYQjrTKc.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  var n = {
4
4
  row: "_row_1a09e_1",
@@ -39,4 +39,4 @@ function r({ segments: r, startCap: i = "flat", size: a, variant: o, depth: s, g
39
39
  //#endregion
40
40
  export { r as t };
41
41
 
42
- //# sourceMappingURL=Powerline-ExO5GwEr.js.map
42
+ //# sourceMappingURL=Powerline-6wIFmDik.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Powerline-ExO5GwEr.js","names":["s","Badge","Powerline_module_default","Powerline","rest","cls","className","style","gap","segments","leftEdge","i","startCap","rightEdge","seg","depth","variant","size"],"sources":["../../src/components/Powerline/Powerline.module.css","../../src/components/Powerline/Powerline.tsx"],"sourcesContent":[".row {\n display: inline-flex;\n align-items: stretch;\n gap: var(--powerline-gap, 0.2em);\n}\n\n.matrix {\n display: grid;\n gap: var(--wzl-space-6);\n}\n\n/* Reset Badge's opinionated text defaults — Powerline segments should pick up\n * the surrounding text style instead of forcing uppercase / 10px / extra\n * tracking. Consumers can still override via className on Powerline. */\n.segment {\n font-size: inherit;\n text-transform: none;\n letter-spacing: normal;\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { Badge } from '../Badge/Badge';\nimport type { BadgeSize, BadgeStatus, BadgeVariant } from '../Badge/types';\nimport type { StanceProps } from '../stance';\nimport type { EdgeCap } from '../Badge/bases/edgeProfiles';\nimport s from './Powerline.module.css';\n\n/**\n * One segment of a {@link Powerline}. Giving it `onClick` or `href` makes it\n * interactive, the same way it does on a `Badge`.\n */\nexport interface PowerlineSegment extends StanceProps {\n text: ReactNode;\n /** Cap on this segment's right edge. Next segment's left edge adopts the same profile. */\n endCap?: EdgeCap;\n status?: BadgeStatus;\n variant?: BadgeVariant;\n size?: BadgeSize;\n onClick?: () => void;\n href?: string;\n 'aria-label'?: string;\n}\n\n/** Props for {@link Powerline}. */\nexport interface PowerlineProps {\n segments: PowerlineSegment[];\n /** Left edge of the first segment. Defaults to 'flat'. */\n startCap?: EdgeCap;\n /** Default size for every segment (per-segment `size` wins). */\n size?: BadgeSize;\n /** Default variant for every segment (per-segment `variant` wins). */\n variant?: BadgeVariant;\n /** Protrusion depth in CSS px, passed through to every segment's base. */\n depth?: number;\n /** Visible gap between adjacent segments. Number → px; string → literal CSS length.\n * Default: `0.2em` (scales with the row's font size). Pass `0` for flush. */\n gap?: number | string;\n className?: string;\n 'aria-label'?: string;\n}\n\n/**\n * A row of chevron-linked badge segments, in the style of a shell powerline\n * prompt. Each segment's `endCap` shapes both its own right edge and the next\n * segment's left edge, so the run reads as one continuous chain.\n *\n * Built for showing a path through a sequence of steps — the inspector uses\n * it to display how input routes from tool to gesture to action to target.\n */\nexport function Powerline({\n segments,\n startCap = 'flat',\n size,\n variant,\n depth,\n gap,\n className,\n ...rest\n}: PowerlineProps) {\n const cls = [s.row, className].filter(Boolean).join(' ');\n const style: CSSProperties | undefined = gap !== undefined\n ? { ['--powerline-gap' as never]: typeof gap === 'number' ? `${gap}px` : gap }\n : undefined;\n return (\n <span className={cls} style={style} aria-label={rest['aria-label']}>\n {segments.map((seg, i) => {\n const leftEdge: EdgeCap = i === 0 ? startCap : (segments[i - 1].endCap ?? 'flat');\n const rightEdge: EdgeCap = seg.endCap ?? 'flat';\n return (\n <Badge\n key={i}\n base=\"powerline\"\n baseParams={{ leftEdge, rightEdge, ...(depth !== undefined && { depth }) }}\n status={seg.status}\n stance={seg.stance}\n tone={seg.tone}\n variant={seg.variant ?? variant}\n size={seg.size ?? size}\n onClick={seg.onClick}\n href={seg.href}\n aria-label={seg['aria-label']}\n className={s.segment}\n >\n {seg.text}\n </Badge>\n );\n })}\n </span>\n );\n}\n"],"mappings":";;;;;;;;;ACiDA,SAAgBG,EAAU,EACxB,aACA,cAAW,QACX,SACA,YACA,UACA,QACA,cACA,GAAGC,KACc;CACjB,IAAMC,IAAM,CAACL,EAAE,KAAKM,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,GACjDC,IAAmCC,MAAQ,KAAA,IAE7C,KAAA,IADA,EAAG,mBAA6B,OAAOA,KAAQ,WAAW,GAAGA,EAAI,MAAMA,EAAI;CAE/E,OACE,kBAAC,QAAD;EAAM,WAAWH;EAAY;EAAO,cAAYD,EAAK;EAClD,UAAAK,EAAS,KAAK,GAAK,MAAM;GACxB,IAAMC,IAAoBC,MAAM,IAAIC,IAAYH,EAASE,IAAI,EAAE,CAAC,UAAU,QACpEE,IAAqBC,EAAI,UAAU;GACzC,OACE,kBAACb,GAAD;IAEE,MAAK;IACL,YAAY;KAAE;KAAU;KAAW,GAAIc,MAAU,KAAA,KAAa,EAAE,SAAM;IAAG;IACzE,QAAQD,EAAI;IACZ,QAAQA,EAAI;IACZ,MAAMA,EAAI;IACV,SAASA,EAAI,WAAWE;IACxB,MAAMF,EAAI,QAAQG;IAClB,SAASH,EAAI;IACb,MAAMA,EAAI;IACV,cAAYA,EAAI;IAChB,WAAWd,EAAE;IAEZ,UAAAc,EAAI;GACA,GAdAH,CAcA;EAEX,CAAC;CACG,CAAA;AAEV"}
1
+ {"version":3,"file":"Powerline-6wIFmDik.js","names":["s","Badge","Powerline_module_default","Powerline","rest","cls","className","style","gap","segments","leftEdge","i","startCap","rightEdge","seg","depth","variant","size"],"sources":["../../src/components/Powerline/Powerline.module.css","../../src/components/Powerline/Powerline.tsx"],"sourcesContent":[".row {\n display: inline-flex;\n align-items: stretch;\n gap: var(--powerline-gap, 0.2em);\n}\n\n.matrix {\n display: grid;\n gap: var(--wzl-space-6);\n}\n\n/* Reset Badge's opinionated text defaults — Powerline segments should pick up\n * the surrounding text style instead of forcing uppercase / 10px / extra\n * tracking. Consumers can still override via className on Powerline. */\n.segment {\n font-size: inherit;\n text-transform: none;\n letter-spacing: normal;\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { Badge } from '../Badge/Badge';\nimport type { BadgeSize, BadgeStatus, BadgeVariant } from '../Badge/types';\nimport type { StanceProps } from '../stance';\nimport type { EdgeCap } from '../Badge/bases/edgeProfiles';\nimport s from './Powerline.module.css';\n\n/**\n * One segment of a {@link Powerline}. Giving it `onClick` or `href` makes it\n * interactive, the same way it does on a `Badge`.\n */\nexport interface PowerlineSegment extends StanceProps {\n text: ReactNode;\n /** Cap on this segment's right edge. Next segment's left edge adopts the same profile. */\n endCap?: EdgeCap;\n status?: BadgeStatus;\n variant?: BadgeVariant;\n size?: BadgeSize;\n onClick?: () => void;\n href?: string;\n 'aria-label'?: string;\n}\n\n/** Props for {@link Powerline}. */\nexport interface PowerlineProps {\n segments: PowerlineSegment[];\n /** Left edge of the first segment. Defaults to 'flat'. */\n startCap?: EdgeCap;\n /** Default size for every segment (per-segment `size` wins). */\n size?: BadgeSize;\n /** Default variant for every segment (per-segment `variant` wins). */\n variant?: BadgeVariant;\n /** Protrusion depth in CSS px, passed through to every segment's base. */\n depth?: number;\n /** Visible gap between adjacent segments. Number → px; string → literal CSS length.\n * Default: `0.2em` (scales with the row's font size). Pass `0` for flush. */\n gap?: number | string;\n className?: string;\n 'aria-label'?: string;\n}\n\n/**\n * A row of chevron-linked badge segments, in the style of a shell powerline\n * prompt. Each segment's `endCap` shapes both its own right edge and the next\n * segment's left edge, so the run reads as one continuous chain.\n *\n * Built for showing a path through a sequence of steps — the inspector uses\n * it to display how input routes from tool to gesture to action to target.\n */\nexport function Powerline({\n segments,\n startCap = 'flat',\n size,\n variant,\n depth,\n gap,\n className,\n ...rest\n}: PowerlineProps) {\n const cls = [s.row, className].filter(Boolean).join(' ');\n const style: CSSProperties | undefined = gap !== undefined\n ? { ['--powerline-gap' as never]: typeof gap === 'number' ? `${gap}px` : gap }\n : undefined;\n return (\n <span className={cls} style={style} aria-label={rest['aria-label']}>\n {segments.map((seg, i) => {\n const leftEdge: EdgeCap = i === 0 ? startCap : (segments[i - 1].endCap ?? 'flat');\n const rightEdge: EdgeCap = seg.endCap ?? 'flat';\n return (\n <Badge\n key={i}\n base=\"powerline\"\n baseParams={{ leftEdge, rightEdge, ...(depth !== undefined && { depth }) }}\n status={seg.status}\n stance={seg.stance}\n tone={seg.tone}\n variant={seg.variant ?? variant}\n size={seg.size ?? size}\n onClick={seg.onClick}\n href={seg.href}\n aria-label={seg['aria-label']}\n className={s.segment}\n >\n {seg.text}\n </Badge>\n );\n })}\n </span>\n );\n}\n"],"mappings":";;;;;;;;;ACiDA,SAAgBG,EAAU,EACxB,aACA,cAAW,QACX,SACA,YACA,UACA,QACA,cACA,GAAGC,KACc;CACjB,IAAMC,IAAM,CAACL,EAAE,KAAKM,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,GACjDC,IAAmCC,MAAQ,KAAA,IAE7C,KAAA,IADA,EAAG,mBAA6B,OAAOA,KAAQ,WAAW,GAAGA,EAAI,MAAMA,EAAI;CAE/E,OACE,kBAAC,QAAD;EAAM,WAAWH;EAAY;EAAO,cAAYD,EAAK;EAClD,UAAAK,EAAS,KAAK,GAAK,MAAM;GACxB,IAAMC,IAAoBC,MAAM,IAAIC,IAAYH,EAASE,IAAI,EAAE,CAAC,UAAU,QACpEE,IAAqBC,EAAI,UAAU;GACzC,OACE,kBAACb,GAAD;IAEE,MAAK;IACL,YAAY;KAAE;KAAU;KAAW,GAAIc,MAAU,KAAA,KAAa,EAAE,SAAM;IAAG;IACzE,QAAQD,EAAI;IACZ,QAAQA,EAAI;IACZ,MAAMA,EAAI;IACV,SAASA,EAAI,WAAWE;IACxB,MAAMF,EAAI,QAAQG;IAClB,SAASH,EAAI;IACb,MAAMA,EAAI;IACV,cAAYA,EAAI;IAChB,WAAWd,EAAE;IAEZ,UAAAc,EAAI;GACA,GAdAH,CAcA;EAEX,CAAC;CACG,CAAA;AAEV"}
@@ -1,8 +1,8 @@
1
- import { t as e } from "./Dialog-BWyNMgpf.js";
2
- import { o as t, t as n } from "./PropertyField-DGCecAnV.js";
3
- import { t as r } from "./Input-CHmkfYaD.js";
4
- import { t as i } from "./useRovingTabIndex-Bp_hYm_h.js";
5
- import { a, n as o, o as s, r as c, s as l, t as u } from "./prefField-Dnl7nmjQ.js";
1
+ import { t as e } from "./Dialog-DKfsk5VN.js";
2
+ import { s as t, t as n } from "./PropertyField-CV_Gw57S.js";
3
+ import { t as r } from "./Input-CzwvCZs_.js";
4
+ import { t as i } from "./useRovingTabIndex-D7u22Ia_.js";
5
+ import { a, n as o, o as s, r as c, s as l, t as u } from "./prefField-BE_Ytr2H.js";
6
6
  import { Fragment as d, jsx as f, jsxs as p } from "react/jsx-runtime";
7
7
  import { useCallback as m, useEffect as h, useMemo as g, useRef as _, useState as v } from "react";
8
8
  //#region src/useScrollSpy.ts
@@ -67,43 +67,43 @@ function S() {
67
67
  return typeof matchMedia == "function" && matchMedia("(prefers-reduced-motion: reduce)").matches;
68
68
  }
69
69
  var C = {
70
- columns: "_columns_145px_5",
71
- column: "_column_145px_5",
72
- panel: "_panel_145px_23",
73
- subpanel: "_subpanel_145px_34",
74
- groupHeader: "_groupHeader_145px_46",
75
- groupTitle: "_groupTitle_145px_59",
76
- groupDesc: "_groupDesc_145px_68",
77
- rows: "_rows_145px_75",
78
- row: "_row_145px_75",
79
- rowControl: "_rowControl_145px_90",
80
- unrenderable: "_unrenderable_145px_97",
81
- titleRow: "_titleRow_145px_104",
82
- objectLeaf: "_objectLeaf_145px_118",
83
- objectRow: "_objectRow_145px_126",
84
- objectGroup: "_objectGroup_145px_133",
85
- columnsLayout: "_columnsLayout_145px_148",
86
- railLayout: "_railLayout_145px_155",
87
- railBody: "_railBody_145px_168",
88
- rail: "_rail_145px_155",
89
- railList: "_railList_145px_199",
90
- railItem: "_railItem_145px_205",
91
- railSub: "_railSub_145px_229",
92
- railOpen: "_railOpen_145px_234",
93
- railInView: "_railInView_145px_240",
94
- railName: "_railName_145px_245",
95
- railCount: "_railCount_145px_254",
96
- pane: "_pane_145px_23",
97
- paneHead: "_paneHead_145px_268",
98
- paneTitle: "_paneTitle_145px_275",
99
- paneDesc: "_paneDesc_145px_282",
100
- paneSection: "_paneSection_145px_289",
101
- paneSubsection: "_paneSubsection_145px_296",
102
- sectionTitle: "_sectionTitle_145px_305",
103
- subsectionTitle: "_subsectionTitle_145px_323",
104
- filter: "_filter_145px_349",
105
- noMatches: "_noMatches_145px_353",
106
- clearFilter: "_clearFilter_145px_367"
70
+ columns: "_columns_19jbd_5",
71
+ column: "_column_19jbd_5",
72
+ panel: "_panel_19jbd_23",
73
+ subpanel: "_subpanel_19jbd_34",
74
+ groupHeader: "_groupHeader_19jbd_46",
75
+ groupTitle: "_groupTitle_19jbd_59",
76
+ groupDesc: "_groupDesc_19jbd_68",
77
+ rows: "_rows_19jbd_75",
78
+ row: "_row_19jbd_75",
79
+ rowControl: "_rowControl_19jbd_90",
80
+ unrenderable: "_unrenderable_19jbd_97",
81
+ titleRow: "_titleRow_19jbd_104",
82
+ objectLeaf: "_objectLeaf_19jbd_118",
83
+ objectRow: "_objectRow_19jbd_126",
84
+ objectGroup: "_objectGroup_19jbd_133",
85
+ columnsLayout: "_columnsLayout_19jbd_148",
86
+ railLayout: "_railLayout_19jbd_155",
87
+ railBody: "_railBody_19jbd_168",
88
+ rail: "_rail_19jbd_155",
89
+ railList: "_railList_19jbd_208",
90
+ railItem: "_railItem_19jbd_214",
91
+ railSub: "_railSub_19jbd_238",
92
+ railOpen: "_railOpen_19jbd_243",
93
+ railInView: "_railInView_19jbd_249",
94
+ railName: "_railName_19jbd_254",
95
+ railCount: "_railCount_19jbd_263",
96
+ pane: "_pane_19jbd_23",
97
+ paneHead: "_paneHead_19jbd_278",
98
+ paneTitle: "_paneTitle_19jbd_285",
99
+ paneDesc: "_paneDesc_19jbd_292",
100
+ paneSection: "_paneSection_19jbd_299",
101
+ paneSubsection: "_paneSubsection_19jbd_306",
102
+ sectionTitle: "_sectionTitle_19jbd_315",
103
+ subsectionTitle: "_subsectionTitle_19jbd_333",
104
+ filter: "_filter_19jbd_359",
105
+ noMatches: "_noMatches_19jbd_363",
106
+ clearFilter: "_clearFilter_19jbd_377"
107
107
  };
108
108
  //#endregion
109
109
  //#region src/components/Prefs/PrefsRow.tsx
@@ -120,7 +120,6 @@ function w({ ctx: e, path: n, pref: r }) {
120
120
  label: r.name,
121
121
  description: r.description,
122
122
  layout: "inline",
123
- chrome: "framed",
124
123
  className: C.row,
125
124
  children: /* @__PURE__ */ f("span", {
126
125
  className: C.rowControl,
@@ -130,26 +129,40 @@ function w({ ctx: e, path: n, pref: r }) {
130
129
  }
131
130
  function T(e, t) {
132
131
  let { pref: r, value: i, setValue: a } = e;
133
- if (r.kind === "object") return /* @__PURE__ */ f(E, { ctx: e });
132
+ if (r.kind === "object") return /* @__PURE__ */ f(D, { ctx: e });
134
133
  let o = u(r, {
135
134
  value: i,
136
135
  siblings: t,
137
136
  setValue: a
138
137
  });
139
- return o === null ? /* @__PURE__ */ p("span", {
138
+ if (o === null) return /* @__PURE__ */ p("span", {
140
139
  className: C.unrenderable,
141
140
  children: [
142
141
  "(",
143
142
  r.kind,
144
143
  ": no renderer)"
145
144
  ]
146
- }) : /* @__PURE__ */ f(n, {
147
- ...o,
148
- chrome: "framed",
149
- name: r.name
150
145
  });
146
+ switch (o.kind) {
147
+ case "number": return /* @__PURE__ */ f(n, {
148
+ ...o,
149
+ name: r.name,
150
+ onInput: E,
151
+ steppers: o.accepts === void 0
152
+ });
153
+ case "color": return /* @__PURE__ */ f(n, {
154
+ ...o,
155
+ name: r.name,
156
+ onInput: E
157
+ });
158
+ default: return /* @__PURE__ */ f(n, {
159
+ ...o,
160
+ name: r.name
161
+ });
162
+ }
151
163
  }
152
- function E({ ctx: e }) {
164
+ var E = () => {};
165
+ function D({ ctx: e }) {
153
166
  let n = e.pref, { value: r, setValue: i } = e, a = typeof r == "object" && r ? r : void 0, o = (s) => {
154
167
  let l = [];
155
168
  for (let [u, d] of Object.entries(s)) {
@@ -165,7 +178,6 @@ function E({ ctx: e }) {
165
178
  l.push(/* @__PURE__ */ f(t, {
166
179
  label: d.name,
167
180
  layout: "inline",
168
- chrome: "framed",
169
181
  className: C.objectRow,
170
182
  children: /* @__PURE__ */ f("span", {
171
183
  className: C.rowControl,
@@ -195,7 +207,7 @@ function E({ ctx: e }) {
195
207
  }
196
208
  //#endregion
197
209
  //#region src/components/Prefs/PrefsPane.tsx
198
- function D(e) {
210
+ function O(e) {
199
211
  let { ctx: t, group: n, path: r, scrollRef: i, className: a } = e, o = Object.entries(n.children).filter((e) => c(e[1])), s = Object.entries(n.children).filter((e) => !c(e[1])), l = (e) => r === "" ? e : `${r}.${e}`;
200
212
  return /* @__PURE__ */ p("div", {
201
213
  className: [C.pane, a].filter(Boolean).join(" "),
@@ -219,7 +231,7 @@ function D(e) {
219
231
  pref: n
220
232
  }, e))
221
233
  }),
222
- s.map(([e, n]) => /* @__PURE__ */ f(O, {
234
+ s.map(([e, n]) => /* @__PURE__ */ f(k, {
223
235
  ctx: t,
224
236
  group: n,
225
237
  path: l(e),
@@ -228,7 +240,7 @@ function D(e) {
228
240
  ]
229
241
  });
230
242
  }
231
- function O({ ctx: e, group: t, path: n, depth: r }) {
243
+ function k({ ctx: e, group: t, path: n, depth: r }) {
232
244
  let i = r === 0 ? "h4" : "h5";
233
245
  return /* @__PURE__ */ p("section", {
234
246
  className: r === 0 ? C.paneSection : C.paneSubsection,
@@ -251,7 +263,7 @@ function O({ ctx: e, group: t, path: n, depth: r }) {
251
263
  ctx: e,
252
264
  path: a,
253
265
  pref: i
254
- }, t) : /* @__PURE__ */ f(O, {
266
+ }, t) : /* @__PURE__ */ f(k, {
255
267
  ctx: e,
256
268
  group: i,
257
269
  path: a,
@@ -264,13 +276,12 @@ function O({ ctx: e, group: t, path: n, depth: r }) {
264
276
  }
265
277
  //#endregion
266
278
  //#region src/components/Prefs/PrefsRail.tsx
267
- function k(e) {
279
+ function A(e) {
268
280
  let { items: t, section: n, current: r, onOpen: a, onScrollTo: o, ariaLabel: s, header: c, showCounts: l } = e, u = (e) => {
269
281
  let n = t[e];
270
282
  n && (n.depth === 0 ? a(n.path) : o(n.path));
271
283
  }, d = i({
272
- items: t.map(() => ({})),
273
- itemClassName: C.railItem,
284
+ itemSelector: `.${C.railItem}`,
274
285
  tabStopIndex: Math.max(0, t.findIndex((e) => e.path === n))
275
286
  });
276
287
  return /* @__PURE__ */ p("nav", {
@@ -279,8 +290,9 @@ function k(e) {
279
290
  children: [c, /* @__PURE__ */ f("div", {
280
291
  className: C.railList,
281
292
  ref: d.rootRef,
293
+ onKeyDown: d.onKeyDown,
282
294
  children: t.map((e, t) => {
283
- let i = e.depth === 0 && e.path === n, a = e.depth === 1 && e.path === r;
295
+ let i = e.path === n, a = e.depth === 1 && e.path === r;
284
296
  return /* @__PURE__ */ p("button", {
285
297
  type: "button",
286
298
  className: [
@@ -290,8 +302,6 @@ function k(e) {
290
302
  a && C.railInView
291
303
  ].filter(Boolean).join(" "),
292
304
  "aria-current": i ? "page" : a ? "location" : void 0,
293
- tabIndex: d.tabIndexFor(t),
294
- onKeyDown: d.onKeyDown(t),
295
305
  onClick: () => u(t),
296
306
  children: [/* @__PURE__ */ f("span", {
297
307
  className: C.railName,
@@ -307,7 +317,7 @@ function k(e) {
307
317
  }
308
318
  //#endregion
309
319
  //#region src/components/Prefs/PrefsForm.tsx
310
- function A(e) {
320
+ function j(e) {
311
321
  let { schema: t, values: n, onChange: i, renderers: a, showHidden: s = !1, layout: u = "columns", filterable: d = !1, className: m } = e, [h, _] = v(""), y = g(() => {
312
322
  let e = l(t, s);
313
323
  return e === null ? null : o(e, h);
@@ -328,7 +338,7 @@ function A(e) {
328
338
  placeholder: "Filter settings"
329
339
  })
330
340
  }) : null;
331
- return u === "rail" ? /* @__PURE__ */ f(j, {
341
+ return u === "rail" ? /* @__PURE__ */ f(M, {
332
342
  ...e,
333
343
  root: y,
334
344
  ctx: b,
@@ -337,7 +347,7 @@ function A(e) {
337
347
  onClearFilter: () => _("")
338
348
  }) : /* @__PURE__ */ p("div", {
339
349
  className: [C.columnsLayout, m].filter(Boolean).join(" "),
340
- children: [x, y === null ? /* @__PURE__ */ f(N, {
350
+ children: [x, y === null ? /* @__PURE__ */ f(I, {
341
351
  query: h,
342
352
  onClear: () => _("")
343
353
  }) : /* @__PURE__ */ f("div", {
@@ -348,7 +358,7 @@ function A(e) {
348
358
  ctx: b,
349
359
  path: e,
350
360
  pref: t
351
- }) : /* @__PURE__ */ f(P, {
361
+ }) : /* @__PURE__ */ f(L, {
352
362
  ctx: b,
353
363
  group: t,
354
364
  path: e,
@@ -358,39 +368,45 @@ function A(e) {
358
368
  })]
359
369
  });
360
370
  }
361
- function j(e) {
362
- let { schema: t, root: n, ctx: r, query: i, filterField: o, onClearFilter: s, className: c } = e, l = g(() => n === null ? [] : a(n), [n]), [u, d] = v(() => e.defaultSection ?? ""), m = e.section ?? u, h = l.some((e) => e.path === m && e.depth === 0) ? m : l.find((e) => e.depth === 0)?.path ?? "", y = _(null), b = x({
363
- rootRef: y,
364
- ids: g(() => l.filter((e) => e.depth === 1 && e.section === h).map((e) => e.path), [l, h])
365
- }), S = (t) => {
366
- e.section === void 0 && d(t), e.onSectionChange?.(t), y.current?.scrollTo?.({ top: 0 });
367
- }, w = n === null ? null : M(n, h, t.name);
371
+ function M(e) {
372
+ let { schema: t, root: n, ctx: r, query: i, filterField: o, onClearFilter: s, className: c } = e, l = g(() => n === null ? [] : a(n), [n]), [u, d] = v(() => e.defaultSection ?? ""), m = e.subPages === !0, h = e.section ?? u, y = l.some((e) => e.path === h && (e.depth === 0 || m)) ? h : l.find((e) => e.depth === 0)?.path ?? "";
373
+ m && n !== null && !P(N(n, y, t.name)) && (y = l.find((e) => e.depth === 1 && e.section === y)?.path ?? y);
374
+ let b = _(null), S = x({
375
+ rootRef: b,
376
+ ids: g(() => m ? [] : l.filter((e) => e.depth === 1 && e.section === y).map((e) => e.path), [
377
+ l,
378
+ y,
379
+ m
380
+ ])
381
+ }), w = (t) => {
382
+ e.section === void 0 && d(t), e.onSectionChange?.(t), b.current?.scrollTo?.({ top: 0 });
383
+ }, T = n === null ? null : N(n, y, t.name), E = l.some((e) => e.path === y && e.depth === 0), D = m && E && T !== null ? F(T) : T;
368
384
  return /* @__PURE__ */ p("div", {
369
385
  className: [C.railLayout, c].filter(Boolean).join(" "),
370
- children: [/* @__PURE__ */ f(k, {
386
+ children: [/* @__PURE__ */ f(A, {
371
387
  items: l,
372
- section: h,
373
- current: b.active,
374
- onOpen: S,
375
- onScrollTo: b.scrollTo,
388
+ section: y,
389
+ current: m ? null : S.active,
390
+ onOpen: w,
391
+ onScrollTo: m ? w : S.scrollTo,
376
392
  ariaLabel: t.name,
377
393
  header: o,
378
394
  showCounts: i.trim() !== ""
379
- }), w === null ? /* @__PURE__ */ f("div", {
395
+ }), D === null ? /* @__PURE__ */ f("div", {
380
396
  className: C.pane,
381
- children: /* @__PURE__ */ f(N, {
397
+ children: /* @__PURE__ */ f(I, {
382
398
  query: i,
383
399
  onClear: s
384
400
  })
385
- }) : /* @__PURE__ */ f(D, {
401
+ }) : /* @__PURE__ */ f(O, {
386
402
  ctx: r,
387
- group: w,
388
- path: h,
389
- scrollRef: y
403
+ group: D,
404
+ path: y,
405
+ scrollRef: b
390
406
  })]
391
407
  });
392
408
  }
393
- function M(e, t, n) {
409
+ function N(e, t, n) {
394
410
  if (t === "") {
395
411
  let t = Object.fromEntries(Object.entries(e.children).filter(([, e]) => c(e)));
396
412
  return Object.keys(t).length === 0 ? null : {
@@ -407,7 +423,16 @@ function M(e, t, n) {
407
423
  }
408
424
  return r ?? null;
409
425
  }
410
- function N({ query: e, onClear: t }) {
426
+ function P(e) {
427
+ return e !== null && Object.values(e.children).some(c);
428
+ }
429
+ function F(e) {
430
+ return {
431
+ ...e,
432
+ children: Object.fromEntries(Object.entries(e.children).filter(([, e]) => c(e)))
433
+ };
434
+ }
435
+ function I({ query: e, onClear: t }) {
411
436
  return /* @__PURE__ */ p("div", {
412
437
  className: C.noMatches,
413
438
  children: [/* @__PURE__ */ p("p", { children: [
@@ -422,7 +447,7 @@ function N({ query: e, onClear: t }) {
422
447
  })]
423
448
  });
424
449
  }
425
- function P({ ctx: e, group: t, path: n, depth: r }) {
450
+ function L({ ctx: e, group: t, path: n, depth: r }) {
426
451
  return /* @__PURE__ */ p("div", {
427
452
  className: r === 0 ? C.panel : C.subpanel,
428
453
  children: [/* @__PURE__ */ p("div", {
@@ -442,7 +467,7 @@ function P({ ctx: e, group: t, path: n, depth: r }) {
442
467
  ctx: e,
443
468
  path: a,
444
469
  pref: i
445
- }, t) : /* @__PURE__ */ f(P, {
470
+ }, t) : /* @__PURE__ */ f(L, {
446
471
  ctx: e,
447
472
  group: i,
448
473
  path: a,
@@ -454,7 +479,7 @@ function P({ ctx: e, group: t, path: n, depth: r }) {
454
479
  }
455
480
  //#endregion
456
481
  //#region src/components/Prefs/PrefsDialog.tsx
457
- function F(t) {
482
+ function R(t) {
458
483
  let { isOpen: n, onOpenChange: r, title: i, headerExtra: a, footer: o, dialogClassName: s, ...c } = t, l = c.layout === "rail";
459
484
  return /* @__PURE__ */ f(e, {
460
485
  isOpen: n,
@@ -467,10 +492,10 @@ function F(t) {
467
492
  className: C.titleRow,
468
493
  children: [/* @__PURE__ */ f("span", { children: i ?? c.schema.name }), a]
469
494
  }),
470
- children: /* @__PURE__ */ f(A, { ...c })
495
+ children: /* @__PURE__ */ f(j, { ...c })
471
496
  });
472
497
  }
473
498
  //#endregion
474
- export { y as a, D as i, A as n, x as o, k as r, F as t };
499
+ export { y as a, O as i, j as n, x as o, A as r, R as t };
475
500
 
476
- //# sourceMappingURL=Prefs-DpqFKiwY.js.map
501
+ //# sourceMappingURL=Prefs-CkyldX-e.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Prefs-CkyldX-e.js","names":["_Fragment","s","s","s","s","s","Dialog","PropertyRow","PropertyControl","Input","useRovingTabIndex","filterPrefSubtree","prefValueAtPath","isPrefLeaf","visiblePrefSubtree","prefFieldProps","pickActiveSection","active","offsets","top","slack","id","SETTLE_MS","useScrollSpy","options","setActive","useState","heldRef","useRef","timerRef","releaseRef","key","ids","measure","useCallback","root","rootRef","rootTop","el","scrollTo","release","prefersReducedMotion","useEffect","Prefs_module_default","PrefRow","stored","ctx","path","renderCtx","pref","v","custom","control","renderBuiltin","Fragment","ObjectLeaf","field","settledOnly","held","value","objectRows","out","child","children","inner","base","PrefsPane","props","leaves","group","entry","groups","childPath","className","scrollRef","leaf","PaneSection","Heading","depth","p","PrefsRail","activate","item","items","index","onOpen","onScrollTo","roving","i","section","ariaLabel","header","open","inView","current","showCounts","PrefsForm","query","setQuery","useMemo","visible","schema","showHidden","filterable","layout","RailLayout","NoMatches","GroupBody","prefRailItems","uncontrolled","setUncontrolled","subPages","requested","hasLeaves","paneGroup","spy","setOpen","whole","opensTop","leavesOf","filterField","onClearFilter","rootName","node","cursor","seg","next","onClear","PrefsDialog","form","rail","title","dialogClassName","headerExtra"],"sources":["../../src/useScrollSpy.ts","../../src/components/Prefs/Prefs.module.css","../../src/components/Prefs/PrefsRow.tsx","../../src/components/Prefs/PrefsPane.tsx","../../src/components/Prefs/PrefsRail.tsx","../../src/components/Prefs/PrefsForm.tsx","../../src/components/Prefs/PrefsDialog.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState, type RefObject } from 'react';\n\n/** One observed section: its id and its top edge, in the container's\n * coordinates (its `getBoundingClientRect().top` less the container's). */\nexport interface SectionOffset {\n id: string;\n top: number;\n}\n\n/**\n * The section a reader is looking at: the last one whose top edge has passed\n * the container's, within `slack` of it so a heading flush with the top counts\n * as arrived. Null until one has — the settings above the first section belong\n * to the group itself, and marking a section the reader has not reached yet\n * points them at the wrong place.\n *\n * Offsets arrive in document order and are not re-sorted — a caller reading\n * them off the DOM already has them that way, and sorting would hide a\n * measurement that came back wrong.\n */\nexport function pickActiveSection(\n offsets: readonly SectionOffset[],\n slack = 8,\n): string | null {\n let active: string | null = null;\n for (const { id, top } of offsets) {\n if (top - slack > 0) break;\n active = id;\n }\n return active;\n}\n\n/** Options for {@link useScrollSpy}. */\nexport interface UseScrollSpyOptions {\n /** The scrolling element holding the sections. */\n rootRef: RefObject<HTMLElement | null>;\n /** Section element ids, in document order. */\n ids: readonly string[];\n /** Pixels of tolerance at the container's top edge. */\n slack?: number;\n}\n\n/** What {@link useScrollSpy} returns. */\nexport interface ScrollSpy {\n /** Id of the section in view, or null before anything is measured. */\n active: string | null;\n /**\n * Scroll `id` to the container's top and hold that answer until the scroll\n * settles. Without the hold, the scroll the click causes is observed on its\n * way past every intervening section and the rail flickers through them.\n */\n scrollTo: (id: string) => void;\n}\n\n/** How long to keep a programmatic scroll's answer when `scrollend` never\n * arrives — Safari and Firefox have not shipped it. Comfortably longer than a\n * smooth scroll, short enough that a reader who then scrolls by hand is not\n * left looking at a stale highlight. */\nconst SETTLE_MS = 700;\n\n/**\n * Which of a scrolling container's sections is in view, for a navigation rail\n * that follows the reader. Positions are read on the container's own `scroll`\n * event — already throttled to the frame by the browser — rather than through\n * `IntersectionObserver`, so the decision stays a pure function of measured\n * offsets ({@link pickActiveSection}) and is testable apart from the DOM.\n */\nexport function useScrollSpy(options: UseScrollSpyOptions): ScrollSpy {\n const { rootRef, ids, slack } = options;\n const [active, setActive] = useState<string | null>(null);\n // Set while a programmatic scroll runs: what to report, instead of what the\n // moving container would say.\n const heldRef = useRef<string | null>(null);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const releaseRef = useRef<(() => void) | null>(null);\n const key = ids.join('\\u0000');\n\n const measure = useCallback((): void => {\n const root = rootRef.current;\n if (!root) return;\n if (heldRef.current !== null) {\n setActive(heldRef.current);\n return;\n }\n const rootTop = root.getBoundingClientRect().top;\n const offsets: SectionOffset[] = [];\n for (const id of ids) {\n const el = root.querySelector<HTMLElement>(`[data-spy-section=\"${CSS.escape(id)}\"]`);\n if (el) offsets.push({ id, top: el.getBoundingClientRect().top - rootTop });\n }\n setActive(pickActiveSection(offsets, slack));\n // `ids` is compared by content through `key`: a caller deriving the array\n // each render would otherwise resubscribe on every one.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rootRef, key, slack]);\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n measure();\n root.addEventListener('scroll', measure, { passive: true });\n return () => root.removeEventListener('scroll', measure);\n }, [rootRef, measure]);\n\n const scrollTo = useCallback((id: string): void => {\n const root = rootRef.current;\n if (!root) return;\n const el = root.querySelector<HTMLElement>(`[data-spy-section=\"${CSS.escape(id)}\"]`);\n heldRef.current = id;\n setActive(id);\n const release = (): void => {\n heldRef.current = null;\n root.removeEventListener('scrollend', release);\n measure();\n };\n // A scroll interrupted by the next one would otherwise leave its\n // `scrollend` listener behind to fire against a later scroll.\n releaseRef.current?.();\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n releaseRef.current = release;\n timerRef.current = setTimeout(release, SETTLE_MS);\n root.addEventListener('scrollend', release);\n if (!el) return;\n const top = el.getBoundingClientRect().top - root.getBoundingClientRect().top + root.scrollTop;\n root.scrollTo?.({ top, behavior: prefersReducedMotion() ? 'auto' : 'smooth' });\n }, [rootRef, measure]);\n\n useEffect(() => () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n releaseRef.current?.();\n }, []);\n\n return { active, scrollTo };\n}\n\nfunction prefersReducedMotion(): boolean {\n return typeof matchMedia === 'function'\n && matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n","/* Ported from WeaselDraw's wd-prefs-* rules (apps/draw/src/app.css),\n * generalized onto theme tokens. Column width is overridable via\n * --wzl-prefs-column-width at any ancestor scope. */\n\n.columns {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: var(--wzl-space-6);\n overflow-y: auto;\n padding-right: var(--wzl-space-2);\n}\n\n.column {\n flex: 0 0 var(--wzl-prefs-column-width, 300px);\n width: var(--wzl-prefs-column-width, 300px);\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-4);\n}\n\n.panel {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-4);\n padding: var(--wzl-space-5);\n background: var(--wzl-surface-sunken);\n border: 1px solid var(--wzl-border);\n border-radius: var(--wzl-radius-sm);\n --wzl-input-surface: var(--wzl-surface);\n}\n\n.subpanel {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-3);\n margin-top: var(--wzl-space-3);\n padding: var(--wzl-space-4) var(--wzl-space-4) var(--wzl-space-4) var(--wzl-space-5);\n background: var(--wzl-surface-sunken);\n border-left: 2px solid var(--wzl-border);\n border-radius: var(--wzl-radius-sm);\n --wzl-input-surface: var(--wzl-surface);\n}\n\n.groupHeader {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-1);\n padding-bottom: var(--wzl-space-2);\n border-bottom: 1px solid var(--wzl-border);\n}\n\n.subpanel .groupHeader {\n border-bottom: none;\n padding-bottom: var(--wzl-space-1);\n}\n\n.groupTitle {\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n font-weight: var(--wzl-font-weight-bold);\n color: var(--wzl-fg);\n letter-spacing: var(--wzl-params-label-tracking, var(--wzl-tracking-wider));\n text-transform: var(--wzl-params-label-case, uppercase);\n}\n\n.groupDesc {\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n color: var(--wzl-fg-subtle);\n line-height: 1.35;\n}\n\n.rows {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-3);\n}\n\n/* A leaf's row is a PropertyRow, inline; this only sets the form's type. */\n.row {\n font-size: var(--wzl-font-size-sm);\n color: var(--wzl-fg);\n cursor: default;\n}\n\n/* Control slot — fixed width so the label can take the rest of the row.\n * Kit form controls render as block-level flex columns that fill it. */\n.rowControl {\n flex: 0 0 110px;\n min-width: 0;\n display: flex;\n align-items: center;\n}\n\n.unrenderable {\n font-family: var(--wzl-font-mono);\n font-size: var(--wzl-font-size-sm);\n color: var(--wzl-fg-subtle);\n}\n\n/* PrefsDialog header row: title text + optional headerExtra chrome. */\n.titleRow {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-6);\n flex: 1;\n min-width: 0;\n}\n\n.titleRow > span:first-child {\n flex: 1;\n min-width: 0;\n}\n\n/* An object leaf renders its fields as its own rows. */\n.objectLeaf {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-3);\n inline-size: 100%;\n}\n\n/* Outranks the PropertyRow it styles, which is a flex row. */\n.objectLeaf .objectRow {\n display: grid;\n grid-template-columns: 96px 1fr;\n gap: var(--wzl-space-4);\n align-items: center;\n}\n\n.objectGroup {\n margin: var(--wzl-space-2) 0 0;\n font-size: var(--wzl-font-size-xs);\n font-weight: var(--wzl-font-weight-bold);\n text-transform: var(--wzl-params-label-case, uppercase);\n letter-spacing: var(--wzl-params-label-tracking, var(--wzl-tracking-wide));\n opacity: 0.55;\n}\n\n/* ---------------------------------------------------------------------------\n * Rail layout. The rail is the only chrome: no panels, because the surface\n * the form sits on already has a border and a card inside it restates one.\n * Width is overridable via --wzl-prefs-rail-width at any ancestor scope.\n * ------------------------------------------------------------------------ */\n\n.columnsLayout {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-4);\n min-height: 0;\n}\n\n.railLayout {\n display: flex;\n flex-direction: row;\n align-items: stretch;\n min-height: 0;\n block-size: 100%;\n /* The pane scrolls, not the layout: a rail that scrolled away with the\n settings would be useless exactly when it is needed. */\n overflow: hidden;\n}\n\n/* What `PrefsDialog` hands `Dialog` for its body in rail layout: the pane\n inside does the scrolling and the rail meets the dialog's own edges. */\n.railBody {\n padding: 0;\n overflow: hidden;\n /* The modal sets only `max-height`, so the layout's `block-size: 100%`\n resolves against nothing and the pane grows to fit every row. As a flex\n item the layout takes the body's flexed height, which the cap does bound. */\n display: flex;\n flex-direction: column;\n /* A settled height: without one the dialog grows and shrinks as the reader\n moves between a two-row group and a twenty-row one, and the rail entry\n they are aiming at moves while they aim at it. */\n min-block-size: min(60vh, 420px);\n /* Same reason across: a filter that narrows the schema to two rows should\n not pull the dialog's edges in around them. */\n min-inline-size: min(760px, 90vw);\n}\n\n.railBody > .railLayout {\n flex: 1 1 auto;\n}\n\n.rail {\n /* Never more than two fifths of the box: at its full width in a narrow\n container the rail takes the space the settings need and leaves a pane\n too thin to hold a row. The clamp belongs on the flex basis — an\n `inline-size` here is simply ignored, which is what made a first attempt\n at this look right and do nothing. */\n flex: 0 1 min(var(--wzl-prefs-rail-width, 216px), 40%);\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-2);\n padding: var(--wzl-space-3) var(--wzl-space-2);\n background: var(--wzl-surface-sunken);\n border-right: 1px solid var(--wzl-border);\n overflow-y: auto;\n /* The rail is itself sunken, so a field taking the default surface would be\n the same color as the rail behind it. */\n --wzl-input-surface: var(--wzl-surface);\n}\n\n.railList {\n display: flex;\n flex-direction: column;\n gap: 1px;\n}\n\n.railItem {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-2);\n padding: var(--wzl-space-2) var(--wzl-space-3);\n border: none;\n border-radius: var(--wzl-radius-sm);\n background: none;\n color: var(--wzl-fg);\n font: inherit;\n font-size: var(--wzl-font-size-sm);\n text-align: start;\n cursor: default;\n}\n\n.railItem:hover {\n background: var(--wzl-surface-raised);\n}\n\n.railItem:focus-visible {\n outline: 2px solid var(--wzl-focus-ring);\n outline-offset: -2px;\n}\n\n.railSub {\n padding-left: var(--wzl-space-7);\n color: var(--wzl-fg-subtle);\n}\n\n.railOpen,\n.railOpen:hover {\n background: var(--wzl-accent);\n color: var(--wzl-fg-on-accent);\n}\n\n.railInView {\n color: var(--wzl-fg);\n box-shadow: inset 2px 0 0 var(--wzl-accent);\n}\n\n.railName {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Last in the row: a count that changes as the reader types would otherwise\n shove the name on every keystroke. */\n.railCount {\n margin-left: auto;\n font-size: var(--wzl-font-size-xs);\n font-variant-numeric: tabular-nums;\n font-family: var(--wzl-font-numeric);\n opacity: 0.6;\n}\n\n.pane {\n flex: 1;\n min-width: 0;\n overflow-y: auto;\n padding: var(--wzl-space-5) var(--wzl-space-6);\n}\n\n.paneHead {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-1);\n margin-bottom: var(--wzl-space-5);\n}\n\n.paneTitle {\n margin: 0;\n font-size: var(--wzl-font-size-lg);\n font-weight: var(--wzl-font-weight-medium);\n color: var(--wzl-fg);\n}\n\n.paneDesc {\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n color: var(--wzl-fg-subtle);\n line-height: 1.35;\n}\n\n.paneSection {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-3);\n margin-top: var(--wzl-space-6);\n}\n\n.paneSubsection {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-2);\n margin-top: var(--wzl-space-4);\n padding-left: var(--wzl-space-4);\n border-left: 2px solid var(--wzl-border);\n}\n\n.sectionTitle {\n position: sticky;\n /* Sticky offsets are measured from the scrollport's edge, not from inside\n the pane's padding, so this is 0 and the heading's own padding is what\n keeps the text off the edge. */\n top: 0;\n z-index: 1;\n margin: 0;\n padding: var(--wzl-space-3) 0 var(--wzl-space-2);\n background: var(--wzl-surface);\n border-bottom: 1px solid var(--wzl-border);\n font-size: var(--wzl-font-size-sm);\n font-weight: var(--wzl-font-weight-bold);\n color: var(--wzl-fg-subtle);\n letter-spacing: var(--wzl-params-label-tracking, var(--wzl-tracking-wider));\n text-transform: var(--wzl-params-label-case, uppercase);\n}\n\n.subsectionTitle {\n margin: 0;\n font-size: var(--wzl-font-size-xs);\n font-weight: var(--wzl-font-weight-bold);\n color: var(--wzl-fg-subtle);\n letter-spacing: var(--wzl-params-label-tracking, var(--wzl-tracking-wide));\n text-transform: var(--wzl-params-label-case, uppercase);\n}\n\n/* In the rail layout a row is a grid, so the control track grows with the\n pane instead of holding at the columns layout's fixed slot. */\n.railLayout .row {\n display: grid;\n /* The control track is capped rather than taking the rest: a number field\n as wide as the pane reads as a text area, and every row's control starts\n at the same x either way. */\n grid-template-columns:\n minmax(140px, var(--wzl-params-label-width, 240px))\n minmax(180px, 260px);\n align-items: center;\n}\n\n.railLayout .rowControl {\n flex: 1 1 auto;\n}\n\n.filter {\n padding: 0 var(--wzl-space-1) var(--wzl-space-2);\n}\n\n.noMatches {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--wzl-space-3);\n padding: var(--wzl-space-6) 0;\n font-size: var(--wzl-font-size-sm);\n color: var(--wzl-fg-subtle);\n}\n\n.noMatches p {\n margin: 0;\n}\n\n.clearFilter {\n padding: var(--wzl-space-1) var(--wzl-space-3);\n border: 1px solid var(--wzl-border);\n border-radius: var(--wzl-radius-sm);\n background: var(--wzl-surface-raised);\n color: var(--wzl-fg);\n font: inherit;\n font-size: var(--wzl-font-size-sm);\n}\n","import { type ReactNode } from 'react';\nimport { PropertyControl } from '../Properties/PropertyField';\nimport { PropertyRow } from '../Properties/PropertyPanel';\nimport { prefFieldProps } from './prefField';\nimport {\n isPrefLeaf,\n prefValueAtPath,\n type PrefGroup,\n type PrefLeaf,\n type PrefObject,\n} from './schema';\nimport s from './Prefs.module.css';\n\n/** What a {@link PrefRenderer} is given for the leaf it is rendering. */\nexport interface PrefRenderContext {\n /** Dotted path of the leaf within the schema root. */\n path: string;\n /** The schema node. App renderers narrow this to their own kind shape. */\n pref: PrefLeaf;\n /** Current value — `values` at `path`, falling back to `pref.default`. */\n value: unknown;\n setValue: (value: unknown) => void;\n /** Whether this leaf is currently auto — not pinned, computed by the owner. */\n auto: boolean;\n /** Toggle this leaf's auto state. */\n setAuto: (next: boolean) => void;\n}\n\n/**\n * Renders the control cell for one preference leaf. Returning `null`\n * collapses the row.\n */\nexport type PrefRenderer = (ctx: PrefRenderContext) => ReactNode;\n\nexport interface WalkCtx {\n values: unknown;\n onChange: (path: string, value: unknown) => void;\n renderers?: Record<string, PrefRenderer>;\n}\n\nexport function PrefRow({ ctx, path, pref }: { ctx: WalkCtx; path: string; pref: PrefLeaf }) {\n const stored = prefValueAtPath(ctx.values, path);\n const renderCtx: PrefRenderContext = {\n path,\n pref,\n value: stored !== undefined ? stored : pref.default,\n setValue: (v) => ctx.onChange(path, v),\n // A prefs form pins every leaf: it has no computed state to hand back.\n auto: false,\n setAuto: () => {},\n };\n\n const custom = ctx.renderers?.[pref.kind];\n const control = custom ? custom(renderCtx) : renderBuiltin(renderCtx);\n if (custom && control === null) return null;\n\n // `block` leaves own their chrome (embedded editors with their own\n // header) — no label/tooltip row.\n if (pref.block) return <>{control}</>;\n\n return (\n <PropertyRow\n label={pref.name}\n description={pref.description}\n layout=\"inline\"\n className={s.row}\n >\n <span className={s.rowControl}>{control}</span>\n </PropertyRow>\n );\n}\n\nfunction renderBuiltin(\n ctx: PrefRenderContext,\n // The object a nested leaf is a field of — what an enum `encoding` and a\n // font's weight and slant read against. Undefined for a top-level leaf.\n siblings?: Record<string, unknown>,\n): ReactNode {\n const { pref, value, setValue } = ctx;\n if (pref.kind === 'object') return <ObjectLeaf ctx={ctx} />;\n const field = prefFieldProps(pref, { value, siblings, setValue });\n if (field === null) {\n // App-defined kind with no `renderers` entry: labeled placeholder, not a\n // crash — a missing wiring should be visible and recoverable.\n return <span className={s.unrenderable}>({pref.kind}: no renderer)</span>;\n }\n switch (field.kind) {\n // A form stores what was settled on: a number once it is entered, a color\n // once its gesture ends.\n case 'number':\n return (\n <PropertyControl\n {...field}\n name={pref.name}\n onInput={settledOnly}\n steppers={field.accepts === undefined}\n />\n );\n case 'color':\n return <PropertyControl {...field} name={pref.name} onInput={settledOnly} />;\n default:\n return <PropertyControl {...field} name={pref.name} />;\n }\n}\n\nconst settledOnly = (): void => {};\n\n/** One value with its fields hanging off it: each field renders its own\n * control and commits the parent object whole. */\nfunction ObjectLeaf({ ctx }: { ctx: PrefRenderContext }) {\n const pref = ctx.pref as PrefObject;\n const { value, setValue } = ctx;\n const held = typeof value === 'object' && value !== null\n ? (value as Record<string, unknown>)\n : undefined;\n const objectRows = (children: Record<string, PrefLeaf | PrefGroup>): ReactNode[] => {\n const out: ReactNode[] = [];\n for (const [key, child] of Object.entries(children)) {\n if (!isPrefLeaf(child)) {\n const inner = objectRows(child.children);\n if (inner.length === 0) continue;\n out.push(<h4 key={`group:${key}`} className={s.objectGroup}>{child.name}</h4>, ...inner);\n continue;\n }\n out.push(\n <PropertyRow\n key={key}\n label={child.name}\n layout=\"inline\"\n className={s.objectRow}\n >\n <span className={s.rowControl}>\n {renderBuiltin({\n path: `${ctx.path}.${key}`,\n pref: child,\n value: held?.[key],\n setValue: (v) => {\n const base = held ?? pref.fromScalar?.(value) ?? {};\n setValue({ ...base, [key]: v });\n },\n // A field is not pinned on its own — it shares the state of\n // the object leaf it hangs off.\n auto: ctx.auto,\n setAuto: ctx.setAuto,\n }, held)}\n </span>\n </PropertyRow>,\n );\n }\n return out;\n };\n return <div className={s.objectLeaf}>{objectRows(pref.children)}</div>;\n}\n","import { type RefObject } from 'react';\nimport { isPrefLeaf, type PrefGroup, type PrefLeaf } from './schema';\nimport { PrefRow, type WalkCtx } from './PrefsRow';\nimport s from './Prefs.module.css';\n\n/** Props for {@link PrefsPane}. */\nexport interface PrefsPaneProps {\n ctx: WalkCtx;\n /** The open group, or a synthetic one holding the root's loose leaves. */\n group: PrefGroup;\n /** Dotted path of `group`. Empty for the loose-leaf pane. */\n path: string;\n /** The pane's scroll container, for the rail's scroll spy. */\n scrollRef: RefObject<HTMLDivElement | null>;\n className?: string;\n}\n\n/**\n * One rail section's settings: the group's own leaves, then one headed\n * section per nested group.\n *\n * Nothing here draws a panel. The rail is the layout's structure, and a card\n * inside a dialog that already has a border only restates it — the columns\n * layout's sunken panels are what this is the alternative to.\n */\nexport function PrefsPane(props: PrefsPaneProps) {\n const { ctx, group, path, scrollRef, className } = props;\n const leaves = Object.entries(group.children).filter(\n (entry): entry is [string, PrefLeaf] => isPrefLeaf(entry[1]),\n );\n const groups = Object.entries(group.children).filter(\n (entry): entry is [string, PrefGroup] => !isPrefLeaf(entry[1]),\n );\n const childPath = (key: string): string => (path === '' ? key : `${path}.${key}`);\n\n return (\n <div className={[s.pane, className].filter(Boolean).join(' ')} ref={scrollRef}>\n <div className={s.paneHead}>\n <h3 className={s.paneTitle}>{group.name}</h3>\n {group.description !== undefined && (\n <p className={s.paneDesc}>{group.description}</p>\n )}\n </div>\n {leaves.length > 0 && (\n <div className={s.rows}>\n {leaves.map(([key, leaf]) => (\n <PrefRow key={key} ctx={ctx} path={childPath(key)} pref={leaf} />\n ))}\n </div>\n )}\n {groups.map(([key, child]) => (\n <PaneSection\n key={key}\n ctx={ctx}\n group={child}\n path={childPath(key)}\n depth={0}\n />\n ))}\n </div>\n );\n}\n\n/**\n * A nested group inside a pane. Depth 0 sections are the ones the rail links\n * to and carry `data-spy-section`; deeper ones indent and are reached only by\n * scrolling, which is what keeps the rail two levels deep whatever the schema\n * does.\n */\nfunction PaneSection({ ctx, group, path, depth }: {\n ctx: WalkCtx;\n group: PrefGroup;\n path: string;\n depth: number;\n}) {\n const Heading = depth === 0 ? 'h4' : 'h5';\n return (\n <section\n className={depth === 0 ? s.paneSection : s.paneSubsection}\n data-spy-section={depth === 0 ? path : undefined}\n aria-label={group.name}\n >\n <Heading className={depth === 0 ? s.sectionTitle : s.subsectionTitle}>\n {group.name}\n </Heading>\n {group.description !== undefined && (\n <p className={s.paneDesc}>{group.description}</p>\n )}\n <div className={s.rows}>\n {Object.entries(group.children).map(([key, child]) => {\n const p = `${path}.${key}`;\n return isPrefLeaf(child) ? (\n <PrefRow key={key} ctx={ctx} path={p} pref={child} />\n ) : (\n <PaneSection key={key} ctx={ctx} group={child} path={p} depth={depth + 1} />\n );\n })}\n </div>\n </section>\n );\n}\n","import type { ReactNode } from 'react';\nimport { useRovingTabIndex } from '../../useRovingTabIndex';\nimport type { PrefRailItem } from './schema';\nimport s from './Prefs.module.css';\n\n/** Props for {@link PrefsRail}. */\nexport interface PrefsRailProps {\n items: readonly PrefRailItem[];\n /** Path of the open group: depth 0, or depth 1 under `subPages`. */\n section: string;\n /** Path of the depth-1 group in view, from the pane's scroll spy. */\n current: string | null;\n /** A depth-0 entry was chosen: open its pane. */\n onOpen: (path: string) => void;\n /** A depth-1 entry was chosen: scroll the open pane to it, or, under\n * `subPages`, open it. */\n onScrollTo: (path: string) => void;\n /** Accessible name for the rail's landmark. */\n ariaLabel: string;\n /** Rendered above the list — the filter field, when there is one. */\n header?: ReactNode;\n /** Show each entry's match count. Only meaningful while filtering. */\n showCounts?: boolean;\n}\n\n/**\n * The rail beside a `PrefsForm` pane: depth-0 groups, each followed by the\n * depth-1 groups that scroll within it.\n *\n * A list of buttons rather than a tablist, because only half of these entries\n * switch anything — the nested ones scroll the pane the selected entry already\n * opened, and a tab that does not own a panel has no honest role. The open\n * group is `aria-current=\"page\"`; the nested group in view is\n * `aria-current=\"location\"`.\n */\nexport function PrefsRail(props: PrefsRailProps) {\n const { items, section, current, onOpen, onScrollTo, ariaLabel, header, showCounts } = props;\n const activate = (index: number): void => {\n const item = items[index];\n if (!item) return;\n if (item.depth === 0) onOpen(item.path);\n else onScrollTo(item.path);\n };\n const roving = useRovingTabIndex<HTMLDivElement>({\n itemSelector: `.${s.railItem}`,\n tabStopIndex: Math.max(0, items.findIndex((i) => i.path === section)),\n });\n\n return (\n <nav className={s.rail} aria-label={ariaLabel}>\n {header}\n <div className={s.railList} ref={roving.rootRef} onKeyDown={roving.onKeyDown}>\n {items.map((item, index) => {\n const open = item.path === section;\n const inView = item.depth === 1 && item.path === current;\n return (\n <button\n key={item.path === '' ? '\\u0000root' : item.path}\n type=\"button\"\n className={[s.railItem, item.depth === 1 && s.railSub, open && s.railOpen, inView && s.railInView]\n .filter(Boolean)\n .join(' ')}\n aria-current={open ? 'page' : inView ? 'location' : undefined}\n onClick={() => activate(index)}\n >\n <span className={s.railName}>{item.name}</span>\n {showCounts ? <span className={s.railCount}>{item.matches}</span> : null}\n </button>\n );\n })}\n </div>\n </nav>\n );\n}\n","import { useMemo, useRef, useState, type ReactNode } from 'react';\nimport { Input } from '../Input';\nimport { useScrollSpy } from '../../useScrollSpy';\nimport {\n filterPrefSubtree,\n isPrefLeaf,\n prefRailItems,\n visiblePrefSubtree,\n type PrefGroup,\n} from './schema';\nimport { PrefRow, type PrefRenderer, type WalkCtx } from './PrefsRow';\nimport { PrefsPane } from './PrefsPane';\nimport { PrefsRail } from './PrefsRail';\nimport s from './Prefs.module.css';\n\nexport type { PrefRenderer, PrefRenderContext } from './PrefsRow';\n\n/** How a {@link PrefsForm} lays its groups out. */\nexport type PrefsLayout = 'columns' | 'rail';\n\n/** Props for {@link PrefsForm}. */\nexport interface PrefsFormProps {\n /** Root of the schema tree. Core `ToolPrefGroup`s assign structurally. */\n schema: PrefGroup;\n /** Nested value tree (shape mirrors the schema). Sparse is fine —\n * missing leaves fall back to their schema `default`. */\n values?: unknown;\n /** Change callback with the leaf's dotted path. Values apply live;\n * there is no dirty/commit state. */\n onChange: (path: string, value: unknown) => void;\n /**\n * Per-kind renderers for app-defined kinds. Entries also override the\n * built-in kinds when keys collide. A renderer owns the control cell\n * (the label/tooltip row chrome stays with the form, unless the leaf\n * sets `block`); returning `null` collapses the row entirely. Unknown\n * kinds with no renderer show a labeled placeholder instead of\n * crashing.\n */\n renderers?: Record<string, PrefRenderer>;\n /** Reveal `hidden` leaves (dev tooling). Default false. */\n showHidden?: boolean;\n /**\n * `'columns'` (the default) wraps each top-level group into its own panel\n * column. `'rail'` puts a two-level navigation rail beside one group's\n * settings at a time — what a dialog-sized surface wants, since columns\n * overflow sideways once there are more than two.\n */\n layout?: PrefsLayout;\n /** Show a filter field that narrows the form to matching leaves. */\n filterable?: boolean;\n /** Rail layout: path of the open top-level group. Controlled. */\n section?: string;\n /** Rail layout: path of the group open before the reader picks one.\n * Defaults to the first in the schema. */\n defaultSection?: string;\n onSectionChange?: (path: string) => void;\n /**\n * Rail layout: a nested entry opens a page of its own group instead of\n * scrolling the open one to it, and a top-level entry's page holds only its\n * own leaves (or opens its first nested entry when it has none). For a\n * top-level group whose subgroups are long enough that one page of all of\n * them reads as a wall. Default false.\n */\n subPages?: boolean;\n className?: string;\n}\n\n/**\n * Schema-driven preferences form. Leaves render as label + control rows;\n * how the groups around them are arranged is `layout`'s to say — columns of\n * panels, or a navigation rail beside one group at a time.\n *\n * Storage-agnostic: pair with `PrefsDialog` for the modal composition, and\n * persist however the app likes via `onChange`.\n */\nexport function PrefsForm(props: PrefsFormProps) {\n const {\n schema,\n values,\n onChange,\n renderers,\n showHidden = false,\n layout = 'columns',\n filterable = false,\n className,\n } = props;\n const [query, setQuery] = useState('');\n const root = useMemo(() => {\n const visible = visiblePrefSubtree(schema, showHidden);\n return visible === null ? null : filterPrefSubtree(visible, query);\n }, [schema, showHidden, query]);\n\n const ctx: WalkCtx = { values, onChange, renderers };\n const field = filterable ? (\n <div className={s.filter}>\n <Input\n value={query}\n onChange={setQuery}\n aria-label={`Filter ${schema.name}`}\n placeholder=\"Filter settings\"\n />\n </div>\n ) : null;\n\n if (layout === 'rail') {\n return (\n <RailLayout\n {...props}\n root={root}\n ctx={ctx}\n query={query}\n filterField={field}\n onClearFilter={() => setQuery('')}\n />\n );\n }\n\n return (\n <div className={[s.columnsLayout, className].filter(Boolean).join(' ')}>\n {field}\n {root === null ? (\n <NoMatches query={query} onClear={() => setQuery('')} />\n ) : (\n <div className={s.columns}>\n {Object.entries(root.children).map(([key, child]) => (\n <div key={key} className={s.column}>\n {isPrefLeaf(child) ? (\n // Top-level leaves are unusual but legal — give each its own\n // column for symmetry with grouped siblings.\n <PrefRow ctx={ctx} path={key} pref={child} />\n ) : (\n <GroupBody ctx={ctx} group={child} path={key} depth={0} />\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n/** The rail layout's own state: which group is open, and where the pane is\n * scrolled to within it. Split out so the columns layout runs none of it. */\nfunction RailLayout(props: PrefsFormProps & {\n root: PrefGroup | null;\n ctx: WalkCtx;\n query: string;\n filterField: ReactNode;\n onClearFilter: () => void;\n}) {\n const { schema, root, ctx, query, filterField, onClearFilter, className } = props;\n const items = useMemo(() => (root === null ? [] : prefRailItems(root)), [root]);\n const [uncontrolled, setUncontrolled] = useState(\n () => props.defaultSection ?? '',\n );\n const subPages = props.subPages === true;\n const requested = props.section ?? uncontrolled;\n // A filter can take the open group out of the rail entirely, and a section\n // the schema never had can arrive from a consumer's stale state. Either way\n // the first surviving entry is what the reader should be looking at.\n let open = items.some((i) => i.path === requested && (i.depth === 0 || subPages))\n ? requested\n : (items.find((i) => i.depth === 0)?.path ?? '');\n if (subPages && root !== null && !hasLeaves(paneGroup(root, open, schema.name))) {\n open = items.find((i) => i.depth === 1 && i.section === open)?.path ?? open;\n }\n\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const sectionIds = useMemo(\n () =>\n subPages\n ? []\n : items.filter((i) => i.depth === 1 && i.section === open).map((i) => i.path),\n [items, open, subPages],\n );\n const spy = useScrollSpy({ rootRef: scrollRef, ids: sectionIds });\n\n const setOpen = (path: string): void => {\n if (props.section === undefined) setUncontrolled(path);\n props.onSectionChange?.(path);\n // Optional-called: jsdom's elements have no `scrollTo`, and neither does\n // a pane that is not the scrolling box in some consumer's layout.\n scrollRef.current?.scrollTo?.({ top: 0 });\n };\n\n const whole = root === null ? null : paneGroup(root, open, schema.name);\n const opensTop = items.some((i) => i.path === open && i.depth === 0);\n const group = subPages && opensTop && whole !== null ? leavesOf(whole) : whole;\n\n return (\n <div className={[s.railLayout, className].filter(Boolean).join(' ')}>\n <PrefsRail\n items={items}\n section={open}\n current={subPages ? null : spy.active}\n onOpen={setOpen}\n onScrollTo={subPages ? setOpen : spy.scrollTo}\n ariaLabel={schema.name}\n header={filterField}\n showCounts={query.trim() !== ''}\n />\n {group === null ? (\n <div className={s.pane}>\n <NoMatches query={query} onClear={onClearFilter} />\n </div>\n ) : (\n <PrefsPane ctx={ctx} group={group} path={open} scrollRef={scrollRef} />\n )}\n </div>\n );\n}\n\n/**\n * The group a rail path opens. The empty path is the root's loose leaves,\n * which belong to no group of their own and are handed back as one named for\n * the schema — the rail lists them under the same name.\n */\nfunction paneGroup(root: PrefGroup, path: string, rootName: string): PrefGroup | null {\n if (path === '') {\n const children = Object.fromEntries(\n Object.entries(root.children).filter(([, child]) => isPrefLeaf(child)),\n );\n return Object.keys(children).length === 0\n ? null\n : { ...root, name: rootName, children };\n }\n let node: PrefGroup | undefined;\n let cursor = root;\n for (const seg of path.split('.')) {\n const next = cursor.children[seg];\n if (next === undefined || isPrefLeaf(next)) return null;\n node = next;\n cursor = next;\n }\n return node ?? null;\n}\n\n/** Whether a group holds any leaf directly, not counting its subgroups. */\nfunction hasLeaves(group: PrefGroup | null): boolean {\n return group !== null && Object.values(group.children).some(isPrefLeaf);\n}\n\n/** A group cut down to its direct leaves, for a page its subgroups each get their own of. */\nfunction leavesOf(group: PrefGroup): PrefGroup {\n return {\n ...group,\n children: Object.fromEntries(\n Object.entries(group.children).filter(([, child]) => isPrefLeaf(child)),\n ),\n };\n}\n\n/** What a filter matching nothing leaves behind. */\nfunction NoMatches({ query, onClear }: { query: string; onClear: () => void }) {\n return (\n <div className={s.noMatches}>\n <p>No settings match “{query.trim()}”.</p>\n <button type=\"button\" className={s.clearFilter} onClick={onClear}>\n Clear filter\n </button>\n </div>\n );\n}\n\nfunction GroupBody({ ctx, group, path, depth }: {\n ctx: WalkCtx;\n group: PrefGroup;\n path: string;\n depth: number;\n}) {\n return (\n <div className={depth === 0 ? s.panel : s.subpanel}>\n <div className={s.groupHeader}>\n <h3 className={s.groupTitle}>{group.name}</h3>\n {group.description !== undefined && (\n <p className={s.groupDesc}>{group.description}</p>\n )}\n </div>\n <div className={s.rows}>\n {Object.entries(group.children).map(([key, child]) => {\n const childPath = `${path}.${key}`;\n return isPrefLeaf(child) ? (\n <PrefRow key={key} ctx={ctx} path={childPath} pref={child} />\n ) : (\n <GroupBody key={key} ctx={ctx} group={child} path={childPath} depth={depth + 1} />\n );\n })}\n </div>\n </div>\n );\n}\n\n","import type { ReactNode } from 'react';\nimport { Dialog } from '../Dialog';\nimport { PrefsForm, type PrefsFormProps } from './PrefsForm';\nimport s from './Prefs.module.css';\n\n/**\n * Props for {@link PrefsDialog} — everything {@link PrefsForm} takes, plus\n * the dialog's own open state and chrome.\n */\nexport interface PrefsDialogProps extends PrefsFormProps {\n isOpen: boolean;\n onOpenChange: (open: boolean) => void;\n /** Dialog heading. Defaults to the schema root's `name`. */\n title?: ReactNode;\n /** Extra chrome rendered at the end of the title row (e.g. a dev-mode\n * \"Show hidden\" switch). An action the reader acts on when they are done\n * — resetting, importing — belongs in `footer` instead, where a dialog's\n * actions live. */\n headerExtra?: ReactNode;\n /** Footer slot, passed through to `Dialog` — typically a reset or done\n * action. */\n footer?: ReactNode;\n /** Class applied to the dialog's modal box. */\n dialogClassName?: string;\n}\n\n/**\n * The kit's preferences dialog: `Dialog` + `PrefsForm`. Changes apply\n * live through `onChange` — there is no OK/Cancel staging. For custom\n * placement (sidebar, popover, inline page), compose `PrefsForm`\n * directly; this wrapper is intentionally thin.\n *\n * `layout=\"rail\"` is what a dialog usually wants: the default columns wrap\n * sideways past two groups, and this box is 900px at its widest.\n */\nexport function PrefsDialog(props: PrefsDialogProps) {\n const { isOpen, onOpenChange, title, headerExtra, footer, dialogClassName, ...form } = props;\n const rail = form.layout === 'rail';\n return (\n <Dialog\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n aria-label={typeof title === 'string' ? title : form.schema.name}\n className={dialogClassName}\n footer={footer}\n bodyClassName={rail ? s.railBody : undefined}\n title={\n headerExtra !== undefined ? (\n <span className={s.titleRow}>\n <span>{title ?? form.schema.name}</span>\n {headerExtra}\n </span>\n ) : (\n title ?? form.schema.name\n )\n }\n >\n <PrefsForm {...form} />\n </Dialog>\n );\n}\n"],"mappings":"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"}