@weasel-js/ui 1.5.2 → 1.6.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.
- package/dist/chunks/ActionBar-DCq16yFA.js +57 -0
- package/dist/chunks/ActionBar-DCq16yFA.js.map +1 -0
- package/dist/chunks/{Badge-CW9pBPFl.js → Badge-CyAIZSDo.js} +758 -741
- package/dist/chunks/Badge-CyAIZSDo.js.map +1 -0
- package/dist/chunks/{BandEditor-jY-PFKY6.js → BandEditor-Dhm_Xrlr.js} +37 -36
- package/dist/chunks/BandEditor-Dhm_Xrlr.js.map +1 -0
- package/dist/chunks/Button-BIdXHQOx.js +111 -0
- package/dist/chunks/Button-BIdXHQOx.js.map +1 -0
- package/dist/chunks/ButtonBar-D5Vi0aj_.js +46 -0
- package/dist/chunks/ButtonBar-D5Vi0aj_.js.map +1 -0
- package/dist/chunks/Callout-yEn9iPlh.js +119 -0
- package/dist/chunks/Callout-yEn9iPlh.js.map +1 -0
- package/dist/chunks/{Checkbox-BOsDAY2F.js → Checkbox-DHXTUHO9.js} +1 -1
- package/dist/chunks/Checkbox-DHXTUHO9.js.map +1 -0
- package/dist/chunks/Code-AsKpgnv6.js +24 -0
- package/dist/chunks/Code-AsKpgnv6.js.map +1 -0
- package/dist/chunks/{ColorField-BYzgZM9o.js → ColorField-BcMcW8Sa.js} +16 -16
- package/dist/chunks/ColorField-BcMcW8Sa.js.map +1 -0
- package/dist/chunks/ColorModeControl-ke5PXbBa.js +47 -0
- package/dist/chunks/ColorModeControl-ke5PXbBa.js.map +1 -0
- package/dist/chunks/{ComboBox-Cz3f0Y_8.js → ComboBox-DpT8lc3p.js} +3 -3
- package/dist/chunks/ComboBox-DpT8lc3p.js.map +1 -0
- package/dist/chunks/{CurveEditor-DXwSP-iA.js → CurveEditor-BDJXjEvK.js} +35 -35
- package/dist/chunks/CurveEditor-BDJXjEvK.js.map +1 -0
- package/dist/chunks/DataGrid-D-dZj1BD.js +152 -0
- package/dist/chunks/DataGrid-D-dZj1BD.js.map +1 -0
- package/dist/chunks/DetailList-BMER1LUZ.js +43 -0
- package/dist/chunks/DetailList-BMER1LUZ.js.map +1 -0
- package/dist/chunks/{DetentSlider-CAubVX0J.js → DetentSlider-CL8TlX3S.js} +2 -2
- package/dist/chunks/DetentSlider-CL8TlX3S.js.map +1 -0
- package/dist/chunks/Dialog-BWyNMgpf.js +66 -0
- package/dist/chunks/Dialog-BWyNMgpf.js.map +1 -0
- package/dist/chunks/Disclosure-0G0uh2fa.js +58 -0
- package/dist/chunks/Disclosure-0G0uh2fa.js.map +1 -0
- package/dist/chunks/DragGhost-B5_hb9W9.js +30 -0
- package/dist/chunks/DragGhost-B5_hb9W9.js.map +1 -0
- package/dist/chunks/{DragHandleGlyph-CppAz4_8.js → DragHandleGlyph-Dr7Fgo0I.js} +1 -1
- package/dist/chunks/DragHandleGlyph-Dr7Fgo0I.js.map +1 -0
- package/dist/chunks/{Field-DWnV8WZY.js → Field--onYxXTF.js} +7 -6
- package/dist/chunks/Field--onYxXTF.js.map +1 -0
- package/dist/chunks/FillStrokeSwatch-DNb0KXPk.js +111 -0
- package/dist/chunks/FillStrokeSwatch-DNb0KXPk.js.map +1 -0
- package/dist/chunks/{FontFamilySelect-DxfgTC3G.js → FontFamilySelect-DXlMKWfK.js} +2 -2
- package/dist/chunks/FontFamilySelect-DXlMKWfK.js.map +1 -0
- package/dist/chunks/GradientEditor-B3a-MsVJ.js +335 -0
- package/dist/chunks/GradientEditor-B3a-MsVJ.js.map +1 -0
- package/dist/chunks/{Icon-DT0x6HaQ.js → Icon-Cgzy8VgC.js} +28 -20
- package/dist/chunks/Icon-Cgzy8VgC.js.map +1 -0
- package/dist/chunks/InlineRange-eOj6JpJl.js +29 -0
- package/dist/chunks/InlineRange-eOj6JpJl.js.map +1 -0
- package/dist/chunks/{Input-DbMKpkXy.js → Input-CHmkfYaD.js} +24 -19
- package/dist/chunks/Input-CHmkfYaD.js.map +1 -0
- package/dist/chunks/ItemList-Cm-HUWCi.js +174 -0
- package/dist/chunks/ItemList-Cm-HUWCi.js.map +1 -0
- package/dist/chunks/ItemList.module-BSpCSxan.js +14 -0
- package/dist/chunks/ItemList.module-BSpCSxan.js.map +1 -0
- package/dist/chunks/{Jog-DkkTlL3_.js → Jog-DESxZ44P.js} +6 -6
- package/dist/chunks/Jog-DESxZ44P.js.map +1 -0
- package/dist/chunks/{Keycaps-DunVpejA.js → Keycaps-C0H_v2gO.js} +71 -65
- package/dist/chunks/Keycaps-C0H_v2gO.js.map +1 -0
- package/dist/chunks/LayerList-nz-QYvTF.js +427 -0
- package/dist/chunks/LayerList-nz-QYvTF.js.map +1 -0
- package/dist/chunks/ListEditor-BQ6AV3Ac.js +74 -0
- package/dist/chunks/ListEditor-BQ6AV3Ac.js.map +1 -0
- package/dist/chunks/MenuButton-DtaGenKf.js +70 -0
- package/dist/chunks/MenuButton-DtaGenKf.js.map +1 -0
- package/dist/chunks/MeshEditor-qqGc6hlD.js +87 -0
- package/dist/chunks/MeshEditor-qqGc6hlD.js.map +1 -0
- package/dist/chunks/{NumberField-CCjEDZCg.js → NumberField-CwJOMmQR.js} +27 -22
- package/dist/chunks/NumberField-CwJOMmQR.js.map +1 -0
- package/dist/chunks/{OptionsBar-DeQ-vUeZ.js → OptionsBar-DbzAgIln.js} +3 -3
- package/dist/chunks/OptionsBar-DbzAgIln.js.map +1 -0
- package/dist/chunks/{PaintField-jBOJ32rL.js → PaintField-DaJukRc6.js} +21 -21
- package/dist/chunks/PaintField-DaJukRc6.js.map +1 -0
- package/dist/chunks/{PaintInput-Qs7Rul5R.js → PaintInput-Byhna3H-.js} +24 -24
- package/dist/chunks/PaintInput-Byhna3H-.js.map +1 -0
- package/dist/chunks/{PatternPicker-BMpXWboq.js → PatternPicker-B-cUt-JT.js} +2 -2
- package/dist/chunks/PatternPicker-B-cUt-JT.js.map +1 -0
- package/dist/chunks/{Plot2D-CXf_f7QD.js → Plot2D-CTXHkL5p.js} +13 -13
- package/dist/chunks/Plot2D-CTXHkL5p.js.map +1 -0
- package/dist/chunks/{PointPlotter-S_gz7VYt.js → PointPlotter-Bxo6haKe.js} +5 -4
- package/dist/chunks/PointPlotter-Bxo6haKe.js.map +1 -0
- package/dist/chunks/Powerline-ExO5GwEr.js +42 -0
- package/dist/chunks/Powerline-ExO5GwEr.js.map +1 -0
- package/dist/chunks/Prefs-DpqFKiwY.js +476 -0
- package/dist/chunks/Prefs-DpqFKiwY.js.map +1 -0
- package/dist/chunks/Properties-D_KzDN9K.js +282 -0
- package/dist/chunks/Properties-D_KzDN9K.js.map +1 -0
- package/dist/chunks/PropertyField-DGCecAnV.js +758 -0
- package/dist/chunks/PropertyField-DGCecAnV.js.map +1 -0
- package/dist/chunks/{RadioGroup-CsVp3SEu.js → RadioGroup-Bh4-12e-.js} +2 -2
- package/dist/chunks/RadioGroup-Bh4-12e-.js.map +1 -0
- package/dist/chunks/{RangeSlider-DNr-pJpZ.js → RangeSlider-BKRRTPTZ.js} +1 -1
- package/dist/chunks/RangeSlider-BKRRTPTZ.js.map +1 -0
- package/dist/chunks/{ResizeHandle-RXFf5fXr.js → ResizeHandle-BKT0XYpx.js} +15 -15
- package/dist/chunks/ResizeHandle-BKT0XYpx.js.map +1 -0
- package/dist/chunks/Select-CzyfaXzp.js +225 -0
- package/dist/chunks/Select-CzyfaXzp.js.map +1 -0
- package/dist/chunks/{SelectionPanel-CEbLS-0D.js → SelectionPanel-BgUM1h03.js} +21 -20
- package/dist/chunks/SelectionPanel-BgUM1h03.js.map +1 -0
- package/dist/chunks/{Sidebar-qn_oSCNX.js → Sidebar-BZ0m4afn.js} +8 -8
- package/dist/chunks/Sidebar-BZ0m4afn.js.map +1 -0
- package/dist/chunks/{SidebarPanel-Bs6V21hg.js → SidebarPanel-aoIqxbtq.js} +15 -19
- package/dist/chunks/SidebarPanel-aoIqxbtq.js.map +1 -0
- package/dist/chunks/{Slider-CIIrqiFS.js → Slider-CFwQYQ10.js} +94 -92
- package/dist/chunks/Slider-CFwQYQ10.js.map +1 -0
- package/dist/chunks/{StatusBar-B4L15DSm.js → StatusBar-DzoPDY4k.js} +8 -8
- package/dist/chunks/StatusBar-DzoPDY4k.js.map +1 -0
- package/dist/chunks/SwatchGrid-BARC3rnF.js +73 -0
- package/dist/chunks/SwatchGrid-BARC3rnF.js.map +1 -0
- package/dist/chunks/{Switch-DH5POG0T.js → Switch-CSYmcM8y.js} +1 -1
- package/dist/chunks/Switch-CSYmcM8y.js.map +1 -0
- package/dist/chunks/{Tabs-BFHikpml.js → Tabs-BbpzLLdY.js} +1 -1
- package/dist/chunks/Tabs-BbpzLLdY.js.map +1 -0
- package/dist/chunks/{Timeline-DNKY_yiK.js → Timeline--58F7MED.js} +141 -145
- package/dist/chunks/Timeline--58F7MED.js.map +1 -0
- package/dist/chunks/{Toast-CI1UDuK6.js → Toast-DNBb-24H.js} +1 -1
- package/dist/chunks/Toast-DNBb-24H.js.map +1 -0
- package/dist/chunks/ToggleBar-DTjGeS0Q.js +82 -0
- package/dist/chunks/ToggleBar-DTjGeS0Q.js.map +1 -0
- package/dist/chunks/{TokenPanel-BPHq24dc.js → TokenPanel-CMq7uydV.js} +50 -47
- package/dist/chunks/TokenPanel-CMq7uydV.js.map +1 -0
- package/dist/chunks/{ToolButton-9QzJCmuM.js → ToolButton-CR4sQlxF.js} +4 -4
- package/dist/chunks/ToolButton-CR4sQlxF.js.map +1 -0
- package/dist/chunks/{ToolGroup-BJiDrH_i.js → ToolGroup-Dpg1LN0l.js} +7 -7
- package/dist/chunks/ToolGroup-Dpg1LN0l.js.map +1 -0
- package/dist/chunks/{ToolOptionsBar-CAM6RcUH.js → ToolOptionsBar-CtzTlaN2.js} +6 -5
- package/dist/chunks/ToolOptionsBar-CtzTlaN2.js.map +1 -0
- package/dist/chunks/ToolPalette-CKG9qY6P.js +83 -0
- package/dist/chunks/ToolPalette-CKG9qY6P.js.map +1 -0
- package/dist/chunks/Tooltip-Clg2mhSt.js +42 -0
- package/dist/chunks/Tooltip-Clg2mhSt.js.map +1 -0
- package/dist/chunks/Tree-DVOtc9R5.js +203 -0
- package/dist/chunks/Tree-DVOtc9R5.js.map +1 -0
- package/dist/chunks/{createKeyframeLayer-DKtO0Sw_.js → createKeyframeLayer-Czj6Y235.js} +86 -86
- package/dist/chunks/createKeyframeLayer-Czj6Y235.js.map +1 -0
- package/dist/chunks/{dlog-CMYiRF3Q.js → dlog-F0I8KsIW.js} +2 -2
- package/dist/chunks/dlog-F0I8KsIW.js.map +1 -0
- package/dist/chunks/formatShortcut-DRQrVThu.js +15 -0
- package/dist/chunks/formatShortcut-DRQrVThu.js.map +1 -0
- package/dist/chunks/icons-Dk8SRS8g.js +162 -0
- package/dist/chunks/icons-Dk8SRS8g.js.map +1 -0
- package/dist/chunks/interactiveTarget-BNZmTow2.js +24 -0
- package/dist/chunks/interactiveTarget-BNZmTow2.js.map +1 -0
- package/dist/chunks/{keyGlyph-Bp0wnLHn.js → keyGlyph-C0qTakG-.js} +1 -1
- package/dist/chunks/keyGlyph-C0qTakG-.js.map +1 -0
- package/dist/chunks/model-Du7Lta4C.js +360 -0
- package/dist/chunks/model-Du7Lta4C.js.map +1 -0
- package/dist/chunks/{number-BHz66zQO.js → number-D3NEx_8r.js} +3 -3
- package/dist/chunks/number-D3NEx_8r.js.map +1 -0
- package/dist/chunks/paintPreview-CuSZiHpR.js +42 -0
- package/dist/chunks/paintPreview-CuSZiHpR.js.map +1 -0
- package/dist/chunks/paintValue-BpaGPjV3.js +18 -0
- package/dist/chunks/paintValue-BpaGPjV3.js.map +1 -0
- package/dist/chunks/{portalHost-CjpCnuGU.js → portalHost-yTOVuCej.js} +1 -1
- package/dist/chunks/portalHost-yTOVuCej.js.map +1 -0
- package/dist/chunks/prefField-Dnl7nmjQ.js +197 -0
- package/dist/chunks/prefField-Dnl7nmjQ.js.map +1 -0
- package/dist/chunks/segmentTooltip-CStYHKzd.js +29 -0
- package/dist/chunks/segmentTooltip-CStYHKzd.js.map +1 -0
- package/dist/chunks/segmentedControl.module-Bv7DEg8f.js +11 -0
- package/dist/chunks/segmentedControl.module-Bv7DEg8f.js.map +1 -0
- package/dist/chunks/{snap-CEjuWOhN.js → snap-DRjbOiG9.js} +1 -1
- package/dist/chunks/snap-DRjbOiG9.js.map +1 -0
- package/dist/chunks/stance-BFQpS_fL.js +17 -0
- package/dist/chunks/stance-BFQpS_fL.js.map +1 -0
- package/dist/chunks/useReorderDragList-B_-5L5Gu.js +131 -0
- package/dist/chunks/useReorderDragList-B_-5L5Gu.js.map +1 -0
- package/dist/chunks/{useRovingTabIndex-Dkpf_KhN.js → useRovingTabIndex-Bp_hYm_h.js} +1 -1
- package/dist/chunks/useRovingTabIndex-Bp_hYm_h.js.map +1 -0
- package/dist/color/ramp.d.ts +38 -0
- package/dist/color/ramp.d.ts.map +1 -0
- package/dist/components/ActionBar/ActionBar.d.ts +7 -5
- package/dist/components/ActionBar/ActionBar.d.ts.map +1 -1
- package/dist/components/ActionBar/index.js +1 -1
- package/dist/components/Badge/Badge.d.ts +21 -7
- package/dist/components/Badge/Badge.d.ts.map +1 -1
- package/dist/components/Badge/effects/Aqua.d.ts +1 -1
- package/dist/components/Badge/effects/Aqua.d.ts.map +1 -1
- package/dist/components/Badge/index.d.ts +1 -1
- package/dist/components/Badge/index.d.ts.map +1 -1
- package/dist/components/Badge/index.js +1 -1
- package/dist/components/Badge/types.d.ts +6 -5
- package/dist/components/Badge/types.d.ts.map +1 -1
- package/dist/components/BandEditor/index.js +1 -1
- package/dist/components/Button/Button.d.ts +17 -3
- package/dist/components/Button/Button.d.ts.map +1 -1
- package/dist/components/Button/index.d.ts +1 -1
- package/dist/components/Button/index.d.ts.map +1 -1
- package/dist/components/Button/index.js +1 -1
- package/dist/components/ButtonBar/ButtonBar.d.ts +36 -0
- package/dist/components/ButtonBar/ButtonBar.d.ts.map +1 -0
- package/dist/components/ButtonBar/index.d.ts +3 -0
- package/dist/components/ButtonBar/index.d.ts.map +1 -0
- package/dist/components/ButtonBar/index.js +2 -0
- package/dist/components/Callout/Callout.d.ts +3 -6
- package/dist/components/Callout/Callout.d.ts.map +1 -1
- package/dist/components/Callout/index.d.ts +1 -1
- package/dist/components/Callout/index.d.ts.map +1 -1
- package/dist/components/Callout/index.js +1 -1
- package/dist/components/Checkbox/index.js +1 -1
- package/dist/components/Code/Code.d.ts +28 -0
- package/dist/components/Code/Code.d.ts.map +1 -0
- package/dist/components/Code/index.d.ts +3 -0
- package/dist/components/Code/index.d.ts.map +1 -0
- package/dist/components/Code/index.js +2 -0
- package/dist/components/ColorField/ColorField.d.ts +1 -1
- package/dist/components/ColorField/ColorField.d.ts.map +1 -1
- package/dist/components/ColorField/index.js +1 -1
- package/dist/components/ColorModeControl/ColorModeControl.d.ts +21 -0
- package/dist/components/ColorModeControl/ColorModeControl.d.ts.map +1 -0
- package/dist/components/ColorModeControl/index.d.ts +3 -0
- package/dist/components/ColorModeControl/index.d.ts.map +1 -0
- package/dist/components/ColorModeControl/index.js +2 -0
- package/dist/components/ComboBox/ComboBox.d.ts +2 -2
- 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 +1 -1
- package/dist/components/CurveEditor/CurveEditor.d.ts.map +1 -1
- package/dist/components/CurveEditor/LayeredCurveEditor.d.ts +1 -1
- package/dist/components/CurveEditor/LayeredCurveEditor.d.ts.map +1 -1
- package/dist/components/CurveEditor/index.js +3 -3
- package/dist/components/DataGrid/DataGrid.d.ts +23 -1
- 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 +36 -0
- package/dist/components/DetailList/DetailList.d.ts.map +1 -0
- package/dist/components/DetailList/index.d.ts +3 -0
- package/dist/components/DetailList/index.d.ts.map +1 -0
- package/dist/components/DetailList/index.js +2 -0
- package/dist/components/DetentSlider/index.js +1 -1
- package/dist/components/Dialog/Dialog.d.ts +9 -3
- package/dist/components/Dialog/Dialog.d.ts.map +1 -1
- package/dist/components/Dialog/index.js +1 -1
- package/dist/components/Disclosure/Disclosure.d.ts +26 -18
- package/dist/components/Disclosure/Disclosure.d.ts.map +1 -1
- package/dist/components/Disclosure/index.d.ts +2 -2
- package/dist/components/Disclosure/index.d.ts.map +1 -1
- package/dist/components/Disclosure/index.js +2 -2
- package/dist/components/DragGhost/DragGhost.d.ts +21 -0
- package/dist/components/DragGhost/DragGhost.d.ts.map +1 -0
- package/dist/components/DragGhost/index.d.ts +3 -0
- package/dist/components/DragGhost/index.d.ts.map +1 -0
- package/dist/components/DragGhost/index.js +2 -0
- package/dist/components/DragHandleGlyph/DragHandleGlyph.d.ts +1 -1
- package/dist/components/DragHandleGlyph/DragHandleGlyph.d.ts.map +1 -1
- package/dist/components/DragHandleGlyph/index.js +1 -1
- package/dist/components/Field/Field.d.ts +1 -1
- package/dist/components/Field/Field.d.ts.map +1 -1
- package/dist/components/Field/index.js +1 -1
- package/dist/components/FillStrokeSwatch/FillStrokeSwatch.d.ts +45 -0
- package/dist/components/FillStrokeSwatch/FillStrokeSwatch.d.ts.map +1 -0
- package/dist/components/FillStrokeSwatch/index.d.ts +3 -0
- package/dist/components/FillStrokeSwatch/index.d.ts.map +1 -0
- package/dist/components/FillStrokeSwatch/index.js +2 -0
- package/dist/components/FontFamilySelect/FontFamilySelect.d.ts +1 -1
- package/dist/components/FontFamilySelect/FontFamilySelect.d.ts.map +1 -1
- package/dist/components/FontFamilySelect/index.js +1 -1
- package/dist/components/GradientEditor/SceneGradientHandles.d.ts.map +1 -1
- package/dist/components/GradientEditor/index.js +1 -1
- package/dist/components/InlineRange/InlineRange.d.ts +6 -2
- package/dist/components/InlineRange/InlineRange.d.ts.map +1 -1
- package/dist/components/InlineRange/index.js +1 -1
- package/dist/components/Input/Input.d.ts +13 -0
- 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 +70 -10
- package/dist/components/ItemList/ItemList.d.ts.map +1 -1
- package/dist/components/ItemList/index.js +1 -1
- package/dist/components/Jog/Jog.d.ts +1 -1
- package/dist/components/Jog/Jog.d.ts.map +1 -1
- package/dist/components/Jog/index.js +1 -1
- package/dist/components/Keycaps/Keycap.d.ts +1 -1
- package/dist/components/Keycaps/Keycap.d.ts.map +1 -1
- package/dist/components/Keycaps/Keycaps.d.ts +1 -1
- package/dist/components/Keycaps/Keycaps.d.ts.map +1 -1
- package/dist/components/Keycaps/index.d.ts +1 -0
- package/dist/components/Keycaps/index.d.ts.map +1 -1
- package/dist/components/Keycaps/index.js +3 -3
- package/dist/components/Keycaps/keySpecsFromMods.d.ts +2 -0
- package/dist/components/Keycaps/keySpecsFromMods.d.ts.map +1 -1
- package/dist/components/Keycaps/keySpecsFromShortcut.d.ts +16 -0
- package/dist/components/Keycaps/keySpecsFromShortcut.d.ts.map +1 -0
- package/dist/components/LayerList/LayerList.d.ts +79 -0
- package/dist/components/LayerList/LayerList.d.ts.map +1 -0
- package/dist/components/LayerList/index.d.ts +3 -0
- package/dist/components/LayerList/index.d.ts.map +1 -0
- package/dist/components/LayerList/index.js +2 -0
- package/dist/components/LayerList/useSceneLayerList.d.ts +20 -0
- package/dist/components/LayerList/useSceneLayerList.d.ts.map +1 -0
- package/dist/components/ListEditor/ListEditor.d.ts +23 -0
- package/dist/components/ListEditor/ListEditor.d.ts.map +1 -0
- package/dist/components/ListEditor/index.d.ts +3 -0
- package/dist/components/ListEditor/index.d.ts.map +1 -0
- package/dist/components/ListEditor/index.js +2 -0
- package/dist/components/MenuButton/MenuButton.d.ts +6 -2
- package/dist/components/MenuButton/MenuButton.d.ts.map +1 -1
- package/dist/components/MenuButton/index.js +1 -1
- package/dist/components/MeshEditor/index.js +1 -1
- package/dist/components/NumberField/NumberField.d.ts +13 -0
- package/dist/components/NumberField/NumberField.d.ts.map +1 -1
- package/dist/components/NumberField/UnitField.d.ts +1 -1
- package/dist/components/NumberField/UnitField.d.ts.map +1 -1
- package/dist/components/NumberField/index.js +1 -1
- package/dist/components/OptionsBar/index.js +1 -1
- package/dist/components/PaintField/index.js +1 -1
- package/dist/components/PaintInput/index.js +1 -1
- package/dist/components/PatternPicker/index.js +1 -1
- package/dist/components/Plot2D/index.js +1 -1
- package/dist/components/PointPlotter/PointPlotter.d.ts +1 -1
- package/dist/components/PointPlotter/PointPlotter.d.ts.map +1 -1
- package/dist/components/PointPlotter/index.js +1 -1
- package/dist/components/Powerline/Powerline.d.ts +5 -4
- package/dist/components/Powerline/Powerline.d.ts.map +1 -1
- package/dist/components/Powerline/index.js +2 -2
- package/dist/components/Prefs/PrefsDialog.d.ts +11 -3
- package/dist/components/Prefs/PrefsDialog.d.ts.map +1 -1
- package/dist/components/Prefs/PrefsForm.d.ts +27 -26
- package/dist/components/Prefs/PrefsForm.d.ts.map +1 -1
- package/dist/components/Prefs/PrefsPane.d.ts +24 -0
- package/dist/components/Prefs/PrefsPane.d.ts.map +1 -0
- package/dist/components/Prefs/PrefsRail.d.ts +32 -0
- package/dist/components/Prefs/PrefsRail.d.ts.map +1 -0
- package/dist/components/Prefs/PrefsRow.d.ts +32 -0
- package/dist/components/Prefs/PrefsRow.d.ts.map +1 -0
- package/dist/components/Prefs/index.d.ts +5 -2
- package/dist/components/Prefs/index.d.ts.map +1 -1
- package/dist/components/Prefs/index.js +3 -3
- package/dist/components/Prefs/prefField.d.ts +36 -0
- package/dist/components/Prefs/prefField.d.ts.map +1 -0
- package/dist/components/Prefs/schema.d.ts +30 -0
- package/dist/components/Prefs/schema.d.ts.map +1 -1
- package/dist/components/Properties/CurveField.d.ts +1 -1
- package/dist/components/Properties/CurveField.d.ts.map +1 -1
- package/dist/components/Properties/DialogRow.d.ts +33 -0
- package/dist/components/Properties/DialogRow.d.ts.map +1 -0
- package/dist/components/Properties/PropertyField.d.ts +238 -0
- package/dist/components/Properties/PropertyField.d.ts.map +1 -0
- package/dist/components/Properties/PropertyGroup.d.ts +12 -3
- package/dist/components/Properties/PropertyGroup.d.ts.map +1 -1
- package/dist/components/Properties/PropertyPanel.d.ts +34 -238
- package/dist/components/Properties/PropertyPanel.d.ts.map +1 -1
- package/dist/components/Properties/Subpanel.d.ts +14 -0
- package/dist/components/Properties/Subpanel.d.ts.map +1 -0
- package/dist/components/Properties/index.d.ts +8 -4
- package/dist/components/Properties/index.d.ts.map +1 -1
- package/dist/components/Properties/index.js +3 -2
- package/dist/components/Properties/storyLayouts.d.ts +1 -1
- package/dist/components/Properties/storyLayouts.d.ts.map +1 -1
- package/dist/components/RadioGroup/RadioGroup.d.ts +2 -2
- package/dist/components/RadioGroup/RadioGroup.d.ts.map +1 -1
- package/dist/components/RadioGroup/index.js +1 -1
- package/dist/components/RangeSlider/RangeSlider.d.ts +1 -1
- package/dist/components/RangeSlider/RangeSlider.d.ts.map +1 -1
- package/dist/components/RangeSlider/index.js +1 -1
- package/dist/components/ResizeHandle/ResizeHandle.d.ts +1 -1
- 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 +40 -7
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/index.d.ts +2 -2
- package/dist/components/Select/index.d.ts.map +1 -1
- package/dist/components/Select/index.js +2 -2
- package/dist/components/SelectionPanel/SelectionPanel.d.ts +1 -1
- package/dist/components/SelectionPanel/SelectionPanel.d.ts.map +1 -1
- package/dist/components/SelectionPanel/index.js +2 -2
- package/dist/components/SelectionPanel/renderLeaf.d.ts +14 -8
- package/dist/components/SelectionPanel/renderLeaf.d.ts.map +1 -1
- package/dist/components/Sidebar/Sidebar.d.ts +1 -1
- package/dist/components/Sidebar/Sidebar.d.ts.map +1 -1
- package/dist/components/Sidebar/index.js +1 -1
- package/dist/components/SidebarPanel/SidebarPanel.d.ts +3 -3
- package/dist/components/SidebarPanel/SidebarPanel.d.ts.map +1 -1
- package/dist/components/SidebarPanel/index.js +1 -1
- package/dist/components/Slider/Slider.d.ts +2 -1
- package/dist/components/Slider/Slider.d.ts.map +1 -1
- package/dist/components/Slider/index.js +1 -1
- package/dist/components/StatusBar/StatusBar.d.ts +3 -3
- package/dist/components/StatusBar/StatusBar.d.ts.map +1 -1
- package/dist/components/StatusBar/index.js +1 -1
- package/dist/components/SwatchGrid/SwatchGrid.d.ts +34 -0
- package/dist/components/SwatchGrid/SwatchGrid.d.ts.map +1 -0
- package/dist/components/SwatchGrid/index.d.ts +3 -0
- package/dist/components/SwatchGrid/index.d.ts.map +1 -0
- package/dist/components/SwatchGrid/index.js +2 -0
- package/dist/components/Switch/index.js +1 -1
- package/dist/components/Tabs/Tabs.d.ts +4 -4
- package/dist/components/Tabs/Tabs.d.ts.map +1 -1
- package/dist/components/Tabs/index.js +1 -1
- package/dist/components/Timeline/Lane.d.ts.map +1 -1
- package/dist/components/Timeline/index.js +1 -1
- package/dist/components/Toast/Toast.d.ts +1 -1
- 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 +2 -1
- package/dist/components/ToggleBar/ToggleBar.d.ts.map +1 -1
- package/dist/components/ToggleBar/index.js +1 -1
- package/dist/components/TokenPanel/TokenPanel.d.ts +1 -1
- package/dist/components/TokenPanel/TokenPanel.d.ts.map +1 -1
- package/dist/components/TokenPanel/index.js +1 -1
- package/dist/components/ToolButton/ToolButton.d.ts +1 -1
- package/dist/components/ToolButton/ToolButton.d.ts.map +1 -1
- package/dist/components/ToolButton/index.js +1 -1
- package/dist/components/ToolGroup/ToolGroup.d.ts +1 -1
- package/dist/components/ToolGroup/ToolGroup.d.ts.map +1 -1
- package/dist/components/ToolGroup/index.js +1 -1
- package/dist/components/ToolOptionsBar/ToolOptionsBar.d.ts +1 -1
- package/dist/components/ToolOptionsBar/ToolOptionsBar.d.ts.map +1 -1
- package/dist/components/ToolOptionsBar/index.js +1 -1
- package/dist/components/ToolPalette/ToolPalette.d.ts +1 -1
- package/dist/components/ToolPalette/ToolPalette.d.ts.map +1 -1
- package/dist/components/ToolPalette/index.d.ts +1 -0
- package/dist/components/ToolPalette/index.d.ts.map +1 -1
- package/dist/components/ToolPalette/index.js +3 -2
- package/dist/components/Tooltip/Tooltip.d.ts +8 -4
- package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/components/Tooltip/index.d.ts +1 -1
- package/dist/components/Tooltip/index.d.ts.map +1 -1
- package/dist/components/Tooltip/index.js +2 -2
- package/dist/components/Tree/Tree.d.ts +84 -0
- package/dist/components/Tree/Tree.d.ts.map +1 -0
- package/dist/components/Tree/index.d.ts +3 -0
- package/dist/components/Tree/index.d.ts.map +1 -0
- package/dist/components/Tree/index.js +2 -0
- package/dist/components/segmentTooltip.d.ts +30 -0
- package/dist/components/segmentTooltip.d.ts.map +1 -0
- package/dist/components/stance.d.ts +30 -0
- package/dist/components/stance.d.ts.map +1 -0
- package/dist/components/stanceCss.d.ts +31 -0
- package/dist/components/stanceCss.d.ts.map +1 -0
- package/dist/components/stanceSurfaces.d.ts +4 -0
- package/dist/components/stanceSurfaces.d.ts.map +1 -0
- package/dist/format/number.d.ts +3 -2
- package/dist/format/number.d.ts.map +1 -1
- package/dist/icons/Icon.d.ts +1 -1
- package/dist/icons/Icon.d.ts.map +1 -1
- package/dist/icons/ShapeKindIcon.d.ts +10 -0
- package/dist/icons/ShapeKindIcon.d.ts.map +1 -0
- package/dist/icons/index.d.ts +55 -53
- 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 +17 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +130 -79
- package/dist/index.js.map +1 -1
- package/dist/interactiveTarget.d.ts +9 -0
- package/dist/interactiveTarget.d.ts.map +1 -0
- package/dist/overlays/portalHost.d.ts +1 -1
- package/dist/overlays/portalHost.d.ts.map +1 -1
- package/dist/style.css +1 -1
- package/dist/useReorderDragList.d.ts +36 -7
- package/dist/useReorderDragList.d.ts.map +1 -1
- package/dist/useRovingTabIndex.d.ts +1 -1
- package/dist/useScrollSpy.d.ts +48 -0
- package/dist/useScrollSpy.d.ts.map +1 -0
- package/package.json +8 -8
- package/dist/chunks/ActionBar-CLwiY3Jg.js +0 -62
- package/dist/chunks/ActionBar-CLwiY3Jg.js.map +0 -1
- package/dist/chunks/ActionsBar-D84a4eGy.js +0 -41
- package/dist/chunks/ActionsBar-D84a4eGy.js.map +0 -1
- package/dist/chunks/Badge-CW9pBPFl.js.map +0 -1
- package/dist/chunks/BandEditor-jY-PFKY6.js.map +0 -1
- package/dist/chunks/Button-DRSApvnK.js +0 -90
- package/dist/chunks/Button-DRSApvnK.js.map +0 -1
- package/dist/chunks/Callout-DrNu-9Qr.js +0 -122
- package/dist/chunks/Callout-DrNu-9Qr.js.map +0 -1
- package/dist/chunks/Checkbox-BOsDAY2F.js.map +0 -1
- package/dist/chunks/ColorField-BYzgZM9o.js.map +0 -1
- package/dist/chunks/ComboBox-Cz3f0Y_8.js.map +0 -1
- package/dist/chunks/CurveEditor-DXwSP-iA.js.map +0 -1
- package/dist/chunks/DataGrid-C8KrYtw7.js +0 -104
- package/dist/chunks/DataGrid-C8KrYtw7.js.map +0 -1
- package/dist/chunks/DetentSlider-CAubVX0J.js.map +0 -1
- package/dist/chunks/Dialog-fGqqQ6o_.js +0 -61
- package/dist/chunks/Dialog-fGqqQ6o_.js.map +0 -1
- package/dist/chunks/Disclosure-CILDfWsU.js +0 -47
- package/dist/chunks/Disclosure-CILDfWsU.js.map +0 -1
- package/dist/chunks/DragHandleGlyph-CppAz4_8.js.map +0 -1
- package/dist/chunks/Field-DWnV8WZY.js.map +0 -1
- package/dist/chunks/FontFamilySelect-DxfgTC3G.js.map +0 -1
- package/dist/chunks/GradientEditor-rRBmf3G0.js +0 -333
- package/dist/chunks/GradientEditor-rRBmf3G0.js.map +0 -1
- package/dist/chunks/Icon-DT0x6HaQ.js.map +0 -1
- package/dist/chunks/InlineRange-DdIlfGqG.js +0 -29
- package/dist/chunks/InlineRange-DdIlfGqG.js.map +0 -1
- package/dist/chunks/Input-DbMKpkXy.js.map +0 -1
- package/dist/chunks/ItemList-B9zYb0GE.js +0 -42
- package/dist/chunks/ItemList-B9zYb0GE.js.map +0 -1
- package/dist/chunks/Jog-DkkTlL3_.js.map +0 -1
- package/dist/chunks/Keycaps-DunVpejA.js.map +0 -1
- package/dist/chunks/LayerStack-CfQ6GsRz.js +0 -142
- package/dist/chunks/LayerStack-CfQ6GsRz.js.map +0 -1
- package/dist/chunks/MenuButton-C_4nox39.js +0 -60
- package/dist/chunks/MenuButton-C_4nox39.js.map +0 -1
- package/dist/chunks/MeshEditor-Bipz-Ocl.js +0 -123
- package/dist/chunks/MeshEditor-Bipz-Ocl.js.map +0 -1
- package/dist/chunks/NumberField-CCjEDZCg.js.map +0 -1
- package/dist/chunks/OptionsBar-DeQ-vUeZ.js.map +0 -1
- package/dist/chunks/PaintField-jBOJ32rL.js.map +0 -1
- package/dist/chunks/PaintInput-Qs7Rul5R.js.map +0 -1
- package/dist/chunks/PatternPicker-BMpXWboq.js.map +0 -1
- package/dist/chunks/Plot2D-CXf_f7QD.js.map +0 -1
- package/dist/chunks/PointPlotter-S_gz7VYt.js.map +0 -1
- package/dist/chunks/Powerline-Ak5AWUlK.js +0 -36
- package/dist/chunks/Powerline-Ak5AWUlK.js.map +0 -1
- package/dist/chunks/Prefs-CNC8tzyN.js +0 -308
- package/dist/chunks/Prefs-CNC8tzyN.js.map +0 -1
- package/dist/chunks/Properties-Rnb6TAbN.js +0 -891
- package/dist/chunks/Properties-Rnb6TAbN.js.map +0 -1
- package/dist/chunks/RadioGroup-CsVp3SEu.js.map +0 -1
- package/dist/chunks/RangeSlider-DNr-pJpZ.js.map +0 -1
- package/dist/chunks/ResizeHandle-RXFf5fXr.js.map +0 -1
- package/dist/chunks/Select-BEope086.js +0 -190
- package/dist/chunks/Select-BEope086.js.map +0 -1
- package/dist/chunks/SelectionPanel-CEbLS-0D.js.map +0 -1
- package/dist/chunks/Sidebar-qn_oSCNX.js.map +0 -1
- package/dist/chunks/SidebarPanel-Bs6V21hg.js.map +0 -1
- package/dist/chunks/Slider-CIIrqiFS.js.map +0 -1
- package/dist/chunks/StatusBar-B4L15DSm.js.map +0 -1
- package/dist/chunks/Switch-DH5POG0T.js.map +0 -1
- package/dist/chunks/Tabs-BFHikpml.js.map +0 -1
- package/dist/chunks/Timeline-DNKY_yiK.js.map +0 -1
- package/dist/chunks/Toast-CI1UDuK6.js.map +0 -1
- package/dist/chunks/ToggleBar-CClus5Cd.js +0 -75
- package/dist/chunks/ToggleBar-CClus5Cd.js.map +0 -1
- package/dist/chunks/TokenPanel-BPHq24dc.js.map +0 -1
- package/dist/chunks/ToolButton-9QzJCmuM.js.map +0 -1
- package/dist/chunks/ToolGroup-BJiDrH_i.js.map +0 -1
- package/dist/chunks/ToolOptionsBar-CAM6RcUH.js.map +0 -1
- package/dist/chunks/ToolPalette-DGkKwE7D.js +0 -97
- package/dist/chunks/ToolPalette-DGkKwE7D.js.map +0 -1
- package/dist/chunks/Tooltip-C4YBczLq.js +0 -42
- package/dist/chunks/Tooltip-C4YBczLq.js.map +0 -1
- package/dist/chunks/createKeyframeLayer-DKtO0Sw_.js.map +0 -1
- package/dist/chunks/dlog-CMYiRF3Q.js.map +0 -1
- package/dist/chunks/icons-DFLytcui.js +0 -165
- package/dist/chunks/icons-DFLytcui.js.map +0 -1
- package/dist/chunks/keyGlyph-Bp0wnLHn.js.map +0 -1
- package/dist/chunks/model-13kZ_-mE.js +0 -483
- package/dist/chunks/model-13kZ_-mE.js.map +0 -1
- package/dist/chunks/number-BHz66zQO.js.map +0 -1
- package/dist/chunks/portalHost-CjpCnuGU.js.map +0 -1
- package/dist/chunks/range.module-DSsOIq1R.js +0 -8
- package/dist/chunks/range.module-DSsOIq1R.js.map +0 -1
- package/dist/chunks/schema-Dft4Cu2p.js +0 -47
- package/dist/chunks/schema-Dft4Cu2p.js.map +0 -1
- package/dist/chunks/segmentedControl.module-DS72X1ns.js +0 -11
- package/dist/chunks/segmentedControl.module-DS72X1ns.js.map +0 -1
- package/dist/chunks/snap-CEjuWOhN.js.map +0 -1
- package/dist/chunks/useReorderDragList-CSQGd7zQ.js +0 -102
- package/dist/chunks/useReorderDragList-CSQGd7zQ.js.map +0 -1
- package/dist/chunks/useRovingTabIndex-Dkpf_KhN.js.map +0 -1
- package/dist/components/ActionsBar/ActionsBar.d.ts +0 -35
- package/dist/components/ActionsBar/ActionsBar.d.ts.map +0 -1
- package/dist/components/ActionsBar/index.d.ts +0 -3
- package/dist/components/ActionsBar/index.d.ts.map +0 -1
- package/dist/components/ActionsBar/index.js +0 -2
- package/dist/components/LayerStack/LayerStack.d.ts +0 -62
- package/dist/components/LayerStack/LayerStack.d.ts.map +0 -1
- package/dist/components/LayerStack/index.d.ts +0 -2
- package/dist/components/LayerStack/index.d.ts.map +0 -1
- package/dist/components/LayerStack/index.js +0 -2
- package/dist/components/Properties/EffectCard.d.ts +0 -69
- package/dist/components/Properties/EffectCard.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tree-DVOtc9R5.js","names":["s","DisclosureMark","Tree_module_default","TYPEAHEAD_MS","Tree","forwardRef","ariaLabel","ariaLabelledBy","expanded","setExpanded","useControlledSet","expandedIds","defaultExpandedIds","onExpandedChange","selected","setSelected","selectedIds","defaultSelectedIds","onSelectionChange","selectable","selectionMode","baseId","useId","visible","useMemo","out","walk","node","list","level","nodes","indexOf","v","i","items","useRef","focusId","setFocusId","useState","anchor","typed","stopId","className","empty","focus","id","toggle","next","select","mods","a","b","x","activate","onAction","onKeyDown","e","open","modsOf","typeAhead","now","t","want","start","from","k","textOf","onRowClick","onTwistyClick","itemRef","el","seq","renderLevel","n","branch","labelId","trailingId","pos","filterTree","changed","match","kids","treeBranchIds","own","setOwn","initial","value","onChange"],"sources":["../../src/components/Tree/Tree.module.css","../../src/components/Tree/Tree.tsx"],"sourcesContent":[".tree,\n.group {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.tree {\n user-select: none;\n -webkit-user-select: none;\n width: 100%;\n}\n\n/* One twisty and one gap, so a child's twisty sits under its parent's label. */\n.group {\n padding-inline-start: var(--wzl-tree-indent, calc(var(--wzl-control-h-xs) + var(--wzl-space-2)));\n}\n\n.item {\n outline: none;\n}\n\n.row {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-2);\n padding: 0 var(--wzl-space-2) 0 0;\n height: var(--wzl-control-h);\n font-size: var(--wzl-font-size-sm);\n color: var(--wzl-fg);\n border-radius: var(--wzl-radius-sm);\n cursor: default;\n white-space: nowrap;\n overflow: hidden;\n}\n\n.row:hover {\n background: var(--wzl-surface);\n}\n\n.item:focus-visible > .row {\n outline: 2px solid var(--wzl-focus-ring);\n outline-offset: -2px;\n}\n\n.item[aria-selected='true'] > .row {\n background: var(--wzl-border);\n}\n\n.item[data-muted] > .row {\n color: var(--wzl-fg-subtle);\n}\n\n.item[aria-disabled='true'] > .row {\n color: var(--wzl-fg-subtle);\n cursor: not-allowed;\n}\n\n/* A leaf keeps the empty box, so labels at one level line up whether or not\n their rows are branches. */\n.twisty {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: var(--wzl-control-h-xs);\n align-self: stretch;\n color: var(--wzl-fg-muted);\n}\n\n.row:hover > .twisty {\n color: var(--wzl-fg);\n}\n\n.leading {\n flex: none;\n display: inline-flex;\n align-items: center;\n}\n\n.label {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.trailing {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--wzl-space-2);\n}\n\n.empty {\n padding: var(--wzl-space-6) var(--wzl-space-4);\n font-size: var(--wzl-font-size-sm);\n color: var(--wzl-fg-subtle);\n font-style: italic;\n}\n","/**\n * A hierarchy of rows that expand and collapse: a file tree, a registry\n * browser, an outline.\n *\n * **Semantics.** WAI-ARIA `tree`: each node is a `treeitem` carrying\n * `aria-level`, `aria-setsize` and `aria-posinset`; a branch carries\n * `aria-expanded` and nests its children in a `group`, which is rendered only\n * while the branch is open. `aria-selected` appears only when `selectionMode`\n * is set. A treeitem may not contain interactive content, so `leading` and\n * `trailing` are decoration — an icon, a count — and the twisty is a drawn\n * `DisclosureMark`, not a button.\n *\n * **Keyboard.** One treeitem is in the tab order: the one last focused, else\n * the first selected, else the first. Up/Down move between visible rows,\n * Home/End go to the first and last. Right opens a closed branch, then moves\n * into it; Left closes an open branch, else moves to the parent. Enter and\n * Space activate, as a click does. Typing moves to the next row whose text\n * starts with what was typed.\n *\n * **Activating** a row — click, Enter, Space — toggles it if it is a branch,\n * selects it under `selectionMode`, and calls `onAction`. Clicking the twisty\n * only toggles.\n *\n * **Filtering** is the consumer's: narrow `nodes` with `filterTree`, and pass\n * `treeBranchIds` of the result as `expandedIds` so every match shows.\n */\nimport {\n forwardRef,\n useId,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n type Ref,\n} from 'react';\nimport type { PressModifiers } from '../../useReorderDragList';\nimport { DisclosureMark } from '../Disclosure';\nimport s from './Tree.module.css';\n\n/** One node. A node with `children` is a branch, even when the array is empty. */\nexport interface TreeNode {\n /** Unique across the whole tree. */\n id: string;\n label: ReactNode;\n /** What type-ahead matches against. Defaults to `label` when that is a string. */\n textValue?: string;\n /** Decoration before the label — an icon. Not a control. */\n leading?: ReactNode;\n /** Decoration after the label — a count badge. Not a control. Read as part\n * of the row's accessible name. */\n trailing?: ReactNode;\n children?: readonly TreeNode[];\n /** Present but not in effect. */\n muted?: boolean;\n /** Focusable and announced, but cannot be activated, expanded or selected. */\n disabled?: boolean;\n className?: string;\n}\n\n/** Whether and how rows are selectable. */\nexport type TreeSelectionMode = 'none' | 'single' | 'multiple';\n\nexport interface TreeProps {\n nodes: readonly TreeNode[];\n /** Shown in place of the tree when `nodes` is empty. */\n empty?: ReactNode;\n className?: string;\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n\n /** Open branches, controlled. */\n expandedIds?: Iterable<string>;\n /** Open branches on first render, when uncontrolled. */\n defaultExpandedIds?: Iterable<string>;\n /** The whole set a toggle would produce. Called whether or not controlled. */\n onExpandedChange?(ids: Set<string>): void;\n\n /** Default `'none'`. `'multiple'` adds to the selection with Cmd/Ctrl and\n * extends it over visible rows with Shift. */\n selectionMode?: TreeSelectionMode;\n /** Selected rows, controlled. */\n selectedIds?: Iterable<string>;\n /** Selected rows on first render, when uncontrolled. */\n defaultSelectedIds?: Iterable<string>;\n /** The whole set an activation would produce, when it differs. */\n onSelectionChange?(ids: Set<string>): void;\n\n /** A row was activated — click, Enter or Space — with the modifiers held. */\n onAction?(id: string, mods: PressModifiers): void;\n}\n\ninterface Visible {\n node: TreeNode;\n parentId: string | null;\n level: number;\n}\n\nconst TYPEAHEAD_MS = 500;\n\nexport const Tree = forwardRef(function Tree(\n {\n nodes, empty, className,\n 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy,\n expandedIds, defaultExpandedIds, onExpandedChange,\n selectionMode = 'none', selectedIds, defaultSelectedIds, onSelectionChange,\n onAction,\n }: TreeProps,\n ref: Ref<HTMLUListElement>,\n) {\n const [expanded, setExpanded] = useControlledSet(expandedIds, defaultExpandedIds, onExpandedChange);\n const [selected, setSelected] = useControlledSet(selectedIds, defaultSelectedIds, onSelectionChange);\n const selectable = selectionMode !== 'none';\n const baseId = useId();\n\n const visible = useMemo(() => {\n const out: Visible[] = [];\n const walk = (list: readonly TreeNode[], parentId: string | null, level: number) => {\n for (const node of list) {\n out.push({ node, parentId, level });\n if (node.children && expanded.has(node.id)) walk(node.children, node.id, level + 1);\n }\n };\n walk(nodes, null, 1);\n return out;\n }, [nodes, expanded]);\n const indexOf = useMemo(() => new Map(visible.map((v, i) => [v.node.id, i])), [visible]);\n\n const items = useRef(new Map<string, HTMLLIElement>());\n const [focusId, setFocusId] = useState<string | null>(null);\n const anchor = useRef<string | null>(null);\n const typed = useRef({ text: '', at: 0 });\n\n const stopId = focusId != null && indexOf.has(focusId)\n ? focusId\n : (visible.find((v) => selectable && selected.has(v.node.id)) ?? visible[0])?.node.id;\n\n if (nodes.length === 0) {\n return <div className={[s.empty, className].filter(Boolean).join(' ')}>{empty ?? '—'}</div>;\n }\n\n const focus = (id: string | undefined) => { if (id != null) items.current.get(id)?.focus(); };\n\n const toggle = (node: TreeNode) => {\n if (!node.children || node.disabled) return;\n const next = new Set(expanded);\n if (next.has(node.id)) next.delete(node.id);\n else next.add(node.id);\n setExpanded(next);\n };\n\n const select = (id: string, mods: PressModifiers) => {\n let next: Set<string>;\n if (selectionMode === 'multiple' && mods.shiftKey && anchor.current != null && indexOf.has(anchor.current)) {\n const a = indexOf.get(anchor.current)!;\n const b = indexOf.get(id)!;\n next = new Set(visible.slice(Math.min(a, b), Math.max(a, b) + 1)\n .filter((v) => !v.node.disabled).map((v) => v.node.id));\n } else if (selectionMode === 'multiple' && (mods.metaKey || mods.ctrlKey)) {\n next = new Set(selected);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n anchor.current = id;\n } else {\n next = new Set([id]);\n anchor.current = id;\n }\n if (next.size !== selected.size || [...next].some((x) => !selected.has(x))) setSelected(next);\n };\n\n const activate = (node: TreeNode, mods: PressModifiers) => {\n if (node.disabled) return;\n toggle(node);\n if (selectable) select(node.id, mods);\n onAction?.(node.id, mods);\n };\n\n const onKeyDown = (v: Visible) => (e: KeyboardEvent<HTMLLIElement>) => {\n if (e.target !== e.currentTarget) return;\n const i = indexOf.get(v.node.id)!;\n const { node } = v;\n const open = !!node.children && expanded.has(node.id);\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n focus(visible[Math.min(i + 1, visible.length - 1)].node.id);\n return;\n case 'ArrowUp':\n e.preventDefault();\n focus(visible[Math.max(i - 1, 0)].node.id);\n return;\n case 'Home':\n e.preventDefault();\n focus(visible[0].node.id);\n return;\n case 'End':\n e.preventDefault();\n focus(visible[visible.length - 1].node.id);\n return;\n case 'ArrowRight':\n if (!node.children) return;\n e.preventDefault();\n if (!open) toggle(node);\n else focus(node.children[0]?.id);\n return;\n case 'ArrowLeft':\n e.preventDefault();\n if (open) toggle(node);\n else focus(v.parentId ?? undefined);\n return;\n case 'Enter':\n case ' ':\n e.preventDefault();\n activate(node, modsOf(e));\n return;\n default:\n if (e.key.length !== 1 || e.ctrlKey || e.metaKey || e.altKey) return;\n typeAhead(e, i);\n }\n };\n\n const typeAhead = (e: KeyboardEvent, from: number) => {\n const now = Date.now();\n const t = typed.current;\n t.text = now - t.at > TYPEAHEAD_MS ? e.key : t.text + e.key;\n t.at = now;\n const want = t.text.toLowerCase();\n // A fresh first letter looks past the current row; a longer prefix may still match it.\n const start = t.text.length === 1 ? from + 1 : from;\n for (let k = 0; k < visible.length; k++) {\n const v = visible[(start + k) % visible.length];\n if (textOf(v.node).toLowerCase().startsWith(want)) {\n e.preventDefault();\n focus(v.node.id);\n return;\n }\n }\n };\n\n const onRowClick = (node: TreeNode) => (e: MouseEvent<HTMLDivElement>) => activate(node, modsOf(e));\n\n const onTwistyClick = (node: TreeNode) => (e: MouseEvent<HTMLSpanElement>) => {\n e.stopPropagation();\n toggle(node);\n };\n\n const itemRef = (id: string) => (el: HTMLLIElement | null) => {\n if (el) items.current.set(id, el);\n else items.current.delete(id);\n };\n\n let seq = 0;\n const renderLevel = (list: readonly TreeNode[], parentId: string | null, level: number): ReactNode =>\n list.map((node, pos) => {\n const n = seq++;\n const branch = !!node.children;\n const open = branch && expanded.has(node.id);\n const labelId = `${baseId}-${n}`;\n const trailingId = node.trailing != null ? `${baseId}-${n}-t` : undefined;\n return (\n <li\n key={node.id}\n ref={itemRef(node.id)}\n role=\"treeitem\"\n className={[s.item, node.className].filter(Boolean).join(' ')}\n aria-level={level}\n aria-setsize={list.length}\n aria-posinset={pos + 1}\n aria-expanded={branch ? open : undefined}\n aria-selected={selectable ? selected.has(node.id) : undefined}\n aria-disabled={node.disabled || undefined}\n aria-labelledby={trailingId ? `${labelId} ${trailingId}` : labelId}\n data-muted={node.muted ? 'true' : undefined}\n tabIndex={node.id === stopId ? 0 : -1}\n onKeyDown={onKeyDown({ node, parentId, level })}\n onFocus={(e) => { if (e.target === e.currentTarget) setFocusId(node.id); }}\n >\n <div className={s.row} onClick={onRowClick(node)}>\n <span className={s.twisty} aria-hidden=\"true\" onClick={branch ? onTwistyClick(node) : undefined}>\n {branch && <DisclosureMark open={open} />}\n </span>\n {node.leading != null && <span className={s.leading}>{node.leading}</span>}\n <span id={labelId} className={s.label}>{node.label}</span>\n {trailingId && <span id={trailingId} className={s.trailing}>{node.trailing}</span>}\n </div>\n {open && node.children!.length > 0 && (\n <ul role=\"group\" className={s.group}>\n {renderLevel(node.children!, node.id, level + 1)}\n </ul>\n )}\n </li>\n );\n });\n\n return (\n <ul\n ref={ref}\n role=\"tree\"\n className={[s.tree, className].filter(Boolean).join(' ')}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-multiselectable={selectionMode === 'multiple' || undefined}\n >\n {renderLevel(nodes, null, 1)}\n </ul>\n );\n});\n\n/**\n * `nodes` narrowed to those `match` accepts, plus their ancestors. A matching\n * node keeps its whole subtree; a branch with no match inside it is dropped.\n * Returns `nodes` itself when nothing is dropped.\n */\nexport function filterTree(\n nodes: readonly TreeNode[],\n match: (node: TreeNode) => boolean,\n): readonly TreeNode[] {\n let changed = false;\n const out: TreeNode[] = [];\n for (const node of nodes) {\n if (match(node)) {\n out.push(node);\n continue;\n }\n const kids = node.children ? filterTree(node.children, match) : [];\n if (kids.length === 0) {\n changed = true;\n continue;\n }\n if (kids !== node.children) changed = true;\n out.push(kids === node.children ? node : { ...node, children: kids });\n }\n return changed ? out : nodes;\n}\n\n/** Every branch id in `nodes`, depth first — `expandedIds` for a tree with everything open. */\nexport function treeBranchIds(nodes: readonly TreeNode[]): string[] {\n const out: string[] = [];\n const walk = (list: readonly TreeNode[]) => {\n for (const node of list) {\n if (!node.children) continue;\n out.push(node.id);\n walk(node.children);\n }\n };\n walk(nodes);\n return out;\n}\n\nfunction textOf(node: TreeNode): string {\n return node.textValue ?? (typeof node.label === 'string' ? node.label : '');\n}\n\nfunction modsOf(e: { shiftKey: boolean; ctrlKey: boolean; metaKey: boolean; altKey: boolean }): PressModifiers {\n return { shiftKey: e.shiftKey, ctrlKey: e.ctrlKey, metaKey: e.metaKey, altKey: e.altKey };\n}\n\nfunction useControlledSet(\n value: Iterable<string> | undefined,\n initial: Iterable<string> | undefined,\n onChange: ((ids: Set<string>) => void) | undefined,\n): [ReadonlySet<string>, (next: Set<string>) => void] {\n const [own, setOwn] = useState<ReadonlySet<string>>(() => new Set(initial));\n const controlled = useMemo(() => (value === undefined ? undefined : new Set(value)), [value]);\n const set = (next: Set<string>) => {\n if (value === undefined) setOwn(next);\n onChange?.(next);\n };\n return [controlled ?? own, set];\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { t as e } from "./dlog-
|
|
2
|
-
import { c as t, s as n, t as r } from "./Plot2D-
|
|
3
|
-
import { t as i } from "./snap-
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { t as e } from "./dlog-F0I8KsIW.js";
|
|
2
|
+
import { c as t, s as n, t as r } from "./Plot2D-CTXHkL5p.js";
|
|
3
|
+
import { t as i } from "./snap-DRjbOiG9.js";
|
|
4
|
+
import { cubicBezierEasing as a, openPointerSession as o, resolveEasing as s } from "@weasel-js/core";
|
|
5
|
+
import { Fragment as c, jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
6
6
|
import { useCallback as d, useEffect as f, useMemo as p, useRef as m, useState as h } from "react";
|
|
7
7
|
import { tokenPx as g } from "@weasel-js/theme";
|
|
8
8
|
//#region src/components/CurveEditor/hitTest.ts
|
|
@@ -85,7 +85,7 @@ function w(e) {
|
|
|
85
85
|
};
|
|
86
86
|
}
|
|
87
87
|
function T(i) {
|
|
88
|
-
let { layers: a, onLayerChange:
|
|
88
|
+
let { layers: a, onLayerChange: s, onLayerCommit: c, width: g, height: _, xRange: v = [0, 1], yRange: y = [0, 1], grid: b, axes: x, xTicks: T, yTicks: E, className: D, style: O, children: k } = i, A = i.history !== !1, j = p(() => ({
|
|
89
89
|
xMin: v[0],
|
|
90
90
|
xMax: v[1],
|
|
91
91
|
yMin: y[0],
|
|
@@ -116,9 +116,9 @@ function T(i) {
|
|
|
116
116
|
let t = N.current;
|
|
117
117
|
for (let n of t) {
|
|
118
118
|
let t = e.get(n.layer.id);
|
|
119
|
-
t !== void 0 && t !== n.state &&
|
|
119
|
+
t !== void 0 && t !== n.state && s(n.layer.id, t);
|
|
120
120
|
}
|
|
121
|
-
}, [
|
|
121
|
+
}, [s]), G = d(() => {
|
|
122
122
|
if (!A) return;
|
|
123
123
|
let e = V.current;
|
|
124
124
|
if (e.length === 0) return;
|
|
@@ -151,7 +151,7 @@ function T(i) {
|
|
|
151
151
|
let r = n.clientToModel(e), i = Q(t.layerId);
|
|
152
152
|
if (i === void 0) return;
|
|
153
153
|
let a = L(w(e)), o = t.gesture.onMove(i, r, e, a);
|
|
154
|
-
o !== i &&
|
|
154
|
+
o !== i && s(t.layerId, o);
|
|
155
155
|
}, J.current = (e) => {
|
|
156
156
|
let t = R.current;
|
|
157
157
|
if (!t) return;
|
|
@@ -161,7 +161,7 @@ function T(i) {
|
|
|
161
161
|
return;
|
|
162
162
|
}
|
|
163
163
|
let r = L(w(e)), i = t.gesture.onCommit ? t.gesture.onCommit(n, r) : n;
|
|
164
|
-
i !== n &&
|
|
164
|
+
i !== n && s(t.layerId, i), A && (V.current.push(t.startStates), H.current = []), c && c(t.layerId, i, t.startSelfState), Z();
|
|
165
165
|
}, Y.current = () => {
|
|
166
166
|
let e = R.current;
|
|
167
167
|
if (!e) return;
|
|
@@ -171,80 +171,80 @@ function T(i) {
|
|
|
171
171
|
return;
|
|
172
172
|
}
|
|
173
173
|
let n = L(C), r = e.gesture.onCancel ? e.gesture.onCancel(t, n) : e.startSelfState;
|
|
174
|
-
r !== t &&
|
|
174
|
+
r !== t && s(e.layerId, r), Z();
|
|
175
175
|
};
|
|
176
176
|
let $ = d((e, t, n) => {
|
|
177
|
-
let r = U();
|
|
177
|
+
let r = U(), i = r.get(e);
|
|
178
178
|
R.current = {
|
|
179
179
|
layerId: e,
|
|
180
180
|
gesture: n,
|
|
181
181
|
startStates: r,
|
|
182
|
-
startSelfState:
|
|
183
|
-
}, B(e), X.current =
|
|
182
|
+
startSelfState: i
|
|
183
|
+
}, B(e), X.current = o(t.currentTarget, t, {
|
|
184
184
|
onMove: (e) => q.current(e),
|
|
185
185
|
onEnd: (e) => J.current(e),
|
|
186
186
|
onCancel: () => Y.current()
|
|
187
187
|
}, { capture: !1 });
|
|
188
188
|
}, [U]), ee = d((t, n) => {
|
|
189
189
|
if (R.current) return;
|
|
190
|
-
let r =
|
|
190
|
+
let r = w(t), i = L(r), a = N.current, o = t.nativeEvent;
|
|
191
191
|
e("layered-curve-editor", "pointerdown", {
|
|
192
192
|
plot: n.plot,
|
|
193
193
|
model: n.model,
|
|
194
|
-
layers:
|
|
194
|
+
layers: a.length
|
|
195
195
|
});
|
|
196
|
-
let
|
|
197
|
-
for (let e =
|
|
198
|
-
let
|
|
199
|
-
if (!
|
|
200
|
-
let d =
|
|
196
|
+
let l = U();
|
|
197
|
+
for (let e = a.length - 1; e >= 0; e--) {
|
|
198
|
+
let r = a[e], u = r.layer.hitTest?.(r.state, n.plot, i);
|
|
199
|
+
if (!u) continue;
|
|
200
|
+
let d = r.state, f, p = r.layer.onPointerDown?.(d, u, o, i, {
|
|
201
201
|
plot: n.plot,
|
|
202
202
|
model: n.model,
|
|
203
203
|
commit(e) {
|
|
204
|
-
f = e,
|
|
204
|
+
f = e, s(r.layer.id, e);
|
|
205
205
|
}
|
|
206
206
|
});
|
|
207
207
|
if (t.stopPropagation(), p) {
|
|
208
|
-
$(
|
|
208
|
+
$(r.layer.id, t, p);
|
|
209
209
|
return;
|
|
210
210
|
}
|
|
211
|
-
f !== void 0 && (A && (V.current.push(
|
|
211
|
+
f !== void 0 && (A && (V.current.push(l), H.current = []), c?.(r.layer.id, f, d));
|
|
212
212
|
return;
|
|
213
213
|
}
|
|
214
|
-
let
|
|
215
|
-
for (let e =
|
|
216
|
-
let
|
|
217
|
-
if (!
|
|
218
|
-
let
|
|
214
|
+
let u = null;
|
|
215
|
+
for (let e = a.length - 1; e >= 0; e--) {
|
|
216
|
+
let r = a[e];
|
|
217
|
+
if (!r.layer.onEmptyPointerDown) continue;
|
|
218
|
+
let c = r.state, d, f = r.layer.onEmptyPointerDown(c, n.model, o, i, {
|
|
219
219
|
plot: n.plot,
|
|
220
220
|
model: n.model,
|
|
221
221
|
commit(e) {
|
|
222
|
-
d = e,
|
|
222
|
+
d = e, s(r.layer.id, e);
|
|
223
223
|
}
|
|
224
224
|
});
|
|
225
225
|
if (f) {
|
|
226
|
-
$(
|
|
226
|
+
$(r.layer.id, t, f), d !== void 0 && R.current !== null && (R.current.startStates = l, R.current.startSelfState = l.get(r.layer.id));
|
|
227
227
|
return;
|
|
228
228
|
}
|
|
229
229
|
if (d !== void 0) {
|
|
230
|
-
|
|
231
|
-
id:
|
|
230
|
+
u = {
|
|
231
|
+
id: r.layer.id,
|
|
232
232
|
next: d,
|
|
233
|
-
prev:
|
|
233
|
+
prev: c
|
|
234
234
|
};
|
|
235
235
|
break;
|
|
236
236
|
}
|
|
237
237
|
}
|
|
238
|
-
|
|
238
|
+
u && (A && (V.current.push(l), H.current = []), c?.(u.id, u.next, u.prev));
|
|
239
239
|
}, [
|
|
240
240
|
L,
|
|
241
241
|
$,
|
|
242
|
+
s,
|
|
242
243
|
c,
|
|
243
|
-
u,
|
|
244
244
|
A,
|
|
245
245
|
U
|
|
246
246
|
]), te = d((e) => {
|
|
247
|
-
let t =
|
|
247
|
+
let t = w(e), n = L(t), r = N.current;
|
|
248
248
|
if (A && (e.metaKey || e.ctrlKey)) {
|
|
249
249
|
let t = e.key.toLowerCase();
|
|
250
250
|
if (t === "z") {
|
|
@@ -256,13 +256,13 @@ function T(i) {
|
|
|
256
256
|
return;
|
|
257
257
|
}
|
|
258
258
|
}
|
|
259
|
-
for (let
|
|
260
|
-
let i =
|
|
259
|
+
for (let t = r.length - 1; t >= 0; t--) {
|
|
260
|
+
let i = r[t];
|
|
261
261
|
if (!i.layer.onKeyDown) continue;
|
|
262
262
|
let a = U(), o;
|
|
263
|
-
if (i.layer.onKeyDown(i.state, e.nativeEvent,
|
|
264
|
-
o = e,
|
|
265
|
-
} }), o !== void 0 && (A && (V.current.push(a), H.current = []),
|
|
263
|
+
if (i.layer.onKeyDown(i.state, e.nativeEvent, n, { commit(e) {
|
|
264
|
+
o = e, s(i.layer.id, e);
|
|
265
|
+
} }), o !== void 0 && (A && (V.current.push(a), H.current = []), c?.(i.layer.id, o, i.state)), e.nativeEvent.defaultPrevented) return;
|
|
266
266
|
}
|
|
267
267
|
}, [
|
|
268
268
|
A,
|
|
@@ -270,8 +270,8 @@ function T(i) {
|
|
|
270
270
|
K,
|
|
271
271
|
L,
|
|
272
272
|
U,
|
|
273
|
-
|
|
274
|
-
|
|
273
|
+
s,
|
|
274
|
+
c
|
|
275
275
|
]);
|
|
276
276
|
f(() => () => {
|
|
277
277
|
X.current?.cancel();
|
|
@@ -281,10 +281,10 @@ function T(i) {
|
|
|
281
281
|
plotSize: M,
|
|
282
282
|
toPlot: (e) => n(e, j, M),
|
|
283
283
|
toModel: (e) => t(e, j, M)
|
|
284
|
-
}), [j, M]);
|
|
285
|
-
return /* @__PURE__ */
|
|
284
|
+
}), [j, M]), re = [S.root, D].filter(Boolean).join(" ");
|
|
285
|
+
return /* @__PURE__ */ u(r, {
|
|
286
286
|
ref: I,
|
|
287
|
-
className:
|
|
287
|
+
className: re,
|
|
288
288
|
style: O,
|
|
289
289
|
width: g,
|
|
290
290
|
height: _,
|
|
@@ -310,7 +310,7 @@ function T(i) {
|
|
|
310
310
|
},
|
|
311
311
|
isActive: z === e.layer.id
|
|
312
312
|
};
|
|
313
|
-
return /* @__PURE__ */
|
|
313
|
+
return /* @__PURE__ */ l("g", {
|
|
314
314
|
"data-layer-id": e.layer.id,
|
|
315
315
|
children: e.layer.render(e.state, t)
|
|
316
316
|
}, e.layer.id);
|
|
@@ -369,10 +369,10 @@ function R(e) {
|
|
|
369
369
|
};
|
|
370
370
|
}
|
|
371
371
|
function z(e = {}) {
|
|
372
|
-
let t = e.id ?? "keyframes", n = e.label ?? "Curve", r = e.formatX ?? ((e) => String(Math.round(e))),
|
|
372
|
+
let t = e.id ?? "keyframes", n = e.label ?? "Curve", r = e.formatX ?? ((e) => String(Math.round(e))), o = e.snapRadiusPx ?? 6;
|
|
373
373
|
function d(e, t, n) {
|
|
374
374
|
let r = e.drag;
|
|
375
|
-
return r?.kind === "handle" && r.segment === n ?
|
|
375
|
+
return r?.kind === "handle" && r.segment === n ? a(...r.bezier) : s(t[n].easing);
|
|
376
376
|
}
|
|
377
377
|
function f(e, t, n) {
|
|
378
378
|
let r = [];
|
|
@@ -404,17 +404,17 @@ function z(e = {}) {
|
|
|
404
404
|
}
|
|
405
405
|
let h = (e) => e.map((e, t) => `${t === 0 ? "M" : "L"}${e.x.toFixed(2)},${e.y.toFixed(2)}`).join("");
|
|
406
406
|
function g(e, t) {
|
|
407
|
-
let i = e.drag?.kind === "key" ? R(e).keys : e.keys,
|
|
408
|
-
return /* @__PURE__ */
|
|
409
|
-
|
|
407
|
+
let i = e.drag?.kind === "key" ? R(e).keys : e.keys, a = f(e, i, t), o = a.flatMap((e, t) => t === 0 ? e : e.slice(1)), s = e.selectedSegment, d = p(e), g = e.drag?.kind === "key" ? e.drag.index : null;
|
|
408
|
+
return /* @__PURE__ */ u(c, { children: [
|
|
409
|
+
s !== null && s >= 1 && s < i.length ? (() => {
|
|
410
410
|
let e = t.toPlot({
|
|
411
|
-
x: i[
|
|
411
|
+
x: i[s - 1].t,
|
|
412
412
|
y: 0
|
|
413
413
|
}).x, n = t.toPlot({
|
|
414
|
-
x: i[
|
|
414
|
+
x: i[s].t,
|
|
415
415
|
y: 0
|
|
416
416
|
}).x;
|
|
417
|
-
return /* @__PURE__ */
|
|
417
|
+
return /* @__PURE__ */ l("rect", {
|
|
418
418
|
className: S.segmentBand,
|
|
419
419
|
x: Math.min(e, n),
|
|
420
420
|
y: 0,
|
|
@@ -422,44 +422,44 @@ function z(e = {}) {
|
|
|
422
422
|
height: t.plotSize.height
|
|
423
423
|
});
|
|
424
424
|
})() : null,
|
|
425
|
-
|
|
425
|
+
o.length > 1 ? /* @__PURE__ */ l("path", {
|
|
426
426
|
"data-curve-element": "curve",
|
|
427
427
|
className: S.curve,
|
|
428
|
-
d: h(
|
|
428
|
+
d: h(o)
|
|
429
429
|
}) : null,
|
|
430
|
-
|
|
430
|
+
a.map((e, t) => /* @__PURE__ */ l("path", {
|
|
431
431
|
className: S.segmentTarget,
|
|
432
432
|
d: h(e),
|
|
433
433
|
role: "button",
|
|
434
434
|
tabIndex: 0,
|
|
435
435
|
"aria-label": `${n} segment into ${r(i[t + 1].t)}`,
|
|
436
|
-
"aria-current":
|
|
436
|
+
"aria-current": s === t + 1 ? "true" : void 0,
|
|
437
437
|
"data-segment-index": t + 1
|
|
438
438
|
}, `seg-${t + 1}`)),
|
|
439
439
|
d ? (() => {
|
|
440
|
-
let [r, i] = m(e, d, t),
|
|
441
|
-
x: e.keys[
|
|
442
|
-
y: e.keys[
|
|
443
|
-
}),
|
|
444
|
-
x: e.keys[
|
|
445
|
-
y: e.keys[
|
|
440
|
+
let [r, i] = m(e, d, t), a = t.toPlot({
|
|
441
|
+
x: e.keys[s - 1].t,
|
|
442
|
+
y: e.keys[s - 1].value
|
|
443
|
+
}), o = t.toPlot({
|
|
444
|
+
x: e.keys[s].t,
|
|
445
|
+
y: e.keys[s].value
|
|
446
446
|
});
|
|
447
|
-
return /* @__PURE__ */
|
|
448
|
-
/* @__PURE__ */
|
|
447
|
+
return /* @__PURE__ */ u(c, { children: [
|
|
448
|
+
/* @__PURE__ */ l("line", {
|
|
449
449
|
className: S.handleStem,
|
|
450
|
-
x1:
|
|
451
|
-
y1:
|
|
450
|
+
x1: a.x,
|
|
451
|
+
y1: a.y,
|
|
452
452
|
x2: r.x,
|
|
453
453
|
y2: r.y
|
|
454
454
|
}),
|
|
455
|
-
/* @__PURE__ */
|
|
455
|
+
/* @__PURE__ */ l("line", {
|
|
456
456
|
className: S.handleStem,
|
|
457
|
-
x1:
|
|
458
|
-
y1:
|
|
457
|
+
x1: o.x,
|
|
458
|
+
y1: o.y,
|
|
459
459
|
x2: i.x,
|
|
460
460
|
y2: i.y
|
|
461
461
|
}),
|
|
462
|
-
[r, i].map((e, t) => /* @__PURE__ */
|
|
462
|
+
[r, i].map((e, t) => /* @__PURE__ */ l("circle", {
|
|
463
463
|
className: S.handle,
|
|
464
464
|
cx: e.x,
|
|
465
465
|
cy: e.y,
|
|
@@ -472,17 +472,17 @@ function z(e = {}) {
|
|
|
472
472
|
] });
|
|
473
473
|
})() : null,
|
|
474
474
|
e.keys.map((i, a) => {
|
|
475
|
-
let
|
|
475
|
+
let o = t.toPlot({
|
|
476
476
|
x: i.t,
|
|
477
477
|
y: i.value
|
|
478
478
|
});
|
|
479
|
-
return /* @__PURE__ */
|
|
479
|
+
return /* @__PURE__ */ l("rect", {
|
|
480
480
|
className: S.keyframe,
|
|
481
|
-
x:
|
|
482
|
-
y:
|
|
481
|
+
x: o.x - A,
|
|
482
|
+
y: o.y - A,
|
|
483
483
|
width: A * 2,
|
|
484
484
|
height: A * 2,
|
|
485
|
-
transform: `rotate(45 ${
|
|
485
|
+
transform: `rotate(45 ${o.x} ${o.y})`,
|
|
486
486
|
role: "button",
|
|
487
487
|
tabIndex: 0,
|
|
488
488
|
"aria-label": `${n} key at ${r(i.t)}`,
|
|
@@ -496,7 +496,7 @@ function z(e = {}) {
|
|
|
496
496
|
x: e.drag.t,
|
|
497
497
|
y: e.drag.value
|
|
498
498
|
});
|
|
499
|
-
return /* @__PURE__ */
|
|
499
|
+
return /* @__PURE__ */ l("rect", {
|
|
500
500
|
"aria-hidden": "true",
|
|
501
501
|
className: S.keyframeGhost,
|
|
502
502
|
x: n.x - A,
|
|
@@ -534,18 +534,18 @@ function z(e = {}) {
|
|
|
534
534
|
}
|
|
535
535
|
function b(t) {
|
|
536
536
|
return {
|
|
537
|
-
onMove(n, r, a,
|
|
538
|
-
let
|
|
537
|
+
onMove(n, r, a, s) {
|
|
538
|
+
let c = F(r.x, e.xClamp);
|
|
539
539
|
if (e.snapX && !a.altKey) {
|
|
540
|
-
let t = (
|
|
541
|
-
|
|
540
|
+
let t = (s.modelRange.xMax - s.modelRange.xMin) / s.plotSize.width;
|
|
541
|
+
c = F(i(c, e.snapX, Math.abs(t) * o), e.xClamp);
|
|
542
542
|
}
|
|
543
543
|
return {
|
|
544
544
|
...n,
|
|
545
545
|
drag: {
|
|
546
546
|
kind: "key",
|
|
547
547
|
index: t,
|
|
548
|
-
t:
|
|
548
|
+
t: c,
|
|
549
549
|
value: F(r.y, e.yClamp)
|
|
550
550
|
}
|
|
551
551
|
};
|
|
@@ -696,4 +696,4 @@ function z(e = {}) {
|
|
|
696
696
|
//#endregion
|
|
697
697
|
export { S as a, b as c, T as i, _ as l, z as n, y as o, P as r, x as s, R as t, v as u };
|
|
698
698
|
|
|
699
|
-
//# sourceMappingURL=createKeyframeLayer-
|
|
699
|
+
//# sourceMappingURL=createKeyframeLayer-Czj6Y235.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createKeyframeLayer-Czj6Y235.js","names":["s","_Fragment","s","dlog","plotToModel","modelToPlot","Plot2D","snapToNearest","hitTestAnchor","r2","radius","best","i","anchors","dx","pointer","dy","d2","hitTestCurve","segIdx","segments","samples","last","a","b","abx","aby","apx","apy","ab2","u","cx","cy","t","HANDLE_SIZE_TOKENS","handleSize","tokenPx","token","resolved","handleHalf","CurveEditor_module_default","NO_MODIFIERS","readModifiers","LayeredCurveEditor","props","historyEnabled","modelRange","useMemo","xRange","yRange","plotSize","width","height","layersRef","useRef","layers","modelRangeRef","plotSizeRef","plotRef","makeCtx","useCallback","mr","ps","p","activeRef","activeLayerId","setActiveLayerId","useState","pastRef","futureRef","snapshot","m","restore","current","prev","snap","onLayerChange","undo","past","redo","future","next","onGestureMoveRef","onGestureEndRef","onGestureCancelRef","sessionRef","cleanupGesture","findLayerState","id","h","model","ctx","finalState","onLayerCommit","restored","installGesture","startStates","startSelfState","layerId","openPointerSession","down","onSvgPointerDown","modifiers","e","ls","nativeEvent","coords","preEventSnapshot","hit","prevState","committed","gesture","pendingCommit","onSvgKeyDown","k","renderCtxBase","cls","className","children","SAMPLES_PER_SEGMENT","KEY_HIT_PX","HANDLE_HIT_PX","CURVE_HIT_PX","KEY_HALF","HANDLE_RADIUS","SHIFT_MULTIPLIER","HANDLE_STEP","keyframeLayerState","clampTo","range","v","bezierOf","key","moveKeyTo","moved","keys","index","rest","at","selectedKey","applyKeyframeDrag","state","drag","createKeyframeLayer","cfg","label","formatX","x","snapRadiusPx","easingInto","d","seg","cubicBezierEasing","resolveEasing","segmentSamples","out","ease","pts","j","activeBezier","handlePoints","xf","yf","bezier","path","render","shown","curve","dragIndex","Fragment","x0","x1","h1","h2","hitTest","plot","c","keyGesture","perPx","handleGesture","segment","handle","onPointerDown","extra","onKeyDown","target","activate","mult","keyEl","stepX","stepY","value","segEl","handleEl"],"sources":["../../src/components/CurveEditor/hitTest.ts","../../src/handles.ts","../../src/components/CurveEditor/CurveEditor.module.css","../../src/components/CurveEditor/LayeredCurveEditor.tsx","../../src/components/CurveEditor/createKeyframeLayer.tsx"],"sourcesContent":["/**\n * Curve-specific hit tests. Generic coord transforms live in\n * `../Plot2D/geometry`; what's here is curve-only (anchor / polyline\n * proximity).\n */\nimport type { Point } from '../Plot2D/geometry';\n\n/**\n * Nearest-anchor hit test. Anchors are already in plot/screen coords.\n * Returns the index of the nearest anchor whose squared distance to\n * the pointer is ≤ radius². Null if no anchor is within radius.\n */\nexport function hitTestAnchor(\n anchors: readonly Point[],\n pointer: Point,\n radius: number,\n): { index: number } | null {\n const r2 = radius * radius;\n let best: { index: number; d2: number } | null = null;\n for (let i = 0; i < anchors.length; i++) {\n const a = anchors[i];\n const dx = a.x - pointer.x;\n const dy = a.y - pointer.y;\n const d2 = dx * dx + dy * dy;\n if (d2 > r2) continue;\n if (best === null || d2 < best.d2) best = { index: i, d2 };\n }\n return best ? { index: best.index } : null;\n}\n\n/**\n * Hit test against a per-segment sampled polyline. Each entry in\n * `segments` is the sample list for one segment (inclusive of\n * endpoints). Returns segment index + t (∈ [0, 1]) of the closest\n * point on the polyline within radius. Null if nothing is in range.\n *\n * Distance is measured to the line-segment chords between adjacent\n * samples, not just to the samples themselves — so sparse sampling\n * still produces accurate hits along the chord.\n */\nexport function hitTestCurve(\n segments: readonly (readonly Point[])[],\n pointer: Point,\n radius: number,\n): { segIdx: number; t: number } | null {\n const r2 = radius * radius;\n let best: { segIdx: number; t: number; d2: number } | null = null;\n for (let segIdx = 0; segIdx < segments.length; segIdx++) {\n const samples = segments[segIdx];\n if (samples.length < 2) continue;\n const last = samples.length - 1;\n for (let i = 0; i < last; i++) {\n const a = samples[i];\n const b = samples[i + 1];\n const abx = b.x - a.x;\n const aby = b.y - a.y;\n const apx = pointer.x - a.x;\n const apy = pointer.y - a.y;\n const ab2 = abx * abx + aby * aby;\n let u = ab2 > 0 ? (apx * abx + apy * aby) / ab2 : 0;\n if (u < 0) u = 0;\n else if (u > 1) u = 1;\n const cx = a.x + u * abx;\n const cy = a.y + u * aby;\n const dx = cx - pointer.x;\n const dy = cy - pointer.y;\n const d2 = dx * dx + dy * dy;\n if (d2 > r2) continue;\n const t = (i + u) / last;\n if (best === null || d2 < best.d2) best = { segIdx, t, d2 };\n }\n }\n return best ? { segIdx: best.segIdx, t: best.t } : null;\n}\n","import { tokenPx } from '@weasel-js/theme';\nimport type { ResolvedTheme } from '@weasel-js/theme';\n\n/**\n * The handle sizes the theme publishes: the default rank, the inert one a\n * locked or pinned point wears, and the emphasized one for a handle that is\n * its own category.\n */\nexport const HANDLE_SIZE_TOKENS = [\n '--wzl-handle-size', '--wzl-handle-size-sm', '--wzl-handle-size-lg',\n] as const;\n\n/** One of {@link HANDLE_SIZE_TOKENS}. */\nexport type HandleSizeToken = (typeof HANDLE_SIZE_TOKENS)[number];\n\n/**\n * A handle's edge in px, for code that draws a handle instead of styling one.\n *\n * CSS reaches `--wzl-handle-*` directly; SVG geometry attributes and canvas\n * cannot, so they come through here and the number stays written once, in the\n * theme definition.\n */\nexport function handleSize(token: HandleSizeToken, resolved?: ResolvedTheme): number {\n return tokenPx(token, resolved);\n}\n\n/** Half a handle's edge — what an SVG rect centered on a point offsets by. */\nexport function handleHalf(token: HandleSizeToken, resolved?: ResolvedTheme): number {\n return handleSize(token, resolved) / 2;\n}\n",".root {\n /* Component-local vars layered over the theme tokens. Each var resolves\n * to a semantic token from @weasel-js/theme; consumers override\n * either the curve-* var (component scope) or the wzl-* token (app\n * scope) without touching this file.\n *\n * Background / grid / axis tokens live on Plot2D now (this component\n * composes Plot2D, which paints the background and chrome). */\n --curve-line: var(--wzl-curve-color);\n --curve-line-width: var(--wzl-curve-width);\n --curve-fill: color-mix(in srgb, var(--curve-line) 30%, transparent);\n --curve-anchor-fill: var(--wzl-surface);\n --curve-anchor-stroke: var(--curve-line);\n --curve-anchor-active-fill: var(--curve-line);\n --curve-pinned-fill: var(--wzl-fg-subtle);\n}\n\n.fill {\n fill: var(--curve-fill);\n stroke: none;\n pointer-events: none;\n}\n\n.curve {\n stroke: var(--curve-line);\n stroke-width: var(--curve-line-width);\n fill: none;\n pointer-events: stroke;\n}\n\n.anchor {\n fill: var(--curve-anchor-fill);\n stroke: var(--curve-anchor-stroke);\n stroke-width: 1.5;\n cursor: grab;\n}\n\n.anchor:hover {\n fill: var(--curve-anchor-active-fill);\n}\n\n.anchor.active {\n fill: var(--curve-anchor-active-fill);\n cursor: grabbing;\n}\n\n.anchor.pinned {\n fill: var(--curve-pinned-fill);\n cursor: default;\n}\n\n/* Caller-set locked anchors share the gray pinned fill but signal\n * \"not interactive at all\" via the not-allowed cursor. */\n.anchor.locked {\n cursor: not-allowed;\n}\n\n/* Endpoint vertices render as diamonds (rotated squares) instead of\n * circles, so they read as a different category of handle. The shape\n * is enforced inline via SVG <rect transform>; this class only adds\n * the hover/active styling. */\n.endpoint {\n /* No fill / stroke overrides — endpoint visuals reuse .anchor /\n * .anchor.pinned / .anchor.active styling. The class exists as a\n * marker for future per-endpoint styling needs. */\n}\n\n/* When the consumer opts into hiding non-interactive handles, pinned\n * endpoints disappear entirely. */\n.hidden {\n display: none;\n}\n\n/* Focus is drawn on the mark itself: an outline on an SVG shape rings its\n bounding box, which the nearest scroll container clips. */\n.anchor:focus-visible {\n outline: none;\n stroke: var(--wzl-focus-ring);\n stroke-width: 2;\n}\n\n/* ── keyframe layer ─────────────────────────────────────────────────── */\n\n.keyframe {\n fill: var(--curve-key-fill, var(--wzl-fg-muted));\n cursor: grab;\n}\n\n.keyframe[aria-current='true'] { fill: var(--curve-selected, var(--wzl-accent-strong)); }\n.keyframe:focus-visible,\n.handle:focus-visible {\n outline: none;\n stroke: var(--wzl-focus-ring);\n stroke-width: 2;\n}\n\n.segmentTarget:focus-visible {\n outline: none;\n stroke: var(--wzl-focus-ring);\n stroke-opacity: 0.5;\n}\n\n/* The committed key holds while its ghost tracks the pointer, so a drag\n reads as a move from somewhere to somewhere. */\n.keyframe[data-dragging='true'] { opacity: 0.4; }\n\n.keyframeGhost {\n fill: var(--curve-selected-soft, var(--wzl-accent-soft));\n stroke: var(--curve-selected, var(--wzl-accent-strong));\n stroke-width: 1;\n stroke-dasharray: 2 2;\n pointer-events: none;\n}\n\n.segmentBand {\n fill: var(--curve-selected-soft, var(--wzl-accent-soft));\n pointer-events: none;\n}\n\n/* Carries focus and a name for each segment; hit testing is geometric. */\n.segmentTarget {\n fill: none;\n stroke: transparent;\n stroke-width: 8;\n pointer-events: none;\n}\n\n.handle {\n fill: var(--wzl-surface);\n stroke: var(--curve-selected, var(--wzl-accent-strong));\n stroke-width: 1;\n cursor: grab;\n}\n\n.handleStem {\n stroke: var(--curve-selected, var(--wzl-accent-strong));\n stroke-width: 1;\n pointer-events: none;\n}\n","import {\n useCallback, useEffect, useMemo, useRef, useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from 'react';\nimport { openPointerSession, type PointerSession } from '@weasel-js/core';\nimport {\n Plot2D,\n type Plot2DHandle,\n type GridSettings,\n type AxesSettings,\n type TickSettings,\n} from '../Plot2D';\nimport {\n modelToPlot, plotToModel,\n type ModelRange,\n} from '../Plot2D/geometry';\nimport { dlog } from '../../dlog';\nimport s from './CurveEditor.module.css';\nimport type {\n CurveLayer, LayerCtx, LayerGesture, LayerModifiers, ModelPoint, PlotPoint,\n} from './layerTypes';\n\n/**\n * A layer paired with the state the consumer holds for it. The editor never\n * stores layer state itself.\n */\nexport interface LayerBinding<S = unknown> {\n layer: CurveLayer<S>;\n state: S;\n}\n\n/** Props for {@link LayeredCurveEditor}. */\nexport interface LayeredCurveEditorProps {\n /** Bottom-to-top render order: `layers[0]` paints first, `layers[N-1]`\n * paints on top. Hit-testing runs in reverse (topmost claim wins). */\n layers: ReadonlyArray<LayerBinding<unknown>>;\n\n /** Fires every frame during a gesture with the live in-flight state\n * for the layer that owns the gesture. */\n onLayerChange(id: string, next: unknown): void;\n\n /** Fires once per discrete user action (drag-end, one-shot insert,\n * delete) for the layer that produced the change. `prev` is the\n * layer's state at gesture start. */\n onLayerCommit?(id: string, next: unknown, prev: unknown): void;\n\n width: number;\n height: number;\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 grid?: GridSettings | false | null;\n axes?: AxesSettings | false | null;\n /** Ticks at x values. See `Plot2D.xTicks`. */\n xTicks?: TickSettings | false | null;\n /** Ticks at y values. See `Plot2D.yTicks`. */\n yTicks?: TickSettings | false | null;\n\n /** Built-in undo/redo via Cmd/Ctrl+Z (Shift+Z or Y for redo) on the\n * focused SVG. Snapshots every layer's state on each commit; undo\n * fires `onLayerChange(id, prevState)` for each layer whose state\n * changed. Default `true`. */\n history?: boolean;\n\n /** Accessible name for the plot, which is exposed as a group so the\n * focusable marks layers render inside it stay reachable. */\n 'aria-label'?: string;\n className?: string;\n style?: CSSProperties;\n\n /** Extra SVG content rendered behind all layers (under the lowest\n * layer but above grid/axes). Use this for static chrome that isn't\n * worth modeling as a layer. */\n children?: ReactNode;\n}\n\ninterface ActiveGesture {\n layerId: string;\n gesture: LayerGesture<unknown>;\n startStates: Map<string, unknown>;\n startSelfState: unknown;\n}\n\n/** A cancel carries no event, so a layer's `onCancel` sees no modifiers held. */\nconst NO_MODIFIERS: LayerModifiers = { shift: false, alt: false, meta: false, ctrl: false };\n\nfunction readModifiers(e: PointerEvent | ReactPointerEvent | KeyboardEvent | ReactKeyboardEvent): LayerModifiers {\n return {\n shift: e.shiftKey,\n alt: e.altKey,\n meta: e.metaKey,\n ctrl: e.ctrlKey,\n };\n}\n\n/**\n * A `Plot2D` that hosts a stack of composable curve layers. It owns the\n * pointer gestures and the coordinate mapping; each layer supplies its own\n * drawing, hit testing and gesture behavior.\n *\n * Layer state stays with the consumer: the editor reports changes through\n * `onLayerChange` during a gesture and `onLayerCommit` at its end, and reads\n * the state back from props each frame. That is what lets one layer's drag\n * update another layer's state mid-gesture.\n */\nexport function LayeredCurveEditor(props: LayeredCurveEditorProps) {\n const {\n layers, onLayerChange, onLayerCommit,\n width, height,\n xRange = [0, 1], yRange = [0, 1],\n grid, axes, xTicks, yTicks,\n className, style, children,\n } = props;\n\n const historyEnabled = props.history !== false;\n\n const modelRange: ModelRange = useMemo(\n () => ({ xMin: xRange[0], xMax: xRange[1], yMin: yRange[0], yMax: yRange[1] }),\n [xRange, yRange],\n );\n const plotSize = useMemo(() => ({ width, height }), [width, height]);\n\n // Refs that always hold the latest props — gesture handlers and\n // window listeners close over these refs, never over render-time\n // values, so mid-drag re-renders (including cross-layer state\n // updates) are visible to the next pointermove tick.\n const layersRef = useRef(layers);\n layersRef.current = layers;\n const modelRangeRef = useRef(modelRange);\n modelRangeRef.current = modelRange;\n const plotSizeRef = useRef(plotSize);\n plotSizeRef.current = plotSize;\n\n const plotRef = useRef<Plot2DHandle | null>(null);\n\n // ── Coord helpers ──────────────────────────────────────────────────\n const makeCtx = useCallback((modifiers: LayerModifiers): LayerCtx => {\n const mr = modelRangeRef.current;\n const ps = plotSizeRef.current;\n return {\n modelRange: mr,\n plotSize: ps,\n toPlot: (p) => modelToPlot(p, mr, ps),\n toModel: (p) => plotToModel(p, mr, ps),\n modifiers,\n };\n }, []);\n\n // ── Gesture routing ────────────────────────────────────────────────\n const activeRef = useRef(null as ActiveGesture | null);\n const [activeLayerId, setActiveLayerId] = useState<string | null>(null);\n\n // ── History (whole-state snapshots) ────────────────────────────────\n const pastRef = useRef<Map<string, unknown>[]>([]);\n const futureRef = useRef<Map<string, unknown>[]>([]);\n\n const snapshot = useCallback((): Map<string, unknown> => {\n const m = new Map<string, unknown>();\n for (const b of layersRef.current) m.set(b.layer.id, b.state);\n return m;\n }, []);\n\n const restore = useCallback((snap: Map<string, unknown>) => {\n const current = layersRef.current;\n for (const b of current) {\n const prev = snap.get(b.layer.id);\n if (prev !== undefined && prev !== b.state) {\n onLayerChange(b.layer.id, prev);\n }\n }\n }, [onLayerChange]);\n\n const undo = useCallback(() => {\n if (!historyEnabled) return;\n const past = pastRef.current;\n if (past.length === 0) return;\n const prev = past.pop()!;\n futureRef.current.push(snapshot());\n restore(prev);\n }, [historyEnabled, snapshot, restore]);\n\n const redo = useCallback(() => {\n if (!historyEnabled) return;\n const future = futureRef.current;\n if (future.length === 0) return;\n const next = future.pop()!;\n pastRef.current.push(snapshot());\n restore(next);\n }, [historyEnabled, snapshot, restore]);\n\n // ── Pointer routing during an active gesture ───────────────────────\n // The session's callbacks are fixed at gesture start, so they delegate\n // through refs holding the latest per-render impl — a mid-drag re-render\n // must reach the next pointermove tick.\n const onGestureMoveRef = useRef<(e: PointerEvent) => void>(() => {});\n const onGestureEndRef = useRef<(e: PointerEvent) => void>(() => {});\n const onGestureCancelRef = useRef<() => void>(() => {});\n\n const sessionRef = useRef<PointerSession | null>(null);\n\n const cleanupGesture = useCallback(() => {\n sessionRef.current = null;\n activeRef.current = null;\n setActiveLayerId(null);\n }, []);\n\n const findLayerState = useCallback((id: string): unknown | undefined => {\n for (const b of layersRef.current) if (b.layer.id === id) return b.state;\n return undefined;\n }, []);\n\n onGestureMoveRef.current = (e: PointerEvent) => {\n const a = activeRef.current;\n if (!a) return;\n const h = plotRef.current;\n if (!h) return;\n const model = h.clientToModel(e);\n const current = findLayerState(a.layerId);\n if (current === undefined) return;\n const ctx = makeCtx(readModifiers(e));\n const next = a.gesture.onMove(current, model, e, ctx);\n if (next !== current) onLayerChange(a.layerId, next);\n };\n\n onGestureEndRef.current = (e: PointerEvent) => {\n const a = activeRef.current;\n if (!a) return;\n const current = findLayerState(a.layerId);\n if (current === undefined) { cleanupGesture(); return; }\n const ctx = makeCtx(readModifiers(e));\n const finalState = a.gesture.onCommit ? a.gesture.onCommit(current, ctx) : current;\n if (finalState !== current) onLayerChange(a.layerId, finalState);\n if (historyEnabled) {\n pastRef.current.push(a.startStates);\n futureRef.current = [];\n }\n if (onLayerCommit) onLayerCommit(a.layerId, finalState, a.startSelfState);\n cleanupGesture();\n };\n\n onGestureCancelRef.current = () => {\n const a = activeRef.current;\n if (!a) return;\n const current = findLayerState(a.layerId);\n if (current === undefined) { cleanupGesture(); return; }\n const ctx = makeCtx(NO_MODIFIERS);\n const restored = a.gesture.onCancel ? a.gesture.onCancel(current, ctx) : a.startSelfState;\n if (restored !== current) onLayerChange(a.layerId, restored);\n cleanupGesture();\n };\n\n // No pointer capture: consumers render their own SVG chrome into the plot\n // through `children`, and capture would retarget pointerup away from it.\n const installGesture = useCallback((\n layerId: string,\n down: ReactPointerEvent<SVGSVGElement>,\n gesture: LayerGesture<unknown>,\n ) => {\n const startStates = snapshot();\n const startSelfState = startStates.get(layerId);\n activeRef.current = {\n layerId, gesture,\n startStates,\n startSelfState,\n };\n setActiveLayerId(layerId);\n sessionRef.current = openPointerSession(down.currentTarget, down, {\n onMove: (e) => onGestureMoveRef.current(e),\n onEnd: (e) => onGestureEndRef.current(e),\n onCancel: () => onGestureCancelRef.current(),\n }, { capture: false });\n }, [snapshot]);\n\n // ── pointerdown dispatch ───────────────────────────────────────────\n const onSvgPointerDown = useCallback((\n e: ReactPointerEvent<SVGSVGElement>,\n coords: { plot: PlotPoint; model: ModelPoint },\n ) => {\n if (activeRef.current) return; // ignore secondary touches mid-gesture\n const modifiers = readModifiers(e);\n const ctx = makeCtx(modifiers);\n const ls = layersRef.current;\n const nativeEvent = e.nativeEvent;\n\n dlog('layered-curve-editor', 'pointerdown', { plot: coords.plot, model: coords.model, layers: ls.length });\n\n // Capture the pre-event snapshot once; reuse for history if any\n // path produces a commit (gesture-start commit or one-shot).\n const preEventSnapshot = snapshot();\n\n // Top-to-bottom hit test.\n for (let i = ls.length - 1; i >= 0; i--) {\n const b = ls[i];\n const hit = b.layer.hitTest?.(b.state, coords.plot, ctx);\n if (!hit) continue;\n // Found a claim. onPointerDown may start a gesture, absorb the\n // click, or commit a one-shot edit via extra.commit.\n const prevState = b.state;\n let committed: unknown = undefined;\n const gesture = b.layer.onPointerDown?.(\n prevState, hit, nativeEvent, ctx,\n {\n plot: coords.plot,\n model: coords.model,\n commit(next) { committed = next; onLayerChange(b.layer.id, next); },\n },\n );\n e.stopPropagation();\n if (gesture) {\n installGesture(b.layer.id, e, gesture);\n return;\n }\n if (committed !== undefined) {\n if (historyEnabled) {\n pastRef.current.push(preEventSnapshot);\n futureRef.current = [];\n }\n onLayerCommit?.(b.layer.id, committed, prevState);\n }\n return;\n }\n\n // No hit — empty space dispatch, top-to-bottom.\n let pendingCommit: { id: string; next: unknown; prev: unknown } | null = null;\n for (let i = ls.length - 1; i >= 0; i--) {\n const b = ls[i];\n if (!b.layer.onEmptyPointerDown) continue;\n const prevState = b.state;\n let committed: unknown = undefined;\n const gesture = b.layer.onEmptyPointerDown(\n prevState, coords.model, nativeEvent, ctx,\n {\n plot: coords.plot,\n model: coords.model,\n commit(next) {\n committed = next;\n onLayerChange(b.layer.id, next);\n },\n },\n );\n if (gesture) {\n // If onEmptyPointerDown also published a commit (e.g. click-curve\n // insert publishes the new point then drags it), the gesture's\n // startStates already capture the post-insert state; the commit\n // for history is the *pre*-event snapshot, written when the\n // gesture eventually finishes via the gesture-commit path. We\n // override the gesture's startStates so undo restores correctly.\n installGesture(b.layer.id, e, gesture);\n if (committed !== undefined && activeRef.current !== null) {\n (activeRef.current as ActiveGesture).startStates = preEventSnapshot;\n (activeRef.current as ActiveGesture).startSelfState = preEventSnapshot.get(b.layer.id);\n }\n return;\n }\n if (committed !== undefined) {\n pendingCommit = { id: b.layer.id, next: committed, prev: prevState };\n break;\n }\n }\n if (pendingCommit) {\n if (historyEnabled) {\n pastRef.current.push(preEventSnapshot);\n futureRef.current = [];\n }\n onLayerCommit?.(pendingCommit.id, pendingCommit.next, pendingCommit.prev);\n }\n }, [makeCtx, installGesture, onLayerChange, onLayerCommit, historyEnabled, snapshot]);\n\n // ── keyboard ───────────────────────────────────────────────────────\n const onSvgKeyDown = useCallback((e: ReactKeyboardEvent<SVGSVGElement>) => {\n const modifiers = readModifiers(e);\n const ctx = makeCtx(modifiers);\n const ls = layersRef.current;\n // History first.\n if (historyEnabled && (e.metaKey || e.ctrlKey)) {\n const k = e.key.toLowerCase();\n if (k === 'z') {\n if (e.shiftKey) redo();\n else undo();\n e.preventDefault();\n return;\n }\n if (k === 'y') { redo(); e.preventDefault(); return; }\n }\n // Then layers (top-to-bottom).\n for (let i = ls.length - 1; i >= 0; i--) {\n const b = ls[i];\n if (!b.layer.onKeyDown) continue;\n const preEventSnapshot = snapshot();\n let committed: unknown = undefined;\n b.layer.onKeyDown(b.state, e.nativeEvent, ctx, {\n commit(next) { committed = next; onLayerChange(b.layer.id, next); },\n });\n if (committed !== undefined) {\n if (historyEnabled) {\n pastRef.current.push(preEventSnapshot);\n futureRef.current = [];\n }\n onLayerCommit?.(b.layer.id, committed, b.state);\n }\n // The layer prevents default on the native event, which the synthetic\n // event's `isDefaultPrevented` does not observe.\n if (e.nativeEvent.defaultPrevented) return;\n }\n }, [historyEnabled, undo, redo, makeCtx, snapshot, onLayerChange, onLayerCommit]);\n\n useEffect(() => () => { sessionRef.current?.cancel(); }, []);\n\n // ── render ─────────────────────────────────────────────────────────\n const renderCtxBase: Omit<LayerCtx, 'modifiers'> = useMemo(() => ({\n modelRange,\n plotSize,\n toPlot: (p) => modelToPlot(p, modelRange, plotSize),\n toModel: (p) => plotToModel(p, modelRange, plotSize),\n }), [modelRange, plotSize]);\n\n const cls = [s.root, className].filter(Boolean).join(' ');\n\n return (\n <Plot2D\n ref={plotRef}\n className={cls}\n style={style}\n width={width}\n height={height}\n xRange={xRange}\n yRange={yRange}\n grid={grid}\n axes={axes}\n xTicks={xTicks}\n yTicks={yTicks}\n tabIndex={historyEnabled ? 0 : undefined}\n role=\"group\"\n aria-label={props['aria-label']}\n onPointerDown={onSvgPointerDown}\n onKeyDown={onSvgKeyDown}\n >\n {children}\n {layers.map((b) => {\n const ctx = {\n ...renderCtxBase,\n modifiers: { shift: false, alt: false, meta: false, ctrl: false },\n isActive: activeLayerId === b.layer.id,\n };\n return (\n <g key={b.layer.id} data-layer-id={b.layer.id}>\n {b.layer.render(b.state, ctx)}\n </g>\n );\n })}\n </Plot2D>\n );\n}\n","/**\n * Keyframe layer for LayeredCurveEditor: a value-over-time curve whose shape\n * between two keys is the easing on the later one, with draggable keys and\n * draggable cubic-bezier handles on the selected segment.\n *\n * Distinct from `createFunctionLayer`, which interpolates a spline through\n * its anchors. Here the keys are exact and the easing approximates between\n * them, so the two do not share curve maths.\n */\nimport type { ReactNode } from 'react';\nimport { cubicBezierEasing, resolveEasing, type EasingFn, type Keyframe } from '@weasel-js/core';\nimport { hitTestAnchor, hitTestCurve } from './hitTest';\nimport { handleHalf } from '../../handles';\nimport { SNAP_RADIUS_PX, snapToNearest } from '../../snap';\nimport s from './CurveEditor.module.css';\nimport type {\n CurveLayer, EmptyDownArgs, KeyDownArgs, LayerCtx, LayerGesture, LayerHit, LayerRenderCtx, PlotPoint,\n} from './layerTypes';\n\ntype Bezier = readonly [number, number, number, number];\n\n/** A gesture in flight. The committed keys hold still underneath it. */\nexport type KeyframeDrag =\n | { kind: 'key'; index: number; t: number; value: number }\n | { kind: 'handle'; segment: number; bezier: Bezier };\n\n/**\n * The state a keyframe layer owns, held by the consumer and round-tripped\n * through `LayeredCurveEditor`'s `onLayerChange`.\n */\nexport interface KeyframeLayerState {\n /** Sorted ascending by `t`. */\n keys: readonly Keyframe<number>[];\n selectedKey: number | null;\n /** Index of the key the selected segment runs into. Its bezier handles show. */\n selectedSegment: number | null;\n drag: KeyframeDrag | null;\n}\n\n/** Configuration for {@link createKeyframeLayer}. */\nexport interface KeyframeLayerConfig {\n /** Layer id; default `'keyframes'`. */\n id?: string;\n /** Names the curve in each mark's accessible name. Default `'Curve'`. */\n label?: string;\n /** Formats a key time for accessible names. Default: rounded number. */\n formatX?: (x: number) => string;\n /** Times a dragged key snaps to. Holding alt defeats the snap. */\n snapX?: readonly number[];\n /** Snap reach, in plot pixels. Default 6. */\n snapRadiusPx?: number;\n /** Bounds for a key's time. Default: unbounded. */\n xClamp?: readonly [number, number];\n /** Bounds for a key's value. Default: unbounded. */\n yClamp?: readonly [number, number];\n /** One arrow-key step in model units; shift takes ten. Default: 1% of the\n * plot's range on that axis. */\n step?: { x?: number; y?: number };\n}\n\nconst SAMPLES_PER_SEGMENT = 16;\nconst KEY_HIT_PX = 8;\nconst HANDLE_HIT_PX = 8;\nconst CURVE_HIT_PX = 6;\nconst KEY_HALF = handleHalf('--wzl-handle-size');\nconst HANDLE_RADIUS = 3.5;\nconst SHIFT_MULTIPLIER = 10;\nconst HANDLE_STEP = 0.01;\n\n/** A keyframe layer state with nothing selected and no gesture in flight. */\nexport function keyframeLayerState(keys: readonly Keyframe<number>[]): KeyframeLayerState {\n return { keys, selectedKey: null, selectedSegment: null, drag: null };\n}\n\nfunction clampTo(v: number, range?: readonly [number, number]): number {\n return range ? Math.min(range[1], Math.max(range[0], v)) : v;\n}\n\nfunction bezierOf(key: Keyframe<number> | undefined): Bezier | null {\n const e = key?.easing;\n return typeof e === 'object' && e !== null && 'bezier' in e ? e.bezier : null;\n}\n\nfunction moveKeyTo(\n keys: readonly Keyframe<number>[], index: number, t: number, value: number,\n): { keys: Keyframe<number>[]; selectedKey: number } {\n const moved = { ...keys[index], t, value };\n const rest = keys.filter((_, i) => i !== index);\n const at = rest.findIndex((k) => k.t > t);\n const selectedKey = at === -1 ? rest.length : at;\n rest.splice(selectedKey, 0, moved);\n return { keys: rest, selectedKey };\n}\n\n/**\n * The keys a state's drag would leave behind: a dragged key re-sorted into\n * place, or a dragged handle's control points written onto the key its\n * segment runs into. `selectedKey` follows a moved key to its new index; a\n * key dropped where it started returns the same `keys` array.\n */\nexport function applyKeyframeDrag(\n state: KeyframeLayerState,\n): { keys: readonly Keyframe<number>[]; selectedKey: number | null } {\n const { drag, keys } = state;\n if (!drag) return { keys, selectedKey: state.selectedKey };\n if (drag.kind === 'key') {\n const k = keys[drag.index];\n if (k && k.t === drag.t && k.value === drag.value) return { keys, selectedKey: drag.index };\n return moveKeyTo(keys, drag.index, drag.t, drag.value);\n }\n const next = keys.slice();\n next[drag.segment] = { ...keys[drag.segment], easing: { bezier: drag.bezier } };\n return { keys: next, selectedKey: state.selectedKey };\n}\n\n/**\n * Builds a keyframe layer for `LayeredCurveEditor`. Model x is time and model\n * y is value; each segment is drawn through the easing on the key it runs\n * into. Every key, segment and handle is focusable and named, and the arrow\n * keys move whichever one has focus.\n */\nexport function createKeyframeLayer(cfg: KeyframeLayerConfig = {}): CurveLayer<KeyframeLayerState> {\n const id = cfg.id ?? 'keyframes';\n const label = cfg.label ?? 'Curve';\n const formatX = cfg.formatX ?? ((x: number) => String(Math.round(x)));\n const snapRadiusPx = cfg.snapRadiusPx ?? SNAP_RADIUS_PX;\n\n // A live handle drag is previewed straight from its control points: a\n // fresh spec per pointermove through `resolveEasing` would leave one\n // permanent cache entry per pixel of drag.\n function easingInto(state: KeyframeLayerState, keys: readonly Keyframe<number>[], seg: number): EasingFn {\n const d = state.drag;\n if (d?.kind === 'handle' && d.segment === seg) return cubicBezierEasing(...d.bezier);\n return resolveEasing(keys[seg].easing);\n }\n\n function segmentSamples(state: KeyframeLayerState, keys: readonly Keyframe<number>[], ctx: LayerCtx): PlotPoint[][] {\n const out: PlotPoint[][] = [];\n for (let i = 1; i < keys.length; i++) {\n const a = keys[i - 1];\n const b = keys[i];\n const ease = easingInto(state, keys, i);\n const pts: PlotPoint[] = [];\n for (let j = 0; j <= SAMPLES_PER_SEGMENT; j++) {\n const u = j / SAMPLES_PER_SEGMENT;\n pts.push(ctx.toPlot({ x: a.t + (b.t - a.t) * u, y: a.value + (b.value - a.value) * ease(u) }));\n }\n out.push(pts);\n }\n return out;\n }\n\n function activeBezier(state: KeyframeLayerState): Bezier | null {\n const seg = state.selectedSegment;\n if (seg === null || seg < 1 || seg >= state.keys.length) return null;\n const d = state.drag;\n if (d?.kind === 'handle' && d.segment === seg) return d.bezier;\n return bezierOf(state.keys[seg]);\n }\n\n function handlePoints(state: KeyframeLayerState, bezier: Bezier, ctx: LayerCtx): [PlotPoint, PlotPoint] {\n const a = state.keys[state.selectedSegment! - 1];\n const b = state.keys[state.selectedSegment!];\n const at = (xf: number, yf: number) =>\n ctx.toPlot({ x: a.t + xf * (b.t - a.t), y: a.value + yf * (b.value - a.value) });\n return [at(bezier[0], bezier[1]), at(bezier[2], bezier[3])];\n }\n\n const path = (pts: readonly PlotPoint[]): string =>\n pts.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x.toFixed(2)},${p.y.toFixed(2)}`).join('');\n\n // ── render ──────────────────────────────────────────────────────────\n function render(state: KeyframeLayerState, ctx: LayerRenderCtx): ReactNode {\n const shown = state.drag?.kind === 'key' ? applyKeyframeDrag(state).keys : state.keys;\n const segments = segmentSamples(state, shown, ctx);\n const curve = segments.flatMap((pts, i) => (i === 0 ? pts : pts.slice(1)));\n const seg = state.selectedSegment;\n const bezier = activeBezier(state);\n const dragIndex = state.drag?.kind === 'key' ? state.drag.index : null;\n\n return (\n <>\n {seg !== null && seg >= 1 && seg < shown.length ? (() => {\n const x0 = ctx.toPlot({ x: shown[seg - 1].t, y: 0 }).x;\n const x1 = ctx.toPlot({ x: shown[seg].t, y: 0 }).x;\n return (\n <rect\n className={s.segmentBand}\n x={Math.min(x0, x1)}\n y={0}\n width={Math.abs(x1 - x0)}\n height={ctx.plotSize.height}\n />\n );\n })() : null}\n {curve.length > 1 ? <path data-curve-element=\"curve\" className={s.curve} d={path(curve)} /> : null}\n {segments.map((pts, i) => (\n <path\n key={`seg-${i + 1}`}\n className={s.segmentTarget}\n d={path(pts)}\n role=\"button\"\n tabIndex={0}\n aria-label={`${label} segment into ${formatX(shown[i + 1].t)}`}\n aria-current={seg === i + 1 ? 'true' : undefined}\n data-segment-index={i + 1}\n />\n ))}\n {bezier ? (() => {\n const [h1, h2] = handlePoints(state, bezier, ctx);\n const a = ctx.toPlot({ x: state.keys[seg! - 1].t, y: state.keys[seg! - 1].value });\n const b = ctx.toPlot({ x: state.keys[seg!].t, y: state.keys[seg!].value });\n return (\n <>\n <line className={s.handleStem} x1={a.x} y1={a.y} x2={h1.x} y2={h1.y} />\n <line className={s.handleStem} x1={b.x} y1={b.y} x2={h2.x} y2={h2.y} />\n {[h1, h2].map((h, i) => (\n <circle\n key={`handle-${i}`}\n className={s.handle}\n cx={h.x}\n cy={h.y}\n r={HANDLE_RADIUS}\n role=\"button\"\n tabIndex={0}\n aria-label={`${label} bezier handle ${i + 1}`}\n data-handle-index={i}\n />\n ))}\n </>\n );\n })() : null}\n {state.keys.map((k, i) => {\n const p = ctx.toPlot({ x: k.t, y: k.value });\n return (\n <rect\n key={`key-${i}`}\n className={s.keyframe}\n x={p.x - KEY_HALF}\n y={p.y - KEY_HALF}\n width={KEY_HALF * 2}\n height={KEY_HALF * 2}\n transform={`rotate(45 ${p.x} ${p.y})`}\n role=\"button\"\n tabIndex={0}\n aria-label={`${label} key at ${formatX(k.t)}`}\n aria-current={state.selectedKey === i ? 'true' : undefined}\n data-keyframe-index={i}\n data-dragging={dragIndex === i ? 'true' : undefined}\n />\n );\n })}\n {state.drag?.kind === 'key' ? (() => {\n const p = ctx.toPlot({ x: state.drag.t, y: state.drag.value });\n return (\n <rect\n aria-hidden=\"true\"\n className={s.keyframeGhost}\n x={p.x - KEY_HALF}\n y={p.y - KEY_HALF}\n width={KEY_HALF * 2}\n height={KEY_HALF * 2}\n transform={`rotate(45 ${p.x} ${p.y})`}\n data-keyframe-ghost=\"\"\n />\n );\n })() : null}\n </>\n );\n }\n\n // ── hit test ────────────────────────────────────────────────────────\n function hitTest(state: KeyframeLayerState, plot: PlotPoint, ctx: LayerCtx): LayerHit | null {\n const bezier = activeBezier(state);\n if (bezier) {\n const h = hitTestAnchor(handlePoints(state, bezier, ctx), plot, HANDLE_HIT_PX);\n if (h) return { kind: 'handle', payload: { handle: h.index } };\n }\n const k = hitTestAnchor(state.keys.map((key) => ctx.toPlot({ x: key.t, y: key.value })), plot, KEY_HIT_PX);\n if (k) return { kind: 'key', payload: { index: k.index } };\n const c = hitTestCurve(segmentSamples(state, state.keys, ctx), plot, CURVE_HIT_PX);\n if (c) return { kind: 'segment', payload: { segment: c.segIdx + 1 } };\n return null;\n }\n\n // ── gestures ────────────────────────────────────────────────────────\n function keyGesture(index: number): LayerGesture<KeyframeLayerState> {\n return {\n onMove(state, model, e, ctx) {\n let t = clampTo(model.x, cfg.xClamp);\n if (cfg.snapX && !e.altKey) {\n const perPx = (ctx.modelRange.xMax - ctx.modelRange.xMin) / ctx.plotSize.width;\n t = clampTo(snapToNearest(t, cfg.snapX, Math.abs(perPx) * snapRadiusPx), cfg.xClamp);\n }\n return { ...state, drag: { kind: 'key', index, t, value: clampTo(model.y, cfg.yClamp) } };\n },\n onCommit(state) { return { ...state, ...applyKeyframeDrag(state), drag: null }; },\n onCancel(state) { return { ...state, drag: null }; },\n };\n }\n\n function handleGesture(segment: number, handle: 0 | 1): LayerGesture<KeyframeLayerState> {\n return {\n onMove(state, model) {\n const a = state.keys[segment - 1];\n const b = state.keys[segment];\n const d = state.drag;\n if (!a || !b || d?.kind !== 'handle') return state;\n const xf = b.t === a.t ? 0 : Math.min(1, Math.max(0, (model.x - a.t) / (b.t - a.t)));\n const yf = b.value === a.value ? 0 : (model.y - a.value) / (b.value - a.value);\n const bezier = [...d.bezier] as [number, number, number, number];\n bezier[handle * 2] = xf;\n bezier[handle * 2 + 1] = yf;\n return { ...state, drag: { kind: 'handle', segment, bezier } };\n },\n onCommit(state) { return { ...state, ...applyKeyframeDrag(state), drag: null }; },\n onCancel(state) { return { ...state, drag: null }; },\n };\n }\n\n function onPointerDown(\n state: KeyframeLayerState,\n hit: LayerHit,\n e: PointerEvent,\n _ctx: LayerCtx,\n extra: EmptyDownArgs<KeyframeLayerState>,\n ): LayerGesture<KeyframeLayerState> | void {\n if (e.button !== 0) return;\n if (hit.kind === 'handle') {\n const bezier = activeBezier(state);\n const segment = state.selectedSegment;\n if (!bezier || segment === null) return;\n const { handle } = hit.payload as { handle: 0 | 1 };\n extra.commit({ ...state, drag: { kind: 'handle', segment, bezier } });\n return handleGesture(segment, handle);\n }\n if (hit.kind === 'key') {\n const { index } = hit.payload as { index: number };\n const k = state.keys[index];\n extra.commit({ ...state, selectedKey: index, drag: { kind: 'key', index, t: k.t, value: k.value } });\n return keyGesture(index);\n }\n if (hit.kind === 'segment') {\n const { segment } = hit.payload as { segment: number };\n extra.commit({ ...state, selectedSegment: segment });\n }\n }\n\n // ── keyboard ────────────────────────────────────────────────────────\n function onKeyDown(\n state: KeyframeLayerState,\n e: KeyboardEvent,\n ctx: LayerCtx,\n extra: KeyDownArgs<KeyframeLayerState>,\n ): void {\n const target = e.target as Element | null;\n if (target?.closest?.('[data-layer-id]')?.getAttribute('data-layer-id') !== id) return;\n const activate = e.key === 'Enter' || e.key === ' ';\n const dx = e.key === 'ArrowRight' ? 1 : e.key === 'ArrowLeft' ? -1 : 0;\n const dy = e.key === 'ArrowUp' ? 1 : e.key === 'ArrowDown' ? -1 : 0;\n const mult = e.shiftKey ? SHIFT_MULTIPLIER : 1;\n\n const keyEl = target.closest('[data-keyframe-index]');\n if (keyEl) {\n const index = Number(keyEl.getAttribute('data-keyframe-index'));\n const k = state.keys[index];\n if (!k) return;\n if (activate) {\n e.preventDefault();\n extra.commit({ ...state, selectedKey: index });\n return;\n }\n if (dx === 0 && dy === 0) return;\n e.preventDefault();\n const m = ctx.modelRange;\n const stepX = (cfg.step?.x ?? Math.abs(m.xMax - m.xMin) / 100) * mult;\n const stepY = (cfg.step?.y ?? Math.abs(m.yMax - m.yMin) / 100) * mult;\n const t = clampTo(k.t + dx * stepX, cfg.xClamp);\n const value = clampTo(k.value + dy * stepY, cfg.yClamp);\n if (t === k.t && value === k.value) return;\n extra.commit({ ...state, ...moveKeyTo(state.keys, index, t, value), drag: null });\n return;\n }\n\n const segEl = target.closest('[data-segment-index]');\n if (segEl && activate) {\n e.preventDefault();\n extra.commit({ ...state, selectedSegment: Number(segEl.getAttribute('data-segment-index')) });\n return;\n }\n\n const handleEl = target.closest('[data-handle-index]');\n const bezier = activeBezier(state);\n if (handleEl && bezier && state.selectedSegment !== null && (dx !== 0 || dy !== 0)) {\n e.preventDefault();\n const h = Number(handleEl.getAttribute('data-handle-index'));\n const next = [...bezier] as [number, number, number, number];\n next[h * 2] = Math.min(1, Math.max(0, next[h * 2] + dx * HANDLE_STEP * mult));\n next[h * 2 + 1] += dy * HANDLE_STEP * mult;\n const drag: KeyframeDrag = { kind: 'handle', segment: state.selectedSegment, bezier: next };\n extra.commit({ ...state, ...applyKeyframeDrag({ ...state, drag }), drag: null });\n }\n }\n\n return { id, render, hitTest, onPointerDown, onKeyDown };\n}\n"],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ function n() {
|
|
|
9
9
|
try {
|
|
10
10
|
for (let t of e) {
|
|
11
11
|
let e = localStorage.getItem(t);
|
|
12
|
-
if (
|
|
12
|
+
if (e != null && e !== "") return e === "1" || e === "true" || e === "*" ? {
|
|
13
13
|
all: !0,
|
|
14
14
|
set: /* @__PURE__ */ new Set()
|
|
15
15
|
} : {
|
|
@@ -35,4 +35,4 @@ function a(e, ...t) {
|
|
|
35
35
|
//#endregion
|
|
36
36
|
export { i as n, a as t };
|
|
37
37
|
|
|
38
|
-
//# sourceMappingURL=dlog-
|
|
38
|
+
//# sourceMappingURL=dlog-F0I8KsIW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dlog-F0I8KsIW.js","names":["KEYS","cached","read","empty","k","v","get","isDebugEnabled","c","namespace","dlog","args"],"sources":["../../src/dlog.ts"],"sourcesContent":["/**\n * Namespaced, opt-in console tracing. Off by default; production builds\n * may strip the calls entirely depending on the bundler.\n *\n * Enable in the browser:\n *\n * localStorage.setItem('weasel.debug', '*') // all namespaces\n * localStorage.setItem('weasel.debug', 'curve-editor') // just curve editor\n * localStorage.setItem('weasel.debug', 'curve-editor,layer-stack')\n *\n * Each component picks a stable namespace and calls `dlog(namespace, ...)`.\n * Useful for tracing pointer/event flows that are hard to capture\n * post-hoc (drag handlers, gesture sequences, selection mutations).\n *\n * The flag is read once and cached for the page session — reload to\n * pick up changes. Cheap hot-path checks (one nullish-coalesce + Set\n * lookup) so leaving calls in place is fine.\n *\n * Mirrors `src/debug/flag.ts` in the kit. Two impls live here because\n * weasel-ui doesn't depend on the kit, but both read the same\n * localStorage keys so behavior is uniform. See the kit copy for the\n * canonical list of kit-level namespaces.\n *\n * Known weasel-ui namespaces:\n * - plot2d — Plot2D mount / unmount\n * - curve-editor — CurveEditor pointer flow\n */\n\nconst KEYS = ['weasel.debug', 'weaseldraw.debug'] as const;\n\ninterface Cached {\n all: boolean;\n set: Set<string>;\n}\n\nlet cached: Cached | null = null;\n\nfunction read(): Cached {\n const empty: Cached = { all: false, set: new Set() };\n if (typeof localStorage === 'undefined') return empty;\n try {\n for (const k of KEYS) {\n const v = localStorage.getItem(k);\n if (v == null || v === '') continue;\n if (v === '1' || v === 'true' || v === '*') return { all: true, set: new Set() };\n return { all: false, set: new Set(v.split(/[\\s,]+/).filter(Boolean)) };\n }\n return empty;\n } catch {\n return empty;\n }\n}\n\nfunction get(): Cached {\n if (cached === null) cached = read();\n return cached;\n}\n\n/** True when `namespace` (or `*`) is enabled. */\nexport function isDebugEnabled(namespace: string): boolean {\n const c = get();\n return c.all || c.set.has(namespace);\n}\n\n/** Conditional `console.debug` — no-op unless `namespace` (or `*`) is enabled.\n * Each call is prefixed with `[namespace]` so the source is searchable. */\nexport function dlog(namespace: string, ...args: unknown[]): void {\n if (!isDebugEnabled(namespace)) return;\n // eslint-disable-next-line no-console\n console.debug(`[${namespace}]`, ...args);\n}\n"],"mappings":";AA4BA,IAAMA,IAAO,CAAC,gBAAgB,kBAAkB,GAO5CC,IAAwB;AAE5B,SAASC,IAAe;CACtB,IAAMC,IAAgB;EAAE,KAAK;EAAO,qBAAK,IAAI,IAAI;CAAE;CACnD,IAAI,OAAO,eAAiB,KAAa,OAAOA;CAChD,IAAI;EACF,KAAK,IAAMC,KAAKJ,GAAM;GACpB,IAAMK,IAAI,aAAa,QAAQD,CAAC;GAChC,IAAIC,KAAK,QAAQA,MAAM,IAEvB,OADIA,MAAM,OAAOA,MAAM,UAAUA,MAAM,MAAY;IAAE,KAAK;IAAM,qBAAK,IAAI,IAAI;GAAE,IACxE;IAAE,KAAK;IAAO,KAAK,IAAI,IAAIA,EAAE,MAAM,QAAQ,CAAC,CAAC,OAAO,OAAO,CAAC;GAAE;EACvE;EACA,OAAOF;CACT,QAAQ;EACN,OAAOA;CACT;AACF;AAEA,SAASG,IAAc;CAErB,OADIL,MAAW,SAAM,IAASC,EAAK,IAC5BD;AACT;AAGA,SAAgBM,EAAe,GAA4B;CACzD,IAAMC,IAAIF,EAAI;CACd,OAAOE,EAAE,OAAOA,EAAE,IAAI,IAAIC,CAAS;AACrC;AAIA,SAAgBC,EAAK,GAAmB,GAAGC,GAAuB;CAChE,AAAKJ,EAAeE,CAAS,KAE7B,QAAQ,MAAM,IAAIA,EAAU,IAAI,GAAGE,CAAI;AACzC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { t as e } from "./keyGlyph-C0qTakG-.js";
|
|
2
|
+
//#region src/components/ToolPalette/formatShortcut.ts
|
|
3
|
+
function t(t) {
|
|
4
|
+
if (!t) return;
|
|
5
|
+
let n = Array.isArray(t.key) ? t.key[0] : t.key, r = [];
|
|
6
|
+
return t.mod && r.push("⌘"), t.shift === !0 && r.push("⇧"), t.alt && r.push("⌥"), r.push(e(n)), r;
|
|
7
|
+
}
|
|
8
|
+
function n(e) {
|
|
9
|
+
let n = t(e);
|
|
10
|
+
return n ? n.join("") : void 0;
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
export { t as n, n as t };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=formatShortcut-DRQrVThu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatShortcut-DRQrVThu.js","names":["keyGlyph","formatShortcutParts","b","rawKey","parts","formatShortcut"],"sources":["../../src/components/ToolPalette/formatShortcut.ts"],"sourcesContent":["import { keyGlyph } from '../Keycaps/keyGlyph';\n\nexport interface ShortcutInput {\n key: string | readonly string[];\n mod?: boolean;\n alt?: boolean;\n shift?: boolean | 'optional';\n}\n\n/** Format a shortcut as an array of display chips, one per key — modifier\n * icons (⌘, ↑, ⌥) followed by the key glyph. UIs that want a boxed\n * per-key look render each chip in its own element. `shift: 'optional'` is\n * treated as falsy. */\nexport function formatShortcutParts(b: ShortcutInput | undefined): readonly string[] | undefined {\n if (!b) return undefined;\n const rawKey = Array.isArray(b.key) ? b.key[0] : (b.key as string);\n const parts: string[] = [];\n if (b.mod) parts.push('⌘');\n if (b.shift === true) parts.push('⇧');\n if (b.alt) parts.push('⌥');\n parts.push(keyGlyph(rawKey));\n return parts;\n}\n\n/** Format a shortcut as a single display string. Order: mod, shift, alt,\n * key. Returns `undefined` for `undefined` input so callers can `??` a\n * fallback. When `key` is an array, the first element is used. `shift: 'optional'`\n * is treated as falsy. */\nexport function formatShortcut(b: ShortcutInput | undefined): string | undefined {\n const parts = formatShortcutParts(b);\n return parts ? parts.join('') : undefined;\n}\n"],"mappings":";;AAaA,SAAgBC,EAAoB,GAA6D;CAC/F,IAAI,CAACC,GAAG;CACR,IAAMC,IAAS,MAAM,QAAQD,EAAE,GAAG,IAAIA,EAAE,IAAI,KAAMA,EAAE,KAC9CE,IAAkB,CAAC;CAKzB,OAJIF,EAAE,OAAKE,EAAM,KAAK,GAAG,GACrBF,EAAE,UAAU,MAAME,EAAM,KAAK,GAAG,GAChCF,EAAE,OAAKE,EAAM,KAAK,GAAG,GACzBA,EAAM,KAAKJ,EAASG,CAAM,CAAC,GACpBC;AACT;AAMA,SAAgBC,EAAe,GAAkD;CAC/E,IAAMD,IAAQH,EAAoBC,CAAC;CACnC,OAAOE,IAAQA,EAAM,KAAK,EAAE,IAAI,KAAA;AAClC"}
|