@weasel-js/ui 1.7.0 → 1.7.2
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.
- package/dist/chunks/ActionBar-xA73vzzF.js +64 -0
- package/dist/chunks/ActionBar-xA73vzzF.js.map +1 -0
- package/dist/chunks/{Badge-D2aD7xVL.js → Badge-jYQjrTKc.js} +235 -264
- package/dist/chunks/{Badge-D2aD7xVL.js.map → Badge-jYQjrTKc.js.map} +1 -1
- package/dist/chunks/{BandEditor-Dd0egAgE.js → BandEditor-B4jUAHQ8.js} +13 -13
- package/dist/chunks/BandEditor-B4jUAHQ8.js.map +1 -0
- package/dist/chunks/{Button-BIdXHQOx.js → Button-XB-T75YL.js} +2 -2
- package/dist/chunks/{Button-BIdXHQOx.js.map → Button-XB-T75YL.js.map} +1 -1
- package/dist/chunks/{ButtonBar-DIQTe5GQ.js → ButtonBar-CIMKPPRS.js} +7 -9
- package/dist/chunks/{ButtonBar-DIQTe5GQ.js.map → ButtonBar-CIMKPPRS.js.map} +1 -1
- package/dist/chunks/Callout-BUn0dP_S.js +115 -0
- package/dist/chunks/Callout-BUn0dP_S.js.map +1 -0
- package/dist/chunks/Checkbox-DFn-x0JO.js +37 -0
- package/dist/chunks/Checkbox-DFn-x0JO.js.map +1 -0
- package/dist/chunks/{CloseButton-C2J7wVfo.js → CloseButton-BmNmRVtb.js} +3 -3
- package/dist/chunks/{CloseButton-C2J7wVfo.js.map → CloseButton-BmNmRVtb.js.map} +1 -1
- package/dist/chunks/ColorField-BwlelY26.js +90 -0
- package/dist/chunks/ColorField-BwlelY26.js.map +1 -0
- package/dist/chunks/{ColorModeControl-BewxA0rX.js → ColorModeControl-DaVJ-SyX.js} +3 -3
- package/dist/chunks/{ColorModeControl-BewxA0rX.js.map → ColorModeControl-DaVJ-SyX.js.map} +1 -1
- package/dist/chunks/ComboBox-DKln_mOd.js +138 -0
- package/dist/chunks/ComboBox-DKln_mOd.js.map +1 -0
- package/dist/chunks/{CurveEditor-DUVjd25R.js → CurveEditor-0EE00D6s.js} +90 -87
- package/dist/chunks/CurveEditor-0EE00D6s.js.map +1 -0
- package/dist/chunks/{DataGrid-LZ2JgY2Y.js → DataGrid-CmHJe57v.js} +23 -18
- package/dist/chunks/DataGrid-CmHJe57v.js.map +1 -0
- package/dist/chunks/DetailList-BpU50XVe.js +54 -0
- package/dist/chunks/DetailList-BpU50XVe.js.map +1 -0
- package/dist/chunks/{DetentSlider-5uQPFucv.js → DetentSlider-DNTAk8xP.js} +2 -2
- package/dist/chunks/{DetentSlider-5uQPFucv.js.map → DetentSlider-DNTAk8xP.js.map} +1 -1
- package/dist/chunks/{Dialog-DGFutQ--.js → Dialog-DKfsk5VN.js} +3 -3
- package/dist/chunks/{Dialog-DGFutQ--.js.map → Dialog-DKfsk5VN.js.map} +1 -1
- package/dist/chunks/{DragGhost-B5_hb9W9.js → DragGhost-BeYDJyLZ.js} +2 -2
- package/dist/chunks/{DragGhost-B5_hb9W9.js.map → DragGhost-BeYDJyLZ.js.map} +1 -1
- package/dist/chunks/{FallthroughDiagram-BEHiM5IS.js → FallthroughDiagram-CS1IhQaU.js} +16 -16
- package/dist/chunks/FallthroughDiagram-CS1IhQaU.js.map +1 -0
- package/dist/chunks/Field-DiX_WByH.js +25 -0
- package/dist/chunks/Field-DiX_WByH.js.map +1 -0
- package/dist/chunks/FillStrokeSwatch-C4h3rUFM.js +112 -0
- package/dist/chunks/FillStrokeSwatch-C4h3rUFM.js.map +1 -0
- package/dist/chunks/{FontFamilySelect-DkRgNtag.js → FontFamilySelect-DEvMXyZd.js} +2 -2
- package/dist/chunks/FontFamilySelect-DEvMXyZd.js.map +1 -0
- package/dist/chunks/FontWeightSelect-BLQ_LMJF.js +49 -0
- package/dist/chunks/FontWeightSelect-BLQ_LMJF.js.map +1 -0
- package/dist/chunks/{GestureRoute-C_YGl7bJ.js → GestureRoute-BXESrHI0.js} +2 -2
- package/dist/chunks/{GestureRoute-C_YGl7bJ.js.map → GestureRoute-BXESrHI0.js.map} +1 -1
- package/dist/chunks/GradientEditor-DD2OjQtn.js +325 -0
- package/dist/chunks/GradientEditor-DD2OjQtn.js.map +1 -0
- package/dist/chunks/{Icon-CcVjdq2C.js → Icon--B1ME-6c.js} +3 -1
- package/dist/chunks/Icon--B1ME-6c.js.map +1 -0
- package/dist/chunks/{InlineRange-P01ABSzo.js → InlineRange-DPjIsJB3.js} +3 -3
- package/dist/chunks/InlineRange-DPjIsJB3.js.map +1 -0
- package/dist/chunks/{Input-CHmkfYaD.js → Input-D7SDKbST.js} +10 -15
- package/dist/chunks/Input-D7SDKbST.js.map +1 -0
- package/dist/chunks/{ItemList-Cm-HUWCi.js → ItemList-CRu9y7hL.js} +2 -2
- package/dist/chunks/ItemList-CRu9y7hL.js.map +1 -0
- package/dist/chunks/{Jog-DRmfrkCg.js → Jog-BrkzdGV2.js} +8 -8
- package/dist/chunks/Jog-BrkzdGV2.js.map +1 -0
- package/dist/chunks/{LayerList-wCI1EueM.js → LayerList-Bxj1N6bj.js} +151 -153
- package/dist/chunks/LayerList-Bxj1N6bj.js.map +1 -0
- package/dist/chunks/ListEditor-OQDzG4A5.js +72 -0
- package/dist/chunks/ListEditor-OQDzG4A5.js.map +1 -0
- package/dist/chunks/MenuButton-TAFg88Lp.js +75 -0
- package/dist/chunks/MenuButton-TAFg88Lp.js.map +1 -0
- package/dist/chunks/MeshEditor-DWpvg8H6.js +199 -0
- package/dist/chunks/MeshEditor-DWpvg8H6.js.map +1 -0
- package/dist/chunks/{NumberField-BnJxcazc.js → NumberField-DS0WSiin.js} +26 -23
- package/dist/chunks/NumberField-DS0WSiin.js.map +1 -0
- package/dist/chunks/{OptionsBar-ujxYidhj.js → OptionsBar-DeTAjVb7.js} +6 -8
- package/dist/chunks/{OptionsBar-ujxYidhj.js.map → OptionsBar-DeTAjVb7.js.map} +1 -1
- package/dist/chunks/PaintField-BdmQM53v.js +63 -0
- package/dist/chunks/PaintField-BdmQM53v.js.map +1 -0
- package/dist/chunks/PaintInput-DaQMeBsI.js +132 -0
- package/dist/chunks/PaintInput-DaQMeBsI.js.map +1 -0
- package/dist/chunks/PatternPicker-B3HcMZWg.js +135 -0
- package/dist/chunks/PatternPicker-B3HcMZWg.js.map +1 -0
- package/dist/chunks/{Plot2D-CTXHkL5p.js → Plot2D-BrvQS0dh.js} +7 -7
- package/dist/chunks/Plot2D-BrvQS0dh.js.map +1 -0
- package/dist/chunks/{PointPlotter-ldI4RrU1.js → PointPlotter-BBXpQ_QD.js} +2 -2
- package/dist/chunks/{PointPlotter-ldI4RrU1.js.map → PointPlotter-BBXpQ_QD.js.map} +1 -1
- package/dist/chunks/{Powerline-DNyH885r.js → Powerline-6wIFmDik.js} +2 -2
- package/dist/chunks/{Powerline-DNyH885r.js.map → Powerline-6wIFmDik.js.map} +1 -1
- package/dist/chunks/{Prefs-ByA-x51i.js → Prefs-C4MZ28SX.js} +118 -95
- package/dist/chunks/Prefs-C4MZ28SX.js.map +1 -0
- package/dist/chunks/{Properties-DmAeQ3mk.js → Properties-DseN56WI.js} +29 -29
- package/dist/chunks/{Properties-DmAeQ3mk.js.map → Properties-DseN56WI.js.map} +1 -1
- package/dist/chunks/PropertyField-BbNqK8xr.js +743 -0
- package/dist/chunks/PropertyField-BbNqK8xr.js.map +1 -0
- package/dist/chunks/{RadioGroup-Bh4-12e-.js → RadioGroup-B70_M-gT.js} +2 -2
- package/dist/chunks/{RadioGroup-Bh4-12e-.js.map → RadioGroup-B70_M-gT.js.map} +1 -1
- package/dist/chunks/{RangeSlider-SEGE-7VF.js → RangeSlider-DO5TZVk7.js} +8 -8
- package/dist/chunks/{RangeSlider-SEGE-7VF.js.map → RangeSlider-DO5TZVk7.js.map} +1 -1
- package/dist/chunks/RecentColorsProvider-DHcfk25u.js +84 -0
- package/dist/chunks/RecentColorsProvider-DHcfk25u.js.map +1 -0
- package/dist/chunks/ResizeHandle-CbAgCQOt.js +81 -0
- package/dist/chunks/ResizeHandle-CbAgCQOt.js.map +1 -0
- package/dist/chunks/Select-ouV8O6cp.js +236 -0
- package/dist/chunks/Select-ouV8O6cp.js.map +1 -0
- package/dist/chunks/{SelectionPanel-BaQnX4Bs.js → SelectionPanel-C3WzyaZV.js} +14 -13
- package/dist/chunks/{SelectionPanel-BaQnX4Bs.js.map → SelectionPanel-C3WzyaZV.js.map} +1 -1
- package/dist/chunks/{SidebarPanel-BblDEz4G.js → SidebarPanel-AXQ0jRDx.js} +2 -2
- package/dist/chunks/{SidebarPanel-BblDEz4G.js.map → SidebarPanel-AXQ0jRDx.js.map} +1 -1
- package/dist/chunks/{Slider-YofwGOI4.js → Slider-DSrlMEq8.js} +19 -19
- package/dist/chunks/Slider-DSrlMEq8.js.map +1 -0
- package/dist/chunks/{StatusBar-Ca9Dvhhq.js → StatusBar-BEOfOX0D.js} +6 -6
- package/dist/chunks/StatusBar-BEOfOX0D.js.map +1 -0
- package/dist/chunks/SwatchGrid-9ZPiDmxd.js +78 -0
- package/dist/chunks/SwatchGrid-9ZPiDmxd.js.map +1 -0
- package/dist/chunks/SwatchStrip-Bi9iPLoh.js +577 -0
- package/dist/chunks/SwatchStrip-Bi9iPLoh.js.map +1 -0
- package/dist/chunks/{ThemeSwitcher-BlsInAmR.js → ThemeSwitcher-DiBmMh_B.js} +3 -3
- package/dist/chunks/{ThemeSwitcher-BlsInAmR.js.map → ThemeSwitcher-DiBmMh_B.js.map} +1 -1
- package/dist/chunks/{Timeline-B39cwfMB.js → Timeline-sMCH2fah.js} +293 -280
- package/dist/chunks/Timeline-sMCH2fah.js.map +1 -0
- package/dist/chunks/Toast-C3ozq11V.js +170 -0
- package/dist/chunks/Toast-C3ozq11V.js.map +1 -0
- package/dist/chunks/{ToggleBar-BTYkBXU9.js → ToggleBar-Z2jZiguF.js} +6 -8
- package/dist/chunks/{ToggleBar-BTYkBXU9.js.map → ToggleBar-Z2jZiguF.js.map} +1 -1
- package/dist/chunks/{TokenPanel-CMDAOfYH.js → TokenPanel-WtKGY2Db.js} +32 -32
- package/dist/chunks/TokenPanel-WtKGY2Db.js.map +1 -0
- package/dist/chunks/{ToolButton-CAHBa08P.js → ToolButton-BURp4YIO.js} +7 -9
- package/dist/chunks/ToolButton-BURp4YIO.js.map +1 -0
- package/dist/chunks/{ToolOptionsBar-D_GCrBAN.js → ToolOptionsBar-CZTYPoC2.js} +3 -2
- package/dist/chunks/{ToolOptionsBar-D_GCrBAN.js.map → ToolOptionsBar-CZTYPoC2.js.map} +1 -1
- package/dist/chunks/{ToolPalette-OOWN51Xx.js → ToolPalette-DKDFWOX-.js} +7 -9
- package/dist/chunks/{ToolPalette-OOWN51Xx.js.map → ToolPalette-DKDFWOX-.js.map} +1 -1
- package/dist/chunks/{Tooltip-Clg2mhSt.js → Tooltip-C6eFCYxw.js} +2 -2
- package/dist/chunks/{Tooltip-Clg2mhSt.js.map → Tooltip-C6eFCYxw.js.map} +1 -1
- package/dist/chunks/Tree-Cc8lIzgM.js.map +1 -1
- package/dist/chunks/checkbox.module-DLQV9tMX.js +5 -0
- package/dist/chunks/checkbox.module-DLQV9tMX.js.map +1 -0
- package/dist/chunks/{createKeyframeLayer-DVl321_l.js → createKeyframeLayer-DSVf13Su.js} +194 -208
- package/dist/chunks/createKeyframeLayer-DSVf13Su.js.map +1 -0
- package/dist/chunks/field.module-B27pWv0i.js +15 -0
- package/dist/chunks/field.module-B27pWv0i.js.map +1 -0
- package/dist/chunks/formatShortcut-DRQrVThu.js.map +1 -1
- package/dist/chunks/handles-CqVANLtu.js +17 -0
- package/dist/chunks/handles-CqVANLtu.js.map +1 -0
- package/dist/chunks/{icons-BhcR1l64.js → icons-Dr2-r30x.js} +2 -2
- package/dist/chunks/icons-Dr2-r30x.js.map +1 -0
- package/dist/chunks/listbox.module-BcdVJMbm.js +8 -0
- package/dist/chunks/listbox.module-BcdVJMbm.js.map +1 -0
- package/dist/chunks/model-qsAFK7_0.js +386 -0
- package/dist/chunks/model-qsAFK7_0.js.map +1 -0
- package/dist/chunks/{portalHost-yTOVuCej.js → portalHost-CE70wLzo.js} +10 -6
- package/dist/chunks/portalHost-CE70wLzo.js.map +1 -0
- package/dist/chunks/prefField-BE_Ytr2H.js +229 -0
- package/dist/chunks/prefField-BE_Ytr2H.js.map +1 -0
- package/dist/chunks/{segmentTooltip-CStYHKzd.js → segmentTooltip-CGxCOWNz.js} +2 -2
- package/dist/chunks/{segmentTooltip-CStYHKzd.js.map → segmentTooltip-CGxCOWNz.js.map} +1 -1
- package/dist/chunks/segmentedControl.module-BzGXUL5G.js +11 -0
- package/dist/chunks/segmentedControl.module-BzGXUL5G.js.map +1 -0
- package/dist/chunks/useReorderDragList-CStYKjHl.js +133 -0
- package/dist/chunks/useReorderDragList-CStYKjHl.js.map +1 -0
- package/dist/chunks/useRovingTabIndex-D7u22Ia_.js +91 -0
- package/dist/chunks/useRovingTabIndex-D7u22Ia_.js.map +1 -0
- package/dist/components/ActionBar/ActionBar.d.ts.map +1 -1
- package/dist/components/ActionBar/index.js +1 -1
- package/dist/components/Badge/bases/ChamferedRect.d.ts.map +1 -1
- package/dist/components/Badge/index.js +1 -1
- package/dist/components/BandEditor/BandEditor.d.ts +1 -0
- package/dist/components/BandEditor/BandEditor.d.ts.map +1 -1
- package/dist/components/BandEditor/index.js +1 -1
- package/dist/components/Button/index.js +1 -1
- package/dist/components/ButtonBar/ButtonBar.d.ts.map +1 -1
- package/dist/components/ButtonBar/index.js +1 -1
- package/dist/components/Callout/Callout.d.ts.map +1 -1
- package/dist/components/Callout/index.js +1 -1
- package/dist/components/Checkbox/Checkbox.d.ts +28 -13
- package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
- package/dist/components/Checkbox/index.js +1 -1
- package/dist/components/CloseButton/index.js +1 -1
- package/dist/components/ColorField/ColorField.d.ts.map +1 -1
- package/dist/components/ColorField/OpacityRange.d.ts +18 -0
- package/dist/components/ColorField/OpacityRange.d.ts.map +1 -0
- package/dist/components/ColorField/index.js +1 -1
- package/dist/components/ColorModeControl/index.js +1 -1
- package/dist/components/ComboBox/ComboBox.d.ts +7 -0
- package/dist/components/ComboBox/ComboBox.d.ts.map +1 -1
- package/dist/components/ComboBox/index.js +1 -1
- package/dist/components/CurveEditor/CurveEditor.d.ts.map +1 -1
- package/dist/components/CurveEditor/LayeredCurveEditor.d.ts.map +1 -1
- package/dist/components/CurveEditor/index.js +2 -2
- package/dist/components/DataGrid/DataGrid.d.ts +3 -0
- package/dist/components/DataGrid/DataGrid.d.ts.map +1 -1
- package/dist/components/DataGrid/index.js +1 -1
- package/dist/components/DetailList/DetailList.d.ts +1 -1
- package/dist/components/DetailList/DetailList.d.ts.map +1 -1
- package/dist/components/DetailList/index.js +1 -1
- package/dist/components/DetentSlider/index.js +1 -1
- package/dist/components/Dialog/index.js +1 -1
- package/dist/components/DragGhost/index.js +1 -1
- package/dist/components/FallthroughDiagram/index.js +1 -1
- package/dist/components/Field/index.js +1 -1
- package/dist/components/FillStrokeSwatch/FillStrokeSwatch.d.ts +5 -2
- package/dist/components/FillStrokeSwatch/FillStrokeSwatch.d.ts.map +1 -1
- package/dist/components/FillStrokeSwatch/index.js +1 -1
- package/dist/components/FontFamilySelect/FontFamilySelect.d.ts +20 -0
- package/dist/components/FontFamilySelect/FontFamilySelect.d.ts.map +1 -1
- package/dist/components/FontFamilySelect/index.js +1 -1
- package/dist/components/FontWeightSelect/FontWeightSelect.d.ts +26 -0
- package/dist/components/FontWeightSelect/FontWeightSelect.d.ts.map +1 -0
- package/dist/components/FontWeightSelect/index.d.ts +3 -0
- package/dist/components/FontWeightSelect/index.d.ts.map +1 -0
- package/dist/components/FontWeightSelect/index.js +2 -0
- package/dist/components/GestureRoute/index.js +1 -1
- package/dist/components/GradientEditor/GradientHandles.d.ts +1 -8
- package/dist/components/GradientEditor/GradientHandles.d.ts.map +1 -1
- package/dist/components/GradientEditor/SceneGradientHandles.d.ts +7 -5
- package/dist/components/GradientEditor/SceneGradientHandles.d.ts.map +1 -1
- package/dist/components/GradientEditor/handleOverlay.d.ts +41 -0
- package/dist/components/GradientEditor/handleOverlay.d.ts.map +1 -0
- package/dist/components/GradientEditor/index.js +1 -1
- package/dist/components/InlineRange/index.js +1 -1
- package/dist/components/Input/Input.d.ts +1 -1
- package/dist/components/Input/Input.d.ts.map +1 -1
- package/dist/components/Input/index.js +1 -1
- package/dist/components/ItemList/ItemList.d.ts +32 -31
- package/dist/components/ItemList/ItemList.d.ts.map +1 -1
- package/dist/components/ItemList/index.js +1 -1
- package/dist/components/Jog/index.js +1 -1
- package/dist/components/LayerList/LayerList.d.ts.map +1 -1
- package/dist/components/LayerList/index.js +1 -1
- package/dist/components/ListEditor/ListEditor.d.ts.map +1 -1
- package/dist/components/ListEditor/index.js +1 -1
- package/dist/components/MenuButton/MenuButton.d.ts.map +1 -1
- package/dist/components/MenuButton/index.js +1 -1
- package/dist/components/MeshEditor/MeshEditor.d.ts +4 -3
- package/dist/components/MeshEditor/MeshEditor.d.ts.map +1 -1
- package/dist/components/MeshEditor/MeshHandles.d.ts +38 -0
- package/dist/components/MeshEditor/MeshHandles.d.ts.map +1 -0
- package/dist/components/MeshEditor/index.d.ts +2 -0
- package/dist/components/MeshEditor/index.d.ts.map +1 -1
- package/dist/components/MeshEditor/index.js +2 -2
- package/dist/components/NumberField/NumberField.d.ts +1 -1
- package/dist/components/NumberField/NumberField.d.ts.map +1 -1
- package/dist/components/NumberField/index.js +1 -1
- package/dist/components/OptionsBar/OptionsBar.d.ts.map +1 -1
- package/dist/components/OptionsBar/index.js +1 -1
- package/dist/components/PaintField/PaintField.d.ts.map +1 -1
- package/dist/components/PaintField/index.js +1 -1
- package/dist/components/PaintInput/PaintInput.d.ts.map +1 -1
- package/dist/components/PaintInput/index.js +1 -1
- package/dist/components/PatternPicker/PatternPicker.d.ts +6 -5
- package/dist/components/PatternPicker/PatternPicker.d.ts.map +1 -1
- package/dist/components/PatternPicker/index.js +1 -1
- package/dist/components/Plot2D/index.js +1 -1
- package/dist/components/PointPlotter/index.js +1 -1
- package/dist/components/Powerline/index.js +2 -2
- package/dist/components/Prefs/PrefsForm.d.ts +22 -0
- package/dist/components/Prefs/PrefsForm.d.ts.map +1 -1
- package/dist/components/Prefs/PrefsRail.d.ts +3 -2
- package/dist/components/Prefs/PrefsRail.d.ts.map +1 -1
- package/dist/components/Prefs/PrefsRow.d.ts +4 -0
- package/dist/components/Prefs/PrefsRow.d.ts.map +1 -1
- package/dist/components/Prefs/index.js +2 -2
- package/dist/components/Prefs/prefField.d.ts +13 -0
- package/dist/components/Prefs/prefField.d.ts.map +1 -1
- package/dist/components/Properties/PropertyField.d.ts +13 -2
- package/dist/components/Properties/PropertyField.d.ts.map +1 -1
- package/dist/components/Properties/PropertyPanel.d.ts +18 -1
- package/dist/components/Properties/PropertyPanel.d.ts.map +1 -1
- package/dist/components/Properties/index.d.ts +2 -2
- package/dist/components/Properties/index.d.ts.map +1 -1
- package/dist/components/Properties/index.js +3 -3
- package/dist/components/RadioGroup/index.js +1 -1
- package/dist/components/RangeSlider/index.js +1 -1
- package/dist/components/RecentColors/RecentColorsProvider.d.ts +24 -0
- package/dist/components/RecentColors/RecentColorsProvider.d.ts.map +1 -0
- package/dist/components/RecentColors/index.d.ts +5 -0
- package/dist/components/RecentColors/index.d.ts.map +1 -0
- package/dist/components/RecentColors/index.js +2 -0
- package/dist/components/RecentColors/recentColors.d.ts +39 -0
- package/dist/components/RecentColors/recentColors.d.ts.map +1 -0
- package/dist/components/ResizeHandle/ResizeHandle.d.ts.map +1 -1
- package/dist/components/ResizeHandle/index.js +1 -1
- package/dist/components/Select/Select.d.ts +6 -2
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/index.js +1 -1
- package/dist/components/SelectionPanel/index.js +2 -2
- package/dist/components/SelectionPanel/renderLeaf.d.ts +12 -2
- package/dist/components/SelectionPanel/renderLeaf.d.ts.map +1 -1
- package/dist/components/SidebarPanel/index.js +1 -1
- package/dist/components/Slider/index.js +1 -1
- package/dist/components/StatusBar/StatusBar.d.ts +1 -1
- package/dist/components/StatusBar/index.js +1 -1
- package/dist/components/SwatchGrid/SwatchGrid.d.ts.map +1 -1
- package/dist/components/SwatchGrid/index.js +1 -1
- package/dist/components/SwatchStrip/SwatchStrip.d.ts +44 -0
- package/dist/components/SwatchStrip/SwatchStrip.d.ts.map +1 -0
- package/dist/components/SwatchStrip/index.d.ts +5 -0
- package/dist/components/SwatchStrip/index.d.ts.map +1 -0
- package/dist/components/SwatchStrip/index.js +2 -0
- package/dist/components/SwatchStrip/palettes.d.ts +21 -0
- package/dist/components/SwatchStrip/palettes.d.ts.map +1 -0
- package/dist/components/ThemeSwitcher/index.js +1 -1
- package/dist/components/Timeline/AnimatedTimeline.d.ts +1 -0
- package/dist/components/Timeline/AnimatedTimeline.d.ts.map +1 -1
- package/dist/components/Timeline/EasingPicker.d.ts +3 -0
- package/dist/components/Timeline/EasingPicker.d.ts.map +1 -1
- package/dist/components/Timeline/LaneGraph.d.ts +1 -1
- package/dist/components/Timeline/LaneGraph.d.ts.map +1 -1
- package/dist/components/Timeline/Timeline.d.ts +10 -1
- package/dist/components/Timeline/Timeline.d.ts.map +1 -1
- package/dist/components/Timeline/Transport.d.ts +6 -0
- package/dist/components/Timeline/Transport.d.ts.map +1 -1
- package/dist/components/Timeline/index.js +1 -1
- package/dist/components/Timeline/keys.d.ts +1 -0
- package/dist/components/Timeline/keys.d.ts.map +1 -1
- package/dist/components/Toast/Toast.d.ts +12 -3
- package/dist/components/Toast/Toast.d.ts.map +1 -1
- package/dist/components/Toast/index.js +1 -1
- package/dist/components/ToggleBar/ToggleBar.d.ts.map +1 -1
- package/dist/components/ToggleBar/index.js +1 -1
- package/dist/components/TokenPanel/index.js +1 -1
- package/dist/components/TokenPanel/tokenTypes.d.ts +1 -0
- package/dist/components/TokenPanel/tokenTypes.d.ts.map +1 -1
- package/dist/components/ToolButton/ToolButton.d.ts +1 -10
- package/dist/components/ToolButton/ToolButton.d.ts.map +1 -1
- package/dist/components/ToolButton/index.js +1 -1
- package/dist/components/ToolOptionsBar/index.js +1 -1
- package/dist/components/ToolPalette/ToolPalette.d.ts.map +1 -1
- package/dist/components/ToolPalette/formatShortcut.d.ts +2 -0
- package/dist/components/ToolPalette/formatShortcut.d.ts.map +1 -1
- package/dist/components/ToolPalette/index.js +1 -1
- package/dist/components/Tooltip/index.js +1 -1
- package/dist/components/Tree/Tree.d.ts +27 -26
- package/dist/components/Tree/Tree.d.ts.map +1 -1
- package/dist/icons/index.d.ts +51 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/paths.d.ts +2 -0
- package/dist/icons/paths.d.ts.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +98 -95
- package/dist/index.js.map +1 -1
- package/dist/overlays/portalHost.d.ts +6 -0
- package/dist/overlays/portalHost.d.ts.map +1 -1
- package/dist/style.css +1 -1
- package/dist/useAsyncOptions.d.ts.map +1 -1
- package/dist/useReorderDragList.d.ts.map +1 -1
- package/dist/useRovingTabIndex.d.ts +40 -39
- package/dist/useRovingTabIndex.d.ts.map +1 -1
- package/package.json +9 -9
- package/dist/chunks/ActionBar-DCq16yFA.js +0 -57
- package/dist/chunks/ActionBar-DCq16yFA.js.map +0 -1
- package/dist/chunks/BandEditor-Dd0egAgE.js.map +0 -1
- package/dist/chunks/Callout-ndW5_Bqx.js +0 -116
- package/dist/chunks/Callout-ndW5_Bqx.js.map +0 -1
- package/dist/chunks/Checkbox-DHXTUHO9.js +0 -47
- package/dist/chunks/Checkbox-DHXTUHO9.js.map +0 -1
- package/dist/chunks/ColorField-Yz_BkcCT.js +0 -69
- package/dist/chunks/ColorField-Yz_BkcCT.js.map +0 -1
- package/dist/chunks/ComboBox-B34H76CW.js +0 -138
- package/dist/chunks/ComboBox-B34H76CW.js.map +0 -1
- package/dist/chunks/CurveEditor-DUVjd25R.js.map +0 -1
- package/dist/chunks/DataGrid-LZ2JgY2Y.js.map +0 -1
- package/dist/chunks/DetailList-BKomDzg5.js +0 -52
- package/dist/chunks/DetailList-BKomDzg5.js.map +0 -1
- package/dist/chunks/FallthroughDiagram-BEHiM5IS.js.map +0 -1
- package/dist/chunks/Field--onYxXTF.js +0 -32
- package/dist/chunks/Field--onYxXTF.js.map +0 -1
- package/dist/chunks/FillStrokeSwatch-DNb0KXPk.js +0 -111
- package/dist/chunks/FillStrokeSwatch-DNb0KXPk.js.map +0 -1
- package/dist/chunks/FontFamilySelect-DkRgNtag.js.map +0 -1
- package/dist/chunks/GradientEditor-b7v4Ph3i.js +0 -363
- package/dist/chunks/GradientEditor-b7v4Ph3i.js.map +0 -1
- package/dist/chunks/Icon-CcVjdq2C.js.map +0 -1
- package/dist/chunks/InlineRange-P01ABSzo.js.map +0 -1
- package/dist/chunks/Input-CHmkfYaD.js.map +0 -1
- package/dist/chunks/ItemList-Cm-HUWCi.js.map +0 -1
- package/dist/chunks/Jog-DRmfrkCg.js.map +0 -1
- package/dist/chunks/LayerList-wCI1EueM.js.map +0 -1
- package/dist/chunks/ListEditor-BeA60TAA.js +0 -71
- package/dist/chunks/ListEditor-BeA60TAA.js.map +0 -1
- package/dist/chunks/MenuButton-BSqEChJE.js +0 -70
- package/dist/chunks/MenuButton-BSqEChJE.js.map +0 -1
- package/dist/chunks/MeshEditor-D1HLZcAh.js +0 -87
- package/dist/chunks/MeshEditor-D1HLZcAh.js.map +0 -1
- package/dist/chunks/NumberField-BnJxcazc.js.map +0 -1
- package/dist/chunks/PaintField-DadOELMg.js +0 -62
- package/dist/chunks/PaintField-DadOELMg.js.map +0 -1
- package/dist/chunks/PaintInput-v8Y7MDbH.js +0 -121
- package/dist/chunks/PaintInput-v8Y7MDbH.js.map +0 -1
- package/dist/chunks/PatternPicker-R_EQtw2Q.js +0 -93
- package/dist/chunks/PatternPicker-R_EQtw2Q.js.map +0 -1
- package/dist/chunks/Plot2D-CTXHkL5p.js.map +0 -1
- package/dist/chunks/Prefs-ByA-x51i.js.map +0 -1
- package/dist/chunks/PropertyField-DfIJJ5GS.js +0 -673
- package/dist/chunks/PropertyField-DfIJJ5GS.js.map +0 -1
- package/dist/chunks/ResizeHandle-rKVWyeTG.js +0 -79
- package/dist/chunks/ResizeHandle-rKVWyeTG.js.map +0 -1
- package/dist/chunks/Select-ClmKtyWg.js +0 -229
- package/dist/chunks/Select-ClmKtyWg.js.map +0 -1
- package/dist/chunks/Slider-YofwGOI4.js.map +0 -1
- package/dist/chunks/StatusBar-Ca9Dvhhq.js.map +0 -1
- package/dist/chunks/SwatchGrid-BYvA8Bmh.js +0 -73
- package/dist/chunks/SwatchGrid-BYvA8Bmh.js.map +0 -1
- package/dist/chunks/Timeline-B39cwfMB.js.map +0 -1
- package/dist/chunks/Toast-BF9GE0HC.js +0 -126
- package/dist/chunks/Toast-BF9GE0HC.js.map +0 -1
- package/dist/chunks/TokenPanel-CMDAOfYH.js.map +0 -1
- package/dist/chunks/ToolButton-CAHBa08P.js.map +0 -1
- package/dist/chunks/createKeyframeLayer-DVl321_l.js.map +0 -1
- package/dist/chunks/icons-BhcR1l64.js.map +0 -1
- package/dist/chunks/model-BaF65rnX.js +0 -365
- package/dist/chunks/model-BaF65rnX.js.map +0 -1
- package/dist/chunks/portalHost-yTOVuCej.js.map +0 -1
- package/dist/chunks/prefField-BopW9bjx.js +0 -201
- package/dist/chunks/prefField-BopW9bjx.js.map +0 -1
- package/dist/chunks/segmentedControl.module-D6SzYJD7.js +0 -11
- package/dist/chunks/segmentedControl.module-D6SzYJD7.js.map +0 -1
- package/dist/chunks/useReorderDragList-FCMoFIzH.js +0 -131
- package/dist/chunks/useReorderDragList-FCMoFIzH.js.map +0 -1
- package/dist/chunks/useRovingTabIndex-Bp_hYm_h.js +0 -65
- package/dist/chunks/useRovingTabIndex-Bp_hYm_h.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Field--onYxXTF.js","names":["s","Field_module_default","Field","cls","orientation","className","fieldClasses"],"sources":["../../src/components/Field/Field.module.css","../../src/components/Field/Field.tsx"],"sourcesContent":[".field {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-2);\n font-family: var(--wzl-font-ui);\n color: var(--wzl-fg);\n}\n\n.label {\n font-size: var(--wzl-font-size-sm);\n font-weight: var(--wzl-font-weight-medium);\n color: var(--wzl-fg);\n cursor: default;\n}\n\n.hint {\n font-size: var(--wzl-font-size-sm);\n color: var(--wzl-fg-subtle);\n line-height: 1.4;\n}\n\n.error {\n font-size: var(--wzl-font-size-sm);\n color: var(--wzl-danger);\n line-height: 1.4;\n}\n\n.row {\n flex-direction: row;\n align-items: center;\n gap: var(--wzl-space-4);\n}\n\n.row .label {\n flex: 1;\n min-width: 0;\n}\n","import type { ReactNode } from 'react';\nimport s from './Field.module.css';\n\n/**\n * Whether a {@link Field} stacks its label above the control or sits them\n * side by side.\n */\nexport type FieldOrientation = 'stacked' | 'row';\n\n/** Props for {@link Field}. */\nexport type FieldProps = {\n orientation?: FieldOrientation;\n className?: string;\n children?: ReactNode;\n};\n\n/**\n * Layout primitive that arranges a label, control, hint, and error in the\n * canonical weasel-ui form-row shape. The control itself owns its semantics\n * (RAC `TextField`, `Checkbox`, etc.); this just paints the layout.\n *\n * Most users will instead reach for `Input` / `Checkbox` / `Switch`, which\n * compose Field internally. Use Field directly when you need a custom\n * control to sit in the same visual rhythm.\n */\nexport function Field({ orientation = 'stacked', className, children }: FieldProps) {\n const cls = [s.field, orientation === 'row' && s.row, className].filter(Boolean).join(' ');\n return <div className={cls}>{children}</div>;\n}\n\n/**\n * The class names {@link Field} paints its slots with, so a control composing\n * its own layout can match the same form-row rhythm.\n */\nexport const fieldClasses = {\n root: s.field,\n row: s.row,\n label: s.label,\n hint: s.hint,\n error: s.error,\n};\n"],"mappings":";;;;;;;;;;ACyBA,SAAgBE,EAAM,EAAE,iBAAc,WAAW,cAAW,eAAwB;CAClF,IAAMC,IAAM;EAACH,EAAE;EAAOI,MAAgB,SAASJ,EAAE;EAAKK;CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CACzF,OAAO,kBAAC,OAAD;EAAK,WAAWF;EAAM;CAAc,CAAA;AAC7C;AAMA,IAAaG,IAAe;CAC1B,MAAMN,EAAE;CACR,KAAKA,EAAE;CACP,OAAOA,EAAE;CACT,MAAMA,EAAE;CACR,OAAOA,EAAE;AACX"}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import { n as e } from "./paintValue-BpaGPjV3.js";
|
|
2
|
-
import { t } from "./Button-BIdXHQOx.js";
|
|
3
|
-
import { t as n } from "./paintPreview-CuSZiHpR.js";
|
|
4
|
-
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
|
-
import { useState as a } from "react";
|
|
6
|
-
var o = {
|
|
7
|
-
root: "_root_fud7i_1",
|
|
8
|
-
pair: "_pair_fud7i_10",
|
|
9
|
-
chip: "_chip_fud7i_19",
|
|
10
|
-
input: "_input_fud7i_43",
|
|
11
|
-
well: "_well_fud7i_49",
|
|
12
|
-
paint: "_paint_fud7i_82",
|
|
13
|
-
buttons: "_buttons_fud7i_114"
|
|
14
|
-
}, s = {
|
|
15
|
-
fill: "Fill",
|
|
16
|
-
stroke: "Stroke"
|
|
17
|
-
}, c = {
|
|
18
|
-
fill: "#ffffff",
|
|
19
|
-
stroke: "#000000"
|
|
20
|
-
};
|
|
21
|
-
function l(t) {
|
|
22
|
-
let { slot: l, paint: u, focused: d } = t, [f, p] = a(null), m = u === null, h = n(u), g = (e(u) ?? c[l]).slice(0, 7);
|
|
23
|
-
return /* @__PURE__ */ i("span", {
|
|
24
|
-
className: o.chip,
|
|
25
|
-
"data-slot": l,
|
|
26
|
-
...d ? { "data-focused": "" } : {},
|
|
27
|
-
...m ? { "data-none": "" } : {},
|
|
28
|
-
children: [/* @__PURE__ */ r("span", {
|
|
29
|
-
className: o.well,
|
|
30
|
-
"aria-hidden": "true",
|
|
31
|
-
children: h && /* @__PURE__ */ r("span", {
|
|
32
|
-
className: o.paint,
|
|
33
|
-
style: { background: h }
|
|
34
|
-
})
|
|
35
|
-
}), /* @__PURE__ */ r("input", {
|
|
36
|
-
type: "color",
|
|
37
|
-
className: o.input,
|
|
38
|
-
value: f ?? g,
|
|
39
|
-
"aria-label": s[l],
|
|
40
|
-
"aria-current": d ? "true" : void 0,
|
|
41
|
-
onFocus: () => t.onFocusChange(l),
|
|
42
|
-
onClick: (e) => {
|
|
43
|
-
t.onFocusChange(l), e.shiftKey && t.onToggleNone && (e.preventDefault(), t.onToggleNone(l));
|
|
44
|
-
},
|
|
45
|
-
onInput: (e) => {
|
|
46
|
-
let n = e.target.value;
|
|
47
|
-
p(n), t.onInput?.(l, n);
|
|
48
|
-
},
|
|
49
|
-
onBlur: () => {
|
|
50
|
-
f !== null && (p(null), t.onChange(l, f));
|
|
51
|
-
}
|
|
52
|
-
})]
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
function u(e) {
|
|
56
|
-
let { fill: n, stroke: a, focused: s, onFocusChange: c, onInput: u, onChange: d, onToggleNone: f, onSwap: p, onReset: m, shortcuts: h, className: g } = e, _ = s === "fill" ? n : a, v = {
|
|
57
|
-
onFocusChange: c,
|
|
58
|
-
onInput: u,
|
|
59
|
-
onChange: d,
|
|
60
|
-
onToggleNone: f
|
|
61
|
-
}, y = f || p || m;
|
|
62
|
-
return /* @__PURE__ */ i("div", {
|
|
63
|
-
className: [o.root, g].filter(Boolean).join(" "),
|
|
64
|
-
role: "group",
|
|
65
|
-
"aria-label": e["aria-label"] ?? "Fill and stroke",
|
|
66
|
-
children: [/* @__PURE__ */ i("div", {
|
|
67
|
-
className: o.pair,
|
|
68
|
-
children: [/* @__PURE__ */ r(l, {
|
|
69
|
-
slot: "fill",
|
|
70
|
-
paint: n,
|
|
71
|
-
focused: s === "fill",
|
|
72
|
-
...v
|
|
73
|
-
}), /* @__PURE__ */ r(l, {
|
|
74
|
-
slot: "stroke",
|
|
75
|
-
paint: a,
|
|
76
|
-
focused: s === "stroke",
|
|
77
|
-
...v
|
|
78
|
-
})]
|
|
79
|
-
}), y && /* @__PURE__ */ i("div", {
|
|
80
|
-
className: o.buttons,
|
|
81
|
-
children: [
|
|
82
|
-
f && /* @__PURE__ */ r(t, {
|
|
83
|
-
variant: "ghost",
|
|
84
|
-
size: "sm",
|
|
85
|
-
pressed: _ === null,
|
|
86
|
-
onClick: () => f(s),
|
|
87
|
-
shortcut: h?.none,
|
|
88
|
-
children: "None"
|
|
89
|
-
}),
|
|
90
|
-
p && /* @__PURE__ */ r(t, {
|
|
91
|
-
variant: "ghost",
|
|
92
|
-
size: "sm",
|
|
93
|
-
onClick: p,
|
|
94
|
-
shortcut: h?.swap,
|
|
95
|
-
children: "Swap"
|
|
96
|
-
}),
|
|
97
|
-
m && /* @__PURE__ */ r(t, {
|
|
98
|
-
variant: "ghost",
|
|
99
|
-
size: "sm",
|
|
100
|
-
onClick: m,
|
|
101
|
-
shortcut: h?.reset,
|
|
102
|
-
children: "Default"
|
|
103
|
-
})
|
|
104
|
-
]
|
|
105
|
-
})]
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
//#endregion
|
|
109
|
-
export { u as t };
|
|
110
|
-
|
|
111
|
-
//# sourceMappingURL=FillStrokeSwatch-DNb0KXPk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FillStrokeSwatch-DNb0KXPk.js","names":["s","solidColorOf","paintPreviewCss","FillStrokeSwatch_module_default","SLOT_LABEL","PICKER_FALLBACK","Chip","props","draft","setDraft","useState","none","paint","preview","pickerValue","slot","focused","color","FillStrokeSwatch","focusedPaint","fill","stroke","chip","anyButton","onToggleNone","onSwap","onReset","className","Button","shortcuts"],"sources":["../../src/components/FillStrokeSwatch/FillStrokeSwatch.module.css","../../src/components/FillStrokeSwatch/FillStrokeSwatch.tsx"],"sourcesContent":[".root {\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n gap: var(--wzl-space-2);\n}\n\n/* The two chips overlap on a diagonal: fill up-left, behind; stroke\n down-right, in front, so the fill shows through the stroke's hole. */\n.pair {\n --chip: 32px;\n --offset: 12px;\n --ring: 8px;\n position: relative;\n inline-size: calc(var(--chip) + var(--offset));\n block-size: calc(var(--chip) + var(--offset));\n}\n\n.chip {\n position: absolute;\n inline-size: var(--chip);\n block-size: var(--chip);\n box-sizing: border-box;\n border: 1px solid var(--wzl-border);\n border-radius: var(--wzl-radius-sm);\n}\n\n.chip[data-slot='fill'] {\n inset-block-start: 0;\n inset-inline-start: 0;\n}\n\n.chip[data-slot='stroke'] {\n inset-block-end: 0;\n inset-inline-end: 0;\n}\n\n.chip[data-focused] {\n border-color: var(--wzl-fg);\n box-shadow: 0 0 0 1px var(--wzl-fg);\n}\n\n.chip:has(.input:focus-visible) {\n outline: 2px solid var(--wzl-focus-ring);\n outline-offset: 1px;\n}\n\n/* The paint sits over the checker, so a translucent one reads as such. */\n.well {\n position: absolute;\n inset: 0;\n overflow: hidden;\n border-radius: calc(var(--wzl-radius-sm) - var(--wzl-border-w));\n background: repeating-conic-gradient(\n var(--wzl-checker-a) 0% 25%,\n var(--wzl-checker-b) 0% 50%\n )\n 50% / var(--wzl-checker-size) var(--wzl-checker-size);\n}\n\n/* The stroke well is a ring: the mask subtracts the content box from the\n padding box, so whatever is behind the chip shows through its hole. */\n.chip[data-slot='stroke'] .well {\n box-sizing: border-box;\n padding: var(--ring);\n mask:\n linear-gradient(#000, #000) padding-box,\n linear-gradient(#000, #000) content-box;\n mask-composite: exclude;\n}\n\n/* The hole's edge, so a focused stroke reads as focused on both sides. */\n.chip[data-slot='stroke'][data-focused]::before {\n content: '';\n position: absolute;\n inset: calc(var(--ring) - var(--wzl-border-w));\n border: 1px solid var(--wzl-fg);\n border-radius: 0;\n pointer-events: none;\n}\n\n.paint {\n position: absolute;\n inset: 0;\n}\n\n/* No paint: the surface crossed by the danger diagonal. */\n.chip[data-none] .well {\n background:\n linear-gradient(\n 45deg,\n transparent calc(50% - 1px),\n var(--wzl-danger) calc(50% - 1px),\n var(--wzl-danger) calc(50% + 1px),\n transparent calc(50% + 1px)\n ),\n var(--wzl-surface);\n}\n\n/* The native picker covers its chip, invisible: it takes the click and the\n keyboard focus, and the well draws the paint. */\n.input {\n position: absolute;\n inset: 0;\n inline-size: 100%;\n block-size: 100%;\n margin: 0;\n padding: 0;\n border: 0;\n opacity: 0;\n cursor: pointer;\n}\n\n.buttons {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: var(--wzl-space-1);\n}\n","import { useState, type ReactElement } from 'react';\nimport type { FillStyle } from '@weasel-js/core';\nimport { paintPreviewCss } from '../../paintPreview';\nimport { solidColorOf } from '../paintValue';\nimport { Button } from '../Button';\nimport type { PaintSlot } from '../GradientEditor';\nimport s from './FillStrokeSwatch.module.css';\n\n/** Props for {@link FillStrokeSwatch}. */\nexport interface FillStrokeSwatchProps {\n /** `null` is an explicit \"no paint\". */\n fill: FillStyle | null | undefined;\n stroke: FillStyle | null | undefined;\n /** The slot that edits aimed at \"the current paint\" land on — the None\n * button, a palette click, a keyboard shortcut the app binds. */\n focused: PaintSlot;\n onFocusChange: (slot: PaintSlot) => void;\n /** Every tick of the color picker, as `#rrggbb`. */\n onInput?: (slot: PaintSlot, color: string) => void;\n /** Once when the picker closes, with its last color, if it moved. */\n onChange: (slot: PaintSlot, color: string) => void;\n /** Toggle a slot between no paint and a paint. Given, it adds the None\n * button (acting on `focused`) and shift-click on a chip. */\n onToggleNone?: (slot: PaintSlot) => void;\n /** Given, adds a Swap button that exchanges the two paints. */\n onSwap?: () => void;\n /** Given, adds a Default button that restores the app's default pair. */\n onReset?: () => void;\n /** Key hints for the buttons' tooltips. The app binds the keys itself. */\n shortcuts?: { none?: string; swap?: string; reset?: string };\n 'aria-label'?: string;\n className?: string;\n}\n\nconst SLOT_LABEL: Record<PaintSlot, string> = { fill: 'Fill', stroke: 'Stroke' };\nconst PICKER_FALLBACK: Record<PaintSlot, string> = { fill: '#ffffff', stroke: '#000000' };\n\nfunction Chip(props: {\n slot: PaintSlot;\n paint: FillStyle | null | undefined;\n focused: boolean;\n onFocusChange: (slot: PaintSlot) => void;\n onInput?: (slot: PaintSlot, color: string) => void;\n onChange: (slot: PaintSlot, color: string) => void;\n onToggleNone?: (slot: PaintSlot) => void;\n}): ReactElement {\n const { slot, paint, focused } = props;\n // Tracks the picker through a pick; the prop only catches up on commit.\n const [draft, setDraft] = useState<string | null>(null);\n const none = paint === null;\n const preview = paintPreviewCss(paint);\n const pickerValue = (solidColorOf(paint) ?? PICKER_FALLBACK[slot]).slice(0, 7);\n\n return (\n <span\n className={s.chip}\n data-slot={slot}\n {...(focused ? { 'data-focused': '' } : {})}\n {...(none ? { 'data-none': '' } : {})}\n >\n <span className={s.well} aria-hidden=\"true\">\n {preview && <span className={s.paint} style={{ background: preview }} />}\n </span>\n <input\n type=\"color\"\n className={s.input}\n value={draft ?? pickerValue}\n aria-label={SLOT_LABEL[slot]}\n aria-current={focused ? 'true' : undefined}\n onFocus={() => props.onFocusChange(slot)}\n onClick={(e) => {\n props.onFocusChange(slot);\n // Shift-click is the none toggle; preventing it keeps the OS picker shut.\n if (e.shiftKey && props.onToggleNone) {\n e.preventDefault();\n props.onToggleNone(slot);\n }\n }}\n onInput={(e) => {\n const color = (e.target as HTMLInputElement).value;\n setDraft(color);\n props.onInput?.(slot, color);\n }}\n onBlur={() => {\n if (draft === null) return;\n setDraft(null);\n props.onChange(slot, draft);\n }}\n />\n </span>\n );\n}\n\n/**\n * The active fill and stroke as one overlapping pair, the way drawing apps\n * show the paint the next shape gets: fill a solid square behind, stroke a\n * frame in front of it. Each chip is a native color picker; the focused one\n * is what the None button — and whatever the app binds — acts on.\n *\n * Holds no state of its own: the paints and the focused slot are props, and\n * the chips report picks through `onInput`/`onChange` for the app to route —\n * into its own active-paint state, into the selection through\n * `useOngoingAction`, or both.\n */\nexport function FillStrokeSwatch(props: FillStrokeSwatchProps): ReactElement {\n const {\n fill, stroke, focused, onFocusChange, onInput, onChange,\n onToggleNone, onSwap, onReset, shortcuts, className,\n } = props;\n const focusedPaint = focused === 'fill' ? fill : stroke;\n const chip = { onFocusChange, onInput, onChange, onToggleNone };\n const anyButton = onToggleNone || onSwap || onReset;\n\n return (\n <div\n className={[s.root, className].filter(Boolean).join(' ')}\n role=\"group\"\n aria-label={props['aria-label'] ?? 'Fill and stroke'}\n >\n <div className={s.pair}>\n <Chip slot=\"fill\" paint={fill} focused={focused === 'fill'} {...chip} />\n <Chip slot=\"stroke\" paint={stroke} focused={focused === 'stroke'} {...chip} />\n </div>\n {anyButton && (\n <div className={s.buttons}>\n {onToggleNone && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n pressed={focusedPaint === null}\n onClick={() => onToggleNone(focused)}\n shortcut={shortcuts?.none}\n >\n None\n </Button>\n )}\n {onSwap && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onSwap} shortcut={shortcuts?.swap}>\n Swap\n </Button>\n )}\n {onReset && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onReset} shortcut={shortcuts?.reset}>\n Default\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;GCkCMI,IAAwC;CAAE,MAAM;CAAQ,QAAQ;AAAS,GACzEC,IAA6C;CAAE,MAAM;CAAW,QAAQ;AAAU;AAExF,SAASC,EAAK,GAQG;CACf,IAAM,EAAE,SAAM,UAAO,eAAYC,GAE3B,CAACC,GAAOC,KAAYC,EAAwB,IAAI,GAChDC,IAAOC,MAAU,MACjBC,IAAUX,EAAgBU,CAAK,GAC/BE,KAAeb,EAAaW,CAAK,KAAKP,EAAgBU,GAAA,CAAO,MAAM,GAAG,CAAC;CAE7E,OACE,kBAAC,QAAD;EACE,WAAWf,EAAE;EACb,aAAWe;EACX,GAAKC,IAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;EACzC,GAAKL,IAAO,EAAE,aAAa,GAAG,IAAI,CAAC;EAJrC,UAAA,CAME,kBAAC,QAAD;GAAM,WAAWX,EAAE;GAAM,eAAY;GAClC,UAAAa,KAAW,kBAAC,QAAD;IAAM,WAAWb,EAAE;IAAO,OAAO,EAAE,YAAYa,EAAQ;GAAI,CAAA;EACnE,CAAA,GACN,kBAAC,SAAD;GACE,MAAK;GACL,WAAWb,EAAE;GACb,OAAOQ,KAASM;GAChB,cAAYV,EAAWW;GACvB,gBAAcC,IAAU,SAAS,KAAA;GACjC,eAAeT,EAAM,cAAcQ,CAAI;GACvC,UAAU,MAAM;IAGd,AAFAR,EAAM,cAAcQ,CAAI,GAEpB,EAAE,YAAYR,EAAM,iBACtB,EAAE,eAAe,GACjBA,EAAM,aAAaQ,CAAI;GAE3B;GACA,UAAU,MAAM;IACd,IAAME,IAAS,EAAE,OAA4B;IAE7C,AADAR,EAASQ,CAAK,GACdV,EAAM,UAAUQ,GAAME,CAAK;GAC7B;GACA,cAAc;IACZ,AAAIT,MAAU,SACdC,EAAS,IAAI,GACbF,EAAM,SAASQ,GAAMP,CAAK;GAC5B;EACD,CAAA,CACG;;AAEV;AAaA,SAAgBU,EAAiB,GAA4C;CAC3E,IAAM,EACJ,SAAM,WAAQ,YAAS,kBAAe,YAAS,aAC/C,iBAAc,WAAQ,YAAS,cAAW,iBACxCX,GACEY,IAAeH,MAAY,SAASI,IAAOC,GAC3CC,IAAO;EAAE;EAAe;EAAS;EAAU;CAAa,GACxDC,IAAYC,KAAgBC,KAAUC;CAE5C,OACE,kBAAC,OAAD;EACE,WAAW,CAAC1B,EAAE,MAAM2B,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;EACvD,MAAK;EACL,cAAYpB,EAAM,iBAAiB;EAHrC,UAAA,CAKE,kBAAC,OAAD;GAAK,WAAWP,EAAE;GAAlB,UAAA,CACE,kBAACM,GAAD;IAAM,MAAK;IAAO,OAAOc;IAAM,SAASJ,MAAY;IAAQ,GAAIM;GAAO,CAAA,GACvE,kBAAChB,GAAD;IAAM,MAAK;IAAS,OAAOe;IAAQ,SAASL,MAAY;IAAU,GAAIM;GAAO,CAAA,CAC1E;EACJ,CAAA,GAAAC,KACC,kBAAC,OAAD;GAAK,WAAWvB,EAAE;GAAlB,UAAA;IACGwB,KACC,kBAACI,GAAD;KACE,SAAQ;KACR,MAAK;KACL,SAAST,MAAiB;KAC1B,eAAeK,EAAaR,CAAO;KACnC,UAAUa,GAAW;KACtB,UAAA;IAEO,CAAA;IAETJ,KACC,kBAACG,GAAD;KAAQ,SAAQ;KAAQ,MAAK;KAAK,SAASH;KAAQ,UAAUI,GAAW;KAAM,UAAA;IAEtE,CAAA;IAETH,KACC,kBAACE,GAAD;KAAQ,SAAQ;KAAQ,MAAK;KAAK,SAASF;KAAS,UAAUG,GAAW;KAAO,UAAA;IAExE,CAAA;GAEP;EAEJ,CAAA,CAAA;;AAET"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FontFamilySelect-DkRgNtag.js","names":["Select","unregisteredLabel","resolveFontVariant","family","weight","style","substituted","FontFamilySelect","props","baked","listFonts","canvas","listCanvasFonts","f","c","available","options","value","fontStyle","mixed","onChange"],"sources":["../../src/components/FontFamilySelect/FontFamilySelect.tsx"],"sourcesContent":["/**\n * Font-family picker driven by the live font registry.\n *\n * **What it offers.** Both tiers that can actually paint: `listFonts()` for\n * families with a baked atlas, and `listCanvasFonts()` for families the\n * dynamic canvas-SDF tier will serve. Offer what will render, invent\n * nothing — and `listCanvasFonts` reports service rather than membership,\n * so a family auto-enrolled under a policy that is no longer in force\n * doesn't appear.\n *\n * **What it does with a value it can't offer.** Nothing about the model\n * stops a node from naming a family that was never registered — a pasted\n * node, an imported SVG, a document from a session that loaded more fonts.\n * The control keeps that value visible as its own entry and names what is\n * actually painting instead, read structurally off\n * `resolveFontVariant().substituted`. Dropping the value would silently\n * rewrite the document on the next edit; showing it bare would claim a font\n * is in use that isn't.\n */\nimport { listCanvasFonts, listFonts, resolveFontVariant } from '@weasel-js/font';\nimport { Select } from '../Select';\n\nexport interface FontFamilySelectProps {\n /** Current family, or `undefined` when the sources disagree (`mixed`). */\n value?: string;\n /** Indeterminate presentation — the aggregated sources name different families. */\n mixed?: boolean;\n onChange: (family: string) => void;\n /** The weight / style the text actually renders at, so the substitution\n * probe reports the variant that paints rather than a nominal 400/normal. */\n weight?: number;\n fontStyle?: 'normal' | 'italic';\n 'aria-label'?: string;\n className?: string;\n}\n\n/** Label for a value that isn't in the registry: name the substitute when the\n * fallback chain found one, otherwise say only what is known. */\nfunction unregisteredLabel(family: string, weight: number, style: 'normal' | 'italic'): string {\n const { substituted } = resolveFontVariant(family, weight, style);\n return substituted\n ? `${family} — not loaded, showing ${substituted.resolved}`\n : `${family} — not loaded`;\n}\n\nexport function FontFamilySelect(props: FontFamilySelectProps) {\n const { value, mixed = false, onChange, weight = 400, fontStyle = 'normal', className } = props;\n // Both tiers that actually render: families with a baked atlas, and\n // families the dynamic canvas-SDF tier will serve. Neither list is a guess\n // — `listCanvasFonts` reports what the registry will really route, so a\n // family reaches this menu only if it can paint.\n const baked = listFonts();\n const canvas = listCanvasFonts().filter((c) => !baked.some((f) => f.family === c.family));\n const available = [...baked.map((f) => f.family), ...canvas.map((c) => c.family)];\n const options = available.map((family) => ({ value: family, label: family }));\n if (value !== undefined && !available.includes(value)) {\n options.push({ value, label: unregisteredLabel(value, weight, fontStyle) });\n }\n return (\n <Select<string>\n className={className}\n options={options}\n selectedKey={mixed ? null : (value ?? null)}\n placeholder={mixed ? 'Mixed' : undefined}\n onSelectionChange={onChange}\n aria-label={props['aria-label'] ?? 'Font'}\n />\n );\n}\n"],"mappings":";;;;AAsCA,SAASC,EAAkB,GAAgB,GAAgB,GAAoC;CAC7F,IAAM,EAAE,mBAAgBC,EAAmBC,GAAQC,GAAQC,CAAK;CAChE,OAAOC,IACH,GAAGH,EAAO,yBAAyBG,EAAY,aAC/C,GAAGH,EAAO;AAChB;AAEA,SAAgBI,EAAiB,GAA8B;CAC7D,IAAM,EAAE,UAAO,WAAQ,IAAO,aAAU,YAAS,KAAK,eAAY,UAAU,iBAAcC,GAKpFC,IAAQC,EAAU,GAClBC,IAASC,EAAgB,CAAC,CAAC,QAAQ,MAAM,CAACH,EAAM,MAAM,MAAMI,EAAE,WAAWC,EAAE,MAAM,CAAC,GAClFC,IAAY,CAAC,GAAGN,EAAM,KAAK,MAAMI,EAAE,MAAM,GAAG,GAAGF,EAAO,KAAK,MAAMG,EAAE,MAAM,CAAC,GAC1EE,IAAUD,EAAU,KAAK,OAAY;EAAE,OAAOZ;EAAQ,OAAOA;CAAO,EAAE;CAI5E,OAHIc,MAAU,KAAA,KAAa,CAACF,EAAU,SAASE,CAAK,KAClDD,EAAQ,KAAK;EAAE;EAAO,OAAOf,EAAkBgB,GAAOb,GAAQc,CAAS;CAAE,CAAC,GAG1E,kBAAClB,GAAD;EACa;EACF;EACT,aAAamB,IAAQ,OAAQF,KAAS;EACtC,aAAaE,IAAQ,UAAU,KAAA;EAC/B,mBAAmBC;EACnB,cAAYZ,EAAM,iBAAiB;CACpC,CAAA;AAEL"}
|
|
@@ -1,363 +0,0 @@
|
|
|
1
|
-
import { t as e } from "./ColorField-Yz_BkcCT.js";
|
|
2
|
-
import { t } from "./Slider-YofwGOI4.js";
|
|
3
|
-
import { t as n } from "./ToggleBar-BTYkBXU9.js";
|
|
4
|
-
import { n as r, t as i } from "./MeshEditor-D1HLZcAh.js";
|
|
5
|
-
import { fillInPoseFrame as a, fillToBoundsFrame as o, getPaintKind as s, gradientGeometry as c, isGradientFill as l, listGradientKinds as u, sampleGradientStops as d, switchGradientKind as f, useHandleDrag as p, useNodeOverlayFrame as m, useOngoingAction as h } from "@weasel-js/core";
|
|
6
|
-
import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
7
|
-
import { useRef as y } from "react";
|
|
8
|
-
import { nativeSvgKind as b, nativeSvgSpace as x } from "@weasel-js/svg";
|
|
9
|
-
//#region src/paintGradientTrack.tsx
|
|
10
|
-
var S = {
|
|
11
|
-
angleDeg: 135,
|
|
12
|
-
stripe: 2,
|
|
13
|
-
gap: 4,
|
|
14
|
-
dim: 75
|
|
15
|
-
};
|
|
16
|
-
function C(e) {
|
|
17
|
-
let { gradient: t, samples: n = 16, activeRange: r, hatch: i } = e;
|
|
18
|
-
return (e) => {
|
|
19
|
-
let a = [];
|
|
20
|
-
for (let r = 0; r <= n; r++) {
|
|
21
|
-
let i = r / n;
|
|
22
|
-
a.push(`${t(i)} ${e.fractionToPosition(i)}`);
|
|
23
|
-
}
|
|
24
|
-
let o = `linear-gradient(to right, ${a.join(", ")})`, s = [];
|
|
25
|
-
if (r) {
|
|
26
|
-
let t = e.valueToFraction(r[0]), n = e.valueToFraction(r[1]), a = {
|
|
27
|
-
...S,
|
|
28
|
-
...i
|
|
29
|
-
}, o = `repeating-linear-gradient(${a.angleDeg}deg, transparent 0 ${a.stripe}px, var(--wzl-surface) ${a.stripe}px ${a.stripe + a.gap}px)`, c = `color-mix(in srgb, var(--wzl-surface) ${a.dim}%, transparent)`, l = `linear-gradient(${c}, ${c})`;
|
|
30
|
-
if (t > 0) {
|
|
31
|
-
let n = e.fractionToPosition(t);
|
|
32
|
-
s.push(`${l} left 0 / ${n} 100% no-repeat`), s.push(`${o} left 0 / ${n} 100% no-repeat`);
|
|
33
|
-
}
|
|
34
|
-
if (n < 1) {
|
|
35
|
-
let t = `calc(100% - ${e.fractionToPosition(n)})`;
|
|
36
|
-
s.push(`${l} right 0 / ${t} 100% no-repeat`), s.push(`${o} right 0 / ${t} 100% no-repeat`);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
s.push(o);
|
|
40
|
-
let c = {
|
|
41
|
-
position: "absolute",
|
|
42
|
-
inset: 0,
|
|
43
|
-
background: s.join(", ")
|
|
44
|
-
};
|
|
45
|
-
return /* @__PURE__ */ _("div", { style: c });
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
var w = {
|
|
49
|
-
root: "_root_nxcxi_1",
|
|
50
|
-
swatches: "_swatches_nxcxi_8",
|
|
51
|
-
swatch: "_swatch_nxcxi_8",
|
|
52
|
-
noEditor: "_noEditor_nxcxi_21"
|
|
53
|
-
}, T = [
|
|
54
|
-
{
|
|
55
|
-
value: "rgb",
|
|
56
|
-
label: "sRGB"
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
value: "oklab",
|
|
60
|
-
label: "OKLab"
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
value: "oklch",
|
|
64
|
-
label: "OKLCh"
|
|
65
|
-
}
|
|
66
|
-
], E = 2;
|
|
67
|
-
function D(e) {
|
|
68
|
-
let { value: t, onInput: a, onChange: o, kindSwitch: c = !0, spaceSwitch: d = !0, svg: p = !1, className: m } = e, h = t.fill ?? "solid", y = t.interpolate ?? "rgb", S = u().filter((e) => !p || b(e.id) || e.id === h).map((e) => ({
|
|
69
|
-
value: e.id,
|
|
70
|
-
label: e.label
|
|
71
|
-
})), C = T.filter((e) => !p || x(e.value) || e.value === y), E = (e) => {
|
|
72
|
-
let n = f(t, e);
|
|
73
|
-
n && n !== t && o(n);
|
|
74
|
-
};
|
|
75
|
-
return /* @__PURE__ */ v("div", {
|
|
76
|
-
className: [w.root, m].filter(Boolean).join(" "),
|
|
77
|
-
children: [c && /* @__PURE__ */ _(n, {
|
|
78
|
-
items: S,
|
|
79
|
-
value: h,
|
|
80
|
-
size: "sm",
|
|
81
|
-
ariaLabel: "Gradient kind",
|
|
82
|
-
onChange: (e) => e && E(e)
|
|
83
|
-
}), D()]
|
|
84
|
-
});
|
|
85
|
-
function D() {
|
|
86
|
-
let e = d && C.length > 1 && /* @__PURE__ */ _(n, {
|
|
87
|
-
items: C,
|
|
88
|
-
value: y,
|
|
89
|
-
size: "sm",
|
|
90
|
-
ariaLabel: "Blend space",
|
|
91
|
-
onChange: (e) => e && o({
|
|
92
|
-
...t,
|
|
93
|
-
interpolate: e
|
|
94
|
-
})
|
|
95
|
-
}), c = s(h);
|
|
96
|
-
if (c?.Editor) {
|
|
97
|
-
let n = c.Editor;
|
|
98
|
-
return /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(n, {
|
|
99
|
-
value: t,
|
|
100
|
-
onInput: a,
|
|
101
|
-
onChange: o
|
|
102
|
-
}), e] });
|
|
103
|
-
}
|
|
104
|
-
return l(t) ? /* @__PURE__ */ _(O, {
|
|
105
|
-
value: t,
|
|
106
|
-
spaceBar: e,
|
|
107
|
-
onInput: a,
|
|
108
|
-
onChange: o
|
|
109
|
-
}) : r(t) ? /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(i, {
|
|
110
|
-
value: t,
|
|
111
|
-
spaceSwitch: !1,
|
|
112
|
-
onInput: a,
|
|
113
|
-
onChange: o
|
|
114
|
-
}), e] }) : /* @__PURE__ */ v("div", {
|
|
115
|
-
className: w.noEditor,
|
|
116
|
-
children: [c?.label ?? h, ": no editor"]
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
function O(n) {
|
|
121
|
-
let { value: r, spaceBar: i, onInput: a, onChange: o } = n, s = r.stops, c = r.interpolate ?? "rgb", l = (e) => ({
|
|
122
|
-
...r,
|
|
123
|
-
stops: e
|
|
124
|
-
}), u = s.map((e) => ({
|
|
125
|
-
value: e.offset,
|
|
126
|
-
color: e.color
|
|
127
|
-
})), f = (e) => e.map((e) => ({
|
|
128
|
-
offset: e.value,
|
|
129
|
-
color: e.color
|
|
130
|
-
})), p = (e, t) => s.map((n, r) => r === e ? {
|
|
131
|
-
...n,
|
|
132
|
-
color: t
|
|
133
|
-
} : n), m = s.map((e, t) => ({
|
|
134
|
-
stop: e,
|
|
135
|
-
index: t
|
|
136
|
-
})).sort((e, t) => e.stop.offset - t.stop.offset);
|
|
137
|
-
return /* @__PURE__ */ v(g, { children: [
|
|
138
|
-
/* @__PURE__ */ _(t, {
|
|
139
|
-
min: 0,
|
|
140
|
-
max: 1,
|
|
141
|
-
step: .005,
|
|
142
|
-
constraint: "free",
|
|
143
|
-
thumbs: u,
|
|
144
|
-
ariaLabel: "Gradient stops",
|
|
145
|
-
readoutPlacement: "none",
|
|
146
|
-
onInput: (e) => a?.(l(f(e))),
|
|
147
|
-
onChange: (e) => o(l(f(e))),
|
|
148
|
-
onAddThumb: (e) => ({
|
|
149
|
-
value: e,
|
|
150
|
-
color: d(s, e, c)
|
|
151
|
-
}),
|
|
152
|
-
onRemoveThumb: () => s.length > E,
|
|
153
|
-
renderTrack: C({
|
|
154
|
-
gradient: (e) => d(s, e, c),
|
|
155
|
-
samples: c === "rgb" ? 32 : 64
|
|
156
|
-
})
|
|
157
|
-
}),
|
|
158
|
-
i,
|
|
159
|
-
/* @__PURE__ */ _("div", {
|
|
160
|
-
className: w.swatches,
|
|
161
|
-
children: m.map(({ stop: t, index: n }) => /* @__PURE__ */ _(e, {
|
|
162
|
-
value: t.color,
|
|
163
|
-
alpha: !0,
|
|
164
|
-
"aria-label": `Stop ${n + 1} at ${Math.round(t.offset * 100)}%`,
|
|
165
|
-
className: w.swatch,
|
|
166
|
-
onInput: (e) => a?.(l(p(n, e))),
|
|
167
|
-
onChange: (e) => o(l(p(n, e)))
|
|
168
|
-
}, n))
|
|
169
|
-
})
|
|
170
|
-
] });
|
|
171
|
-
}
|
|
172
|
-
var k = {
|
|
173
|
-
overlay: "_overlay_1ffuu_3",
|
|
174
|
-
guide: "_guide_1ffuu_13",
|
|
175
|
-
handle: "_handle_1ffuu_21"
|
|
176
|
-
};
|
|
177
|
-
//#endregion
|
|
178
|
-
//#region src/components/GradientEditor/GradientHandles.tsx
|
|
179
|
-
function A(e) {
|
|
180
|
-
let { value: t, toScreen: n, toLocal: r, onInput: i, onChange: a, width: o, height: s, className: c } = e;
|
|
181
|
-
return /* @__PURE__ */ _("svg", {
|
|
182
|
-
className: [k.overlay, c].filter(Boolean).join(" "),
|
|
183
|
-
width: o,
|
|
184
|
-
height: s,
|
|
185
|
-
children: j(t, n, r, i, a)
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
function j(e, t, n, r, i) {
|
|
189
|
-
let a = (e, t) => {
|
|
190
|
-
t === "input" ? r?.(e) : i(e);
|
|
191
|
-
};
|
|
192
|
-
if (e.fill === "linear-gradient") {
|
|
193
|
-
let r = t(e.from), i = t(e.to);
|
|
194
|
-
return /* @__PURE__ */ v(g, { children: [
|
|
195
|
-
/* @__PURE__ */ _(N, {
|
|
196
|
-
x1: r.x,
|
|
197
|
-
y1: r.y,
|
|
198
|
-
x2: i.x,
|
|
199
|
-
y2: i.y
|
|
200
|
-
}),
|
|
201
|
-
/* @__PURE__ */ _(P, {
|
|
202
|
-
at: r,
|
|
203
|
-
label: "Gradient start",
|
|
204
|
-
onDrag: (t, r) => a({
|
|
205
|
-
...e,
|
|
206
|
-
from: n(t)
|
|
207
|
-
}, r)
|
|
208
|
-
}),
|
|
209
|
-
/* @__PURE__ */ _(P, {
|
|
210
|
-
at: i,
|
|
211
|
-
label: "Gradient end",
|
|
212
|
-
onDrag: (t, r) => a({
|
|
213
|
-
...e,
|
|
214
|
-
to: n(t)
|
|
215
|
-
}, r)
|
|
216
|
-
})
|
|
217
|
-
] });
|
|
218
|
-
}
|
|
219
|
-
if (e.fill === "radial-gradient") {
|
|
220
|
-
let r = t(e.center), i = t({
|
|
221
|
-
x: e.center.x + e.radius,
|
|
222
|
-
y: e.center.y
|
|
223
|
-
}), o = Math.hypot(i.x - r.x, i.y - r.y);
|
|
224
|
-
return /* @__PURE__ */ v(g, { children: [
|
|
225
|
-
/* @__PURE__ */ _("circle", {
|
|
226
|
-
className: k.guide,
|
|
227
|
-
cx: r.x,
|
|
228
|
-
cy: r.y,
|
|
229
|
-
r: o
|
|
230
|
-
}),
|
|
231
|
-
/* @__PURE__ */ _(P, {
|
|
232
|
-
at: r,
|
|
233
|
-
label: "Gradient center",
|
|
234
|
-
onDrag: (t, r) => a({
|
|
235
|
-
...e,
|
|
236
|
-
center: n(t)
|
|
237
|
-
}, r)
|
|
238
|
-
}),
|
|
239
|
-
/* @__PURE__ */ _(P, {
|
|
240
|
-
at: i,
|
|
241
|
-
label: "Gradient radius",
|
|
242
|
-
onDrag: (t, r) => {
|
|
243
|
-
let i = n(t), o = Math.hypot(i.x - e.center.x, i.y - e.center.y);
|
|
244
|
-
a({
|
|
245
|
-
...e,
|
|
246
|
-
radius: Math.max(M, o)
|
|
247
|
-
}, r);
|
|
248
|
-
}
|
|
249
|
-
})
|
|
250
|
-
] });
|
|
251
|
-
}
|
|
252
|
-
let o = t(e.center), { radius: s } = c(e), l = t({
|
|
253
|
-
x: e.center.x + Math.cos(e.angle) * s,
|
|
254
|
-
y: e.center.y + Math.sin(e.angle) * s
|
|
255
|
-
});
|
|
256
|
-
return /* @__PURE__ */ v(g, { children: [
|
|
257
|
-
/* @__PURE__ */ _(N, {
|
|
258
|
-
x1: o.x,
|
|
259
|
-
y1: o.y,
|
|
260
|
-
x2: l.x,
|
|
261
|
-
y2: l.y
|
|
262
|
-
}),
|
|
263
|
-
/* @__PURE__ */ _(P, {
|
|
264
|
-
at: o,
|
|
265
|
-
label: "Gradient center",
|
|
266
|
-
onDrag: (t, r) => a({
|
|
267
|
-
...e,
|
|
268
|
-
center: n(t)
|
|
269
|
-
}, r)
|
|
270
|
-
}),
|
|
271
|
-
/* @__PURE__ */ _(P, {
|
|
272
|
-
at: l,
|
|
273
|
-
label: "Gradient angle",
|
|
274
|
-
onDrag: (t, r) => {
|
|
275
|
-
let i = n(t), o = Math.atan2(i.y - e.center.y, i.x - e.center.x);
|
|
276
|
-
a({
|
|
277
|
-
...e,
|
|
278
|
-
angle: o
|
|
279
|
-
}, r);
|
|
280
|
-
}
|
|
281
|
-
})
|
|
282
|
-
] });
|
|
283
|
-
}
|
|
284
|
-
var M = 1;
|
|
285
|
-
function N(e) {
|
|
286
|
-
return /* @__PURE__ */ _("line", {
|
|
287
|
-
className: k.guide,
|
|
288
|
-
...e
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
function P({ at: e, label: t, onDrag: n }) {
|
|
292
|
-
let r = y(e), i = p({
|
|
293
|
-
onStart: () => {
|
|
294
|
-
r.current = e;
|
|
295
|
-
},
|
|
296
|
-
onMove: (e) => {
|
|
297
|
-
n(e, "input");
|
|
298
|
-
},
|
|
299
|
-
onEnd: ({ point: e, moved: t }) => {
|
|
300
|
-
t && n(e, "commit");
|
|
301
|
-
},
|
|
302
|
-
onCancel: () => {
|
|
303
|
-
n(r.current, "input");
|
|
304
|
-
}
|
|
305
|
-
});
|
|
306
|
-
return /* @__PURE__ */ _("circle", {
|
|
307
|
-
className: k.handle,
|
|
308
|
-
cx: e.x,
|
|
309
|
-
cy: e.y,
|
|
310
|
-
r: F,
|
|
311
|
-
role: "button",
|
|
312
|
-
"aria-label": t,
|
|
313
|
-
tabIndex: 0,
|
|
314
|
-
onKeyDown: (t) => {
|
|
315
|
-
let r = t.shiftKey ? I * 10 : I, i = 0, a = 0;
|
|
316
|
-
if (t.key === "ArrowLeft") i = -r;
|
|
317
|
-
else if (t.key === "ArrowRight") i = r;
|
|
318
|
-
else if (t.key === "ArrowUp") a = -r;
|
|
319
|
-
else if (t.key === "ArrowDown") a = r;
|
|
320
|
-
else return;
|
|
321
|
-
t.preventDefault();
|
|
322
|
-
let o = {
|
|
323
|
-
x: e.x + i,
|
|
324
|
-
y: e.y + a
|
|
325
|
-
};
|
|
326
|
-
n(o, "input"), n(o, "commit");
|
|
327
|
-
},
|
|
328
|
-
...i
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
var F = 7, I = 1;
|
|
332
|
-
//#endregion
|
|
333
|
-
//#region src/components/GradientEditor/SceneGradientHandles.tsx
|
|
334
|
-
function L(e) {
|
|
335
|
-
let { scene: t, containerRef: n, nodeId: r, slot: i, view: s, className: c } = e, l = m(t, n, r, { view: s }), u = h(i === "fill" ? "setFill" : "setStroke"), d = l ? z(R(t, r, i)) : null;
|
|
336
|
-
if (!l || !d) return null;
|
|
337
|
-
let f = (e, t) => {
|
|
338
|
-
let n = o(e, l.box);
|
|
339
|
-
t === "commit" ? u.commit({ paint: n }) : u.input({ paint: n });
|
|
340
|
-
};
|
|
341
|
-
return /* @__PURE__ */ _(A, {
|
|
342
|
-
value: a(d, l.box),
|
|
343
|
-
toScreen: l.toScreen,
|
|
344
|
-
toLocal: l.toLocal,
|
|
345
|
-
width: l.width,
|
|
346
|
-
height: l.height,
|
|
347
|
-
className: c,
|
|
348
|
-
onInput: (e) => f(e, "input"),
|
|
349
|
-
onChange: (e) => f(e, "commit")
|
|
350
|
-
});
|
|
351
|
-
}
|
|
352
|
-
function R(e, t, n) {
|
|
353
|
-
if (t == null) return;
|
|
354
|
-
let r = e.nodes.get(t)?.data;
|
|
355
|
-
if (r) return n === "fill" ? r.fill : r.stroke?.paint;
|
|
356
|
-
}
|
|
357
|
-
function z(e) {
|
|
358
|
-
return l(e) ? e : null;
|
|
359
|
-
}
|
|
360
|
-
//#endregion
|
|
361
|
-
export { C as i, A as n, D as r, L as t };
|
|
362
|
-
|
|
363
|
-
//# sourceMappingURL=GradientEditor-b7v4Ph3i.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GradientEditor-b7v4Ph3i.js","names":["s","_Fragment","s","_Fragment","ColorField","ToggleBar","isMeshPaint","MeshEditor","DEFAULT_HATCH","paintGradientTrack","opts","stops","i","samples","t","gradient","ctx","baseGradient","layers","activeRange","low","high","h","hatch","stripe","dimColor","dimOverlay","wL","wR","style","GradientEditor_module_default","SPACES","MIN_STOPS","GradientEditor","props","kind","value","space","kinds","listGradientKinds","svg","nativeSvgKind","entry","spaces","nativeSvgSpace","item","switchKind","converted","switchGradientKind","next","onChange","className","kindSwitch","renderBody","spaceBar","spaceSwitch","getPaintKind","Editor","Fragment","isGradientFill","StopsBody","withStops","thumbs","stop","applyThumbs","setStopColor","index","ordered","a","b","Slider","onInput","at","sampleGradientStops","hex","GradientHandles_module_default","GradientHandles","renderForKind","toScreen","toLocal","emit","phase","from","to","Guide","DragPoint","p","center","edge","screenRadius","local","radius","MIN_RADIUS","gradientGeometry","tip","angle","start","useRef","drag","useHandleDrag","moved","onDrag","point","HANDLE_RADIUS","label","amount","e","KEY_STEP","dx","dy","SceneGradientHandles","frame","useNodeOverlayFrame","scene","containerRef","nodeId","edit","useOngoingAction","slot","gradientInSlot","paintOf","dispatch","paint","fillToBoundsFrame","fillInPoseFrame","data"],"sources":["../../src/paintGradientTrack.tsx","../../src/components/GradientEditor/GradientEditor.module.css","../../src/components/GradientEditor/GradientEditor.tsx","../../src/components/GradientEditor/GradientHandles.module.css","../../src/components/GradientEditor/GradientHandles.tsx","../../src/components/GradientEditor/SceneGradientHandles.tsx"],"sourcesContent":["import type { ReactNode, CSSProperties } from 'react';\nimport type { TrackCtx } from './components/Slider';\n\n/**\n * Options for {@link paintGradientTrack}.\n *\n * `gradient` maps a normalized position along the slider's value span (0 to\n * 1) to a CSS color; `samples` is how many stops the resulting\n * linear-gradient uses. The ramp is laid on the same span as the thumbs, so a\n * thumb at 0.3 sits over `gradient(0.3)`; any track beyond the span takes the\n * end colors.\n * `activeRange`, given in the slider's own value units, keeps that span at\n * full strength and dims + hatches the rest.\n */\nexport type GradientTrackOpts = {\n gradient: (t: number) => string;\n samples?: number;\n activeRange?: [number, number];\n hatch?: {\n angleDeg?: number;\n stripe?: number;\n gap?: number;\n dim?: number;\n };\n};\n\nconst DEFAULT_HATCH = { angleDeg: 135, stripe: 2, gap: 4, dim: 75 };\n\n/**\n * Builds a `Slider` `renderTrack` function that paints the track as a\n * sampled color gradient, optionally dimming and hatching the portions\n * outside an active range.\n */\nexport function paintGradientTrack(opts: GradientTrackOpts): (ctx: TrackCtx) => ReactNode {\n const { gradient, samples = 16, activeRange, hatch } = opts;\n\n return (ctx: TrackCtx) => {\n const stops: string[] = [];\n for (let i = 0; i <= samples; i++) {\n const t = i / samples;\n stops.push(`${gradient(t)} ${ctx.fractionToPosition(t)}`);\n }\n const baseGradient = `linear-gradient(to right, ${stops.join(', ')})`;\n\n const layers: string[] = [];\n if (activeRange) {\n const low = ctx.valueToFraction(activeRange[0]);\n const high = ctx.valueToFraction(activeRange[1]);\n const h = { ...DEFAULT_HATCH, ...hatch };\n const stripe = `repeating-linear-gradient(${h.angleDeg}deg, transparent 0 ${h.stripe}px, var(--wzl-surface) ${h.stripe}px ${h.stripe + h.gap}px)`;\n const dimColor = `color-mix(in srgb, var(--wzl-surface) ${h.dim}%, transparent)`;\n const dimOverlay = `linear-gradient(${dimColor}, ${dimColor})`;\n\n if (low > 0) {\n const wL = ctx.fractionToPosition(low);\n layers.push(`${dimOverlay} left 0 / ${wL} 100% no-repeat`);\n layers.push(`${stripe} left 0 / ${wL} 100% no-repeat`);\n }\n if (high < 1) {\n const wR = `calc(100% - ${ctx.fractionToPosition(high)})`;\n layers.push(`${dimOverlay} right 0 / ${wR} 100% no-repeat`);\n layers.push(`${stripe} right 0 / ${wR} 100% no-repeat`);\n }\n }\n layers.push(baseGradient);\n\n const style: CSSProperties = {\n position: 'absolute',\n inset: 0,\n background: layers.join(', '),\n };\n return <div style={style} />;\n };\n}\n",".root {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-4);\n min-inline-size: 0;\n}\n\n.swatches {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wzl-space-3);\n}\n\n/* Each stop's opacity slider would otherwise stretch the row to a width no\n * properties panel has; the chip stays legible, the slider yields. */\n.swatch {\n flex: 0 1 auto;\n min-inline-size: 0;\n}\n\n.noEditor {\n font-size: var(--wzl-font-size-sm);\n color: var(--wzl-fg-muted);\n}\n","import { type ReactElement, type ReactNode } from 'react';\nimport {\n getPaintKind,\n isGradientFill,\n listGradientKinds,\n sampleGradientStops,\n switchGradientKind,\n type ColorSpace,\n type FillStyle,\n type GradStop,\n type GradientFill,\n type PaintKind,\n} from '@weasel-js/core';\nimport { nativeSvgKind, nativeSvgSpace } from '@weasel-js/svg';\nimport { Slider, type Thumb } from '../Slider';\nimport { ColorField } from '../ColorField';\nimport { MeshEditor, isMeshPaint } from '../MeshEditor';\nimport { ToggleBar, type ToggleBarItem } from '../ToggleBar';\nimport { paintGradientTrack } from '../../paintGradientTrack';\nimport s from './GradientEditor.module.css';\n\nconst SPACES: readonly ToggleBarItem<ColorSpace>[] = [\n { value: 'rgb', label: 'sRGB' },\n { value: 'oklab', label: 'OKLab' },\n { value: 'oklch', label: 'OKLCh' },\n];\n\n/** Fewer than two stops is not a gradient any renderer can ramp between. */\nconst MIN_STOPS = 2;\n\n/**\n * Props for {@link GradientEditor}. `onInput` fires throughout a gesture and\n * `onChange` once at its end.\n */\nexport interface GradientEditorProps {\n /** The gradient being edited: a paint of any gradient kind — one that\n * `listGradientKinds` returns. */\n value: FillStyle;\n /**\n * Live value during a gesture — a stop drag, a color-picker scrub. Wire\n * it for preview; it fires many times per gesture and must not be\n * written to history.\n */\n onInput?: (next: FillStyle) => void;\n /** Committed value: one call per completed gesture. Pair with an\n * undoable write. */\n onChange: (next: FillStyle) => void;\n /** Show the kind switch — every registered gradient kind. Default true;\n * turn it off when the surrounding UI already owns the kind. */\n kindSwitch?: boolean;\n /** Show the sRGB / OKLab / OKLCh switch, which writes `interpolate`.\n * Default true. */\n spaceSwitch?: boolean;\n /**\n * Offer only what an SVG file carries natively: the linear and radial\n * gradients, which SVG has elements for, blended in sRGB, the only space\n * every SVG renderer honors. A conic or mesh gradient exports as a weasel\n * element that other renderers paint as one flat color, and an OKLab or\n * OKLCh blend exports as an attribute they ignore. A value already outside\n * that set keeps its own kind and space on offer, so it can be switched\n * back. Default false.\n */\n svg?: boolean;\n className?: string;\n}\n\ntype StopThumb = Thumb & { color: string };\n\n/**\n * Editor for a gradient's kind and colors: the stop list of a linear, radial\n * or conic gradient, a mesh's corner colors, or a registered kind's own\n * `Editor`. Switching kind goes through `switchGradientKind`, so the colors\n * carry across.\n *\n * Geometry (`from`/`to`, `center`, `radius`, `angle`) is deliberately not\n * edited here — on a canvas that belongs on the artwork, via\n * `<GradientHandles>`. This component owns the parts with no spatial\n * meaning, so it composes into a properties panel at any width.\n *\n * Stops are addressed by their position in `value.stops`, which is never\n * reordered — dragging one stop past another leaves both indices alone, so\n * a drag can cross a neighbour without the two swapping under the pointer.\n * Rendering sorts a copy.\n */\nexport function GradientEditor(props: GradientEditorProps): ReactElement {\n const { value, onInput, onChange, kindSwitch = true, spaceSwitch = true, svg = false, className } = props;\n const kind: PaintKind = value.fill ?? 'solid';\n const space: ColorSpace = (value as { interpolate?: ColorSpace }).interpolate ?? 'rgb';\n\n const kinds: readonly ToggleBarItem<PaintKind>[] = listGradientKinds()\n .filter((entry) => !svg || nativeSvgKind(entry.id) || entry.id === kind)\n .map((entry) => ({ value: entry.id, label: entry.label }));\n const spaces = SPACES.filter((item) => !svg || nativeSvgSpace(item.value) || item.value === space);\n\n const switchKind = (next: PaintKind): void => {\n const converted = switchGradientKind(value, next);\n if (converted && converted !== value) onChange(converted);\n };\n\n return (\n <div className={[s.root, className].filter(Boolean).join(' ')}>\n {kindSwitch && (\n <ToggleBar<PaintKind>\n items={kinds}\n value={kind}\n size=\"sm\"\n ariaLabel=\"Gradient kind\"\n onChange={(next) => next && switchKind(next)}\n />\n )}\n\n {renderBody()}\n </div>\n );\n\n function renderBody(): ReactElement {\n const spaceBar = spaceSwitch && spaces.length > 1 && (\n <ToggleBar<ColorSpace>\n items={spaces}\n value={space}\n size=\"sm\"\n ariaLabel=\"Blend space\"\n onChange={(next) => next && onChange({ ...value, interpolate: next } as FillStyle)}\n />\n );\n // A registered `Editor` wins even for a built-in id, as it does in `PaintInput`.\n const entry = getPaintKind(kind);\n if (entry?.Editor) {\n const Editor = entry.Editor;\n return <><Editor value={value} onInput={onInput} onChange={onChange} />{spaceBar}</>;\n }\n if (isGradientFill(value)) {\n return <StopsBody value={value} spaceBar={spaceBar} onInput={onInput} onChange={onChange} />;\n }\n if (isMeshPaint(value)) {\n return <><MeshEditor value={value} spaceSwitch={false} onInput={onInput} onChange={onChange} />{spaceBar}</>;\n }\n return <div className={s.noEditor}>{entry?.label ?? kind}: no editor</div>;\n }\n}\n\n/** The stop slider and swatch row of a linear, radial or conic gradient. */\nfunction StopsBody(props: {\n value: GradientFill;\n spaceBar: ReactNode;\n onInput?: (next: FillStyle) => void;\n onChange: (next: FillStyle) => void;\n}): ReactElement {\n const { value, spaceBar, onInput, onChange } = props;\n const stops = value.stops;\n const space = value.interpolate ?? 'rgb';\n\n const withStops = (next: GradStop[]): GradientFill => ({ ...value, stops: next });\n\n const thumbs: StopThumb[] = stops.map((stop) => ({ value: stop.offset, color: stop.color }));\n\n const applyThumbs = (next: StopThumb[]): GradStop[] =>\n next.map((t) => ({ offset: t.value, color: t.color }));\n\n const setStopColor = (index: number, color: string): GradStop[] =>\n stops.map((stop, i) => (i === index ? { ...stop, color } : stop));\n\n // Sorted view for the swatch row, carrying each stop's real index so a\n // recolor writes back to the right entry.\n const ordered = stops\n .map((stop, index) => ({ stop, index }))\n .sort((a, b) => a.stop.offset - b.stop.offset);\n\n return (\n <>\n <Slider<StopThumb>\n min={0}\n max={1}\n step={0.005}\n constraint=\"free\"\n thumbs={thumbs}\n ariaLabel=\"Gradient stops\"\n readoutPlacement=\"none\"\n onInput={(next) => onInput?.(withStops(applyThumbs(next)))}\n onChange={(next) => onChange(withStops(applyThumbs(next)))}\n onAddThumb={(at) => ({ value: at, color: sampleGradientStops(stops, at, space) })}\n onRemoveThumb={() => stops.length > MIN_STOPS}\n renderTrack={paintGradientTrack({\n gradient: (t) => sampleGradientStops(stops, t, space),\n // The track lerps between samples in sRGB whatever the gradient does,\n // so a hue arc needs more of them to not read as a straight line.\n samples: space === 'rgb' ? 32 : 64,\n })}\n />\n\n {spaceBar}\n\n <div className={s.swatches}>\n {ordered.map(({ stop, index }) => (\n <ColorField\n key={index}\n value={stop.color}\n alpha\n aria-label={`Stop ${index + 1} at ${Math.round(stop.offset * 100)}%`}\n className={s.swatch}\n onInput={(hex) => onInput?.(withStops(setStopColor(index, hex)))}\n onChange={(hex) => onChange(withStops(setStopColor(index, hex)))}\n />\n ))}\n </div>\n </>\n );\n}\n","/* The overlay covers the canvas but must not intercept tool input; only the\n * handles opt back into hit-testing. */\n.overlay {\n position: absolute;\n inset: 0;\n pointer-events: none;\n}\n\n/* These sit over artwork of unknown color, not over the app's own surface,\n * so they are deliberately not themed: a themed handle disappears against\n * whatever the user painted underneath. White-on-dark reads on anything,\n * which is why every editor draws handles this way. */\n.guide {\n fill: none;\n stroke: #ffffff;\n stroke-opacity: 0.7;\n stroke-dasharray: 4 4;\n paint-order: stroke;\n}\n\n.handle {\n fill: #ffffff;\n stroke: #222222;\n stroke-width: 2;\n cursor: grab;\n pointer-events: auto;\n}\n\n.handle:active {\n cursor: grabbing;\n}\n\n.handle:focus-visible {\n outline: 2px solid var(--wzl-accent);\n outline-offset: 2px;\n}\n","import { useRef, type KeyboardEvent as ReactKeyboardEvent, type ReactElement, type ReactNode } from 'react';\nimport { useHandleDrag, gradientGeometry, type GradientFill } from '@weasel-js/core';\nimport s from './GradientHandles.module.css';\n\n/** Structural, and deliberately not exported — `Plot2D` and `CurveEditor`\n * each publish their own `Point`, and a third would only be ambiguous at\n * the package barrel. Consumers pass any `{ x, y }`. */\ninterface Point {\n x: number;\n y: number;\n}\n\n/**\n * Props for {@link GradientHandles}. `onInput` fires throughout a drag and\n * `onChange` once at its end.\n */\nexport interface GradientHandlesProps {\n /**\n * The gradient whose geometry these handles move, in a **resolved,\n * isotropic** frame — one where `radius` is a length in the same units as\n * `center.x` and a right angle is a right angle.\n *\n * A `units: 'bounds'` gradient is not such a frame: `x` and `y` are\n * fractions of two different lengths, so a circle there is an ellipse on\n * screen and polar math silently mixes scales. Resolve it first with\n * `fillInPoseFrame(fill, box)` and convert edits back with\n * `fillToBoundsFrame(next, box)`.\n */\n value: GradientFill;\n /**\n * Gradient space → overlay pixels. For a `units: 'local'` gradient this\n * is the node's local-to-screen transform; for `'world'`, the view.\n */\n toScreen: (p: Point) => Point;\n /** Overlay pixels → gradient space. Must invert `toScreen`. */\n toLocal: (p: Point) => Point;\n /** Live during a drag — wire for preview, do not write to history. */\n onInput?: (next: GradientFill) => void;\n /** Committed at drag end: one call per gesture. */\n onChange: (next: GradientFill) => void;\n /** Overlay size in CSS pixels. */\n width: number;\n height: number;\n className?: string;\n}\n\n/**\n * Direct-manipulation handles for a gradient's geometry, drawn as an SVG\n * overlay above a canvas: endpoints for linear, center and radius for\n * radial, center and angle arm for conic.\n *\n * Positioning is entirely the consumer's `toScreen` / `toLocal` — this\n * component never sees a view or a scene node, so the same handles serve a\n * node-local gradient, a world-space one, and a plain unzoomed preview.\n *\n * The overlay ignores pointer events except on the handles themselves, so\n * it can sit over live canvas content without swallowing tool input.\n */\nexport function GradientHandles(props: GradientHandlesProps): ReactElement {\n const { value, toScreen, toLocal, onInput, onChange, width, height, className } = props;\n\n return (\n <svg\n className={[s.overlay, className].filter(Boolean).join(' ')}\n width={width}\n height={height}\n >\n {renderForKind(value, toScreen, toLocal, onInput, onChange)}\n </svg>\n );\n}\n\nfunction renderForKind(\n value: GradientFill,\n toScreen: (p: Point) => Point,\n toLocal: (p: Point) => Point,\n onInput: ((next: GradientFill) => void) | undefined,\n onChange: (next: GradientFill) => void,\n): ReactNode {\n const emit = (next: GradientFill, phase: 'input' | 'commit'): void => {\n if (phase === 'input') onInput?.(next);\n else onChange(next);\n };\n\n if (value.fill === 'linear-gradient') {\n const from = toScreen(value.from);\n const to = toScreen(value.to);\n return (\n <>\n <Guide x1={from.x} y1={from.y} x2={to.x} y2={to.y} />\n <DragPoint\n at={from}\n label=\"Gradient start\"\n onDrag={(p, phase) => emit({ ...value, from: toLocal(p) }, phase)}\n />\n <DragPoint\n at={to}\n label=\"Gradient end\"\n onDrag={(p, phase) => emit({ ...value, to: toLocal(p) }, phase)}\n />\n </>\n );\n }\n\n if (value.fill === 'radial-gradient') {\n const center = toScreen(value.center);\n // The radius handle rides the +x axis of gradient space, so it stays on\n // the drawn circle under a rotated or anisotropic transform.\n const edge = toScreen({ x: value.center.x + value.radius, y: value.center.y });\n const screenRadius = Math.hypot(edge.x - center.x, edge.y - center.y);\n return (\n <>\n <circle className={s.guide} cx={center.x} cy={center.y} r={screenRadius} />\n <DragPoint\n at={center}\n label=\"Gradient center\"\n onDrag={(p, phase) => emit({ ...value, center: toLocal(p) }, phase)}\n />\n <DragPoint\n at={edge}\n label=\"Gradient radius\"\n onDrag={(p, phase) => {\n const local = toLocal(p);\n const radius = Math.hypot(local.x - value.center.x, local.y - value.center.y);\n emit({ ...value, radius: Math.max(MIN_RADIUS, radius) }, phase);\n }}\n />\n </>\n );\n }\n\n const center = toScreen(value.center);\n const { radius } = gradientGeometry(value);\n const tip = toScreen({\n x: value.center.x + Math.cos(value.angle) * radius,\n y: value.center.y + Math.sin(value.angle) * radius,\n });\n return (\n <>\n <Guide x1={center.x} y1={center.y} x2={tip.x} y2={tip.y} />\n <DragPoint\n at={center}\n label=\"Gradient center\"\n onDrag={(p, phase) => emit({ ...value, center: toLocal(p) }, phase)}\n />\n <DragPoint\n at={tip}\n label=\"Gradient angle\"\n onDrag={(p, phase) => {\n const local = toLocal(p);\n const angle = Math.atan2(local.y - value.center.y, local.x - value.center.x);\n emit({ ...value, angle }, phase);\n }}\n />\n </>\n );\n}\n\n/** A radius of zero divides by zero in the shader's `t`; keep it off the floor. */\nconst MIN_RADIUS = 1;\n\nfunction Guide(props: { x1: number; y1: number; x2: number; y2: number }): ReactElement {\n return <line className={s.guide} {...props} />;\n}\n\nfunction DragPoint({\n at,\n label,\n onDrag,\n}: {\n at: Point;\n label: string;\n onDrag: (p: Point, phase: 'input' | 'commit') => void;\n}): ReactElement {\n const start = useRef<Point>(at);\n const drag = useHandleDrag<SVGCircleElement>({\n onStart: () => { start.current = at; },\n onMove: (p) => { onDrag(p, 'input'); },\n onEnd: ({ point, moved }) => {\n // A press that never moved is not an edit and must not write anything.\n if (moved) onDrag(point, 'commit');\n },\n // An abandoned gesture is not an edit either — put the live preview back\n // where it started rather than committing where it was left.\n onCancel: () => { onDrag(start.current, 'input'); },\n });\n const onKeyDown = (e: ReactKeyboardEvent<SVGCircleElement>): void => {\n const amount = e.shiftKey ? KEY_STEP * 10 : KEY_STEP;\n let dx = 0;\n let dy = 0;\n if (e.key === 'ArrowLeft') dx = -amount;\n else if (e.key === 'ArrowRight') dx = amount;\n else if (e.key === 'ArrowUp') dy = -amount;\n else if (e.key === 'ArrowDown') dy = amount;\n else return;\n e.preventDefault();\n const next = { x: at.x + dx, y: at.y + dy };\n onDrag(next, 'input');\n onDrag(next, 'commit');\n };\n return (\n <circle\n className={s.handle}\n cx={at.x}\n cy={at.y}\n r={HANDLE_RADIUS}\n // Not `slider`: the handle carries a 2-D position, not one value, so\n // it has no `aria-valuenow` to honor the role's contract with.\n role=\"button\"\n aria-label={label}\n tabIndex={0}\n onKeyDown={onKeyDown}\n {...drag}\n />\n );\n}\n\nconst HANDLE_RADIUS = 7;\n\n/** One arrow-key step, in overlay pixels. */\nconst KEY_STEP = 1;\n","import { type ReactElement, type RefObject } from 'react';\nimport {\n fillInPoseFrame,\n fillToBoundsFrame,\n isGradientFill,\n useNodeOverlayFrame,\n useOngoingAction,\n type FillStyle,\n type GradientFill,\n type RectPose,\n type Scene,\n type Stroke,\n type View,\n} from '@weasel-js/core';\nimport { GradientHandles } from './GradientHandles';\n\n/** The paint slots a node carries. Either may hold a gradient, and each has\n * its own action, so the overlay is told which one it is editing. */\nexport type PaintSlot = 'fill' | 'stroke';\n\n/** What `SceneGradientHandles` reads off a node. Every field is optional, so\n * any richer app data shape satisfies it. */\nexport interface PaintedNodeData {\n fill?: FillStyle | null;\n stroke?: Stroke | null;\n}\n\nexport interface SceneGradientHandlesProps<\n TData extends PaintedNodeData,\n TLayer extends string,\n TPose extends RectPose,\n> {\n scene: Scene<TData, TLayer, TPose>;\n /** The element the overlay is positioned in. Must be the canvas's own box,\n * or the handles land somewhere other than the paint. */\n containerRef: RefObject<HTMLElement | null>;\n /** The node whose paint is being edited — usually the lone selected id. */\n nodeId: string | null | undefined;\n /** Which of the node's two paints these handles move. */\n slot: PaintSlot;\n /** Current viewport; a thunk is re-read per projection. See\n * `useNodeOverlayFrame`. */\n view?: View | (() => View);\n className?: string;\n}\n\n/**\n * Scene-aware `GradientHandles`: on-canvas geometry handles for the gradient\n * in one node's `fill` or `stroke`, committed through the `setFill` /\n * `setStroke` actions as a single undo entry per drag.\n *\n * Renders nothing unless the targeted slot holds a gradient. The node stores\n * its gradient in `units: 'bounds'` — fractions of its own box, so the paint\n * survives pan, zoom and resize — which is not a frame polar math can work\n * in; the handles get it resolved onto the box and every edit is normalized\n * back on the way out.\n *\n * `slot` is a prop rather than state the kit keeps: an app that edits fill\n * and stroke separately already knows which one has focus.\n */\nexport function SceneGradientHandles<\n TData extends PaintedNodeData,\n TLayer extends string,\n TPose extends RectPose,\n>(props: SceneGradientHandlesProps<TData, TLayer, TPose>): ReactElement | null {\n const { scene, containerRef, nodeId, slot, view, className } = props;\n const frame = useNodeOverlayFrame(scene, containerRef, nodeId, { view });\n const edit = useOngoingAction(slot === 'fill' ? 'setFill' : 'setStroke');\n\n const gradient = frame ? gradientInSlot(paintOf(scene, nodeId, slot)) : null;\n if (!frame || !gradient) return null;\n\n const dispatch = (next: GradientFill, phase: 'input' | 'commit'): void => {\n const paint = fillToBoundsFrame(next, frame.box);\n if (phase === 'commit') edit.commit({ paint });\n else edit.input({ paint });\n };\n\n return (\n <GradientHandles\n value={fillInPoseFrame(gradient, frame.box) as GradientFill}\n toScreen={frame.toScreen}\n toLocal={frame.toLocal}\n width={frame.width}\n height={frame.height}\n className={className}\n onInput={(next) => dispatch(next, 'input')}\n onChange={(next) => dispatch(next, 'commit')}\n />\n );\n}\n\nfunction paintOf<TData extends PaintedNodeData, TLayer extends string, TPose extends RectPose>(\n scene: Scene<TData, TLayer, TPose>,\n nodeId: string | null | undefined,\n slot: PaintSlot,\n): FillStyle | null | undefined {\n if (nodeId == null) return undefined;\n const data = (scene.nodes as ReadonlyMap<string, { data: TData }>).get(nodeId)?.data;\n if (!data) return undefined;\n return slot === 'fill' ? data.fill : data.stroke?.paint;\n}\n\nfunction gradientInSlot(paint: FillStyle | null | undefined): GradientFill | null {\n return isGradientFill(paint) ? paint : null;\n}\n"],"mappings":"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"}
|