@weasel-js/labkit 1.4.4 → 1.5.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/README.md +54 -6
- package/dist/_dts/{CanvasStackContext-kTEZvEgE.d.ts → CanvasStackContext-CJNMS6mz.d.ts} +1 -1
- package/dist/_dts/{PrefsForm.d-DDHFANkc.d.ts → PrefsForm.d-DPy9I8It.d.ts} +4 -0
- package/dist/_dts/Select.d-Gwr8fLpK.d.ts +453 -0
- package/dist/_dts/{frac-z7ker2Vx.d.ts → frac-B4okC2lX.d.ts} +291 -31
- package/dist/_dts/{index-Blv9uQzu.d.ts → index-BNdz-tNd.d.ts} +105 -17
- package/dist/_dts/index-CSJoj4LC.d.ts +248 -0
- package/dist/_dts/{types-B9_zrHmb.d.ts → types-DzoNY1pO.d.ts} +91 -4
- package/dist/_dts/usePanZoom-Pzf9f2jh.d.ts +160 -0
- package/dist/_dts/useTrialState-uLlmaccn.d.ts +212 -0
- package/dist/canvas/index.d.ts +18 -129
- package/dist/canvas/index.js +4 -2
- package/dist/chrome/index.d.ts +5 -93
- package/dist/chrome/index.js +10 -6
- package/dist/chunk-7PFH3CNM.js +150 -0
- package/dist/chunk-7PFH3CNM.js.map +1 -0
- package/dist/{chunk-I6JCVE24.js → chunk-CEIUBPPW.js} +143 -17
- package/dist/chunk-CEIUBPPW.js.map +1 -0
- package/dist/chunk-EH7UEQV7.js +590 -0
- package/dist/chunk-EH7UEQV7.js.map +1 -0
- package/dist/{chunk-MOM3GOVY.js → chunk-EHGVROVV.js} +125 -27
- package/dist/chunk-EHGVROVV.js.map +1 -0
- package/dist/{chunk-TJ7QY3OC.js → chunk-ERFMC6WU.js} +160 -78
- package/dist/chunk-ERFMC6WU.js.map +1 -0
- package/dist/{chunk-CTRKTLYZ.js → chunk-H6ZAOWNE.js} +11 -11
- package/dist/chunk-H6ZAOWNE.js.map +1 -0
- package/dist/{chunk-64ZCN3DA.js → chunk-IHUVQ3TX.js} +250 -160
- package/dist/chunk-IHUVQ3TX.js.map +1 -0
- package/dist/{chunk-FQMJUVHJ.js → chunk-IJJUK4FU.js} +53 -46
- package/dist/chunk-IJJUK4FU.js.map +1 -0
- package/dist/chunk-IXTQI7JX.js +737 -0
- package/dist/chunk-IXTQI7JX.js.map +1 -0
- package/dist/{chunk-BKFVHKJH.js → chunk-MDVTK5U3.js} +4 -4
- package/dist/{chunk-BKFVHKJH.js.map → chunk-MDVTK5U3.js.map} +1 -1
- package/dist/chunk-PHK4W562.js +72 -0
- package/dist/chunk-PHK4W562.js.map +1 -0
- package/dist/chunk-PJ7WEQBJ.js +18 -0
- package/dist/chunk-PJ7WEQBJ.js.map +1 -0
- package/dist/chunk-RWNDDKOH.js +682 -0
- package/dist/chunk-RWNDDKOH.js.map +1 -0
- package/dist/chunk-T3EC2DXD.js +12628 -0
- package/dist/chunk-T3EC2DXD.js.map +1 -0
- package/dist/{chunk-SMHP6XZ4.js → chunk-UN4U4P63.js} +10 -8
- package/dist/chunk-UN4U4P63.js.map +1 -0
- package/dist/chunk-WIG6XHJ7.js +35 -0
- package/dist/chunk-WIG6XHJ7.js.map +1 -0
- package/dist/chunk-Z76KEZAX.js +15 -0
- package/dist/chunk-Z76KEZAX.js.map +1 -0
- package/dist/chunk-ZDHY47EV.js +363 -0
- package/dist/chunk-ZDHY47EV.js.map +1 -0
- package/dist/config/index.d.ts +276 -0
- package/dist/config/index.js +8 -0
- package/dist/config/index.js.map +1 -0
- package/dist/controls/index.d.ts +3 -4
- package/dist/controls/index.js +4 -3
- package/dist/dragdrop/index.d.ts +3 -5
- package/dist/index.d.ts +266 -413
- package/dist/index.js +1775 -2251
- package/dist/index.js.map +1 -1
- package/dist/layers/index.d.ts +4 -6
- package/dist/layers/index.js +2 -2
- package/dist/loupe/index.d.ts +69 -20
- package/dist/loupe/index.js +2 -2
- package/dist/passthrough/weasel-ui.d.ts +175 -309
- package/dist/passthrough/weasel-ui.js +1 -1
- package/dist/primitives/index.d.ts +55 -6
- package/dist/primitives/index.js +6 -4
- package/dist/state/index.d.ts +13 -8
- package/dist/state/index.js +18 -13
- package/dist/state/index.js.map +1 -1
- package/dist/styles.css +223 -76
- package/dist/surface/index.d.ts +44 -7
- package/dist/surface/index.js +2 -1
- package/dist/ui/layers/index.js +1 -1
- package/dist/undo/index.d.ts +3 -5
- package/package.json +15 -8
- package/src/annotations/AnnotationOverlay.tsx +56 -5
- package/src/annotations/Annotations.less +4 -0
- package/src/annotations/Annotations.overlay.test.tsx +105 -6
- package/src/annotations/drawOne.test.ts +1 -1
- package/src/annotations/drawOne.ts +2 -2
- package/src/annotations/paint.test.ts +2 -2
- package/src/annotations/paint.ts +1 -1
- package/src/annotations/preload.ts +6 -0
- package/src/annotations/store.test.ts +18 -0
- package/src/annotations/store.ts +5 -4
- package/src/annotations/svgNodes.test.ts +2 -2
- package/src/annotations/svgNodes.ts +1 -0
- package/src/annotations/toolMap.test.ts +9 -5
- package/src/annotations/toolMap.ts +6 -3
- package/src/annotations/types.ts +6 -3
- package/src/canvas/CameraWheelContext.ts +12 -0
- package/src/canvas/CanvasStack.stories.tsx +1 -1
- package/src/canvas/CanvasStack.test.tsx +25 -0
- package/src/canvas/CanvasStack.tsx +31 -4
- package/src/canvas/Stage.less +18 -0
- package/src/canvas/Stage.test.tsx +186 -0
- package/src/canvas/Stage.tsx +134 -0
- package/src/canvas/camera.test.ts +17 -2
- package/src/canvas/camera.ts +9 -9
- package/src/canvas/index.ts +4 -0
- package/src/canvas/usePanZoom.test.ts +28 -0
- package/src/canvas/usePanZoom.ts +21 -9
- package/src/chrome/ChromeRegions.stories.tsx +1 -4
- package/src/chrome/LabChrome.tsx +130 -0
- package/src/chrome/builtins.test.ts +1 -0
- package/src/chrome/builtins.tsx +21 -31
- package/src/chrome/index.ts +16 -0
- package/src/chrome/labRegions.test.tsx +208 -0
- package/src/chrome/labTypes.ts +50 -0
- package/src/chrome/merge.ts +7 -9
- package/src/chrome/regions/PaletteRegion.test.tsx +6 -4
- package/src/chrome/regions/PaletteRegion.tsx +16 -9
- package/src/chrome/regions/SidebarRegion.stories.tsx +44 -0
- package/src/chrome/regions/SidebarRegion.tsx +25 -13
- package/src/chrome/regions/StatusRegion.tsx +15 -8
- package/src/chrome/regions/ToolbarRegion.tsx +34 -16
- package/src/chrome/types.ts +50 -20
- package/src/config/auto.test.ts +12 -0
- package/src/config/auto.ts +15 -0
- package/src/config/autoConfig.test.ts +107 -0
- package/src/config/autoConfig.ts +153 -0
- package/src/config/builder.test.ts +42 -0
- package/src/config/builder.ts +68 -17
- package/src/config/declarationEmit.fixture.ts +11 -0
- package/src/config/declarationEmit.test.ts +51 -0
- package/src/config/entry.test.ts +46 -0
- package/src/config/index.ts +16 -1
- package/src/config/nodeClasses.test.ts +18 -0
- package/src/config/path.ts +7 -2
- package/src/config/resolve.test.ts +25 -0
- package/src/config/resolve.ts +17 -1
- package/src/config/types.ts +34 -2
- package/src/config/useResolvedConfig.ts +26 -0
- package/src/controls/AutoControls.stories.tsx +88 -0
- package/src/controls/ControlPanel.stories.tsx +42 -1
- package/src/controls/ControlPanel.test.tsx +530 -4
- package/src/controls/ControlPanel.tsx +562 -82
- package/src/fake-indexeddb-auto.d.ts +5 -0
- package/src/index.test.ts +7 -0
- package/src/index.ts +66 -5
- package/src/instrument/serializers.test.ts +22 -0
- package/src/instrument/serializers.ts +40 -1
- package/src/instrument/types.ts +25 -1
- package/src/lab/Lab.chrome.test.tsx +16 -0
- package/src/lab/Lab.less +4 -13
- package/src/lab/Lab.persist.test.tsx +147 -0
- package/src/lab/Lab.stories.tsx +1 -3
- package/src/lab/Lab.surface.test.tsx +71 -3
- package/src/lab/Lab.test.tsx +168 -16
- package/src/lab/Lab.tsx +434 -129
- package/src/lab/LabContext.ts +8 -0
- package/src/lab/LabFit.stories.less +18 -0
- package/src/lab/LabFit.stories.tsx +219 -0
- package/src/lab/LabFullChrome.stories.tsx +1 -4
- package/src/lab/LabHeader.test.tsx +40 -9
- package/src/lab/LabHeader.tsx +7 -14
- package/src/lab/LabPalette.tsx +13 -26
- package/src/lab/LabRoot.test.tsx +56 -0
- package/src/lab/LabRoot.tsx +47 -0
- package/src/lab/LabShell.less +73 -15
- package/src/lab/LabShell.stories.tsx +50 -1
- package/src/lab/LabShell.tsx +18 -27
- package/src/lab/LabSwitcher.less +18 -11
- package/src/lab/LabSwitcher.test.tsx +14 -9
- package/src/lab/LabSwitcher.tsx +8 -4
- package/src/lab/Workspace.less +1 -1
- package/src/lab/Workspace.stories.tsx +1 -1
- package/src/lab/Workspace.surface.test.tsx +1 -0
- package/src/lab/fitCheck.test.ts +57 -0
- package/src/lab/fitCheck.ts +125 -0
- package/src/lab/index.ts +2 -0
- package/src/layers/LayerList.stories.tsx +1 -1
- package/src/loupe/AGENTS.md +17 -5
- package/src/loupe/Loupe.less +1 -1
- package/src/loupe/LoupeGestures.tsx +67 -0
- package/src/loupe/TrialLoupe.tsx +43 -28
- package/src/loupe/canvasLens.ts +1 -1
- package/src/loupe/index.ts +4 -0
- package/src/loupe/loupeActions.ts +98 -0
- package/src/loupe/types.ts +1 -1
- package/src/loupe/useLoupe.test.tsx +60 -3
- package/src/loupe/useLoupe.ts +29 -49
- package/src/passthrough/weasel-ui.ts +9 -0
- package/src/primitives/FloatingPanel.stories.tsx +14 -2
- package/src/primitives/FloatingPanel.test.tsx +47 -16
- package/src/primitives/FloatingPanel.tsx +11 -25
- package/src/primitives/FpsMeter.stories.tsx +1 -1
- package/src/primitives/JobProgress.stories.tsx +1 -1
- package/src/primitives/Legend.stories.tsx +1 -1
- package/src/primitives/ScaleIndicator.stories.tsx +1 -1
- package/src/primitives/Sidebar.less +7 -0
- package/src/primitives/Sidebar.stories.tsx +1 -1
- package/src/primitives/Split.less +14 -0
- package/src/primitives/Split.test.tsx +133 -0
- package/src/primitives/Split.tsx +175 -0
- package/src/primitives/StatusBar.stories.tsx +1 -1
- package/src/primitives/Toolbar.stories.tsx +1 -1
- package/src/primitives/ZoomControl.tsx +5 -2
- package/src/primitives/index.ts +2 -0
- package/src/specimen/Specimen.less +95 -0
- package/src/specimen/Specimen.stories.tsx +13 -0
- package/src/specimen/Specimen.test.tsx +13 -0
- package/src/specimen/Specimen.tsx +888 -0
- package/src/state/Persistence.stories.tsx +75 -0
- package/src/state/Persistence.tsx +33 -0
- package/src/state/SingletonExperiment.test.tsx +47 -53
- package/src/state/SingletonExperiment.tsx +24 -13
- package/src/state/adapterContract.ts +116 -0
- package/src/state/adapters.test.ts +113 -61
- package/src/state/adapters.ts +328 -69
- package/src/state/document.test.ts +71 -96
- package/src/state/document.ts +66 -52
- package/src/state/helpers.test.ts +1 -1
- package/src/state/index.ts +8 -0
- package/src/state/labRecords.test.ts +105 -0
- package/src/state/labRecords.ts +160 -0
- package/src/state/openLabStore.test.ts +658 -0
- package/src/state/openLabStore.ts +403 -0
- package/src/state/records.test.ts +234 -0
- package/src/state/records.ts +219 -0
- package/src/state/store.test.ts +169 -635
- package/src/state/store.ts +146 -163
- package/src/state/toolSlot.test.ts +1 -1
- package/src/state/types.ts +65 -17
- package/src/state/useOpenOnce.ts +68 -0
- package/src/state/usePersistedState.test.tsx +125 -0
- package/src/state/usePersistedState.ts +66 -0
- package/src/state/useTrialState.test.tsx +87 -3
- package/src/state/useTrialState.ts +9 -1
- package/src/state/view.test.ts +49 -15
- package/src/state/view.ts +18 -1
- package/src/styles.less +3 -0
- package/src/surface/AGENTS.md +39 -7
- package/src/surface/SurfaceContext.ts +26 -3
- package/src/surface/index.ts +2 -0
- package/src/surface/useSurfaceTile.test.tsx +1 -0
- package/src/surface/useSurfaceTile.ts +6 -5
- package/src/surface/useTiledSurface.test.tsx +231 -1
- package/src/surface/useTiledSurface.ts +76 -15
- package/src/theme/Interstellar.stories.tsx +9 -9
- package/src/theme/interstellar.test.ts +17 -6
- package/src/theme/interstellar.theme.json +180 -0
- package/src/theme/interstellar.ts +8 -5
- package/src/tools/labTool.ts +11 -0
- package/src/trial/Trial.annotations.persist.test.tsx +100 -58
- package/src/trial/Trial.annotations.test.tsx +59 -7
- package/src/trial/Trial.canvas.test.tsx +32 -0
- package/src/trial/Trial.config.test.tsx +75 -2
- package/src/trial/Trial.job.test.tsx +3 -3
- package/src/trial/Trial.less +5 -26
- package/src/trial/Trial.stories.tsx +5 -3
- package/src/trial/Trial.test.tsx +31 -4
- package/src/trial/Trial.trialId.test.tsx +23 -1
- package/src/trial/Trial.tsx +139 -52
- package/src/trial/TrialBody.tsx +17 -141
- package/src/trial/TrialChrome.tsx +24 -7
- package/src/trial/trialOps.test.ts +101 -1
- package/src/trial/trialOps.ts +67 -7
- package/dist/_dts/types-BP2OCcpg.d.ts +0 -155
- package/dist/_dts/types-x92Kfeme.d.ts +0 -62
- package/dist/_dts/useTrialState-D6Vb3T-g.d.ts +0 -99
- package/dist/chunk-2P6PP5N4.js +0 -553
- package/dist/chunk-2P6PP5N4.js.map +0 -1
- package/dist/chunk-64ZCN3DA.js.map +0 -1
- package/dist/chunk-CTRKTLYZ.js.map +0 -1
- package/dist/chunk-E44SU6XS.js +0 -50
- package/dist/chunk-E44SU6XS.js.map +0 -1
- package/dist/chunk-FQMJUVHJ.js.map +0 -1
- package/dist/chunk-I6JCVE24.js.map +0 -1
- package/dist/chunk-MOM3GOVY.js.map +0 -1
- package/dist/chunk-SMHP6XZ4.js.map +0 -1
- package/dist/chunk-TJ7QY3OC.js.map +0 -1
- package/dist/chunk-U3IYHIAE.js +0 -343
- package/dist/chunk-U3IYHIAE.js.map +0 -1
- package/dist/chunk-W3ECWC2K.js +0 -7335
- package/dist/chunk-W3ECWC2K.js.map +0 -1
- package/src/theme/interstellar.tokens.json +0 -61
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../ui/src/dlog.ts","../../ui/src/icons/paths.ts","../../ui/src/icons/Icon.tsx","../../ui/src/icons/index.tsx","../../ui/src/useRovingTabIndex.ts","../../ui/src/components/ToggleBar/ToggleBar.tsx","../../ui/src/format/number.ts","../../ui/src/components/Slider/Slider.tsx","../../ui/dist/chunks/range.module-DSsOIq1R.js","../../ui/src/components/InlineRange/InlineRange.tsx","../../ui/src/components/ColorField/ColorField.tsx","../../ui/src/paintGradientTrack.tsx","../../ui/src/components/GradientEditor/GradientEditor.tsx","../../ui/src/components/Checkbox/Checkbox.tsx","../../ui/src/components/Field/Field.tsx","../../ui/src/overlays/portalHost.tsx","../../ui/src/components/Select/Select.tsx","../../ui/src/components/Input/Input.tsx","../../ui/src/components/NumberField/NumberField.tsx","../../ui/src/components/NumberField/UnitField.tsx","../../ui/src/components/RadioGroup/RadioGroup.tsx","../../ui/src/components/RangeSlider/RangeSlider.tsx","../../ui/src/components/Switch/Switch.tsx","../../ui/src/components/Prefs/schema.ts","../../ui/src/components/Dialog/Dialog.tsx","../../ui/src/components/Tooltip/Tooltip.tsx","../../ui/src/components/ActionBar/ActionBar.tsx","../../ui/src/components/Badge/shapes/Pill.tsx","../../ui/src/components/Badge/shapes/Plain.tsx","../../ui/src/components/Badge/shapes/Square.tsx","../../ui/src/components/Badge/shapes/Notched.tsx","../../ui/src/components/Badge/useSvgBox.ts","../../ui/src/components/Badge/shapes/Perforated.tsx","../../ui/src/components/Badge/shapes/Hexagon.tsx","../../ui/src/components/Badge/shapes/Starburst.tsx","../../ui/src/components/Badge/shapes/Scalloped.tsx","../../ui/src/components/Badge/shapes/Shield.tsx","../../ui/src/components/Badge/shapes/Ribbon.tsx","../../ui/src/components/Badge/shapes/Beavis.tsx","../../ui/src/components/Badge/shapes/Sparkler.tsx","../../ui/src/components/Badge/shapes/Postage.tsx","../../ui/src/components/Badge/shapes/Cloud.tsx","../../ui/src/components/Badge/shapes/House.tsx","../../ui/src/components/Badge/shapes/Plaque.tsx","../../ui/src/components/Badge/shapes/Crest.tsx","../../ui/src/components/Badge/shapes/Urn.tsx","../../ui/src/components/Badge/shapes/Coffin.tsx","../../ui/src/components/Badge/shapes/Receipt.tsx","../../ui/src/components/Badge/shapes/Wood.tsx","../../ui/src/components/Badge/shapes/Quatrefoil.tsx","../../ui/src/components/Badge/shapes/index.ts","../../ui/src/components/Badge/bases/ChamferedRect.tsx","../../ui/src/components/Badge/bases/RoundedRect.tsx","../../ui/src/components/Badge/bases/polygonSampler.ts","../../ui/src/components/Badge/bases/Polygon.tsx","../../ui/src/components/Badge/bases/Puzzle.tsx","../../ui/src/components/Badge/bases/Quatrefoil.tsx","../../ui/src/components/Badge/bases/OctantSpline.tsx","../../ui/src/components/Badge/bases/OctantBSpline.tsx","../../ui/src/components/Badge/bases/Ribbon.tsx","../../ui/src/components/Badge/bases/edgeProfiles.ts","../../ui/src/components/Badge/bases/Powerline.tsx","../../ui/src/components/Badge/bases/index.ts","../../ui/src/components/Badge/effects/rangeMask.ts","../../ui/src/components/Badge/effects/Spikes.tsx","../../ui/src/components/Badge/effects/Puffs.tsx","../../ui/src/components/Badge/effects/Bites.tsx","../../ui/src/components/Badge/effects/Scallops.tsx","../../ui/src/components/Badge/effects/Bevel.tsx","../../ui/src/components/Badge/effects/Sheen.tsx","../../ui/src/components/Badge/effects/Rivets.tsx","../../ui/src/components/Badge/effects/Shadow.tsx","../../ui/src/components/Badge/effects/Woodgrain.tsx","../../ui/src/components/Badge/effects/Perforations.tsx","../../ui/src/components/Badge/effects/Bevel2.tsx","../../ui/src/components/Badge/effects/Outline.tsx","../../ui/src/components/Badge/effects/Sunbeams.tsx","../../ui/src/components/Badge/effects/Aqua.tsx","../../ui/src/components/Badge/effects/Metal.tsx","../../ui/src/components/Badge/effects/index.ts","../../ui/src/components/Badge/Badge.tsx","../../ui/src/components/Button/Button.tsx","../../ui/src/useReorderDragList.ts","../../ui/src/components/DataGrid/DataGrid.tsx","../../ui/src/components/Disclosure/Disclosure.tsx","../../ui/src/components/DragHandleGlyph/DragHandleGlyph.tsx","../../ui/src/components/Keycaps/Keycap.tsx","../../ui/src/components/Keycaps/Keycaps.tsx","../../ui/src/components/Keycaps/keySpecsFromMods.ts","../../ui/src/components/Keycaps/keyGlyph.ts","../../ui/src/components/LayerStack/LayerStack.tsx","../../ui/dist/chunks/segmentedControl.module-DmeUMYe3.js","../../ui/src/components/OptionsBar/OptionsBar.tsx","../../ui/src/components/ActionsBar/ActionsBar.tsx","../../ui/src/components/Powerline/Powerline.tsx","../../ui/src/components/Plot2D/geometry.ts","../../ui/src/components/Plot2D/ticks.ts","../../ui/src/components/Plot2D/Plot2D.tsx","../../ui/src/snap.ts","../../ui/src/components/CurveEditor/hitTest.ts","../../ui/src/handles.ts","../../ui/src/components/CurveEditor/LayeredCurveEditor.tsx","../../ui/src/components/CurveEditor/createKeyframeLayer.tsx","../../ui/src/components/CurveEditor/catmullRom.ts","../../ui/src/components/CurveEditor/monotone.ts","../../ui/src/components/CurveEditor/interpolation.ts","../../ui/src/components/CurveEditor/createFunctionLayer.tsx","../../ui/src/components/CurveEditor/CurveEditor.tsx","../../ui/src/components/Properties/CurveField.tsx","../../ui/src/components/Properties/PinDot.tsx","../../ui/src/components/Properties/PropertyPanel.tsx","../../ui/src/components/Properties/EffectCard.tsx","../../ui/src/components/Properties/PropertyGroup.tsx","../../ui/src/components/Sidebar/Sidebar.tsx","../../ui/src/components/SidebarPanel/SidebarPanel.tsx","../../ui/src/components/ToolButton/ToolButton.tsx","../../ui/src/components/ToolGroup/ToolGroup.tsx","../../modes/src/capabilities.ts","../../modes/src/modeDefinition.ts","../../modes/src/eligibility.ts","../../ui/src/components/ToolPalette/formatShortcut.ts","../../ui/src/components/ToolPalette/ToolPalette.tsx","../../ui/src/components/Tabs/Tabs.tsx","../../ui/src/components/MenuButton/MenuButton.tsx","../../ui/src/components/ComboBox/ComboBox.tsx","../../ui/src/components/Callout/Callout.tsx","../../ui/src/components/PointPlotter/PointPlotter.tsx","../../ui/src/components/TokenPanel/color.ts","../../ui/src/components/TokenPanel/tokenTypes.ts","../../ui/src/components/TokenPanel/TokenPanel.tsx","../../ui/src/components/Jog/Jog.tsx","../../ui/src/paintPreview.ts","../../ui/src/components/MeshEditor/MeshEditor.tsx","../../svg/src/types.ts","../../svg/src/transform.ts","../../svg/src/textAnchor.ts","../../svg/src/patterns.ts","../../svg/src/path-serializer.ts","../../svg/src/gradients.ts","../../svg/src/serialize.ts","../../ui/src/components/PatternPicker/PatternPicker.tsx","../../ui/src/components/PaintInput/PaintInput.tsx","../../ui/src/components/PaintField/PaintField.tsx","../../font/src/glyphReady.ts","../../font/src/fallback.ts","../../font/src/dynamic/shelfPack.ts","../../font/src/dynamic/distanceTransform.ts","../../font/src/dynamic/glyphRasterizer.ts","../../font/src/dynamic/dynamicAtlas.ts","../../font/src/outline/outlineRegistry.ts","../../font/src/registerFont.ts","../../ui/src/components/FontFamilySelect/FontFamilySelect.tsx","../../ui/src/components/paintValue.ts","../../ui/src/components/Prefs/PrefsForm.tsx","../../ui/src/components/ItemList/ItemList.tsx","../../ui/src/components/ToolOptionsBar/ToolOptionsBar.tsx","../../ui/src/components/ResizeHandle/ResizeHandle.tsx","../../ui/src/components/StatusBar/StatusBar.tsx","../../ui/src/components/DetentSlider/DetentSlider.tsx","../../ui/src/components/Toast/queue.ts","../../ui/src/components/Toast/Toast.tsx","../../ui/src/components/BandEditor/scale.ts","../../ui/src/components/BandEditor/bands.ts","../../ui/src/components/BandEditor/BandEditor.tsx","../../ui/src/components/Timeline/easingSpec.ts","../../ui/src/components/Timeline/EasingPicker.tsx","../../ui/src/components/Timeline/timeScale.ts","../../ui/src/components/Timeline/LaneGraph.tsx","../../ui/src/components/Timeline/Lane.tsx","../../ui/src/components/Timeline/Ruler.tsx","../../ui/src/components/Timeline/Transport.tsx","../../ui/src/components/Timeline/lanes.ts","../../ui/src/components/Timeline/keys.ts","../../ui/src/components/Timeline/Timeline.tsx","../../ui/src/color/oklch.ts","../../ui/src/useAsyncOptions.ts"],"names":["t","e","n","i","a","r","o","s","c","l","u","d","f","p","m","h","g","_","v","y","b","x","S","C","w","T","E","ee","D","O","k","A","j","M","N","P","F","I","L","R","z","B","V","H","U","W","G","K","q","J","Y","X","Z","Q","$","te","ne","ue","de","re","ie","ae","oe","se","ce","le","fe","pe","PATH_M","PATH_L","PATH_C","PATH_Q","PATH_Z","registry","escapeAttr","localName","resolveScreenLength","boundsOfPath","me","he","ge","Er","Tr","Dr","Or"],"mappings":"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","file":"chunk-T3EC2DXD.js","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","// GENERATED by scripts/gen-icons.mjs — do not edit by hand.\n// Every glyph is a 20x20 viewBox drawn in currentColor at stroke-width 1.5.\n\nexport const ICON_PATHS = {\n\n // View and lifecycle\n clone: `<path d=\"M7 7.4V4.6A1.6 1.6 0 0 1 8.6 3h6.8A1.6 1.6 0 0 1 17 4.6v6.8a1.6 1.6 0 0 1-1.6 1.6H12.6\" stroke-linecap=\"butt\"/><rect x=\"3\" y=\"7\" width=\"10\" height=\"10\" rx=\"1.6\"/><path d=\"M5.7 10.8h4.6M5.7 13.4h3\" stroke-width=\"1\"/>`,\n reset: `<path d=\"M7.28 4.88A5.8 5.8 0 1 0 12.72 4.88\"/><path d=\"M13.81 7.57 12.72 4.88 15.56 4.28\"/>`,\n close: `<path d=\"M5 5 15 15M15 5 5 15\" stroke-width=\"1.75\"/>`,\n export: `<path d=\"M4 12.6v2.9A1.5 1.5 0 0 0 5.5 17h9a1.5 1.5 0 0 0 1.5-1.5v-2.9\"/><path d=\"M10 3.2v8.5\"/><path d=\"M11.7 9.35 10 11.7 8.3 9.35\"/><path d=\"M6.8 14.7h6.4\" stroke-width=\"1\"/>`,\n zoomIn: `<circle cx=\"9\" cy=\"9\" r=\"5.4\"/><path d=\"M12.82 12.82 16.9 16.9\"/><path d=\"M9 6.7v4.6M6.7 9h4.6\"/>`,\n zoomOut: `<circle cx=\"9\" cy=\"9\" r=\"5.4\"/><path d=\"M12.82 12.82 16.9 16.9\"/><path d=\"M6.7 9h4.6\"/>`,\n fit: `<path d=\"M3.2 7.2V4.4A1.2 1.2 0 0 1 4.4 3.2h2.8M12.8 3.2h2.8A1.2 1.2 0 0 1 16.8 4.4v2.8M16.8 12.8v2.8a1.2 1.2 0 0 1-1.2 1.2h-2.8M7.2 16.8H4.4a1.2 1.2 0 0 1-1.2-1.2v-2.8\"/><rect x=\"7.4\" y=\"8.2\" width=\"5.2\" height=\"3.6\" rx=\"0.8\" stroke-width=\"1\"/>`,\n pan: `<path d=\"M10 8.1V3.2M10 11.9V16.8M8.1 10H3.2M11.9 10H16.8\"/><path d=\"M8.26 5.27 10 3.2 11.74 5.27M11.74 14.73 10 16.8 8.26 14.73M5.27 11.74 3.2 10 5.27 8.26M14.73 8.26 16.8 10 14.73 11.74\"/><circle cx=\"10\" cy=\"10\" r=\"1.9\"/>`,\n\n // Actions\n filter: `<path d=\"M3.4 4.6h13.2L11.8 11v5.4L8.2 14.8V11z\"/>`,\n add: `<path d=\"M10 4.9v10.2M4.9 10h10.2\"/>`,\n remove: `<path d=\"M4.9 10h10.2\"/>`,\n delete: `<path d=\"M3.6 5.8h12.8M8 5.8V4.5A1.1 1.1 0 0 1 9.1 3.4h1.8A1.1 1.1 0 0 1 12 4.5v1.3\"/><path d=\"M5.2 5.8v9.6A1.6 1.6 0 0 0 6.8 17h6.4a1.6 1.6 0 0 0 1.6-1.6V5.8\"/><path d=\"M8.4 8.8v5.2M11.6 8.8v5.2\" stroke-width=\"1\"/>`,\n sort: `<path d=\"M3.6 5.6h7.2M3.6 10h8.8M3.6 14.4h5\"/><path d=\"M15.3 5.4v9.4\"/><path d=\"M16.97 12.81 15.3 14.8 13.63 12.81\"/>`,\n undo: `<path d=\"M4.4 8.4h6.8a3.6 3.6 0 0 1 0 7.2H8.6\"/><path d=\"M6.47 10.14 4.4 8.4 6.47 6.66\"/>`,\n redo: `<path d=\"M15.6 8.4H8.8a3.6 3.6 0 0 0 0 7.2H11.4\"/><path d=\"M13.53 6.66 15.6 8.4 13.53 10.14\"/>`,\n snapshot: `<path d=\"M3.8 8.3A1.4 1.4 0 0 1 5.2 6.9h1.9L8 5.1h4l.9 1.8h1.9A1.4 1.4 0 0 1 16.2 8.3v6A1.4 1.4 0 0 1 14.8 15.7H5.2A1.4 1.4 0 0 1 3.8 14.3z\"/><circle cx=\"10\" cy=\"11\" r=\"2.75\"/>`,\n\n // Playback\n play: `<path d=\"M7.6 5.2 15.6 10 7.6 14.8Z\"/>`,\n pause: `<path d=\"M7.8 5.2v9.6M12.2 5.2v9.6\"/>`,\n stop: `<rect x=\"5.6\" y=\"5.6\" width=\"8.8\" height=\"8.8\" rx=\"1.4\"/>`,\n stepBack: `<path d=\"M13.6 5.4 7 10 13.6 14.6Z\"/><path d=\"M4.8 5.4v9.2\"/>`,\n stepForward: `<path d=\"M6.4 5.4 13 10 6.4 14.6Z\"/><path d=\"M15.2 5.4v9.2\"/>`,\n\n // State\n lock: `<rect x=\"4.6\" y=\"9\" width=\"10.8\" height=\"8\" rx=\"1.6\"/><path d=\"M7.2 9V6.6a2.8 2.8 0 0 1 5.6 0V9\"/>`,\n unlock: `<rect x=\"4.6\" y=\"9\" width=\"10.8\" height=\"8\" rx=\"1.6\"/><path d=\"M7.2 9V6.6a2.8 2.8 0 0 1 5.6 0\"/>`,\n visible: `<path d=\"M2.6 10C4.6 6.6 7.1 5 10 5s5.4 1.6 7.4 5c-2 3.4-4.5 5-7.4 5s-5.4-1.6-7.4-5z\"/><circle cx=\"10\" cy=\"10\" r=\"2.2\"/>`,\n hidden: `<path d=\"M2.6 10C4.6 6.6 7.1 5 10 5s5.4 1.6 7.4 5c-2 3.4-4.5 5-7.4 5s-5.4-1.6-7.4-5z\"/><circle cx=\"10\" cy=\"10\" r=\"2.2\"/><path d=\"M4.2 15.8 15.8 4.2\"/>`,\n pin: `<path d=\"M8.2 3.4v5.2l-2 2.6h7.6l-2-2.6V3.4z\"/><path d=\"M7 3.4h6\"/><path d=\"M10 11.2v5.4\"/>`,\n info: `<circle cx=\"10\" cy=\"10\" r=\"7\"/><path d=\"M10 9.4v4.4\"/><path d=\"M10 6.5h0\"/>`,\n warning: `<path d=\"M10 3.4 17.4 16.2H2.6z\"/><path d=\"M10 8.4v3.4\"/><path d=\"M10 14h0\"/>`,\n error: `<circle cx=\"10\" cy=\"10\" r=\"7\"/><path d=\"M7.6 7.6 12.4 12.4M12.4 7.6 7.6 12.4\"/>`,\n busy: `<path d=\"M10 3.2A6.8 6.8 0 1 1 3.2 10\"/>`,\n modeLight: `<circle cx=\"10\" cy=\"10\" r=\"3.5\"/><path d=\"M15.3 10L17.7 10M13.75 6.25L15.44 4.56M10 4.7L10 2.3M6.25 6.25L4.56 4.56M4.7 10L2.3 10M6.25 13.75L4.56 15.44M10 15.3L10 17.7M13.75 13.75L15.44 15.44\"/>`,\n modeDark: `<path d=\"M8.19 3.55A6.7 6.7 0 1 0 16.45 11.81A5.9 5.9 0 0 1 8.19 3.55Z\"/>`,\n modeAuto: `<path d=\"M10 2.6Q10 10 17.4 10Q10 10 10 17.4Q10 10 2.6 10Q10 10 10 2.6Z\"/>`,\n\n // Instrument\n crosshair: `<circle cx=\"10\" cy=\"10\" r=\"5.6\"/><path d=\"M10 2.8v4.4M10 12.8v4.4M2.8 10h4.4M12.8 10h4.4\"/>`,\n fullscreen: `<path d=\"M11.6 3.6h4.8v4.8M8.4 16.4H3.6v-4.8\"/><path d=\"M16.4 3.6 11.2 8.8M3.6 16.4 8.8 11.2\"/>`,\n compare: `<rect x=\"3.4\" y=\"4.6\" width=\"13.2\" height=\"10.8\" rx=\"1.6\"/><path d=\"M10 4.6v10.8\" stroke-width=\"1\"/><path d=\"M5.2 7.6h3.4M5.2 10h2.6M5.2 12.4h3.4\" stroke-width=\"1\"/><path d=\"M11.4 7.6h3.4M11.4 10h3.4M11.4 12.4h1.8\" stroke-width=\"1\"/>`,\n search: `<circle cx=\"9\" cy=\"9\" r=\"5.4\"/><path d=\"M12.82 12.82 16.9 16.9\"/>`,\n loupe: `<circle cx=\"9\" cy=\"9\" r=\"5.6\"/><path d=\"M12.96 12.96 17 17\"/><rect x=\"6\" y=\"6\" width=\"6\" height=\"6\" stroke-width=\"1\"/><path d=\"M9 6v6M6 9h6\" stroke-width=\"1\"/>`,\n layers: `<path d=\"M10 2.8 17.2 6.6 10 10.4 2.8 6.6z\"/><path d=\"M2.8 10 10 13.8 17.2 10\" stroke-width=\"1\"/><path d=\"M2.8 13.4 10 17.2 17.2 13.4\" stroke-width=\"1\"/>`,\n link: `<path d=\"M8.6 11.4a3.4 3.4 0 0 1 0-4.8l2.2-2.2a3.4 3.4 0 0 1 4.8 4.8l-1.1 1.1\"/><path d=\"M11.4 8.6a3.4 3.4 0 0 1 0 4.8l-2.2 2.2a3.4 3.4 0 0 1-4.8-4.8l1.1-1.1\"/>`,\n collapse: `<path d=\"M14.16 4.05 10 7.8 5.84 4.05M5.84 15.95 10 12.2 14.16 15.95\"/>`,\n expand: `<path d=\"M5.84 8.15 10 4.4 14.16 8.15M14.16 11.85 10 15.6 5.84 11.85\"/>`,\n chevron: `<path d=\"M14.9 7.98 10 12.4 5.1 7.98\"/>`,\n tune: `<path d=\"M3.4 6h13.2M3.4 10h13.2M3.4 14h13.2\" stroke-width=\"1.25\"/><circle cx=\"7\" cy=\"6\" r=\"1.8\"/><circle cx=\"12.6\" cy=\"10\" r=\"1.8\"/><circle cx=\"9\" cy=\"14\" r=\"1.8\"/>`,\n grid: `<rect x=\"3.4\" y=\"3.4\" width=\"13.2\" height=\"13.2\" rx=\"1.4\"/><path d=\"M7.8 3.4v13.2M12.2 3.4v13.2M3.4 7.8h13.2M3.4 12.2h13.2\" stroke-width=\"1\"/>`,\n snap: `<path d=\"M5.4 15.6V9.4a4.6 4.6 0 0 1 9.2 0v6.2h-3.2V9.4a1.4 1.4 0 0 0-2.8 0v6.2z\"/><path d=\"M5.4 12.8h3.2M11.4 12.8h3.2\" stroke-width=\"1\"/>`,\n measure: `<rect x=\"2.6\" y=\"7.4\" width=\"14.8\" height=\"5.2\" rx=\"1.2\"/><path d=\"M6 7.4v2.2M9.4 7.4v3M12.8 7.4v2.2\" stroke-width=\"1\"/>`,\n randomize: `<rect x=\"3.6\" y=\"3.6\" width=\"12.8\" height=\"12.8\" rx=\"2\"/><circle cx=\"7.2\" cy=\"7.2\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"10\" cy=\"10\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12.8\" cy=\"12.8\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/>`,\n refresh: `<path d=\"M4.27 12.09A6.1 6.1 0 0 1 14.67 6.08\"/><path d=\"M14.67 3.38 14.67 6.08 12.01 5.61\"/><path d=\"M15.73 7.91A6.1 6.1 0 0 1 5.33 13.92\"/><path d=\"M5.33 16.62 5.33 13.92 7.99 14.39\"/>`,\n\n // Stroke cap, join, align and dash\n strokeWidth: `<path d=\"M3.4 5.6h13.2\" stroke-width=\"1\"/><path d=\"M3.4 10h13.2\" stroke-width=\"2\"/><path d=\"M3.4 15.2h13.2\" stroke-width=\"3.4\"/>`,\n strokeCap: `<path d=\"M2.5 10H12\" stroke-linecap=\"butt\"/><path d=\"M12 6V14\" stroke-width=\"1\"/>`,\n strokeJoin: `<path d=\"M4.4 15.5 10 5.5 15.6 15.5\" stroke-linecap=\"butt\" stroke-linejoin=\"miter\"/>`,\n strokeAlign: `<circle cx=\"10\" cy=\"10\" r=\"6.2\"/>`,\n capButt: `<path d=\"M5.5 5.25H14.5V14.75H5.5Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"miter\"/>`,\n capRound: `<path d=\"M3.13 5.25H12.13V14.75H3.13Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"miter\"/><path d=\"M12.13 4.5A5.5 5.5 0 0 1 12.13 15.5Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n capSquare: `<path d=\"M3.13 5.25H12.13V14.75H3.13Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"miter\"/><path d=\"M12.13 4.5H17.63V15.5H12.13Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n joinMiter: `<path d=\"M10 3.5 15.6 15.5H4.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n joinRound: `<path d=\"M4.4 15.5V12a5.6 5.6 0 0 1 11.2 0v3.5Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n joinBevel: `<path d=\"M6.8 8.2h6.4l2.4 7.3H4.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n alignInner: `<path d=\"M10 3.8A6.2 6.2 0 1 0 10 16.2A6.2 6.2 0 1 0 10 3.8Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n alignCenter: `<path d=\"M10 2.1A7.9 7.9 0 1 0 10 17.9A7.9 7.9 0 1 0 10 2.1ZM10 5.5A4.5 4.5 0 1 0 10 14.5A4.5 4.5 0 1 0 10 5.5Z\" fill=\"currentColor\" stroke=\"none\" fill-rule=\"evenodd\"/>`,\n alignOuter: `<path d=\"M0 0H20V20H0ZM10 3.8A6.2 6.2 0 1 0 10 16.2A6.2 6.2 0 1 0 10 3.8Z\" fill=\"currentColor\" stroke=\"none\" fill-rule=\"evenodd\"/>`,\n dashSolid: `<path d=\"M2 10h16\" stroke-width=\"3\" stroke-linecap=\"butt\"/>`,\n dashDashed: `<path d=\"M2 10h16\" stroke-width=\"3\" stroke-linecap=\"butt\" stroke-dasharray=\"6 4\"/>`,\n dashDotted: `<path d=\"M2 10h16\" stroke-width=\"3\" stroke-linecap=\"butt\" stroke-dasharray=\"2.5 2\"/>`,\n dashCustom: `<path d=\"M2 10h16\" stroke-width=\"3\" stroke-linecap=\"butt\" stroke-dasharray=\"5 2 2 2\"/>`,\n paintSolid: `<path d=\"M3.4 3.4H16.6V16.6H3.4Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"1\"/>`,\n paintLinear: `<path d=\"M3.4 3.4H6.7V16.6H3.4Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"1\"/><path d=\"M6.7 3.4H10V16.6H6.7Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.68\"/><path d=\"M10 3.4H13.3V16.6H10Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.42\"/><path d=\"M13.3 3.4H16.6V16.6H13.3Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.2\"/>`,\n paintRadial: `<path d=\"M3.4 3.4H16.6V16.6H3.4ZM4.95 4.95H15.05V15.05H4.95Z\" fill=\"currentColor\" fill-rule=\"evenodd\" stroke=\"none\" fill-opacity=\"0.7\"/><path d=\"M4.95 4.95H15.05V15.05H4.95ZM6.5 6.5H13.5V13.5H6.5Z\" fill=\"currentColor\" fill-rule=\"evenodd\" stroke=\"none\" fill-opacity=\"0.53\"/><path d=\"M6.5 6.5H13.5V13.5H6.5ZM8.05 8.05H11.95V11.95H8.05Z\" fill=\"currentColor\" fill-rule=\"evenodd\" stroke=\"none\" fill-opacity=\"0.37\"/><path d=\"M8.05 8.05H11.95V11.95H8.05Z\" fill=\"currentColor\" fill-rule=\"evenodd\" stroke=\"none\" fill-opacity=\"0.2\"/>`,\n paintConic: `<path d=\"M10 10L16.6 3.4L16.6 16.6Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"1\"/><path d=\"M10 10L16.6 16.6L3.4 16.6Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.68\"/><path d=\"M10 10L3.4 16.6L3.4 3.4Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.42\"/><path d=\"M10 10L3.4 3.4L16.6 3.4Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.2\"/>`,\n paintMesh: `<path d=\"M3.4 3.4L10 3.4C10 6.26 11.6 5.74 11.6 8.6C7.09 8.6 7.91 10 3.4 10L3.4 3.4Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"1\"/><path d=\"M10 3.4L16.6 3.4L16.6 10C13.85 10 14.35 8.6 11.6 8.6C11.6 5.74 10 6.26 10 3.4Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.68\"/><path d=\"M11.6 8.6C14.35 8.6 13.85 10 16.6 10L16.6 16.6L10 16.6C10 12.2 11.6 13 11.6 8.6Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.42\"/><path d=\"M11.6 8.6C11.6 13 10 12.2 10 16.6L3.4 16.6L3.4 10C7.91 10 7.09 8.6 11.6 8.6Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.2\"/>`,\n paintPattern: `<path d=\"M3.4 3.4L4.7 3.4L3.4 4.7Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M8.7 3.4L11.3 3.4L3.4 11.3L3.4 8.7Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M15.3 3.4L16.6 3.4L16.6 4.7L4.7 16.6L3.4 16.6L3.4 15.3Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M16.6 8.7L16.6 11.3L11.3 16.6L8.7 16.6Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M16.6 15.3L16.6 16.6L15.3 16.6Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M15.3 3.4L16.6 3.4L16.6 4.7Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M8.7 3.4L11.3 3.4L16.6 8.7L16.6 11.3Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M3.4 3.4L4.7 3.4L16.6 15.3L16.6 16.6L15.3 16.6L3.4 4.7Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M11.3 16.6L8.7 16.6L3.4 11.3L3.4 8.7Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M4.7 16.6L3.4 16.6L3.4 15.3Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n paintNone: `<path d=\"M3.4 3.4H16.6V16.6H3.4Z\"/><path d=\"M3.4 16.6L16.6 3.4\" stroke=\"var(--wzl-danger, #d94a3f)\" stroke-width=\"1.8\" stroke-linecap=\"butt\"/>`,\n\n // Workspace layout\n layoutRows: `<rect x=\"3.4\" y=\"3.4\" width=\"13.2\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"3.4\" y=\"8.3\" width=\"13.2\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"3.4\" y=\"13.2\" width=\"13.2\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/>`,\n layoutColumns: `<rect x=\"3.4\" y=\"3.4\" width=\"3.4\" height=\"13.2\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"8.3\" y=\"3.4\" width=\"3.4\" height=\"13.2\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"13.2\" y=\"3.4\" width=\"3.4\" height=\"13.2\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/>`,\n layoutGrid: `<rect x=\"3.4\" y=\"3.4\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"8.3\" y=\"3.4\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"13.2\" y=\"3.4\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"3.4\" y=\"8.3\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"8.3\" y=\"8.3\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"13.2\" y=\"8.3\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"3.4\" y=\"13.2\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"8.3\" y=\"13.2\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"13.2\" y=\"13.2\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/>`,\n\n // Arc profiles\n arcStraight: `<path d=\"M2.6 15H17.4\"/>`,\n arcParabola: `<path d=\"M2.6 15Q10 -5 17.4 15\"/>`,\n arcCircle: `<path d=\"M2.6 15A7.4 7.4 0 0 1 17.4 15\"/>`,\n arcSine: `<path d=\"M2.6 10C3.83 7.38 5.07 5 6.3 5C7.53 5 8.77 7.38 10 10C11.23 12.62 12.47 15 13.7 15C14.93 15 16.17 12.62 17.4 10\"/>`,\n arcBump: `<path d=\"M2.6 15C3.83 15 5.07 11.87 6.3 9.38C7.53 6.88 8.77 5 10 5C11.23 5 12.47 6.88 13.7 9.38C14.93 11.87 16.17 15 17.4 15\"/>`,\n arcPlateau: `<path d=\"M2.6 15V8.6A3.6 3.6 0 0 1 6.2 5H13.8A3.6 3.6 0 0 1 17.4 8.6V15\"/>`,\n arcBell: `<path d=\"M2.6 15C3.42 14.87 4.24 14.6 5.07 13.65C5.89 12.7 6.71 10.87 7.53 8.87C8.36 6.86 9.18 5 10 5C10.82 5 11.64 6.86 12.47 8.87C13.29 10.87 14.11 12.7 14.93 13.65C15.76 14.6 16.58 14.87 17.4 15\"/>`,\n arcEllipse: `<path d=\"M2.6 15A7.4 10 0 0 1 17.4 15\"/>`,\n arcLob: `<path d=\"M2.6 15C3.78 -0.6 10.74 4.2 17.4 15\"/>`,\n arcDive: `<path d=\"M2.6 15C9.26 4.2 16.22 -0.6 17.4 15\"/>`,\n arcTriangle: `<path d=\"M2.6 10L6.3 5L13.7 15L17.4 10\"/>`,\n arcSquare: `<path d=\"M2.6 10L2.6 5L10 5L10 15L17.4 15L17.4 10\"/>`,\n arcSawtooth: `<path d=\"M2.6 10L10 5L10 15L17.4 10\"/>`,\n arcStair: `<path d=\"M2.6 10L4.97 10L4.97 5L8.82 5L8.82 10L11.18 10L11.18 15L15.03 15L15.03 10L17.4 10\"/>`,\n arcZigzag: `<path d=\"M2.6 10L4.45 5L8.15 15L10 10L11.85 5L15.55 15L17.4 10\"/>`,\n arcRipple: `<path d=\"M2.6 10C3.22 7.38 3.83 5 4.45 5C5.07 5 5.68 7.38 6.3 10C6.92 12.62 7.53 15 8.15 15C8.77 15 9.38 12.62 10 10C10.62 7.38 11.23 5 11.85 5C12.47 5 13.08 7.38 13.7 10C14.32 12.62 14.93 15 15.55 15C16.17 15 16.78 12.62 17.4 10\"/>`,\n arcHop: `<path d=\"M2.6 15Q6.3 -5 10 15M10 15Q13.7 4 17.4 15\"/>`,\n arcCusp: `<path d=\"M2.6 15Q7.34 12.8 10 5Q12.66 12.8 17.4 15\"/>`,\n\n // Curves\n curveLine: `<path d=\"M2.6 10.72H17.4\"/>`,\n curveParabola: `<path d=\"M2.6 15.72Q10 -4.28 17.4 15.72\"/>`,\n curveCircle: `<path d=\"M2.6 15.72A7.4 7.4 0 0 1 17.4 15.72\"/>`,\n curveEllipse: `<path d=\"M2.6 15.72A7.4 10 0 0 1 17.4 15.72\"/>`,\n curveHyperbola: `<path d=\"M2.6 15.72C2.91 15.08 3.8 13.12 4.48 11.86C5.16 10.61 5.76 9.21 6.68 8.19C7.6 7.16 8.89 5.72 10 5.72C11.11 5.72 12.4 7.16 13.32 8.19C14.24 9.21 14.84 10.61 15.52 11.86C16.2 13.12 17.09 15.08 17.4 15.72\"/>`,\n curveHyperbolaPair: `<path d=\"M2.6 15.72C2.91 15.08 3.8 13.12 4.48 11.86C5.16 10.61 5.76 9.21 6.68 8.19C7.6 7.16 8.89 5.72 10 5.72C11.11 5.72 12.4 7.16 13.32 8.19C14.24 9.21 14.84 10.61 15.52 11.86C16.2 13.12 17.09 15.08 17.4 15.72M2.6 5.72C2.91 6.36 3.8 8.32 4.48 9.58C5.16 10.83 5.76 12.23 6.68 13.25C7.6 14.28 8.89 15.72 10 15.72C11.11 15.72 12.4 14.28 13.32 13.25C14.24 12.23 14.84 10.83 15.52 9.58C16.2 8.32 17.09 6.36 17.4 5.72\"/>`,\n curveCubic: `<path d=\"M2.6 15.72C2.88 15.27 3.59 13.78 4.3 13.01C5 12.24 5.89 11.49 6.84 11.11C7.79 10.73 8.95 10.85 10 10.72C11.05 10.59 12.21 10.71 13.16 10.33C14.11 9.95 15 9.2 15.7 8.43C16.41 7.66 17.12 6.17 17.4 5.72\"/>`,\n curveQuartic: `<path d=\"M2.6 15.28C2.98 15.06 4.27 14.67 4.88 13.94C5.49 13.22 5.8 11.93 6.27 10.92C6.74 9.92 7.08 8.79 7.7 7.93C8.32 7.06 9.23 5.72 10 5.72C10.77 5.72 11.68 7.06 12.3 7.93C12.92 8.79 13.26 9.92 13.73 10.92C14.2 11.93 14.51 13.22 15.12 13.94C15.73 14.67 17.02 15.06 17.4 15.28\"/>`,\n curveSqrt: `<path d=\"M2.6 15.72C2.8 15.25 3.19 13.72 3.77 12.91C4.36 12.1 5.27 11.46 6.1 10.86C6.93 10.25 7.86 9.75 8.77 9.26C9.69 8.77 10.63 8.35 11.58 7.93C12.53 7.51 13.5 7.13 14.47 6.76C15.44 6.4 16.91 5.89 17.4 5.72\"/>`,\n curveReciprocal: `<path d=\"M2.6 15.72C2.69 15.31 2.91 14.08 3.15 13.28C3.39 12.49 3.66 11.68 4.06 10.96C4.46 10.24 4.95 9.53 5.55 8.97C6.15 8.41 6.89 7.97 7.63 7.61C8.37 7.25 9.19 7.01 9.99 6.79C10.79 6.57 11.62 6.43 12.44 6.29C13.26 6.15 14.09 6.05 14.91 5.96C15.74 5.86 16.99 5.76 17.4 5.72\"/>`,\n curveAbs: `<path d=\"M2.6 5.72L10 15.72L17.4 5.72\"/>`,\n curveCusp: `<path d=\"M2.6 15.72Q7.34 13.52 10 5.72Q12.66 13.52 17.4 15.72\"/>`,\n curveExponential: `<path d=\"M2.6 15.72C3.12 15.64 4.69 15.47 5.72 15.26C6.74 15.04 7.78 14.79 8.76 14.42C9.73 14.05 10.7 13.59 11.57 13.01C12.44 12.44 13.26 11.74 13.98 10.99C14.7 10.23 15.32 9.37 15.89 8.49C16.46 7.61 17.15 6.18 17.4 5.72\"/>`,\n curveLogarithm: `<path d=\"M2.6 15.72C2.72 15.34 3.01 14.18 3.35 13.47C3.68 12.76 4.11 12.07 4.61 11.46C5.11 10.86 5.72 10.32 6.35 9.85C6.97 9.37 7.67 8.98 8.37 8.61C9.07 8.25 9.81 7.94 10.55 7.66C11.28 7.37 12.04 7.12 12.79 6.89C13.55 6.66 14.32 6.45 15.09 6.26C15.85 6.06 17.01 5.81 17.4 5.72\"/>`,\n curveDecay: `<path d=\"M2.6 5.72C2.84 6.19 3.5 7.64 4.06 8.53C4.61 9.43 5.22 10.31 5.94 11.08C6.65 11.85 7.47 12.56 8.34 13.13C9.22 13.71 10.2 14.16 11.19 14.52C12.17 14.88 13.22 15.11 14.26 15.31C15.29 15.51 16.88 15.65 17.4 15.72\"/>`,\n curveSigmoid: `<path d=\"M2.6 15.72C3.11 15.62 4.75 15.55 5.68 15.14C6.61 14.74 7.46 14.02 8.18 13.29C8.9 12.55 9.39 11.58 10 10.72C10.61 9.86 11.1 8.89 11.82 8.15C12.54 7.42 13.39 6.7 14.32 6.3C15.25 5.89 16.89 5.82 17.4 5.72\"/>`,\n curveSoftplus: `<path d=\"M2.6 15.72C3.13 15.7 4.74 15.73 5.79 15.62C6.85 15.5 7.95 15.42 8.92 15.03C9.89 14.65 10.79 14 11.59 13.32C12.38 12.63 13.03 11.75 13.7 10.93C14.37 10.1 14.97 9.22 15.59 8.35C16.2 7.48 17.1 6.16 17.4 5.72\"/>`,\n curveRelu: `<path d=\"M2.6 15.72L10 15.72L17.4 5.72\"/>`,\n curveStep: `<path d=\"M2.6 15.72L10 15.72L10 5.72L17.4 5.72\"/>`,\n curvePowerLaw: `<path d=\"M2.6 15.72C2.62 15.25 2.67 13.85 2.74 12.91C2.81 11.98 2.83 11.03 3.01 10.12C3.19 9.21 3.27 8.11 3.8 7.45C4.33 6.78 5.32 6.39 6.18 6.13C7.04 5.87 8.04 5.93 8.98 5.87C9.91 5.81 10.85 5.8 11.78 5.78C12.72 5.76 13.66 5.75 14.59 5.74C15.53 5.73 16.93 5.72 17.4 5.72\"/>`,\n curveCatenary: `<path d=\"M2.6 5.72C2.86 6.4 3.53 8.49 4.16 9.8C4.79 11.11 5.4 12.57 6.37 13.55C7.34 14.54 8.79 15.72 10 15.72C11.21 15.72 12.66 14.54 13.63 13.55C14.6 12.57 15.21 11.11 15.84 9.8C16.47 8.49 17.14 6.4 17.4 5.72\"/>`,\n curveBathtub: `<path d=\"M2.6 5.72C2.71 6.29 2.98 8.02 3.27 9.14C3.57 10.27 3.81 11.47 4.37 12.45C4.92 13.43 5.67 14.5 6.61 15.04C7.55 15.59 8.87 15.72 10 15.72C11.13 15.72 12.45 15.59 13.39 15.04C14.33 14.5 15.08 13.43 15.63 12.45C16.19 11.47 16.43 10.27 16.73 9.14C17.02 8.02 17.29 6.29 17.4 5.72\"/>`,\n curveHockeyStick: `<path d=\"M2.6 15.72C3.15 15.68 4.81 15.61 5.91 15.5C7.01 15.39 8.12 15.31 9.19 15.06C10.26 14.8 11.38 14.51 12.3 13.96C13.23 13.41 14.08 12.61 14.75 11.76C15.42 10.91 15.89 9.86 16.33 8.86C16.78 7.85 17.22 6.24 17.4 5.72\"/>`,\n curveSine: `<path d=\"M2.6 10.72C3.83 8.1 5.07 5.72 6.3 5.72C7.53 5.72 8.77 8.1 10 10.72C11.23 13.34 12.47 15.72 13.7 15.72C14.93 15.72 16.17 13.34 17.4 10.72\"/>`,\n curveCosine: `<path d=\"M2.6 5.72C3.83 5.72 5.07 8.1 6.3 10.72C7.53 13.34 8.77 15.72 10 15.72C11.23 15.72 12.47 13.34 13.7 10.72C14.93 8.1 16.17 5.72 17.4 5.72\"/>`,\n curveRipple: `<path d=\"M2.6 10.72C3.22 8.1 3.83 5.72 4.45 5.72C5.07 5.72 5.68 8.1 6.3 10.72C6.92 13.34 7.53 15.72 8.15 15.72C8.77 15.72 9.38 13.34 10 10.72C10.62 8.1 11.23 5.72 11.85 5.72C12.47 5.72 13.08 8.1 13.7 10.72C14.32 13.34 14.93 15.72 15.55 15.72C16.17 15.72 16.78 13.34 17.4 10.72\"/>`,\n curveTriangleWave: `<path d=\"M2.6 10.72L6.3 5.72L13.7 15.72L17.4 10.72\"/>`,\n curveSquareWave: `<path d=\"M2.6 10.72L2.6 5.72L10 5.72L10 15.72L17.4 15.72L17.4 10.72\"/>`,\n curveSawtooth: `<path d=\"M2.6 10.72L10 5.72L10 15.72L17.4 10.72\"/>`,\n curveStair: `<path d=\"M2.6 10.72L4.97 10.72L4.97 5.72L8.82 5.72L8.82 10.72L11.18 10.72L11.18 15.72L15.03 15.72L15.03 10.72L17.4 10.72\"/>`,\n curvePulseTrain: `<path d=\"M2.6 10.72L4.23 10.72L4.23 5.72L6.3 5.72L6.3 10.72L8.96 10.72L8.96 5.72L11.04 5.72L11.04 10.72L13.7 10.72L13.7 5.72L15.77 5.72L15.77 10.72L17.4 10.72\"/>`,\n curveDamped: `<path d=\"M2.6 5.72C2.95 6.01 3.3 6.7 3.66 7.55C4.01 8.39 4.36 9.37 4.71 10.24C5.07 11.11 5.42 11.86 5.77 12.37C6.12 12.87 6.48 13.13 6.83 13.15C7.18 13.17 7.53 12.96 7.89 12.63C8.24 12.3 8.59 11.86 8.94 11.42C9.3 10.99 9.65 10.57 10 10.25C10.35 9.94 10.7 9.72 11.06 9.63C11.41 9.54 11.76 9.56 12.11 9.67C12.47 9.77 12.82 9.96 13.17 10.16C13.52 10.36 13.88 10.57 14.23 10.75C14.58 10.93 14.93 11.08 15.29 11.16C15.64 11.25 15.99 11.28 16.34 11.26C16.7 11.24 17.05 11.17 17.4 11.09\"/>`,\n curveChirp: `<path d=\"M2.6 10.72C2.85 10.33 3.09 9.84 3.34 9.28C3.59 8.73 3.83 8.1 4.08 7.53C4.33 6.96 4.57 6.45 4.82 6.23C5.07 6.01 5.31 6.1 5.56 6.66C5.81 7.22 6.05 8.29 6.3 9.65C6.55 11 6.79 12.65 7.04 13.83C7.29 15.01 7.53 15.64 7.78 15.14C8.03 14.64 8.27 12.95 8.52 10.95C8.77 8.95 9.01 6.8 9.26 6.26C9.51 5.72 9.75 7.01 10 9.3C10.25 11.59 10.49 14.54 10.74 15.18C10.99 15.82 11.23 13.76 11.48 10.95C11.73 8.14 11.97 5.47 12.22 6.3C12.47 7.13 12.71 11.45 12.96 13.83C13.21 16.2 13.45 15.12 13.7 11.79C13.95 8.47 14.19 4.96 14.44 6.66C14.69 8.37 14.93 14.36 15.18 15.21C15.43 16.05 15.67 10.43 15.92 7.53C16.17 4.63 16.41 8.14 16.66 12.16C16.91 16.17 17.15 15.15 17.4 10.72\"/>`,\n curveBeat: `<path d=\"M2.6 10.72C2.81 10.72 3.01 10.48 3.22 10.2C3.42 9.92 3.63 9.65 3.83 9.69C4.04 9.73 4.24 10.11 4.45 10.72C4.66 11.33 4.86 12.16 5.07 12.71C5.27 13.26 5.48 13.5 5.68 13.15C5.89 12.79 6.09 11.86 6.3 10.72C6.51 9.58 6.71 8.3 6.92 7.56C7.12 6.82 7.33 6.66 7.53 7.27C7.74 7.88 7.94 9.24 8.15 10.72C8.36 12.2 8.56 13.75 8.77 14.57C8.97 15.39 9.18 15.44 9.38 14.67C9.59 13.9 9.79 12.33 10 10.72C10.21 9.11 10.41 7.54 10.62 6.77C10.82 6 11.03 6.05 11.23 6.87C11.44 7.69 11.64 9.24 11.85 10.72C12.06 12.2 12.26 13.56 12.47 14.17C12.67 14.78 12.88 14.62 13.08 13.88C13.29 13.14 13.49 11.86 13.7 10.72C13.91 9.58 14.11 8.65 14.32 8.29C14.52 7.94 14.73 8.18 14.93 8.73C15.14 9.28 15.34 10.11 15.55 10.72C15.76 11.33 15.96 11.71 16.17 11.75C16.37 11.79 16.58 11.52 16.78 11.24C16.99 10.96 17.19 10.72 17.4 10.72\"/>`,\n curveGaussian: `<path d=\"M2.6 15.72C3.13 15.57 4.98 15.47 5.78 14.83C6.57 14.18 6.92 12.87 7.35 11.84C7.79 10.8 7.97 9.62 8.41 8.6C8.85 7.58 9.47 5.72 10 5.72C10.53 5.72 11.15 7.58 11.59 8.6C12.03 9.62 12.21 10.8 12.65 11.84C13.08 12.87 13.43 14.18 14.22 14.83C15.02 15.47 16.87 15.57 17.4 15.72\"/>`,\n curveBimodal: `<path d=\"M2.6 15.72C2.95 15.39 4.21 14.57 4.67 13.73C5.14 12.89 5.17 11.7 5.39 10.68C5.62 9.66 5.69 8.28 6 7.6C6.31 6.92 6.93 6.26 7.24 6.61C7.56 6.96 7.69 8.66 7.9 9.68C8.12 10.7 8.19 11.81 8.54 12.75C8.89 13.7 9.51 15.36 10 15.36C10.49 15.36 11.11 13.7 11.46 12.75C11.81 11.81 11.88 10.7 12.1 9.68C12.31 8.66 12.44 6.96 12.76 6.61C13.07 6.26 13.69 6.92 14 7.6C14.31 8.28 14.38 9.66 14.61 10.68C14.83 11.7 14.86 12.89 15.33 13.73C15.79 14.57 17.05 15.39 17.4 15.72\"/>`,\n curveSkewed: `<path d=\"M2.6 15.72C2.76 15.32 3.35 14.19 3.58 13.35C3.82 12.5 3.87 11.55 4.02 10.65C4.17 9.75 4.22 8.78 4.5 7.96C4.79 7.14 5.26 5.74 5.71 5.75C6.15 5.76 6.71 7.24 7.15 8.03C7.6 8.82 7.92 9.69 8.38 10.47C8.85 11.25 9.32 12.06 9.94 12.71C10.56 13.36 11.3 13.96 12.09 14.37C12.88 14.78 13.8 15.01 14.69 15.2C15.57 15.39 16.95 15.46 17.4 15.52\"/>`,\n curveLorentzian: `<path d=\"M2.6 15.72C3.06 15.64 4.52 15.6 5.35 15.26C6.18 14.92 7.02 14.36 7.57 13.66C8.11 12.96 8.34 11.97 8.62 11.08C8.89 10.2 8.99 9.25 9.22 8.35C9.45 7.46 9.74 5.72 10 5.72C10.26 5.72 10.55 7.46 10.78 8.35C11.01 9.25 11.11 10.2 11.38 11.08C11.66 11.97 11.89 12.96 12.43 13.66C12.98 14.36 13.82 14.92 14.65 15.26C15.48 15.6 16.94 15.64 17.4 15.72\"/>`,\n curveOgive: `<path d=\"M2.6 15.72C3.13 15.66 4.83 15.71 5.79 15.34C6.75 14.97 7.64 14.25 8.35 13.48C9.05 12.71 9.45 11.64 10 10.72C10.55 9.8 10.95 8.73 11.65 7.96C12.36 7.19 13.25 6.47 14.21 6.1C15.17 5.73 16.87 5.78 17.4 5.72\"/>`,\n curveUniform: `<path d=\"M2.6 15.72V9.32A3.6 3.6 0 0 1 6.2 5.72H13.8A3.6 3.6 0 0 1 17.4 9.32V15.72\"/>`,\n curveSinc: `<path d=\"M2.6 15.72C2.83 15.6 3.61 15.35 4.01 15.02C4.4 14.69 4.68 14.18 4.96 13.72C5.25 13.27 5.49 12.78 5.73 12.3C5.97 11.82 6.19 11.33 6.42 10.84C6.65 10.35 6.86 9.86 7.1 9.37C7.33 8.89 7.55 8.39 7.82 7.93C8.08 7.46 8.32 6.93 8.69 6.57C9.05 6.2 9.56 5.72 10 5.72C10.44 5.72 10.95 6.2 11.31 6.57C11.68 6.93 11.92 7.46 12.18 7.93C12.45 8.39 12.67 8.89 12.9 9.37C13.14 9.86 13.35 10.35 13.58 10.84C13.81 11.33 14.03 11.82 14.27 12.3C14.51 12.78 14.75 13.27 15.04 13.72C15.32 14.18 15.6 14.69 15.99 15.02C16.39 15.35 17.17 15.6 17.4 15.72\"/>`,\n curveImpulse: `<path d=\"M2.6 15.72L9.7 15.72L10 5.72L10.3 15.72L17.4 15.72\"/>`,\n curveEaseIn: `<path d=\"M2.6 15.72C3.13 15.7 4.75 15.75 5.8 15.62C6.86 15.49 7.94 15.31 8.93 14.94C9.91 14.57 10.87 14.01 11.72 13.38C12.56 12.75 13.31 11.95 14 11.14C14.7 10.34 15.29 9.43 15.86 8.53C16.42 7.63 17.14 6.19 17.4 5.72\"/>`,\n curveEaseOut: `<path d=\"M2.6 15.72C2.86 15.25 3.58 13.81 4.14 12.91C4.71 12.01 5.3 11.1 6 10.3C6.69 9.49 7.44 8.69 8.28 8.06C9.13 7.43 10.09 6.87 11.07 6.5C12.06 6.13 13.14 5.95 14.2 5.82C15.25 5.69 16.87 5.74 17.4 5.72\"/>`,\n curveEaseInOut: `<path d=\"M2.6 15.72C3 15.69 4.23 15.75 4.99 15.55C5.75 15.36 6.53 15.01 7.16 14.55C7.79 14.09 8.32 13.43 8.79 12.8C9.26 12.16 9.6 11.41 10 10.72C10.4 10.03 10.74 9.28 11.21 8.64C11.68 8.01 12.21 7.35 12.84 6.89C13.47 6.43 14.25 6.08 15.01 5.89C15.77 5.69 17 5.75 17.4 5.72\"/>`,\n curveOvershoot: `<path d=\"M2.6 15.72C2.76 15.33 3.2 14.15 3.54 13.39C3.88 12.62 4.24 11.86 4.64 11.13C5.05 10.4 5.48 9.67 6 9.02C6.51 8.36 7.06 7.7 7.72 7.19C8.37 6.69 9.14 6.25 9.92 6.01C10.7 5.77 11.57 5.73 12.4 5.73C13.23 5.73 14.07 5.92 14.9 6C15.73 6.08 16.98 6.18 17.4 6.22\"/>`,\n curveBounce: `<path d=\"M2.6 15.72Q6 -4.28 9.41 15.72M9.41 15.72Q11.63 6.72 13.85 15.72M13.85 15.72Q15.18 12.12 16.51 15.72M16.51 15.72Q16.96 14.72 17.4 15.72\"/>`,\n curveElastic: `<path d=\"M2.6 15.72C2.91 15.01 3.22 13.44 3.53 11.66C3.83 9.87 4.14 7.89 4.45 6.23C4.76 4.58 5.07 3.25 5.38 2.45C5.68 1.65 5.99 1.37 6.3 1.5C6.61 1.63 6.92 2.17 7.23 2.85C7.53 3.53 7.84 4.35 8.15 5.07C8.46 5.79 8.77 6.41 9.07 6.82C9.38 7.24 9.69 7.44 10 7.46C10.31 7.47 10.62 7.31 10.93 7.06C11.23 6.81 11.54 6.48 11.85 6.18C12.16 5.87 12.47 5.59 12.77 5.39C13.08 5.18 13.39 5.06 13.7 5.02C14.01 4.99 14.32 5.03 14.62 5.11C14.93 5.2 15.24 5.33 15.55 5.45C15.86 5.58 16.17 5.71 16.47 5.8C16.78 5.9 17.09 5.96 17.4 5.99\"/>`,\n curveLemniscate: `<path d=\"M17.4 11.12C17.4 11.98 16.91 12.8 16.23 13.25C15.54 13.7 14.73 13.8 14.01 13.7C13.29 13.6 12.66 13.3 12.11 12.95C11.57 12.6 11.1 12.19 10.65 11.76C10.21 11.34 9.79 10.9 9.35 10.48C8.9 10.05 8.43 9.64 7.89 9.29C7.34 8.94 6.71 8.64 5.99 8.54C5.27 8.44 4.46 8.54 3.77 8.99C3.09 9.44 2.6 10.26 2.6 11.12C2.6 11.98 3.09 12.8 3.77 13.25C4.46 13.7 5.27 13.8 5.99 13.7C6.71 13.6 7.34 13.3 7.89 12.95C8.43 12.6 8.9 12.19 9.35 11.76C9.79 11.34 10.21 10.9 10.65 10.48C11.1 10.05 11.57 9.64 12.11 9.29C12.66 8.94 13.29 8.64 14.01 8.54C14.73 8.44 15.54 8.54 16.23 8.99C16.91 9.44 17.4 10.26 17.4 11.12\"/>`,\n curveCardioid: `<path d=\"M10 6.14C10 6.14 10 6.09 10.03 6C10.06 5.91 10.13 5.78 10.24 5.63C10.36 5.48 10.54 5.31 10.77 5.16C11.01 5.01 11.32 4.88 11.68 4.8C12.04 4.72 12.45 4.69 12.91 4.74C13.36 4.79 13.84 4.92 14.32 5.15C14.8 5.38 15.27 5.71 15.7 6.14C16.12 6.56 16.5 7.08 16.79 7.69C17.08 8.29 17.28 8.96 17.36 9.68C17.44 10.4 17.4 11.15 17.23 11.9C17.06 12.65 16.76 13.39 16.33 14.07C15.9 14.75 15.35 15.37 14.7 15.89C14.05 16.41 13.3 16.82 12.5 17.1C11.7 17.38 10.85 17.53 10 17.53C9.15 17.53 8.3 17.38 7.5 17.1C6.7 16.82 5.95 16.41 5.3 15.89C4.65 15.37 4.1 14.75 3.67 14.07C3.24 13.39 2.94 12.65 2.77 11.9C2.6 11.15 2.56 10.4 2.64 9.68C2.72 8.96 2.92 8.29 3.21 7.69C3.5 7.08 3.88 6.56 4.3 6.14C4.73 5.71 5.2 5.38 5.68 5.15C6.16 4.92 6.64 4.79 7.09 4.74C7.55 4.69 7.96 4.72 8.32 4.8C8.68 4.88 8.99 5.01 9.23 5.16C9.46 5.31 9.64 5.48 9.76 5.63C9.87 5.78 9.94 5.91 9.97 6C10 6.09 10 6.14 10 6.14\"/>`,\n curveAstroid: `<path d=\"M17.4 11.12C17.4 11.12 17.02 11.13 16.37 11.34C15.72 11.55 14.81 11.97 13.92 12.62C13.02 13.27 12.15 14.14 11.5 15.04C10.85 15.93 10.43 16.84 10.22 17.49C10.01 18.14 10 18.52 10 18.52C10 18.52 9.99 18.14 9.78 17.49C9.57 16.84 9.15 15.93 8.5 15.04C7.85 14.14 6.98 13.27 6.08 12.62C5.19 11.97 4.28 11.55 3.63 11.34C2.98 11.13 2.6 11.12 2.6 11.12C2.6 11.12 2.98 11.11 3.63 10.9C4.28 10.69 5.19 10.27 6.08 9.62C6.98 8.97 7.85 8.1 8.5 7.2C9.15 6.31 9.57 5.4 9.78 4.75C9.99 4.1 10 3.72 10 3.72C10 3.72 10.01 4.1 10.22 4.75C10.43 5.4 10.85 6.31 11.5 7.2C12.15 8.1 13.02 8.97 13.92 9.62C14.81 10.27 15.72 10.69 16.37 10.9C17.02 11.11 17.4 11.12 17.4 11.12\"/>`,\n curveRose: `<path d=\"M16.57 11.12C16.57 11.49 16.32 11.85 15.86 12.13C15.4 12.42 14.72 12.61 13.9 12.66C13.08 12.71 12.13 12.61 11.13 12.35C10.14 12.09 9.11 11.67 8.16 11.12C7.21 10.57 6.33 9.89 5.61 9.16C4.89 8.43 4.32 7.65 3.96 6.92C3.59 6.18 3.42 5.5 3.43 4.96C3.44 4.42 3.64 4.02 3.96 3.84C4.27 3.65 4.71 3.68 5.19 3.94C5.66 4.2 6.17 4.69 6.62 5.38C7.07 6.06 7.47 6.94 7.74 7.93C8.01 8.92 8.16 10.02 8.16 11.12C8.16 12.22 8.01 13.32 7.74 14.31C7.47 15.3 7.07 16.18 6.62 16.86C6.17 17.55 5.66 18.04 5.19 18.3C4.71 18.56 4.27 18.59 3.96 18.4C3.64 18.22 3.44 17.82 3.43 17.28C3.42 16.74 3.59 16.06 3.96 15.32C4.32 14.59 4.89 13.81 5.61 13.08C6.33 12.35 7.21 11.67 8.16 11.12C9.11 10.57 10.14 10.15 11.13 9.89C12.13 9.63 13.08 9.53 13.9 9.58C14.72 9.63 15.4 9.82 15.86 10.11C16.32 10.39 16.57 10.75 16.57 11.12C16.57 11.49 16.32 11.85 15.86 12.13C15.4 12.42 14.72 12.61 13.9 12.66C13.08 12.71 12.13 12.61 11.13 12.35C10.14 12.09 9.11 11.67 8.16 11.12C7.21 10.57 6.33 9.89 5.61 9.16C4.89 8.43 4.32 7.65 3.96 6.92C3.59 6.18 3.42 5.5 3.43 4.96C3.44 4.42 3.64 4.02 3.96 3.84C4.27 3.65 4.71 3.68 5.19 3.94C5.66 4.2 6.17 4.69 6.62 5.38C7.07 6.06 7.47 6.94 7.74 7.93C8.01 8.92 8.16 10.02 8.16 11.12C8.16 12.22 8.01 13.32 7.74 14.31C7.47 15.3 7.07 16.18 6.62 16.86C6.17 17.55 5.66 18.04 5.19 18.3C4.71 18.56 4.27 18.59 3.96 18.4C3.64 18.22 3.44 17.82 3.43 17.28C3.42 16.74 3.59 16.06 3.96 15.32C4.32 14.59 4.89 13.81 5.61 13.08C6.33 12.35 7.21 11.67 8.16 11.12C9.11 10.57 10.14 10.15 11.13 9.89C12.13 9.63 13.08 9.53 13.9 9.58C14.72 9.63 15.4 9.82 15.86 10.11C16.32 10.39 16.57 10.75 16.57 11.12\"/>`,\n curveSpiral: `<path d=\"M10.77 12.22C10.92 12.38 11.02 12.66 10.97 12.97C10.93 13.28 10.74 13.62 10.42 13.86C10.09 14.1 9.63 14.24 9.13 14.18C8.63 14.13 8.1 13.88 7.69 13.45C7.29 13.01 7 12.38 6.97 11.68C6.94 10.98 7.15 10.22 7.63 9.58C8.11 8.94 8.85 8.43 9.73 8.21C10.6 7.99 11.6 8.08 12.51 8.5C13.42 8.93 14.22 9.7 14.71 10.69C15.19 11.68 15.35 12.89 15.09 14.07C14.83 15.24 14.14 16.38 13.12 17.2C12.1 18.02 10.75 18.51 9.34 18.52C7.93 18.53 6.47 18.04 5.28 17.11C4.09 16.18 3.19 14.8 2.81 13.23C2.43 11.66 2.59 9.91 3.31 8.35C4.03 6.79 5.31 5.44 6.94 4.61C8.56 3.79 10.51 3.51 12.4 3.89C14.28 4.27 16.08 5.31 17.39 6.85\"/>`,\n curveLissajous: `<path d=\"M10 11.12C11.66 12.23 13.32 13.33 14.61 14.33C15.91 15.33 16.84 16.22 17.21 16.91C17.58 17.6 17.39 18.09 16.67 18.33C15.95 18.58 14.71 18.58 13.21 18.33C11.71 18.09 9.97 17.6 8.35 16.91C6.73 16.22 5.25 15.33 4.21 14.33C3.18 13.33 2.6 12.23 2.6 11.12C2.6 10.01 3.18 8.91 4.21 7.91C5.25 6.91 6.73 6.02 8.35 5.33C9.97 4.64 11.71 4.15 13.21 3.91C14.71 3.66 15.95 3.66 16.67 3.91C17.39 4.15 17.58 4.64 17.21 5.33C16.84 6.02 15.91 6.91 14.61 7.91C13.32 8.91 11.66 10.01 10 11.12C8.34 12.23 6.68 13.33 5.39 14.33C4.09 15.33 3.16 16.22 2.79 16.91C2.42 17.6 2.61 18.09 3.33 18.33C4.05 18.58 5.29 18.58 6.79 18.33C8.29 18.09 10.03 17.6 11.65 16.91C13.27 16.22 14.75 15.33 15.79 14.33C16.82 13.33 17.4 12.23 17.4 11.12C17.4 10.01 16.82 8.91 15.79 7.91C14.75 6.91 13.27 6.02 11.65 5.33C10.03 4.64 8.29 4.15 6.79 3.91C5.29 3.66 4.05 3.66 3.33 3.91C2.61 4.15 2.42 4.64 2.79 5.33C3.16 6.02 4.09 6.91 5.39 7.91C6.68 8.91 8.34 10.01 10 11.12\"/>`,\n curveCycloid: `<path d=\"M2.6 15.72C2.6 15.72 2.6 15.49 2.66 15.05C2.71 14.61 2.82 13.98 3.03 13.22C3.23 12.46 3.53 11.59 3.94 10.72C4.36 9.85 4.88 8.98 5.49 8.22C6.11 7.46 6.82 6.83 7.59 6.39C8.36 5.95 9.18 5.72 10 5.72C10.82 5.72 11.64 5.95 12.41 6.39C13.18 6.83 13.89 7.46 14.51 8.22C15.12 8.98 15.64 9.85 16.06 10.72C16.47 11.59 16.77 12.46 16.97 13.22C17.18 13.98 17.29 14.61 17.34 15.05C17.4 15.49 17.4 15.72 17.4 15.72\"/>`,\n curveSuperellipse: `<path d=\"M17.4 11.12C17.4 14.45 17.38 12.98 17.34 13.46C17.31 13.94 17.25 14.34 17.17 14.69C17.1 15.05 17 15.37 16.89 15.66C16.78 15.94 16.64 16.21 16.49 16.44C16.34 16.68 16.16 16.9 15.97 17.09C15.78 17.28 15.56 17.46 15.32 17.61C15.09 17.76 14.82 17.9 14.54 18.01C14.25 18.12 13.93 18.22 13.57 18.29C13.22 18.37 12.82 18.43 12.34 18.46C11.86 18.5 13.33 18.52 10 18.52C6.67 18.52 8.14 18.5 7.66 18.46C7.18 18.43 6.78 18.37 6.43 18.29C6.07 18.22 5.75 18.12 5.46 18.01C5.18 17.9 4.91 17.76 4.68 17.61C4.44 17.46 4.22 17.28 4.03 17.09C3.84 16.9 3.66 16.68 3.51 16.44C3.36 16.21 3.22 15.94 3.11 15.66C3 15.37 2.9 15.05 2.83 14.69C2.75 14.34 2.69 13.94 2.66 13.46C2.62 12.98 2.6 14.45 2.6 11.12C2.6 7.79 2.62 9.26 2.66 8.78C2.69 8.3 2.75 7.9 2.83 7.55C2.9 7.19 3 6.87 3.11 6.58C3.22 6.3 3.36 6.03 3.51 5.8C3.66 5.56 3.84 5.34 4.03 5.15C4.22 4.96 4.44 4.78 4.68 4.63C4.91 4.48 5.18 4.34 5.46 4.23C5.75 4.12 6.07 4.02 6.43 3.95C6.78 3.87 7.18 3.81 7.66 3.78C8.14 3.74 6.67 3.72 10 3.72C13.33 3.72 11.86 3.74 12.34 3.78C12.82 3.81 13.22 3.87 13.57 3.95C13.93 4.02 14.25 4.12 14.54 4.23C14.82 4.34 15.09 4.48 15.32 4.63C15.56 4.78 15.78 4.96 15.97 5.15C16.16 5.34 16.34 5.56 16.49 5.8C16.64 6.03 16.78 6.3 16.89 6.58C17 6.87 17.1 7.19 17.17 7.55C17.25 7.9 17.31 8.3 17.34 8.78C17.38 9.26 17.4 7.79 17.4 11.12\"/>`,\n curveTangent: `<path d=\"M2.6 10.72C2.66 10.67 2.82 10.51 2.93 10.4C3.04 10.29 3.16 10.18 3.27 10.06C3.38 9.94 3.49 9.82 3.6 9.69C3.71 9.56 3.82 9.43 3.93 9.28C4.04 9.13 4.15 8.97 4.26 8.78C4.38 8.59 4.49 8.4 4.6 8.14C4.71 7.89 4.82 7.64 4.93 7.26C5.04 6.88 5.21 6.12 5.26 5.89M7.34 15.55C7.45 15.17 7.78 13.86 8 13.3C8.22 12.73 8.45 12.48 8.67 12.16C8.89 11.84 9.11 11.62 9.33 11.38C9.56 11.14 9.78 10.94 10 10.72C10.22 10.5 10.44 10.3 10.67 10.06C10.89 9.82 11.11 9.6 11.33 9.28C11.55 8.96 11.78 8.71 12 8.14C12.22 7.58 12.55 6.27 12.66 5.89M14.74 15.55C14.79 15.32 14.96 14.56 15.07 14.18C15.18 13.8 15.29 13.55 15.4 13.3C15.51 13.04 15.62 12.85 15.73 12.66C15.85 12.47 15.96 12.31 16.07 12.16C16.18 12.01 16.29 11.88 16.4 11.75C16.51 11.62 16.62 11.5 16.73 11.38C16.85 11.26 16.96 11.15 17.07 11.04C17.18 10.93 17.34 10.77 17.4 10.72\"/>`,\n curveCotangent: `<path d=\"M3.64 5.89C3.75 6.27 4.08 7.58 4.3 8.14C4.52 8.71 4.75 8.96 4.97 9.28C5.19 9.6 5.41 9.82 5.63 10.06C5.86 10.3 6.08 10.5 6.3 10.72C6.52 10.94 6.74 11.14 6.97 11.38C7.19 11.62 7.41 11.84 7.63 12.16C7.85 12.48 8.08 12.73 8.3 13.3C8.52 13.86 8.85 15.17 8.96 15.55M11.04 5.89C11.15 6.27 11.48 7.58 11.7 8.14C11.92 8.71 12.15 8.96 12.37 9.28C12.59 9.6 12.81 9.82 13.03 10.06C13.26 10.3 13.48 10.5 13.7 10.72C13.92 10.94 14.14 11.14 14.37 11.38C14.59 11.62 14.81 11.84 15.03 12.16C15.25 12.48 15.48 12.73 15.7 13.3C15.92 13.86 16.25 15.17 16.36 15.55\"/>`,\n curveSecant: `<path d=\"M2.6 12.64C2.66 12.65 2.82 12.65 2.93 12.66C3.04 12.68 3.16 12.69 3.27 12.72C3.38 12.75 3.49 12.78 3.6 12.83C3.71 12.88 3.82 12.93 3.93 13C4.04 13.07 4.15 13.14 4.26 13.25C4.38 13.35 4.49 13.47 4.6 13.63C4.71 13.79 4.82 13.95 4.93 14.22C5.04 14.49 5.2 15.01 5.26 15.24C5.33 15.46 5.33 15.51 5.34 15.56M7.26 5.88C7.37 6.18 7.71 7.28 7.93 7.7C8.15 8.12 8.37 8.23 8.59 8.39C8.82 8.56 9.04 8.63 9.26 8.7C9.48 8.76 9.7 8.79 9.93 8.8C10.15 8.8 10.37 8.79 10.59 8.73C10.81 8.68 11.04 8.62 11.26 8.49C11.48 8.35 11.7 8.24 11.92 7.91C12.15 7.58 12.45 6.82 12.59 6.48C12.73 6.15 12.71 5.98 12.74 5.88M14.66 15.56C14.72 15.37 14.88 14.7 15 14.4C15.11 14.1 15.22 13.92 15.33 13.74C15.44 13.56 15.55 13.44 15.66 13.32C15.77 13.2 15.88 13.12 15.99 13.05C16.11 12.97 16.22 12.91 16.33 12.86C16.44 12.81 16.55 12.77 16.66 12.74C16.77 12.71 16.88 12.69 16.99 12.67C17.1 12.66 17.26 12.65 17.33 12.64C17.39 12.64 17.39 12.64 17.4 12.64\"/>`,\n curveCosecant: `<path d=\"M3.56 15.56C3.67 15.26 4.01 14.16 4.23 13.74C4.45 13.32 4.67 13.21 4.89 13.05C5.12 12.88 5.34 12.81 5.56 12.74C5.78 12.68 6 12.65 6.23 12.64C6.45 12.64 6.67 12.65 6.89 12.71C7.11 12.76 7.34 12.82 7.56 12.95C7.78 13.09 8 13.2 8.22 13.53C8.45 13.86 8.75 14.62 8.89 14.96C9.03 15.29 9.01 15.46 9.04 15.56M10.96 5.88C11.07 6.18 11.41 7.28 11.63 7.7C11.85 8.12 12.07 8.23 12.29 8.39C12.52 8.56 12.74 8.63 12.96 8.7C13.18 8.76 13.4 8.79 13.63 8.8C13.85 8.8 14.07 8.79 14.29 8.73C14.51 8.68 14.74 8.62 14.96 8.49C15.18 8.35 15.4 8.24 15.62 7.91C15.85 7.58 16.15 6.82 16.29 6.48C16.43 6.15 16.41 5.98 16.44 5.88\"/>`,\n curveArcsine: `<path d=\"M2.6 15.72C2.85 15.38 3.59 14.16 4.08 13.67C4.57 13.18 5.07 13.04 5.56 12.77C6.05 12.49 6.55 12.26 7.04 12.03C7.53 11.8 8.03 11.58 8.52 11.36C9.01 11.14 9.51 10.93 10 10.72C10.49 10.51 10.99 10.3 11.48 10.08C11.97 9.86 12.47 9.64 12.96 9.41C13.45 9.18 13.95 8.95 14.44 8.67C14.93 8.4 15.43 8.26 15.92 7.77C16.41 7.28 17.15 6.06 17.4 5.72\"/>`,\n curveAsymptote: `<path d=\"M2.6 12.61C2.69 12.64 2.97 12.71 3.16 12.77C3.34 12.82 3.53 12.88 3.71 12.95C3.9 13.01 4.08 13.08 4.26 13.16C4.45 13.24 4.64 13.33 4.82 13.43C5.01 13.52 5.19 13.63 5.38 13.75C5.56 13.87 5.75 14 5.93 14.16C6.11 14.32 6.3 14.49 6.49 14.71C6.67 14.92 6.92 15.29 7.04 15.45C7.16 15.62 7.16 15.66 7.19 15.7M12.81 5.74C12.9 5.87 13.18 6.32 13.37 6.56C13.55 6.79 13.74 6.97 13.92 7.15C14.11 7.32 14.29 7.46 14.48 7.59C14.66 7.72 14.85 7.83 15.03 7.93C15.22 8.04 15.4 8.13 15.59 8.21C15.77 8.3 15.96 8.37 16.14 8.44C16.33 8.51 16.51 8.57 16.7 8.63C16.88 8.69 17.13 8.75 17.25 8.79C17.37 8.82 17.38 8.82 17.4 8.83\"/>`,\n\n // Shapes\n shapeTriangle: `<path d=\"M10 3.59L17.4 16.41L2.6 16.41Z\" stroke-linejoin=\"miter\"/>`,\n shapeRightTriangle: `<path d=\"M2.6 17.4L2.6 2.6L17.4 17.4Z\" stroke-linejoin=\"miter\"/>`,\n shapeSquare: `<path d=\"M2.6 2.6L17.4 2.6L17.4 17.4L2.6 17.4Z\" stroke-linejoin=\"miter\"/>`,\n shapeRectangle: `<path d=\"M2.6 5.37L17.4 5.37L17.4 14.63L2.6 14.63Z\" stroke-linejoin=\"miter\"/>`,\n shapeDiamond: `<path d=\"M10 2.6L17.4 10L10 17.4L2.6 10Z\" stroke-linejoin=\"miter\"/>`,\n shapeParallelogram: `<path d=\"M5.35 4.71L17.4 4.71L14.65 15.29L2.6 15.29Z\" stroke-linejoin=\"miter\"/>`,\n shapeTrapezoid: `<path d=\"M5.35 4.71L14.65 4.71L17.4 15.29L2.6 15.29Z\" stroke-linejoin=\"miter\"/>`,\n shapeKite: `<path d=\"M10 2.6L16.43 7.75L10 17.4L3.57 7.75Z\" stroke-linejoin=\"miter\"/>`,\n shapePentagon: `<path d=\"M10 2.96L17.4 8.34L14.57 17.04L5.43 17.04L2.6 8.34Z\" stroke-linejoin=\"miter\"/>`,\n shapeHexagon: `<path d=\"M10 2.6L16.41 6.3L16.41 13.7L10 17.4L3.59 13.7L3.59 6.3Z\" stroke-linejoin=\"miter\"/>`,\n shapeHexagonFlat: `<path d=\"M17.4 10L13.7 16.41L6.3 16.41L2.6 10L6.3 3.59L13.7 3.59Z\" stroke-linejoin=\"miter\"/>`,\n shapeHeptagon: `<path d=\"M10 2.79L15.93 5.64L17.4 12.06L13.29 17.21L6.71 17.21L2.6 12.06L4.07 5.64Z\" stroke-linejoin=\"miter\"/>`,\n shapeOctagon: `<path d=\"M13.07 2.6L17.4 6.93L17.4 13.07L13.07 17.4L6.93 17.4L2.6 13.07L2.6 6.93L6.93 2.6Z\" stroke-linejoin=\"miter\"/>`,\n shapeDecagon: `<path d=\"M10 2.6L14.35 4.01L17.04 7.71L17.04 12.29L14.35 15.99L10 17.4L5.65 15.99L2.96 12.29L2.96 7.71L5.65 4.01Z\" stroke-linejoin=\"miter\"/>`,\n shapeDodecagon: `<path d=\"M10 2.6L13.7 3.59L16.41 6.3L17.4 10L16.41 13.7L13.7 16.41L10 17.4L6.3 16.41L3.59 13.7L2.6 10L3.59 6.3L6.3 3.59Z\" stroke-linejoin=\"miter\"/>`,\n shapeCross: `<path d=\"M7.63 2.6L12.37 2.6L12.37 7.63L17.4 7.63L17.4 12.37L12.37 12.37L12.37 17.4L7.63 17.4L7.63 12.37L2.6 12.37L2.6 7.63L7.63 7.63Z\" stroke-linejoin=\"miter\"/>`,\n shapeLShape: `<path d=\"M2.6 2.6L8.82 2.6L8.82 11.78L17.4 11.78L17.4 17.4L2.6 17.4Z\" stroke-linejoin=\"miter\"/>`,\n shapeChevron: `<path d=\"M2.6 4.38L10 10.59L17.4 4.38L17.4 9.41L10 15.62L2.6 9.41Z\" stroke-linejoin=\"miter\"/>`,\n shapeStar: `<path d=\"M10 2.96L12.2 7.72L17.4 8.34L13.55 11.9L14.57 17.04L10 14.48L5.43 17.04L6.45 11.9L2.6 8.34L7.8 7.72Z\" stroke-linejoin=\"miter\"/>`,\n shapeStar4: `<path d=\"M10 2.6L11.99 8.01L17.4 10L11.99 11.99L10 17.4L8.01 11.99L2.6 10L8.01 8.01Z\" stroke-linejoin=\"miter\"/>`,\n shapeStar6: `<path d=\"M10 2.6L12.07 6.41L16.41 6.3L14.14 10L16.41 13.7L12.07 13.59L10 17.4L7.93 13.59L3.59 13.7L5.86 10L3.59 6.3L7.93 6.41Z\" stroke-linejoin=\"miter\"/>`,\n shapeStar8: `<path d=\"M10 2.6L11.76 5.76L15.23 4.77L14.24 8.24L17.4 10L14.24 11.76L15.23 15.23L11.76 14.24L10 17.4L8.24 14.24L4.77 15.23L5.76 11.76L2.6 10L5.76 8.24L4.77 4.77L8.24 5.76Z\" stroke-linejoin=\"miter\"/>`,\n shapePentagram: `<path d=\"M10 2.96L14.57 17.04L2.6 8.34L17.4 8.34L5.43 17.04Z\" stroke-linejoin=\"miter\"/>`,\n shapeCircle: `<path d=\"M2.6 10A7.4 7.4 0 1 1 17.4 10A7.4 7.4 0 1 1 2.6 10Z\"/>`,\n shapeEllipse: `<path d=\"M2.6 10A7.4 4.74 0 1 1 17.4 10A7.4 4.74 0 1 1 2.6 10Z\"/>`,\n shapeSemicircle: `<path d=\"M2.6 13.7A7.4 7.4 0 0 1 17.4 13.7Z\"/>`,\n shapeQuarter: `<path d=\"M2.6 17.4V2.6A14.8 14.8 0 0 1 17.4 17.4Z\"/>`,\n shapeStadium: `<path d=\"M6.74 5.86H13.26A4.14 4.14 0 0 1 13.26 14.14H6.74A4.14 4.14 0 0 1 6.74 5.86Z\"/>`,\n shapeRoundedSquare: `<path d=\"M6 2.6H14A3.4 3.4 0 0 1 17.4 6V14A3.4 3.4 0 0 1 14 17.4H6A3.4 3.4 0 0 1 2.6 14V6A3.4 3.4 0 0 1 6 2.6Z\"/>`,\n shapeRing: `<path d=\"M2.6 10A7.4 7.4 0 1 1 17.4 10A7.4 7.4 0 1 1 2.6 10ZM6.15 10A3.85 3.85 0 1 0 13.85 10A3.85 3.85 0 1 0 6.15 10Z\"/>`,\n shapeCrescent: `<path d=\"M6.3 2.6A7.4 7.4 0 1 1 6.3 17.4A8.51 8.51 0 0 0 6.3 2.6Z\"/>`,\n shapeLens: `<path d=\"M10 2.6A9.99 9.99 0 0 1 10 17.4A9.99 9.99 0 0 1 10 2.6Z\"/>`,\n shapeSector: `<path d=\"M10 14.63L2.6 9.06A9.27 9.27 0 0 1 17.4 9.06Z\"/>`,\n shapeSegment: `<path d=\"M2.6 12.59A7.88 7.88 0 0 1 17.4 12.59Z\"/>`,\n shapeArch: `<path d=\"M2.6 17.4V10A7.4 7.4 0 0 1 17.4 10V17.4Z\"/>`,\n shapeTeardrop: `<path d=\"M10 2.6L5.9 10.75A4.59 4.59 0 1 0 14.1 10.75Z\"/>`,\n shapeEgg: `<path d=\"M10 2.6C14.59 2.6 16.07 9.26 16.07 12.22C16.07 15.77 13.26 17.4 10 17.4C6.74 17.4 3.93 15.77 3.93 12.22C3.93 9.26 5.41 2.6 10 2.6Z\"/>`,\n shapeHeart: `<path d=\"M10 6.51L10.01 6.42L10.05 6.16L10.18 5.76L10.41 5.26L10.78 4.72L11.27 4.2L11.89 3.76L12.62 3.45L13.42 3.31L14.25 3.36L15.08 3.61L15.84 4.03L16.48 4.62L16.98 5.33L17.29 6.12L17.4 6.97L17.29 7.84L16.98 8.7L16.48 9.54L15.84 10.34L15.08 11.12L14.25 11.86L13.42 12.57L12.62 13.27L11.89 13.93L11.27 14.56L10.78 15.14L10.41 15.66L10.18 16.09L10.05 16.41L10.01 16.62L10 16.69L9.99 16.62L9.95 16.41L9.82 16.09L9.59 15.66L9.22 15.14L8.73 14.56L8.11 13.93L7.38 13.27L6.58 12.57L5.75 11.86L4.92 11.12L4.16 10.34L3.52 9.54L3.02 8.7L2.71 7.84L2.6 6.97L2.71 6.12L3.02 5.33L3.52 4.62L4.16 4.03L4.92 3.61L5.75 3.36L6.58 3.31L7.38 3.45L8.11 3.76L8.73 4.2L9.22 4.72L9.59 5.26L9.82 5.76L9.95 6.16L9.99 6.42L10 6.51Z\"/>`,\n shapeAngle: `<path d=\"M17.4 16.34L2.6 16.34L14.8 3.66M6.12 16.34A3.52 3.52 0 0 0 5.04 13.8\"/>`,\n\n // Platonic solids\n d4: `<path d=\"M2.6 14.47L10 3.31L17.4 14.47L10 16.69Z\" stroke-linejoin=\"miter\" stroke-width=\"1\"/><path d=\"M10 16.69L10 3.31\" stroke-width=\"0.6\"/>`,\n d6: `<path d=\"M3.59 6.3L10 2.6L16.41 6.3L16.41 13.7L10 17.4L3.59 13.7Z\" stroke-linejoin=\"miter\" stroke-width=\"1\"/><path d=\"M10 10L16.41 6.3M10 17.4L10 10M10 10L3.59 6.3\" stroke-width=\"0.6\"/>`,\n d8: `<path d=\"M2.85 9.6L10 2.6L17.15 10.4L10 17.4Z\" stroke-linejoin=\"miter\" stroke-width=\"1\"/><path d=\"M7.68 11.24L2.85 9.6M10 2.6L7.68 11.24M7.68 11.24L10 17.4M17.15 10.4L7.68 11.24\" stroke-width=\"0.6\"/>`,\n d12: `<path d=\"M2.96 7.71L5.65 4.01L10 2.6L14.35 4.01L17.04 7.71L17.04 12.29L14.35 15.99L10 17.4L5.65 15.99L2.96 12.29Z\" stroke-linejoin=\"miter\" stroke-width=\"1\"/><path d=\"M10 5.43L10 2.6M14.35 8.59L10 5.43M17.04 7.71L14.35 8.59M14.35 8.59L12.69 13.7M5.65 8.59L10 5.43M7.31 13.7L5.65 8.59M12.69 13.7L7.31 13.7M5.65 8.59L2.96 7.71M14.35 15.99L12.69 13.7M5.65 15.99L7.31 13.7\" stroke-width=\"0.6\"/>`,\n d20: `<path d=\"M3.59 13.7L3.59 6.3L10 2.6L16.41 6.3L16.41 13.7L10 17.4Z\" stroke-linejoin=\"miter\" stroke-width=\"1\"/><path d=\"M10 5.43L13.96 12.29M6.04 12.29L10 5.43M13.96 12.29L6.04 12.29M3.59 6.3L10 5.43M6.04 12.29L3.59 6.3M10 5.43L10 2.6M16.41 6.3L10 5.43M16.41 6.3L13.96 12.29M6.04 12.29L10 17.4M3.59 13.7L6.04 12.29M13.96 12.29L10 17.4M16.41 13.7L13.96 12.29\" stroke-width=\"0.6\"/>`,\n} as const;\n\n/** Every glyph name in the set. */\nexport type IconName = keyof typeof ICON_PATHS;\n\n/** The region a glyph encloses, for `<Icon filled>`. A shape fills its own\n * outline; a plotted curve fills down to the frame's baseline, reaching the outer\n * edge of the stroke rather than stopping at the path's own endpoint. Only the\n * glyphs where an enclosed region means something have an entry. */\nexport const ICON_FILLS = {\n arcStraight: `<path d=\"M1.85 15L2.6 15H17.4L18.15 15L18.15 15.75L1.85 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcParabola: `<path d=\"M2.31 15.69L2.6 15Q10 -5 17.4 15L17.69 15.69L17.69 15.75L2.31 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcCircle: `<path d=\"M2.52 15.75L2.6 15A7.4 7.4 0 0 1 17.4 15L17.48 15.75L17.48 15.75L2.52 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcSine: `<path d=\"M2.28 10.68L2.6 10C3.83 7.38 5.07 5 6.3 5C7.53 5 8.77 7.38 10 10C11.23 12.62 12.47 15 13.7 15C14.93 15 16.17 12.62 17.4 10L17.72 9.32L17.72 15.75L2.28 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcBump: `<path d=\"M1.87 15.18L2.6 15C3.83 15 5.07 11.87 6.3 9.38C7.53 6.88 8.77 5 10 5C11.23 5 12.47 6.88 13.7 9.38C14.93 11.87 16.17 15 17.4 15L18.13 15.18L18.13 15.75L1.87 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcPlateau: `<path d=\"M2.6 15.75L2.6 15V8.6A3.6 3.6 0 0 1 6.2 5H13.8A3.6 3.6 0 0 1 17.4 8.6V15L17.4 15.75L17.4 15.75L2.6 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcBell: `<path d=\"M1.86 15.13L2.6 15C3.42 14.87 4.24 14.6 5.07 13.65C5.89 12.7 6.71 10.87 7.53 8.87C8.36 6.86 9.18 5 10 5C10.82 5 11.64 6.86 12.47 8.87C13.29 10.87 14.11 12.7 14.93 13.65C15.76 14.6 16.58 14.87 17.4 15L18.14 15.13L18.14 15.75L1.86 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcEllipse: `<path d=\"M2.54 15.75L2.6 15A7.4 10 0 0 1 17.4 15L17.46 15.75L17.46 15.75L2.54 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcLob: `<path d=\"M2.5 15.74L2.6 15C3.78 -0.6 10.74 4.2 17.4 15L17.81 15.63L17.81 15.75L2.5 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcDive: `<path d=\"M2.19 15.63L2.6 15C9.26 4.2 16.22 -0.6 17.4 15L17.5 15.74L17.5 15.75L2.19 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcTriangle: `<path d=\"M2.15 10.6L2.6 10L6.3 5L13.7 15L17.4 10L17.85 9.4L17.85 15.75L2.15 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcSquare: `<path d=\"M2.6 10.75L2.6 10L2.6 5L10 5L10 15L17.4 15L17.4 10L17.4 9.25L17.4 15.75L2.6 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcSawtooth: `<path d=\"M1.98 10.42L2.6 10L10 5L10 15L17.4 10L18.02 9.58L18.02 15.75L1.98 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcStair: `<path d=\"M1.85 10L2.6 10L4.97 10L4.97 5L8.82 5L8.82 10L11.18 10L11.18 15L15.03 15L15.03 10L17.4 10L18.15 10L18.15 15.75L1.85 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcZigzag: `<path d=\"M2.34 10.7L2.6 10L4.45 5L8.15 15L10 10L11.85 5L15.55 15L17.4 10L17.66 9.3L17.66 15.75L2.34 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcRipple: `<path d=\"M2.43 10.73L2.6 10C3.22 7.38 3.83 5 4.45 5C5.07 5 5.68 7.38 6.3 10C6.92 12.62 7.53 15 8.15 15C8.77 15 9.38 12.62 10 10C10.62 7.38 11.23 5 11.85 5C12.47 5 13.08 7.38 13.7 10C14.32 12.62 14.93 15 15.55 15C16.17 15 16.78 12.62 17.4 10L17.57 9.27L17.57 15.75L2.43 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcHop: `<path d=\"M2.45 15.73L2.6 15Q6.3 -5 10 15L10.15 15.73L10.15 15.75L2.45 15.75ZM9.74 15.7L10 15Q13.7 4 17.4 15L17.66 15.7L17.66 15.75L9.74 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcCusp: `<path d=\"M1.94 15.35L2.6 15Q7.34 12.8 10 5Q12.66 12.8 17.4 15L18.06 15.35L18.06 15.75L1.94 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveLine: `<path d=\"M1.85 10.72L2.6 10.72H17.4L18.15 10.72L18.15 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveParabola: `<path d=\"M2.31 16.41L2.6 15.72Q10 -4.28 17.4 15.72L17.69 16.41L17.69 16.47L2.31 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveCircle: `<path d=\"M2.52 16.47L2.6 15.72A7.4 7.4 0 0 1 17.4 15.72L17.48 16.47L17.48 16.47L2.52 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveEllipse: `<path d=\"M2.54 16.47L2.6 15.72A7.4 10 0 0 1 17.4 15.72L17.46 16.47L17.46 16.47L2.54 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveHyperbola: `<path d=\"M2.28 16.4L2.6 15.72C2.91 15.08 3.8 13.12 4.48 11.86C5.16 10.61 5.76 9.21 6.68 8.19C7.6 7.16 8.89 5.72 10 5.72C11.11 5.72 12.4 7.16 13.32 8.19C14.24 9.21 14.84 10.61 15.52 11.86C16.2 13.12 17.09 15.08 17.4 15.72L17.72 16.4L17.72 16.47L2.28 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveCubic: `<path d=\"M2.22 16.37L2.6 15.72C2.88 15.27 3.59 13.78 4.3 13.01C5 12.24 5.89 11.49 6.84 11.11C7.79 10.73 8.95 10.85 10 10.72C11.05 10.59 12.21 10.71 13.16 10.33C14.11 9.95 15 9.2 15.7 8.43C16.41 7.66 17.12 6.17 17.4 5.72L17.78 5.07L17.78 16.47L2.22 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveQuartic: `<path d=\"M1.93 15.62L2.6 15.28C2.98 15.06 4.27 14.67 4.88 13.94C5.49 13.22 5.8 11.93 6.27 10.92C6.74 9.92 7.08 8.79 7.7 7.93C8.32 7.06 9.23 5.72 10 5.72C10.77 5.72 11.68 7.06 12.3 7.93C12.92 8.79 13.26 9.92 13.73 10.92C14.2 11.93 14.51 13.22 15.12 13.94C15.73 14.67 17.02 15.06 17.4 15.28L18.07 15.62L18.07 16.47L1.93 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSqrt: `<path d=\"M2.33 16.42L2.6 15.72C2.8 15.25 3.19 13.72 3.77 12.91C4.36 12.1 5.27 11.46 6.1 10.86C6.93 10.25 7.86 9.75 8.77 9.26C9.69 8.77 10.63 8.35 11.58 7.93C12.53 7.51 13.5 7.13 14.47 6.76C15.44 6.4 16.91 5.89 17.4 5.72L18.11 5.47L18.11 16.47L2.33 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveReciprocal: `<path d=\"M2.45 16.45L2.6 15.72C2.69 15.31 2.91 14.08 3.15 13.28C3.39 12.49 3.66 11.68 4.06 10.96C4.46 10.24 4.95 9.53 5.55 8.97C6.15 8.41 6.89 7.97 7.63 7.61C8.37 7.25 9.19 7.01 9.99 6.79C10.79 6.57 11.62 6.43 12.44 6.29C13.26 6.15 14.09 6.05 14.91 5.96C15.74 5.86 16.99 5.76 17.4 5.72L18.15 5.65L18.15 16.47L2.45 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveAbs: `<path d=\"M2.15 5.12L2.6 5.72L10 15.72L17.4 5.72L17.85 5.12L17.85 16.47L2.15 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveCusp: `<path d=\"M1.94 16.07L2.6 15.72Q7.34 13.52 10 5.72Q12.66 13.52 17.4 15.72L18.06 16.07L18.06 16.47L1.94 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveExponential: `<path d=\"M1.86 15.83L2.6 15.72C3.12 15.64 4.69 15.47 5.72 15.26C6.74 15.04 7.78 14.79 8.76 14.42C9.73 14.05 10.7 13.59 11.57 13.01C12.44 12.44 13.26 11.74 13.98 10.99C14.7 10.23 15.32 9.37 15.89 8.49C16.46 7.61 17.15 6.18 17.4 5.72L17.75 5.06L17.75 16.47L1.86 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveLogarithm: `<path d=\"M2.38 16.44L2.6 15.72C2.72 15.34 3.01 14.18 3.35 13.47C3.68 12.76 4.11 12.07 4.61 11.46C5.11 10.86 5.72 10.32 6.35 9.85C6.97 9.37 7.67 8.98 8.37 8.61C9.07 8.25 9.81 7.94 10.55 7.66C11.28 7.37 12.04 7.12 12.79 6.89C13.55 6.66 14.32 6.45 15.09 6.26C15.85 6.06 17.01 5.81 17.4 5.72L18.13 5.55L18.13 16.47L2.38 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveDecay: `<path d=\"M2.27 5.05L2.6 5.72C2.84 6.19 3.5 7.64 4.06 8.53C4.61 9.43 5.22 10.31 5.94 11.08C6.65 11.85 7.47 12.56 8.34 13.13C9.22 13.71 10.2 14.16 11.19 14.52C12.17 14.88 13.22 15.11 14.26 15.31C15.29 15.51 16.88 15.65 17.4 15.72L18.14 15.81L18.14 16.47L2.27 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSigmoid: `<path d=\"M1.86 15.84L2.6 15.72C3.11 15.62 4.75 15.55 5.68 15.14C6.61 14.74 7.46 14.02 8.18 13.29C8.9 12.55 9.39 11.58 10 10.72C10.61 9.86 11.1 8.89 11.82 8.15C12.54 7.42 13.39 6.7 14.32 6.3C15.25 5.89 16.89 5.82 17.4 5.72L18.14 5.6L18.14 16.47L1.86 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSoftplus: `<path d=\"M1.85 15.74L2.6 15.72C3.13 15.7 4.74 15.73 5.79 15.62C6.85 15.5 7.95 15.42 8.92 15.03C9.89 14.65 10.79 14 11.59 13.32C12.38 12.63 13.03 11.75 13.7 10.93C14.37 10.1 14.97 9.22 15.59 8.35C16.2 7.48 17.1 6.16 17.4 5.72L17.82 5.1L17.82 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveRelu: `<path d=\"M1.85 15.72L2.6 15.72L10 15.72L17.4 5.72L17.85 5.12L17.85 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveStep: `<path d=\"M1.85 15.72L2.6 15.72L10 15.72L10 5.72L17.4 5.72L18.15 5.72L18.15 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curvePowerLaw: `<path d=\"M2.57 16.47L2.6 15.72C2.62 15.25 2.67 13.85 2.74 12.91C2.81 11.98 2.83 11.03 3.01 10.12C3.19 9.21 3.27 8.11 3.8 7.45C4.33 6.78 5.32 6.39 6.18 6.13C7.04 5.87 8.04 5.93 8.98 5.87C9.91 5.81 10.85 5.8 11.78 5.78C12.72 5.76 13.66 5.75 14.59 5.74C15.53 5.73 16.93 5.72 17.4 5.72L18.15 5.72L18.15 16.47L2.57 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveCatenary: `<path d=\"M2.34 5.02L2.6 5.72C2.86 6.4 3.53 8.49 4.16 9.8C4.79 11.11 5.4 12.57 6.37 13.55C7.34 14.54 8.79 15.72 10 15.72C11.21 15.72 12.66 14.54 13.63 13.55C14.6 12.57 15.21 11.11 15.84 9.8C16.47 8.49 17.14 6.4 17.4 5.72L17.66 5.02L17.66 16.47L2.34 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveBathtub: `<path d=\"M2.46 4.98L2.6 5.72C2.71 6.29 2.98 8.02 3.27 9.14C3.57 10.27 3.81 11.47 4.37 12.45C4.92 13.43 5.67 14.5 6.61 15.04C7.55 15.59 8.87 15.72 10 15.72C11.13 15.72 12.45 15.59 13.39 15.04C14.33 14.5 15.08 13.43 15.63 12.45C16.19 11.47 16.43 10.27 16.73 9.14C17.02 8.02 17.29 6.29 17.4 5.72L17.54 4.98L17.54 16.47L2.46 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveHockeyStick: `<path d=\"M1.85 15.77L2.6 15.72C3.15 15.68 4.81 15.61 5.91 15.5C7.01 15.39 8.12 15.31 9.19 15.06C10.26 14.8 11.38 14.51 12.3 13.96C13.23 13.41 14.08 12.61 14.75 11.76C15.42 10.91 15.89 9.86 16.33 8.86C16.78 7.85 17.22 6.24 17.4 5.72L17.63 5.01L17.63 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSine: `<path d=\"M2.28 11.4L2.6 10.72C3.83 8.1 5.07 5.72 6.3 5.72C7.53 5.72 8.77 8.1 10 10.72C11.23 13.34 12.47 15.72 13.7 15.72C14.93 15.72 16.17 13.34 17.4 10.72L17.72 10.04L17.72 16.47L2.28 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveCosine: `<path d=\"M1.86 5.58L2.6 5.72C3.83 5.72 5.07 8.1 6.3 10.72C7.53 13.34 8.77 15.72 10 15.72C11.23 15.72 12.47 13.34 13.7 10.72C14.93 8.1 16.17 5.72 17.4 5.72L18.14 5.58L18.14 16.47L1.86 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveRipple: `<path d=\"M2.43 11.45L2.6 10.72C3.22 8.1 3.83 5.72 4.45 5.72C5.07 5.72 5.68 8.1 6.3 10.72C6.92 13.34 7.53 15.72 8.15 15.72C8.77 15.72 9.38 13.34 10 10.72C10.62 8.1 11.23 5.72 11.85 5.72C12.47 5.72 13.08 8.1 13.7 10.72C14.32 13.34 14.93 15.72 15.55 15.72C16.17 15.72 16.78 13.34 17.4 10.72L17.57 9.99L17.57 16.47L2.43 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveTriangleWave: `<path d=\"M2.15 11.32L2.6 10.72L6.3 5.72L13.7 15.72L17.4 10.72L17.85 10.12L17.85 16.47L2.15 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSquareWave: `<path d=\"M2.6 11.47L2.6 10.72L2.6 5.72L10 5.72L10 15.72L17.4 15.72L17.4 10.72L17.4 9.97L17.4 16.47L2.6 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSawtooth: `<path d=\"M1.98 11.14L2.6 10.72L10 5.72L10 15.72L17.4 10.72L18.02 10.3L18.02 16.47L1.98 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveStair: `<path d=\"M1.85 10.72L2.6 10.72L4.97 10.72L4.97 5.72L8.82 5.72L8.82 10.72L11.18 10.72L11.18 15.72L15.03 15.72L15.03 10.72L17.4 10.72L18.15 10.72L18.15 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curvePulseTrain: `<path d=\"M1.85 10.72L2.6 10.72L4.23 10.72L4.23 5.72L6.3 5.72L6.3 10.72L8.96 10.72L8.96 5.72L11.04 5.72L11.04 10.72L13.7 10.72L13.7 5.72L15.77 5.72L15.77 10.72L17.4 10.72L18.15 10.72L18.15 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveDamped: `<path d=\"M2.05 5.21L2.6 5.72C2.95 6.01 3.3 6.7 3.66 7.55C4.01 8.39 4.36 9.37 4.71 10.24C5.07 11.11 5.42 11.86 5.77 12.37C6.12 12.87 6.48 13.13 6.83 13.15C7.18 13.17 7.53 12.96 7.89 12.63C8.24 12.3 8.59 11.86 8.94 11.42C9.3 10.99 9.65 10.57 10 10.25C10.35 9.94 10.7 9.72 11.06 9.63C11.41 9.54 11.76 9.56 12.11 9.67C12.47 9.77 12.82 9.96 13.17 10.16C13.52 10.36 13.88 10.57 14.23 10.75C14.58 10.93 14.93 11.08 15.29 11.16C15.64 11.25 15.99 11.28 16.34 11.26C16.7 11.24 17.05 11.17 17.4 11.09L18.13 10.93L18.13 16.47L2.05 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveGaussian: `<path d=\"M1.87 15.88L2.6 15.72C3.13 15.57 4.98 15.47 5.78 14.83C6.57 14.18 6.92 12.87 7.35 11.84C7.79 10.8 7.97 9.62 8.41 8.6C8.85 7.58 9.47 5.72 10 5.72C10.53 5.72 11.15 7.58 11.59 8.6C12.03 9.62 12.21 10.8 12.65 11.84C13.08 12.87 13.43 14.18 14.22 14.83C15.02 15.47 16.87 15.57 17.4 15.72L18.13 15.88L18.13 16.47L1.87 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveBimodal: `<path d=\"M2.03 16.21L2.6 15.72C2.95 15.39 4.21 14.57 4.67 13.73C5.14 12.89 5.17 11.7 5.39 10.68C5.62 9.66 5.69 8.28 6 7.6C6.31 6.92 6.93 6.26 7.24 6.61C7.56 6.96 7.69 8.66 7.9 9.68C8.12 10.7 8.19 11.81 8.54 12.75C8.89 13.7 9.51 15.36 10 15.36C10.49 15.36 11.11 13.7 11.46 12.75C11.81 11.81 11.88 10.7 12.1 9.68C12.31 8.66 12.44 6.96 12.76 6.61C13.07 6.26 13.69 6.92 14 7.6C14.31 8.28 14.38 9.66 14.61 10.68C14.83 11.7 14.86 12.89 15.33 13.73C15.79 14.57 17.05 15.39 17.4 15.72L17.97 16.21L17.97 16.47L2.03 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSkewed: `<path d=\"M2.31 16.41L2.6 15.72C2.76 15.32 3.35 14.19 3.58 13.35C3.82 12.5 3.87 11.55 4.02 10.65C4.17 9.75 4.22 8.78 4.5 7.96C4.79 7.14 5.26 5.74 5.71 5.75C6.15 5.76 6.71 7.24 7.15 8.03C7.6 8.82 7.92 9.69 8.38 10.47C8.85 11.25 9.32 12.06 9.94 12.71C10.56 13.36 11.3 13.96 12.09 14.37C12.88 14.78 13.8 15.01 14.69 15.2C15.57 15.39 16.95 15.46 17.4 15.52L18.15 15.6L18.15 16.47L2.31 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveLorentzian: `<path d=\"M1.86 15.82L2.6 15.72C3.06 15.64 4.52 15.6 5.35 15.26C6.18 14.92 7.02 14.36 7.57 13.66C8.11 12.96 8.34 11.97 8.62 11.08C8.89 10.2 8.99 9.25 9.22 8.35C9.45 7.46 9.74 5.72 10 5.72C10.26 5.72 10.55 7.46 10.78 8.35C11.01 9.25 11.11 10.2 11.38 11.08C11.66 11.97 11.89 12.96 12.43 13.66C12.98 14.36 13.82 14.92 14.65 15.26C15.48 15.6 16.94 15.64 17.4 15.72L18.14 15.82L18.14 16.47L1.86 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveOgive: `<path d=\"M1.85 15.78L2.6 15.72C3.13 15.66 4.83 15.71 5.79 15.34C6.75 14.97 7.64 14.25 8.35 13.48C9.05 12.71 9.45 11.64 10 10.72C10.55 9.8 10.95 8.73 11.65 7.96C12.36 7.19 13.25 6.47 14.21 6.1C15.17 5.73 16.87 5.78 17.4 5.72L18.15 5.66L18.15 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveUniform: `<path d=\"M2.6 16.47L2.6 15.72V9.32A3.6 3.6 0 0 1 6.2 5.72H13.8A3.6 3.6 0 0 1 17.4 9.32V15.72L17.4 16.47L17.4 16.47L2.6 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSinc: `<path d=\"M1.92 16.04L2.6 15.72C2.83 15.6 3.61 15.35 4.01 15.02C4.4 14.69 4.68 14.18 4.96 13.72C5.25 13.27 5.49 12.78 5.73 12.3C5.97 11.82 6.19 11.33 6.42 10.84C6.65 10.35 6.86 9.86 7.1 9.37C7.33 8.89 7.55 8.39 7.82 7.93C8.08 7.46 8.32 6.93 8.69 6.57C9.05 6.2 9.56 5.72 10 5.72C10.44 5.72 10.95 6.2 11.31 6.57C11.68 6.93 11.92 7.46 12.18 7.93C12.45 8.39 12.67 8.89 12.9 9.37C13.14 9.86 13.35 10.35 13.58 10.84C13.81 11.33 14.03 11.82 14.27 12.3C14.51 12.78 14.75 13.27 15.04 13.72C15.32 14.18 15.6 14.69 15.99 15.02C16.39 15.35 17.17 15.6 17.4 15.72L18.08 16.04L18.08 16.47L1.92 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveImpulse: `<path d=\"M1.85 15.72L2.6 15.72L9.7 15.72L10 5.72L10.3 15.72L17.4 15.72L18.15 15.72L18.15 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveEaseIn: `<path d=\"M1.85 15.74L2.6 15.72C3.13 15.7 4.75 15.75 5.8 15.62C6.86 15.49 7.94 15.31 8.93 14.94C9.91 14.57 10.87 14.01 11.72 13.38C12.56 12.75 13.31 11.95 14 11.14C14.7 10.34 15.29 9.43 15.86 8.53C16.42 7.63 17.14 6.19 17.4 5.72L17.76 5.06L17.76 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveEaseOut: `<path d=\"M2.24 16.38L2.6 15.72C2.86 15.25 3.58 13.81 4.14 12.91C4.71 12.01 5.3 11.1 6 10.3C6.69 9.49 7.44 8.69 8.28 8.06C9.13 7.43 10.09 6.87 11.07 6.5C12.06 6.13 13.14 5.95 14.2 5.82C15.25 5.69 16.87 5.74 17.4 5.72L18.15 5.7L18.15 16.47L2.24 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveEaseInOut: `<path d=\"M1.85 15.75L2.6 15.72C3 15.69 4.23 15.75 4.99 15.55C5.75 15.36 6.53 15.01 7.16 14.55C7.79 14.09 8.32 13.43 8.79 12.8C9.26 12.16 9.6 11.41 10 10.72C10.4 10.03 10.74 9.28 11.21 8.64C11.68 8.01 12.21 7.35 12.84 6.89C13.47 6.43 14.25 6.08 15.01 5.89C15.77 5.69 17 5.75 17.4 5.72L18.15 5.69L18.15 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveOvershoot: `<path d=\"M2.32 16.42L2.6 15.72C2.76 15.33 3.2 14.15 3.54 13.39C3.88 12.62 4.24 11.86 4.64 11.13C5.05 10.4 5.48 9.67 6 9.02C6.51 8.36 7.06 7.7 7.72 7.19C8.37 6.69 9.14 6.25 9.92 6.01C10.7 5.77 11.57 5.73 12.4 5.73C13.23 5.73 14.07 5.92 14.9 6C15.73 6.08 16.98 6.18 17.4 6.22L18.15 6.29L18.15 16.47L2.32 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveBounce: `<path d=\"M2.46 16.46L2.6 15.72Q6 -4.28 9.41 15.72L9.55 16.46L9.55 16.47L2.46 16.47ZM9.21 16.44L9.41 15.72Q11.63 6.72 13.85 15.72L14.05 16.44L14.05 16.47L9.21 16.47ZM13.57 16.41L13.85 15.72Q15.18 12.12 16.51 15.72L16.79 16.41L16.79 16.47L13.57 16.47ZM16.17 16.39L16.51 15.72Q16.96 14.72 17.4 15.72L17.73 16.39L17.73 16.47L16.17 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveElastic: `<path d=\"M2.33 16.42L2.6 15.72C2.91 15.01 3.22 13.44 3.53 11.66C3.83 9.87 4.14 7.89 4.45 6.23C4.76 4.58 5.07 3.25 5.38 2.45C5.68 1.65 5.99 1.37 6.3 1.5C6.61 1.63 6.92 2.17 7.23 2.85C7.53 3.53 7.84 4.35 8.15 5.07C8.46 5.79 8.77 6.41 9.07 6.82C9.38 7.24 9.69 7.44 10 7.46C10.31 7.47 10.62 7.31 10.93 7.06C11.23 6.81 11.54 6.48 11.85 6.18C12.16 5.87 12.47 5.59 12.77 5.39C13.08 5.18 13.39 5.06 13.7 5.02C14.01 4.99 14.32 5.03 14.62 5.11C14.93 5.2 15.24 5.33 15.55 5.45C15.86 5.58 16.17 5.71 16.47 5.8C16.78 5.9 17.09 5.96 17.4 5.99L18.15 6.07L18.15 16.47L2.33 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveLemniscate: `<path d=\"M17.4 11.12C17.4 11.98 16.91 12.8 16.23 13.25C15.54 13.7 14.73 13.8 14.01 13.7C13.29 13.6 12.66 13.3 12.11 12.95C11.57 12.6 11.1 12.19 10.65 11.76C10.21 11.34 9.79 10.9 9.35 10.48C8.9 10.05 8.43 9.64 7.89 9.29C7.34 8.94 6.71 8.64 5.99 8.54C5.27 8.44 4.46 8.54 3.77 8.99C3.09 9.44 2.6 10.26 2.6 11.12C2.6 11.98 3.09 12.8 3.77 13.25C4.46 13.7 5.27 13.8 5.99 13.7C6.71 13.6 7.34 13.3 7.89 12.95C8.43 12.6 8.9 12.19 9.35 11.76C9.79 11.34 10.21 10.9 10.65 10.48C11.1 10.05 11.57 9.64 12.11 9.29C12.66 8.94 13.29 8.64 14.01 8.54C14.73 8.44 15.54 8.54 16.23 8.99C16.91 9.44 17.4 10.26 17.4 11.12\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveCardioid: `<path d=\"M10 6.14C10 6.14 10 6.09 10.03 6C10.06 5.91 10.13 5.78 10.24 5.63C10.36 5.48 10.54 5.31 10.77 5.16C11.01 5.01 11.32 4.88 11.68 4.8C12.04 4.72 12.45 4.69 12.91 4.74C13.36 4.79 13.84 4.92 14.32 5.15C14.8 5.38 15.27 5.71 15.7 6.14C16.12 6.56 16.5 7.08 16.79 7.69C17.08 8.29 17.28 8.96 17.36 9.68C17.44 10.4 17.4 11.15 17.23 11.9C17.06 12.65 16.76 13.39 16.33 14.07C15.9 14.75 15.35 15.37 14.7 15.89C14.05 16.41 13.3 16.82 12.5 17.1C11.7 17.38 10.85 17.53 10 17.53C9.15 17.53 8.3 17.38 7.5 17.1C6.7 16.82 5.95 16.41 5.3 15.89C4.65 15.37 4.1 14.75 3.67 14.07C3.24 13.39 2.94 12.65 2.77 11.9C2.6 11.15 2.56 10.4 2.64 9.68C2.72 8.96 2.92 8.29 3.21 7.69C3.5 7.08 3.88 6.56 4.3 6.14C4.73 5.71 5.2 5.38 5.68 5.15C6.16 4.92 6.64 4.79 7.09 4.74C7.55 4.69 7.96 4.72 8.32 4.8C8.68 4.88 8.99 5.01 9.23 5.16C9.46 5.31 9.64 5.48 9.76 5.63C9.87 5.78 9.94 5.91 9.97 6C10 6.09 10 6.14 10 6.14\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveAstroid: `<path d=\"M17.4 11.12C17.4 11.12 17.02 11.13 16.37 11.34C15.72 11.55 14.81 11.97 13.92 12.62C13.02 13.27 12.15 14.14 11.5 15.04C10.85 15.93 10.43 16.84 10.22 17.49C10.01 18.14 10 18.52 10 18.52C10 18.52 9.99 18.14 9.78 17.49C9.57 16.84 9.15 15.93 8.5 15.04C7.85 14.14 6.98 13.27 6.08 12.62C5.19 11.97 4.28 11.55 3.63 11.34C2.98 11.13 2.6 11.12 2.6 11.12C2.6 11.12 2.98 11.11 3.63 10.9C4.28 10.69 5.19 10.27 6.08 9.62C6.98 8.97 7.85 8.1 8.5 7.2C9.15 6.31 9.57 5.4 9.78 4.75C9.99 4.1 10 3.72 10 3.72C10 3.72 10.01 4.1 10.22 4.75C10.43 5.4 10.85 6.31 11.5 7.2C12.15 8.1 13.02 8.97 13.92 9.62C14.81 10.27 15.72 10.69 16.37 10.9C17.02 11.11 17.4 11.12 17.4 11.12\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveRose: `<path d=\"M16.57 11.12C16.57 11.49 16.32 11.85 15.86 12.13C15.4 12.42 14.72 12.61 13.9 12.66C13.08 12.71 12.13 12.61 11.13 12.35C10.14 12.09 9.11 11.67 8.16 11.12C7.21 10.57 6.33 9.89 5.61 9.16C4.89 8.43 4.32 7.65 3.96 6.92C3.59 6.18 3.42 5.5 3.43 4.96C3.44 4.42 3.64 4.02 3.96 3.84C4.27 3.65 4.71 3.68 5.19 3.94C5.66 4.2 6.17 4.69 6.62 5.38C7.07 6.06 7.47 6.94 7.74 7.93C8.01 8.92 8.16 10.02 8.16 11.12C8.16 12.22 8.01 13.32 7.74 14.31C7.47 15.3 7.07 16.18 6.62 16.86C6.17 17.55 5.66 18.04 5.19 18.3C4.71 18.56 4.27 18.59 3.96 18.4C3.64 18.22 3.44 17.82 3.43 17.28C3.42 16.74 3.59 16.06 3.96 15.32C4.32 14.59 4.89 13.81 5.61 13.08C6.33 12.35 7.21 11.67 8.16 11.12C9.11 10.57 10.14 10.15 11.13 9.89C12.13 9.63 13.08 9.53 13.9 9.58C14.72 9.63 15.4 9.82 15.86 10.11C16.32 10.39 16.57 10.75 16.57 11.12C16.57 11.49 16.32 11.85 15.86 12.13C15.4 12.42 14.72 12.61 13.9 12.66C13.08 12.71 12.13 12.61 11.13 12.35C10.14 12.09 9.11 11.67 8.16 11.12C7.21 10.57 6.33 9.89 5.61 9.16C4.89 8.43 4.32 7.65 3.96 6.92C3.59 6.18 3.42 5.5 3.43 4.96C3.44 4.42 3.64 4.02 3.96 3.84C4.27 3.65 4.71 3.68 5.19 3.94C5.66 4.2 6.17 4.69 6.62 5.38C7.07 6.06 7.47 6.94 7.74 7.93C8.01 8.92 8.16 10.02 8.16 11.12C8.16 12.22 8.01 13.32 7.74 14.31C7.47 15.3 7.07 16.18 6.62 16.86C6.17 17.55 5.66 18.04 5.19 18.3C4.71 18.56 4.27 18.59 3.96 18.4C3.64 18.22 3.44 17.82 3.43 17.28C3.42 16.74 3.59 16.06 3.96 15.32C4.32 14.59 4.89 13.81 5.61 13.08C6.33 12.35 7.21 11.67 8.16 11.12C9.11 10.57 10.14 10.15 11.13 9.89C12.13 9.63 13.08 9.53 13.9 9.58C14.72 9.63 15.4 9.82 15.86 10.11C16.32 10.39 16.57 10.75 16.57 11.12\" fill=\"currentColor\" stroke=\"none\" fill-rule=\"evenodd\"/>`,\n curveLissajous: `<path d=\"M10 11.12C11.66 12.23 13.32 13.33 14.61 14.33C15.91 15.33 16.84 16.22 17.21 16.91C17.58 17.6 17.39 18.09 16.67 18.33C15.95 18.58 14.71 18.58 13.21 18.33C11.71 18.09 9.97 17.6 8.35 16.91C6.73 16.22 5.25 15.33 4.21 14.33C3.18 13.33 2.6 12.23 2.6 11.12C2.6 10.01 3.18 8.91 4.21 7.91C5.25 6.91 6.73 6.02 8.35 5.33C9.97 4.64 11.71 4.15 13.21 3.91C14.71 3.66 15.95 3.66 16.67 3.91C17.39 4.15 17.58 4.64 17.21 5.33C16.84 6.02 15.91 6.91 14.61 7.91C13.32 8.91 11.66 10.01 10 11.12C8.34 12.23 6.68 13.33 5.39 14.33C4.09 15.33 3.16 16.22 2.79 16.91C2.42 17.6 2.61 18.09 3.33 18.33C4.05 18.58 5.29 18.58 6.79 18.33C8.29 18.09 10.03 17.6 11.65 16.91C13.27 16.22 14.75 15.33 15.79 14.33C16.82 13.33 17.4 12.23 17.4 11.12C17.4 10.01 16.82 8.91 15.79 7.91C14.75 6.91 13.27 6.02 11.65 5.33C10.03 4.64 8.29 4.15 6.79 3.91C5.29 3.66 4.05 3.66 3.33 3.91C2.61 4.15 2.42 4.64 2.79 5.33C3.16 6.02 4.09 6.91 5.39 7.91C6.68 8.91 8.34 10.01 10 11.12\" fill=\"currentColor\" stroke=\"none\" fill-rule=\"evenodd\"/>`,\n curveCycloid: `<path d=\"M2.59 16.47L2.6 15.72C2.6 15.72 2.6 15.49 2.66 15.05C2.71 14.61 2.82 13.98 3.03 13.22C3.23 12.46 3.53 11.59 3.94 10.72C4.36 9.85 4.88 8.98 5.49 8.22C6.11 7.46 6.82 6.83 7.59 6.39C8.36 5.95 9.18 5.72 10 5.72C10.82 5.72 11.64 5.95 12.41 6.39C13.18 6.83 13.89 7.46 14.51 8.22C15.12 8.98 15.64 9.85 16.06 10.72C16.47 11.59 16.77 12.46 16.97 13.22C17.18 13.98 17.29 14.61 17.34 15.05C17.4 15.49 17.4 15.72 17.4 15.72L17.41 16.47L17.41 16.47L2.59 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSuperellipse: `<path d=\"M17.4 11.12C17.4 14.45 17.38 12.98 17.34 13.46C17.31 13.94 17.25 14.34 17.17 14.69C17.1 15.05 17 15.37 16.89 15.66C16.78 15.94 16.64 16.21 16.49 16.44C16.34 16.68 16.16 16.9 15.97 17.09C15.78 17.28 15.56 17.46 15.32 17.61C15.09 17.76 14.82 17.9 14.54 18.01C14.25 18.12 13.93 18.22 13.57 18.29C13.22 18.37 12.82 18.43 12.34 18.46C11.86 18.5 13.33 18.52 10 18.52C6.67 18.52 8.14 18.5 7.66 18.46C7.18 18.43 6.78 18.37 6.43 18.29C6.07 18.22 5.75 18.12 5.46 18.01C5.18 17.9 4.91 17.76 4.68 17.61C4.44 17.46 4.22 17.28 4.03 17.09C3.84 16.9 3.66 16.68 3.51 16.44C3.36 16.21 3.22 15.94 3.11 15.66C3 15.37 2.9 15.05 2.83 14.69C2.75 14.34 2.69 13.94 2.66 13.46C2.62 12.98 2.6 14.45 2.6 11.12C2.6 7.79 2.62 9.26 2.66 8.78C2.69 8.3 2.75 7.9 2.83 7.55C2.9 7.19 3 6.87 3.11 6.58C3.22 6.3 3.36 6.03 3.51 5.8C3.66 5.56 3.84 5.34 4.03 5.15C4.22 4.96 4.44 4.78 4.68 4.63C4.91 4.48 5.18 4.34 5.46 4.23C5.75 4.12 6.07 4.02 6.43 3.95C6.78 3.87 7.18 3.81 7.66 3.78C8.14 3.74 6.67 3.72 10 3.72C13.33 3.72 11.86 3.74 12.34 3.78C12.82 3.81 13.22 3.87 13.57 3.95C13.93 4.02 14.25 4.12 14.54 4.23C14.82 4.34 15.09 4.48 15.32 4.63C15.56 4.78 15.78 4.96 15.97 5.15C16.16 5.34 16.34 5.56 16.49 5.8C16.64 6.03 16.78 6.3 16.89 6.58C17 6.87 17.1 7.19 17.17 7.55C17.25 7.9 17.31 8.3 17.34 8.78C17.38 9.26 17.4 7.79 17.4 11.12\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveArcsine: `<path d=\"M2.17 16.33L2.6 15.72C2.85 15.38 3.59 14.16 4.08 13.67C4.57 13.18 5.07 13.04 5.56 12.77C6.05 12.49 6.55 12.26 7.04 12.03C7.53 11.8 8.03 11.58 8.52 11.36C9.01 11.14 9.51 10.93 10 10.72C10.49 10.51 10.99 10.3 11.48 10.08C11.97 9.86 12.47 9.64 12.96 9.41C13.45 9.18 13.95 8.95 14.44 8.67C14.93 8.4 15.43 8.26 15.92 7.77C16.41 7.28 17.15 6.06 17.4 5.72L17.83 5.11L17.83 16.47L2.17 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeTriangle: `<path d=\"M10 3.59L17.4 16.41L2.6 16.41Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeRightTriangle: `<path d=\"M2.6 17.4L2.6 2.6L17.4 17.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeSquare: `<path d=\"M2.6 2.6L17.4 2.6L17.4 17.4L2.6 17.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeRectangle: `<path d=\"M2.6 5.37L17.4 5.37L17.4 14.63L2.6 14.63Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeDiamond: `<path d=\"M10 2.6L17.4 10L10 17.4L2.6 10Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeParallelogram: `<path d=\"M5.35 4.71L17.4 4.71L14.65 15.29L2.6 15.29Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeTrapezoid: `<path d=\"M5.35 4.71L14.65 4.71L17.4 15.29L2.6 15.29Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeKite: `<path d=\"M10 2.6L16.43 7.75L10 17.4L3.57 7.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapePentagon: `<path d=\"M10 2.96L17.4 8.34L14.57 17.04L5.43 17.04L2.6 8.34Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeHexagon: `<path d=\"M10 2.6L16.41 6.3L16.41 13.7L10 17.4L3.59 13.7L3.59 6.3Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeHexagonFlat: `<path d=\"M17.4 10L13.7 16.41L6.3 16.41L2.6 10L6.3 3.59L13.7 3.59Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeHeptagon: `<path d=\"M10 2.79L15.93 5.64L17.4 12.06L13.29 17.21L6.71 17.21L2.6 12.06L4.07 5.64Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeOctagon: `<path d=\"M13.07 2.6L17.4 6.93L17.4 13.07L13.07 17.4L6.93 17.4L2.6 13.07L2.6 6.93L6.93 2.6Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeDecagon: `<path d=\"M10 2.6L14.35 4.01L17.04 7.71L17.04 12.29L14.35 15.99L10 17.4L5.65 15.99L2.96 12.29L2.96 7.71L5.65 4.01Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeDodecagon: `<path d=\"M10 2.6L13.7 3.59L16.41 6.3L17.4 10L16.41 13.7L13.7 16.41L10 17.4L6.3 16.41L3.59 13.7L2.6 10L3.59 6.3L6.3 3.59Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeCross: `<path d=\"M7.63 2.6L12.37 2.6L12.37 7.63L17.4 7.63L17.4 12.37L12.37 12.37L12.37 17.4L7.63 17.4L7.63 12.37L2.6 12.37L2.6 7.63L7.63 7.63Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeLShape: `<path d=\"M2.6 2.6L8.82 2.6L8.82 11.78L17.4 11.78L17.4 17.4L2.6 17.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeChevron: `<path d=\"M2.6 4.38L10 10.59L17.4 4.38L17.4 9.41L10 15.62L2.6 9.41Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeStar: `<path d=\"M10 2.96L12.2 7.72L17.4 8.34L13.55 11.9L14.57 17.04L10 14.48L5.43 17.04L6.45 11.9L2.6 8.34L7.8 7.72Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeStar4: `<path d=\"M10 2.6L11.99 8.01L17.4 10L11.99 11.99L10 17.4L8.01 11.99L2.6 10L8.01 8.01Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeStar6: `<path d=\"M10 2.6L12.07 6.41L16.41 6.3L14.14 10L16.41 13.7L12.07 13.59L10 17.4L7.93 13.59L3.59 13.7L5.86 10L3.59 6.3L7.93 6.41Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeStar8: `<path d=\"M10 2.6L11.76 5.76L15.23 4.77L14.24 8.24L17.4 10L14.24 11.76L15.23 15.23L11.76 14.24L10 17.4L8.24 14.24L4.77 15.23L5.76 11.76L2.6 10L5.76 8.24L4.77 4.77L8.24 5.76Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapePentagram: `<path d=\"M10 2.96L14.57 17.04L2.6 8.34L17.4 8.34L5.43 17.04Z\" fill=\"currentColor\" stroke=\"none\" fill-rule=\"evenodd\"/>`,\n shapeCircle: `<path d=\"M2.6 10A7.4 7.4 0 1 1 17.4 10A7.4 7.4 0 1 1 2.6 10Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeEllipse: `<path d=\"M2.6 10A7.4 4.74 0 1 1 17.4 10A7.4 4.74 0 1 1 2.6 10Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeSemicircle: `<path d=\"M2.6 13.7A7.4 7.4 0 0 1 17.4 13.7Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeQuarter: `<path d=\"M2.6 17.4V2.6A14.8 14.8 0 0 1 17.4 17.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeStadium: `<path d=\"M6.74 5.86H13.26A4.14 4.14 0 0 1 13.26 14.14H6.74A4.14 4.14 0 0 1 6.74 5.86Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeRoundedSquare: `<path d=\"M6 2.6H14A3.4 3.4 0 0 1 17.4 6V14A3.4 3.4 0 0 1 14 17.4H6A3.4 3.4 0 0 1 2.6 14V6A3.4 3.4 0 0 1 6 2.6Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeRing: `<path d=\"M2.6 10A7.4 7.4 0 1 1 17.4 10A7.4 7.4 0 1 1 2.6 10ZM6.15 10A3.85 3.85 0 1 0 13.85 10A3.85 3.85 0 1 0 6.15 10Z\" fill=\"currentColor\" stroke=\"none\" fill-rule=\"evenodd\"/>`,\n shapeCrescent: `<path d=\"M6.3 2.6A7.4 7.4 0 1 1 6.3 17.4A8.51 8.51 0 0 0 6.3 2.6Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeLens: `<path d=\"M10 2.6A9.99 9.99 0 0 1 10 17.4A9.99 9.99 0 0 1 10 2.6Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeSector: `<path d=\"M10 14.63L2.6 9.06A9.27 9.27 0 0 1 17.4 9.06Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeSegment: `<path d=\"M2.6 12.59A7.88 7.88 0 0 1 17.4 12.59Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeArch: `<path d=\"M2.6 17.4V10A7.4 7.4 0 0 1 17.4 10V17.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeTeardrop: `<path d=\"M10 2.6L5.9 10.75A4.59 4.59 0 1 0 14.1 10.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeEgg: `<path d=\"M10 2.6C14.59 2.6 16.07 9.26 16.07 12.22C16.07 15.77 13.26 17.4 10 17.4C6.74 17.4 3.93 15.77 3.93 12.22C3.93 9.26 5.41 2.6 10 2.6Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeHeart: `<path d=\"M10 6.51L10.01 6.42L10.05 6.16L10.18 5.76L10.41 5.26L10.78 4.72L11.27 4.2L11.89 3.76L12.62 3.45L13.42 3.31L14.25 3.36L15.08 3.61L15.84 4.03L16.48 4.62L16.98 5.33L17.29 6.12L17.4 6.97L17.29 7.84L16.98 8.7L16.48 9.54L15.84 10.34L15.08 11.12L14.25 11.86L13.42 12.57L12.62 13.27L11.89 13.93L11.27 14.56L10.78 15.14L10.41 15.66L10.18 16.09L10.05 16.41L10.01 16.62L10 16.69L9.99 16.62L9.95 16.41L9.82 16.09L9.59 15.66L9.22 15.14L8.73 14.56L8.11 13.93L7.38 13.27L6.58 12.57L5.75 11.86L4.92 11.12L4.16 10.34L3.52 9.54L3.02 8.7L2.71 7.84L2.6 6.97L2.71 6.12L3.02 5.33L3.52 4.62L4.16 4.03L4.92 3.61L5.75 3.36L6.58 3.31L7.38 3.45L8.11 3.76L8.73 4.2L9.22 4.72L9.59 5.26L9.82 5.76L9.95 6.16L9.99 6.42L10 6.51Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeAngle: `<path d=\"M2.6 16.34L17.4 16.34L14.8 3.66Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n d4: `<path d=\"M2.6 14.47L10 3.31L17.4 14.47L10 16.69Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n d6: `<path d=\"M3.59 6.3L10 2.6L16.41 6.3L16.41 13.7L10 17.4L3.59 13.7Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n d8: `<path d=\"M2.85 9.6L10 2.6L17.15 10.4L10 17.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n d12: `<path d=\"M2.96 7.71L5.65 4.01L10 2.6L14.35 4.01L17.04 7.71L17.04 12.29L14.35 15.99L10 17.4L5.65 15.99L2.96 12.29Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n d20: `<path d=\"M3.59 13.7L3.59 6.3L10 2.6L16.41 6.3L16.41 13.7L10 17.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n} as const;\n\n/** The glyphs `<Icon filled>` can shade. */\nexport type FillableIconName = keyof typeof ICON_FILLS;\n\n/** Every glyph in `ICON_PATHS`, once, sorted into the families it was drawn in. */\nexport const ICON_GROUPS: readonly { label: string; names: readonly IconName[] }[] = [\n {\n label: 'View and lifecycle',\n names: [\n 'clone',\n 'reset',\n 'close',\n 'export',\n 'zoomIn',\n 'zoomOut',\n 'fit',\n 'pan',\n ],\n },\n {\n label: 'Actions',\n names: [\n 'filter',\n 'add',\n 'remove',\n 'delete',\n 'sort',\n 'undo',\n 'redo',\n 'snapshot',\n ],\n },\n {\n label: 'Playback',\n names: [\n 'play',\n 'pause',\n 'stop',\n 'stepBack',\n 'stepForward',\n ],\n },\n {\n label: 'State',\n names: [\n 'lock',\n 'unlock',\n 'visible',\n 'hidden',\n 'pin',\n 'info',\n 'warning',\n 'error',\n 'busy',\n 'modeLight',\n 'modeDark',\n 'modeAuto',\n ],\n },\n {\n label: 'Instrument',\n names: [\n 'crosshair',\n 'fullscreen',\n 'compare',\n 'search',\n 'loupe',\n 'layers',\n 'link',\n 'collapse',\n 'expand',\n 'chevron',\n 'tune',\n 'grid',\n 'snap',\n 'measure',\n 'randomize',\n 'refresh',\n ],\n },\n {\n label: 'Stroke cap, join, align and dash',\n names: [\n 'strokeWidth',\n 'strokeCap',\n 'strokeJoin',\n 'strokeAlign',\n 'capButt',\n 'capRound',\n 'capSquare',\n 'joinMiter',\n 'joinRound',\n 'joinBevel',\n 'alignInner',\n 'alignCenter',\n 'alignOuter',\n 'dashSolid',\n 'dashDashed',\n 'dashDotted',\n 'dashCustom',\n 'paintSolid',\n 'paintLinear',\n 'paintRadial',\n 'paintConic',\n 'paintMesh',\n 'paintPattern',\n 'paintNone',\n ],\n },\n {\n label: 'Workspace layout',\n names: [\n 'layoutRows',\n 'layoutColumns',\n 'layoutGrid',\n ],\n },\n {\n label: 'Arc profiles',\n names: [\n 'arcStraight',\n 'arcParabola',\n 'arcCircle',\n 'arcSine',\n 'arcBump',\n 'arcPlateau',\n 'arcBell',\n 'arcEllipse',\n 'arcLob',\n 'arcDive',\n 'arcTriangle',\n 'arcSquare',\n 'arcSawtooth',\n 'arcStair',\n 'arcZigzag',\n 'arcRipple',\n 'arcHop',\n 'arcCusp',\n ],\n },\n {\n label: 'Curves',\n names: [\n 'curveLine',\n 'curveParabola',\n 'curveCircle',\n 'curveEllipse',\n 'curveHyperbola',\n 'curveHyperbolaPair',\n 'curveCubic',\n 'curveQuartic',\n 'curveSqrt',\n 'curveReciprocal',\n 'curveAbs',\n 'curveCusp',\n 'curveExponential',\n 'curveLogarithm',\n 'curveDecay',\n 'curveSigmoid',\n 'curveSoftplus',\n 'curveRelu',\n 'curveStep',\n 'curvePowerLaw',\n 'curveCatenary',\n 'curveBathtub',\n 'curveHockeyStick',\n 'curveSine',\n 'curveCosine',\n 'curveRipple',\n 'curveTriangleWave',\n 'curveSquareWave',\n 'curveSawtooth',\n 'curveStair',\n 'curvePulseTrain',\n 'curveDamped',\n 'curveChirp',\n 'curveBeat',\n 'curveGaussian',\n 'curveBimodal',\n 'curveSkewed',\n 'curveLorentzian',\n 'curveOgive',\n 'curveUniform',\n 'curveSinc',\n 'curveImpulse',\n 'curveEaseIn',\n 'curveEaseOut',\n 'curveEaseInOut',\n 'curveOvershoot',\n 'curveBounce',\n 'curveElastic',\n 'curveLemniscate',\n 'curveCardioid',\n 'curveAstroid',\n 'curveRose',\n 'curveSpiral',\n 'curveLissajous',\n 'curveCycloid',\n 'curveSuperellipse',\n 'curveTangent',\n 'curveCotangent',\n 'curveSecant',\n 'curveCosecant',\n 'curveArcsine',\n 'curveAsymptote',\n ],\n },\n {\n label: 'Shapes',\n names: [\n 'shapeTriangle',\n 'shapeRightTriangle',\n 'shapeSquare',\n 'shapeRectangle',\n 'shapeDiamond',\n 'shapeParallelogram',\n 'shapeTrapezoid',\n 'shapeKite',\n 'shapePentagon',\n 'shapeHexagon',\n 'shapeHexagonFlat',\n 'shapeHeptagon',\n 'shapeOctagon',\n 'shapeDecagon',\n 'shapeDodecagon',\n 'shapeCross',\n 'shapeLShape',\n 'shapeChevron',\n 'shapeStar',\n 'shapeStar4',\n 'shapeStar6',\n 'shapeStar8',\n 'shapePentagram',\n 'shapeCircle',\n 'shapeEllipse',\n 'shapeSemicircle',\n 'shapeQuarter',\n 'shapeStadium',\n 'shapeRoundedSquare',\n 'shapeRing',\n 'shapeCrescent',\n 'shapeLens',\n 'shapeSector',\n 'shapeSegment',\n 'shapeArch',\n 'shapeTeardrop',\n 'shapeEgg',\n 'shapeHeart',\n 'shapeAngle',\n ],\n },\n {\n label: 'Platonic solids',\n names: [\n 'd4',\n 'd6',\n 'd8',\n 'd12',\n 'd20',\n ],\n },\n];\n","import type { SVGProps } from 'react';\nimport { ICON_FILLS, ICON_PATHS, type FillableIconName, type IconName } from './paths';\n\n/** Shared prop shape for the icon set. Color comes from the surrounding\n * `color` CSS property — every glyph strokes in `currentColor`. */\nexport interface IconProps {\n className?: string;\n /** Rendered pixel size, applied to both width and height. Defaults to 20. */\n size?: number;\n /** Accessible name. Omit inside a button that already labels itself; the\n * glyph is then `aria-hidden`. */\n label?: string;\n /** Shade the region the glyph encloses, in the same `currentColor` at\n * `fillOpacity`. Ignored by a glyph with no enclosed region — a spiral, or a\n * function with poles — so a caller can set it across a set without checking. */\n filled?: boolean;\n /** Tint strength for `filled`. */\n fillOpacity?: number;\n}\n\n/** True when `filled` will shade this glyph. */\nexport const isFillable = (name: IconName): name is FillableIconName => name in ICON_FILLS;\n\nconst SVG_BASE: SVGProps<SVGSVGElement> = {\n viewBox: '0 0 20 20',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n\n/** Renders one glyph by name. The named components below are the usual way\n * in; reach for this when the glyph is chosen at runtime. */\nexport function Icon({\n name,\n className,\n size = 20,\n label,\n filled = false,\n fillOpacity = 0.16,\n}: IconProps & { name: IconName }) {\n const shade = filled && isFillable(name) ? ICON_FILLS[name] : '';\n return (\n <svg\n {...SVG_BASE}\n className={className}\n width={size}\n height={size}\n // The shade is drawn first so the stroke sits on top of it, and the tint\n // rides on the root: the stroked paths inherit `fill=\"none\"`, so a fill\n // opacity here reaches only the shade.\n fillOpacity={shade ? fillOpacity : undefined}\n role={label ? 'img' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n // Glyph bodies are generated from scripts/icons/ and contain no\n // interpolated input.\n dangerouslySetInnerHTML={{ __html: shade + ICON_PATHS[name] }}\n />\n );\n}\n","import { Icon, type IconProps } from './Icon';\n\nexport { Icon, isFillable } from './Icon';\nexport type { IconProps } from './Icon';\nexport { ICON_FILLS, ICON_GROUPS, ICON_PATHS } from './paths';\nexport type { FillableIconName, IconName } from './paths';\n\n// Tool glyphs live in @weasel-js/core because core needs them for\n// `Tool.presentation.icon` defaults and cannot depend on this package.\n// Re-exported here so consumers have one import site for the whole set.\nexport {\n SelectIcon, LassoIcon, RectIcon, EllipseIcon, ImageIcon, EyedropperIcon,\n LineIcon, ArrowIcon, PolygonIcon, StarIcon, PencilIcon, TextIcon, PenIcon, HandIcon,\n UnknownIcon,\n} from '@weasel-js/core';\n\nexport const CloneIcon = (p: IconProps) => <Icon name=\"clone\" {...p} />;\nexport const ResetIcon = (p: IconProps) => <Icon name=\"reset\" {...p} />;\nexport const CloseIcon = (p: IconProps) => <Icon name=\"close\" {...p} />;\nexport const ExportIcon = (p: IconProps) => <Icon name=\"export\" {...p} />;\nexport const ZoomInIcon = (p: IconProps) => <Icon name=\"zoomIn\" {...p} />;\nexport const PanIcon = (p: IconProps) => <Icon name=\"pan\" {...p} />;\nexport const AddIcon = (p: IconProps) => <Icon name=\"add\" {...p} />;\nexport const ModeLightIcon = (p: IconProps) => <Icon name=\"modeLight\" {...p} />;\nexport const ModeDarkIcon = (p: IconProps) => <Icon name=\"modeDark\" {...p} />;\nexport const ModeAutoIcon = (p: IconProps) => <Icon name=\"modeAuto\" {...p} />;\nexport const RemoveIcon = (p: IconProps) => <Icon name=\"remove\" {...p} />;\nexport const DeleteIcon = (p: IconProps) => <Icon name=\"delete\" {...p} />;\nexport const SortIcon = (p: IconProps) => <Icon name=\"sort\" {...p} />;\nexport const UndoIcon = (p: IconProps) => <Icon name=\"undo\" {...p} />;\nexport const RedoIcon = (p: IconProps) => <Icon name=\"redo\" {...p} />;\nexport const ZoomOutIcon = (p: IconProps) => <Icon name=\"zoomOut\" {...p} />;\nexport const FitIcon = (p: IconProps) => <Icon name=\"fit\" {...p} />;\nexport const SnapshotIcon = (p: IconProps) => <Icon name=\"snapshot\" {...p} />;\nexport const PlayIcon = (p: IconProps) => <Icon name=\"play\" {...p} />;\nexport const PauseIcon = (p: IconProps) => <Icon name=\"pause\" {...p} />;\nexport const StopIcon = (p: IconProps) => <Icon name=\"stop\" {...p} />;\nexport const StepBackIcon = (p: IconProps) => <Icon name=\"stepBack\" {...p} />;\nexport const StepForwardIcon = (p: IconProps) => <Icon name=\"stepForward\" {...p} />;\n/** @deprecated Use {@link StepForwardIcon}; `step` alone stopped naming a direction. */\nexport const StepIcon = StepForwardIcon;\nexport const CrosshairIcon = (p: IconProps) => <Icon name=\"crosshair\" {...p} />;\nexport const FullscreenIcon = (p: IconProps) => <Icon name=\"fullscreen\" {...p} />;\nexport const CompareIcon = (p: IconProps) => <Icon name=\"compare\" {...p} />;\nexport const FilterIcon = (p: IconProps) => <Icon name=\"filter\" {...p} />;\nexport const SearchIcon = (p: IconProps) => <Icon name=\"search\" {...p} />;\nexport const LoupeIcon = (p: IconProps) => <Icon name=\"loupe\" {...p} />;\nexport const LayersIcon = (p: IconProps) => <Icon name=\"layers\" {...p} />;\nexport const LockIcon = (p: IconProps) => <Icon name=\"lock\" {...p} />;\nexport const UnlockIcon = (p: IconProps) => <Icon name=\"unlock\" {...p} />;\nexport const VisibleIcon = (p: IconProps) => <Icon name=\"visible\" {...p} />;\nexport const HiddenIcon = (p: IconProps) => <Icon name=\"hidden\" {...p} />;\nexport const PinIcon = (p: IconProps) => <Icon name=\"pin\" {...p} />;\nexport const LinkIcon = (p: IconProps) => <Icon name=\"link\" {...p} />;\nexport const CollapseIcon = (p: IconProps) => <Icon name=\"collapse\" {...p} />;\nexport const ExpandIcon = (p: IconProps) => <Icon name=\"expand\" {...p} />;\nexport const ChevronIcon = (p: IconProps) => <Icon name=\"chevron\" {...p} />;\nexport const TuneIcon = (p: IconProps) => <Icon name=\"tune\" {...p} />;\nexport const GridIcon = (p: IconProps) => <Icon name=\"grid\" {...p} />;\nexport const SnapIcon = (p: IconProps) => <Icon name=\"snap\" {...p} />;\nexport const MeasureIcon = (p: IconProps) => <Icon name=\"measure\" {...p} />;\nexport const RandomizeIcon = (p: IconProps) => <Icon name=\"randomize\" {...p} />;\nexport const RefreshIcon = (p: IconProps) => <Icon name=\"refresh\" {...p} />;\nexport const InfoIcon = (p: IconProps) => <Icon name=\"info\" {...p} />;\nexport const WarningIcon = (p: IconProps) => <Icon name=\"warning\" {...p} />;\nexport const ErrorIcon = (p: IconProps) => <Icon name=\"error\" {...p} />;\nexport const BusyIcon = (p: IconProps) => <Icon name=\"busy\" {...p} />;\nexport const LayoutRowsIcon = (p: IconProps) => <Icon name=\"layoutRows\" {...p} />;\nexport const LayoutColumnsIcon = (p: IconProps) => <Icon name=\"layoutColumns\" {...p} />;\nexport const LayoutGridIcon = (p: IconProps) => <Icon name=\"layoutGrid\" {...p} />;\n","import { useRef, type KeyboardEvent as ReactKeyboardEvent, type RefObject } from 'react';\n\n/** The only thing the hook needs to know about a bar's items: which are\n * skipped by arrow navigation. */\nexport type RovingItem = { disabled?: boolean };\n\n/** Options for {@link useRovingTabIndex}. */\nexport type UseRovingTabIndexOptions = {\n /** In the same order as the elements carrying `itemClassName`. */\n items: readonly RovingItem[];\n /** Class on the focusable element of each item, inside the container the\n * returned `rootRef` is attached to. Their DOM order must match `items`. */\n itemClassName: string;\n /** Index that carries `tabIndex=0`. Defaults to the first enabled item; a\n * radiogroup-style bar passes its selected index so Tab lands on the\n * current value. */\n tabStopIndex?: number;\n /** Called with the new index as arrow/Home/End focus moves, before focus\n * moves. This is where a selection-follows-focus bar commits the value. */\n onNavigate?: (index: number) => void;\n /** Space/Enter on the item at `index`. When omitted the keypress is left\n * alone, which on a native `<button>` produces an ordinary click. */\n onActivate?: (index: number) => void;\n};\n\n/**\n * What {@link useRovingTabIndex} returns: a container ref plus the per-item\n * `tabIndex` and `onKeyDown` values to spread onto each item.\n */\nexport type RovingTabIndex<T extends HTMLElement = HTMLDivElement> = {\n /** Attach to the container element that holds the items. */\n rootRef: RefObject<T | null>;\n /** `tabIndex` value for the item at `index`. */\n tabIndexFor: (index: number) => 0 | -1;\n /** `onKeyDown` for the item at `index`. */\n onKeyDown: (index: number) => (e: ReactKeyboardEvent<HTMLElement>) => void;\n};\n\nfunction firstEnabledIndex(items: readonly RovingItem[]): number {\n for (let i = 0; i < items.length; i++) if (!items[i].disabled) return i;\n return -1;\n}\n\nfunction lastEnabledIndex(items: readonly RovingItem[]): number {\n for (let i = items.length - 1; i >= 0; i--) if (!items[i].disabled) return i;\n return -1;\n}\n\nfunction nextEnabledIndex(items: readonly RovingItem[], from: number): number {\n const n = items.length;\n for (let k = 1; k <= n; k++) {\n const i = (from + k + n) % n;\n if (!items[i].disabled) return i;\n }\n return from;\n}\n\nfunction prevEnabledIndex(items: readonly RovingItem[], from: number): number {\n const n = items.length;\n for (let k = 1; k <= n; k++) {\n const i = (from - k + n) % n;\n if (!items[i].disabled) return i;\n }\n return from;\n}\n\n/**\n * Roving tabindex for a bar of items: one item is in the tab order, and the\n * arrow keys move focus among the rest, skipping disabled ones and wrapping\n * at both ends. Home and End go to the first and last enabled item. Both axes\n * navigate, so the same bar works laid out either way.\n *\n * Backs `ActionsBar`, `OptionsBar`, and `ToggleBar`.\n *\n * **When a bar should not use this.** Only when the bar owns its items. A\n * container of arbitrary compound controls — a number field, a select, a\n * color field — must leave the arrow keys alone, because those controls edit\n * their own value with them; taking the arrows over would break the control\n * to navigate between controls. `ToolOptionsBar` is that case and keeps plain\n * DOM tab order. A bar whose items are all simple buttons is the case this\n * hook is for.\n *\n * With every item disabled there is no tab stop and the bar drops out of the\n * tab order entirely.\n */\nexport function useRovingTabIndex<T extends HTMLElement = HTMLDivElement>(\n options: UseRovingTabIndexOptions,\n): RovingTabIndex<T> {\n const { items, itemClassName, onNavigate, onActivate } = options;\n const rootRef = useRef<T | null>(null);\n\n const tabStopIndex = options.tabStopIndex ?? firstEnabledIndex(items);\n\n const focusItem = (index: number): void => {\n const root = rootRef.current;\n if (!root) return;\n const elements = root.querySelectorAll<HTMLElement>(`.${itemClassName}`);\n elements[index]?.focus();\n };\n\n const onKeyDown = (index: number) => (e: ReactKeyboardEvent<HTMLElement>): void => {\n let nextIndex = -1;\n switch (e.key) {\n case 'ArrowLeft':\n case 'ArrowUp':\n nextIndex = prevEnabledIndex(items, index);\n break;\n case 'ArrowRight':\n case 'ArrowDown':\n nextIndex = nextEnabledIndex(items, index);\n break;\n case 'Home':\n nextIndex = firstEnabledIndex(items);\n break;\n case 'End':\n nextIndex = lastEnabledIndex(items);\n break;\n case ' ':\n case 'Enter':\n if (onActivate) {\n e.preventDefault();\n onActivate(index);\n }\n return;\n default:\n return;\n }\n if (nextIndex < 0 || nextIndex === index) return;\n e.preventDefault();\n onNavigate?.(nextIndex);\n focusItem(nextIndex);\n };\n\n return {\n rootRef,\n tabIndexFor: (index: number) => (index === tabStopIndex ? 0 : -1),\n onKeyDown,\n };\n}\n","import { type CSSProperties, type ReactElement, type ReactNode } from 'react';\nimport s from './ToggleBar.module.css';\nimport { useRovingTabIndex } from '../../useRovingTabIndex';\n\n/** One segment of a {@link ToggleBar}, identified by its `value`. */\nexport type ToggleBarItem<V extends string | number = string> = {\n value: V;\n label?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n};\n\n/** Segment height and type scale for a {@link ToggleBar}. */\nexport type ToggleBarSize = 'sm' | 'md';\n/** Visual treatment of a {@link ToggleBar}. */\nexport type ToggleBarVariant = 'default' | 'minimal' | 'flat';\n\ntype CommonProps = {\n ariaLabel?: string;\n className?: string;\n height?: number;\n /** Size variant. `sm` is ~60% of the default height with reduced padding\n * and font size — sized for dense surfaces like lab control panels. */\n size?: ToggleBarSize;\n /** Visual variant. `minimal` strips the pill track and glass treatment;\n * selection becomes a flat accent. For dense diagnostic surfaces. */\n variant?: ToggleBarVariant;\n};\n\n/**\n * Props for {@link ToggleBar}, discriminated on `mode`. Single mode is\n * controlled by one value or `null`; multiple mode by an array, and only it\n * accepts `mixedValues`.\n */\nexport type ToggleBarProps<V extends string | number = string> =\n | (CommonProps & {\n mode?: 'single';\n items: readonly ToggleBarItem<V>[];\n value: V | null;\n onChange: (next: V | null) => void;\n allowDeselect?: boolean;\n })\n | (CommonProps & {\n mode: 'multiple';\n items: readonly ToggleBarItem<V>[];\n value: readonly V[];\n /**\n * Values that are neither on nor off — the sources this bar\n * aggregates disagree (a text range that is bold in part of it, a\n * multi-selection whose nodes differ). Rendered `aria-pressed=\"mixed\"`,\n * the ARIA tri-state a toggle button actually has, rather than\n * `SelectionPanel`'s reduced-opacity-plus-`title` workaround for\n * `Switch`, which has no indeterminate state to render.\n *\n * `value` wins where the two lists overlap, so a caller that can't\n * cheaply keep them disjoint doesn't get an ambiguous segment.\n *\n * Clicking a mixed segment turns it fully **on**, matching the\n * everywhere-else convention (and `toggleFlagInRange`'s rule for a\n * partially-styled text range) that a mixed toggle resolves toward\n * the affirmative rather than clearing.\n */\n mixedValues?: readonly V[];\n onChange: (next: V[]) => void;\n });\n\n/**\n * Segmented control for choosing among a fixed set of values — one of them\n * (`mode: 'single'`, the default) or any number (`mode: 'multiple'`).\n *\n * Single mode ignores a click on the already-selected segment unless\n * `allowDeselect` is set. Arrow keys move focus without changing the value;\n * Space and Enter commit.\n */\nexport function ToggleBar<V extends string | number = string>(props: ToggleBarProps<V>): ReactElement {\n const { items, ariaLabel, className, height, size, variant } = props;\n const mode = props.mode ?? 'single';\n\n const isSelected = (value: V): boolean => {\n if (mode === 'multiple') return (props.value as readonly V[]).includes(value);\n return (props.value as V | null) === value;\n };\n\n /** Mixed only in multiple mode, and only where `value` doesn't already\n * claim the segment. Single mode has nothing to be mixed about — its\n * aggregate is one value or none. */\n const isMixed = (value: V): boolean => {\n if (mode !== 'multiple') return false;\n const mixed = (props as { mixedValues?: readonly V[] }).mixedValues;\n return mixed !== undefined && mixed.includes(value) && !isSelected(value);\n };\n\n const handleClick = (index: number) => () => {\n const item = items[index];\n if (item.disabled) return;\n if (mode === 'multiple') {\n const current = props.value as readonly V[];\n const next = current.includes(item.value)\n ? current.filter(v => v !== item.value)\n : [...current, item.value];\n (props.onChange as (n: V[]) => void)(next);\n } else {\n const current = props.value as V | null;\n if (current === item.value) {\n if ((props as { allowDeselect?: boolean }).allowDeselect) {\n (props.onChange as (n: V | null) => void)(null);\n }\n return;\n }\n (props.onChange as (n: V | null) => void)(item.value);\n }\n };\n\n const selectedIndex = mode === 'single'\n ? items.findIndex(it => it.value === (props.value as V | null))\n : -1;\n\n const roving = useRovingTabIndex({\n items,\n itemClassName: s.segment,\n // Single mode is a radiogroup: the tab stop is the current value, and\n // arrow keys move the selection with the focus. Multiple mode is a set of\n // independent toggles — focus alone moves, and Space/Enter flips.\n tabStopIndex: selectedIndex >= 0 && !items[selectedIndex].disabled ? selectedIndex : undefined,\n onNavigate: mode === 'single'\n ? (index) => (props.onChange as (n: V | null) => void)(items[index].value)\n : undefined,\n onActivate: mode === 'multiple' ? (index) => handleClick(index)() : undefined,\n });\n\n const style: CSSProperties | undefined = height !== undefined\n ? ({ ['--tb-h' as string]: `${height}px` } as CSSProperties)\n : undefined;\n\n const rootCls = [\n s.root,\n size && s[`size_${size}`],\n variant && s[`variant_${variant}`],\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <div\n ref={roving.rootRef}\n className={rootCls}\n role={mode === 'multiple' ? 'group' : 'radiogroup'}\n aria-label={ariaLabel}\n style={style}\n >\n {items.map((item, i) => {\n const selected = isSelected(item.value);\n const mixed = isMixed(item.value);\n const cls = [s.segment, selected && s.segmentSelected, mixed && s.segmentMixed]\n .filter(Boolean)\n .join(' ');\n return (\n <button\n key={item.value}\n type=\"button\"\n role={mode === 'multiple' ? undefined : 'radio'}\n aria-checked={mode === 'multiple' ? undefined : selected}\n aria-pressed={mode === 'multiple' ? (mixed ? 'mixed' : selected) : undefined}\n aria-label={item.ariaLabel}\n disabled={item.disabled}\n tabIndex={roving.tabIndexFor(i)}\n className={cls}\n onClick={handleClick(i)}\n onKeyDown={roving.onKeyDown(i)}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n );\n}\n","/**\n * Display-formatter for numbers. Use this anywhere a number is shown to\n * a user. The whole point: negative values get prefixed with the real\n * MINUS SIGN (U+2212) instead of the ASCII HYPHEN-MINUS (U+002D) that\n * `toLocaleString` and template literals produce by default.\n *\n * U+2212 is the same visual width as `+` and reads as a sign rather\n * than a hyphen — columns of signed numbers align cleanly and the\n * glyph doesn't get confused with a bullet or list dash.\n */\nexport const MINUS_SIGN = '−';\n\n/**\n * Formats a number for display, substituting {@link MINUS_SIGN} for the ASCII\n * hyphen `toLocaleString` emits. Non-finite values stringify as-is.\n */\nexport function formatNumber(value: number, options?: Intl.NumberFormatOptions): string {\n const formatted = Number.isFinite(value)\n ? value.toLocaleString(undefined, options)\n : String(value);\n return formatted.replace(/^-/, MINUS_SIGN);\n}\n\n/**\n * Parses a string that may carry {@link MINUS_SIGN} in place of the ASCII\n * hyphen. The inverse of {@link formatNumber} for any editing surface that\n * renders its value through it and reads the edited text back.\n */\nexport function parseSignedNumber(text: string): number {\n return Number(text.replace(MINUS_SIGN, '-'));\n}\n\n/** Powers of ten a typed magnitude suffix stands for. */\nconst EXPONENTS: Record<string, number> = { k: 3, m: 6, b: 9, t: 12 };\n\n/**\n * Formats a number the way a `compact` readout shows it: below 1,000 at\n * `decimals` places, from 1,000 up at one decimal with a magnitude suffix\n * (`40.0K`, `2.0M`). Always `en-US`, so {@link parseNumber} reads it back.\n */\nexport function formatCompact(value: number, decimals = 0): string {\n if (!Number.isFinite(value)) return formatNumber(value);\n const options: Intl.NumberFormatOptions =\n Math.abs(value) < 1000\n ? { useGrouping: false, minimumFractionDigits: decimals, maximumFractionDigits: decimals }\n : { notation: 'compact', minimumFractionDigits: 1, maximumFractionDigits: 1 };\n return value.toLocaleString('en-US', options).replace(/^-/, MINUS_SIGN);\n}\n\n/**\n * Reads a typed number: anything {@link parseSignedNumber} reads, plus\n * thousands commas in the `40,000` shape and a `k`/`m`/`b`/`t` suffix in either\n * case (`2.5m` is 2,500,000). Empty text is NaN rather than zero.\n *\n * Given `units` — a suffix mapped to the factor it scales by — a trailing unit\n * name is read first: the longest match wins, exact case before any case, and\n * a unit beats a magnitude suffix, so with `m` accepted `2m` is `2 * units.m`.\n */\nexport function parseNumber(text: string, units?: Readonly<Record<string, number>>): number {\n if (units) {\n const trimmed = text.trim();\n const name = unitSuffixOf(trimmed, units);\n if (name !== undefined) {\n const n = parseNumber(trimmed.slice(0, -name.length));\n const factor = units[name]!;\n // Divided by the reciprocal below 1: 12 * 0.1 is 1.2000000000000002, 12 / 10 is 1.2.\n return factor < 1 ? n / (1 / factor) : n * factor;\n }\n }\n let t = text.trim().replace(MINUS_SIGN, '-');\n const exponent = EXPONENTS[t.slice(-1).toLowerCase()];\n if (exponent !== undefined) t = t.slice(0, -1).trimEnd();\n if (/^[-+]?\\d{1,3}(,\\d{3})+(\\.\\d*)?$/.test(t)) t = t.replace(/,/g, '');\n if (!/\\d/.test(t)) return Number.NaN;\n // Scaled through the exponent rather than by multiplying: 1.1 * 1000 is 1100.0000000000002.\n return Number(exponent === undefined ? t : `${t}e${exponent}`);\n}\n\n/** The longest unit name `text` ends with — exact case first, then any case. */\nfunction unitSuffixOf(text: string, units: Readonly<Record<string, number>>): string | undefined {\n const names = Object.keys(units).filter((n) => n !== '').sort((a, b) => b.length - a.length);\n const lower = text.toLowerCase();\n return names.find((n) => text.endsWith(n)) ?? names.find((n) => lower.endsWith(n.toLowerCase()));\n}\n\n/** {@link String} with the leading ASCII hyphen swapped for {@link MINUS_SIGN}.\n * Locale-independent, unlike `toLocaleString`. */\nfunction signedString(value: number): string {\n return String(value).replace(/^-/, MINUS_SIGN);\n}\n\n/**\n * Formats a zoom factor for display. Below 2x a percentage reads naturally;\n * past it the numbers get long and a multiplier is what people say out loud,\n * so 250% shows as `2.5x`. Past 100x a tenth is noise, so the decimal is\n * dropped and thousands are grouped: `1009.74` reads as `1,010x`.\n */\nexport function formatZoom(zoom: number): string {\n if (!Number.isFinite(zoom)) return String(zoom);\n if (zoom <= 2) return `${signedString(Math.round(zoom * 100))}%`;\n if (zoom >= 100) return `${Math.round(zoom).toLocaleString('en-US')}x`;\n return `${signedString(Math.round(zoom * 10) / 10)}x`;\n}\n","import { useCallback, useEffect, useMemo, useRef, type CSSProperties, type KeyboardEvent as ReactKeyboardEvent, type MouseEvent as ReactMouseEvent, type PointerEvent as ReactPointerEvent, type ReactElement, type ReactNode } from 'react';\nimport { openPointerSession, type PointerSession } from '@weasel-js/core';\nimport s from './Slider.module.css';\nimport { formatNumber } from '../../format/number';\n\n/**\n * Passed to a custom thumb renderer: the thumb box in CSS px, and whether\n * this thumb is the one being dragged.\n */\nexport type ThumbRenderCtx = {\n width: number;\n height: number;\n isActive: boolean;\n};\n\n/**\n * A thumb's appearance — one of the two built-in shapes, or a custom\n * renderer.\n */\nexport type ThumbShape =\n | 'round'\n | 'notched'\n | { render: (ctx: ThumbRenderCtx) => ReactNode };\n\n/**\n * One handle on a {@link Slider}. `bounds` narrows the range this particular\n * thumb may move within, either fixed or computed from the current thumb\n * list.\n */\nexport type Thumb = {\n value: number;\n label?: string;\n shape?: ThumbShape;\n bounds?: [number, number] | ((ctx: BoundsCtx) => [number, number]);\n /**\n * Spoken form of `value`, published as `aria-valuetext`. Required by ARIA\n * whenever `value` is not the quantity the user is choosing — an index into\n * a value list, a log-scaled position — since `aria-valuenow` alone then\n * announces a number that means nothing.\n */\n valueText?: string;\n};\n\n/**\n * Passed to a thumb's `bounds` function: the full thumb list and this thumb's\n * index in it, so a bound can be expressed relative to its neighbors.\n */\nexport type BoundsCtx = {\n thumbs: readonly Thumb[];\n index: number;\n};\n\n/**\n * Passed to `renderTrack`: the track's width in CSS px and a mapping from a\n * slider value to its 0..1 position along the track.\n */\nexport type TrackCtx = {\n trackWidth: number;\n valueToFraction: (v: number) => number;\n};\n\n/** A {@link Slider} stop that carries a label, drawn under the track at the stop. */\nexport type SliderStop = {\n value: number;\n label?: ReactNode;\n};\n\n/**\n * Props for {@link Slider}.\n *\n * `onInput` fires continuously through a drag; `onChange` fires once when it\n * ends and is the one to write to history.\n *\n * `stops` are attractors: a drag that passes within a few pixels of one lands\n * on it, and the arrow keys move stop to stop. `step` still quantizes the\n * values between them. Each one is drawn on the track as a mark; pass\n * `showStops: false` for a track whose own paint already reads as the stops.\n * A stop given as a {@link SliderStop} with a `label` gets that label drawn\n * under it; `stopLabels` narrows the row to the two ends or turns it off.\n *\n * `snap: 'strict'` makes every stop a detent the thumb must rest on: drags and\n * track presses land on the nearest one, and `step` no longer applies.\n * `spacing: 'even'` places the stops at equal intervals, runs the track from\n * the first stop to the last, and maps values linearly within each gap — so a\n * geometric list (0.25/0.5/1/2/4) gets usable room for every stop instead of\n * four crowded into the first fifth. Both need stops; with fewer than two,\n * `'even'` falls back to linear.\n *\n * `trackClick: 'move-nearest'` makes a press on bare track send the closest\n * thumb there and continue as a drag. It is off by default because on a\n * multi-thumb editor a stray click would yank a stop the user was not aiming\n * at; `onAddThumb`, where it is set, keeps the track press.\n *\n * `constraint: 'ordered'` keeps thumbs from crossing each other. Supplying\n * `onAddThumb` makes a click on empty track create a thumb, and supplying\n * `onRemoveThumb` lets a right-click or a drag off the track remove one —\n * both callbacks can decline by returning `null`/`false`. `allowShiftAll`\n * makes shift-drag translate every thumb together.\n */\nexport type SliderProps<T extends Thumb = Thumb> = {\n thumbs: readonly T[];\n onInput: (next: T[]) => void;\n onChange?: (next: T[]) => void;\n min: number;\n max: number;\n step?: number;\n stops?: readonly (number | SliderStop)[];\n showStops?: boolean;\n stopLabels?: 'all' | 'ends' | 'none';\n snap?: 'magnetic' | 'strict';\n spacing?: 'linear' | 'even';\n trackClick?: 'none' | 'move-nearest';\n constraint?: 'free' | 'ordered';\n onAddThumb?: (atValue: number) => T | null;\n onRemoveThumb?: (index: number) => boolean;\n allowShiftAll?: boolean;\n renderTrack?: (ctx: TrackCtx) => ReactNode;\n trackHeight?: number;\n /** `'slim'` drives the track and thumb from the kit's slider tokens, so a\n * Slider matches the property rows. `trackHeight` still wins if given. */\n density?: 'default' | 'slim';\n renderReadout?: (thumb: T, index: number) => ReactNode;\n readoutPlacement?: 'none' | 'inline-after' | 'below-thumb';\n ariaLabel?: string;\n className?: string;\n};\n\nfunction quantize(v: number, step: number | undefined, min: number): number {\n if (step === undefined || step <= 0) return v;\n return Math.round((v - min) / step) * step + min;\n}\n\nfunction clamp(v: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, v));\n}\n\n/** How close a drag has to come to a stop, in track pixels, to land on it. */\nconst STOP_SNAP_PX = 8;\n\n/** A custom `ThumbShape.render` may put interactive content inside the thumb,\n * and capture would retarget pointerup and kill the click on it. */\nconst NO_CAPTURE = { capture: false } as const;\n\n/** The stops that are actually reachable: inside the range, deduped, ascending.\n * A duplicate keeps the first label given for its value. */\nfunction usableStops(stops: SliderProps['stops'], min: number, max: number): SliderStop[] {\n if (!stops || stops.length === 0) return [];\n const byValue = new Map<number, SliderStop>();\n for (const stop of stops) {\n const s = typeof stop === 'number' ? { value: stop } : stop;\n if (s.value < min || s.value > max) continue;\n const seen = byValue.get(s.value);\n if (!seen || (seen.label === undefined && s.label !== undefined)) byValue.set(s.value, s);\n }\n return [...byValue.values()].sort((a, b) => a.value - b.value);\n}\n\n/** The stop nearest `v` along the track, or `v` itself when none lies within\n * `tolerance` (a track fraction). Measured on the track rather than in value\n * units so evenly spaced stops attract over the same distance. */\nfunction attract(v: number, stops: number[], tolerance: number, toFraction: (v: number) => number): number {\n const f = toFraction(v);\n let best = v;\n let bestGap = tolerance;\n for (const stop of stops) {\n const gap = Math.abs(toFraction(stop) - f);\n if (gap <= bestGap) {\n best = stop;\n bestGap = gap;\n }\n }\n return best;\n}\n\n/** The stop `count` places past `v` in `direction`, saturating at either end. */\nfunction stepStops(stops: number[], v: number, direction: 1 | -1, count: number): number {\n if (direction > 0) {\n const first = stops.findIndex(stop => stop > v);\n if (first === -1) return stops[stops.length - 1];\n return stops[Math.min(stops.length - 1, first + count - 1)];\n }\n let first = -1;\n for (let i = stops.length - 1; i >= 0; i--) {\n if (stops[i] < v) {\n first = i;\n break;\n }\n }\n if (first === -1) return stops[0];\n return stops[Math.max(0, first - (count - 1))];\n}\n\nfunction defaultStep(step: number | undefined, min: number, max: number): number {\n if (step !== undefined && step > 0) return step;\n return (max - min) / 100;\n}\n\n/** Keep a thumb inside its neighbors when `constraint` is `'ordered'`. */\nfunction clampOrdered(\n v: number,\n thumbs: readonly Thumb[],\n index: number,\n min: number,\n max: number,\n step: number | undefined,\n): number {\n const gap = step !== undefined && step > 0 ? step : (max - min) / 1000;\n const lower = index > 0 ? thumbs[index - 1].value + gap : min;\n const upper = index < thumbs.length - 1 ? thumbs[index + 1].value - gap : max;\n return clamp(v, lower, upper);\n}\n\nfunction resolveBounds(thumb: Thumb, ctx: BoundsCtx, fallbackMin: number, fallbackMax: number): [number, number] {\n if (!thumb.bounds) return [fallbackMin, fallbackMax];\n const tuple = typeof thumb.bounds === 'function' ? thumb.bounds(ctx) : thumb.bounds;\n return [tuple[0], tuple[1]];\n}\n\nfunction defaultReadout(thumb: Thumb): string {\n return formatNumber(thumb.value, { minimumFractionDigits: 3, maximumFractionDigits: 3 });\n}\n\n/**\n * Multi-thumb slider over a shared track. The thumb list is fully controlled:\n * every change, live or committed, arrives as a whole new array.\n *\n * Thumbs are draggable, and arrow/Home/End move the focused thumb — those\n * keystrokes fire `onInput` and `onChange` together, since there is no\n * in-flight state to buffer.\n */\nexport function Slider<T extends Thumb = Thumb>(props: SliderProps<T>): ReactElement {\n const { thumbs, onInput, onChange, step, constraint, trackHeight, density, ariaLabel, className } = props;\n\n const stopList = useMemo(() => usableStops(props.stops, props.min, props.max), [props.stops, props.min, props.max]);\n const stops = useMemo(() => stopList.map(stop => stop.value), [stopList]);\n const even = props.spacing === 'even' && stops.length >= 2;\n const strict = props.snap === 'strict' && stops.length > 0;\n const min = even ? stops[0] : props.min;\n const max = even ? stops[stops.length - 1] : props.max;\n\n const trackRef = useRef<HTMLDivElement | null>(null);\n // In-flight thumb buffer during a drag; null when not dragging.\n const dragBufferRef = useRef<T[] | null>(null);\n const sessionRef = useRef<PointerSession | null>(null);\n\n useEffect(() => () => { sessionRef.current?.cancel(); }, []);\n\n const valueToFraction = useCallback(\n (v: number): number => {\n if (max === min) return 0;\n if (!even) return clamp((v - min) / (max - min), 0, 1);\n const gaps = stops.length - 1;\n const x = clamp(v, min, max);\n let i = 0;\n while (i < gaps - 1 && x > stops[i + 1]) i++;\n return (i + (x - stops[i]) / (stops[i + 1] - stops[i])) / gaps;\n },\n [min, max, even, stops],\n );\n\n const fractionToValue = useCallback(\n (f: number): number => {\n const c = clamp(f, 0, 1);\n if (!even) return min + c * (max - min);\n const gaps = stops.length - 1;\n const i = Math.min(gaps - 1, Math.floor(c * gaps));\n return stops[i] + (c * gaps - i) * (stops[i + 1] - stops[i]);\n },\n [min, max, even, stops],\n );\n\n /** The value a pointer at track fraction `f` chooses, before bounds. */\n const valueAt = useCallback(\n (f: number, trackWidth: number): number => {\n const v = fractionToValue(f);\n if (strict) return attract(v, stops, Infinity, valueToFraction);\n const q = clamp(quantize(v, step, min), min, max);\n return stops.length > 0 ? attract(q, stops, STOP_SNAP_PX / trackWidth, valueToFraction) : q;\n },\n [fractionToValue, valueToFraction, strict, stops, step, min, max],\n );\n\n // `seed` replaces the thumb list the drag starts from. A track press moves a\n // thumb before the drag begins, and without seeding, a release with no\n // movement would commit the stale buffer and undo that move.\n const beginThumbDrag = useCallback(\n (origin: Element, down: ReactPointerEvent, index: number, seed?: readonly T[]) => {\n sessionRef.current?.cancel();\n const buf: T[] = (seed ?? thumbs).map(t => ({ ...t }));\n dragBufferRef.current = buf;\n let droppedOff = false;\n\n const onMove = (ev: PointerEvent) => {\n const track = trackRef.current;\n const buffer = dragBufferRef.current;\n if (!track || !buffer) return;\n const rect = track.getBoundingClientRect();\n let v = valueAt((ev.clientX - rect.left) / rect.width, rect.width);\n\n const [bLo, bHi] = resolveBounds(buffer[index], { thumbs: buffer, index }, min, max);\n v = clamp(v, bLo, bHi);\n\n if (constraint === 'ordered') v = clampOrdered(v, buffer, index, min, max, step);\n\n // Drop-off detection: pointer exits the track vertically by more than trackHeight.\n const bandHeight = rect.height;\n if (props.onRemoveThumb) {\n if (ev.clientY < rect.top - bandHeight || ev.clientY > rect.bottom + bandHeight) {\n droppedOff = true;\n } else {\n droppedOff = false;\n }\n }\n\n buffer[index] = { ...buffer[index], value: v };\n onInput(buffer.map(t => ({ ...t })));\n };\n\n // A drag that ends without a release — cancelled pointer, lost capture,\n // an unmount — drops the buffer without committing.\n const onCancel = () => {\n sessionRef.current = null;\n dragBufferRef.current = null;\n };\n\n const onEnd = () => {\n sessionRef.current = null;\n const buffer = dragBufferRef.current;\n dragBufferRef.current = null;\n if (!buffer) return;\n\n if (droppedOff && props.onRemoveThumb) {\n const accepted = props.onRemoveThumb(index);\n if (accepted) {\n const next = buffer.filter((_, i) => i !== index).map(t => ({ ...t })) as T[];\n onInput(next);\n onChange?.(next);\n return;\n }\n }\n\n onChange?.(buffer.map(t => ({ ...t })));\n };\n\n sessionRef.current = openPointerSession(origin, down, { onMove, onEnd, onCancel }, NO_CAPTURE);\n },\n [thumbs, onInput, onChange, valueAt, min, max, step, constraint, props],\n );\n\n const beginShiftAllDrag = useCallback(\n (origin: Element, down: ReactPointerEvent, anchorX: number) => {\n sessionRef.current?.cancel();\n const buf: T[] = thumbs.map(t => ({ ...t }));\n const startValues = buf.map(t => t.value);\n dragBufferRef.current = buf;\n\n const onMove = (ev: PointerEvent) => {\n const track = trackRef.current;\n const buffer = dragBufferRef.current;\n if (!track || !buffer) return;\n const rect = track.getBoundingClientRect();\n const dxFraction = (ev.clientX - anchorX) / rect.width;\n // Evenly spaced gaps span different amounts of value, so equal value\n // offsets would pull the thumbs apart; move them by track distance.\n if (even) {\n const starts = startValues.map(valueToFraction);\n const df = clamp(dxFraction, -Math.min(...starts), 1 - Math.max(...starts));\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] = { ...buffer[i], value: fractionToValue(starts[i] + df) };\n }\n onInput(buffer.map(t => ({ ...t })));\n return;\n }\n let dValue = dxFraction * (max - min);\n dValue = quantize(dValue, step, 0);\n\n // Clamp delta so no thumb leaves [min, max] (per-thumb bounds intentionally\n // not enforced — matches the experiment's hue-band shift-translate semantics).\n let allowedNeg = -Infinity;\n let allowedPos = Infinity;\n for (let i = 0; i < startValues.length; i++) {\n allowedNeg = Math.max(allowedNeg, min - startValues[i]);\n allowedPos = Math.min(allowedPos, max - startValues[i]);\n }\n dValue = clamp(dValue, allowedNeg, allowedPos);\n\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] = { ...buffer[i], value: clamp(startValues[i] + dValue, min, max) };\n }\n onInput(buffer.map(t => ({ ...t })));\n };\n\n const onCancel = () => {\n sessionRef.current = null;\n dragBufferRef.current = null;\n };\n\n const onEnd = () => {\n sessionRef.current = null;\n const buffer = dragBufferRef.current;\n dragBufferRef.current = null;\n if (buffer) onChange?.(buffer.map(t => ({ ...t })));\n };\n\n sessionRef.current = openPointerSession(origin, down, { onMove, onEnd, onCancel }, NO_CAPTURE);\n },\n [thumbs, onInput, onChange, min, max, step, even, valueToFraction, fractionToValue],\n );\n\n const onThumbPointerDown = (index: number) => (e: ReactPointerEvent) => {\n // Only bail on explicit non-primary buttons (button > 0). jsdom's PointerEvent\n // leaves `button` undefined; treat that as primary so tests can drive drags.\n if (typeof e.button === 'number' && e.button > 0) return;\n // preventDefault below suppresses the focus the press would otherwise\n // give the thumb, and the arrow keys are on the thumb.\n (e.currentTarget as HTMLElement).focus?.();\n e.preventDefault();\n e.stopPropagation();\n const origin = e.currentTarget as HTMLElement;\n if (e.shiftKey && props.allowShiftAll) {\n beginShiftAllDrag(origin, e, e.clientX);\n } else {\n beginThumbDrag(origin, e, index);\n }\n };\n\n const onThumbContextMenu = (index: number) => (e: ReactMouseEvent) => {\n if (!props.onRemoveThumb) return;\n e.preventDefault();\n const accepted = props.onRemoveThumb(index);\n if (!accepted) return;\n const next = thumbs.filter((_, i) => i !== index).map(t => ({ ...t })) as T[];\n onInput(next);\n onChange?.(next);\n };\n\n const onTrackPointerDown = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (typeof e.button === 'number' && e.button > 0) return;\n const wantsMove = (props.trackClick ?? 'none') === 'move-nearest' && thumbs.length > 0;\n if (!props.onAddThumb && !wantsMove) return;\n // If the event originated on a thumb, the thumb's own handler ran first; this is a track click.\n if ((e.target as HTMLElement).closest(`.${s.thumb}`)) return;\n e.preventDefault();\n const track = trackRef.current;\n if (!track) return;\n const rect = track.getBoundingClientRect();\n const v = valueAt((e.clientX - rect.left) / rect.width, rect.width);\n\n if (props.onAddThumb) {\n const created = props.onAddThumb(v);\n if (!created) return;\n const next = [...thumbs.map(t => ({ ...t })), created] as T[];\n onInput(next);\n onChange?.(next);\n return;\n }\n\n let index = 0;\n for (let i = 1; i < thumbs.length; i++) {\n if (Math.abs(thumbs[i].value - v) < Math.abs(thumbs[index].value - v)) index = i;\n }\n const next = thumbs.map(t => ({ ...t })) as T[];\n const [bLo, bHi] = resolveBounds(next[index], { thumbs: next, index }, min, max);\n let moved = clamp(v, bLo, bHi);\n if (constraint === 'ordered') moved = clampOrdered(moved, next, index, min, max, step);\n next[index] = { ...next[index], value: moved };\n onInput(next);\n beginThumbDrag(track, e, index, next);\n };\n\n const onThumbKeyDown = (index: number) => (e: ReactKeyboardEvent) => {\n const stepSize = defaultStep(step, min, max);\n let delta = 0;\n // With stops, a keystroke moves by whole stops rather than by value.\n let stopDelta = 0;\n let snapTo: 'home' | 'end' | null = null;\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n delta = e.shiftKey ? stepSize * 10 : stepSize;\n stopDelta = e.shiftKey ? 10 : 1;\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n delta = e.shiftKey ? -stepSize * 10 : -stepSize;\n stopDelta = e.shiftKey ? -10 : -1;\n break;\n case 'PageUp':\n delta = stepSize * 10;\n stopDelta = 10;\n break;\n case 'PageDown':\n delta = -stepSize * 10;\n stopDelta = -10;\n break;\n case 'Home':\n snapTo = 'home';\n break;\n case 'End':\n snapTo = 'end';\n break;\n default:\n return;\n }\n\n e.preventDefault();\n const next = thumbs.map(t => ({ ...t }));\n const [bLo, bHi] = resolveBounds(next[index], { thumbs: next, index }, min, max);\n const lo = Math.max(min, bLo);\n const hi = Math.min(max, bHi);\n let v: number;\n if (snapTo === 'home') v = lo;\n else if (snapTo === 'end') v = hi;\n else if (stops.length > 0) {\n v = stepStops(stops, next[index].value, stopDelta > 0 ? 1 : -1, Math.abs(stopDelta));\n } else {\n v = quantize(next[index].value + delta, step, min);\n }\n v = clamp(v, lo, hi);\n if (constraint === 'ordered') v = clampOrdered(v, next, index, lo, hi, step);\n next[index] = { ...next[index], value: v };\n onInput(next);\n onChange?.(next);\n };\n\n const placement = props.readoutPlacement ?? 'none';\n const renderReadout = props.renderReadout;\n\n const slim = density === 'slim';\n const rootVars: Record<string, string> = {};\n if (slim) {\n rootVars['--rp-track-height'] = 'var(--wzl-slider-track-h)';\n rootVars['--rp-thumb-size'] = 'var(--wzl-slider-thumb-size)';\n }\n // An explicit trackHeight wins: a caller who named a number meant it.\n if (trackHeight !== undefined) rootVars['--rp-track-height'] = `${trackHeight}px`;\n\n const labelMode = props.stopLabels ?? 'all';\n const lastStop = stopList.length - 1;\n const labeledStops = labelMode === 'none'\n ? []\n : stopList\n .map((stop, i) => ({ stop, i }))\n .filter(({ stop, i }) => stop.label !== undefined && (labelMode === 'all' || i === 0 || i === lastStop));\n // Inside the track so it shares the track's width, not the row's — an inline\n // readout beside the track would otherwise shift every label off its stop.\n const stopLabelRow = labeledStops.length > 0 && (\n <div className={s.stopLabels} data-slider-stop-labels aria-hidden=\"true\">\n {labeledStops.map(({ stop, i }) => (\n <span\n key={stop.value}\n className={s.stopLabel}\n data-slider-stop-label\n data-selected={thumbs.some(t => t.value === stop.value) ? 'true' : undefined}\n data-edge={i === 0 ? 'start' : i === lastStop ? 'end' : undefined}\n style={{ left: `${valueToFraction(stop.value) * 100}%` }}\n >\n {stop.label}\n </span>\n ))}\n </div>\n );\n const rootClass = [s.root, slim && s.slim, stopLabelRow && s.withStopLabels, className].filter(Boolean).join(' ');\n\n return (\n <div\n className={rootClass}\n style={Object.keys(rootVars).length > 0 ? (rootVars as CSSProperties) : undefined}\n >\n <div className={s.row}>\n <div className={s.track} ref={trackRef} onPointerDown={onTrackPointerDown}>\n {props.renderTrack && (\n <div className={s.trackInner}>\n {props.renderTrack({\n trackWidth: trackRef.current?.getBoundingClientRect().width ?? 0,\n valueToFraction,\n })}\n </div>\n )}\n {(props.showStops ?? true) && stops.length > 0 && (\n <div className={s.ticks} data-slider-ticks aria-hidden=\"true\">\n {stops.map(v => {\n const f = valueToFraction(v);\n return (\n <span\n key={v}\n className={s.tick}\n data-slider-tick\n data-fraction={String(f)}\n style={{ left: `${f * 100}%` }}\n />\n );\n })}\n </div>\n )}\n {stopLabelRow}\n {thumbs.map((thumb, i) => {\n const isNotched = thumb.shape === 'notched';\n const customRender = typeof thumb.shape === 'object' && thumb.shape !== null ? thumb.shape.render : null;\n const cls = `${s.thumb}${isNotched ? ` ${s.notched}` : ''}`;\n return (\n <div\n key={i}\n role=\"slider\"\n tabIndex={0}\n aria-orientation=\"horizontal\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={thumb.value}\n aria-valuetext={thumb.valueText}\n aria-label={[ariaLabel, thumb.label].filter(Boolean).join(' ') || undefined}\n className={cls}\n style={{ left: `${valueToFraction(thumb.value) * 100}%` }}\n onPointerDown={onThumbPointerDown(i)}\n onKeyDown={onThumbKeyDown(i)}\n onContextMenu={onThumbContextMenu(i)}\n >\n {customRender ? customRender({ width: 14, height: 24, isActive: false }) : (thumb.label ?? '')}\n </div>\n );\n })}\n </div>\n {placement === 'inline-after' && (\n <span data-readout=\"inline\" className={s.readoutInline}>\n {thumbs.map((t, i) => (\n <span key={i}>{i > 0 ? ' / ' : ''}{renderReadout ? renderReadout(t, i) : defaultReadout(t)}</span>\n ))}\n </span>\n )}\n </div>\n {placement === 'below-thumb' && (\n <div className={s.readoutsBelow}>\n {thumbs.map((t, i) => (\n <span\n key={i}\n data-readout=\"below\"\n className={s.readoutBelow}\n style={{ left: `${valueToFraction(t.value) * 100}%` }}\n >\n {renderReadout ? renderReadout(t, i) : defaultReadout(t)}\n </span>\n ))}\n </div>\n )}\n </div>\n );\n}\n","var e = {\n\trange: \"_range_g7ip1_9\",\n\talpha: \"_alpha_g7ip1_74\"\n};\n//#endregion\nexport { e as t };\n\n//# sourceMappingURL=range.module-DSsOIq1R.js.map","import { type CSSProperties, type InputHTMLAttributes, type ReactElement } from 'react';\nimport shared from '../range.module.css';\nimport s from './InlineRange.module.css';\n\n/** Props for {@link InlineRange} — a range input's, with `value` required. */\nexport type InlineRangeProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'value' | 'min' | 'max'\n> & {\n value: number;\n min?: number;\n max?: number;\n};\n\n/**\n * Compact range input for a property row: one track, no label, no output.\n *\n * Distinct from the kit's other two — `Slider` is shaped for canvas scrubbing,\n * and `RangeSlider` is a full-width labelled form control on React Aria. This\n * one exists to sit inline beside a swatch or a readout, and to own the track\n * painting both of those surfaces need.\n */\nexport function InlineRange(props: InlineRangeProps): ReactElement {\n const { value, min = 0, max = 100, className, style, ...rest } = props;\n const span = max - min;\n const filled = span > 0 ? ((Math.min(Math.max(value, min), max) - min) / span) * 100 : 0;\n return (\n <input\n {...rest}\n type=\"range\"\n value={value}\n min={min}\n max={max}\n className={[shared.range, s.range, className].filter(Boolean).join(' ')}\n style={{ ['--slider-fill' as string]: `${filled}%`, ...style } as CSSProperties}\n />\n );\n}\n","import { useState } from 'react';\nimport { toHex8, getAlpha01, withAlpha01 } from '@weasel-js/core';\nimport { InlineRange } from '../InlineRange';\nimport s from './ColorField.module.css';\n\n/**\n * Props for {@link ColorField}. `onInput` fires throughout a gesture and\n * `onChange` once at its end.\n */\nexport interface ColorFieldProps {\n /** Current color, `#rrggbb` or `#rrggbbaa`. Omit when `mixed`. */\n value?: string;\n /** Indeterminate presentation (multi-selection with differing colors):\n * checkered chip, empty value. The first color edit produces a real\n * value; the opacity slider stays disabled until then (an alpha-only\n * edit would otherwise commit a value composed against the\n * placeholder black). */\n mixed?: boolean;\n /** Show the opacity slider; emitted values are `#rrggbbaa`. */\n alpha?: boolean;\n /** Live value during interaction (picker drag, slider drag). Optional —\n * wire it for live preview; omit it for commit-only consumers. */\n onInput?: (hex: string) => void;\n /** Committed value — picker close (blur) or slider release. One call\n * per user gesture; pair with an undoable write. */\n onChange: (hex: string) => void;\n 'aria-label'?: string;\n className?: string;\n}\n\n/**\n * Compact color editor: native color input + optional opacity slider.\n * Commit semantics are gesture-based (see `onChange`) because native\n * color/range inputs fire `change` continuously during interaction —\n * commit-on-change would emit one undo entry per tick.\n */\nexport function ColorField(props: ColorFieldProps) {\n const { value, mixed = false, alpha = false, onInput, onChange, className } = props;\n const hex8 = toHex8(value ?? '#000000');\n const rgb6 = hex8.slice(0, 7);\n const alpha01 = getAlpha01(hex8);\n const alphaPct = Math.round(alpha01 * 100);\n\n // Drafts track the control during a gesture (the committed prop only\n // updates after onChange), then reset to follow the prop again.\n const [colorDraft, setColorDraft] = useState<string | null>(null);\n const [alphaDraft, setAlphaDraft] = useState<number | null>(null);\n const visibleRgb = colorDraft ?? rgb6;\n const visibleAlphaPct = alphaDraft ?? alphaPct;\n\n const compose = (rgb: string, a01: number): string =>\n alpha ? withAlpha01(rgb, a01) : rgb;\n\n // Mixed with no color edit yet: the alpha slider has nothing real to\n // compose against (rgb6 is the placeholder black), so keep it disabled\n // until the first color edit lands.\n const alphaLocked = mixed && colorDraft === null;\n\n // Commit only when a gesture actually changed something — blur with no\n // preceding input must not emit (it would create a no-op undo entry).\n const commit = (rgb: string, a01: number): void => {\n if (colorDraft === null && alphaDraft === null) return;\n onChange(compose(rgb, a01));\n setColorDraft(null);\n setAlphaDraft(null);\n };\n\n return (\n <span\n className={[s.root, className].filter(Boolean).join(' ')}\n {...(mixed && colorDraft === null ? { 'data-mixed': '' } : {})}\n >\n <span className={s.chip}>\n <input\n className={s.color}\n type=\"color\"\n value={visibleRgb}\n aria-label={props['aria-label'] ?? 'Color'}\n onInput={(e) => {\n const rgb = (e.target as HTMLInputElement).value;\n setColorDraft(rgb);\n onInput?.(compose(rgb, visibleAlphaPct / 100));\n }}\n onBlur={() => commit(visibleRgb, visibleAlphaPct / 100)}\n />\n </span>\n {alpha && (\n <>\n <InlineRange\n className={s.alphaRange}\n min={0}\n max={100}\n step={1}\n value={visibleAlphaPct}\n disabled={alphaLocked}\n aria-label={props['aria-label'] ? `${props['aria-label']} opacity` : 'Opacity'}\n onInput={(e) => {\n const pct = Number((e.target as HTMLInputElement).value);\n setAlphaDraft(pct);\n onInput?.(compose(visibleRgb, pct / 100));\n }}\n onPointerUp={() => commit(visibleRgb, visibleAlphaPct / 100)}\n onPointerCancel={() => commit(visibleRgb, visibleAlphaPct / 100)}\n onKeyUp={() => commit(visibleRgb, visibleAlphaPct / 100)}\n onBlur={() => commit(visibleRgb, visibleAlphaPct / 100)}\n />\n <span className={s.alphaReadout} aria-hidden=\"true\">{visibleAlphaPct}%</span>\n </>\n )}\n </span>\n );\n}\n","import type { ReactNode, CSSProperties } from 'react';\nimport type { TrackCtx } from './components/Slider';\n\n/**\n * Options for {@link paintGradientTrack}.\n *\n * `gradient` maps a normalized position along the track (0 to 1) to a CSS\n * color; `samples` is how many stops the resulting linear-gradient uses.\n * `activeRange`, given in the slider's own value units, keeps that span at\n * full strength and dims + hatches the rest.\n */\nexport type GradientTrackOpts = {\n gradient: (t: number) => string;\n samples?: number;\n activeRange?: [number, number];\n hatch?: {\n angleDeg?: number;\n stripe?: number;\n gap?: number;\n dim?: number;\n };\n};\n\nconst DEFAULT_HATCH = { angleDeg: 135, stripe: 2, gap: 4, dim: 75 };\n\n/**\n * Builds a `Slider` `renderTrack` function that paints the track as a\n * sampled color gradient, optionally dimming and hatching the portions\n * outside an active range.\n */\nexport function paintGradientTrack(opts: GradientTrackOpts): (ctx: TrackCtx) => ReactNode {\n const { gradient, samples = 16, activeRange, hatch } = opts;\n\n return (ctx: TrackCtx) => {\n const stops: string[] = [];\n for (let i = 0; i <= samples; i++) {\n const t = i / samples;\n stops.push(`${gradient(t)} ${(t * 100).toFixed(1)}%`);\n }\n const baseGradient = `linear-gradient(to right, ${stops.join(', ')})`;\n\n const layers: string[] = [];\n if (activeRange) {\n const lowPct = ctx.valueToFraction(activeRange[0]) * 100;\n const highPct = ctx.valueToFraction(activeRange[1]) * 100;\n const h = { ...DEFAULT_HATCH, ...hatch };\n const stripe = `repeating-linear-gradient(${h.angleDeg}deg, transparent 0 ${h.stripe}px, var(--wzl-surface) ${h.stripe}px ${h.stripe + h.gap}px)`;\n const dimColor = `color-mix(in srgb, var(--wzl-surface) ${h.dim}%, transparent)`;\n const dimOverlay = `linear-gradient(${dimColor}, ${dimColor})`;\n\n if (lowPct > 0) {\n layers.push(`${dimOverlay} left 0 / ${lowPct.toFixed(2)}% 100% no-repeat`);\n layers.push(`${stripe} left 0 / ${lowPct.toFixed(2)}% 100% no-repeat`);\n }\n if (highPct < 100) {\n const wR = (100 - highPct).toFixed(2);\n layers.push(`${dimOverlay} right 0 / ${wR}% 100% no-repeat`);\n layers.push(`${stripe} right 0 / ${wR}% 100% no-repeat`);\n }\n }\n layers.push(baseGradient);\n\n const style: CSSProperties = {\n position: 'absolute',\n inset: 0,\n background: layers.join(', '),\n };\n return <div style={style} />;\n };\n}\n","import { useCallback, type ReactElement } from 'react';\nimport {\n sampleGradientStops,\n withGradientKind,\n type ColorSpace,\n type GradStop,\n type GradientFill,\n type GradientKind,\n} from '@weasel-js/core';\nimport { Slider, type Thumb } from '../Slider';\nimport { ColorField } from '../ColorField';\nimport { ToggleBar, type ToggleBarItem } from '../ToggleBar';\nimport { paintGradientTrack } from '../../paintGradientTrack';\nimport s from './GradientEditor.module.css';\n\nconst KINDS: readonly ToggleBarItem<GradientKind>[] = [\n { value: 'linear-gradient', label: 'Linear' },\n { value: 'radial-gradient', label: 'Radial' },\n { value: 'conic-gradient', label: 'Conic' },\n];\n\nconst SPACES: readonly ToggleBarItem<ColorSpace>[] = [\n { value: 'rgb', label: 'sRGB' },\n { value: 'oklab', label: 'OKLab' },\n { value: 'oklch', label: 'OKLCh' },\n];\n\n/** Fewer than two stops is not a gradient any renderer can ramp between. */\nconst MIN_STOPS = 2;\n\n/**\n * Props for {@link GradientEditor}. `onInput` fires throughout a gesture and\n * `onChange` once at its end.\n */\nexport interface GradientEditorProps {\n /** The gradient being edited. */\n value: GradientFill;\n /**\n * Live value during a gesture — a stop drag, a color-picker scrub. Wire\n * it for preview; it fires many times per gesture and must not be\n * written to history.\n */\n onInput?: (next: GradientFill) => void;\n /** Committed value: one call per completed gesture. Pair with an\n * undoable write. */\n onChange: (next: GradientFill) => void;\n /** Show the linear / radial / conic switch. Default true; turn it off\n * when the surrounding UI already owns the kind. */\n kindSwitch?: boolean;\n /** Show the sRGB / OKLab / OKLCh switch, which writes `interpolate`.\n * Default true. */\n spaceSwitch?: boolean;\n className?: string;\n}\n\ntype StopThumb = Thumb & { color: string };\n\n/**\n * Editor for a gradient's kind and stop list.\n *\n * Geometry (`from`/`to`, `center`, `radius`, `angle`) is deliberately not\n * edited here — on a canvas that belongs on the artwork, via\n * `<GradientHandles>`. This component owns the parts with no spatial\n * meaning, so it composes into a properties panel at any width.\n *\n * Stops are addressed by their position in `value.stops`, which is never\n * reordered — dragging one stop past another leaves both indices alone, so\n * a drag can cross a neighbour without the two swapping under the pointer.\n * Rendering sorts a copy.\n */\nexport function GradientEditor(props: GradientEditorProps): ReactElement {\n const { value, onInput, onChange, kindSwitch = true, spaceSwitch = true, className } = props;\n const stops = value.stops;\n const space = value.interpolate ?? 'rgb';\n\n const withStops = useCallback(\n (next: GradStop[]): GradientFill => ({ ...value, stops: next }),\n [value],\n );\n\n const thumbs: StopThumb[] = stops.map((stop) => ({ value: stop.offset, color: stop.color }));\n\n const applyThumbs = (next: StopThumb[]): GradStop[] =>\n next.map((t) => ({ offset: t.value, color: t.color }));\n\n const setStopColor = (index: number, color: string): GradStop[] =>\n stops.map((stop, i) => (i === index ? { ...stop, color } : stop));\n\n // Sorted view for the swatch row, carrying each stop's real index so a\n // recolor writes back to the right entry.\n const ordered = stops\n .map((stop, index) => ({ stop, index }))\n .sort((a, b) => a.stop.offset - b.stop.offset);\n\n return (\n <div className={[s.root, className].filter(Boolean).join(' ')}>\n {kindSwitch && (\n <ToggleBar<GradientKind>\n items={KINDS}\n value={value.fill}\n size=\"sm\"\n ariaLabel=\"Gradient kind\"\n onChange={(kind) => kind && onChange(withGradientKind(value, kind))}\n />\n )}\n\n <Slider<StopThumb>\n min={0}\n max={1}\n step={0.005}\n constraint=\"free\"\n thumbs={thumbs}\n ariaLabel=\"Gradient stops\"\n readoutPlacement=\"none\"\n onInput={(next) => onInput?.(withStops(applyThumbs(next)))}\n onChange={(next) => onChange(withStops(applyThumbs(next)))}\n onAddThumb={(at) => ({ value: at, color: sampleGradientStops(stops, at, space) })}\n onRemoveThumb={() => stops.length > MIN_STOPS}\n renderTrack={paintGradientTrack({\n gradient: (t) => sampleGradientStops(stops, t, space),\n // The track lerps between samples in sRGB whatever the gradient does,\n // so a hue arc needs more of them to not read as a straight line.\n samples: space === 'rgb' ? 32 : 64,\n })}\n />\n\n {spaceSwitch && (\n <ToggleBar<ColorSpace>\n items={SPACES}\n value={space}\n size=\"sm\"\n ariaLabel=\"Blend space\"\n onChange={(next) => next && onChange({ ...value, interpolate: next })}\n />\n )}\n\n <div className={s.swatches}>\n {ordered.map(({ stop, index }) => (\n <ColorField\n key={index}\n value={stop.color}\n alpha\n aria-label={`Stop ${index + 1} at ${Math.round(stop.offset * 100)}%`}\n className={s.swatch}\n onInput={(hex) => onInput?.(withStops(setStopColor(index, hex)))}\n onChange={(hex) => onChange(withStops(setStopColor(index, hex)))}\n />\n ))}\n </div>\n </div>\n );\n}\n","import { forwardRef, type ReactNode, type Ref } from 'react';\nimport {\n Checkbox as RACCheckbox,\n type CheckboxProps as RACCheckboxProps,\n} from 'react-aria-components';\nimport s from './Checkbox.module.css';\n\n/**\n * Props for {@link Checkbox}, on top of React Aria's `Checkbox` props. The\n * label is passed as children.\n */\nexport type CheckboxProps = Omit<RACCheckboxProps, 'children' | 'className'> & {\n children?: ReactNode;\n className?: string;\n};\n\n/**\n * Single checkbox wrapping React Aria's Checkbox. Supports indeterminate\n * via `isIndeterminate`. The label is supplied as children.\n */\nexport const Checkbox = forwardRef(function Checkbox(\n props: CheckboxProps,\n ref: Ref<HTMLLabelElement>,\n) {\n const { children, className, ...rest } = props;\n return (\n <RACCheckbox\n {...rest}\n ref={ref}\n className={[s.checkbox, className].filter(Boolean).join(' ')}\n >\n {({ isIndeterminate }) => (\n <>\n <span className={s.box}>\n <svg className={s.checkmark} viewBox=\"0 0 14 14\" aria-hidden=\"true\">\n {isIndeterminate ? (\n <line x1=\"3\" y1=\"7\" x2=\"11\" y2=\"7\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n ) : (\n <polyline\n points=\"3,7.5 6,10.5 11,4.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n )}\n </svg>\n </span>\n {children !== undefined && <span className={s.label}>{children}</span>}\n </>\n )}\n </RACCheckbox>\n );\n});\n","import type { ReactNode } from 'react';\nimport s from './Field.module.css';\n\n/**\n * Whether a {@link Field} stacks its label above the control or sits them\n * side by side.\n */\nexport type FieldOrientation = 'stacked' | 'row';\n\n/** Props for {@link Field}. */\nexport type FieldProps = {\n orientation?: FieldOrientation;\n className?: string;\n children?: ReactNode;\n};\n\n/**\n * Layout primitive that arranges a label, control, hint, and error in the\n * canonical weasel-ui form-row shape. The control itself owns its semantics\n * (RAC `TextField`, `Checkbox`, etc.); this just paints the layout.\n *\n * Most users will instead reach for `Input` / `Checkbox` / `Switch`, which\n * compose Field internally. Use Field directly when you need a custom\n * control to sit in the same visual rhythm.\n */\nexport function Field({ orientation = 'stacked', className, children }: FieldProps) {\n const cls = [s.field, orientation === 'row' && s.row, className].filter(Boolean).join(' ');\n return <div className={cls}>{children}</div>;\n}\n\n/**\n * The class names {@link Field} paints its slots with, so a control composing\n * its own layout can match the same form-row rhythm.\n */\nexport const fieldClasses = {\n root: s.field,\n row: s.row,\n label: s.label,\n hint: s.hint,\n error: s.error,\n};\n","import { createContext, useContext, useState, type ReactElement, type ReactNode } from 'react';\n\n/**\n * Elements an overlay may portal into: anything a theme has been stamped on\n * (`applyTheme` / `<ThemeProvider>` write both attributes), plus anything\n * opting in with `data-wzl-portal-host`. The opt-in exists for a styling root\n * that sits *below* the themed element — labkit's `.lk-root` carries element\n * defaults the themed wrapper does not.\n */\nconst HOST_SELECTOR = '[data-wzl-portal-host],[data-wzl-theme],[data-wzl-mode]';\n\n/**\n * The nearest element `from` sits inside that can host a portalled overlay,\n * or `null` when there is none and the body is the only answer.\n */\nexport function nearestPortalHost(from: Element | null | undefined): HTMLElement | null {\n return (from?.closest(HOST_SELECTOR) as HTMLElement | null) ?? null;\n}\n\n/** `undefined` distinguishes \"no provider\" from a provider saying `null`. */\nconst OverlayPortalContext = createContext<Element | null | undefined>(undefined);\n\n/** Props for {@link OverlayPortalProvider}. */\nexport interface OverlayPortalProviderProps {\n /** Where overlays in this subtree portal. `null` means `document.body`. */\n container: Element | null;\n children: ReactNode;\n}\n\n/**\n * Sets the portal container for every weasel overlay rendered below it,\n * overriding the nearest-themed-ancestor default. An individual overlay's\n * own `portalContainer` prop still wins.\n */\nexport function OverlayPortalProvider({ container, children }: OverlayPortalProviderProps) {\n return (\n <OverlayPortalContext.Provider value={container}>{children}</OverlayPortalContext.Provider>\n );\n}\n\n/** The `portalContainer` prop every weasel overlay accepts. */\nexport interface OverlayPortalProps {\n /**\n * Where the overlay's portal mounts. Defaults to the nearest ancestor of\n * the overlay's own position that carries a weasel theme, so the overlay\n * resolves the same `--wzl-*` tokens as the control it belongs to. Pass\n * `null` for `document.body`.\n */\n portalContainer?: Element | null;\n}\n\n/** React Aria props minus the portal key a weasel overlay owns. */\nexport type WithoutPortalTarget<T> = Omit<T, 'UNSTABLE_portalContainer'>;\n\n/** Spread onto the React Aria overlay. The unstable key is spelled here and\n * nowhere else in the package, so an upstream rename lands in one file. */\nexport interface OverlayPortalTarget {\n UNSTABLE_portalContainer: Element | undefined;\n}\n\n/**\n * Resolves where an overlay should portal, and the anchor that answers it.\n *\n * The result goes to React Aria as `UNSTABLE_portalContainer`. Its documented\n * replacement, `UNSAFE_PortalProvider`, is not re-exported by\n * react-aria-components 1.18, and reaching past it to `react-aria` for the\n * provider risks a second copy of that package whose context the overlays\n * never read — a failure that shows up as an unthemed overlay, not an error.\n *\n * Render `anchor` at the component's own position in the tree — outside the\n * portal — and spread `portalProps` onto the React Aria overlay. The anchor\n * is what \"nearest themed ancestor\" is measured from; the first render has\n * none yet, so an overlay that mounts already open lands in its host on the\n * following render, before paint.\n */\nexport function useOverlayPortal(explicit?: Element | null): {\n anchor: ReactElement;\n portalProps: OverlayPortalTarget;\n} {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const fromProvider = useContext(OverlayPortalContext);\n\n const resolved =\n explicit !== undefined\n ? explicit\n : fromProvider !== undefined\n ? fromProvider\n : nearestPortalHost(anchorEl);\n\n return {\n anchor: <span hidden ref={setAnchorEl} />,\n portalProps: { UNSTABLE_portalContainer: resolved ?? undefined },\n };\n}\n","import { Children, isValidElement, type ReactNode } from 'react';\nimport {\n Select as RACSelect,\n Label,\n Button as RACButton,\n SelectValue,\n Popover as RACPopover,\n ListBox as RACListBox,\n ListBoxItem as RACListBoxItem,\n Text,\n FieldError,\n type SelectProps as RACSelectProps,\n type ListBoxItemProps as RACListBoxItemProps,\n type ValidationResult,\n} from 'react-aria-components';\nimport { fieldClasses } from '../Field/Field';\nimport { useOverlayPortal, type OverlayPortalProps } from '../../overlays/portalHost';\nimport s from './Select.module.css';\n\n/** One option in a {@link Select}'s `options` list. */\nexport type SelectOption = {\n value: string;\n label: ReactNode;\n isDisabled?: boolean;\n /**\n * Plain-text form of `label`, for type-to-select and screen readers.\n * Only needed when `label` isn't a bare string — a label built from\n * elements has no text React Aria can read off it. A string label\n * supplies this itself.\n */\n textValue?: string;\n};\n\ntype Key = string | number;\n\n/**\n * Props for {@link Select}, on top of React Aria's `Select` props, with the\n * selection key narrowed to the option value type.\n */\nexport type SelectProps<T extends Key = string> = Omit<RACSelectProps<object>, 'children' | 'className' | 'selectedKey' | 'defaultSelectedKey' | 'onSelectionChange'> & {\n label?: ReactNode;\n description?: ReactNode;\n errorMessage?: ReactNode | ((v: ValidationResult) => ReactNode);\n placeholder?: string;\n /** Either pass `options` for a quick render, or `children` for full control. */\n options?: ReadonlyArray<SelectOption & { value: T }>;\n children?: ReactNode;\n selectedKey?: T | null;\n defaultSelectedKey?: T;\n onSelectionChange?: (key: T) => void;\n /**\n * `'fill'` (the default) takes the width of whatever row the select sits in.\n * `'fit'` sizes the trigger to its widest option, so it neither swallows a\n * toolbar's slack nor changes width as the selection moves.\n */\n width?: 'fill' | 'fit';\n /** `'bare'` drops the box, for a select set in a row of other chrome such as a property row. */\n variant?: 'field' | 'bare';\n /**\n * Id for the trigger button. React Aria puts a plain `id` on the wrapper,\n * which is not labelable, so an outer `<label for>` needs this to reach a\n * control the label can actually own.\n */\n triggerId?: string;\n className?: string;\n} & OverlayPortalProps;\n\n/**\n * Form select wrapping React Aria's Select. Pass either `options` for a\n * quick declarative render or `children` of `<SelectItem>` for control over\n * each row.\n *\n * The selection key type is parameterized so consumers with a string-literal\n * union for `value` (e.g. `'r' | 'g' | 'b'`) get a typed `onSelectionChange`.\n */\nexport function Select<T extends Key = string>(props: SelectProps<T>) {\n const {\n label,\n description,\n errorMessage,\n placeholder,\n options,\n children,\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n width = 'fill',\n variant = 'field',\n triggerId,\n className,\n portalContainer,\n ...rest\n } = props;\n\n const { anchor, portalProps } = useOverlayPortal(portalContainer);\n\n return (\n <RACSelect\n {...rest}\n selectedKey={selectedKey}\n defaultSelectedKey={defaultSelectedKey}\n onSelectionChange={onSelectionChange ? (k) => onSelectionChange(k as T) : undefined}\n className={[s.field, width === 'fit' && s.fit, variant === 'bare' && s.bare, fieldClasses.root, className]\n .filter(Boolean)\n .join(' ')}\n >\n {anchor}\n {label !== undefined && <Label className={fieldClasses.label}>{label}</Label>}\n <RACButton id={triggerId} className={s.trigger}>\n <SelectValue className={s.value}>\n {({ defaultChildren, isPlaceholder }) =>\n isPlaceholder ? (placeholder ?? defaultChildren) : defaultChildren\n }\n </SelectValue>\n {width === 'fit' && (\n <span className={s.sizer} aria-hidden=\"true\">\n {placeholder !== undefined && <span>{placeholder}</span>}\n {optionLabels(options, children).map((l, i) => (\n <span key={i}>\n <CheckMark />\n {l}\n </span>\n ))}\n </span>\n )}\n <svg className={s.chevron} viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <path d=\"M2 4 L5 7 L8 4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </RACButton>\n {description !== undefined && (\n <Text slot=\"description\" className={fieldClasses.hint}>\n {description}\n </Text>\n )}\n <FieldError className={fieldClasses.error}>{errorMessage}</FieldError>\n {/* `data-weasel-overlay` marks DOM that belongs to this control but\n renders in a portal, outside the subtree the trigger sits in. Any\n consumer reasoning about \"did focus leave my component?\" via\n `closest()` gets the wrong answer without it — a text editor whose\n font menu lives here would end its session the moment the menu is\n clicked. */}\n <RACPopover className={s.popover} data-weasel-overlay=\"\" {...portalProps}>\n <RACListBox className={s.listbox}>\n {options !== undefined\n ? options.map((o) => (\n <SelectItem\n key={String(o.value)}\n id={o.value}\n isDisabled={o.isDisabled}\n textValue={o.textValue}\n >\n {o.label}\n </SelectItem>\n ))\n : children}\n </RACListBox>\n </RACPopover>\n </RACSelect>\n );\n}\n\n/* A selected row's mark travels into the trigger with its label, so a\n `width='fit'` sizer has to allow for it too. */\nfunction CheckMark() {\n return (\n <svg className={s.check} viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <polyline points=\"1.5,5 4,7.5 8.5,3\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\n/**\n * The labels a `width='fit'` trigger measures itself against. In the children\n * form the label sits one element deep, inside a `SelectItem`.\n */\nfunction optionLabels(\n options: ReadonlyArray<SelectOption> | undefined,\n children: ReactNode,\n): ReactNode[] {\n if (options !== undefined) return options.map((o) => o.label);\n return Children.toArray(children).map((c) =>\n isValidElement<{ children?: ReactNode }>(c) ? c.props.children : c,\n );\n}\n\n/** Props for {@link SelectItem}, on top of React Aria's `ListBoxItem` props. */\nexport type SelectItemProps = Omit<RACListBoxItemProps, 'className' | 'children'> & {\n children?: ReactNode;\n className?: string;\n};\n\n/**\n * Every row renders a check mark beside its label, so from React Aria's\n * side the children are never plain text and it can't derive the string\n * type-to-select and screen readers need — it warns once per row. A string\n * label already *is* that string, so derive it rather than making every\n * call site restate it; anything richer has to say what it reads as.\n */\nfunction textValueOf(children: ReactNode, explicit: string | undefined): string | undefined {\n if (explicit !== undefined) return explicit;\n return typeof children === 'string' || typeof children === 'number'\n ? String(children)\n : undefined;\n}\n\n/**\n * One row in a {@link Select}'s list, with a leading check mark when\n * selected. A string child supplies its own `textValue`; anything richer must\n * pass one so type-to-select and screen readers have something to read.\n */\nexport function SelectItem({ children, className, textValue, ...rest }: SelectItemProps) {\n return (\n <RACListBoxItem\n {...rest}\n textValue={textValueOf(children, textValue)}\n className={[s.option, className].filter(Boolean).join(' ')}\n >\n <CheckMark />\n {children}\n </RACListBoxItem>\n );\n}\n","import { forwardRef, type ReactNode, type Ref } from 'react';\nimport {\n TextField,\n Label,\n Input as RACInput,\n Text,\n FieldError,\n type TextFieldProps as RACTextFieldProps,\n type ValidationResult,\n} from 'react-aria-components';\nimport { fieldClasses } from '../Field/Field';\nimport s from './Input.module.css';\n\n/** Props for {@link Input}, on top of React Aria's `TextField` props. */\nexport type InputProps = Omit<RACTextFieldProps, 'children' | 'className'> & {\n label?: ReactNode;\n description?: ReactNode;\n errorMessage?: ReactNode | ((v: ValidationResult) => ReactNode);\n placeholder?: string;\n leadingAdornment?: ReactNode;\n trailingAdornment?: ReactNode;\n className?: string;\n};\n\n/**\n * Single-line text input wrapping React Aria's TextField. Supplies a\n * default skin against the `--wzl-*` token system, and exposes the\n * familiar label / description / errorMessage / adornment slot shape.\n *\n * `ref` forwards to the underlying `<input>`.\n */\nexport const Input = forwardRef(function Input(\n props: InputProps,\n ref: Ref<HTMLInputElement>,\n) {\n const {\n label,\n description,\n errorMessage,\n placeholder,\n leadingAdornment,\n trailingAdornment,\n className,\n ...textFieldProps\n } = props;\n\n return (\n <TextField {...textFieldProps} className={[s.field, fieldClasses.root, className].filter(Boolean).join(' ')}>\n {label !== undefined && <Label className={fieldClasses.label}>{label}</Label>}\n <div className={s.frame}>\n {leadingAdornment !== undefined && <span className={s.adornment}>{leadingAdornment}</span>}\n <RACInput ref={ref} placeholder={placeholder} />\n {trailingAdornment !== undefined && <span className={s.adornment}>{trailingAdornment}</span>}\n </div>\n {description !== undefined && (\n <Text slot=\"description\" className={fieldClasses.hint}>\n {description}\n </Text>\n )}\n <FieldError className={fieldClasses.error}>{errorMessage}</FieldError>\n </TextField>\n );\n});\n","import { forwardRef, type ReactNode, type Ref } from 'react';\nimport {\n NumberField as RACNumberField,\n Label,\n Input as RACInput,\n Group,\n Button as RACButton,\n Text,\n FieldError,\n type NumberFieldProps as RACNumberFieldProps,\n type ValidationResult,\n} from 'react-aria-components';\nimport { fieldClasses } from '../Field/Field';\nimport s from './NumberField.module.css';\n\n/** Props for {@link NumberField}, on top of React Aria's `NumberField` props. */\nexport type NumberFieldProps = Omit<RACNumberFieldProps, 'children' | 'className'> & {\n label?: ReactNode;\n description?: ReactNode;\n errorMessage?: ReactNode | ((v: ValidationResult) => ReactNode);\n /** Hide the up/down stepper buttons. Defaults to false. */\n hideSteppers?: boolean;\n /** Render with no box until focused — the readout treatment the property\n * rows use, for a value that sits inside other chrome rather than in a form. */\n ghost?: boolean;\n /** Native input placeholder — e.g. `'Mixed'` for a multi-selection\n * editor with no shared value. */\n placeholder?: string;\n /**\n * `'fill'` (the default) takes the width of whatever row the field sits in.\n * `'fit'` sizes it to `--wzl-number-field-width` (`9ch` by default) plus its\n * own chrome, rather than to the input's 20-character intrinsic width.\n */\n width?: 'fill' | 'fit';\n className?: string;\n};\n\n/**\n * Numeric input with stepper buttons, wrapping React Aria's NumberField and\n * supplying the same label / description / errorMessage slots as `Input`.\n * Arrow keys and scroll step the value; parsing and formatting are React\n * Aria's.\n *\n * `ref` forwards to the underlying `<input>`.\n */\nexport const NumberField = forwardRef(function NumberField(\n props: NumberFieldProps,\n ref: Ref<HTMLInputElement>,\n) {\n const {\n label,\n description,\n errorMessage,\n hideSteppers,\n ghost,\n placeholder,\n width = 'fill',\n className,\n ...rest\n } = props;\n return (\n <RACNumberField\n {...rest}\n className={[s.field, width === 'fit' && s.fit, fieldClasses.root, className]\n .filter(Boolean)\n .join(' ')}\n >\n {label !== undefined && <Label className={fieldClasses.label}>{label}</Label>}\n <Group className={ghost ? `${s.frame} ${s.ghost}` : s.frame}>\n <RACInput ref={ref} placeholder={placeholder} />\n {!hideSteppers && (\n <div className={s.steppers}>\n <RACButton slot=\"increment\" className={s.stepper} aria-label=\"Increment\">▲</RACButton>\n <RACButton slot=\"decrement\" className={s.stepper} aria-label=\"Decrement\">▼</RACButton>\n </div>\n )}\n </Group>\n {description !== undefined && (\n <Text slot=\"description\" className={fieldClasses.hint}>\n {description}\n </Text>\n )}\n <FieldError className={fieldClasses.error}>{errorMessage}</FieldError>\n </RACNumberField>\n );\n});\n","import { useRef, useState } from 'react';\nimport { formatNumber, parseNumber } from '../../format/number';\nimport { fieldClasses } from '../Field/Field';\nimport s from './NumberField.module.css';\n\n/** Props for {@link UnitField}. */\nexport interface UnitFieldProps {\n /** The value in the unit the field shows. NaN shows an empty field. */\n value: number;\n /** Fired with a value the field read and clamped, in the unit it shows. */\n onChange: (value: number) => void;\n minValue?: number;\n maxValue?: number;\n /** What an arrow key adds or takes away. Defaults to 1. */\n step?: number;\n /** Units a person may type, each mapped to the factor that turns a number\n * in it into the unit the field shows: `{ mm: 0.1, cm: 1 }`. */\n accepts?: Readonly<Record<string, number>>;\n placeholder?: string;\n /** Render with no box until focused, as {@link NumberField}'s `ghost` does. */\n ghost?: boolean;\n /** As {@link NumberField}'s `width`. */\n width?: 'fill' | 'fit';\n className?: string;\n 'aria-label'?: string;\n}\n\n/**\n * A number typed as text, so it can carry a unit: `12mm` in a field showing\n * centimeters commits `1.2`. Commits on blur or Enter, reverts on Escape or on\n * text it cannot read, clamps to its bounds, and steps with the arrow keys.\n * React Aria's `NumberField` refuses letters as they are typed, which is why\n * this is not that.\n */\nexport function UnitField({\n value,\n onChange,\n minValue,\n maxValue,\n step = 1,\n accepts,\n placeholder,\n ghost,\n width = 'fill',\n className,\n 'aria-label': ariaLabel,\n}: UnitFieldProps) {\n const [draft, setDraft] = useState<string | null>(null);\n const canceled = useRef(false);\n const text = Number.isFinite(value)\n ? formatNumber(value, { useGrouping: false, maximumFractionDigits: 20 })\n : '';\n const clamp = (n: number) =>\n Math.min(maxValue ?? Infinity, Math.max(minValue ?? -Infinity, n));\n const commit = (n: number) => {\n const next = clamp(n);\n if (next !== value) onChange(next);\n };\n\n return (\n <div\n className={[s.field, width === 'fit' && s.fit, fieldClasses.root, className]\n .filter(Boolean)\n .join(' ')}\n >\n <div className={ghost ? `${s.frame} ${s.ghost}` : s.frame}>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n aria-label={ariaLabel}\n placeholder={placeholder}\n value={draft ?? text}\n onChange={(e) => setDraft(e.target.value)}\n onFocus={() => {\n canceled.current = false;\n }}\n onBlur={() => {\n if (draft !== null && !canceled.current) {\n const n = parseNumber(draft, accepts);\n if (Number.isFinite(n)) commit(n);\n }\n setDraft(null);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.currentTarget.blur();\n } else if (e.key === 'Escape') {\n canceled.current = true;\n e.currentTarget.blur();\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const typed = draft === null ? value : parseNumber(draft, accepts);\n const from = Number.isFinite(typed) ? typed : 0;\n const next = clamp(from + (e.key === 'ArrowUp' ? step : -step));\n setDraft(null);\n if (next !== value) onChange(next);\n }\n }}\n />\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n RadioGroup as RACRadioGroup,\n Radio as RACRadio,\n Label,\n Text,\n FieldError,\n type RadioGroupProps as RACRadioGroupProps,\n type RadioProps as RACRadioProps,\n type ValidationResult,\n} from 'react-aria-components';\nimport { fieldClasses } from '../Field/Field';\nimport s from './RadioGroup.module.css';\n\n/** Props for {@link RadioGroup}, on top of React Aria's `RadioGroup` props. */\nexport type RadioGroupProps = Omit<RACRadioGroupProps, 'children' | 'className'> & {\n label?: ReactNode;\n description?: ReactNode;\n errorMessage?: ReactNode | ((v: ValidationResult) => ReactNode);\n children?: ReactNode;\n className?: string;\n};\n\n/**\n * A set of mutually exclusive choices, wrapping React Aria's RadioGroup and\n * supplying the same label / description / errorMessage slots as `Input`.\n * Holds {@link Radio} children.\n */\nexport function RadioGroup(props: RadioGroupProps) {\n const { label, description, errorMessage, children, className, ...rest } = props;\n return (\n <RACRadioGroup\n {...rest}\n className={[s.group, fieldClasses.root, className].filter(Boolean).join(' ')}\n >\n {label !== undefined && <Label className={s.legend}>{label}</Label>}\n {children}\n {description !== undefined && (\n <Text slot=\"description\" className={fieldClasses.hint}>\n {description}\n </Text>\n )}\n <FieldError className={fieldClasses.error}>{errorMessage}</FieldError>\n </RACRadioGroup>\n );\n}\n\n/** Props for {@link Radio}, on top of React Aria's `Radio` props. */\nexport type RadioProps = Omit<RACRadioProps, 'className' | 'children'> & {\n children?: ReactNode;\n className?: string;\n};\n\n/** One choice in a {@link RadioGroup}. The label is passed as children. */\nexport function Radio({ children, className, ...rest }: RadioProps) {\n return (\n <RACRadio {...rest} className={[s.radio, className].filter(Boolean).join(' ')}>\n <span className={s.dot} />\n {children !== undefined && <span>{children}</span>}\n </RACRadio>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n Slider as RACSlider,\n SliderOutput,\n SliderTrack,\n SliderThumb,\n Label,\n type SliderProps as RACSliderProps,\n} from 'react-aria-components';\nimport s from './RangeSlider.module.css';\n\n/** Props for {@link RangeSlider}, on top of React Aria's `Slider` props. */\nexport type RangeSliderProps = Omit<RACSliderProps, 'children' | 'className'> & {\n label?: ReactNode;\n /** Show the current value next to the label. Defaults to true when a\n * label is supplied. */\n showOutput?: boolean;\n /** Format the rendered value(s). Useful for units (`v => `${v}%``). */\n formatOutput?: (v: number | number[]) => ReactNode;\n className?: string;\n};\n\n/**\n * Linear range slider on React Aria. Single-value by default; pass an array\n * to `value` / `defaultValue` for multi-thumb. Distinct from `Slider`, which\n * is fully controlled and gives each thumb its own bounds and readout.\n *\n * The root is a column flex container and the track stretches to it, so\n * `align-items` on the root or on a wrapper that replaces it governs the\n * *horizontal* axis here and collapses the track to its content width. Style\n * the wrapper around one, not the root.\n */\nexport function RangeSlider(props: RangeSliderProps) {\n const { label, showOutput, formatOutput, className, ...rest } = props;\n const wantOutput = showOutput ?? label !== undefined;\n return (\n <RACSlider {...rest} className={[s.slider, className].filter(Boolean).join(' ')}>\n {(label !== undefined || wantOutput) && (\n <div className={s.head}>\n {label !== undefined && <Label className={s.label}>{label}</Label>}\n {wantOutput && (\n <SliderOutput className={s.output}>\n {({ state }) => {\n const v = state.values.length === 1 ? state.values[0] : state.values;\n return formatOutput ? formatOutput(v) : Array.isArray(v) ? v.join(' – ') : String(v);\n }}\n </SliderOutput>\n )}\n </div>\n )}\n <SliderTrack className={s.track}>\n {({ state }) => {\n // Single-thumb: fill from start to thumb. Multi-thumb: fill\n // between adjacent thumbs (simplest = between first and last).\n const fillStart = state.values.length > 1 ? state.getThumbPercent(0) * 100 : 0;\n const fillEnd = state.getThumbPercent(state.values.length - 1) * 100;\n return (\n <>\n <div\n className={s.fill}\n style={{ left: `${fillStart}%`, right: `${100 - fillEnd}%` }}\n />\n {state.values.map((_, i) => (\n <SliderThumb key={i} index={i} className={s.thumb} />\n ))}\n </>\n );\n }}\n </SliderTrack>\n </RACSlider>\n );\n}\n","import { forwardRef, type ReactNode, type Ref } from 'react';\nimport {\n Switch as RACSwitch,\n type SwitchProps as RACSwitchProps,\n} from 'react-aria-components';\nimport s from './Switch.module.css';\n\n/**\n * Props for {@link Switch}, on top of React Aria's `Switch` props. The label\n * is passed as children.\n */\nexport type SwitchProps = Omit<RACSwitchProps, 'children' | 'className'> & {\n children?: ReactNode;\n className?: string;\n};\n\n/**\n * On/off toggle wrapping React Aria's Switch, skinned against the `--wzl-*`\n * tokens. Use for a setting that takes effect immediately; use `Checkbox`\n * for one that is submitted with a form.\n *\n * `ref` forwards to the underlying label element.\n */\nexport const Switch = forwardRef(function Switch(\n props: SwitchProps,\n ref: Ref<HTMLLabelElement>,\n) {\n const { children, className, ...rest } = props;\n return (\n <RACSwitch\n {...rest}\n ref={ref}\n className={[s.switch, className].filter(Boolean).join(' ')}\n >\n <span className={s.track}>\n <span className={s.thumb} />\n </span>\n {children !== undefined && <span className={s.label}>{children}</span>}\n </RACSwitch>\n );\n});\n","// Preference-schema vocabulary for PrefsForm / PrefsDialog / SelectionPanel:\n// core's `ToolPref*` family under this package's names. Never re-declare them\n// here — this was a hand-kept structural copy until it drifted, and the\n// independence from `@weasel-js/core` it bought is long gone anyway.\n\nexport type {\n ToolPref as BuiltinPref,\n ToolPrefBoolean as PrefBoolean,\n ToolPrefBooleanControl as PrefBooleanControl,\n ToolPrefColor as PrefColor,\n ToolPrefCustom as PrefCustom,\n ToolPrefEnum as PrefEnum,\n ToolPrefEnumControl as PrefEnumControl,\n ToolPrefEnumEncoding as PrefEnumEncoding,\n ToolPrefGroup as PrefGroup,\n ToolPrefKind as PrefKind,\n ToolPrefLeaf as PrefLeaf,\n ToolPrefNumber as PrefNumber,\n ToolPrefNumberControl as PrefNumberControl,\n ToolPrefNumberFormat as PrefNumberFormat,\n ToolPrefNumberUnit as PrefNumberUnit,\n ToolPrefObject as PrefObject,\n ToolPrefPaint as PrefPaint,\n ToolPrefString as PrefString,\n ToolPrefStringControl as PrefStringControl,\n} from '@weasel-js/core';\n\nimport type { ToolPrefGroup, ToolPrefLeaf, ToolPrefNumber, ToolPrefNumberUnit as PrefNumberUnitType } from '@weasel-js/core';\n\n/**\n * A number leaf's bounds in the unit it is displayed in.\n *\n * Only what the leaf declares converts: an omitted bound has no stored\n * counterpart to put through the conversion, and its fallback — 0..100 for a\n * slider's track, a step of 1 — is a display-space number already. `min` and\n * `max` are points, so they convert the way the value does; `step` is a\n * distance, and a unit with an offset maps zero somewhere else, so converting\n * it as a point would scale it wrong. A decreasing conversion swaps which end\n * is the lower one.\n */\nexport function prefDisplayBounds(\n p: ToolPrefNumber,\n): { min?: number; max?: number; step: number } {\n if (!p.unit) return { min: p.min, max: p.max, step: p.step ?? 1 };\n const { toDisplay } = p.unit;\n const lo = p.min === undefined ? undefined : toDisplay(p.min);\n const hi = p.max === undefined ? undefined : toDisplay(p.max);\n const flipped = lo !== undefined && hi !== undefined && lo > hi;\n const step = p.step === undefined\n ? 1\n : Math.abs(toDisplay(p.step) - toDisplay(0)) || p.step;\n return { min: flipped ? hi : lo, max: flipped ? lo : hi, step };\n}\n\n/** What a unit leaf's field reads as typed text: its `accepts` table, and its\n * `suffix` as the display unit itself. */\nexport function prefUnitAccepts(unit: PrefNumberUnitType): Readonly<Record<string, number>> {\n return unit.suffix === undefined ? { ...unit.accepts } : { [unit.suffix]: 1, ...unit.accepts };\n}\n\n/** Distinguishes a leaf from a group while walking a schema tree. */\nexport function isPrefLeaf(node: ToolPrefLeaf | ToolPrefGroup): node is ToolPrefLeaf {\n return 'kind' in node;\n}\n\n/** Get the value at a dotted path inside a nested value tree. Returns\n * `undefined` when a segment is missing or hits a non-object. */\nexport function prefValueAtPath(values: unknown, path: string): unknown {\n let cur: unknown = values;\n for (const seg of path.split('.')) {\n if (cur == null || typeof cur !== 'object') return undefined;\n cur = (cur as Record<string, unknown>)[seg];\n }\n return cur;\n}\n\n/**\n * Recursively drop `hidden` leaves (unless `showHidden`), pruning groups\n * that end up empty. Returns null when the entire subtree is hidden.\n */\nexport function visiblePrefSubtree<T extends ToolPrefLeaf | ToolPrefGroup>(\n node: T,\n showHidden: boolean,\n): T | null {\n if (isPrefLeaf(node)) return node.hidden && !showHidden ? null : node;\n const group = node as ToolPrefGroup;\n const children: Record<string, ToolPrefLeaf | ToolPrefGroup> = {};\n for (const [key, child] of Object.entries(group.children)) {\n const kept = visiblePrefSubtree(child, showHidden);\n if (kept) children[key] = kept;\n }\n if (Object.keys(children).length === 0) return null;\n return { ...node, children };\n}\n","import type { ReactNode } from 'react';\nimport {\n Modal as RACModal,\n ModalOverlay,\n Dialog as RACDialog,\n Heading,\n type ModalOverlayProps,\n type DialogProps as RACDialogProps,\n} from 'react-aria-components';\nimport { useOverlayPortal, type OverlayPortalProps, type WithoutPortalTarget } from '../../overlays/portalHost';\nimport s from './Dialog.module.css';\n\n/** Props for {@link Dialog}, on top of React Aria's `ModalOverlay` props. */\nexport type DialogProps = Omit<\n WithoutPortalTarget<ModalOverlayProps>,\n 'children' | 'className'\n> &\n OverlayPortalProps & {\n /** Heading rendered in the dialog's default header. Omit when supplying\n * a custom `header` slot via children. */\n title?: ReactNode;\n /** Show the built-in close button. Defaults to true when `onOpenChange`\n * is wired so the user has an escape hatch. */\n showCloseButton?: boolean;\n /** Body content. */\n children?: ReactNode;\n /** Footer slot — typically action buttons. */\n footer?: ReactNode;\n /** ARIA role. Defaults to `dialog`. Use `alertdialog` for confirms. */\n role?: RACDialogProps['role'];\n /** Class applied to the modal box (inside the overlay). */\n className?: string;\n };\n\n/**\n * Modal dialog wrapping React Aria. Supplies a default header (title +\n * close), scrollable body, and footer slot. Pass `isOpen` + `onOpenChange`\n * for controlled visibility, or omit both and use a `<DialogTrigger>` from\n * `react-aria-components` upstream of this component.\n *\n * Escape, click-outside, focus trap, and scroll lock all come from the\n * underlying primitives.\n */\nexport function Dialog(props: DialogProps) {\n const {\n title,\n showCloseButton,\n children,\n footer,\n role = 'dialog',\n className,\n isOpen,\n onOpenChange,\n portalContainer,\n ...rest\n } = props;\n\n const showClose = showCloseButton ?? Boolean(onOpenChange);\n const { anchor, portalProps } = useOverlayPortal(portalContainer);\n\n return (\n <>\n {anchor}\n <ModalOverlay\n {...rest}\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n className={s.overlay}\n data-weasel-overlay=\"\"\n {...portalProps}\n >\n <RACModal className={[s.modal, className].filter(Boolean).join(' ')}>\n <RACDialog role={role} className={s.dialog}>\n {({ close }) => (\n <>\n {(title !== undefined || showClose) && (\n <header className={s.header}>\n {title !== undefined && (\n <Heading slot=\"title\" className={s.title}>{title}</Heading>\n )}\n {showClose && (\n <button\n type=\"button\"\n className={s.close}\n onClick={close}\n aria-label=\"Close dialog\"\n >\n ×\n </button>\n )}\n </header>\n )}\n <div className={s.body}>{children}</div>\n {footer !== undefined && <footer className={s.footer}>{footer}</footer>}\n </>\n )}\n </RACDialog>\n </RACModal>\n </ModalOverlay>\n </>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n TooltipTrigger as RACTooltipTrigger,\n Tooltip as RACTooltip,\n OverlayArrow,\n type TooltipProps as RACTooltipProps,\n type TooltipTriggerComponentProps,\n} from 'react-aria-components';\nimport { useOverlayPortal, type OverlayPortalProps, type WithoutPortalTarget } from '../../overlays/portalHost';\nimport s from './Tooltip.module.css';\n\n/**\n * Props for {@link TooltipTrigger} — React Aria's `TooltipTrigger` props\n * unchanged.\n */\nexport type TooltipTriggerProps = TooltipTriggerComponentProps;\n\n/**\n * TooltipTrigger with kit defaults: ~600 ms open delay, instant close.\n * Wrap a focusable trigger plus a `<Tooltip>`. Non-RAC triggers (plain\n * `<button>` etc.) must be wrapped in `<Focusable>` from\n * react-aria-components so hover/focus props reach the DOM node.\n *\n * Caveat: while a tooltip is open, react-aria captures the first Escape\n * keydown (document-level, capture phase) to dismiss it — app-level\n * Escape handlers (deselect, cancel gesture) see only the second press.\n */\nexport function TooltipTrigger(props: TooltipTriggerProps) {\n const { delay = 600, closeDelay = 0, ...rest } = props;\n return <RACTooltipTrigger delay={delay} closeDelay={closeDelay} {...rest} />;\n}\n\n/** Props for {@link Tooltip}, on top of React Aria's `Tooltip` props. */\nexport type TooltipProps = Omit<WithoutPortalTarget<RACTooltipProps>, 'children' | 'className'> &\n OverlayPortalProps & {\n children?: ReactNode;\n className?: string;\n };\n\n/**\n * Tooltip bubble with an arrow pointing at the trigger. Non-interactive\n * content only (ARIA tooltip semantics). Use inside `<TooltipTrigger>`.\n */\nexport function Tooltip(props: TooltipProps) {\n const { children, className, placement = 'top', offset = 8, portalContainer, ...rest } = props;\n const { anchor, portalProps } = useOverlayPortal(portalContainer);\n return (\n <>\n {anchor}\n <RACTooltip\n {...rest}\n placement={placement}\n offset={offset}\n className={[s.tooltip, className].filter(Boolean).join(' ')}\n data-weasel-overlay=\"\"\n {...portalProps}\n >\n <OverlayArrow className={s.arrow}>\n <svg width={8} height={8} viewBox=\"0 0 8 8\" aria-hidden=\"true\">\n <path d=\"M0 0 L4 4 L8 0\" />\n </svg>\n </OverlayArrow>\n {children}\n </RACTooltip>\n </>\n );\n}\n","import { useSyncExternalStore, type ReactNode } from 'react';\nimport { Focusable } from 'react-aria-components';\nimport {\n useActionsRegistry,\n useOptionalDepRegistry,\n evaluateEnabled,\n type Action,\n} from '@weasel-js/core';\nimport { Tooltip, TooltipTrigger } from '../Tooltip';\nimport s from './ActionBar.module.css';\n\nconst EMPTY_LIST: readonly Action[] = Object.freeze([]);\nconst noopSubscribe = (): (() => void) => () => {};\n\n/** Props for {@link ActionBar}. */\nexport interface ActionBarProps {\n /** Group key — only actions with `action.group === group` are rendered. */\n group: string;\n /** Layout direction. Defaults to `'horizontal'`. */\n orientation?: 'horizontal' | 'vertical';\n /**\n * Per-id icon overrides — keyed by `action.id`. When an entry is provided\n * it replaces the action's own `icon` for this bar only. Mirrors\n * `PathfinderPanelProps.icons` so call sites that ship custom glyph sets\n * can swap them in without re-registering actions.\n */\n icons?: Record<string, ReactNode>;\n /**\n * Per-id label overrides — keyed by `action.id`. Drives both `aria-label`\n * and `title`. When omitted, the action's own `label` is used.\n */\n labels?: Record<string, string>;\n /** Additional class for the toolbar root. */\n className?: string;\n}\n\nfunction resolveIcon(action: Action, override: ReactNode | undefined): ReactNode {\n if (override !== undefined) return override;\n const i = action.icon;\n if (typeof i === 'function') return i();\n return i;\n}\n\nfunction resolveTitle(label: string, shortcut: string | undefined): string {\n return shortcut ? `${label} (${shortcut})` : label;\n}\n\n/**\n * Generic group-keyed action toolbar. Reads the parent `ActionsRegistry`,\n * filters to actions whose `group` matches `props.group`, and renders one\n * icon button per match. Disabled state is derived from each action's\n * `enabled` predicate via `evaluateEnabled` (so the button greys out and\n * swallows clicks while the keybinding — if any — still fires through the\n * registry's keydown listener; that's the registry's contract, not ours).\n *\n * Visual parity with the WeaselDraw `<PathfinderPanel>` is intentional;\n * this is the generic, registry-driven version. No keyboard navigation\n * (roving tabindex) yet — bar consumers today are short flat strips. Add\n * if/when a long bar lands.\n */\nexport function ActionBar(props: ActionBarProps) {\n const { group, orientation = 'horizontal', icons, labels, className } = props;\n const registry = useActionsRegistry();\n const depReg = useOptionalDepRegistry();\n const all = useSyncExternalStore(\n registry ? registry.subscribe : noopSubscribe,\n registry ? registry.list : () => EMPTY_LIST,\n registry ? registry.list : () => EMPTY_LIST,\n );\n const actions = all.filter((a) => a.group === group);\n\n // Build the deps bag fresh each render — predicates read selection / etc.\n // from these. ActionBar relies on its parent re-rendering when the\n // underlying state changes (e.g. the consumer reads `selection.current`\n // somewhere above us) for `enabled` to reflect the latest values.\n const deps = depReg\n ? {\n selection: depReg.get('selection'),\n scene: depReg.get('scene'),\n history: depReg.get('history'),\n view: depReg.get('view'),\n activeTool: depReg.get('activeTool'),\n booleansAdapter: depReg.get('booleansAdapter'),\n }\n : undefined;\n\n const cls = [s.bar, orientation === 'vertical' && s.vertical, className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={cls} role=\"toolbar\" aria-label={`${group} actions`}>\n {actions.map((action) => {\n const label = labels?.[action.id] ?? action.label;\n const icon = resolveIcon(action, icons?.[action.id]);\n const { enabled } = evaluateEnabled(action, deps);\n const disabled = !enabled;\n const title = resolveTitle(label, action.shortcut);\n return (\n <TooltipTrigger key={action.id} isDisabled={disabled}>\n <Focusable isDisabled={disabled}>\n <button\n type=\"button\"\n data-testid={`action-bar-item-${action.id}`}\n aria-label={label}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n className={s.button}\n onClick={() => {\n if (disabled) return;\n // Dispatch through the registry so the enabled() guard runs.\n // If no registry is in scope the click is a no-op — ActionBar\n // is expected to render under an `ActionsProvider`.\n registry?.trigger(action.id);\n }}\n >\n {icon}\n </button>\n </Focusable>\n <Tooltip>{title}</Tooltip>\n </TooltipTrigger>\n );\n })}\n </div>\n );\n}\n","import type { ShapeModule } from '../types';\n\nconst Pill: ShapeModule = {\n Component: () => null,\n insets: { top: 0, right: 0, bottom: 0, left: 0 },\n stretches: true,\n renderMode: 'css',\n};\n\nexport default Pill;\n","import type { ShapeModule } from '../types';\n\nconst Plain: ShapeModule = {\n Component: () => null,\n insets: { top: 0, right: 0, bottom: 0, left: 0 },\n stretches: true,\n renderMode: 'css',\n};\n\nexport default Plain;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface SquareParams {\n /** 0..1 fraction of the maximum corner rounding (1 = full pill). */\n erosion?: number;\n}\n\nconst DEFAULTS: Required<SquareParams> = { erosion: 0.16 };\n\nconst Square: ShapeModule<SquareParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return { base: 'rounded-rect', baseParams: { erosion: cfg.erosion } };\n },\n insets: { top: 0, right: 0, bottom: 0, left: 0 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Square;\n","import type { ShapeModule } from '../types';\n\nexport interface NotchedParams {\n /** 0..1 fraction of max corner radius. */\n erosion?: number;\n /** rx/ry eccentricity of the corner arcs. */\n eccentricity?: number;\n}\n\nconst DEFAULTS: Required<NotchedParams> = { erosion: 0.28, eccentricity: 1 };\n\nfunction notchedPath(r: number, ecc: number) {\n const W = 100, H = 100;\n const rx = r * ecc;\n const ry = r / ecc;\n return [\n `M ${rx} 0`,\n `L ${W - rx} 0`,\n `A ${rx} ${ry} 0 0 0 ${W} ${ry}`,\n `L ${W} ${H - ry}`,\n `A ${rx} ${ry} 0 0 0 ${W - rx} ${H}`,\n `L ${rx} ${H}`,\n `A ${rx} ${ry} 0 0 0 0 ${H - ry}`,\n `L 0 ${ry}`,\n `A ${rx} ${ry} 0 0 0 ${rx} 0`,\n 'Z',\n ].join(' ');\n}\n\nconst Notched: ShapeModule<NotchedParams> = {\n Component: ({ variant, focused, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const e = Math.max(0, Math.min(cfg.erosion, 1));\n const r = e * 49;\n const ecc = Math.max(0.2, Math.min(cfg.eccentricity, 5));\n const d = notchedPath(r, ecc);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && (\n <path className=\"badge-fill\" d={d} />\n )}\n {(variant === 'outline' || variant === 'solid') && (\n <path className=\"badge-stroke\" d={d} />\n )}\n {focused && <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.06) translate(-50 -50)\" />}\n </>\n );\n },\n insets: { top: 0, right: 4, bottom: 0, left: 4 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Notched;\n","import { useLayoutEffect, useState, type RefObject } from 'react';\n\n/**\n * Live CSS-pixel size of the SVG `ref`'s element belongs to; an outermost `<svg>` is its own.\n * `when` both gates the measurement and re-measures whenever its identity changes.\n */\nexport function useSvgBox(ref: RefObject<SVGElement | null>, when: unknown = true): { w: number; h: number } {\n const [box, setBox] = useState({ w: 100, h: 100 });\n\n useLayoutEffect(() => {\n const el = when ? ref.current : null;\n const svg = el?.ownerSVGElement ?? el;\n if (!svg) return;\n const update = () => {\n const r = svg.getBoundingClientRect();\n if (r.width > 0 && r.height > 0) setBox({ w: r.width, h: r.height });\n };\n update();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(update);\n ro.observe(svg);\n return () => ro.disconnect();\n }, [ref, when]);\n\n return box;\n}\n","import { useEffect, useId, useRef } from 'react';\nimport type { ShapeModule } from '../types';\nimport { useSvgBox } from '../useSvgBox';\n\nexport interface PerforatedParams {\n holeRadius?: number;\n holePitch?: number;\n}\n\nconst DEFAULTS: Required<PerforatedParams> = { holeRadius: 3.5, holePitch: 11 };\n\nfunction PerforatedComponent({ variant, focused, params }: {\n variant: 'outline' | 'solid' | 'subtle';\n focused: boolean;\n params: PerforatedParams;\n}) {\n const cfg = { ...DEFAULTS, ...params };\n const maskId = useId();\n const ref = useRef<SVGGElement>(null);\n const box = useSvgBox(ref);\n\n // Convert CSS-px hole sizing into viewBox units so holes look circular on either axis.\n const rx = (cfg.holeRadius / box.w) * 100;\n const ry = (cfg.holeRadius / box.h) * 100;\n const nH = Math.max(2, Math.round(box.w / cfg.holePitch));\n const nV = Math.max(2, Math.round(box.h / cfg.holePitch));\n\n const notches: { cx: number; cy: number }[] = [];\n for (let i = 0; i < nH; i++) {\n const t = (i + 0.5) / nH;\n notches.push({ cx: t * 100, cy: 0 });\n notches.push({ cx: t * 100, cy: 100 });\n }\n for (let i = 0; i < nV; i++) {\n const t = (i + 0.5) / nV;\n notches.push({ cx: 0, cy: t * 100 });\n notches.push({ cx: 100, cy: t * 100 });\n }\n\n return (\n <g ref={ref}>\n <defs>\n <mask id={maskId} maskUnits=\"userSpaceOnUse\" x=\"-5\" y=\"-5\" width=\"110\" height=\"110\">\n <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill=\"white\" />\n {notches.map((n, i) => (\n <ellipse key={i} cx={n.cx} cy={n.cy} rx={rx} ry={ry} fill=\"black\" />\n ))}\n </mask>\n </defs>\n {(variant === 'solid' || variant === 'subtle') && (\n <rect className=\"badge-fill\" x=\"0\" y=\"0\" width=\"100\" height=\"100\" mask={`url(#${maskId})`} />\n )}\n {(variant === 'outline' || variant === 'solid') && (\n <rect className=\"badge-stroke\" x=\"0\" y=\"0\" width=\"100\" height=\"100\" mask={`url(#${maskId})`} />\n )}\n {focused && (\n <rect className=\"badge-focus\" x=\"-4\" y=\"-4\" width=\"108\" height=\"108\" mask={`url(#${maskId})`} />\n )}\n </g>\n );\n}\n\n// Avoid unused warning while keeping useEffect imported elsewhere if needed in future.\nvoid useEffect;\n\nconst Perforated: ShapeModule<PerforatedParams> = {\n Component: PerforatedComponent,\n insets: { top: 2, right: 4, bottom: 2, left: 4 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Perforated;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface HexagonParams {\n tipHeight?: number;\n /** Truncate the top and bottom tips, leaving a horizontal flat edge.\n * Measured as a distance from each tip vertically (0 = sharp point, tipHeight = fully flat). */\n tipTruncation?: number;\n}\n\nconst DEFAULTS: Required<HexagonParams> = { tipHeight: 25, tipTruncation: 0 };\n\nfunction hexVerts(tip: number, truncation: number): [number, number][] {\n const t = Math.max(0, Math.min(tip, 49));\n const trunc = Math.max(0, Math.min(truncation, t));\n if (trunc <= 0) {\n return [[50, 0], [100, t], [100, 100 - t], [50, 100], [0, 100 - t], [0, t]];\n }\n const ratio = trunc / t;\n const xL = 50 - 50 * ratio;\n const xR = 50 + 50 * ratio;\n return [\n [xL, trunc], [xR, trunc],\n [100, t], [100, 100 - t],\n [xR, 100 - trunc], [xL, 100 - trunc],\n [0, 100 - t], [0, t],\n ];\n}\n\nconst Hexagon: ShapeModule<HexagonParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return { base: 'polygon', baseParams: { vertices: hexVerts(cfg.tipHeight, cfg.tipTruncation) } };\n },\n insets: { top: 4, right: 6, bottom: 4, left: 6 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Hexagon;\n","import type { ShapeModule } from '../types';\n\nexport interface StarburstParams {\n points?: number;\n outerR?: number;\n innerR?: number;\n rotation?: number;\n erosion?: number;\n}\n\nconst DEFAULTS: Required<StarburstParams> = {\n points: 12,\n outerR: 48,\n innerR: 36,\n rotation: -7,\n erosion: 0,\n};\n\nfunction starburstPath(points: number, outerR: number, innerR: number, rotationDeg: number, erosion: number) {\n const cx = 50, cy = 50;\n const total = points * 2;\n const step = (Math.PI * 2) / total;\n const start = (rotationDeg * Math.PI) / 180;\n const rnd = Math.max(0, Math.min(erosion, 1));\n const pts: [number, number][] = [];\n for (let i = 0; i < total; i++) {\n const r = i % 2 === 0 ? outerR : innerR;\n const a = start + i * step;\n pts.push([cx + Math.cos(a) * r, cy + Math.sin(a) * r]);\n }\n if (rnd <= 0) {\n let d = '';\n for (let i = 0; i < pts.length; i++) {\n d += (i === 0 ? 'M ' : ' L ') + pts[i][0].toFixed(2) + ' ' + pts[i][1].toFixed(2);\n }\n return d + ' Z';\n }\n let d = '';\n for (let i = 0; i < pts.length; i++) {\n const prev = pts[(i + pts.length - 1) % pts.length];\n const curr = pts[i];\n const next = pts[(i + 1) % pts.length];\n const t = rnd * 0.45;\n const enterX = curr[0] + (prev[0] - curr[0]) * t;\n const enterY = curr[1] + (prev[1] - curr[1]) * t;\n const exitX = curr[0] + (next[0] - curr[0]) * t;\n const exitY = curr[1] + (next[1] - curr[1]) * t;\n if (i === 0) d += `M ${enterX.toFixed(2)} ${enterY.toFixed(2)}`;\n else d += ` L ${enterX.toFixed(2)} ${enterY.toFixed(2)}`;\n d += ` Q ${curr[0].toFixed(2)} ${curr[1].toFixed(2)} ${exitX.toFixed(2)} ${exitY.toFixed(2)}`;\n }\n return d + ' Z';\n}\n\nconst Starburst: ShapeModule<StarburstParams> = {\n Component: ({ variant, focused, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const d = starburstPath(cfg.points, cfg.outerR, cfg.innerR, cfg.rotation, cfg.erosion);\n const dFocus = starburstPath(cfg.points, cfg.outerR + 4, cfg.innerR + 3, cfg.rotation, cfg.erosion);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && <path className=\"badge-focus\" d={dFocus} />}\n </>\n );\n },\n insets: { top: 8, right: 8, bottom: 8, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Starburst;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface ScallopedParams {\n scallopRadius?: number;\n scallopSpacing?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<ScallopedParams> = { scallopRadius: 5, scallopSpacing: 12, irregularity: 0 };\n\nconst Scalloped: ShapeModule<ScallopedParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n base: 'rounded-rect',\n baseParams: { erosion: 0 },\n effects: [\n {\n type: 'scallops',\n params: { scallopRadius: cfg.scallopRadius, scallopSpacing: cfg.scallopSpacing, irregularity: cfg.irregularity },\n },\n ],\n };\n },\n insets: { top: 4, right: 6, bottom: 4, left: 6 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Scalloped;\n","import { useRef } from 'react';\nimport type { ShapeModule } from '../types';\nimport { useSvgBox } from '../useSvgBox';\n\nexport interface ShieldParams {\n pointDepth?: number;\n shoulderY?: number;\n curveTightness?: number;\n /** 0..1 fraction of max top-corner rounding. */\n erosion?: number;\n}\n\nconst DEFAULTS: Required<ShieldParams> = {\n pointDepth: 100,\n shoulderY: 55,\n curveTightness: 0.7,\n erosion: 0.33,\n};\n\nfunction ShieldComponent({ variant, focused, params }: {\n variant: 'outline' | 'solid' | 'subtle';\n focused: boolean;\n params: ShieldParams;\n}) {\n const cfg = { ...DEFAULTS, ...params };\n const ref = useRef<SVGGElement>(null);\n const box = useSvgBox(ref);\n\n const pd = Math.max(60, Math.min(cfg.pointDepth, 110));\n const sh = Math.max(20, Math.min(cfg.shoulderY, pd - 5));\n const cpY = sh + (pd - sh) * Math.max(0.1, Math.min(cfg.curveTightness, 1));\n // Aspect-aware top corner radii (so the rounded corners stay circular in CSS).\n const cornerCss = Math.max(0, Math.min(cfg.erosion, 1)) * 12;\n const rxC = (cornerCss / box.w) * 100;\n const ryC = (cornerCss / box.h) * 100;\n const d = [\n `M ${rxC.toFixed(3)} 0`,\n `L ${(100 - rxC).toFixed(3)} 0`,\n `A ${rxC.toFixed(3)} ${ryC.toFixed(3)} 0 0 1 100 ${ryC.toFixed(3)}`,\n `L 100 ${sh}`,\n `Q 100 ${cpY} 50 ${pd}`,\n `Q 0 ${cpY} 0 ${sh}`,\n `L 0 ${ryC.toFixed(3)}`,\n `A ${rxC.toFixed(3)} ${ryC.toFixed(3)} 0 0 1 ${rxC.toFixed(3)} 0`,\n 'Z',\n ].join(' ');\n return (\n <g ref={ref}>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && (\n <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.06) translate(-50 -50)\" />\n )}\n </g>\n );\n}\n\nconst Shield: ShapeModule<ShieldParams> = {\n Component: ShieldComponent,\n insets: { top: 2, right: 8, bottom: 14, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Shield;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport type RibbonEnd = 'inward' | 'outward' | 'flat';\n\nexport interface RibbonParams {\n left?: RibbonEnd;\n right?: RibbonEnd;\n /** Taper depth in CSS px. The actual pointer width stays fixed regardless\n * of badge width — the underlying base recomputes viewBox vertices at\n * build time using the rendered box dimensions. */\n taperWidth?: number;\n}\n\nconst DEFAULTS: Required<RibbonParams> = { left: 'inward', right: 'outward', taperWidth: 8 };\n\nconst Ribbon: ShapeModule<RibbonParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return { base: 'ribbon', baseParams: cfg };\n },\n // Unused at render time when `compose` is set — the base's insets win — but\n // required by the ShapeModule contract.\n insets: { top: 0, right: 0, bottom: 0, left: 0 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Ribbon;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface BeavisParams {\n points?: number;\n cornerRadius?: number;\n spikeLen?: number;\n spikeBaseWidth?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<BeavisParams> = {\n points: 44,\n cornerRadius: 6,\n spikeLen: 12,\n spikeBaseWidth: 3,\n irregularity: 0,\n};\n\nconst Beavis: ShapeModule<BeavisParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n // Nominal badge half-height for cornerRadius → erosion: real badges are ~22px tall\n // so half = 11. Clamp into [0,1].\n const erosion = Math.max(0, Math.min(1, cfg.cornerRadius / 11));\n return {\n base: 'rounded-rect',\n baseParams: { erosion },\n effects: [\n {\n type: 'spikes',\n params: {\n count: cfg.points,\n length: cfg.spikeLen,\n baseWidth: cfg.spikeBaseWidth,\n vertScale: 1,\n horzScale: 1,\n diagonalScale: 1,\n irregularity: cfg.irregularity,\n },\n },\n ],\n };\n },\n insets: { top: 6, right: 8, bottom: 6, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Beavis;\n","import type { ShapeModule } from '../types';\n\nexport interface SparklerParams {\n points?: number;\n outerR?: number;\n innerR?: number;\n rotation?: number;\n}\n\nconst DEFAULTS: Required<SparklerParams> = {\n points: 16,\n outerR: 58,\n innerR: 50,\n rotation: -5,\n};\n\nfunction sparklerPath(points: number, outerR: number, innerR: number, rotation: number) {\n const cx = 50, cy = 50;\n const total = points * 2;\n const step = (Math.PI * 2) / total;\n const start = (rotation * Math.PI) / 180;\n let d = '';\n for (let i = 0; i < total; i++) {\n const r = i % 2 === 0 ? outerR : innerR;\n const a = start + i * step;\n const x = cx + Math.cos(a) * r;\n const y = cy + Math.sin(a) * r;\n d += (i === 0 ? 'M ' : ' L ') + x.toFixed(2) + ' ' + y.toFixed(2);\n }\n return d + ' Z';\n}\n\nconst Sparkler: ShapeModule<SparklerParams> = {\n Component: ({ variant, focused, params }) => {\n const { points, outerR, innerR, rotation } = { ...DEFAULTS, ...params };\n const d = sparklerPath(points, outerR, innerR, rotation);\n const dFocus = sparklerPath(points, outerR + 4, innerR + 3, rotation);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && <path className=\"badge-focus\" d={dFocus} />}\n </>\n );\n },\n insets: { top: 4, right: 4, bottom: 4, left: 4 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Sparkler;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface PostageParams {\n biteRadius?: number;\n biteSpacing?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<PostageParams> = { biteRadius: 3, biteSpacing: 8, irregularity: 0 };\n\nconst Postage: ShapeModule<PostageParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n base: 'rounded-rect',\n baseParams: { erosion: 0 },\n effects: [\n {\n type: 'bites',\n params: { biteRadius: cfg.biteRadius, biteSpacing: cfg.biteSpacing, irregularity: cfg.irregularity },\n },\n ],\n };\n },\n insets: { top: 4, right: 6, bottom: 4, left: 6 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Postage;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface CloudParams {\n bumpWidth?: number;\n puffiness?: number;\n /** 0..1 fraction of max body roundness. */\n erosion?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<CloudParams> = {\n bumpWidth: 24,\n puffiness: 14,\n erosion: 0.2,\n irregularity: 0,\n};\n\nconst Cloud: ShapeModule<CloudParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n base: 'rounded-rect',\n baseParams: { erosion: cfg.erosion },\n effects: [\n {\n type: 'puffs',\n params: { bumpWidth: cfg.bumpWidth, puffiness: cfg.puffiness, irregularity: cfg.irregularity },\n },\n ],\n };\n },\n insets: { top: 6, right: 8, bottom: 6, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Cloud;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface HouseParams {\n eaveY?: number;\n peakHeight?: number;\n roofOverhang?: number;\n}\n\nconst DEFAULTS: Required<HouseParams> = { eaveY: 32, peakHeight: 32, roofOverhang: 0 };\n\nconst House: ShapeModule<HouseParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n const ey = Math.max(2, Math.min(cfg.eaveY, 95));\n const peakY = ey - Math.max(0, cfg.peakHeight);\n const ov = Math.max(0, Math.min(cfg.roofOverhang, 12));\n return {\n base: 'polygon',\n baseParams: {\n vertices: [\n [50, peakY],\n [100 + ov, ey],\n [100, ey],\n [100, 100],\n [0, 100],\n [0, ey],\n [-ov, ey],\n ],\n },\n };\n },\n insets: { top: 10, right: 4, bottom: 0, left: 4 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default House;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport type PlaqueCorner = 'tl' | 'tr' | 'bl' | 'br';\n\nexport interface PlaqueParams {\n bevelWidth?: number;\n lightFrom?: PlaqueCorner;\n rivetRadius?: number;\n rivetInset?: number;\n sheenIntensity?: number;\n}\n\nconst DEFAULTS: Required<PlaqueParams> = {\n bevelWidth: 6,\n lightFrom: 'tl',\n rivetRadius: 2.4,\n rivetInset: 7,\n sheenIntensity: 0.22,\n};\n\nconst Plaque: ShapeModule<PlaqueParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n base: 'rounded-rect',\n baseParams: { erosion: 0 },\n effects: [\n { type: 'bevel', params: { bevelWidth: cfg.bevelWidth, lightFrom: cfg.lightFrom } },\n { type: 'sheen', params: { lightFrom: cfg.lightFrom, intensity: cfg.sheenIntensity } },\n { type: 'rivets', params: { radius: cfg.rivetRadius, inset: cfg.rivetInset, lightFrom: cfg.lightFrom } },\n ],\n };\n },\n insets: { top: 6, right: 8, bottom: 6, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Plaque;\n","import type { ShapeModule } from '../types';\n\nexport interface CrestParams {\n topInset?: number;\n pointDepth?: number;\n}\n\nconst DEFAULTS: Required<CrestParams> = { topInset: 12, pointDepth: 100 };\n\nfunction crestPath(topInset: number, pointDepth: number) {\n const ti = Math.max(0, Math.min(topInset, 35));\n const pd = Math.max(60, Math.min(pointDepth, 110));\n // 5-sided shield silhouette with rounded shoulders and a bottom point.\n return [\n `M ${ti} 6`,\n `Q ${ti / 2} 0 ${ti + 4} 0`,\n `L ${100 - ti - 4} 0`,\n `Q ${100 - ti / 2} 0 ${100 - ti} 6`,\n `L ${100 - ti * 0.4} ${pd * 0.35}`,\n `Q ${100 - ti} ${pd * 0.7} 50 ${pd}`,\n `Q ${ti} ${pd * 0.7} ${ti * 0.4} ${pd * 0.35}`,\n 'Z',\n ].join(' ');\n}\n\nconst Crest: ShapeModule<CrestParams> = {\n Component: ({ variant, focused, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const d = crestPath(cfg.topInset, cfg.pointDepth);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && (\n <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.06) translate(-50 -50)\" />\n )}\n </>\n );\n },\n insets: { top: 4, right: 10, bottom: 14, left: 10 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Crest;\n","import type { ShapeModule } from '../types';\n\nconst d = 'M 35 0 L 30 12 Q 15 30 15 55 Q 15 75 30 90 L 30 100 L 70 100 L 70 90 Q 85 75 85 55 Q 85 30 70 12 L 65 0 Z';\n\nconst Urn: ShapeModule = {\n Component: ({ variant, focused }) => (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && (\n <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.05) translate(-50 -50)\" />\n )}\n </>\n ),\n insets: { top: 4, right: 12, bottom: 4, left: 12 },\n stretches: true,\n};\n\nexport default Urn;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface CoffinParams {\n headX?: number;\n headHalfHeight?: number;\n shoulderX?: number;\n shoulderHalfHeight?: number;\n footX?: number;\n footHalfHeight?: number;\n}\n\nconst DEFAULTS: Required<CoffinParams> = {\n headX: 6,\n headHalfHeight: 23,\n shoulderX: 33,\n shoulderHalfHeight: 36,\n footX: 100,\n footHalfHeight: 29,\n};\n\nconst Coffin: ShapeModule<CoffinParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n const hX = Math.max(0, Math.min(cfg.headX, 40));\n const sX = Math.max(hX + 1, Math.min(cfg.shoulderX, 70));\n const fX = Math.max(sX + 1, Math.min(cfg.footX, 100));\n const hH = Math.max(2, Math.min(cfg.headHalfHeight, 50));\n const sDelta = Math.max(0, Math.min(cfg.shoulderHalfHeight, 50));\n const sH = Math.min(50, hH + sDelta);\n const fH = Math.max(2, Math.min(cfg.footHalfHeight, 50));\n return {\n base: 'polygon',\n baseParams: {\n vertices: [\n [hX, 50 - hH],\n [sX, 50 - sH],\n [fX, 50 - fH],\n [fX, 50 + fH],\n [sX, 50 + sH],\n [hX, 50 + hH],\n ],\n },\n };\n },\n insets: { top: 4, right: 6, bottom: 4, left: 11 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Coffin;\n","import type { ShapeModule } from '../types';\n\nexport interface ReceiptParams {\n teeth?: number;\n tearDepth?: number;\n sideToTopRatio?: number;\n}\n\nconst DEFAULTS: Required<ReceiptParams> = { teeth: 11, tearDepth: 4, sideToTopRatio: 3 };\n\nfunction receiptPath(teeth: number, depth: number) {\n const N = Math.max(3, Math.floor(teeth));\n const baseDepth = Math.max(1, depth);\n const depthAt = (i: number) => baseDepth * (0.55 + 0.55 * Math.abs(Math.sin(i * 1.73 + 0.5)));\n let d = `M 0 0 L 100 0`;\n for (let i = 0; i < N; i++) {\n const yMid = ((i + 0.5) / N) * 100;\n const yEnd = ((i + 1) / N) * 100;\n d += ` L ${(100 - depthAt(i)).toFixed(3)} ${yMid.toFixed(3)} L 100 ${yEnd.toFixed(3)}`;\n }\n d += ` L 0 100`;\n for (let i = N - 1; i >= 0; i--) {\n const yMid = ((i + 0.5) / N) * 100;\n const yStart = (i / N) * 100;\n d += ` L ${depthAt(i + N).toFixed(3)} ${yMid.toFixed(3)} L 0 ${yStart.toFixed(3)}`;\n }\n return d + ' Z';\n}\n\nconst BASE_TOP = 2;\n\nconst Receipt: ShapeModule<ReceiptParams> = {\n Component: ({ variant, focused, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const d = receiptPath(cfg.teeth, cfg.tearDepth);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && (\n <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.04) translate(-50 -50)\" />\n )}\n </>\n );\n },\n insets: (params) => {\n const ratio = Math.max(0.2, Math.min(params.sideToTopRatio ?? DEFAULTS.sideToTopRatio, 10));\n const top = BASE_TOP;\n const side = Math.round(top * ratio);\n return { top, right: side, bottom: top, left: side };\n },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Receipt;\n","import type { ShapeModule } from '../types';\n\nconst body = 'M 8 30 Q 0 50 8 70 L 92 70 Q 100 50 92 30 Z';\n\nconst Wood: ShapeModule = {\n Component: ({ variant, focused }) => (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={body} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={body} />}\n {(variant === 'outline' || variant === 'solid') && (\n <>\n {/* Long flowing grain curves */}\n <path className=\"badge-stroke\" d=\"M 12 38 Q 30 35 50 39 T 88 38\" opacity={0.5} fill=\"none\" />\n <path className=\"badge-stroke\" d=\"M 10 46 Q 36 49 54 45 T 90 47\" opacity={0.4} fill=\"none\" />\n <path className=\"badge-stroke\" d=\"M 12 54 Q 28 51 52 56 T 88 54\" opacity={0.55} fill=\"none\" />\n <path className=\"badge-stroke\" d=\"M 10 62 Q 40 65 58 61 T 90 62\" opacity={0.4} fill=\"none\" />\n {/* Knots (concentric ellipses around a darker core) */}\n <ellipse className=\"badge-stroke\" cx=\"32\" cy=\"50\" rx=\"3.4\" ry=\"2.8\" opacity={0.7} fill=\"none\" />\n <ellipse className=\"badge-stroke\" cx=\"32\" cy=\"50\" rx=\"1.4\" ry=\"1.1\" opacity={0.85} fill=\"none\" />\n <ellipse className=\"badge-stroke\" cx=\"70\" cy=\"42\" rx=\"2.4\" ry=\"2\" opacity={0.6} fill=\"none\" />\n </>\n )}\n {focused && (\n <path className=\"badge-focus\" d={body} transform=\"translate(50 50) scale(1.05) translate(-50 -50)\" />\n )}\n </>\n ),\n insets: { top: 10, right: 4, bottom: 10, left: 4 },\n stretches: true,\n};\n\nexport default Wood;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface QuatrefoilParams {\n spikeR?: number;\n lobeR?: number;\n valleyR?: number;\n valleyAt?: number;\n spikeCurvature?: number;\n spikeBend?: number;\n spikeTipErosion?: number;\n lobeCurvature?: number;\n lobeBend?: number;\n lobeTipErosion?: number;\n valleySmooth?: number;\n rotation?: number;\n samples?: number;\n}\n\nconst DEFAULTS: Required<QuatrefoilParams> = {\n spikeR: 50,\n lobeR: 42,\n valleyR: 25,\n valleyAt: 0.5,\n spikeCurvature: 1,\n spikeBend: 0,\n spikeTipErosion: 0,\n lobeCurvature: 1,\n lobeBend: 0,\n lobeTipErosion: 0,\n valleySmooth: 3,\n rotation: 0,\n samples: 192,\n};\n\nconst Quatrefoil: ShapeModule<QuatrefoilParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return { base: 'quatrefoil', baseParams: cfg };\n },\n insets: { top: 10, right: 14, bottom: 10, left: 14 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Quatrefoil;\n","import type { BadgeShape, ShapeModule } from '../types';\nimport Pill from './Pill';\nimport Plain from './Plain';\nimport Square, { type SquareParams } from './Square';\nimport Notched, { type NotchedParams } from './Notched';\nimport Perforated, { type PerforatedParams } from './Perforated';\nimport Hexagon, { type HexagonParams } from './Hexagon';\nimport Starburst, { type StarburstParams } from './Starburst';\nimport Scalloped, { type ScallopedParams } from './Scalloped';\nimport Shield, { type ShieldParams } from './Shield';\nimport Ribbon, { type RibbonParams } from './Ribbon';\nimport Beavis, { type BeavisParams } from './Beavis';\nimport Sparkler, { type SparklerParams } from './Sparkler';\nimport Postage, { type PostageParams } from './Postage';\nimport Cloud, { type CloudParams } from './Cloud';\nimport House, { type HouseParams } from './House';\nimport Plaque, { type PlaqueParams } from './Plaque';\nimport Crest, { type CrestParams } from './Crest';\nimport Urn from './Urn';\nimport Coffin, { type CoffinParams } from './Coffin';\nimport Receipt, { type ReceiptParams } from './Receipt';\nimport Wood from './Wood';\nimport Quatrefoil, { type QuatrefoilParams } from './Quatrefoil';\n\nexport interface BadgeShapeParams {\n pill: Record<string, never>;\n plain: Record<string, never>;\n square: SquareParams;\n notched: NotchedParams;\n perforated: PerforatedParams;\n hexagon: HexagonParams;\n starburst: StarburstParams;\n scalloped: ScallopedParams;\n shield: ShieldParams;\n ribbon: RibbonParams;\n beavis: BeavisParams;\n sparkler: SparklerParams;\n postage: PostageParams;\n cloud: CloudParams;\n house: HouseParams;\n plaque: PlaqueParams;\n crest: CrestParams;\n urn: Record<string, never>;\n coffin: CoffinParams;\n receipt: ReceiptParams;\n wood: Record<string, never>;\n quatrefoil: QuatrefoilParams;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- ShapeModule's P is contravariant (Component/compose/insets take it), and Badge.tsx indexes this registry by a runtime BadgeShape, so a per-key map type collapses to an unsatisfiable intersection.\nexport const SHAPES: Record<BadgeShape, ShapeModule<any>> = {\n pill: Pill,\n plain: Plain,\n square: Square,\n notched: Notched,\n perforated: Perforated,\n hexagon: Hexagon,\n starburst: Starburst,\n scalloped: Scalloped,\n shield: Shield,\n ribbon: Ribbon,\n beavis: Beavis,\n sparkler: Sparkler,\n postage: Postage,\n cloud: Cloud,\n house: House,\n plaque: Plaque,\n crest: Crest,\n urn: Urn,\n coffin: Coffin,\n receipt: Receipt,\n wood: Wood,\n quatrefoil: Quatrefoil,\n};\n\nexport const ALL_SHAPES: BadgeShape[] = [\n 'pill', 'plain', 'square', 'notched', 'perforated',\n 'hexagon',\n 'starburst', 'scalloped', 'shield', 'ribbon', 'beavis',\n 'sparkler', 'postage', 'cloud', 'house', 'plaque',\n 'crest', 'urn', 'coffin', 'receipt', 'wood', 'quatrefoil',\n];\n","import type { BaseModule, BaseSampler, PerimeterPoint } from './types';\n\nexport interface ChamferedRectParams {\n /** CSS px length of each 45° corner chamfer. */\n chamfer?: number;\n}\n\nconst DEFAULTS: Required<ChamferedRectParams> = { chamfer: 6 };\n\nconst ChamferedRect: BaseModule<ChamferedRectParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n // Chamfer per axis (CSS px → viewBox per-axis).\n const cx = cfg.chamfer * sx;\n const cy = cfg.chamfer * sy;\n // 8 vertices traced clockwise from top-left chamfer start.\n const verts: [number, number][] = [\n [cx, 0],\n [100 - cx, 0],\n [100, cy],\n [100, 100 - cy],\n [100 - cx, 100],\n [cx, 100],\n [0, 100 - cy],\n [0, cy],\n ];\n // Pre-compute CSS lengths of each segment and cumulative sums.\n const cssLens: number[] = [];\n const cumulative: number[] = [0];\n for (let i = 0; i < verts.length; i++) {\n const a = verts[i];\n const b = verts[(i + 1) % verts.length];\n const dx = (b[0] - a[0]) / sx;\n const dy = (b[1] - a[1]) / sy;\n const len = Math.hypot(dx, dy);\n cssLens.push(len);\n cumulative.push(cumulative[cumulative.length - 1] + len);\n }\n const totalCss = cumulative[cumulative.length - 1];\n\n const bodyPath = `M ${verts[0][0]} ${verts[0][1]} ` +\n verts.slice(1).map(([x, y]) => `L ${x} ${y}`).join(' ') + ' Z';\n\n const perimeterAt = (s: number): PerimeterPoint => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n for (let i = 0; i < cssLens.length; i++) {\n const segStart = cumulative[i];\n const segEnd = cumulative[i + 1];\n if (sm <= segEnd + 1e-9) {\n const t = cssLens[i] > 0 ? (sm - segStart) / cssLens[i] : 0;\n const a = verts[i];\n const b = verts[(i + 1) % verts.length];\n const x = a[0] + (b[0] - a[0]) * t;\n const y = a[1] + (b[1] - a[1]) * t;\n // Outward normal: edge direction in CSS rotated 90° clockwise.\n const ex = (b[0] - a[0]) / sx;\n const ey = (b[1] - a[1]) / sy;\n const el = Math.hypot(ex, ey) || 1;\n // Going clockwise around the body, outward = (-tangent_y, tangent_x)... actually\n // for clockwise traversal in SVG (y-down), outward is to the LEFT of direction,\n // which is (ey, -ex) normalised.\n const nx = ey / el;\n const ny = -ex / el;\n return { x, y, nx, ny };\n }\n }\n return { x: verts[0][0], y: verts[0][1], nx: 0, ny: -1 };\n };\n\n const sampler: BaseSampler = { bodyPath, perimeterAt, totalCss };\n return sampler;\n },\n defaults: DEFAULTS,\n insets: { top: 0, right: 4, bottom: 0, left: 4 },\n};\n\nexport default ChamferedRect;\n","import type { BaseModule, BaseSampler, PerimeterPoint } from './types';\n\nexport interface RoundedRectParams {\n /** 0..1 fraction of the maximum corner rounding (1 = full pill / ellipse). */\n erosion?: number;\n /** Stretch the corner arcs horizontally vs vertically. 1 = circular at the badge's\n * native aspect; >1 wider corner arcs; <1 taller corner arcs. */\n eccentricity?: number;\n /** 0..1 vertical squeeze applied to the left and right ends, linearly tapering toward\n * the middle. 1 = ends fully collapsed to the centerline (lemon/lens silhouette). */\n pinch?: number;\n}\n\nconst DEFAULTS: Required<RoundedRectParams> = { erosion: 0.16, eccentricity: 1, pinch: 0 };\n\nconst RoundedRect: BaseModule<RoundedRectParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const erosion = Math.max(0, Math.min(cfg.erosion, 1));\n const ecc = Math.max(0.1, Math.min(cfg.eccentricity, 10));\n // Max corner radius in CSS = half of the shorter axis (so erosion=1 gives a full pill/ellipse).\n const cornerCss = erosion * (Math.min(boxW, boxH) / 2);\n const rxC = cornerCss * sx * ecc;\n const ryC = cornerCss * sy / ecc;\n const rx = Math.max(0, Math.min(rxC, 50));\n const ry = Math.max(0, Math.min(ryC, 50));\n\n const topCss = (100 - 2 * rx) / sx;\n const sideCss = (100 - 2 * ry) / sy;\n const denom = cornerCss + cornerCss || 1;\n const hh = 0;\n const arcCss = (Math.PI * denom * (1 + 3 * hh / (10 + Math.sqrt(4 - 3 * hh)))) / 4;\n\n const segments = [\n { kind: 'h-edge', cssLen: topCss },\n { kind: 'tr-arc', cssLen: arcCss },\n { kind: 'v-edge', cssLen: sideCss },\n { kind: 'br-arc', cssLen: arcCss },\n { kind: 'h-edge-b', cssLen: topCss },\n { kind: 'bl-arc', cssLen: arcCss },\n { kind: 'v-edge-l', cssLen: sideCss },\n { kind: 'tl-arc', cssLen: arcCss },\n ];\n const cum: number[] = [0];\n for (const s of segments) cum.push(cum[cum.length - 1] + s.cssLen);\n const totalCss = cum[cum.length - 1];\n\n const perimeterAt = (s: number): PerimeterPoint => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n let segIdx = 0;\n while (segIdx < segments.length - 1 && sm > cum[segIdx + 1]) segIdx++;\n const local = sm - cum[segIdx];\n const seg = segments[segIdx];\n const t = seg.cssLen > 0 ? local / seg.cssLen : 0;\n switch (seg.kind) {\n case 'h-edge':\n return { x: rx + (100 - 2 * rx) * t, y: 0, nx: 0, ny: -1 };\n case 'tr-arc': {\n const ang = -Math.PI / 2 + t * (Math.PI / 2);\n return {\n x: (100 - rx) + rx * Math.cos(ang),\n y: ry + ry * Math.sin(ang),\n nx: Math.cos(ang),\n ny: Math.sin(ang),\n };\n }\n case 'v-edge':\n return { x: 100, y: ry + (100 - 2 * ry) * t, nx: 1, ny: 0 };\n case 'br-arc': {\n const ang = t * (Math.PI / 2);\n return {\n x: (100 - rx) + rx * Math.cos(ang),\n y: (100 - ry) + ry * Math.sin(ang),\n nx: Math.cos(ang),\n ny: Math.sin(ang),\n };\n }\n case 'h-edge-b':\n return { x: (100 - rx) - (100 - 2 * rx) * t, y: 100, nx: 0, ny: 1 };\n case 'bl-arc': {\n const ang = Math.PI / 2 + t * (Math.PI / 2);\n return {\n x: rx + rx * Math.cos(ang),\n y: (100 - ry) + ry * Math.sin(ang),\n nx: Math.cos(ang),\n ny: Math.sin(ang),\n };\n }\n case 'v-edge-l':\n return { x: 0, y: (100 - ry) - (100 - 2 * ry) * t, nx: -1, ny: 0 };\n case 'tl-arc': {\n const ang = Math.PI + t * (Math.PI / 2);\n return {\n x: rx + rx * Math.cos(ang),\n y: ry + ry * Math.sin(ang),\n nx: Math.cos(ang),\n ny: Math.sin(ang),\n };\n }\n }\n return { x: 0, y: 0, nx: 0, ny: -1 };\n };\n\n // Vertical pinch toward the centerline, parameterised by horizontal distance from x=50.\n // pinch=0 → identity; pinch=1 → collapses the left/right ends to y=50.\n // Erosion supersedes pinch: as the corners round into a full ellipse there's nothing\n // structurally left to pinch (the ends already taper to the centerline). Scale by\n // (1 - erosion) so a fully pilled badge ignores the slider.\n const pinch = Math.max(0, Math.min(cfg.pinch, 1)) * (1 - erosion);\n const pinchY = (x: number, y: number): number => {\n if (pinch === 0) return y;\n const d = Math.abs(x - 50) / 50;\n return 50 + (y - 50) * (1 - d * pinch);\n };\n\n let bodyPath: string;\n let perimeterAtFinal = perimeterAt;\n if (pinch === 0) {\n bodyPath = [\n `M ${rx} 0`,\n `L ${100 - rx} 0`,\n `A ${rx} ${ry} 0 0 1 100 ${ry}`,\n `L 100 ${100 - ry}`,\n `A ${rx} ${ry} 0 0 1 ${100 - rx} 100`,\n `L ${rx} 100`,\n `A ${rx} ${ry} 0 0 1 0 ${100 - ry}`,\n `L 0 ${ry}`,\n `A ${rx} ${ry} 0 0 1 ${rx} 0`,\n 'Z',\n ].join(' ');\n } else {\n // Sample the unpinched perimeter densely and apply the y-pinch to each point.\n const N = 240;\n const samplePts: { x: number; y: number }[] = [];\n for (let i = 0; i < N; i++) {\n const sCss = (i / N) * totalCss;\n const pt = perimeterAt(sCss);\n samplePts.push({ x: pt.x, y: pinchY(pt.x, pt.y) });\n }\n bodyPath = samplePts.reduce((acc, p, i) =>\n acc + (i === 0 ? `M ${p.x.toFixed(3)} ${p.y.toFixed(3)}` : ` L ${p.x.toFixed(3)} ${p.y.toFixed(3)}`),\n '') + ' Z';\n\n // Warped perimeterAt: pinched point + normal recomputed from local warped tangent.\n perimeterAtFinal = (s: number) => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const pt = perimeterAt(sm);\n const x = pt.x;\n const y = pinchY(pt.x, pt.y);\n const eps = totalCss / 480;\n const a = perimeterAt(sm - eps);\n const b = perimeterAt(sm + eps);\n const ax = a.x, ay = pinchY(a.x, a.y);\n const bx = b.x, by = pinchY(b.x, b.y);\n const tx = (bx - ax) / sx;\n const ty = (by - ay) / sy;\n const tl = Math.hypot(tx, ty) || 1;\n return { x, y, nx: ty / tl, ny: -tx / tl };\n };\n }\n\n const sampler: BaseSampler = { bodyPath, perimeterAt: perimeterAtFinal, totalCss };\n return sampler;\n },\n defaults: DEFAULTS,\n insets: { top: 0, right: 4, bottom: 0, left: 4 },\n};\n\nexport default RoundedRect;\n","import type { BaseSampler, PerimeterPoint } from './types';\n\n/** Build a BaseSampler from a clockwise polygon's vertex list (viewBox 0..100). */\nexport function polygonSampler(verts: [number, number][], boxW: number, boxH: number): BaseSampler {\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const cssLens: number[] = [];\n const cumulative: number[] = [0];\n for (let i = 0; i < verts.length; i++) {\n const a = verts[i];\n const b = verts[(i + 1) % verts.length];\n const dx = (b[0] - a[0]) / sx;\n const dy = (b[1] - a[1]) / sy;\n const len = Math.hypot(dx, dy);\n cssLens.push(len);\n cumulative.push(cumulative[cumulative.length - 1] + len);\n }\n const totalCss = cumulative[cumulative.length - 1];\n const bodyPath = `M ${verts[0][0]} ${verts[0][1]} ` +\n verts.slice(1).map(([x, y]) => `L ${x} ${y}`).join(' ') + ' Z';\n const perimeterAt = (s: number): PerimeterPoint => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n for (let i = 0; i < cssLens.length; i++) {\n const segStart = cumulative[i];\n const segEnd = cumulative[i + 1];\n if (sm <= segEnd + 1e-9) {\n const t = cssLens[i] > 0 ? (sm - segStart) / cssLens[i] : 0;\n const a = verts[i];\n const b = verts[(i + 1) % verts.length];\n const x = a[0] + (b[0] - a[0]) * t;\n const y = a[1] + (b[1] - a[1]) * t;\n const ex = (b[0] - a[0]) / sx;\n const ey = (b[1] - a[1]) / sy;\n const el = Math.hypot(ex, ey) || 1;\n const nx = ey / el;\n const ny = -ex / el;\n return { x, y, nx, ny };\n }\n }\n return { x: verts[0][0], y: verts[0][1], nx: 0, ny: -1 };\n };\n return { bodyPath, perimeterAt, totalCss };\n}\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\nexport interface PolygonParams {\n /** Vertices in viewBox 0..100 coordinates, traced clockwise. */\n vertices?: [number, number][];\n}\n\nconst DEFAULT_VERTS: [number, number][] = [\n [0, 0], [100, 0], [100, 100], [0, 100],\n];\n\nconst Polygon: BaseModule<PolygonParams> = {\n build: (params, boxW, boxH) => {\n const verts = (params?.vertices && params.vertices.length >= 3) ? params.vertices : DEFAULT_VERTS;\n return polygonSampler(verts, boxW, boxH);\n },\n defaults: { vertices: DEFAULT_VERTS },\n insets: { top: 0, right: 4, bottom: 0, left: 4 },\n};\n\nexport default Polygon;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\nexport type PuzzleEdge = 'flat' | 'out' | 'in';\n\nexport interface PuzzleParams {\n top?: PuzzleEdge;\n right?: PuzzleEdge;\n bottom?: PuzzleEdge;\n left?: PuzzleEdge;\n /** Tab radius in viewBox units (0..50). */\n tabSize?: number;\n /** Sample density per tab arc. */\n arcSamples?: number;\n}\n\nconst DEFAULTS: Required<PuzzleParams> = {\n top: 'out',\n right: 'in',\n bottom: 'out',\n left: 'in',\n tabSize: 12,\n arcSamples: 18,\n};\n\n// Fraction of the tab radius the tab center sits beyond the body edge. A center offset of\n// `OFFSET_RATIO * r` gives a tab whose chord (intersection with the edge) has half-length\n// √(1 − OFFSET_RATIO²) · r. Smaller offset → wider neck.\nconst OFFSET_RATIO = 0.62;\n\n/** Sample a side's vertices walking clockwise from `start` to `end` along the edge, possibly\n * detouring around a tab. The starting vertex `start` is NOT included; the ending vertex `end`\n * IS included so successive edge calls chain cleanly. */\nfunction edgeVertices(\n start: [number, number],\n end: [number, number],\n outwardX: number,\n outwardY: number,\n type: PuzzleEdge,\n tabR: number,\n arcSamples: number,\n): [number, number][] {\n if (type === 'flat') return [end];\n const sign = type === 'out' ? 1 : -1;\n const dx = end[0] - start[0];\n const dy = end[1] - start[1];\n const len = Math.hypot(dx, dy) || 1;\n const tx = dx / len;\n const ty = dy / len;\n const mx = (start[0] + end[0]) / 2;\n const my = (start[1] + end[1]) / 2;\n const cx = mx + outwardX * sign * tabR * OFFSET_RATIO;\n const cy = my + outwardY * sign * tabR * OFFSET_RATIO;\n const half = tabR * Math.sqrt(Math.max(0, 1 - OFFSET_RATIO * OFFSET_RATIO));\n const p1: [number, number] = [mx - tx * half, my - ty * half];\n const p2: [number, number] = [mx + tx * half, my + ty * half];\n const apex: [number, number] = [\n mx + outwardX * sign * (tabR + tabR * (1 - OFFSET_RATIO)),\n my + outwardY * sign * (tabR + tabR * (1 - OFFSET_RATIO)),\n ];\n const r = Math.hypot(p1[0] - cx, p1[1] - cy);\n const θ1 = Math.atan2(p1[1] - cy, p1[0] - cx);\n const θ2 = Math.atan2(p2[1] - cy, p2[0] - cx);\n const θApex = Math.atan2(apex[1] - cy, apex[0] - cx);\n // Choose the arc direction that sweeps through θApex.\n const TAU = Math.PI * 2;\n const apexFromStart = ((θApex - θ1) % TAU + TAU) % TAU;\n const endFromStart = ((θ2 - θ1) % TAU + TAU) % TAU;\n // If the CCW sweep covers apex before reaching θ2, use CCW; otherwise CW.\n const sweep = apexFromStart < endFromStart ? endFromStart : endFromStart - TAU;\n\n const out: [number, number][] = [];\n out.push(p1);\n for (let i = 1; i <= arcSamples; i++) {\n const t = i / arcSamples;\n const θ = θ1 + sweep * t;\n out.push([cx + r * Math.cos(θ), cy + r * Math.sin(θ)]);\n }\n out.push(end);\n return out;\n}\n\nconst Puzzle: BaseModule<PuzzleParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const r = Math.max(2, Math.min(cfg.tabSize, 40));\n const N = Math.max(6, Math.floor(cfg.arcSamples));\n // Clockwise traversal of the unit rect: TL → TR → BR → BL → TL.\n const TL: [number, number] = [0, 0];\n const TR: [number, number] = [100, 0];\n const BR: [number, number] = [100, 100];\n const BL: [number, number] = [0, 100];\n const verts: [number, number][] = [TL];\n verts.push(...edgeVertices(TL, TR, 0, -1, cfg.top, r, N));\n verts.push(...edgeVertices(TR, BR, 1, 0, cfg.right, r, N));\n verts.push(...edgeVertices(BR, BL, 0, 1, cfg.bottom, r, N));\n verts.push(...edgeVertices(BL, TL, -1, 0, cfg.left, r, N));\n // Drop the trailing duplicate of TL.\n if (verts.length > 1 && verts[verts.length - 1][0] === TL[0] && verts[verts.length - 1][1] === TL[1]) {\n verts.pop();\n }\n return polygonSampler(verts, boxW, boxH);\n },\n defaults: DEFAULTS,\n insets: { top: 12, right: 16, bottom: 12, left: 16 },\n};\n\nexport default Puzzle;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\n/**\n * 8-fold-symmetric polar shape. The whole silhouette is defined by a single curve r(s)\n * over s ∈ [0, 1], where s=0 is the cardinal direction and s=1 is the diagonal. The full\n * shape comes from reflecting that octant curve eight times around the center. The curve\n * itself is two superellipse segments meeting at a valley:\n *\n * s ∈ [0, valleyAt] → spike segment, from `spikeR` down to `valleyR`\n * s ∈ [valleyAt, 1] → lobe segment, from `valleyR` up to `lobeR`\n *\n * Each segment has its own curvature, bend bias, and tip-erosion controls.\n */\nexport interface QuatrefoilParams {\n /** Radius at s=0 (cardinal direction). */\n spikeR?: number;\n /** Radius at s=1 (diagonal direction). */\n lobeR?: number;\n /** Radius at the junction between spike and lobe segments. */\n valleyR?: number;\n /** Position of the junction in [0, 1]. 0.5 = symmetric octant; <0.5 narrows the spike side. */\n valleyAt?: number;\n /** Spike-segment curvature (superellipse exponent). 1 = flat diagonal sides; <1 caves\n * inward (concave/star); >1 bulges outward (convex/square-shouldered). */\n spikeCurvature?: number;\n /** Spike-segment bend bias. Positive shifts the curve's bend toward the tip; negative\n * toward the base. */\n spikeBend?: number;\n /** Flat-top truncation of the cardinal tip (0..1). */\n spikeTipErosion?: number;\n /** Lobe-segment curvature, same semantics as spike. */\n lobeCurvature?: number;\n /** Lobe-segment bend bias. */\n lobeBend?: number;\n /** Flat-top truncation of the diagonal lobe peak (0..1). */\n lobeTipErosion?: number;\n /** Smooth the corner at the valley junction. 0 = sharp, higher = puffier crossover. */\n valleySmooth?: number;\n /** Rotate the pattern in degrees. */\n rotation?: number;\n /** Polygon sample count. */\n samples?: number;\n}\n\nconst DEFAULTS: Required<QuatrefoilParams> = {\n spikeR: 50,\n lobeR: 42,\n valleyR: 25,\n valleyAt: 0.5,\n spikeCurvature: 1,\n spikeBend: 0,\n spikeTipErosion: 0,\n lobeCurvature: 1,\n lobeBend: 0,\n lobeTipErosion: 0,\n valleySmooth: 3,\n rotation: 0,\n samples: 192,\n};\n\nfunction smoothMax(a: number, b: number, g: number): number {\n const d = a - b;\n return (a + b + Math.sqrt(d * d + g * g)) / 2;\n}\n\n/** Generalised superellipse-style profile from (0, 0) to (1, 1) with asymmetric exponents\n * controlled by curvature and bend. erosion truncates the top of the curve. */\nfunction curveSegment(t: number, curvature: number, bend: number, erosion: number): number {\n if (t <= 0) return 0;\n if (t >= 1) return 1 - erosion;\n const expA = Math.max(0.1, curvature * (1 + bend));\n const expB = Math.max(0.1, curvature * (1 - bend));\n const v = Math.pow(1 - Math.pow(1 - t, expA), 1 / expB);\n return Math.min(v, 1 - erosion);\n}\n\nexport function quatrefoilVertices(params: QuatrefoilParams = {}): [number, number][] {\n const cfg = { ...DEFAULTS, ...params };\n const spike = Math.max(5, Math.min(cfg.spikeR, 50));\n const lobe = Math.max(5, Math.min(cfg.lobeR, 50 * Math.SQRT2));\n const valley = Math.max(0, Math.min(cfg.valleyR, Math.min(spike, lobe)));\n const vAt = Math.max(0.05, Math.min(cfg.valleyAt, 0.95));\n const sCurv = Math.max(0.2, cfg.spikeCurvature);\n const sBend = Math.max(-0.95, Math.min(cfg.spikeBend, 0.95));\n const sErode = Math.max(0, Math.min(cfg.spikeTipErosion, 1));\n const lCurv = Math.max(0.2, cfg.lobeCurvature);\n const lBend = Math.max(-0.95, Math.min(cfg.lobeBend, 0.95));\n const lErode = Math.max(0, Math.min(cfg.lobeTipErosion, 1));\n const smooth = Math.max(0, cfg.valleySmooth);\n const rot = (cfg.rotation * Math.PI) / 180;\n const N = Math.max(24, Math.floor(cfg.samples));\n const cx = 50, cy = 50;\n const verts: [number, number][] = [];\n for (let i = 0; i < N; i++) {\n const θ = (i / N) * 2 * Math.PI;\n const s = Math.abs(Math.sin(2 * (θ - rot))); // 0..1 across each octant\n // t1: spike-side parameter, 1 at cardinal (s=0), 0 at valley (s=vAt). Clamped to ≥ 0.\n const t1 = (vAt - s) / vAt;\n // t2: lobe-side parameter, 0 at valley (s=vAt), 1 at diagonal (s=1). Clamped to ≥ 0.\n const t2 = (s - vAt) / (1 - vAt);\n const rSpike = valley + (spike - valley) * curveSegment(Math.max(0, t1), sCurv, sBend, sErode);\n const rLobe = valley + (lobe - valley) * curveSegment(Math.max(0, t2), lCurv, lBend, lErode);\n // Smooth corner at the valley: outside the smoothing band both rSpike and rLobe equal\n // `valley` on the inactive side, so smoothMax just picks the active one. Near the join\n // both are close to valley and smoothMax lifts the corner.\n const r = smoothMax(rSpike, rLobe, smooth);\n verts.push([cx + r * Math.cos(θ), cy + r * Math.sin(θ)]);\n }\n return verts;\n}\n\nconst Quatrefoil: BaseModule<QuatrefoilParams> = {\n build: (params, boxW, boxH) => polygonSampler(quatrefoilVertices(params), boxW, boxH),\n defaults: DEFAULTS,\n insets: { top: 10, right: 14, bottom: 10, left: 14 },\n};\n\nexport default Quatrefoil;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\n/**\n * Symmetric polar-spline base. The silhouette comes from a single curve r(s) over\n * s ∈ [0, 1] that gets reflected/rotated to fill the full circle:\n *\n * - `mode: 'octant'`: 1/8 of the perimeter (cardinal → diagonal), mirrored within each\n * quadrant and rotated to fill the rest. 8-fold symmetric.\n * - `mode: 'quadrant'`: 1/4 of the perimeter (cardinal → next cardinal), rotated 4 times\n * with no internal mirror. 4-fold rotational symmetry; endpoints share radius.\n *\n * The interpolant is a **clamped natural cubic spline** with zero slope at both endpoints\n * (so the reflected/rotated full curve has no kink crossing the symmetry axes). C² across\n * the whole octant — continuous curvature, not just slope — which removes the \"lumpy\" feel\n * that local Hermite splines have when anchors are uneven.\n */\nexport interface OctantSplineParams {\n mode?: 'octant' | 'quadrant';\n /** Number of active anchors (3..12). */\n count?: number;\n s0?: number; s1?: number; s2?: number; s3?: number; s4?: number; s5?: number;\n s6?: number; s7?: number; s8?: number; s9?: number; s10?: number; s11?: number;\n r0?: number; r1?: number; r2?: number; r3?: number; r4?: number; r5?: number;\n r6?: number; r7?: number; r8?: number; r9?: number; r10?: number; r11?: number;\n /** Per-anchor weight (0..3). The spline is constructed to pass through every anchor exactly;\n * the weight biases how strongly that anchor influences the rest of the curve. Implementation\n * detail: blends the C² interpolant with a polynomial fit weighted by w. Default 1 = pure\n * C² interpolation; <1 lets the curve sweep past the anchor (anchor still passed through);\n * >1 makes the curve hug the anchor more tightly (sharper local bend). */\n w0?: number; w1?: number; w2?: number; w3?: number; w4?: number; w5?: number;\n w6?: number; w7?: number; w8?: number; w9?: number; w10?: number; w11?: number;\n rotation?: number;\n samples?: number;\n}\n\nexport const OCTANT_SPLINE_MAX_ANCHORS = 12;\n\nconst DEFAULTS: Required<OctantSplineParams> = {\n mode: 'octant',\n count: 5,\n s0: 0, s1: 0.25, s2: 0.5, s3: 0.75, s4: 1, s5: 1,\n s6: 1, s7: 1, s8: 1, s9: 1, s10: 1, s11: 1,\n r0: 48, r1: 30, r2: 32, r3: 38, r4: 46, r5: 42,\n r6: 36, r7: 32, r8: 30, r9: 30, r10: 30, r11: 30,\n w0: 1, w1: 1, w2: 1, w3: 1, w4: 1, w5: 1,\n w6: 1, w7: 1, w8: 1, w9: 1, w10: 1, w11: 1,\n rotation: 0,\n samples: 192,\n};\n\ninterface Anchor { s: number; r: number; w: number }\n\nexport function extractAnchorPairs(params: OctantSplineParams = {}): Anchor[] {\n const cfg = { ...DEFAULTS, ...params };\n const count = Math.max(3, Math.min(Math.floor(cfg.count), OCTANT_SPLINE_MAX_ANCHORS));\n const sKeys: (keyof Required<OctantSplineParams>)[] = ['s0','s1','s2','s3','s4','s5','s6','s7','s8','s9','s10','s11'];\n const rKeys: (keyof Required<OctantSplineParams>)[] = ['r0','r1','r2','r3','r4','r5','r6','r7','r8','r9','r10','r11'];\n const wKeys: (keyof Required<OctantSplineParams>)[] = ['w0','w1','w2','w3','w4','w5','w6','w7','w8','w9','w10','w11'];\n const pairs: Anchor[] = [];\n for (let i = 0; i < count; i++) {\n pairs.push({\n s: Math.max(0, Math.min(1, Number(cfg[sKeys[i]]))),\n r: Math.max(0, Number(cfg[rKeys[i]])),\n w: Math.max(0, Number(cfg[wKeys[i]] ?? 1)),\n });\n }\n pairs.sort((a, b) => a.s - b.s);\n pairs[0].s = 0;\n pairs[count - 1].s = 1;\n if (cfg.mode === 'quadrant') {\n pairs[count - 1].r = pairs[0].r;\n pairs[count - 1].w = pairs[0].w;\n }\n return pairs;\n}\n\n/**\n * Solve the clamped natural cubic spline with zero end-slopes. Returns the second-derivative\n * vector M[0..n] which feeds the standard cubic-spline evaluation formula. Solves a\n * tridiagonal system in O(n).\n */\nfunction solveCubicSpline(anchors: Anchor[]): number[] {\n const n = anchors.length - 1;\n const h: number[] = new Array(n);\n for (let i = 0; i < n; i++) h[i] = Math.max(1e-9, anchors[i + 1].s - anchors[i].s);\n // Build tridiagonal system for M[0..n] with clamped zero-slope BCs.\n // row 0: (h0/3) M0 + (h0/6) M1 = (r1-r0)/h0\n // row i (1..n-1): (h_{i-1}/6) M_{i-1} + ((h_{i-1}+h_i)/3) M_i + (h_i/6) M_{i+1}\n // = (r_{i+1}-r_i)/h_i - (r_i-r_{i-1})/h_{i-1}\n // row n: (h_{n-1}/6) M_{n-1} + (h_{n-1}/3) M_n = -(r_n-r_{n-1})/h_{n-1}\n const a: number[] = new Array(n + 1); // subdiagonal\n const b: number[] = new Array(n + 1); // diagonal\n const c: number[] = new Array(n + 1); // superdiagonal\n const d: number[] = new Array(n + 1); // rhs\n a[0] = 0;\n b[0] = h[0] / 3;\n c[0] = h[0] / 6;\n d[0] = (anchors[1].r - anchors[0].r) / h[0];\n for (let i = 1; i < n; i++) {\n a[i] = h[i - 1] / 6;\n b[i] = (h[i - 1] + h[i]) / 3;\n c[i] = h[i] / 6;\n d[i] = (anchors[i + 1].r - anchors[i].r) / h[i] - (anchors[i].r - anchors[i - 1].r) / h[i - 1];\n }\n a[n] = h[n - 1] / 6;\n b[n] = h[n - 1] / 3;\n c[n] = 0;\n d[n] = -(anchors[n].r - anchors[n - 1].r) / h[n - 1];\n // Thomas algorithm: forward sweep, then back-substitution.\n for (let i = 1; i <= n; i++) {\n const w = a[i] / b[i - 1];\n b[i] -= w * c[i - 1];\n d[i] -= w * d[i - 1];\n }\n const M: number[] = new Array(n + 1);\n M[n] = d[n] / b[n];\n for (let i = n - 1; i >= 0; i--) M[i] = (d[i] - c[i] * M[i + 1]) / b[i];\n return M;\n}\n\ninterface CompiledSpline {\n anchors: Anchor[];\n M: number[];\n}\n\nexport function compileSpline(anchors: Anchor[]): CompiledSpline {\n return { anchors, M: solveCubicSpline(anchors) };\n}\n\nexport function evalCompiled(s: number, spline: CompiledSpline): number {\n const { anchors, M } = spline;\n const N = anchors.length;\n if (N === 0) return 0;\n if (N === 1) return anchors[0].r;\n if (s <= anchors[0].s) return anchors[0].r;\n if (s >= anchors[N - 1].s) return anchors[N - 1].r;\n let i = 0;\n while (i < N - 1 && anchors[i + 1].s <= s) i++;\n const p0 = anchors[i];\n const p1 = anchors[i + 1];\n const h = p1.s - p0.s;\n if (h <= 0) return p0.r;\n const A = (p1.s - s) / h;\n const B = (s - p0.s) / h;\n // Apply per-anchor weight as a local sharpening factor on the C² interpolant. With both\n // weights = 1 this is pure natural cubic spline. Weights > 1 add a centered \"lift\" toward\n // the anchor (sharpens), < 1 subtracts (smooths past). The lift kernel is the standard\n // cubic-spline second-derivative term, scaled per-side by (w - 1).\n const liftA = ((A * A * A - A) * h * h) / 6;\n const liftB = ((B * B * B - B) * h * h) / 6;\n const baseLine = A * p0.r + B * p1.r;\n const curvatureTerm = liftA * M[i] * p0.w + liftB * M[i + 1] * p1.w;\n return baseLine + curvatureTerm;\n}\n\nconst OctantSpline: BaseModule<OctantSplineParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const anchors = extractAnchorPairs(cfg);\n const spline = compileSpline(anchors);\n const rot = (cfg.rotation * Math.PI) / 180;\n const N = Math.max(48, Math.floor(cfg.samples));\n const cx = 50, cy = 50;\n const verts: [number, number][] = [];\n const HALF_PI = Math.PI / 2;\n for (let i = 0; i < N; i++) {\n const θ = (i / N) * 2 * Math.PI;\n const θRel = θ - rot;\n let s: number;\n if (cfg.mode === 'quadrant') {\n const θQ = ((θRel % HALF_PI) + HALF_PI) % HALF_PI;\n s = θQ / HALF_PI;\n } else {\n s = Math.abs(Math.sin(2 * θRel));\n }\n const r = evalCompiled(s, spline);\n verts.push([cx + r * Math.cos(θ), cy + r * Math.sin(θ)]);\n }\n return polygonSampler(verts, boxW, boxH);\n },\n defaults: DEFAULTS,\n insets: { top: 10, right: 14, bottom: 10, left: 14 },\n};\n\nexport default OctantSpline;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\n/**\n * Symmetric polar NURBS base. Same anchor concept as `octant-spline` but the curve is an\n * **approximating** cubic NURBS — the control points pull the curve without sitting on it.\n * Each anchor's weight increases the local pull toward that control point.\n *\n * Endpoint behaviour: the curve uses mirror-phantom control points just outside [0, 1]\n * derived from the second-from-end anchors, which enforces zero slope at s=0 and s=1 so\n * the reflected/rotated full silhouette closes cleanly across the symmetry axes.\n */\nexport interface OctantBSplineParams {\n mode?: 'octant' | 'quadrant';\n count?: number;\n s0?: number; s1?: number; s2?: number; s3?: number; s4?: number; s5?: number;\n s6?: number; s7?: number; s8?: number; s9?: number; s10?: number; s11?: number;\n r0?: number; r1?: number; r2?: number; r3?: number; r4?: number; r5?: number;\n r6?: number; r7?: number; r8?: number; r9?: number; r10?: number; r11?: number;\n w0?: number; w1?: number; w2?: number; w3?: number; w4?: number; w5?: number;\n w6?: number; w7?: number; w8?: number; w9?: number; w10?: number; w11?: number;\n rotation?: number;\n samples?: number;\n}\n\nexport const OCTANT_BSPLINE_MAX_ANCHORS = 12;\n\nconst DEFAULTS: Required<OctantBSplineParams> = {\n mode: 'octant',\n count: 5,\n s0: 0, s1: 0.25, s2: 0.5, s3: 0.75, s4: 1, s5: 1,\n s6: 1, s7: 1, s8: 1, s9: 1, s10: 1, s11: 1,\n r0: 48, r1: 30, r2: 32, r3: 38, r4: 46, r5: 42,\n r6: 36, r7: 32, r8: 30, r9: 30, r10: 30, r11: 30,\n w0: 1, w1: 1, w2: 1, w3: 1, w4: 1, w5: 1,\n w6: 1, w7: 1, w8: 1, w9: 1, w10: 1, w11: 1,\n rotation: 0,\n samples: 192,\n};\n\ninterface Anchor { s: number; r: number; w: number }\n\nexport function extractAnchorPairs(params: OctantBSplineParams = {}): Anchor[] {\n const cfg = { ...DEFAULTS, ...params };\n const count = Math.max(3, Math.min(Math.floor(cfg.count), OCTANT_BSPLINE_MAX_ANCHORS));\n const sKeys: (keyof Required<OctantBSplineParams>)[] = ['s0','s1','s2','s3','s4','s5','s6','s7','s8','s9','s10','s11'];\n const rKeys: (keyof Required<OctantBSplineParams>)[] = ['r0','r1','r2','r3','r4','r5','r6','r7','r8','r9','r10','r11'];\n const wKeys: (keyof Required<OctantBSplineParams>)[] = ['w0','w1','w2','w3','w4','w5','w6','w7','w8','w9','w10','w11'];\n const pairs: Anchor[] = [];\n for (let i = 0; i < count; i++) {\n pairs.push({\n s: Math.max(0, Math.min(1, Number(cfg[sKeys[i]]))),\n r: Math.max(0, Number(cfg[rKeys[i]])),\n w: Math.max(0.01, Number(cfg[wKeys[i]] ?? 1)),\n });\n }\n pairs.sort((a, b) => a.s - b.s);\n pairs[0].s = 0;\n pairs[count - 1].s = 1;\n if (cfg.mode === 'quadrant') {\n pairs[count - 1].r = pairs[0].r;\n pairs[count - 1].w = pairs[0].w;\n }\n return pairs;\n}\n\n/**\n * Cubic NURBS evaluation. Returns r at parameter u ∈ [0, 1].\n *\n * Implementation uses (s_i, r_i, w_i) as control points and treats `u` as the underlying\n * curve parameter, with the knot vector clamped at both ends. Because the control points'\n * `s` coordinates are themselves part of the curve, we need a parametric formulation:\n * S(u) = Σ w_i N_i(u) s_i / Σ w_i N_i(u)\n * R(u) = Σ w_i N_i(u) r_i / Σ w_i N_i(u)\n * Then we invert S(u) = s to get u and read out R(u).\n *\n * Two phantom control points are inserted at each end (mirror reflections of the second-\n * from-end anchors across the cardinal/diagonal axes), forcing zero slope at the endpoints\n * for clean symmetric closure.\n */\nfunction buildExtendedControls(anchors: Anchor[]): Anchor[] {\n const N = anchors.length;\n // Phantom controls outside [0, 1]. They are mirrored versions of the second-from-end\n // visible anchors. Symmetric reflection gives zero slope at the cardinal/diagonal endpoints.\n const phantomLeft1: Anchor = { s: -anchors[1].s, r: anchors[1].r, w: anchors[1].w };\n const phantomLeft2: Anchor = { s: -anchors[Math.min(2, N - 1)].s, r: anchors[Math.min(2, N - 1)].r, w: anchors[Math.min(2, N - 1)].w };\n const phantomRight1: Anchor = { s: 2 - anchors[N - 2].s, r: anchors[N - 2].r, w: anchors[N - 2].w };\n const phantomRight2: Anchor = { s: 2 - anchors[Math.max(N - 3, 0)].s, r: anchors[Math.max(N - 3, 0)].r, w: anchors[Math.max(N - 3, 0)].w };\n return [phantomLeft2, phantomLeft1, ...anchors, phantomRight1, phantomRight2];\n}\n\nfunction buildKnots(numCtrl: number, degree: number): number[] {\n // Clamped uniform knot vector of length numCtrl + degree + 1.\n const m = numCtrl + degree + 1;\n const knots: number[] = new Array(m);\n for (let i = 0; i <= degree; i++) knots[i] = 0;\n const interior = numCtrl - degree - 1;\n for (let i = 1; i <= interior; i++) knots[degree + i] = i / (interior + 1);\n for (let i = m - degree - 1; i < m; i++) knots[i] = 1;\n return knots;\n}\n\nfunction findSpan(u: number, knots: number[], degree: number, numCtrl: number): number {\n if (u >= knots[numCtrl]) return numCtrl - 1;\n if (u <= knots[degree]) return degree;\n let low = degree;\n let high = numCtrl;\n let mid = (low + high) >>> 1;\n while (u < knots[mid] || u >= knots[mid + 1]) {\n if (u < knots[mid]) high = mid;\n else low = mid;\n mid = (low + high) >>> 1;\n }\n return mid;\n}\n\nfunction basisFns(span: number, u: number, knots: number[], degree: number): number[] {\n const N: number[] = new Array(degree + 1).fill(0);\n const left: number[] = new Array(degree + 1);\n const right: number[] = new Array(degree + 1);\n N[0] = 1;\n for (let j = 1; j <= degree; j++) {\n left[j] = u - knots[span + 1 - j];\n right[j] = knots[span + j] - u;\n let saved = 0;\n for (let r = 0; r < j; r++) {\n const denom = right[r + 1] + left[j - r];\n const temp = denom === 0 ? 0 : N[r] / denom;\n N[r] = saved + right[r + 1] * temp;\n saved = left[j - r] * temp;\n }\n N[j] = saved;\n }\n return N;\n}\n\ninterface CompiledNurbs {\n extended: Anchor[];\n knots: number[];\n degree: number;\n}\n\nexport function compileNurbs(anchors: Anchor[]): CompiledNurbs {\n const extended = buildExtendedControls(anchors);\n const degree = 3;\n const knots = buildKnots(extended.length, degree);\n return { extended, knots, degree };\n}\n\nfunction evalNurbsAtU(u: number, nurbs: CompiledNurbs): { s: number; r: number } {\n const { extended, knots, degree } = nurbs;\n const numCtrl = extended.length;\n const uClamped = Math.max(0, Math.min(1, u));\n const span = findSpan(uClamped, knots, degree, numCtrl);\n const N = basisFns(span, uClamped, knots, degree);\n let sNum = 0;\n let rNum = 0;\n let wSum = 0;\n for (let i = 0; i <= degree; i++) {\n const ctrl = extended[span - degree + i];\n const wn = ctrl.w * N[i];\n sNum += wn * ctrl.s;\n rNum += wn * ctrl.r;\n wSum += wn;\n }\n return wSum > 0 ? { s: sNum / wSum, r: rNum / wSum } : { s: 0, r: 0 };\n}\n\n/** Invert S(u) = s by bisection. The NURBS is monotonic in s because the underlying knot\n * vector and control sequence are monotonic, so bisection converges quickly. */\nexport function evalNurbsAtS(s: number, nurbs: CompiledNurbs): number {\n if (s <= 0) return evalNurbsAtU(0, nurbs).r;\n if (s >= 1) return evalNurbsAtU(1, nurbs).r;\n let lo = 0, hi = 1;\n for (let iter = 0; iter < 30; iter++) {\n const mid = (lo + hi) * 0.5;\n const { s: sMid } = evalNurbsAtU(mid, nurbs);\n if (sMid < s) lo = mid; else hi = mid;\n if (hi - lo < 1e-5) break;\n }\n return evalNurbsAtU((lo + hi) * 0.5, nurbs).r;\n}\n\nconst OctantBSpline: BaseModule<OctantBSplineParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const anchors = extractAnchorPairs(cfg);\n const nurbs = compileNurbs(anchors);\n const rot = (cfg.rotation * Math.PI) / 180;\n const N = Math.max(48, Math.floor(cfg.samples));\n const cx = 50, cy = 50;\n const verts: [number, number][] = [];\n const HALF_PI = Math.PI / 2;\n for (let i = 0; i < N; i++) {\n const θ = (i / N) * 2 * Math.PI;\n const θRel = θ - rot;\n let s: number;\n if (cfg.mode === 'quadrant') {\n const θQ = ((θRel % HALF_PI) + HALF_PI) % HALF_PI;\n s = θQ / HALF_PI;\n } else {\n s = Math.abs(Math.sin(2 * θRel));\n }\n const r = evalNurbsAtS(s, nurbs);\n verts.push([cx + r * Math.cos(θ), cy + r * Math.sin(θ)]);\n }\n return polygonSampler(verts, boxW, boxH);\n },\n defaults: DEFAULTS,\n insets: { top: 10, right: 14, bottom: 10, left: 14 },\n};\n\nexport default OctantBSpline;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\nexport type RibbonEnd = 'inward' | 'outward' | 'flat';\n\nexport interface RibbonParams {\n left?: RibbonEnd;\n right?: RibbonEnd;\n /** Taper depth in CSS px. Stays fixed regardless of badge width — viewBox\n * vertices are computed at build time using `boxW`. */\n taperWidth?: number;\n}\n\nconst DEFAULTS: Required<RibbonParams> = { left: 'inward', right: 'outward', taperWidth: 8 };\n\ninterface SidePoints {\n top: [number, number];\n mid: [number, number] | null;\n bottom: [number, number];\n}\n\nfunction sidePoints(mode: RibbonEnd, xBaseVb: number, signVb: number, taperVb: number): SidePoints {\n switch (mode) {\n case 'flat':\n return { top: [xBaseVb, 0], mid: null, bottom: [xBaseVb, 100] };\n case 'outward':\n return {\n top: [xBaseVb + signVb * taperVb, 0],\n mid: [xBaseVb, 50],\n bottom: [xBaseVb + signVb * taperVb, 100],\n };\n case 'inward':\n return {\n top: [xBaseVb, 0],\n mid: [xBaseVb + signVb * taperVb, 50],\n bottom: [xBaseVb, 100],\n };\n }\n}\n\nfunction sideInsetCss(mode: RibbonEnd, taperCss: number): number {\n const t = Math.max(0, taperCss);\n switch (mode) {\n case 'flat': return 4;\n case 'outward': return Math.round(t * 0.7);\n case 'inward': return Math.round(t * 0.8);\n }\n}\n\nconst Ribbon: BaseModule<RibbonParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const taperCss = Math.max(0, cfg.taperWidth);\n // Convert CSS px taper into viewBox-x units so the rendered pointer\n // is the same CSS-px depth regardless of badge width.\n const taperVb = boxW > 0 ? (taperCss / boxW) * 100 : 0;\n const l = sidePoints(cfg.left, 0, 1, taperVb);\n const r = sidePoints(cfg.right, 100, -1, taperVb);\n const verts: [number, number][] = [l.top];\n verts.push(r.top);\n if (r.mid) verts.push(r.mid);\n verts.push(r.bottom);\n verts.push(l.bottom);\n if (l.mid) verts.push(l.mid);\n return polygonSampler(verts, boxW, boxH);\n },\n insets: (params) => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n top: 0,\n right: sideInsetCss(cfg.right, cfg.taperWidth),\n bottom: 0,\n left: sideInsetCss(cfg.left, cfg.taperWidth),\n };\n },\n defaults: DEFAULTS,\n};\n\nexport default Ribbon;\n","/**\n * Shapes one vertical edge of a badge base. Given a position down the edge\n * (`t`, 0 at the top to 1 at the bottom) and the configured depth in CSS px,\n * returns the horizontal displacement of that point, positive to the right.\n */\nexport type EdgeProfile = (t: number, depth: number) => number;\n\n/** The named edge profiles in {@link EDGE_PROFILES}. */\nexport type BuiltInEdgeName =\n | 'flat'\n | 'chevron'\n | 'slant'\n | 'slant-up'\n | 'round'\n | 'scallop'\n | 'concave-chevron';\n\n/** An edge profile, either by name or as a function. */\nexport type EdgeCap = BuiltInEdgeName | EdgeProfile;\n\n/** The built-in {@link EdgeProfile} implementations, by name. */\nexport const EDGE_PROFILES: Record<BuiltInEdgeName, EdgeProfile> = {\n flat: (_t, _d) => 0,\n chevron: (t, d) => (1 - Math.abs(t - 0.5) * 2) * d,\n slant: (t, d) => t * d,\n 'slant-up': (t, d) => (1 - t) * d,\n round: (t, d) => Math.sin(t * Math.PI) * d,\n scallop: (t, d) => Math.sin(t * Math.PI * 3) * 0.4 * d,\n 'concave-chevron': (t, d) => -(1 - Math.abs(t - 0.5) * 2) * d,\n};\n\nexport function resolveEdge(cap: EdgeCap): EdgeProfile {\n if (typeof cap === 'function') return cap;\n return EDGE_PROFILES[cap] ?? EDGE_PROFILES.flat;\n}\n","import { resolveEdge, type EdgeCap } from './edgeProfiles';\nimport type { BaseModule, BaseSampler, PerimeterPoint } from './types';\n\nexport interface PowerlineParams {\n /** Profile for the left edge (the cap segment N inherits from segment N-1). */\n leftEdge?: EdgeCap;\n /** Profile for the right edge (this segment's own end cap). */\n rightEdge?: EdgeCap;\n /** Protrusion depth in CSS px (positive values stick out beyond the rect). */\n depth?: number;\n}\n\nconst DEFAULTS: Required<PowerlineParams> = {\n leftEdge: 'flat',\n rightEdge: 'flat',\n depth: 6,\n};\n\n// Samples per vertical edge. 64 is smooth enough for chevron/round caps and\n// cheap to evaluate; the perimeter is sampled once per `build` call.\nconst EDGE_SAMPLES = 64;\n\nconst Powerline: BaseModule<PowerlineParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const left = resolveEdge(cfg.leftEdge);\n const right = resolveEdge(cfg.rightEdge);\n const depth = cfg.depth;\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n\n const pts: { x: number; y: number; nx: number; ny: number }[] = [];\n\n // Top corners follow the same edge profiles as the rest of the verticals,\n // so a profile that protrudes/cuts at t=0 (e.g. slant-up) doesn't introduce\n // a corner kink between the flat top and the first vertical sample.\n pts.push({ x: left(0, depth) * sx, y: 0, nx: 0, ny: -1 });\n pts.push({ x: (boxW + right(0, depth)) * sx, y: 0, nx: 0, ny: -1 });\n\n for (let i = 1; i < EDGE_SAMPLES; i++) {\n const t = i / EDGE_SAMPLES;\n const xCss = boxW + right(t, depth);\n pts.push({ x: xCss * sx, y: t * 100, nx: 1, ny: 0 });\n }\n\n pts.push({ x: (boxW + right(1, depth)) * sx, y: 100, nx: 0, ny: 1 });\n pts.push({ x: (0 + left(1, depth)) * sx, y: 100, nx: 0, ny: 1 });\n\n for (let i = EDGE_SAMPLES - 1; i >= 1; i--) {\n const t = i / EDGE_SAMPLES;\n const xCss = 0 + left(t, depth);\n pts.push({ x: xCss * sx, y: t * 100, nx: -1, ny: 0 });\n }\n\n const cum: number[] = [0];\n for (let i = 1; i < pts.length; i++) {\n const a = pts[i - 1];\n const b = pts[i];\n const dxCss = (b.x - a.x) / sx;\n const dyCss = (b.y - a.y) / sy;\n cum.push(cum[i - 1] + Math.hypot(dxCss, dyCss));\n }\n const last = pts[pts.length - 1];\n const first = pts[0];\n const closeLen = Math.hypot((first.x - last.x) / sx, (first.y - last.y) / sy);\n const totalCss = cum[cum.length - 1] + closeLen;\n\n const perimeterAt = (s: number): PerimeterPoint => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n for (let i = 1; i < pts.length; i++) {\n if (sm <= cum[i]) {\n const segLen = cum[i] - cum[i - 1];\n const t = segLen > 0 ? (sm - cum[i - 1]) / segLen : 0;\n const a = pts[i - 1];\n const b = pts[i];\n return {\n x: a.x + (b.x - a.x) * t,\n y: a.y + (b.y - a.y) * t,\n nx: b.nx,\n ny: b.ny,\n };\n }\n }\n const lastIdx = pts.length - 1;\n const segLen = closeLen;\n const t = segLen > 0 ? (sm - cum[lastIdx]) / segLen : 0;\n return {\n x: pts[lastIdx].x + (first.x - pts[lastIdx].x) * t,\n y: pts[lastIdx].y + (first.y - pts[lastIdx].y) * t,\n nx: 0,\n ny: 1,\n };\n };\n\n const bodyPath = pts.reduce(\n (acc, p, i) =>\n acc + (i === 0\n ? `M ${p.x.toFixed(3)} ${p.y.toFixed(3)}`\n : ` L ${p.x.toFixed(3)} ${p.y.toFixed(3)}`),\n ''\n ) + ' Z';\n\n const sampler: BaseSampler = { bodyPath, perimeterAt, totalCss };\n return sampler;\n },\n defaults: DEFAULTS,\n insets: (params) => {\n const depth = params?.depth ?? DEFAULTS.depth;\n const leftCap = params?.leftEdge ?? DEFAULTS.leftEdge;\n const rightCap = params?.rightEdge ?? DEFAULTS.rightEdge;\n const left = resolveEdge(leftCap);\n const right = resolveEdge(rightCap);\n // Sample the profiles to compute (a) each side's average offset, used to\n // shift padding so text reads centered in the visible silhouette (not the\n // bounding rect), and (b) each side's deepest inward cut, the floor below\n // which padding mustn't drop or text would crash into the cap.\n // Trapezoid integration over [0, 1] — exact for piecewise-linear profiles\n // (chevron, slant, slant-up) and accurate enough for the curved ones.\n const N = 32;\n let avgLeft = 0;\n let avgRight = 0;\n let maxLeftInward = 0;\n let maxRightInward = 0;\n for (let i = 0; i <= N; i++) {\n const t = i / N;\n const l = left(t, depth);\n const r = right(t, depth);\n const w = i === 0 || i === N ? 0.5 : 1;\n avgLeft += (w * l) / N;\n avgRight += (w * r) / N;\n if (l > maxLeftInward) maxLeftInward = l;\n if (-r > maxRightInward) maxRightInward = -r;\n }\n // Desired asymmetry: padLeft - padRight = avgLeft + avgRight (so the text\n // centroid sits at the silhouette's centroid). Hold padLeft + padRight = 2 * depth.\n const shift = (avgLeft + avgRight) / 2;\n const leftPad = Math.max(maxLeftInward, depth + shift);\n const rightPad = Math.max(maxRightInward, depth - shift);\n return { top: 0, right: rightPad, bottom: 0, left: leftPad };\n },\n};\n\nexport default Powerline;\n","import type { BaseModule } from './types';\nimport ChamferedRect, { type ChamferedRectParams } from './ChamferedRect';\nimport RoundedRect, { type RoundedRectParams } from './RoundedRect';\nimport Polygon, { type PolygonParams } from './Polygon';\nimport Puzzle, { type PuzzleParams } from './Puzzle';\nimport Quatrefoil, { type QuatrefoilParams } from './Quatrefoil';\nimport OctantSpline, { type OctantSplineParams } from './OctantSpline';\nimport OctantBSpline, { type OctantBSplineParams } from './OctantBSpline';\nimport Ribbon, { type RibbonParams } from './Ribbon';\nimport Powerline, { type PowerlineParams } from './Powerline';\n\nexport type BadgeBase =\n | 'chamfered-rect'\n | 'rounded-rect'\n | 'polygon'\n | 'puzzle'\n | 'quatrefoil'\n | 'octant-spline'\n | 'octant-bspline'\n | 'ribbon'\n | 'powerline';\n\nexport interface BadgeBaseParams {\n 'chamfered-rect': ChamferedRectParams;\n 'rounded-rect': RoundedRectParams;\n 'polygon': PolygonParams;\n 'puzzle': PuzzleParams;\n 'quatrefoil': QuatrefoilParams;\n 'octant-spline': OctantSplineParams;\n 'octant-bspline': OctantBSplineParams;\n 'ribbon': RibbonParams;\n 'powerline': PowerlineParams;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- BaseModule's P is contravariant (build/insets take it), and Badge.tsx indexes this registry by a runtime BadgeBase, so a per-key map type collapses to an unsatisfiable intersection.\nexport const BASES: Record<BadgeBase, BaseModule<any>> = {\n 'chamfered-rect': ChamferedRect,\n 'rounded-rect': RoundedRect,\n 'polygon': Polygon,\n 'puzzle': Puzzle,\n 'quatrefoil': Quatrefoil,\n 'octant-spline': OctantSpline,\n 'octant-bspline': OctantBSpline,\n 'ribbon': Ribbon,\n 'powerline': Powerline,\n};\n","/**\n * Common range filter used by offsetAt-style effects. `range` is `[start, end]` as\n * fractions of `totalCss` in `[0, 1]`, where `end > start` includes a single contiguous\n * segment and `end < start` wraps around the closing point of the perimeter. Returns\n * the multiplier 1 inside the range and 0 outside (no feather yet — kept simple).\n */\nexport function rangeMask(s: number, totalCss: number, range?: [number, number]): number {\n if (!range) return 1;\n const [a, b] = range;\n if (a === b) return 0;\n const u = (((s % totalCss) + totalCss) % totalCss) / totalCss;\n if (a < b) return u >= a && u <= b ? 1 : 0;\n // Wrapping range like [0.9, 0.1].\n return u >= a || u <= b ? 1 : 0;\n}\n\nexport interface RangeMaskParams {\n /** Optional `[start, end]` as fractions of totalCss (0..1). Restricts the effect to a\n * contiguous slice of the perimeter; `end < start` wraps around. */\n range?: [number, number];\n}\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface SpikesEffectParams extends RangeMaskParams {\n count?: number;\n length?: number;\n baseWidth?: number;\n vertScale?: number;\n horzScale?: number;\n diagonalScale?: number;\n irregularity?: number;\n /**\n * 0..1 strength of curvature-based shortening on corners. At 1 we fully cancel the tip-arc\n * expansion `(1 + κL)` so neighbouring spike tips stay roughly evenly spaced even on tight\n * corner arcs; at 0 spikes are constant length and visibly fan outward around corners.\n */\n cornerCompensation?: number;\n}\n\nconst DEFAULTS: Required<Omit<SpikesEffectParams, 'range'>> = {\n count: 44,\n length: 8,\n baseWidth: 3,\n vertScale: 1.4,\n horzScale: 1,\n diagonalScale: 0.5,\n irregularity: 0,\n cornerCompensation: 1,\n};\n\nconst Spikes: EffectModule<SpikesEffectParams> = {\n offsetAt: (s, { params, phase, totalCss, perimeterAt }) => {\n const cfg = { ...DEFAULTS, ...params };\n const mask = rangeMask(s, totalCss, cfg.range);\n if (mask === 0) return { dx: 0, dy: 0 };\n const N = Math.max(3, Math.floor(cfg.count));\n const step = totalCss / N;\n const halfBase = Math.max(0.1, Math.min(step / 2 - 0.05, cfg.baseWidth / 2));\n const phaseOffset = phase * step;\n // Find the nearest spike center on the unwrapped axis, then wrap.\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const i = Math.round((sm - phaseOffset) / step);\n const sc = ((i * step + phaseOffset) % totalCss + totalCss) % totalCss;\n // Use shortest-distance metric on a closed perimeter.\n let ds = sm - sc;\n if (ds > totalCss / 2) ds -= totalCss;\n if (ds < -totalCss / 2) ds += totalCss;\n if (Math.abs(ds) > halfBase) return { dx: 0, dy: 0 };\n // Triangular: peak at ds=0, zero at the base edges.\n const t = 1 - Math.abs(ds) / halfBase;\n const pCenter = perimeterAt(sc);\n // Use the actual perimeter normal — no 45° quantization, so spike angles\n // sweep smoothly through corner arcs.\n const dirX = pCenter.nx;\n const dirY = pCenter.ny;\n // Smoothly blend axis (vert/horz) and diagonal scales by how diagonal the\n // normal points. d = |sin(2θ)| ∈ [0,1]: 0 on the cardinal axes, 1 at 45°.\n const nxAbs = Math.abs(pCenter.nx);\n const nyAbs = Math.abs(pCenter.ny);\n const d = Math.min(1, 2 * nxAbs * nyAbs);\n const axisScale = nyAbs > nxAbs ? cfg.vertScale : cfg.horzScale;\n const scale = axisScale * (1 - d) + cfg.diagonalScale * d;\n const irrMult = 1 + cfg.irregularity * 0.5 * Math.sin(i * 1.73 + 0.7);\n // Numerical curvature κ ≈ |dn/ds| in CSS units. We average over a window roughly the\n // size of a spike footprint so the corner's influence smoothly bleeds onto adjacent\n // flat-edge samples instead of switching off at the arc boundary.\n const eps = Math.max(step * 0.5, halfBase);\n const SAMPLES = 5;\n let kappa = 0;\n for (let k = 0; k < SAMPLES; k++) {\n const u = (k + 0.5) / SAMPLES; // 0..1 across the window\n const sA = sc - eps + u * 2 * eps - eps / SAMPLES;\n const sB = sc - eps + u * 2 * eps + eps / SAMPLES;\n const pA = perimeterAt(sA);\n const pB = perimeterAt(sB);\n kappa += Math.hypot(pB.nx - pA.nx, pB.ny - pA.ny) / (sB - sA);\n }\n kappa /= SAMPLES;\n const baseLen = cfg.length * scale * irrMult * t;\n const comp = Math.max(0, Math.min(cfg.cornerCompensation, 1));\n const lenCss = Math.max(0, baseLen / (1 + comp * kappa * baseLen)) * mask;\n return { dx: dirX * lenCss, dy: dirY * lenCss };\n },\n defaults: DEFAULTS,\n};\n\nexport default Spikes;\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface PuffsEffectParams extends RangeMaskParams {\n bumpWidth?: number;\n puffiness?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<Omit<PuffsEffectParams, 'range'>> = {\n bumpWidth: 18,\n puffiness: 10,\n irregularity: 0,\n};\n\nconst Puffs: EffectModule<PuffsEffectParams> = {\n offsetAt: (s, { params, phase, totalCss, perimeterAt }) => {\n const cfg = { ...DEFAULTS, ...params };\n const mask = rangeMask(s, totalCss, cfg.range);\n if (mask === 0) return { dx: 0, dy: 0 };\n const N = Math.max(2, Math.round(totalCss / Math.max(6, cfg.bumpWidth)));\n const step = totalCss / N;\n const phaseOffset = phase * step;\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const i = Math.floor((sm - phaseOffset) / step);\n const puffStart = i * step + phaseOffset;\n let t = (sm - puffStart) / step;\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n const irr = Math.max(0, Math.min(cfg.irregularity, 1));\n const localPy = Math.max(0.5, cfg.puffiness) * (1 + irr * 0.55 * Math.sin(i * 1.73 + 0.7));\n const disp = localPy * Math.sin(Math.PI * t) * mask;\n const pt = perimeterAt(s);\n return { dx: pt.nx * disp, dy: pt.ny * disp };\n },\n defaults: DEFAULTS,\n};\n\nexport default Puffs;\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface BitesEffectParams extends RangeMaskParams {\n biteRadius?: number;\n biteSpacing?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<Omit<BitesEffectParams, 'range'>> = {\n biteRadius: 3,\n biteSpacing: 8,\n irregularity: 0,\n};\n\nconst Bites: EffectModule<BitesEffectParams> = {\n offsetAt: (s, { params, phase, totalCss, perimeterAt }) => {\n const cfg = { ...DEFAULTS, ...params };\n const mask = rangeMask(s, totalCss, cfg.range);\n if (mask === 0) return { dx: 0, dy: 0 };\n const br = Math.max(0.5, cfg.biteRadius);\n const bs = Math.max(2 * br + 0.5, cfg.biteSpacing);\n const N = Math.max(2, Math.floor(totalCss / bs));\n const step = totalCss / N;\n const phaseOffset = phase * step;\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const i = Math.round((sm - phaseOffset) / step);\n const sc = ((i * step + phaseOffset) % totalCss + totalCss) % totalCss;\n let ds = sm - sc;\n if (ds > totalCss / 2) ds -= totalCss;\n if (ds < -totalCss / 2) ds += totalCss;\n const irr = Math.max(0, Math.min(cfg.irregularity, 1));\n const localR = br * (1 + irr * 0.55 * Math.sin(i * 1.73 + 0.7));\n if (Math.abs(ds) > localR) return { dx: 0, dy: 0 };\n // Triangular inward dent: deepest at ds=0 (peak −localR), zero at ds=±localR.\n const t = 1 - Math.abs(ds) / localR;\n const inward = -localR * t;\n const pt = perimeterAt(s);\n return { dx: pt.nx * inward * mask, dy: pt.ny * inward * mask };\n },\n defaults: DEFAULTS,\n};\n\nexport default Bites;\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface ScallopsEffectParams extends RangeMaskParams {\n scallopRadius?: number;\n scallopSpacing?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<Omit<ScallopsEffectParams, 'range'>> = {\n scallopRadius: 4,\n scallopSpacing: 10,\n irregularity: 0,\n};\n\nconst Scallops: EffectModule<ScallopsEffectParams> = {\n offsetAt: (s, { params, phase, totalCss, perimeterAt }) => {\n const cfg = { ...DEFAULTS, ...params };\n const mask = rangeMask(s, totalCss, cfg.range);\n if (mask === 0) return { dx: 0, dy: 0 };\n const sr = Math.max(0.5, cfg.scallopRadius);\n const ss = Math.max(2 * sr + 0.5, cfg.scallopSpacing);\n const N = Math.max(2, Math.floor(totalCss / ss));\n const step = totalCss / N;\n const phaseOffset = phase * step;\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const i = Math.round((sm - phaseOffset) / step);\n const sc = ((i * step + phaseOffset) % totalCss + totalCss) % totalCss;\n let ds = sm - sc;\n if (ds > totalCss / 2) ds -= totalCss;\n if (ds < -totalCss / 2) ds += totalCss;\n const irr = Math.max(0, Math.min(cfg.irregularity, 1));\n const localR = sr * (1 + irr * 0.55 * Math.sin(i * 1.73 + 0.7));\n if (Math.abs(ds) > localR) return { dx: 0, dy: 0 };\n // Half-circle outward: peak at ds=0 = localR; zero at ±localR.\n const t = (ds + localR) / (2 * localR);\n const disp = localR * Math.sin(Math.PI * t) * mask;\n const pt = perimeterAt(s);\n return { dx: pt.nx * disp, dy: pt.ny * disp };\n },\n defaults: DEFAULTS,\n};\n\nexport default Scallops;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport type Corner = 'tl' | 'tr' | 'bl' | 'br';\n\nexport interface BevelEffectParams {\n /** Bevel band width in CSS px. */\n bevelWidth?: number;\n /** Which corner the light originates from (drives the highlight/shadow distribution across edges). */\n lightFrom?: Corner;\n}\n\nconst DEFAULTS: Required<BevelEffectParams> = { bevelWidth: 6, lightFrom: 'tl' };\n\ntype Side = 'top' | 'right' | 'bottom' | 'left';\n\nfunction sideForNormal(nx: number, ny: number): Side {\n return Math.abs(ny) > Math.abs(nx)\n ? (ny < 0 ? 'top' : 'bottom')\n : (nx < 0 ? 'left' : 'right');\n}\n\nfunction bevelClasses(lightFrom: Corner): Record<Side, string> {\n const isTop = lightFrom[0] === 't';\n const isLeft = lightFrom[1] === 'l';\n return {\n top: isTop ? 'badge-bevel-light' : 'badge-bevel-dark',\n bottom: isTop ? 'badge-bevel-dark' : 'badge-bevel-light',\n left: isLeft ? 'badge-bevel-medium-light' : 'badge-bevel-medium-dark',\n right: isLeft ? 'badge-bevel-medium-dark' : 'badge-bevel-medium-light',\n };\n}\n\nconst SAMPLES = 240;\n\nconst Bevel: EffectModule<BevelEffectParams> = {\n Component: ({ sampler, boxW, boxH, variant, params }) => {\n const clipId = useId();\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const cls = bevelClasses(cfg.lightFrom);\n const total = sampler.totalCss;\n\n // Sample outer + inset rings; tag each sample with the side it belongs to.\n const outer: { x: number; y: number; side: Side }[] = [];\n const inner: { x: number; y: number }[] = [];\n for (let i = 0; i < SAMPLES; i++) {\n const pt = sampler.perimeterAt((i / SAMPLES) * total);\n outer.push({ x: pt.x, y: pt.y, side: sideForNormal(pt.nx, pt.ny) });\n inner.push({\n x: pt.x - pt.nx * cfg.bevelWidth * sx,\n y: pt.y - pt.ny * cfg.bevelWidth * sy,\n });\n }\n\n // Group consecutive samples sharing a side into runs (wrap-aware).\n interface Run { side: Side; idxs: number[] }\n const runs: Run[] = [];\n let cur: Run | null = null;\n for (let i = 0; i < SAMPLES; i++) {\n const side = outer[i].side;\n if (!cur || cur.side !== side) {\n cur = { side, idxs: [i] };\n runs.push(cur);\n } else {\n cur.idxs.push(i);\n }\n }\n // Merge first and last runs if they wrap and share a side.\n if (runs.length > 1 && runs[0].side === runs[runs.length - 1].side) {\n runs[runs.length - 1].idxs = runs[runs.length - 1].idxs.concat(runs[0].idxs);\n runs.shift();\n }\n\n const pathFor = (run: Run): string => {\n const outerPts = run.idxs.map((i) => outer[i]);\n const innerPts = run.idxs.map((i) => inner[i]).reverse();\n const pts = [...outerPts, ...innerPts];\n if (pts.length === 0) return '';\n let d = `M ${pts[0].x.toFixed(3)} ${pts[0].y.toFixed(3)}`;\n for (let i = 1; i < pts.length; i++) {\n d += ` L ${pts[i].x.toFixed(3)} ${pts[i].y.toFixed(3)}`;\n }\n return d + ' Z';\n };\n\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n <g clipPath={`url(#${clipId})`}>\n {runs.map((run, i) => (\n <path key={i} className={cls[run.side]} d={pathFor(run)} />\n ))}\n </g>\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Bevel;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport type Corner = 'tl' | 'tr' | 'bl' | 'br';\n\nexport interface SheenEffectParams {\n lightFrom?: Corner;\n /** Peak gradient opacity (0..1). */\n intensity?: number;\n}\n\nconst DEFAULTS: Required<SheenEffectParams> = { lightFrom: 'tl', intensity: 0.22 };\n\n// Gradient runs from the shadow corner (0%) to the lit corner (100%).\nconst FACE_COORDS: Record<Corner, { x1: string; y1: string; x2: string; y2: string }> = {\n tl: { x1: '100%', y1: '100%', x2: '0%', y2: '0%' },\n tr: { x1: '0%', y1: '100%', x2: '100%', y2: '0%' },\n bl: { x1: '100%', y1: '0%', x2: '0%', y2: '100%' },\n br: { x1: '0%', y1: '0%', x2: '100%', y2: '100%' },\n};\n\nconst Sheen: EffectModule<SheenEffectParams> = {\n Component: ({ sampler, variant, params }) => {\n const gradId = useId();\n const clipId = useId();\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const peak = Math.max(0, Math.min(cfg.intensity, 1));\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n <linearGradient id={gradId} {...FACE_COORDS[cfg.lightFrom]}>\n <stop offset=\"0%\" stopColor=\"black\" stopOpacity={peak} />\n <stop offset=\"45%\" stopColor=\"black\" stopOpacity=\"0.04\" />\n <stop offset=\"58%\" stopColor=\"white\" stopOpacity=\"0.04\" />\n <stop offset=\"100%\" stopColor=\"white\" stopOpacity={peak} />\n </linearGradient>\n </defs>\n <rect clipPath={`url(#${clipId})`} x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill={`url(#${gradId})`} style={{ pointerEvents: 'none' }} />\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Sheen;\n","import type { EffectModule } from '../bases/types';\n\nexport type Corner = 'tl' | 'tr' | 'bl' | 'br';\n\nexport interface RivetsEffectParams {\n /** Rivet radius in CSS px. */\n radius?: number;\n /** Inset from each corner in CSS px. */\n inset?: number;\n /** Light origin (drives which side of each rivet gets the highlight). */\n lightFrom?: Corner;\n}\n\nconst DEFAULTS: Required<RivetsEffectParams> = { radius: 2.4, inset: 7, lightFrom: 'tl' };\n\nconst Rivets: EffectModule<RivetsEffectParams> = {\n Component: ({ boxW, boxH, variant, params }) => {\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW, sy = 100 / boxH;\n const rx = cfg.radius * sx;\n const ry = cfg.radius * sy;\n const ix = cfg.inset * sx;\n const iy = cfg.inset * sy;\n const litDx = cfg.lightFrom[1] === 'l' ? -cfg.radius * 0.32 : cfg.radius * 0.32;\n const litDy = cfg.lightFrom[0] === 't' ? -cfg.radius * 0.32 : cfg.radius * 0.32;\n const positions: [number, number][] = [\n [ix, iy],\n [100 - ix, iy],\n [ix, 100 - iy],\n [100 - ix, 100 - iy],\n ];\n return (\n <>\n {positions.map(([cx, cy], i) => (\n <g key={i}>\n <ellipse className=\"badge-bevel-dark\" cx={cx} cy={cy} rx={rx} ry={ry} />\n <ellipse className=\"badge-bevel-medium-dark\" cx={cx - litDx * 0.6 * sx} cy={cy - litDy * 0.6 * sy} rx={rx * 0.75} ry={ry * 0.75} />\n <ellipse className=\"badge-bevel-light\" cx={cx + litDx * sx} cy={cy + litDy * sy} rx={rx * 0.45} ry={ry * 0.45} />\n </g>\n ))}\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Rivets;\n","import type { EffectModule } from '../bases/types';\n\nexport interface ShadowEffectParams {\n /** Offset in CSS px. */\n dx?: number;\n dy?: number;\n /** Alpha 0..1. */\n opacity?: number;\n}\n\nconst DEFAULTS: Required<ShadowEffectParams> = { dx: 1, dy: 2, opacity: 0.28 };\n\nconst Shadow: EffectModule<ShadowEffectParams> = {\n Component: ({ sampler, boxW, boxH, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW, sy = 100 / boxH;\n const dxVb = cfg.dx * sx;\n const dyVb = cfg.dy * sy;\n return (\n <path\n d={sampler.bodyPath}\n transform={`translate(${dxVb.toFixed(3)} ${dyVb.toFixed(3)})`}\n fill={`rgba(0, 0, 0, ${Math.max(0, Math.min(cfg.opacity, 1))})`}\n stroke=\"none\"\n style={{ pointerEvents: 'none' }}\n />\n );\n },\n zone: 'background',\n defaults: DEFAULTS,\n};\n\nexport default Shadow;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport interface WoodgrainEffectParams {\n /** Number of grain curves. */\n lines?: number;\n /** Number of knot circles. */\n knots?: number;\n /** Overall grain opacity (0..1). */\n intensity?: number;\n}\n\nconst DEFAULTS: Required<WoodgrainEffectParams> = { lines: 4, knots: 2, intensity: 0.55 };\n\n// Deterministic per-line/knot wobble.\nfunction osc(seed: number) {\n return Math.sin(seed * 1.73 + 0.5);\n}\n\nconst Woodgrain: EffectModule<WoodgrainEffectParams> = {\n Component: ({ sampler, variant, params }) => {\n const clipId = useId();\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const lines: string[] = [];\n for (let i = 0; i < cfg.lines; i++) {\n const y = ((i + 1) / (cfg.lines + 1)) * 100;\n // Two control points, slight vertical wobble.\n const dy1 = osc(i * 2 + 1) * 4;\n const dy2 = osc(i * 2 + 2) * 4;\n lines.push(`M -5 ${y.toFixed(2)} Q 35 ${(y + dy1).toFixed(2)} 60 ${y.toFixed(2)} T 105 ${(y + dy2).toFixed(2)}`);\n }\n const knotPositions: [number, number][] = [];\n for (let i = 0; i < cfg.knots; i++) {\n const cx = 30 + osc(i * 3 + 0.7) * 30 + 20;\n const cy = 50 + osc(i * 3 + 1.3) * 30;\n knotPositions.push([cx, cy]);\n }\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n <g clipPath={`url(#${clipId})`} opacity={Math.max(0, Math.min(cfg.intensity, 1))} style={{ pointerEvents: 'none' }}>\n {lines.map((d, i) => (\n <path key={`l${i}`} className=\"badge-stroke\" d={d} fill=\"none\" />\n ))}\n {knotPositions.map(([cx, cy], i) => (\n <g key={`k${i}`}>\n <ellipse className=\"badge-stroke\" cx={cx} cy={cy} rx={3} ry={2.4} fill=\"none\" />\n <ellipse className=\"badge-stroke\" cx={cx} cy={cy} rx={1.2} ry={1} fill=\"none\" />\n </g>\n ))}\n </g>\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Woodgrain;\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface PerforationsEffectParams extends RangeMaskParams {\n /** Hole radius in CSS px. */\n holeRadius?: number;\n /** Spacing between hole centers along the perimeter, in CSS px. */\n holeSpacing?: number;\n}\n\nconst DEFAULTS: Required<Omit<PerforationsEffectParams, 'range'>> = {\n holeRadius: 3,\n holeSpacing: 11,\n};\n\nconst Perforations: EffectModule<PerforationsEffectParams> = {\n Component: ({ sampler, boxW, boxH, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const total = sampler.totalCss;\n const N = Math.max(2, Math.round(total / Math.max(2 * cfg.holeRadius, cfg.holeSpacing)));\n const step = total / N;\n const holes: { cx: number; cy: number }[] = [];\n for (let i = 0; i < N; i++) {\n const sCss = (i + 0.5) * step;\n if (rangeMask(sCss, total, params?.range) === 0) continue;\n const pt = sampler.perimeterAt(sCss);\n holes.push({ cx: pt.x, cy: pt.y });\n }\n const rx = cfg.holeRadius * sx;\n const ry = cfg.holeRadius * sy;\n return (\n <>\n {holes.map((h, i) => (\n <ellipse key={i} cx={h.cx} cy={h.cy} rx={rx} ry={ry} fill=\"black\" />\n ))}\n </>\n );\n },\n zone: 'mask',\n defaults: DEFAULTS as PerforationsEffectParams,\n};\n\nexport default Perforations;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport interface Bevel2EffectParams {\n /** Bevel band width in CSS px. */\n bevelWidth?: number;\n /** Compass angle the light originates from, in degrees. 0° = top, 90° =\n * right, 180° = bottom, 270° = left (CSS `linear-gradient` convention). */\n lightFrom?: number;\n}\n\nconst DEFAULTS: Required<Bevel2EffectParams> = { bevelWidth: 6, lightFrom: 315 };\n\nconst SAMPLES = 240;\n\n// Six shade buckets from brightest to darkest. Each maps to a CSS class.\nconst SHADE_CLASSES = [\n 'badge-bevel-light', // brightest (normal points straight at light)\n 'badge-bevel-medium-light',\n 'badge-bevel-medium-light',\n 'badge-bevel-medium-dark',\n 'badge-bevel-medium-dark',\n 'badge-bevel-dark', // darkest (normal points away from light)\n];\n\nfunction lightDirFor(angleDeg: number): { lx: number; ly: number } {\n // Compass convention (0° = up, clockwise). Returns the unit vector pointing\n // outward from the badge toward the light source.\n const rad = (angleDeg * Math.PI) / 180;\n return { lx: Math.sin(rad), ly: -Math.cos(rad) };\n}\n\nconst Bevel2: EffectModule<Bevel2EffectParams> = {\n Component: ({ sampler, boxW, boxH, variant, params }) => {\n const clipId = useId();\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const total = sampler.totalCss;\n const { lx, ly } = lightDirFor(cfg.lightFrom);\n\n const outer: { x: number; y: number; bucket: number }[] = [];\n const inner: { x: number; y: number }[] = [];\n for (let i = 0; i < SAMPLES; i++) {\n const pt = sampler.perimeterAt((i / SAMPLES) * total);\n // dot(n, lightDir) where light points FROM the corner OUTWARD: surfaces whose\n // outward normal aligns with -light (facing the light source) are brightest.\n const d = -(pt.nx * lx + pt.ny * ly);\n // d ∈ [-1, 1]. Map to [0, SHADE_CLASSES.length).\n const t = Math.max(0, Math.min((d + 1) / 2, 0.9999));\n const bucket = Math.floor(t * SHADE_CLASSES.length);\n outer.push({ x: pt.x, y: pt.y, bucket });\n inner.push({\n x: pt.x - pt.nx * cfg.bevelWidth * sx,\n y: pt.y - pt.ny * cfg.bevelWidth * sy,\n });\n }\n\n interface Run { bucket: number; idxs: number[] }\n const runs: Run[] = [];\n let cur: Run | null = null;\n for (let i = 0; i < SAMPLES; i++) {\n const bucket = outer[i].bucket;\n if (!cur || cur.bucket !== bucket) {\n cur = { bucket, idxs: [i] };\n runs.push(cur);\n } else {\n cur.idxs.push(i);\n }\n }\n if (runs.length > 1 && runs[0].bucket === runs[runs.length - 1].bucket) {\n runs[runs.length - 1].idxs = runs[runs.length - 1].idxs.concat(runs[0].idxs);\n runs.shift();\n }\n\n const pathFor = (run: Run): string => {\n // Each band overlaps its neighbours by one sample on each side so the seams between\n // shade buckets render without gaps.\n const first = run.idxs[0];\n const last = run.idxs[run.idxs.length - 1];\n const prev = (first - 1 + SAMPLES) % SAMPLES;\n const next = (last + 1) % SAMPLES;\n const expandedIdxs = [prev, ...run.idxs, next];\n const outerPts = expandedIdxs.map((i) => outer[i]);\n const innerPts = expandedIdxs.map((i) => inner[i]).reverse();\n const pts = [...outerPts, ...innerPts];\n let d = `M ${pts[0].x.toFixed(3)} ${pts[0].y.toFixed(3)}`;\n for (let i = 1; i < pts.length; i++) {\n d += ` L ${pts[i].x.toFixed(3)} ${pts[i].y.toFixed(3)}`;\n }\n return d + ' Z';\n };\n\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n <g clipPath={`url(#${clipId})`}>\n {runs.map((run, i) => (\n <path key={i} className={SHADE_CLASSES[run.bucket]} d={pathFor(run)} />\n ))}\n </g>\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Bevel2;\n","import type { EffectModule } from '../bases/types';\n\nexport interface OutlineEffectParams {\n /** Stroke width in CSS px. */\n width?: number;\n /** Stroke color. */\n color?: string;\n /** Optional SVG dasharray (e.g. \"4 2\"). */\n dash?: string;\n /** CSS mix-blend-mode: 'normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten',\n * 'difference', etc. Useful when the outline color should react to whatever's behind it. */\n blendMode?: string;\n /** 0..1 stroke opacity. */\n opacity?: number;\n}\n\nconst DEFAULTS: Required<OutlineEffectParams> = {\n width: 1,\n color: 'var(--badge-edge)',\n dash: '',\n blendMode: 'normal',\n opacity: 1,\n};\n\nconst Outline: EffectModule<OutlineEffectParams> = {\n Component: ({ sampler, boxW, boxH, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const widthVb = cfg.width * Math.max(sx, sy);\n return (\n <path\n d={sampler.bodyPath}\n fill=\"none\"\n stroke={cfg.color}\n strokeWidth={widthVb}\n strokeDasharray={cfg.dash || undefined}\n strokeOpacity={cfg.opacity}\n vectorEffect=\"non-scaling-stroke\"\n style={{ mixBlendMode: cfg.blendMode as never }}\n />\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Outline;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport interface SunbeamsEffectParams {\n /** Number of beams (parallelograms) cast across the body. */\n count?: number;\n /** Beam width in CSS px (measured horizontally before the skew). */\n width?: number;\n /** Gap between adjacent beams in CSS px. */\n gap?: number;\n /** Skew angle in degrees. 0 = vertical bars; positive = leaning right. */\n angle?: number;\n /** 0..1 lightness opacity. */\n opacity?: number;\n /** Beam color. Defaults to white. */\n color?: string;\n /** Drift the beam pattern left/right by N CSS px (lets you slide the \"window\" over the body). */\n offset?: number;\n /** 0..1 perturbs each beam's width, opacity, and angle slightly with a deterministic\n * per-beam noise; 0 = perfectly regular. */\n irregularity?: number;\n /** Gradient mask angle in degrees. 0 = left→right, 90 = top→bottom. */\n gradientAngle?: number;\n /** Position along the gradient axis (0..1) where the mask is fully opaque (beams visible). */\n gradientStart?: number;\n /** Position along the gradient axis (0..1) where the mask is fully transparent (beams faded out). */\n gradientEnd?: number;\n}\n\nconst DEFAULTS: Required<SunbeamsEffectParams> = {\n count: 3,\n width: 18,\n gap: 8,\n angle: 28,\n opacity: 0.18,\n color: '#ffffff',\n offset: 0,\n irregularity: 0,\n gradientAngle: 90,\n gradientStart: 0,\n gradientEnd: 1,\n};\n\nconst Sunbeams: EffectModule<SunbeamsEffectParams> = {\n Component: ({ sampler, boxW, boxH, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const clipId = useId();\n const maskId = useId();\n const gradId = useId();\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const irr = Math.max(0, Math.min(cfg.irregularity, 1));\n\n // Per-beam pseudo-random multipliers (deterministic by index).\n const widthMult = (i: number) => 1 + irr * 0.45 * Math.sin(i * 1.73 + 0.7);\n const opacityMult = (i: number) => 1 + irr * 0.5 * Math.sin(i * 2.31 + 1.3);\n const angleJitter = (i: number) => irr * 8 * Math.sin(i * 3.07 + 0.4); // degrees\n\n // Total horizontal span (centered on x=50). We compute using nominal widths so the\n // pattern's centering is stable as irregularity moves individual beam widths.\n const nominalWidthVb = cfg.width * sx;\n const gapVb = cfg.gap * sx;\n const offsetVb = cfg.offset * sx;\n const totalWidth = cfg.count * nominalWidthVb + (cfg.count - 1) * gapVb;\n let cursorX = 50 - totalWidth / 2 + offsetVb;\n const yTop = -50;\n const yBot = 150;\n\n const beams: { points: string; opacity: number }[] = [];\n for (let i = 0; i < cfg.count; i++) {\n const beamWidthVb = nominalWidthVb * widthMult(i);\n const x1 = cursorX;\n const x2 = cursorX + beamWidthVb;\n const tan = Math.tan(((cfg.angle + angleJitter(i)) * Math.PI) / 180);\n const horizPerVb = tan * (sx / sy);\n const halfShear = horizPerVb * (yBot - yTop) / 2;\n const pts = [\n [x1 + halfShear, yTop],\n [x2 + halfShear, yTop],\n [x2 - halfShear, yBot],\n [x1 - halfShear, yBot],\n ];\n beams.push({\n points: pts.map(([px, py]) => `${px.toFixed(3)},${py.toFixed(3)}`).join(' '),\n opacity: Math.max(0, Math.min(cfg.opacity * opacityMult(i), 1)),\n });\n cursorX += nominalWidthVb + gapVb;\n }\n\n // Gradient mask geometry: define a linear gradient from one edge of the viewBox to the\n // other along `gradientAngle`. Position the start/end stops along that 0..1 axis.\n const ga = (cfg.gradientAngle * Math.PI) / 180;\n const cosA = Math.cos(ga), sinA = Math.sin(ga);\n // Vector from centre to edge along the axis. Pick a long-enough span so 0..1 covers\n // the badge fully.\n const span = 100; // viewBox units along the axis from (50-50cos, 50-50sin) to (50+50cos, 50+50sin)\n const x1g = 50 - cosA * span / 2;\n const y1g = 50 - sinA * span / 2;\n const x2g = 50 + cosA * span / 2;\n const y2g = 50 + sinA * span / 2;\n\n const gs = Math.max(0, Math.min(cfg.gradientStart, 1));\n const ge = Math.max(0, Math.min(cfg.gradientEnd, 1));\n // Build stops so the gradient is white (opaque) at `gs` and black (transparent) at `ge`,\n // working whether gs < ge or vice versa.\n const stops = gs <= ge\n ? [\n { offset: 0, color: '#fff' },\n { offset: gs, color: '#fff' },\n { offset: ge, color: '#000' },\n { offset: 1, color: '#000' },\n ]\n : [\n { offset: 0, color: '#000' },\n { offset: ge, color: '#000' },\n { offset: gs, color: '#fff' },\n { offset: 1, color: '#fff' },\n ];\n\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n <linearGradient id={gradId} x1={x1g} y1={y1g} x2={x2g} y2={y2g} gradientUnits=\"userSpaceOnUse\">\n {stops.map((s, i) => <stop key={i} offset={s.offset} stopColor={s.color} />)}\n </linearGradient>\n <mask id={maskId} maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"100\" height=\"100\">\n <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill={`url(#${gradId})`} />\n </mask>\n </defs>\n <g clipPath={`url(#${clipId})`} mask={`url(#${maskId})`}>\n {beams.map((b, i) => (\n <polygon key={i} points={b.points} fill={cfg.color} opacity={b.opacity} />\n ))}\n </g>\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Sunbeams;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\n/**\n * Aqua-glass treatment — composes onto any badge silhouette by walking the\n * sampler's perimeter and painting four layered sub-effects in one pass:\n *\n * 1. Body gradient — vertical tint that runs translucent-top through a\n * bright equator band into a dark base.\n * 2. Specular gloss — upper-hemisphere white-fade clipped to the body.\n * 3. Bezel highlight — bright stroke along perimeter segments whose\n * outward normal points up (`ny < 0`). On a pill that's\n * the upper half; on a hex it's the three top edges;\n * on a starburst it's the upward tips. Normal-aware,\n * not bbox-aligned, which is what makes it work on\n * arbitrary silhouettes.\n * 4. Rim outline — faint dark stroke along the full perimeter.\n *\n * For the *truly* translucent look (with backdrop-filter blur reading the\n * surface behind the badge), use this with `variant=\"outline\"` so the badge's\n * own flat fill doesn't paint behind the gradient, and set\n * `backdrop-filter: blur(...)` on the host element via CSS.\n */\nexport interface AquaEffectParams {\n /** Body tint. Defaults to `var(--badge-edge)` so the badge's tone drives it. */\n accent?: string;\n /** Stop opacities along the body gradient (0..1). */\n topAlpha?: number;\n upperAlpha?: number;\n /** Equator Y position in viewBox units (0..100). */\n equator?: number;\n /** Half-width of the transition band around the equator (viewBox units). */\n equatorSpread?: number;\n /** Mix ratios for the bright equator and dark base stops (0..100, % accent). */\n equatorTint?: number;\n baseTint?: number;\n /** Specular gloss params. */\n glossTopAlpha?: number;\n glossMidAlpha?: number;\n /** Y extent the gloss covers, in viewBox units. 50 = upper hemisphere. */\n glossExtent?: number;\n /** Normal-aware bezel highlight. */\n bezelAlpha?: number;\n bezelWidth?: number; // CSS px\n /** Full-perimeter rim. */\n rimAlpha?: number;\n rimWidth?: number; // CSS px\n}\n\nconst DEFAULTS: Required<AquaEffectParams> = {\n accent: 'var(--badge-edge)',\n topAlpha: 0.45,\n upperAlpha: 0.7,\n equator: 52,\n equatorSpread: 12,\n equatorTint: 95,\n baseTint: 70,\n glossTopAlpha: 0.7,\n glossMidAlpha: 0.18,\n glossExtent: 50,\n bezelAlpha: 0.7,\n bezelWidth: 1,\n rimAlpha: 0.22,\n rimWidth: 1,\n};\n\nconst BEZEL_SAMPLES = 240;\n\nconst Aqua: EffectModule<AquaEffectParams> = {\n Component: ({ sampler, boxW, boxH, variant, params }) => {\n const bodyGradId = useId();\n const glossGradId = useId();\n const glossClipId = useId();\n if (variant !== 'solid' && variant !== 'subtle' && variant !== 'outline') return null;\n const cfg = { ...DEFAULTS, ...params };\n\n // Walk the perimeter and collect contiguous runs where the outward normal\n // points up (ny < 0) — those segments will get the bezel highlight.\n const total = sampler.totalCss;\n type Pt = { x: number; y: number };\n const runs: Pt[][] = [];\n let cur: Pt[] | null = null;\n for (let i = 0; i < BEZEL_SAMPLES; i++) {\n const s = (i / BEZEL_SAMPLES) * total;\n const pt = sampler.perimeterAt(s);\n if (pt.ny < 0) {\n if (!cur) {\n cur = [];\n runs.push(cur);\n }\n cur.push({ x: pt.x, y: pt.y });\n } else {\n cur = null;\n }\n }\n // Wraparound: if first sample and last sample are both \"up\", merge the\n // tail into the head so the bezel renders as one stroke across s=0.\n if (runs.length > 1) {\n const firstSample = sampler.perimeterAt(0);\n const lastSample = sampler.perimeterAt(((BEZEL_SAMPLES - 1) / BEZEL_SAMPLES) * total);\n if (firstSample.ny < 0 && lastSample.ny < 0) {\n const head = runs.shift()!;\n runs[runs.length - 1].push(...head);\n }\n }\n const bezelPaths: string[] = [];\n for (const run of runs) {\n if (run.length < 2) continue;\n let d = `M ${run[0].x.toFixed(3)} ${run[0].y.toFixed(3)}`;\n for (let i = 1; i < run.length; i++) {\n d += ` L ${run[i].x.toFixed(3)} ${run[i].y.toFixed(3)}`;\n }\n bezelPaths.push(d);\n }\n\n // Stroke widths in CSS px → viewBox units. The badge SVG is 100×100 with\n // preserveAspectRatio=\"none\", so use the larger inverse-scale to keep\n // the stroke from getting too thin in either axis.\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const widthScale = Math.max(sx, sy);\n const bezelWidthVb = cfg.bezelWidth * widthScale;\n const rimWidthVb = cfg.rimWidth * widthScale;\n\n const equatorLo = Math.max(0, cfg.equator - cfg.equatorSpread);\n const equatorHi = Math.min(100, cfg.equator + cfg.equatorSpread * 1.6);\n const equatorBrightColor = `color-mix(in srgb, ${cfg.accent} ${cfg.equatorTint}%, white)`;\n const baseColor = `color-mix(in srgb, ${cfg.accent} ${cfg.baseTint}%, black)`;\n\n return (\n <>\n <defs>\n <linearGradient id={bodyGradId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" style={{ stopColor: cfg.accent, stopOpacity: cfg.topAlpha }} />\n <stop offset={`${equatorLo}%`} style={{ stopColor: cfg.accent, stopOpacity: cfg.upperAlpha }} />\n <stop offset={`${cfg.equator}%`} style={{ stopColor: equatorBrightColor, stopOpacity: 1 }} />\n <stop offset={`${equatorHi}%`} style={{ stopColor: cfg.accent, stopOpacity: 1 }} />\n <stop offset=\"100%\" style={{ stopColor: baseColor, stopOpacity: 1 }} />\n </linearGradient>\n <linearGradient id={glossGradId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2={`${cfg.glossExtent}%`}>\n <stop offset=\"0%\" style={{ stopColor: 'white', stopOpacity: cfg.glossTopAlpha }} />\n <stop offset=\"60%\" style={{ stopColor: 'white', stopOpacity: cfg.glossMidAlpha }} />\n <stop offset=\"100%\" style={{ stopColor: 'white', stopOpacity: 0 }} />\n </linearGradient>\n <clipPath id={glossClipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n\n {/* 1. Body — vertical gradient over the silhouette */}\n <path d={sampler.bodyPath} fill={`url(#${bodyGradId})`} style={{ pointerEvents: 'none' }} />\n\n {/* 2. Gloss — upper region, clipped to silhouette */}\n <rect\n x=\"0\"\n y=\"0\"\n width=\"100\"\n height={cfg.glossExtent}\n fill={`url(#${glossGradId})`}\n clipPath={`url(#${glossClipId})`}\n style={{ pointerEvents: 'none' }}\n />\n\n {/* 3. Bezel — stroke segments where normal points up */}\n {bezelPaths.map((d, i) => (\n <path\n key={`bz-${i}`}\n d={d}\n fill=\"none\"\n stroke=\"white\"\n strokeOpacity={cfg.bezelAlpha}\n strokeWidth={bezelWidthVb}\n strokeLinecap=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n style={{ pointerEvents: 'none' }}\n />\n ))}\n\n {/* 4. Rim — full perimeter at low opacity */}\n <path\n d={sampler.bodyPath}\n fill=\"none\"\n stroke=\"black\"\n strokeOpacity={cfg.rimAlpha}\n strokeWidth={rimWidthVb}\n vectorEffect=\"non-scaling-stroke\"\n style={{ pointerEvents: 'none' }}\n />\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Aqua;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\n/**\n * Metal — opaque cousin of the Aqua treatment. Same four sub-passes (body\n * gradient, specular gloss, normal-aware bezel, perimeter rim), but tuned\n * for an opaque metallic surface with a single tunable `specularity`\n * parameter that drives how sharp / contrasty the highlights read.\n *\n * Low specularity → matte aluminum / brushed pewter feel: muted contrast,\n * soft gloss, faint bezel.\n * High specularity → chrome / polished steel: sharp specular peak at the\n * equator, bright bezel and rim, hard transitions in the body gradient.\n *\n * The same `specularity` knob multiplies the equator brightness, gloss\n * alpha, bezel alpha, and rim alpha — so one slider moves the whole\n * surface along a coherent matte-to-mirror axis.\n */\nexport interface MetalEffectParams {\n /** Base metal color. Defaults to a neutral steel; pass e.g. `'#c8a657'` for brass. */\n accent?: string;\n /** 0 = matte, 1 = mirror. Multiplies the brightness of the equator, gloss,\n * bezel, and rim simultaneously. */\n specularity?: number;\n /** Equator Y position (viewBox units, 0..100). */\n equator?: number;\n /** Half-width of the bright equator band. Smaller = sharper specular. */\n equatorSpread?: number;\n /** How dark the upper and lower extremes are (% accent vs black, 0..100). */\n topDarkness?: number;\n baseDarkness?: number;\n /** Gloss params. */\n glossExtent?: number;\n /** Per-zone alpha *baselines* — scaled by `specularity`. */\n glossAlphaTop?: number;\n bezelAlpha?: number;\n bezelWidth?: number; // CSS px\n rimAlpha?: number;\n rimWidth?: number; // CSS px\n}\n\nconst DEFAULTS: Required<MetalEffectParams> = {\n accent: '#aab3bd', // neutral steel\n specularity: 0.6,\n equator: 50,\n equatorSpread: 8,\n topDarkness: 55,\n baseDarkness: 35,\n glossExtent: 50,\n glossAlphaTop: 0.55,\n bezelAlpha: 0.85,\n bezelWidth: 1,\n rimAlpha: 0.35,\n rimWidth: 1,\n};\n\nconst BEZEL_SAMPLES = 240;\n\nconst Metal: EffectModule<MetalEffectParams> = {\n Component: ({ sampler, boxW, boxH, variant, params }) => {\n const bodyGradId = useId();\n const glossGradId = useId();\n const glossClipId = useId();\n if (variant !== 'solid' && variant !== 'subtle' && variant !== 'outline') return null;\n const cfg = { ...DEFAULTS, ...params };\n const spec = Math.max(0, Math.min(cfg.specularity, 1));\n\n // --- Bezel sample walk (same as Aqua: runs where ny < 0). ---\n const total = sampler.totalCss;\n type Pt = { x: number; y: number };\n const runs: Pt[][] = [];\n let cur: Pt[] | null = null;\n for (let i = 0; i < BEZEL_SAMPLES; i++) {\n const s = (i / BEZEL_SAMPLES) * total;\n const pt = sampler.perimeterAt(s);\n if (pt.ny < 0) {\n if (!cur) {\n cur = [];\n runs.push(cur);\n }\n cur.push({ x: pt.x, y: pt.y });\n } else {\n cur = null;\n }\n }\n if (runs.length > 1) {\n const firstSample = sampler.perimeterAt(0);\n const lastSample = sampler.perimeterAt(((BEZEL_SAMPLES - 1) / BEZEL_SAMPLES) * total);\n if (firstSample.ny < 0 && lastSample.ny < 0) {\n const head = runs.shift()!;\n runs[runs.length - 1].push(...head);\n }\n }\n const bezelPaths: string[] = [];\n for (const run of runs) {\n if (run.length < 2) continue;\n let d = `M ${run[0].x.toFixed(3)} ${run[0].y.toFixed(3)}`;\n for (let i = 1; i < run.length; i++) {\n d += ` L ${run[i].x.toFixed(3)} ${run[i].y.toFixed(3)}`;\n }\n bezelPaths.push(d);\n }\n\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const widthScale = Math.max(sx, sy);\n const bezelWidthVb = cfg.bezelWidth * widthScale;\n const rimWidthVb = cfg.rimWidth * widthScale;\n\n // Gradient construction. Specularity sharpens by:\n // 1. Driving the equator peak from neutral accent toward pure white.\n // 2. Boosting gloss/bezel/rim alpha (applied below).\n // 3. Increasing the contrast between dark stops and the equator stop.\n const equatorLo = Math.max(0, cfg.equator - cfg.equatorSpread);\n const equatorHi = Math.min(100, cfg.equator + cfg.equatorSpread);\n // At spec=0 the equator is just the accent; at spec=1 it's almost white.\n const equatorWhiteMix = 100 - Math.round(spec * 85);\n const equatorColor = `color-mix(in srgb, ${cfg.accent} ${equatorWhiteMix}%, white)`;\n const topDarkColor = `color-mix(in srgb, ${cfg.accent} ${cfg.topDarkness}%, black)`;\n const baseDarkColor = `color-mix(in srgb, ${cfg.accent} ${cfg.baseDarkness}%, black)`;\n // Bright stops on either side of the peak collapse toward the peak as\n // specularity rises, sharpening the highlight.\n const upperBrightMix = 100 - Math.round(spec * 50);\n const lowerBrightMix = 100 - Math.round(spec * 30);\n const upperBrightColor = `color-mix(in srgb, ${cfg.accent} ${upperBrightMix}%, white)`;\n const lowerBrightColor = `color-mix(in srgb, ${cfg.accent} ${lowerBrightMix}%, white)`;\n\n const glossAlpha = cfg.glossAlphaTop * spec;\n const bezelAlpha = cfg.bezelAlpha * (0.4 + 0.6 * spec);\n const rimAlpha = cfg.rimAlpha * (0.6 + 0.4 * spec);\n\n return (\n <>\n <defs>\n <linearGradient id={bodyGradId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" style={{ stopColor: topDarkColor }} />\n <stop offset={`${equatorLo}%`} style={{ stopColor: upperBrightColor }} />\n <stop offset={`${cfg.equator}%`} style={{ stopColor: equatorColor }} />\n <stop offset={`${equatorHi}%`} style={{ stopColor: lowerBrightColor }} />\n <stop offset=\"100%\" style={{ stopColor: baseDarkColor }} />\n </linearGradient>\n <linearGradient id={glossGradId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2={`${cfg.glossExtent}%`}>\n <stop offset=\"0%\" style={{ stopColor: 'white', stopOpacity: glossAlpha }} />\n <stop offset=\"100%\" style={{ stopColor: 'white', stopOpacity: 0 }} />\n </linearGradient>\n <clipPath id={glossClipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n\n <path d={sampler.bodyPath} fill={`url(#${bodyGradId})`} style={{ pointerEvents: 'none' }} />\n\n {glossAlpha > 0 && (\n <rect\n x=\"0\"\n y=\"0\"\n width=\"100\"\n height={cfg.glossExtent}\n fill={`url(#${glossGradId})`}\n clipPath={`url(#${glossClipId})`}\n style={{ pointerEvents: 'none' }}\n />\n )}\n\n {bezelPaths.map((d, i) => (\n <path\n key={`bz-${i}`}\n d={d}\n fill=\"none\"\n stroke=\"white\"\n strokeOpacity={bezelAlpha}\n strokeWidth={bezelWidthVb}\n strokeLinecap=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n style={{ pointerEvents: 'none' }}\n />\n ))}\n\n <path\n d={sampler.bodyPath}\n fill=\"none\"\n stroke=\"black\"\n strokeOpacity={rimAlpha}\n strokeWidth={rimWidthVb}\n vectorEffect=\"non-scaling-stroke\"\n style={{ pointerEvents: 'none' }}\n />\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Metal;\n","import type { EffectModule } from '../bases/types';\nimport Spikes, { type SpikesEffectParams } from './Spikes';\nimport Puffs, { type PuffsEffectParams } from './Puffs';\nimport Bites, { type BitesEffectParams } from './Bites';\nimport Scallops, { type ScallopsEffectParams } from './Scallops';\nimport Bevel, { type BevelEffectParams } from './Bevel';\nimport Sheen, { type SheenEffectParams } from './Sheen';\nimport Rivets, { type RivetsEffectParams } from './Rivets';\nimport Shadow, { type ShadowEffectParams } from './Shadow';\nimport Woodgrain, { type WoodgrainEffectParams } from './Woodgrain';\nimport Perforations, { type PerforationsEffectParams } from './Perforations';\nimport Bevel2, { type Bevel2EffectParams } from './Bevel2';\nimport Outline, { type OutlineEffectParams } from './Outline';\nimport Sunbeams, { type SunbeamsEffectParams } from './Sunbeams';\nimport Aqua, { type AquaEffectParams } from './Aqua';\nimport Metal, { type MetalEffectParams } from './Metal';\n\nexport type BadgeEffect =\n | 'spikes' | 'puffs' | 'bites' | 'scallops'\n | 'bevel' | 'bevel2' | 'sheen' | 'sunbeams' | 'rivets' | 'shadow' | 'woodgrain' | 'perforations' | 'outline'\n | 'aqua' | 'metal';\n\nexport interface BadgeEffectParams {\n spikes: SpikesEffectParams;\n puffs: PuffsEffectParams;\n bites: BitesEffectParams;\n scallops: ScallopsEffectParams;\n bevel: BevelEffectParams;\n bevel2: Bevel2EffectParams;\n sheen: SheenEffectParams;\n rivets: RivetsEffectParams;\n shadow: ShadowEffectParams;\n woodgrain: WoodgrainEffectParams;\n perforations: PerforationsEffectParams;\n outline: OutlineEffectParams;\n sunbeams: SunbeamsEffectParams;\n aqua: AquaEffectParams;\n metal: MetalEffectParams;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- EffectModule's P is contravariant (offsetAt/Component take it), and Badge.tsx indexes this registry by a runtime effect name, so a per-key map type collapses to an unsatisfiable intersection.\nexport const EFFECTS: Record<BadgeEffect, EffectModule<any>> = {\n spikes: Spikes,\n puffs: Puffs,\n bites: Bites,\n scallops: Scallops,\n bevel: Bevel,\n bevel2: Bevel2,\n sheen: Sheen,\n rivets: Rivets,\n shadow: Shadow,\n woodgrain: Woodgrain,\n perforations: Perforations,\n outline: Outline,\n sunbeams: Sunbeams,\n aqua: Aqua,\n metal: Metal,\n};\n\nexport interface EffectSpec<E extends BadgeEffect = BadgeEffect> {\n type: E;\n params?: BadgeEffectParams[E];\n}\n","import { useEffect, useId, useRef, useState, type ReactNode, type CSSProperties } from 'react';\nimport { useVisibleRaf } from '@weasel-js/core';\nimport s from './Badge.module.css';\nimport { SHAPES, type BadgeShapeParams } from './shapes';\nimport { BASES, type BadgeBase, type BadgeBaseParams } from './bases';\nimport { EFFECTS, type EffectSpec, type BadgeEffect } from './effects';\nimport type { BadgeShape, BadgeTone, BadgeVariant, BadgeSize } from './types';\nimport { useSvgBox } from './useSvgBox';\n\ninterface BadgeBaseProps {\n tone?: BadgeTone;\n variant?: BadgeVariant;\n size?: BadgeSize;\n /** \"Edge bloat\": offset every base perimeter sample outward by N CSS px along the normal\n * before any compose effects run. Negative values shrink the silhouette. Photoshop-style\n * expand-selection on the body. */\n bloat?: number;\n padding?: number | string;\n /**\n * For CSS-rendered shapes (pill, plain) that fragment across line wraps, controls how the\n * background/border behaves at each break.\n * - `'slice'` (default): decoration is severed at the break (looks like one continuous badge cut by the line).\n * - `'clone'`: each fragment paints its own complete decoration (looks like two separate badges).\n */\n breakStyle?: 'slice' | 'clone';\n /** When set, perimeter-pattern shapes (beavis, cloud, postage, scalloped) continuously shift their pattern. */\n crawl?: boolean | number;\n /** Compose-mode: base shape underneath the badge content. When set, overrides the `shape` prop. */\n base?: BadgeBase;\n baseParams?: BadgeBaseParams[BadgeBase];\n /** Compose-mode: layered effects applied around / over the base. */\n effects?: EffectSpec[];\n onClick?: () => void;\n onRemove?: () => void;\n removeLabel?: string;\n href?: string;\n as?: 'span' | 'button' | 'a';\n children: ReactNode;\n className?: string;\n /** Optional style overrides merged with the badge's own style. Useful for setting CSS\n * custom properties (e.g. `--badge-edge` to inject a custom tone color). */\n style?: CSSProperties;\n 'aria-label'?: string;\n}\n\ntype BadgePropsByShape = {\n [S in BadgeShape]: BadgeBaseProps & { shape?: S; shapeParams?: BadgeShapeParams[S] };\n}[BadgeShape];\n\n/**\n * Props for {@link Badge}. Discriminated on `shape` so `shapeParams` is typed\n * to the chosen shape's own parameters.\n */\nexport type BadgeProps = BadgePropsByShape;\n\nfunction chooseElement(props: BadgeProps): 'span' | 'button' | 'a' {\n if (props.as) return props.as;\n if (props.href) return 'a';\n if (props.onClick) return 'button';\n return 'span';\n}\n\n/**\n * A small labelled chip. Renders as a `<span>`, or as a `<button>`/`<a>` when\n * given `onClick`/`href` — override with `as`.\n *\n * Beyond the built-in {@link BadgeShape} silhouettes, a badge can be composed:\n * `base` picks the underlying outline and `effects` layer perimeter treatments\n * over it, which stack additively. `bloat` pushes the whole silhouette outward\n * along its normals before effects run, and `crawl` animates perimeter\n * patterns.\n */\nexport function Badge(props: BadgeProps) {\n const {\n shape = 'pill',\n tone = 'neutral',\n variant = 'outline',\n size = 'sm',\n onClick,\n onRemove,\n removeLabel,\n href,\n children,\n className,\n shapeParams,\n bloat,\n padding,\n style: styleOverride,\n breakStyle,\n crawl,\n base,\n baseParams,\n effects,\n } = props;\n const ariaLabel = props['aria-label'];\n const element = chooseElement(props);\n const [focused, setFocused] = useState(false);\n const [phase, setPhase] = useState(0);\n const shapeModule = SHAPES[shape] ?? SHAPES.pill;\n const resolvedShape = SHAPES[shape] ? shape : 'pill';\n const ShapeBody = shapeModule.Component;\n const params = { ...(shapeModule.defaults ?? {}), ...(shapeParams ?? {}) };\n\n const lastCrawlRef = useRef<number | null>(null);\n const crawlLoop = useVisibleRaf(\n (now) => {\n const speed = typeof crawl === 'number' ? crawl : 0.2;\n const last = lastCrawlRef.current;\n lastCrawlRef.current = now;\n if (last !== null) setPhase((p) => (p + (speed * (now - last)) / 1000) % 1);\n crawlLoop.request();\n },\n // A crawl does not advance while nobody is watching it, so the frame that\n // resumes it must not apply the whole interval at once.\n { onResume: () => { lastCrawlRef.current = null; } },\n );\n\n useEffect(() => {\n if (!crawl) {\n setPhase(0);\n return;\n }\n lastCrawlRef.current = null;\n crawlLoop.request();\n return () => crawlLoop.cancel();\n }, [crawl, crawlLoop]);\n const cls = [s.badge, className].filter(Boolean).join(' ');\n\n // Compose-mode: explicit `base` prop wins; otherwise the shape may declare its own\n // `compose()` spec to migrate legacy shapes through the new pipeline.\n const shapeComposeSpec = !base && shapeModule.compose ? shapeModule.compose(params) : null;\n const resolvedBaseKey = base ?? (shapeComposeSpec?.base as BadgeBase | undefined);\n const composeBase = resolvedBaseKey ? BASES[resolvedBaseKey] : null;\n const resolvedBaseParams = base\n ? baseParams\n : (shapeComposeSpec?.baseParams as BadgeBaseParams[BadgeBase] | undefined);\n const resolvedEffects: EffectSpec[] | undefined = base\n ? effects\n : (shapeComposeSpec?.effects as EffectSpec[] | undefined) ?? effects;\n const composeBaseParams = composeBase ? { ...(composeBase.defaults ?? {}), ...(resolvedBaseParams ?? {}) } : null;\n const decoRef = useRef<SVGSVGElement>(null);\n const box = useSvgBox(decoRef, composeBase);\n\n const sampler = composeBase ? composeBase.build(composeBaseParams, box.w, box.h) : null;\n\n const insetsSource = composeBase\n ? (typeof composeBase.insets === 'function' ? composeBase.insets(composeBaseParams) : composeBase.insets) ?? { top: 0, right: 0, bottom: 0, left: 0 }\n : (typeof shapeModule.insets === 'function' ? shapeModule.insets(params) : shapeModule.insets);\n const insets = insetsSource;\n const style: CSSProperties = {\n ['--badge-inset-top' as never]: `${insets.top}px`,\n ['--badge-inset-right' as never]: `${insets.right}px`,\n ['--badge-inset-bottom' as never]: `${insets.bottom}px`,\n ['--badge-inset-left' as never]: `${insets.left}px`,\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n ...(breakStyle !== undefined && {\n boxDecorationBreak: breakStyle,\n WebkitBoxDecorationBreak: breakStyle,\n }),\n ...styleOverride,\n };\n\n const commonProps = {\n className: cls,\n style,\n 'data-shape': composeBase ? 'compose' : resolvedShape,\n 'data-tone': tone,\n 'data-variant': variant,\n 'data-size': size,\n 'data-focused': focused ? 'true' : undefined,\n onFocus: () => setFocused(true),\n onBlur: () => setFocused(false),\n 'aria-label': ariaLabel,\n };\n\n // Honest chaining: sample the base perimeter at COMPOSE_SAMPLES points and sum every\n // offset-style effect's contribution at each sample. Stacked transforms therefore compose\n // additively — `[bites, spikes]` produces a bitten outline with spikes radiating from\n // wherever bites haven't dented inward.\n const COMPOSE_SAMPLES = 600;\n const composedSampler = (() => {\n if (!composeBase || !sampler) return null;\n const offsetMods = (resolvedEffects ?? [])\n .map((eff) => {\n const mod = EFFECTS[eff.type as keyof typeof EFFECTS];\n if (!mod?.offsetAt) return null;\n const effParams = { ...(mod.defaults ?? {}), ...(eff.params ?? {}) };\n return { offsetAt: mod.offsetAt, params: effParams };\n })\n .filter(Boolean) as { offsetAt: NonNullable<typeof EFFECTS[BadgeEffect]['offsetAt']>; params: Record<string, unknown> }[];\n const bloatCss = bloat ?? 0;\n if (offsetMods.length === 0 && bloatCss === 0) return sampler;\n const sx = 100 / box.w;\n const sy = 100 / box.h;\n const totalCss = sampler.totalCss;\n // Compute the warped sample point at any CSS arc length s — base perimeter sample\n // bloated outward by a constant CSS distance plus the sum of every offset effect's\n // contribution at that sample.\n const warpedXY = (sCss: number) => {\n const sm = ((sCss % totalCss) + totalCss) % totalCss;\n const pt = sampler.perimeterAt(sm);\n let dx = pt.nx * bloatCss;\n let dy = pt.ny * bloatCss;\n for (const m of offsetMods) {\n const o = m.offsetAt(sm, {\n params: m.params as never,\n phase,\n totalCss,\n perimeterAt: sampler.perimeterAt,\n });\n dx += o.dx;\n dy += o.dy;\n }\n return { x: pt.x + dx * sx, y: pt.y + dy * sy };\n };\n let d = '';\n for (let i = 0; i < COMPOSE_SAMPLES; i++) {\n const sCss = (i / COMPOSE_SAMPLES) * totalCss;\n const w = warpedXY(sCss);\n d += (i === 0 ? `M ${w.x.toFixed(3)} ${w.y.toFixed(3)}` : ` L ${w.x.toFixed(3)} ${w.y.toFixed(3)}`);\n }\n d += ' Z';\n // Replace perimeterAt with a warped version: warped point + normal recomputed from\n // the warped tangent (clockwise rotation of unit tangent). This is what decorations\n // like Bevel and Perforations need to follow the actual bumpy outline.\n const warpedPerimeterAt = (s: number) => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const pt = warpedXY(sm);\n const eps = totalCss / (COMPOSE_SAMPLES * 2);\n const wA = warpedXY(sm - eps);\n const wB = warpedXY(sm + eps);\n // Convert finite-difference tangent back to \"CSS px\" by un-scaling per-axis.\n const tx = (wB.x - wA.x) / sx;\n const ty = (wB.y - wA.y) / sy;\n const tl = Math.hypot(tx, ty) || 1;\n // Outward normal: clockwise rotation of tangent (in CSS space), then renormalize\n // for unit length in viewBox terms when returned.\n const nxC = ty / tl;\n const nyC = -tx / tl;\n // Convert that CSS-space normal back to a viewBox-space unit-ish normal: the\n // existing PerimeterPoint contract has nx/ny used multiplicatively with sx/sy in\n // call sites, matching the convention base perimeters use.\n return { x: pt.x, y: pt.y, nx: nxC, ny: nyC };\n };\n return { bodyPath: d, perimeterAt: warpedPerimeterAt, totalCss };\n })();\n\n const decoEffects = (resolvedEffects ?? []).filter((eff) => EFFECTS[eff.type as keyof typeof EFFECTS]?.Component);\n const backgroundDecorations = decoEffects.filter((eff) => (EFFECTS[eff.type as keyof typeof EFFECTS].zone ?? 'foreground') === 'background');\n const foregroundDecorations = decoEffects.filter((eff) => (EFFECTS[eff.type as keyof typeof EFFECTS].zone ?? 'foreground') === 'foreground');\n const maskDecorations = decoEffects.filter((eff) => EFFECTS[eff.type as keyof typeof EFFECTS].zone === 'mask');\n const bodyMaskId = `badge-mask-${useId().replace(/:/g, '')}`;\n\n const renderDecoration = (eff: EffectSpec, i: number) => {\n const mod = EFFECTS[eff.type as keyof typeof EFFECTS];\n const EffComponent = mod?.Component;\n if (!EffComponent || !composedSampler) return null;\n const effParams = { ...(mod.defaults ?? {}), ...(eff.params ?? {}) };\n return <EffComponent key={`${eff.type as string}-${i}`} sampler={composedSampler} boxW={box.w} boxH={box.h} variant={variant} params={effParams} phase={phase} />;\n };\n\n const decoSvg = composeBase && composedSampler ? (\n <svg ref={decoRef} className={s.deco} viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\" aria-hidden=\"true\">\n {maskDecorations.length > 0 && (\n <defs>\n <mask id={bodyMaskId} maskUnits=\"userSpaceOnUse\" x=\"-10\" y=\"-10\" width=\"120\" height=\"120\">\n <rect x=\"-10\" y=\"-10\" width=\"120\" height=\"120\" fill=\"white\" />\n {maskDecorations.map(renderDecoration)}\n </mask>\n </defs>\n )}\n {backgroundDecorations.map(renderDecoration)}\n <g {...(maskDecorations.length > 0 ? { mask: `url(#${bodyMaskId})` } : {})}>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={composedSampler.bodyPath} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={composedSampler.bodyPath} />}\n </g>\n {foregroundDecorations.map(renderDecoration)}\n </svg>\n ) : shapeModule.renderMode !== 'css' && ShapeBody ? (\n <svg\n className={s.deco}\n viewBox=\"0 0 100 100\"\n preserveAspectRatio={shapeModule.stretches === false ? 'xMidYMid meet' : 'none'}\n aria-hidden=\"true\"\n >\n <ShapeBody variant={variant} focused={focused} params={params} phase={phase} />\n </svg>\n ) : null;\n\n const inner = (\n <>\n {decoSvg}\n <span className={s.content}>\n <span>{children}</span>\n {onRemove && (\n <button\n type=\"button\"\n className={s.remove}\n aria-label={removeLabel ?? 'Remove'}\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n >\n <svg viewBox=\"0 0 10 10\" width=\"10\" height=\"10\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M 2 2 L 8 8 M 8 2 L 2 8\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" fill=\"none\" />\n </svg>\n </button>\n )}\n </span>\n </>\n );\n\n if (element === 'button') {\n return (\n <button type=\"button\" {...commonProps} onClick={onClick}>\n {inner}\n </button>\n );\n }\n if (element === 'a') {\n return (\n <a href={href} {...commonProps} onClick={onClick}>\n {inner}\n </a>\n );\n }\n return <span {...commonProps}>{inner}</span>;\n}\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode, type Ref } from 'react';\nimport s from './Button.module.css';\n\n/** Visual weight of a button. Defaults to `secondary`. */\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost';\n/** Button height and type scale. */\nexport type ButtonSize = 'sm' | 'md';\n\ntype ButtonBase = {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** A button that stays down: renders `aria-pressed` and holds the active\n * treatment while it is on. For a control that reports a state rather than\n * firing an action -- a panel toggle, a mode switch. Left off, the button\n * announces no pressed state at all, which is what an action button wants. */\n pressed?: boolean;\n disabled?: boolean;\n loading?: boolean;\n leadingIcon?: ReactNode;\n trailingIcon?: ReactNode;\n fullWidth?: boolean;\n type?: 'button' | 'submit' | 'reset';\n className?: string;\n style?: ButtonHTMLAttributes<HTMLButtonElement>['style'];\n children?: ReactNode;\n onClick?: ButtonHTMLAttributes<HTMLButtonElement>['onClick'];\n};\n\ntype ButtonRegular = ButtonBase & {\n iconOnly?: false;\n ariaLabel?: string;\n};\n\ntype ButtonIconOnly = ButtonBase & {\n iconOnly: true;\n ariaLabel: string;\n};\n\n/**\n * Props for {@link Button}. Setting `iconOnly` makes `ariaLabel` required,\n * since an icon-only button has no text for a screen reader to announce.\n */\nexport type ButtonProps = ButtonRegular | ButtonIconOnly;\n\nfunction Spinner(): ReactNode {\n return (\n <span className={s.spinner} aria-hidden=\"true\">\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\">\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeOpacity=\"0.25\"\n />\n <path\n d=\"M 8 2 A 6 6 0 0 1 14 8\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n </span>\n );\n}\n\n/**\n * Standard button. `loading` swaps the leading icon for a spinner, marks the\n * button `aria-busy`, and leaves the label in place; it does not disable the\n * button, so pass `disabled` too if the click should be blocked.\n *\n * `ref` forwards to the underlying `<button>`.\n */\nexport const Button = forwardRef(function Button(\n props: ButtonProps,\n ref: Ref<HTMLButtonElement>,\n) {\n const {\n variant = 'secondary',\n size = 'md',\n pressed,\n disabled,\n loading,\n leadingIcon,\n trailingIcon,\n fullWidth,\n iconOnly,\n ariaLabel,\n type = 'button',\n className,\n style,\n children,\n onClick,\n } = props;\n\n const cls = [\n s.button,\n s[`variant_${variant}`],\n s[`size_${size}`],\n fullWidth && s.fullWidth,\n pressed && s.pressed,\n iconOnly && s.iconOnly,\n loading && s.loading,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const showLeading = !iconOnly && (loading || leadingIcon);\n\n return (\n <button\n ref={ref}\n type={type}\n className={cls}\n style={style}\n disabled={disabled}\n aria-busy={loading ? true : undefined}\n aria-pressed={pressed}\n aria-label={ariaLabel}\n onClick={onClick}\n >\n {showLeading && (\n <span className={s.iconSlot}>{loading ? <Spinner /> : leadingIcon}</span>\n )}\n {iconOnly ? (\n loading ? <Spinner /> : <span className={s.iconSlot}>{children}</span>\n ) : (\n children !== undefined && <span className={s.label}>{children}</span>\n )}\n {!iconOnly && trailingIcon && (\n <span className={s.iconSlot}>{trailingIcon}</span>\n )}\n </button>\n );\n});\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ReactNode, PointerEvent as ReactPointerEvent, RefCallback } from 'react';\nimport { startThresholdDrag, type ThresholdDragHandle } from '@weasel-js/core';\n\n/** One row in a reorderable list. */\nexport interface LayerListItem {\n id: string;\n label: ReactNode;\n /** Locked rows cannot be dragged, cannot be crossed by drops, and\n * never combine with other rows in a multi-selection. */\n locked?: boolean;\n /** Optional color swatch rendered before the label. Any CSS color string. */\n swatch?: string;\n}\n\n/**\n * Options for {@link useReorderDragList}. `onReorder` receives the dragged ids\n * and the index they were dropped at, measured against the pre-drag `items`.\n */\nexport interface UseReorderDragListOptions {\n items: LayerListItem[];\n selectedIds: string[];\n onReorder(ids: string[], targetIndex: number): void;\n /** A press that was released without ever engaging a drag — the click a\n * list row means by it. Fires for locked rows too, which can be selected\n * but not dragged. Modifiers are read at press, not at release. */\n onPress?(id: string, mods: PressModifiers): void;\n /** Pointer-move distance (px) before pending drag engages. Default 4. */\n threshold?: number;\n}\n\n/** Modifier keys held when a press began. */\nexport interface PressModifiers {\n shiftKey: boolean;\n ctrlKey: boolean;\n metaKey: boolean;\n altKey: boolean;\n}\n\n/**\n * Live drag state for rendering feedback: which ids are being dragged and the\n * insertion index the drop would use. Both `null` when no drag is engaged.\n */\nexport interface ReorderDragState {\n draggedIds: string[] | null;\n targetIndex: number | null;\n}\n\n/**\n * A `ref` for the list container, an `onPointerDown` for each row, and the\n * live {@link ReorderDragState}. The container ref is required, not optional\n * decoration: it is what the drop index is measured against and what the\n * pointer session is opened on.\n */\nexport interface ReorderDragHandlers {\n rowProps(id: string, index: number): { onPointerDown(e: ReactPointerEvent): void };\n containerProps: {\n ref: RefCallback<HTMLElement>;\n };\n state: ReorderDragState;\n}\n\n/**\n * The half-open run of indices a row at `sourceIndex` may be dropped into:\n * bounded by the nearest locked row above and below it, so a locked row is a\n * wall in both directions rather than a global ceiling.\n */\nfunction unlockedSegment(items: readonly LayerListItem[], sourceIndex: number): [number, number] {\n let lo = 0;\n for (let i = sourceIndex - 1; i >= 0; i--) {\n if (items[i]?.locked) { lo = i + 1; break; }\n }\n let hi = items.length;\n for (let i = sourceIndex + 1; i < items.length; i++) {\n if (items[i]?.locked) { hi = i; break; }\n }\n return [lo, hi];\n}\n\n/** Would dropping `draggedIds` at `targetIndex` leave a contiguous block where it already is? */\nfunction isNoopDrop(items: readonly LayerListItem[], draggedIds: readonly string[], targetIndex: number): boolean {\n const indices = draggedIds\n .map((id) => items.findIndex((it) => it.id === id))\n .filter((i) => i >= 0)\n .sort((a, b) => a - b);\n const contiguous =\n indices.length > 0 &&\n indices.every((v, i) => {\n if (i === 0) return true;\n const prev = indices[i - 1];\n return prev !== undefined && v === prev + 1;\n });\n const first = indices[0];\n const last = indices[indices.length - 1];\n return contiguous\n && first !== undefined\n && last !== undefined\n && targetIndex >= first\n && targetIndex <= last + 1;\n}\n\n/**\n * Drag-to-reorder for a vertical list of rows. Dragging a row that is part of\n * the current selection drags the whole selection; dragging any other row\n * drags just that row. Locked rows can neither be dragged nor crossed by a\n * drop. A drop that would leave a contiguous block where it already is does\n * not call `onReorder`.\n *\n * A press opens a `startThresholdDrag` on the *container*, which owns the\n * rest of the gesture: a drag that leaves the list still tracks, a release\n * anywhere still drops, and a release the window never delivered still ends\n * the drag. The container is the origin rather than the row because rows come\n * and go as the list re-renders, and a drag must outlive the row it grabbed.\n */\nexport function useReorderDragList(opts: UseReorderDragListOptions): ReorderDragHandlers {\n const optsRef = useRef(opts);\n optsRef.current = opts;\n const containerRef = useRef<HTMLElement | null>(null);\n const dragRef = useRef<ThresholdDragHandle | null>(null);\n const [state, setState] = useState<ReorderDragState>({ draggedIds: null, targetIndex: null });\n\n useEffect(() => () => { dragRef.current?.cancel(); }, []);\n\n const computeTargetIndex = useCallback((clientY: number, sourceIndex: number): number => {\n const [lo, hi] = unlockedSegment(optsRef.current.items, sourceIndex);\n const c = containerRef.current;\n if (!c) return lo;\n const rows = Array.from(c.children) as HTMLElement[];\n let raw = rows.length;\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n if (!row) continue;\n const r = row.getBoundingClientRect();\n if (clientY < r.bottom) { raw = i; break; }\n }\n return Math.max(lo, Math.min(raw, hi));\n }, []);\n\n const refCb = useCallback<RefCallback<HTMLElement>>((el) => {\n containerRef.current = el;\n }, []);\n\n const reset = useCallback(() => {\n dragRef.current = null;\n setState({ draggedIds: null, targetIndex: null });\n }, []);\n\n const onPointerDownRow = useCallback((id: string, index: number, e: ReactPointerEvent) => {\n const container = containerRef.current;\n if (!container || dragRef.current) return;\n\n const mods: PressModifiers = {\n shiftKey: e.shiftKey, ctrlKey: e.ctrlKey, metaKey: e.metaKey, altKey: e.altKey,\n };\n let draggedIds: string[] = [];\n let targetIndex = 0;\n\n dragRef.current = startThresholdDrag(e, {\n origin: container,\n // A locked row still opens a drag so its release reaches `onPress`, and\n // a threshold nothing can cross is what keeps it from ever engaging.\n threshold: optsRef.current.items[index]?.locked\n ? Number.POSITIVE_INFINITY\n : (optsRef.current.threshold ?? 4),\n onActivate: (ev) => {\n const selected = optsRef.current.selectedIds;\n const [lo, hi] = unlockedSegment(optsRef.current.items, index);\n draggedIds = (selected.includes(id) ? [...selected] : [id]).filter((x) => {\n const i = optsRef.current.items.findIndex((it) => it.id === x);\n return i >= lo && i < hi;\n });\n targetIndex = computeTargetIndex(ev.clientY, index);\n setState({ draggedIds, targetIndex });\n },\n onMove: (ev) => {\n const next = computeTargetIndex(ev.clientY, index);\n if (next === targetIndex) return;\n targetIndex = next;\n setState({ draggedIds, targetIndex });\n },\n onCommit: (ev) => {\n const drop = computeTargetIndex(ev.clientY, index);\n if (!isNoopDrop(optsRef.current.items, draggedIds, drop)) {\n optsRef.current.onReorder(draggedIds, drop);\n }\n reset();\n },\n onClick: () => {\n optsRef.current.onPress?.(id, mods);\n reset();\n },\n // Every cancel reason — the browser's, a lost capture, an unmount —\n // says the gesture was interrupted rather than aimed, so the rows stay\n // where they were.\n onCancel: reset,\n });\n }, [computeTargetIndex, reset]);\n\n return {\n rowProps: (id, index) => ({\n onPointerDown: (e) => onPointerDownRow(id, index, e),\n }),\n containerProps: {\n ref: refCb,\n },\n state,\n };\n}\n","/**\n * Lightweight sortable data grid. Use for inspector tables — action\n * registries, route maps, telemetry rows. Intentionally narrow:\n *\n * - Sortable columns (click header to cycle asc → desc → none)\n * - Custom cell render via per-column `render`\n * - Optional drag handles for row reordering (when `onReorder` is set)\n *\n * Not: virtual scrolling, column resizing, multi-column sort, filtering,\n * inline editing. Reach for a real grid library when you need those.\n */\nimport { useMemo, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { useReorderDragList } from '../../useReorderDragList';\nimport s from './DataGrid.module.css';\n\n/**\n * One column of a {@link DataGrid}. `id` doubles as the default property name\n * read off each row when no `accessor` is given.\n */\nexport interface DataGridColumn<Row> {\n id: string;\n header: ReactNode;\n /** Pull a sortable value from the row. Defaults to `(row as any)[column.id]`. */\n accessor?: (row: Row) => string | number | null | undefined;\n /** Render the cell. Defaults to `String(accessor(row) ?? '')`. */\n render?: (row: Row) => ReactNode;\n /** Default true. Set false to suppress the sort affordance on this column. */\n sortable?: boolean;\n /** Optional CSS class on every <td> in this column. */\n className?: string;\n}\n\n/** Props for {@link DataGrid}. */\nexport interface DataGridProps<Row extends { id: string }> {\n rows: readonly Row[];\n columns: readonly DataGridColumn<Row>[];\n /** Initial sort. Omit for unsorted (rows render in input order). */\n defaultSort?: { columnId: string; direction: 'asc' | 'desc' };\n /** Enable drag handles in a leading column. Receives the reorder spec\n * (the existing `useReorderDragList` semantics — see weasel-ui). */\n onReorder?: (ids: string[], targetIndex: number) => void;\n /** Empty-state row text. Default `'—'`. */\n empty?: ReactNode;\n className?: string;\n}\n\ntype SortState = { columnId: string; direction: 'asc' | 'desc' } | null;\n\n/**\n * Sortable table for inspector-style data. Rows are keyed by `id`. Clicking a\n * sortable header cycles ascending, descending, unsorted; nullish values sort\n * last regardless of direction. Passing `onReorder` adds a leading drag-handle\n * column — note that the drag indices it reports are into the *sorted* row\n * order, not the input order.\n */\nexport function DataGrid<Row extends { id: string }>(props: DataGridProps<Row>) {\n const { rows, columns, defaultSort, onReorder, empty = '—', className } = props;\n const [sort, setSort] = useState<SortState>(defaultSort ?? null);\n\n const sortedRows = useMemo(() => {\n if (!sort) return [...rows];\n const col = columns.find((c) => c.id === sort.columnId);\n if (!col) return [...rows];\n const get = col.accessor ?? ((row: Row) => (row as unknown as Record<string, unknown>)[col.id] as string | number | null | undefined);\n const dir = sort.direction === 'asc' ? 1 : -1;\n return [...rows].sort((a, b) => {\n const av = get(a);\n const bv = get(b);\n if (av == null && bv == null) return 0;\n if (av == null) return 1;\n if (bv == null) return -1;\n if (av < bv) return -1 * dir;\n if (av > bv) return 1 * dir;\n return 0;\n });\n }, [rows, columns, sort]);\n\n const cycleSort = (columnId: string) => {\n setSort((cur) => {\n if (!cur || cur.columnId !== columnId) return { columnId, direction: 'asc' };\n if (cur.direction === 'asc') return { columnId, direction: 'desc' };\n return null;\n });\n };\n\n // Drag handles via useReorderDragList. Adapter: the hook expects\n // `{ id, label }`-shaped items; we map our rows to that shape (label\n // unused — the hook only uses id and locked).\n const drag = useReorderDragList({\n items: sortedRows.map((r) => ({ id: r.id, label: '' })),\n selectedIds: [],\n onReorder: onReorder ?? (() => {}),\n });\n const dragEnabled = !!onReorder;\n\n const cls = [s.grid, className].filter(Boolean).join(' ');\n\n return (\n <div\n className={cls}\n >\n <table className={s.table}>\n <thead>\n <tr>\n {dragEnabled && <th className={s.handleCol} aria-label=\"drag\" />}\n {columns.map((col) => {\n const sortable = col.sortable !== false;\n const active = sort?.columnId === col.id;\n const indicator = active ? (sort.direction === 'asc' ? ' ↑' : ' ↓') : '';\n return (\n <th\n key={col.id}\n className={[col.className, active ? s.sortActive : ''].filter(Boolean).join(' ')}\n aria-sort={sortable ? (active ? (sort.direction === 'asc' ? 'ascending' : 'descending') : 'none') : undefined}\n >\n {sortable ? (\n <button type=\"button\" className={s.sortButton} onClick={() => cycleSort(col.id)}>\n {col.header}{indicator}\n </button>\n ) : (\n <>{col.header}{indicator}</>\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody ref={dragEnabled ? (drag.containerProps.ref as React.RefCallback<HTMLTableSectionElement>) : undefined}>\n {sortedRows.length === 0 && (\n <tr>\n <td colSpan={columns.length + (dragEnabled ? 1 : 0)} className={s.empty}>\n {empty}\n </td>\n </tr>\n )}\n {sortedRows.map((row, i) => {\n const isDragging = drag.state.draggedIds?.includes(row.id) ?? false;\n const target = drag.state.targetIndex;\n const rowCls = [\n isDragging && s.dragging,\n target === i && s.dropBefore,\n target === sortedRows.length && i === sortedRows.length - 1 && s.dropAfter,\n ].filter(Boolean).join(' ');\n return (\n <tr key={row.id} className={rowCls || undefined}>\n {dragEnabled && (\n <td\n className={s.handleCell}\n onPointerDown={(e) => drag.rowProps(row.id, i).onPointerDown(e)}\n >\n <span aria-hidden=\"true\">⋮⋮</span>\n </td>\n )}\n {columns.map((col) => {\n const get = col.accessor ?? ((r: Row) => (r as unknown as Record<string, unknown>)[col.id] as string | number | null | undefined);\n const content = col.render ? col.render(row) : String(get(row) ?? '');\n return (\n <td key={col.id} className={col.className}>\n {content}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport s from './Disclosure.module.css';\n\n/** Which way the mark points when the section is closed. */\nexport type DisclosureDirection = 'right' | 'down';\n\n/** Props for `<Disclosure>`. */\nexport interface DisclosureProps {\n /** Whether the section it controls is open. The consumer owns this. */\n open: boolean;\n onToggle: () => void;\n /**\n * Names the section, for a screen reader. The control has no text of its\n * own, so without this it announces as an unlabeled button.\n */\n label: string;\n /**\n * `id` of the element this expands. Sets `aria-controls`, which lets a\n * screen reader move to the revealed content.\n */\n controls?: string;\n /** Which way the closed mark points. `'right'` (default) rotates down when\n * open; `'down'` rotates up. */\n direction?: DisclosureDirection;\n /** Mark size in px. The hit target is at least 20px and grows with it.\n * Default 12. */\n size?: number;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * The twisty on a collapsible section: a triangle that turns as it opens.\n *\n * Presentational — it holds no open/closed state and renders no children.\n * The consumer owns the state and the panel; this is the control that toggles\n * it, and `aria-expanded` is what ties the two together.\n *\n * Three things it settles that a hand-rolled twisty keeps getting wrong. The\n * mark is drawn rather than typed, because `--wzl-font-ui` carries no ▸/▾ and\n * a text glyph falls back to whatever the system offers at whatever size that\n * font renders it — around 6px against 13px body text, which reads as dirt on\n * the screen. The hit target is larger than the mark. And it is a sibling of\n * the row's label rather than a child, so clicking to expand does not actuate\n * the label's own control.\n *\n * Deliberately not part of the icon register, on the same grounds as\n * `DragHandleGlyph`: that register is outline strokes at a fixed weight, and\n * `base.mjs` rejects a solid triangle in it by name. A disclosure mark is\n * filled.\n */\nexport function Disclosure({\n open,\n onToggle,\n label,\n controls,\n direction = 'right',\n size = 12,\n disabled,\n className,\n}: DisclosureProps) {\n const cls = [s.twisty, direction === 'down' && s.down, className].filter(Boolean).join(' ');\n return (\n <button\n type=\"button\"\n className={cls}\n aria-expanded={open}\n aria-controls={controls}\n aria-label={label}\n disabled={disabled}\n onClick={onToggle}\n >\n <svg\n className={s.mark}\n viewBox=\"0 0 12 12\"\n width={size}\n height={size}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {/* Vertex on the right edge at the vertical center, so the rotation\n about the box center keeps the point on the same circle. */}\n <path d=\"M4 2.5 L8.5 6 L4 9.5 Z\" />\n </svg>\n </button>\n );\n}\n\n/** Props for `<DisclosureRow>`. */\nexport interface DisclosureRowProps extends Omit<DisclosureProps, 'className'> {\n /** The row's own content — a label, a checkbox, a count. */\n children: ReactNode;\n className?: string;\n}\n\n/**\n * A `<Disclosure>` and a row of content beside it, laid out so the twisty\n * leads and the content takes the rest.\n *\n * The layout is the point: the twisty sits *outside* whatever the row puts in\n * it, so a row whose content is a `<label>` wrapping a checkbox stays\n * clickable as a label without the twisty actuating it.\n */\nexport function DisclosureRow({ children, className, ...twisty }: DisclosureRowProps) {\n return (\n <div className={className ? `${s.row} ${className}` : s.row}>\n <Disclosure {...twisty} />\n <div className={s.rowBody}>{children}</div>\n </div>\n );\n}\n","/** Props for `<DragHandleGlyph>`. */\nexport interface DragHandleGlyphProps {\n /** Height in px; width scales with it. Default 16. */\n size?: number;\n}\n\n/** The two-column dot grip used on anything draggable by a handle.\n *\n * Deliberately not part of the icon register: that register is outline strokes\n * at a fixed weight, and a grip is filled dots. Forcing it in would either\n * break the register's rule or produce a worse glyph. */\nexport function DragHandleGlyph({ size = 16 }: DragHandleGlyphProps) {\n return (\n <svg\n width={(size * 8) / 16}\n height={size}\n viewBox=\"0 0 8 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <circle cx=\"2\" cy=\"3\" r=\"1.1\" />\n <circle cx=\"6\" cy=\"3\" r=\"1.1\" />\n <circle cx=\"2\" cy=\"8\" r=\"1.1\" />\n <circle cx=\"6\" cy=\"8\" r=\"1.1\" />\n <circle cx=\"2\" cy=\"13\" r=\"1.1\" />\n <circle cx=\"6\" cy=\"13\" r=\"1.1\" />\n </svg>\n );\n}\n","import type { CSSProperties } from 'react';\nimport s from './Keycaps.module.css';\n\nconst MODIFIER_GLYPHS = new Set(['⌘', '⇪', '⌥', '⌃', '⇧']);\nconst WIDE_GLYPHS = new Set(['⇥', '↵', '␣']);\n\n/**\n * Width class of a keycap: a modifier glyph, a multi-character legend that\n * needs a wider chip, or a single character in a square one.\n */\nexport type KeycapKind = 'modifier' | 'wide' | 'square';\n\n/**\n * Picks the chip width for a legend — modifier glyphs and anything longer\n * than one character get the wider forms.\n */\nexport function inferKeycapKind(label: string): KeycapKind {\n if (MODIFIER_GLYPHS.has(label)) return 'modifier';\n if (WIDE_GLYPHS.has(label)) return 'wide';\n if (label.length > 1) return 'wide';\n return 'square';\n}\n\n/** Visual style of a keycap chip. */\nexport type KeyCapVariant = 'default' | 'minimal';\n\n/** Props for {@link KeyCap}. */\nexport interface KeyCapProps {\n /** Glyph rendered in the chip (modifier or key). */\n label: string;\n /** Marks the chip as not required to trigger the action. In the default\n * variant the chip face inverts (dark face / light glyph) for\n * emphasis. In the `'minimal'` variant the chip's border becomes\n * dotted to read as \"may be held, but isn't required.\" */\n inverted?: boolean;\n /** Visual style. `'default'` (default) renders a filled chip; `'minimal'`\n * renders an unfilled chip whose border and legend are `currentColor`\n * — useful inline in colored prose / next to colored badges where the\n * chip should take the surrounding text color. */\n variant?: KeyCapVariant;\n className?: string;\n /** Optional inline style. Useful for one-off width overrides (e.g.\n * building a keyboard-layout where the space bar spans several\n * standard-key widths). The component sets no inline styles of its\n * own — everything else comes from the CSS module. */\n style?: CSSProperties;\n /** Override the chip's font-family. Accepts any CSS font-family\n * string. When omitted, the chip inherits from the design-system\n * UI font token (`--wzl-font-ui`). Useful for one-off cases where\n * a different face is desired — though the canonical move is to\n * override the CSS variable at the consumer's scope, not the prop. */\n font?: string;\n}\n\n/** Single bordered keycap chip for one glyph (modifier or key). Use\n * `KeySequence` to render a full shortcut. */\nexport function KeyCap({ label, inverted = false, variant = 'default', className, style, font }: KeyCapProps) {\n const resolvedStyle = font ? { ...style, fontFamily: font } : style;\n return (\n <kbd\n className={[s.key, className].filter(Boolean).join(' ')}\n data-kind={inferKeycapKind(label)}\n data-variant={variant === 'default' ? undefined : variant}\n data-inverted={inverted || undefined}\n style={resolvedStyle}\n >\n {label}\n </kbd>\n );\n}\n","import { Fragment } from 'react';\nimport s from './Keycaps.module.css';\nimport { KeyCap, inferKeycapKind, type KeyCapVariant } from './Keycap';\n\n/** One key in a shortcut. */\nexport interface KeySpec {\n /** Glyph rendered in the chip (modifier or key). */\n label: string;\n /** When true, the chip renders inverted to mark it as not required to\n * trigger the action (e.g. an optional modifier). Defaults to false. */\n optional?: boolean;\n}\n\n/** Props for {@link KeySequence}. */\nexport interface KeySequenceProps {\n /** Keys to render. `undefined` or empty renders a muted em-dash.\n * Modifiers are always rendered first regardless of input order; relative\n * order within each group is preserved. */\n keys: readonly KeySpec[] | undefined;\n /** Character inserted between the trailing modifier chip and the first\n * non-modifier chip (e.g. `'+'` renders `⌘ + K`). `null` or `''`\n * suppresses it. Defaults to `'+'`. */\n separator?: string | null;\n /** Forwarded to every `KeyCap` in the sequence. `'minimal'` renders\n * unfilled chips whose border + legend are `currentColor`. */\n variant?: KeyCapVariant;\n /** Forwarded to every `KeyCap` in the sequence. Overrides the design-\n * system UI font for that chip only. */\n font?: string;\n className?: string;\n}\n\n/** Renders a shortcut as a row of `KeyCap` chips, one per key. Optional\n * keys render inverted to distinguish them from required ones. */\nexport function KeySequence({ keys, separator = '+', variant = 'default', font, className }: KeySequenceProps) {\n if (!keys || keys.length === 0) {\n return <span className={[s.keysEmpty, className].filter(Boolean).join(' ')}>—</span>;\n }\n const ordered = keys\n .map((k, i) => ({ k, i }))\n .sort((a, b) => {\n const am = inferKeycapKind(a.k.label) === 'modifier' ? 0 : 1;\n const bm = inferKeycapKind(b.k.label) === 'modifier' ? 0 : 1;\n return am - bm || a.i - b.i;\n })\n .map(({ k }) => k);\n const sepIdx = ordered.findIndex((k) => inferKeycapKind(k.label) !== 'modifier');\n const showSep = !!separator && sepIdx > 0 && sepIdx < ordered.length;\n return (\n <span className={[s.keys, className].filter(Boolean).join(' ')}>\n {ordered.map((k, i) => (\n <Fragment key={i}>\n {showSep && i === sepIdx ? <span className={s.sep}>{separator}</span> : null}\n <KeyCap label={k.label} inverted={k.optional ?? false} variant={variant} font={font} />\n </Fragment>\n ))}\n </span>\n );\n}\n","import type { KeySpec } from './Keycaps';\n\n/** Logical modifier name. Matches the kit's `ModifierKey` in shape — kept as a\n * local type so `weasel-ui` stays independent of `@weasel-js/core`. */\nexport type LogicalMod = 'mod' | 'shift' | 'alt' | 'ctrl' | 'meta';\n\n/** Detected (or overridden) platform. `'mod'` resolves to ⌘ on macOS,\n * Ctrl on Windows / Linux. */\nexport type Platform = 'macos' | 'windows' | 'linux';\n\n/** Visual form of a modifier or named-key label.\n *\n * - `'auto'` (default): the per-entry, per-platform default — whatever\n * label is actually printed on the physical key. macOS keys show the\n * Apple glyphs (⌘ ⌥ ⌃ ⇧ ⎋ ↵ ⇥). Windows keys mostly show text\n * (Ctrl, Alt, Shift) BUT the Win key shows its logo (⊞) and the\n * context-menu key shows ▤. Linux mirrors Windows with Super (⊞).\n * - `'symbol'` forces the Apple-style glyph everywhere a symbolic form\n * exists. Entries without a widely-recognized symbol still fall\n * back to text.\n * - `'text'` always spells the label out (Cmd / Option / Esc / Enter). */\nexport type LegendStyle = 'auto' | 'symbol' | 'text';\n\n/** A modifier to render, named platform-independently. */\nexport interface LogicalModSpec {\n name: LogicalMod;\n /** Marks this modifier as optional (may be held but isn't required).\n * Forwarded as the resulting `KeySpec.optional`. */\n optional?: boolean;\n}\n\n/** Options for {@link keySpecsFromMods}. */\nexport interface KeySpecsFromModsOptions {\n /** Override OS detection. Defaults to the detected platform, or\n * `'macos'` when detection is unavailable (e.g. in tests, or when\n * `navigator` is missing). */\n platform?: Platform;\n /** Defaults to `'auto'` (symbol on macOS, text everywhere else). Pass\n * `'symbol'` or `'text'` to force a specific style regardless of\n * platform. */\n legend?: LegendStyle;\n}\n\nconst MOD_BY_PLATFORM: Record<LogicalMod, Record<Platform, Record<LegendStyle, string>>> = {\n mod: {\n macos: { auto: '⌘', symbol: '⌘', text: 'Cmd' },\n windows: { auto: 'Ctrl', symbol: 'Ctrl', text: 'Ctrl' },\n linux: { auto: 'Ctrl', symbol: 'Ctrl', text: 'Ctrl' },\n },\n shift: {\n macos: { auto: '⇧', symbol: '⇧', text: 'Shift' },\n windows: { auto: '⇧', symbol: '⇧', text: 'Shift' },\n linux: { auto: '⇧', symbol: '⇧', text: 'Shift' },\n },\n alt: {\n macos: { auto: '⌥', symbol: '⌥', text: 'Option' },\n windows: { auto: 'Alt', symbol: 'Alt', text: 'Alt' },\n linux: { auto: 'Alt', symbol: 'Alt', text: 'Alt' },\n },\n ctrl: {\n macos: { auto: '⌃', symbol: '⌃', text: 'Control' },\n windows: { auto: 'Ctrl', symbol: 'Ctrl', text: 'Ctrl' },\n linux: { auto: 'Ctrl', symbol: 'Ctrl', text: 'Ctrl' },\n },\n // Windows/Linux Meta has a recognized symbol on the physical key (⊞ Win\n // logo / Super logo), so `auto` shows it. Use `text` for Win / Super.\n meta: {\n macos: { auto: '⌘', symbol: '⌘', text: 'Cmd' },\n windows: { auto: '⊞', symbol: '⊞', text: 'Win' },\n linux: { auto: '⊞', symbol: '⊞', text: 'Super' },\n },\n};\n\n/** Detect the user's OS from the browser environment. UA sniffing — not\n * 100% reliable, but adequate for picking a modifier-glyph convention.\n * Falls back to `'macos'` (matches the kit's docs convention) when\n * `navigator` is unavailable. */\nexport function detectPlatform(): Platform {\n if (typeof navigator === 'undefined') return 'macos';\n // Prefer the modern userAgentData when available (Chromium-only today).\n const uaData = (navigator as Navigator & { userAgentData?: { platform?: string } }).userAgentData;\n const raw = (uaData?.platform ?? navigator.userAgent ?? '').toLowerCase();\n if (raw.includes('mac') || raw.includes('darwin') || raw.includes('iphone') || raw.includes('ipad')) return 'macos';\n if (raw.includes('win')) return 'windows';\n if (raw.includes('linux') || raw.includes('x11')) return 'linux';\n return 'macos';\n}\n\n/**\n * Map a list of **logical** modifiers (`'mod'`, `'shift'`, …) to **visual**\n * `KeySpec`s appropriate for the current platform.\n *\n * The kit-side gesture grammar uses logical names so the same route reads\n * correctly on every OS — `'mod'` means \"Cmd on Mac, Ctrl on Win/Linux\".\n * `KeySequence` is purely visual and renders the labels you give it; this\n * helper is the bridge.\n *\n * ```ts\n * <KeySequence\n * keys={keySpecsFromMods([{ name: 'mod' }, { name: 'shift', optional: true }])}\n * />\n * ```\n *\n * On a Mac: renders `⌘ ⇧`. On Windows: renders `Ctrl Shift`. Pass an\n * explicit `platform` to override detection (e.g. for docs that always\n * show the macOS form). Pass `legend: 'text'` to force \"Cmd\" over \"⌘\"\n * even on macOS.\n */\nexport function keySpecsFromMods(\n mods: readonly LogicalModSpec[],\n opts: KeySpecsFromModsOptions = {},\n): readonly KeySpec[] {\n const platform = opts.platform ?? detectPlatform();\n const legend = opts.legend ?? 'auto';\n return mods.map((m) => {\n const label = MOD_BY_PLATFORM[m.name][platform][legend];\n return m.optional ? { label, optional: true } : { label };\n });\n}\n\n/** Per-platform × per-legend table for named, non-modifier keys. `auto`\n * is whatever's printed on the physical key for that platform. Arrows\n * are universal symbols on every platform. */\nconst NAMED_KEY: Record<string, Record<Platform, Record<LegendStyle, string>>> = {\n Escape: { macos: { auto: '⎋', symbol: '⎋', text: 'Esc' }, windows: { auto: 'Esc', symbol: 'Esc', text: 'Esc' }, linux: { auto: 'Esc', symbol: 'Esc', text: 'Esc' } },\n Enter: { macos: { auto: '↵', symbol: '↵', text: 'Return' }, windows: { auto: 'Enter', symbol: 'Enter', text: 'Enter' }, linux: { auto: 'Enter', symbol: 'Enter', text: 'Enter' } },\n Return: { macos: { auto: '↵', symbol: '↵', text: 'Return' }, windows: { auto: 'Enter', symbol: 'Enter', text: 'Enter' }, linux: { auto: 'Enter', symbol: 'Enter', text: 'Enter' } },\n Tab: { macos: { auto: '⇥', symbol: '⇥', text: 'Tab' }, windows: { auto: 'Tab', symbol: 'Tab', text: 'Tab' }, linux: { auto: 'Tab', symbol: 'Tab', text: 'Tab' } },\n Space: { macos: { auto: '␣', symbol: '␣', text: 'Space' }, windows: { auto: 'Space', symbol: 'Space', text: 'Space' }, linux: { auto: 'Space', symbol: 'Space', text: 'Space' } },\n ' ': { macos: { auto: '␣', symbol: '␣', text: 'Space' }, windows: { auto: 'Space', symbol: 'Space', text: 'Space' }, linux: { auto: 'Space', symbol: 'Space', text: 'Space' } },\n Backspace: { macos: { auto: '⌫', symbol: '⌫', text: 'Backspace' }, windows: { auto: 'Backspace', symbol: 'Backspace', text: 'Backspace' }, linux: { auto: 'Backspace', symbol: 'Backspace', text: 'Backspace' } },\n Delete: { macos: { auto: '⌦', symbol: '⌦', text: 'Delete' }, windows: { auto: 'Delete', symbol: 'Delete', text: 'Delete' }, linux: { auto: 'Delete', symbol: 'Delete', text: 'Delete' } },\n // Context-menu key (the right-Ctrl-area key on Windows / Linux keyboards\n // with a ▤ icon). Mac has no equivalent; falls back to text 'Menu'.\n ContextMenu: { macos: { auto: 'Menu', symbol: 'Menu', text: 'Menu' }, windows: { auto: '▤', symbol: '▤', text: 'Menu' }, linux: { auto: '▤', symbol: '▤', text: 'Menu' } },\n ArrowUp: { macos: { auto: '↑', symbol: '↑', text: '↑' }, windows: { auto: '↑', symbol: '↑', text: '↑' }, linux: { auto: '↑', symbol: '↑', text: '↑' } },\n ArrowDown: { macos: { auto: '↓', symbol: '↓', text: '↓' }, windows: { auto: '↓', symbol: '↓', text: '↓' }, linux: { auto: '↓', symbol: '↓', text: '↓' } },\n ArrowLeft: { macos: { auto: '←', symbol: '←', text: '←' }, windows: { auto: '←', symbol: '←', text: '←' }, linux: { auto: '←', symbol: '←', text: '←' } },\n ArrowRight: { macos: { auto: '→', symbol: '→', text: '→' }, windows: { auto: '→', symbol: '→', text: '→' }, linux: { auto: '→', symbol: '→', text: '→' } },\n};\n\n/**\n * Render a raw `KeyboardEvent.key` value as a platform-appropriate\n * `KeySpec`. Named non-modifier keys (Esc, Enter, Tab, Space, Backspace,\n * Delete, arrows) get the platform's conventional form. Letter / digit /\n * other keys pass through upper-cased.\n *\n * ```ts\n * keySpecFromKey('Escape', { platform: 'macos' }) // { label: '⎋' }\n * keySpecFromKey('Escape', { platform: 'windows' }) // { label: 'Esc' }\n * keySpecFromKey('p') // { label: 'P' }\n * ```\n *\n * Symbol mode is only meaningful on macOS — Windows / Linux keyboards\n * print the text form on the physical key, so symbol mode there falls\n * back to text.\n */\nexport function keySpecFromKey(\n raw: string,\n opts: KeySpecsFromModsOptions & { optional?: boolean } = {},\n): KeySpec {\n const platform = opts.platform ?? detectPlatform();\n const legend = opts.legend ?? 'auto';\n const entry = NAMED_KEY[raw];\n const label = entry ? entry[platform][legend] : raw.length === 1 ? raw.toUpperCase() : raw;\n return opts.optional ? { label, optional: true } : { label };\n}\n","/** Apple-style glyph for a DOM `KeyboardEvent.key` value. Covers escape,\n * delete/backspace, arrows, enter/return, tab, space. Unknown keys are\n * upper-cased (so `'a'` reads as `A` on a keycap) and returned unchanged\n * otherwise — making this safe to apply uniformly without a `has-glyph`\n * check at the call site. */\nexport function keyGlyph(rawKey: string): string {\n switch (rawKey) {\n case 'Escape': return '⎋';\n case 'Backspace': return '⌫';\n case 'Delete': return '⌦';\n case 'ArrowUp': return '↑';\n case 'ArrowDown': return '↓';\n case 'ArrowLeft': return '←';\n case 'ArrowRight': return '→';\n case 'Enter':\n case 'Return': return '↵';\n case 'Tab': return '⇥';\n case ' ':\n case 'Space': return '␣';\n default: return rawKey.toUpperCase();\n }\n}\n","import { type CSSProperties, type ReactNode, type RefCallback, useEffect, useState } from 'react';\nimport { dlog } from '../../dlog';\nimport { useReorderDragList } from '../../useReorderDragList';\nimport { DragHandleGlyph } from '../DragHandleGlyph';\nimport s from './LayerStack.module.css';\n\n/** One card in a layer stack: its identity, the label shown when collapsed,\n * and the optional select hoisted into its header. */\nexport interface LayerStackItem {\n /** Stable id used for keys, onRemove, onReorder. Numeric to match\n * common id-from-nextId conventions; string ids also work. */\n id: number | string;\n /** Short kind label rendered in the header when no primary select\n * is hoisted (e.g. \"shadow\", \"stroke\"). Omit it for items that have no\n * kind; `label` then names the card. */\n kind?: string;\n /** Header text, when the item's name is not its kind. Falls back to\n * `kind`. */\n label?: string;\n /** When present, hoist this select into the card header so the user\n * can switch mode/shape without expanding. */\n primaryValue?: string;\n primaryOptions?: string[];\n /** Accent CSS color used as the left border / index-badge fill. Sets\n * --wzl-layer-stack-accent on the card, which re-binds --wzl-accent\n * for everything inside it. */\n accent?: string;\n /** Optional badge text rendered before the primary control\n * (e.g. tail index \"1\", \"2\", \"3\"). When omitted a drag handle\n * glyph renders in its place. */\n badge?: string;\n /** Initial expanded state. Defaults to true for newly-added items. */\n defaultExpanded?: boolean;\n}\n\n/** Props for `<LayerStack>`. */\nexport interface LayerStackProps {\n /** Heading above the list. Omit it, along with the palette, for a stack\n * whose surroundings already name it. */\n title?: string;\n items: LayerStackItem[];\n /** Kinds the user can add via the header palette. Omit both this and\n * `onAdd` for a stack the user cannot add to. */\n paletteKinds?: string[];\n onAdd?: (kind: string) => void;\n /** Omit for items the user cannot remove; the card then has no ✕. */\n onRemove?: (id: number | string) => void;\n onReorder: (orderedIds: Array<number | string>) => void;\n /** Required for `primaryValue` to render as a select — without a handler\n * the control could not be changed. */\n onPrimaryChange?: (id: number | string, nextValue: string) => void;\n /** Render the body controls for each item. */\n renderBody: (item: LayerStackItem) => ReactNode;\n /** Shown in place of the list when `items` is empty. Defaults to a line\n * that points at the palette, or a bare one when there is no palette. */\n emptyLabel?: ReactNode;\n /** Hide the title + palette row (used when an outer wrap renders its\n * own head — see speech-balloons Tails panel). */\n hideHead?: boolean;\n /** Appended to the root element's class list. The module's own class names\n * are hashed, so this is the supported way to reach the stack from a\n * consumer stylesheet. */\n className?: string;\n}\n\n/** A drag-reorderable stack of expandable cards, with a palette in the header\n * for adding more. The body of each card is the caller's to render. */\nexport function LayerStack({\n className,\n title,\n items,\n paletteKinds,\n onAdd,\n onRemove,\n onReorder,\n onPrimaryChange,\n renderBody,\n emptyLabel,\n hideHead,\n}: LayerStackProps) {\n const [expandedIds, setExpandedIds] = useState<Set<number | string>>(\n () => new Set(items.filter((i) => i.defaultExpanded !== false).map((i) => i.id)),\n );\n\n useEffect(() => {\n setExpandedIds((prev) => {\n let next: Set<number | string> | null = null;\n for (const item of items) {\n if (item.defaultExpanded === false) continue;\n if (prev.has(item.id)) continue;\n if (next === null) next = new Set(prev);\n next.add(item.id);\n }\n return next ?? prev;\n });\n }, [items]);\n\n const dragItems = items.map((it) => ({\n id: String(it.id),\n label: it.label ?? it.kind ?? String(it.id),\n }));\n const drag = useReorderDragList({\n items: dragItems,\n selectedIds: [],\n onReorder: (ids, targetIndex) => {\n dlog('layer-stack', 'onReorder', { ids, targetIndex });\n const orig = items.map((i) => i.id);\n const moving = new Set(ids);\n const remaining = orig.filter((id) => !moving.has(String(id)));\n const movedIds = items.map((i) => i.id).filter((id) => moving.has(String(id)));\n // weasel reports targetIndex against the original list (which includes\n // the dragged row). Each moved item that originally sat before\n // targetIndex needs to shift the insertion point left by one.\n const shift = orig.filter((id, idx) => moving.has(String(id)) && idx < targetIndex).length;\n const adjusted = targetIndex - shift;\n const out = [...remaining];\n out.splice(adjusted, 0, ...movedIds);\n onReorder(out);\n },\n });\n\n const toggleExpanded = (id: number | string) => {\n setExpandedIds((current) => {\n const n = new Set(current);\n if (n.has(id)) n.delete(id);\n else n.add(id);\n return n;\n });\n };\n\n const palette = onAdd ? (paletteKinds ?? []) : [];\n const showHead = !hideHead && (title !== undefined || palette.length > 0);\n\n return (\n <div className={className ? `${s.stack} ${className}` : s.stack}>\n {showHead && (\n <div className={s.head}>\n {title !== undefined && <h2 className={s.title}>{title}</h2>}\n <div className={s.palette}>\n {palette.map((k) => (\n <button\n key={k}\n type=\"button\"\n className={s.add}\n onClick={() => {\n dlog('layer-stack', 'onAdd', { kind: k });\n onAdd?.(k);\n }}\n aria-label={`Add ${k}`}\n >\n {k}\n </button>\n ))}\n </div>\n </div>\n )}\n <div\n className={s.list}\n ref={drag.containerProps.ref as RefCallback<HTMLDivElement>}\n >\n {items.map((item, i) => {\n const expanded = expandedIds.has(item.id);\n const draggedId = drag.state.draggedIds?.[0];\n const isDragging = draggedId === String(item.id);\n const showHintBefore = drag.state.targetIndex === i && draggedId !== String(item.id);\n const showHintAfter = drag.state.targetIndex === items.length && i === items.length - 1;\n const cardCls = [\n s.card,\n isDragging ? s.cardDragging : '',\n item.accent ? s.cardAccented : '',\n ]\n .filter(Boolean)\n .join(' ');\n const cardStyle = item.accent\n ? ({ '--wzl-layer-stack-accent': item.accent } as CSSProperties)\n : undefined;\n const { onPointerDown } = drag.rowProps(String(item.id), i);\n return (\n <div key={item.id}>\n {showHintBefore && <div className={s.dropHint} />}\n <div className={cardCls} data-testid={`layer-card-${item.id}`} style={cardStyle}>\n <div className={s.cardHead}>\n <button\n type=\"button\"\n className={s.handle}\n aria-label={`Drag to reorder layer ${item.id}`}\n onPointerDown={onPointerDown}\n onClick={() => toggleExpanded(item.id)}\n >\n {item.badge ?? <DragHandleGlyph />}\n </button>\n {item.primaryValue !== undefined && item.primaryOptions && onPrimaryChange ? (\n <select\n className={s.primary}\n value={item.primaryValue}\n aria-label={`Primary select for layer ${item.id}`}\n onChange={(e) => onPrimaryChange(item.id, e.target.value)}\n onClick={(e) => e.stopPropagation()}\n >\n {item.primaryOptions.map((o) => (\n <option key={o} value={o}>\n {o}\n </option>\n ))}\n </select>\n ) : (\n <span className={s.kind}>{item.label ?? item.kind}</span>\n )}\n {onRemove && (\n <button\n type=\"button\"\n className={s.remove}\n aria-label=\"Remove layer\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove(item.id);\n }}\n >\n ✕\n </button>\n )}\n </div>\n {expanded && <div className={s.cardBody}>{renderBody(item)}</div>}\n </div>\n {showHintAfter && <div className={s.dropHint} />}\n </div>\n );\n })}\n {items.length === 0 && (\n <div className={s.empty}>\n {emptyLabel ?? (palette.length > 0 ? 'No layers — add one above.' : 'No layers.')}\n </div>\n )}\n </div>\n </div>\n );\n}\n","var e = {\n\troot: \"_root_nj5x1_10\",\n\tsegment: \"_segment_nj5x1_32\",\n\tsegmentSelected: \"_segmentSelected_nj5x1_81\",\n\tsize_sm: \"_size_sm_nj5x1_139\",\n\tvariant_minimal: \"_variant_minimal_nj5x1_152\"\n};\n//#endregion\nexport { e as t };\n\n//# sourceMappingURL=segmentedControl.module-DmeUMYe3.js.map","import { type CSSProperties, type ReactElement, type ReactNode } from 'react';\nimport s from '../segmentedControl.module.css';\nimport { useRovingTabIndex } from '../../useRovingTabIndex';\n\n/**\n * One segment of an {@link OptionsBar}. Unlike `ToggleBar`, each item carries\n * its own selected state and its own `onChange`.\n */\nexport type OptionsBarItem<V extends string | number = string> = {\n value: V;\n label?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n selected: boolean;\n onChange: (next: boolean) => void;\n};\n\n/** Segment height and type scale for an {@link OptionsBar}. */\nexport type OptionsBarSize = 'sm' | 'md';\n/** Visual treatment of an {@link OptionsBar}. */\nexport type OptionsBarVariant = 'default' | 'minimal';\n\n/** Props for {@link OptionsBar}. */\nexport type OptionsBarProps<V extends string | number = string> = {\n items: readonly OptionsBarItem<V>[];\n ariaLabel?: string;\n className?: string;\n height?: number;\n /** Size variant. `sm` is ~60% of the default height with reduced padding\n * and font size — sized for dense surfaces like lab control panels. */\n size?: OptionsBarSize;\n /** Visual variant. `minimal` strips the pill track and glass treatment;\n * selection becomes a flat accent. For dense diagnostic surfaces. */\n variant?: OptionsBarVariant;\n};\n\n/**\n * Segmented strip of independent on/off options, each owning its own state.\n * Use it when the segments are unrelated booleans; use `ToggleBar` when they\n * are values of one setting.\n */\nexport function OptionsBar<V extends string | number = string>(props: OptionsBarProps<V>): ReactElement {\n const { items, ariaLabel, className, height, size, variant } = props;\n\n const toggle = (index: number) => {\n const item = items[index];\n if (item.disabled) return;\n item.onChange(!item.selected);\n };\n\n const roving = useRovingTabIndex({ items, itemClassName: s.segment, onActivate: toggle });\n\n const style: CSSProperties | undefined = height !== undefined\n ? ({ ['--wzl-tb-height' as string]: `${height}px` } as CSSProperties)\n : undefined;\n\n const rootCls = [\n s.root,\n size && s[`size_${size}`],\n variant && s[`variant_${variant}`],\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <div\n ref={roving.rootRef}\n className={rootCls}\n role=\"group\"\n aria-label={ariaLabel}\n style={style}\n >\n {items.map((item, i) => {\n const cls = `${s.segment}${item.selected ? ` ${s.segmentSelected}` : ''}`;\n return (\n <button\n key={item.value}\n type=\"button\"\n aria-pressed={item.selected}\n aria-label={item.ariaLabel}\n disabled={item.disabled}\n tabIndex={roving.tabIndexFor(i)}\n className={cls}\n onClick={() => toggle(i)}\n onKeyDown={roving.onKeyDown(i)}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import { type CSSProperties, type ReactElement, type ReactNode } from 'react';\nimport s from '../segmentedControl.module.css';\nimport { useRovingTabIndex } from '../../useRovingTabIndex';\n\n/**\n * One button in an {@link ActionsBar}. `value` is only a React key; the item\n * carries no selected state.\n */\nexport type ActionsBarItem<V extends string | number = string> = {\n value: V;\n label?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n onAction: () => void;\n};\n\n/** Segment height and type scale for an {@link ActionsBar}. */\nexport type ActionsBarSize = 'sm' | 'md';\n/** Visual treatment of an {@link ActionsBar}. */\nexport type ActionsBarVariant = 'default' | 'minimal';\n\n/** Props for {@link ActionsBar}. */\nexport type ActionsBarProps<V extends string | number = string> = {\n items: readonly ActionsBarItem<V>[];\n ariaLabel?: string;\n className?: string;\n height?: number;\n size?: ActionsBarSize;\n variant?: ActionsBarVariant;\n};\n\n/**\n * Segmented strip of momentary buttons — each press fires and nothing stays\n * selected. Shares the look and the arrow-key navigation of `ToggleBar` and\n * `OptionsBar`.\n *\n * This is a plain callback bar. For buttons driven by the kit's actions\n * registry, use `ActionBar` instead.\n */\nexport function ActionsBar<V extends string | number = string>(props: ActionsBarProps<V>): ReactElement {\n const { items, ariaLabel, className, height, size, variant } = props;\n\n const fire = (index: number) => {\n const item = items[index];\n if (item.disabled) return;\n item.onAction();\n };\n\n const roving = useRovingTabIndex({ items, itemClassName: s.segment, onActivate: fire });\n\n const style: CSSProperties | undefined = height !== undefined\n ? ({ ['--wzl-tb-height' as string]: `${height}px` } as CSSProperties)\n : undefined;\n\n const rootCls = [\n s.root,\n size && s[`size_${size}`],\n variant && s[`variant_${variant}`],\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <div\n ref={roving.rootRef}\n className={rootCls}\n role=\"toolbar\"\n aria-label={ariaLabel}\n style={style}\n >\n {items.map((item, i) => (\n <button\n key={item.value}\n type=\"button\"\n aria-label={item.ariaLabel}\n disabled={item.disabled}\n tabIndex={roving.tabIndexFor(i)}\n className={s.segment}\n onClick={() => fire(i)}\n onKeyDown={roving.onKeyDown(i)}\n >\n {item.label}\n </button>\n ))}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { Badge } from '../Badge/Badge';\nimport type { BadgeSize, BadgeTone, BadgeVariant } from '../Badge/types';\nimport type { EdgeCap } from '../Badge/bases/edgeProfiles';\nimport s from './Powerline.module.css';\n\n/**\n * One segment of a {@link Powerline}. Giving it `onClick` or `href` makes it\n * interactive, the same way it does on a `Badge`.\n */\nexport interface PowerlineSegment {\n text: ReactNode;\n /** Cap on this segment's right edge. Next segment's left edge adopts the same profile. */\n endCap?: EdgeCap;\n tone?: BadgeTone;\n variant?: BadgeVariant;\n size?: BadgeSize;\n onClick?: () => void;\n href?: string;\n 'aria-label'?: string;\n}\n\n/** Props for {@link Powerline}. */\nexport interface PowerlineProps {\n segments: PowerlineSegment[];\n /** Left edge of the first segment. Defaults to 'flat'. */\n startCap?: EdgeCap;\n /** Default size for every segment (per-segment `size` wins). */\n size?: BadgeSize;\n /** Default variant for every segment (per-segment `variant` wins). */\n variant?: BadgeVariant;\n /** Protrusion depth in CSS px, passed through to every segment's base. */\n depth?: number;\n /** Visible gap between adjacent segments. Number → px; string → literal CSS length.\n * Default: `0.2em` (scales with the row's font size). Pass `0` for flush. */\n gap?: number | string;\n className?: string;\n 'aria-label'?: string;\n}\n\n/**\n * A row of chevron-linked badge segments, in the style of a shell powerline\n * prompt. Each segment's `endCap` shapes both its own right edge and the next\n * segment's left edge, so the run reads as one continuous chain.\n *\n * Built for showing a path through a sequence of steps — the inspector uses\n * it to display how input routes from tool to gesture to action to target.\n */\nexport function Powerline({\n segments,\n startCap = 'flat',\n size,\n variant,\n depth,\n gap,\n className,\n ...rest\n}: PowerlineProps) {\n const cls = [s.row, className].filter(Boolean).join(' ');\n const style: CSSProperties | undefined = gap !== undefined\n ? { ['--powerline-gap' as never]: typeof gap === 'number' ? `${gap}px` : gap }\n : undefined;\n return (\n <span className={cls} style={style} aria-label={rest['aria-label']}>\n {segments.map((seg, i) => {\n const leftEdge: EdgeCap = i === 0 ? startCap : (segments[i - 1].endCap ?? 'flat');\n const rightEdge: EdgeCap = seg.endCap ?? 'flat';\n return (\n <Badge\n key={i}\n base=\"powerline\"\n baseParams={{ leftEdge, rightEdge, ...(depth !== undefined && { depth }) }}\n tone={seg.tone}\n variant={seg.variant ?? variant}\n size={seg.size ?? size}\n onClick={seg.onClick}\n href={seg.href}\n aria-label={seg['aria-label']}\n className={s.segment}\n >\n {seg.text}\n </Badge>\n );\n })}\n </span>\n );\n}\n","/**\n * Coordinate transforms (model ↔ plot) for Plot2D. Pure / deterministic —\n * no DOM, no React, no state.\n *\n * Model space: caller-defined xRange × yRange. Y axis goes UP.\n * Plot space: 0..width × 0..height in CSS pixels. Y axis goes DOWN (SVG).\n */\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n/**\n * The caller-defined extent of model space, the coordinate system a plot's\n * data lives in.\n */\nexport interface ModelRange {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}\n\n/** The plot's drawing area in CSS pixels. */\nexport interface PlotSize {\n width: number;\n height: number;\n}\n\n/**\n * Maps a model-space point into plot space, flipping the y axis so model y\n * grows upward while SVG y grows downward.\n */\nexport function modelToPlot(p: Point, m: ModelRange, plot: PlotSize): Point {\n const xFrac = (p.x - m.xMin) / (m.xMax - m.xMin);\n const yFrac = (p.y - m.yMin) / (m.yMax - m.yMin);\n return {\n x: xFrac * plot.width,\n // Invert y so model y=0 sits at plot bottom (SVG y grows downward).\n y: (1 - yFrac) * plot.height,\n };\n}\n\n/** The inverse of {@link modelToPlot}. */\nexport function plotToModel(p: Point, m: ModelRange, plot: PlotSize): Point {\n const xFrac = p.x / plot.width;\n const yFrac = 1 - p.y / plot.height;\n return {\n x: m.xMin + xFrac * (m.xMax - m.xMin),\n y: m.yMin + yFrac * (m.yMax - m.yMin),\n };\n}\n","/**\n * Tick placement for a numeric axis. Pure — no DOM, no React.\n */\n\n/** What a tick label formatter knows about the column it is part of. */\nexport interface TickFormatCtx {\n /** Places after the point that every label in the column shares. */\n decimals: number;\n /** Distance between neighboring ticks, or 0 when the ticks were given\n * explicitly and are not evenly spaced. */\n step: number;\n}\n\n/** Turns a tick value into its label. */\nexport type TickFormatter = (value: number, ctx: TickFormatCtx) => string;\n\n/** A column of ticks and the facts its labels share. */\nexport interface TickSet {\n values: number[];\n step: number;\n decimals: number;\n}\n\n/** Options for {@link niceTicks}. */\nexport interface NiceTickOptions {\n /** Smallest gap between neighboring ticks, in px. */\n minSpacing: number;\n /** Ticks closer than this to either end of the axis are dropped, in px.\n * Default 0. */\n inset?: number;\n}\n\nconst MAX_DECIMALS = 20;\n\n/** The smallest of 1, 2 or 5 times a power of ten that is at least `rough`. */\nexport function niceStep(rough: number): number {\n const mag = Math.pow(10, Math.floor(Math.log10(rough)));\n const norm = rough / mag;\n const step = norm <= 1 ? 1 : norm <= 2 ? 2 : norm <= 5 ? 5 : 10;\n return step * mag;\n}\n\n/** Places after the point a multiple of `step` needs, for a 1/2/5 step. */\nexport function stepDecimals(step: number): number {\n if (!(step > 0) || !Number.isFinite(step)) return 0;\n return Math.min(MAX_DECIMALS, Math.max(0, -Math.floor(Math.log10(step) + 1e-9)));\n}\n\n/** The most places after the point any of `values` needs. */\nexport function tickDecimals(values: readonly number[]): number {\n let most = 0;\n for (const v of values) {\n if (!Number.isFinite(v)) continue;\n let d = 0;\n while (d < MAX_DECIMALS && Math.abs(Number(v.toFixed(d)) - v) > 1e-9 * Math.max(1, Math.abs(v))) d++;\n most = Math.max(most, d);\n }\n return most;\n}\n\n/**\n * Ticks at round values across `range`, drawn `pixels` long: the finest\n * 1/2/5 step that keeps neighbors `minSpacing` px apart, so a taller plot\n * gets more of them.\n */\nexport function niceTicks(\n range: readonly [number, number],\n pixels: number,\n options: NiceTickOptions,\n): TickSet {\n const none: TickSet = { values: [], step: 0, decimals: 0 };\n const lo = Math.min(range[0], range[1]);\n const hi = Math.max(range[0], range[1]);\n const span = hi - lo;\n const { minSpacing, inset = 0 } = options;\n if (!(span > 0) || !Number.isFinite(span) || !(pixels > 0) || !(minSpacing > 0)) return none;\n\n const unitsPerPx = span / pixels;\n const step = niceStep(minSpacing * unitsPerPx);\n const decimals = stepDecimals(step);\n const from = lo + inset * unitsPerPx;\n const to = hi - inset * unitsPerPx;\n // A tolerance in step units, so a tick sitting exactly on a bound survives\n // the float error in `from / step`.\n const first = Math.ceil(from / step - 1e-9);\n const last = Math.floor(to / step + 1e-9);\n const values: number[] = [];\n for (let i = first; i <= last; i++) values.push(Number((i * step).toFixed(decimals)) + 0);\n return { values, step, decimals };\n}\n\n/** The default label: `value` fixed to the column's shared decimals, with\n * no negative zero. */\nexport function formatTick(value: number, ctx: TickFormatCtx): string {\n const text = value.toFixed(ctx.decimals);\n return /^-0(\\.0*)?$/.test(text) ? text.slice(1) : text;\n}\n","import {\n forwardRef, useCallback, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from 'react';\nimport {\n modelToPlot, plotToModel,\n type ModelRange, type Point,\n} from './geometry';\nimport {\n formatTick, niceTicks, tickDecimals,\n type TickFormatCtx, type TickFormatter,\n} from './ticks';\nimport s from './Plot2D.module.css';\nimport { dlog } from '../../dlog';\n\n/** Background grid configuration for a {@link Plot2D}. */\nexport interface GridSettings {\n /** Number of evenly-spaced internal grid lines per axis (excluding\n * the edges). Applied to both x and y. Default 3. */\n divisions?: number;\n /** Stroke color override. When omitted, uses `var(--plot-grid)`. */\n color?: string;\n}\n\n/** Axis-line configuration for a {@link Plot2D}. */\nexport interface AxesSettings {\n /** Stroke color override. When omitted, uses `var(--plot-axis)`. */\n color?: string;\n}\n\n/**\n * Ticks along one axis of a {@link Plot2D}: a line across the plot at each\n * tick value, and a label naming it. Every label in a column is formatted\n * to the same number of decimal places.\n */\nexport interface TickSettings {\n /** Tick values in model space; any outside the range are skipped.\n * Omitted = round 1/2/5 steps, as many as `minSpacing` allows at the\n * plot's current size. */\n values?: readonly number[];\n /** Smallest gap between generated ticks, in px. Default 24 on y, 64 on x. */\n minSpacing?: number;\n /** A generated tick nearer either end of the axis than this is dropped,\n * so its label stays on the plot, in px. Default 4 on y, 16 on x. */\n inset?: number;\n /** Draw a line across the plot at each tick. Default true. */\n lines?: boolean;\n /** Where labels sit: `'inside'` the plot along its left (y) or bottom (x)\n * edge, `'outside'` it past that edge in space the caller leaves free,\n * or `false` for none. Default `'inside'`. */\n labels?: 'inside' | 'outside' | false;\n /** Space between a label and the plot edge it sits against, in px.\n * Default 4. */\n gap?: number;\n /** Label text for a tick. Default {@link formatTick}. */\n format?: TickFormatter;\n}\n\n/** A pointer position given in both of the plot's coordinate systems. */\nexport interface Plot2DCoords {\n plot: Point;\n model: Point;\n}\n\n/** Props for {@link Plot2D}. */\nexport interface Plot2DProps {\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 /** Background grid. `false` / `null` / omitted = no grid. Pass `{}`\n * for default (3 divisions per axis) or populated GridSettings. */\n grid?: GridSettings | false | null;\n /** Axis lines. `false` / `null` = no axes. Omitted = default-styled\n * axes (on). Pass AxesSettings to customize. */\n axes?: AxesSettings | false | null;\n /** Ticks at x values. `false` / `null` / omitted = none; `{}` = defaults. */\n xTicks?: TickSettings | false | null;\n /** Ticks at y values. `false` / `null` / omitted = none; `{}` = defaults. */\n yTicks?: TickSettings | false | null;\n /** Forwarded to the underlying svg. Consumer opts into focus this way. */\n tabIndex?: number;\n /** Default `'img'`. A plot holding focusable marks must not be an image,\n * whose children are presentational to assistive technology. */\n role?: string;\n 'aria-label'?: string;\n className?: string;\n style?: CSSProperties;\n /** Pointer down on the SVG. Receives both plot- and model-space coords\n * pre-computed so consumers don't repeat the rect/transform dance. */\n onPointerDown?: (e: ReactPointerEvent<SVGSVGElement>, coords: Plot2DCoords) => void;\n onKeyDown?: (e: ReactKeyboardEvent<SVGSVGElement>) => void;\n children?: ReactNode;\n}\n\n/**\n * Imperative handle on a {@link Plot2D}: the SVG element, its size, and the\n * coordinate conversions, including ones that start from a raw DOM event so a\n * drag tracked on `window` can still map back into the plot.\n */\nexport interface Plot2DHandle {\n readonly svg: SVGSVGElement | null;\n plotToModel(pt: Point): Point;\n modelToPlot(pt: Point): Point;\n /** Convert a DOM event's clientX/clientY (e.g. from a window-attached\n * pointermove during drag) to plot-space. */\n clientToPlot(e: { clientX: number; clientY: number }): Point;\n /** Convenience: clientToPlot → plotToModel. */\n clientToModel(e: { clientX: number; clientY: number }): Point;\n readonly width: number;\n readonly height: number;\n}\n\ntype Axis = 'x' | 'y';\n\nconst TICK_SPACING_PX: Record<Axis, number> = { x: 64, y: 24 };\nconst TICK_INSET_PX: Record<Axis, number> = { x: 16, y: 4 };\nconst LABEL_GAP_PX = 4;\n\ninterface ResolvedTick {\n value: number;\n /** Plot-space position along the axis. */\n at: number;\n label: string;\n}\n\nfunction resolveTicks(\n settings: TickSettings,\n axis: Axis,\n range: readonly [number, number],\n pixels: number,\n toPlot: (v: number) => number,\n): ResolvedTick[] {\n let values: number[];\n let ctx: TickFormatCtx;\n if (settings.values) {\n const lo = Math.min(range[0], range[1]);\n const hi = Math.max(range[0], range[1]);\n const eps = (hi - lo) * 1e-9;\n values = settings.values.filter((v) => v >= lo - eps && v <= hi + eps);\n const gaps = values.slice(1).map((v, i) => v - values[i]);\n const even = gaps.length > 0 && gaps.every((g) => Math.abs(g - gaps[0]) <= Math.abs(gaps[0]) * 1e-9);\n ctx = { decimals: tickDecimals(values), step: even ? gaps[0] : 0 };\n } else {\n const set = niceTicks(range, pixels, {\n minSpacing: settings.minSpacing ?? TICK_SPACING_PX[axis],\n inset: settings.inset ?? TICK_INSET_PX[axis],\n });\n values = set.values;\n ctx = { decimals: set.decimals, step: set.step };\n }\n const format = settings.format ?? formatTick;\n return values.map((value) => ({ value, at: toPlot(value), label: format(value, ctx) }));\n}\n\n/**\n * An SVG plotting surface with an optional grid, axes and ticks. It draws the\n * frame and owns the model-space to plot-space mapping; the plotted content is\n * whatever children are passed, positioned in plot space.\n */\nexport const Plot2D = forwardRef<Plot2DHandle, Plot2DProps>(function Plot2D(props, ref) {\n const {\n width, height,\n xRange = [0, 1],\n yRange = [0, 1],\n grid,\n axes,\n xTicks,\n yTicks,\n tabIndex,\n role = 'img',\n className,\n style,\n onPointerDown,\n onKeyDown,\n children,\n } = props;\n\n const svgRef = useRef<SVGSVGElement | null>(null);\n\n const modelRange: ModelRange = useMemo(\n () => ({ xMin: xRange[0], xMax: xRange[1], yMin: yRange[0], yMax: yRange[1] }),\n [xRange, yRange],\n );\n\n const plotSize = useMemo(() => ({ width, height }), [width, height]);\n\n const clientToPlot = useCallback((e: { clientX: number; clientY: number }): Point => {\n const rect = svgRef.current?.getBoundingClientRect();\n const left = rect?.left ?? 0;\n const top = rect?.top ?? 0;\n return { x: e.clientX - left, y: e.clientY - top };\n }, []);\n\n useEffect(() => {\n dlog('plot2d', 'mount', { width, height });\n return () => dlog('plot2d', 'unmount');\n // Mount/unmount trace: re-running on a resize would log a spurious mount.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n useImperativeHandle(ref, () => ({\n get svg() { return svgRef.current; },\n plotToModel: (pt: Point) => plotToModel(pt, modelRange, plotSize),\n modelToPlot: (pt: Point) => modelToPlot(pt, modelRange, plotSize),\n clientToPlot,\n clientToModel: (e) => plotToModel(clientToPlot(e), modelRange, plotSize),\n get width() { return plotSize.width; },\n get height() { return plotSize.height; },\n }), [modelRange, plotSize, clientToPlot]);\n\n const handlePointerDown = useCallback((e: ReactPointerEvent<SVGSVGElement>) => {\n if (!onPointerDown) return;\n const plot = clientToPlot(e);\n const model = plotToModel(plot, modelRange, plotSize);\n onPointerDown(e, { plot, model });\n }, [onPointerDown, clientToPlot, modelRange, plotSize]);\n\n const xTickList = xTicks\n ? resolveTicks(xTicks, 'x', xRange, width, (v) => modelToPlot({ x: v, y: yRange[0] }, modelRange, plotSize).x)\n : [];\n const yTickList = yTicks\n ? resolveTicks(yTicks, 'y', yRange, height, (v) => modelToPlot({ x: xRange[0], y: v }, modelRange, plotSize).y)\n : [];\n\n // An inside y column is right-aligned against its widest label, which only\n // the rendered text can say.\n const yInside = !!yTicks && (yTicks.labels ?? 'inside') === 'inside';\n const yLabelsRef = useRef<SVGGElement | null>(null);\n const [yLabelWidth, setYLabelWidth] = useState(0);\n const yLabelKey = yInside ? yTickList.map((t) => t.label).join('\\n') : '';\n useLayoutEffect(() => {\n if (!yInside) return;\n const measure = (): void => {\n let widest = 0;\n for (const el of yLabelsRef.current?.querySelectorAll('text') ?? []) {\n if (typeof el.getComputedTextLength === 'function') widest = Math.max(widest, el.getComputedTextLength());\n }\n setYLabelWidth((prev) => (prev === widest ? prev : widest));\n };\n measure();\n let live = true;\n // A web font landing after the first measure changes every width.\n document.fonts?.ready.then(() => { if (live) measure(); });\n return () => { live = false; };\n }, [yInside, yLabelKey]);\n\n const cls = [s.root, className].filter(Boolean).join(' ');\n\n const renderTickLines = (axis: Axis, list: ResolvedTick[], settings: TickSettings | false | null | undefined) => {\n if (!settings || settings.lines === false || list.length === 0) return null;\n return (\n <g>\n {list.map((t) => (\n <line\n key={`t${axis}-${t.value}`}\n data-plot-element=\"tick\"\n data-axis={axis}\n className={s.tick}\n {...(axis === 'x'\n ? { x1: t.at, x2: t.at, y1: 0, y2: height }\n : { x1: 0, x2: width, y1: t.at, y2: t.at })}\n />\n ))}\n </g>\n );\n };\n\n const renderTickLabels = (axis: Axis, list: ResolvedTick[], settings: TickSettings | false | null | undefined) => {\n if (!settings || list.length === 0) return null;\n const placement = settings.labels ?? 'inside';\n if (placement === false) return null;\n const outside = placement === 'outside';\n const gap = settings.gap ?? LABEL_GAP_PX;\n let place: { x?: number; y?: number; textAnchor: 'start' | 'middle' | 'end'; dominantBaseline?: 'central' | 'hanging' };\n if (axis === 'y') {\n place = outside\n ? { x: -gap, textAnchor: 'end', dominantBaseline: 'central' }\n : yLabelWidth > 0\n ? { x: gap + yLabelWidth, textAnchor: 'end', dominantBaseline: 'central' }\n : { x: gap, textAnchor: 'start', dominantBaseline: 'central' };\n } else {\n place = outside\n ? { y: height + gap, textAnchor: 'middle', dominantBaseline: 'hanging' }\n : { y: height - gap, textAnchor: 'middle' };\n }\n return (\n <g ref={axis === 'y' ? yLabelsRef : undefined} className={s.tickLabels} aria-hidden=\"true\">\n {list.map((t) => (\n <text\n key={`l${axis}-${t.value}`}\n data-plot-element=\"tick-label\"\n data-axis={axis}\n data-placement={placement}\n className={s.tickLabel}\n x={axis === 'x' ? t.at : place.x}\n y={axis === 'y' ? t.at : place.y}\n textAnchor={place.textAnchor}\n dominantBaseline={place.dominantBaseline}\n >\n {t.label}\n </text>\n ))}\n </g>\n );\n };\n\n return (\n <svg\n ref={svgRef}\n className={cls}\n style={style}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role={role}\n aria-label={props['aria-label']}\n tabIndex={tabIndex}\n onPointerDown={onPointerDown ? handlePointerDown : undefined}\n onKeyDown={onKeyDown}\n >\n {grid && (() => {\n const divisions = grid.divisions ?? 3;\n const stroke = grid.color;\n // Evenly-spaced internal divisions, excluding the edges (which\n // belong to the axes). For divisions=3, fractions are 1/4, 2/4, 3/4.\n const fractions: number[] = [];\n for (let i = 1; i <= divisions; i++) fractions.push(i / (divisions + 1));\n return (\n <g>\n {fractions.map((f) => (\n <line\n key={`gx-${f}`}\n data-plot-element=\"grid\"\n className={s.grid}\n stroke={stroke}\n x1={f * width} x2={f * width}\n y1={0} y2={height}\n />\n ))}\n {fractions.map((f) => (\n <line\n key={`gy-${f}`}\n data-plot-element=\"grid\"\n className={s.grid}\n stroke={stroke}\n x1={0} x2={width}\n y1={f * height} y2={f * height}\n />\n ))}\n </g>\n );\n })()}\n {renderTickLines('x', xTickList, xTicks)}\n {renderTickLines('y', yTickList, yTicks)}\n {axes !== false && axes !== null && (() => {\n const stroke = axes?.color;\n return (\n <g>\n <line\n data-plot-element=\"axis\"\n className={s.axis}\n stroke={stroke}\n x1={0} x2={width}\n y1={height} y2={height}\n />\n <line\n data-plot-element=\"axis\"\n className={s.axis}\n stroke={stroke}\n x1={0} x2={0}\n y1={0} y2={height}\n />\n </g>\n );\n })()}\n {renderTickLabels('x', xTickList, xTicks)}\n {renderTickLabels('y', yTickList, yTicks)}\n {children}\n </svg>\n );\n});\n","/** How close, in screen pixels, a drag has to come to a candidate to snap to it. */\nexport const SNAP_RADIUS_PX = 6;\n\n/** Snap `value` to the nearest candidate within `tolerance`, else return it. */\nexport function snapToNearest(value: number, candidates: readonly number[], tolerance: number): number {\n let best = value;\n let bestDist = tolerance;\n for (const c of candidates) {\n const d = Math.abs(c - value);\n if (d <= bestDist) {\n best = c;\n bestDist = d;\n }\n }\n return best;\n}\n","/**\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","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","/**\n * Catmull-Rom spline sampling, parameterized by α.\n *\n * α = 0 → uniform parameterization (original Catmull-Rom). Fast, can\n * produce cusps and self-intersections at sharp 2D angles.\n * α = 0.5 → centripetal (Yuksel/Schneider 2011). No cusps, no\n * self-intersection. The \"safe default\" for 2D.\n * α = 1 → chordal. Smoother than uniform, different artifacts.\n *\n * `sampleCurve(...)` is the convenience alias for centripetal (α=0.5).\n */\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nfunction knot(a: Point, b: Point, alpha: number): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return Math.pow(Math.sqrt(dx * dx + dy * dy), alpha);\n}\n\n/**\n * Sample the Catmull-Rom segment between p1 and p2 at parameter\n * t ∈ [0, 1]. p0 and p3 are the surrounding control points (use phantom\n * reflection at endpoints — see sampleCatmullRom below).\n *\n * Returns p1 at t=0 and p2 at t=1. `alpha` controls parameterization.\n */\nexport function segmentSampleAt(\n p0: Point, p1: Point, p2: Point, p3: Point, t: number,\n alpha: number = 0.5,\n): Point {\n const t0 = 0;\n const t1 = t0 + knot(p0, p1, alpha);\n const t2 = t1 + knot(p1, p2, alpha);\n const t3 = t2 + knot(p2, p3, alpha);\n\n // Degenerate: coincident p1/p2 → linear interpolation fallback.\n if (t2 - t1 === 0) {\n return { x: p1.x + (p2.x - p1.x) * t, y: p1.y + (p2.y - p1.y) * t };\n }\n\n const u = t1 + t * (t2 - t1);\n\n const a1x = ((t1 - u) * p0.x + (u - t0) * p1.x) / (t1 - t0);\n const a1y = ((t1 - u) * p0.y + (u - t0) * p1.y) / (t1 - t0);\n const a2x = ((t2 - u) * p1.x + (u - t1) * p2.x) / (t2 - t1);\n const a2y = ((t2 - u) * p1.y + (u - t1) * p2.y) / (t2 - t1);\n const a3x = ((t3 - u) * p2.x + (u - t2) * p3.x) / (t3 - t2);\n const a3y = ((t3 - u) * p2.y + (u - t2) * p3.y) / (t3 - t2);\n\n const b1x = ((t2 - u) * a1x + (u - t0) * a2x) / (t2 - t0);\n const b1y = ((t2 - u) * a1y + (u - t0) * a2y) / (t2 - t0);\n const b2x = ((t3 - u) * a2x + (u - t1) * a3x) / (t3 - t1);\n const b2y = ((t3 - u) * a2y + (u - t1) * a3y) / (t3 - t1);\n\n const cx = ((t2 - u) * b1x + (u - t1) * b2x) / (t2 - t1);\n const cy = ((t2 - u) * b1y + (u - t1) * b2y) / (t2 - t1);\n return { x: cx, y: cy };\n}\n\n/**\n * Sample the whole curve through `anchors` using Catmull-Rom with the\n * given α. Returns `(n-1) * samplesPerSegment + 1` points. Phantom\n * endpoints by reflection so the first/last segments are tangent to\n * the chord into/out of the endpoints. Returns `[]` for fewer than 2\n * anchors.\n */\nexport function sampleCatmullRom(\n anchors: readonly Point[],\n samplesPerSegment: number,\n alpha: number = 0.5,\n): Point[] {\n if (anchors.length < 2) return [];\n if (samplesPerSegment < 1) samplesPerSegment = 1;\n\n const n = anchors.length;\n const out: Point[] = [];\n\n const reflectStart: Point = {\n x: 2 * anchors[0].x - anchors[1].x,\n y: 2 * anchors[0].y - anchors[1].y,\n };\n const reflectEnd: Point = {\n x: 2 * anchors[n - 1].x - anchors[n - 2].x,\n y: 2 * anchors[n - 1].y - anchors[n - 2].y,\n };\n\n for (let i = 0; i < n - 1; i++) {\n const p0 = i === 0 ? reflectStart : anchors[i - 1];\n const p1 = anchors[i];\n const p2 = anchors[i + 1];\n const p3 = i + 2 < n ? anchors[i + 2] : reflectEnd;\n const tStart = i === 0 ? 0 : 1;\n for (let s = tStart; s <= samplesPerSegment; s++) {\n if (s === 0) {\n out.push(p1);\n continue;\n }\n if (s === samplesPerSegment) {\n out.push(p2);\n continue;\n }\n const t = s / samplesPerSegment;\n out.push(segmentSampleAt(p0, p1, p2, p3, t, alpha));\n }\n }\n return out;\n}\n\n/** Convenience alias for centripetal Catmull-Rom (α=0.5). The most\n * common choice; safe default for 2D paths. */\nexport function sampleCurve(\n anchors: readonly Point[],\n samplesPerSegment: number,\n): Point[] {\n return sampleCatmullRom(anchors, samplesPerSegment, 0.5);\n}\n","/**\n * Monotone cubic interpolation (Fritsch-Carlson / Steffen variant).\n *\n * Passes through every anchor and guarantees the curve never\n * overshoots `min(neighbors)` / `max(neighbors)` along either axis.\n * The right choice for animation timing curves (no anticipation) or\n * audio envelopes (no out-of-range values).\n *\n * Parameterized by index — works for both 1D (function-shaped) and\n * 2D (parametric) anchor sequences. The x and y coordinates are\n * interpolated independently as functions of the anchor index.\n *\n * Reference: Fritsch & Carlson 1980, \"Monotone piecewise cubic\n * interpolation.\" Steffen's 1990 refinement is conceptually the same;\n * we use a min-clamp variant that's monotonicity-preserving by\n * construction.\n */\n\nimport type { Point } from './catmullRom';\n\n/** Per-axis tangent computation for a 1D series of y-values sampled at\n * unit intervals (index-parameterized). Returns one tangent per\n * anchor. */\nfunction tangents(ys: readonly number[]): number[] {\n const n = ys.length;\n if (n === 0) return [];\n if (n === 1) return [0];\n\n // Secant slopes (dx = 1 in index parameterization).\n const m: number[] = new Array(n - 1);\n for (let i = 0; i < n - 1; i++) m[i] = ys[i + 1] - ys[i];\n\n const t: number[] = new Array(n);\n t[0] = m[0];\n t[n - 1] = m[n - 2];\n\n for (let i = 1; i < n - 1; i++) {\n if (m[i - 1] * m[i] <= 0) {\n // Sign change or flat → local extremum; tangent is zero (forces\n // the curve to settle without overshoot).\n t[i] = 0;\n } else {\n // Weighted average of adjacent secants (with dx_i = dx_{i-1} = 1,\n // this is just the arithmetic mean). Clamped by Steffen's rule\n // so the cubic stays monotone within each segment.\n const avg = (m[i - 1] + m[i]) / 2;\n const mag = Math.min(Math.abs(m[i - 1]), Math.abs(m[i]), Math.abs(avg));\n t[i] = Math.sign(avg) * mag;\n }\n }\n return t;\n}\n\n/** Cubic Hermite basis at parameter t ∈ [0, 1] given endpoint values\n * p0, p1 and endpoint tangents m0, m1. */\nfunction hermite(\n p0: number, p1: number, m0: number, m1: number, t: number,\n): number {\n const t2 = t * t;\n const t3 = t2 * t;\n return (\n (2 * t3 - 3 * t2 + 1) * p0 +\n (t3 - 2 * t2 + t) * m0 +\n (-2 * t3 + 3 * t2) * p1 +\n (t3 - t2) * m1\n );\n}\n\n/**\n * Sample the monotone-cubic curve through `anchors`. Returns\n * `(n-1) * samplesPerSegment + 1` points (same shape as\n * `sampleCatmullRom`). `[]` for fewer than 2 anchors.\n */\nexport function sampleMonotone(\n anchors: readonly Point[],\n samplesPerSegment: number,\n): Point[] {\n if (anchors.length < 2) return [];\n if (samplesPerSegment < 1) samplesPerSegment = 1;\n\n const n = anchors.length;\n const xs = anchors.map((a) => a.x);\n const ys = anchors.map((a) => a.y);\n const tx = tangents(xs);\n const ty = tangents(ys);\n\n const out: Point[] = [];\n for (let i = 0; i < n - 1; i++) {\n const startStep = i === 0 ? 0 : 1; // skip duplicate boundary\n for (let s = startStep; s <= samplesPerSegment; s++) {\n if (s === 0) { out.push(anchors[i]); continue; }\n if (s === samplesPerSegment) { out.push(anchors[i + 1]); continue; }\n const t = s / samplesPerSegment;\n out.push({\n x: hermite(xs[i], xs[i + 1], tx[i], tx[i + 1], t),\n y: hermite(ys[i], ys[i + 1], ty[i], ty[i + 1], t),\n });\n }\n }\n return out;\n}\n","/**\n * Interpolation mode dispatcher for CurveEditor. The vocabulary of\n * supported algorithms and the unified `sample(...)` entry point that\n * picks the right one. All algorithms produce\n * `(n-1) * samplesPerSegment + 1` points and pass through every\n * anchor — CurveEditor is strictly interpolating, never approximating.\n */\n\nimport { sampleCatmullRom, type Point } from './catmullRom';\nimport { sampleMonotone } from './monotone';\n\n/** Supported interpolation modes. All are interpolating (pass through\n * every anchor); the differences are in tangent computation and\n * parameterization. */\nexport type InterpolationMode =\n | 'linear'\n | 'catmull-rom' // centripetal (α=0.5) — safe default\n | 'catmull-rom-uniform' // α=0; can cusp on sharp 2D angles\n | 'catmull-rom-chordal' // α=1; smoother than uniform\n | 'monotone'; // Fritsch-Carlson / Steffen; no overshoot\n\n/** Sample anchors as a polyline. Produces the same sample count shape\n * as the Catmull-Rom variants so downstream segment-slicing logic\n * (hit testing, fill path construction) works uniformly. */\nfunction sampleLinear(\n anchors: readonly Point[],\n samplesPerSegment: number,\n): Point[] {\n if (anchors.length < 2) return [];\n if (samplesPerSegment < 1) samplesPerSegment = 1;\n\n const out: Point[] = [];\n for (let i = 0; i < anchors.length - 1; i++) {\n const a = anchors[i];\n const b = anchors[i + 1];\n const startStep = i === 0 ? 0 : 1;\n for (let s = startStep; s <= samplesPerSegment; s++) {\n if (s === 0) { out.push(a); continue; }\n if (s === samplesPerSegment) { out.push(b); continue; }\n const t = s / samplesPerSegment;\n out.push({ x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t });\n }\n }\n return out;\n}\n\n/** Sample `anchors` using the chosen interpolation mode. */\nexport function sampleByInterpolation(\n anchors: readonly Point[],\n samplesPerSegment: number,\n mode: InterpolationMode,\n): Point[] {\n switch (mode) {\n case 'linear':\n return sampleLinear(anchors, samplesPerSegment);\n case 'catmull-rom-uniform':\n return sampleCatmullRom(anchors, samplesPerSegment, 0);\n case 'catmull-rom-chordal':\n return sampleCatmullRom(anchors, samplesPerSegment, 1);\n case 'monotone':\n return sampleMonotone(anchors, samplesPerSegment);\n case 'catmull-rom':\n default:\n return sampleCatmullRom(anchors, samplesPerSegment, 0.5);\n }\n}\n","/**\n * Built-in function/curve layer for LayeredCurveEditor. Bundles the\n * curve-render + anchor-render + drag/insert/delete gestures that were\n * the entirety of the original `CurveEditor`. Multiple instances coexist\n * by id; consumers can compose several to plot e.g. a primary function\n * and a derived (read-only) curve on the same chart.\n */\nimport type { ReactNode } from 'react';\nimport { sampleByInterpolation, type InterpolationMode } from './interpolation';\nimport { hitTestAnchor, hitTestCurve } from './hitTest';\nimport { handleHalf } from '../../handles';\nimport { dlog } from '../../dlog';\nimport s from './CurveEditor.module.css';\nimport type {\n CurveLayer, LayerCtx, LayerGesture, LayerRenderCtx, ModelPoint, PlotPoint,\n EmptyDownArgs, KeyDownArgs,\n} from './layerTypes';\n\n// ── Public types ─────────────────────────────────────────────────────\n\n/** One anchor of a curve, in model space. */\nexport interface ControlPoint {\n x: number;\n y: number;\n /** When true, this control point can't be moved or deleted by the\n * user. Render as a smaller diamond with locked styling. */\n locked?: boolean;\n}\n\n/**\n * Whether a curve's points keep their x order. In `'1d'` an anchor cannot be\n * dragged past its neighbors and a new point is inserted at its x position;\n * in `'2d'` points are free to move anywhere and keep their list order.\n */\nexport type CurveDomain = '1d' | '2d';\n/**\n * How much of a curve's first and last anchor the user may move: everything,\n * only their y, or nothing.\n */\nexport type EndpointMode = 'free' | 'pinned-x' | 'pinned-both';\n/**\n * Where a click adds a new anchor — on the curve itself, anywhere in the\n * plot, or nowhere.\n */\nexport type AddPointMode = 'click-curve' | 'click-empty' | 'never';\n\n/**\n * What a `renderAnchor` function is given for one anchor: the point, its\n * index, its position in plot space (`cx`/`cy`), and the states that change\n * how it should look.\n */\nexport interface AnchorRenderProps {\n point: ControlPoint;\n index: number;\n cx: number;\n cy: number;\n isActive: boolean;\n isLocked: boolean;\n isPinnedEndpoint: boolean;\n isEndpoint: boolean;\n}\n\n/**\n * Per-instance curve-rendering overrides. Currently empty — passing `{}`\n * means \"draw the curve\", and `false`/`null` means don't.\n */\nexport type CurveSettings = object;\n\n/** Shades the region between the curve and one edge of the plot. */\nexport interface FillSettings {\n side: 'below' | 'above';\n color?: string;\n}\n\n/** Configuration for {@link createFunctionLayer}. */\nexport interface FunctionLayerConfig {\n /** Layer id; default `'function'`. Two instances on the same editor\n * must have distinct ids. */\n id?: string;\n domain?: CurveDomain;\n endpoints?: EndpointMode;\n interpolation?: InterpolationMode;\n constrain?: 'none' | 'function';\n addPointMode?: AddPointMode;\n minPoints?: number;\n maxPoints?: number;\n curve?: CurveSettings | false | null;\n fill?: FillSettings | false | null;\n hideNonInteractive?: boolean;\n renderAnchor?: (info: AnchorRenderProps) => ReactNode;\n /** When false, the layer renders the curve+fill but doesn't render\n * anchors and doesn't accept pointer input. For derived read-only\n * curves (e.g. plotting f'(x) alongside f(x)). Default true. */\n interactive?: boolean;\n /** Override x clamp range for drags and pinned endpoints. Defaults\n * to the editor's modelRange x. Use this to constrain a layer to a\n * sub-range of the plot (e.g. a bevel curve occupying x ∈ [0, b]\n * while the editor's xRange is [0, halfWidth]). */\n xClamp?: readonly [number, number];\n /** Names the curve in each anchor's accessible name. Default `'Point'`. */\n label?: string;\n}\n\n/**\n * The state a function layer owns. Treat it as opaque and round-trip it\n * through `LayeredCurveEditor`'s `onLayerChange`; `points` is the part worth\n * reading.\n */\nexport interface FunctionLayerState {\n points: readonly ControlPoint[];\n /** Layer-internal: the index of the anchor currently being dragged.\n * Cleared between gestures. Consumers treat the whole state as\n * opaque and round-trip it via onLayerChange. */\n activeIndex: number | null;\n}\n\nconst SAMPLES_PER_SEGMENT = 16;\nconst ENDPOINT_HALF = handleHalf('--wzl-handle-size-lg');\nconst LOCKED_HALF = handleHalf('--wzl-handle-size-sm');\nconst ANCHOR_SNAP_PX = 12;\nconst CURVE_HIT_PX = 8;\n/** An arrow-key nudge, as a fraction of the range; shift takes ten. */\nconst KEY_STEP_FRACTION = 0.01;\nconst SHIFT_MULTIPLIER = 10;\n\nconst formatCoord = (n: number): string => String(Number(n.toFixed(3)));\n\n// ── Helpers ───────────────────────────────────────────────────────────\n\nfunction clampToModelRange(p: ModelPoint, ctx: LayerCtx): ModelPoint {\n const m = ctx.modelRange;\n const xLo = Math.min(m.xMin, m.xMax);\n const xHi = Math.max(m.xMin, m.xMax);\n const yLo = Math.min(m.yMin, m.yMax);\n const yHi = Math.max(m.yMin, m.yMax);\n return {\n x: Math.max(xLo, Math.min(xHi, p.x)),\n y: Math.max(yLo, Math.min(yHi, p.y)),\n };\n}\n\nfunction isPinnedEndpointAt(index: number, count: number, endpoints: EndpointMode): boolean {\n if (endpoints === 'free') return false;\n return index === 0 || index === count - 1;\n}\n\nfunction projectAnchors(points: readonly ControlPoint[], ctx: LayerCtx): PlotPoint[] {\n return points.map((p) => ctx.toPlot(p));\n}\n\nfunction segmentSamples(\n points: readonly ControlPoint[],\n interpolation: InterpolationMode,\n ctx: LayerCtx,\n): PlotPoint[][] {\n if (points.length < 2) return [];\n const all = sampleByInterpolation(points, SAMPLES_PER_SEGMENT, interpolation);\n const out: PlotPoint[][] = [];\n for (let i = 0; i < points.length - 1; i++) {\n const start = i * SAMPLES_PER_SEGMENT;\n const end = start + SAMPLES_PER_SEGMENT;\n const slice = all.slice(start, end + 1);\n out.push(slice.map((p) => ctx.toPlot(p)));\n }\n return out;\n}\n\nfunction resolveInterpolation(cfg: FunctionLayerConfig): InterpolationMode {\n return (cfg.constrain ?? 'none') === 'function'\n ? 'monotone'\n : (cfg.interpolation ?? 'catmull-rom');\n}\n\n// ── Factory ───────────────────────────────────────────────────────────\n\n/**\n * Builds the built-in curve layer for `LayeredCurveEditor`: it draws the\n * interpolated curve and its anchors, and handles dragging, inserting and\n * deleting them.\n *\n * Several can coexist on one editor as long as their ids differ — plotting a\n * derived read-only curve beside an editable one is the case it is shaped\n * for, via `interactive: false`.\n */\nexport function createFunctionLayer(cfg: FunctionLayerConfig = {}): CurveLayer<FunctionLayerState> {\n const id = cfg.id ?? 'function';\n const domain = cfg.domain ?? '2d';\n const endpoints = cfg.endpoints ?? 'free';\n const constrain = cfg.constrain ?? 'none';\n const addPointMode = cfg.addPointMode ?? 'click-curve';\n const interpolation = resolveInterpolation(cfg);\n const interactive = cfg.interactive !== false;\n const curveVisible = cfg.curve !== false && cfg.curve !== null;\n\n // ── render ──────────────────────────────────────────────────────────\n function render(state: FunctionLayerState, ctx: LayerRenderCtx): ReactNode {\n const { points, activeIndex } = state;\n const plotAnchors = projectAnchors(points, ctx);\n\n let pathD = '';\n let fillD: string | null = null;\n if (points.length >= 2) {\n const samples = sampleByInterpolation(points, SAMPLES_PER_SEGMENT, interpolation)\n .map((p) => ctx.toPlot(p));\n const parts: string[] = [`M${samples[0].x.toFixed(2)},${samples[0].y.toFixed(2)}`];\n for (let i = 1; i < samples.length; i++) {\n parts.push(`L${samples[i].x.toFixed(2)},${samples[i].y.toFixed(2)}`);\n }\n pathD = parts.join('');\n\n if (cfg.fill) {\n const closingY = cfg.fill.side === 'below' ? ctx.plotSize.height : 0;\n const first = samples[0];\n const last = samples[samples.length - 1];\n const fillParts = [...parts];\n fillParts.push(`L${last.x.toFixed(2)},${closingY.toFixed(2)}`);\n fillParts.push(`L${first.x.toFixed(2)},${closingY.toFixed(2)}`);\n fillParts.push('Z');\n fillD = fillParts.join('');\n }\n }\n\n return (\n <>\n {fillD && (\n <path\n data-curve-element=\"fill\"\n className={s.fill}\n d={fillD}\n fill={cfg.fill ? cfg.fill.color : undefined}\n />\n )}\n {pathD && curveVisible && (\n <path\n className={s.curve}\n d={pathD}\n fill=\"none\"\n />\n )}\n {interactive && plotAnchors.map((a, i) => {\n const pinned = isPinnedEndpointAt(i, points.length, endpoints);\n const locked = points[i]?.locked === true;\n if ((locked || pinned) && cfg.hideNonInteractive) return null;\n const active = activeIndex === i;\n const isEndpoint = curveVisible && (i === 0 || i === points.length - 1);\n const focus = !locked && !(endpoints === 'pinned-both' && pinned)\n ? { tabIndex: 0 }\n : {};\n const a11y = {\n ...focus,\n role: 'button',\n 'aria-label': `${cfg.label ?? 'Point'} ${i + 1} at ${formatCoord(points[i].x)}, ${formatCoord(points[i].y)}`,\n };\n if (cfg.renderAnchor) {\n const node = cfg.renderAnchor({\n point: points[i], index: i,\n cx: a.x, cy: a.y,\n isActive: active, isLocked: locked,\n isPinnedEndpoint: pinned, isEndpoint,\n });\n if (node !== null && node !== undefined) {\n return <g key={i} data-anchor-index={i} {...a11y}>{node}</g>;\n }\n }\n const anchorCls = [\n s.anchor,\n isEndpoint && s.endpoint,\n (pinned || locked) && s.pinned,\n locked && s.locked,\n active && s.active,\n ].filter(Boolean).join(' ');\n const renderAsDiamond = isEndpoint || locked;\n if (renderAsDiamond) {\n const half = locked ? LOCKED_HALF : ENDPOINT_HALF;\n return (\n <rect\n key={i}\n className={anchorCls}\n x={a.x - half}\n y={a.y - half}\n width={half * 2}\n height={half * 2}\n transform={`rotate(45 ${a.x} ${a.y})`}\n data-anchor-index={i}\n {...a11y}\n />\n );\n }\n return (\n <circle\n key={i}\n className={anchorCls}\n cx={a.x}\n cy={a.y}\n r={4}\n data-anchor-index={i}\n {...a11y}\n />\n );\n })}\n </>\n );\n }\n\n // ── hit test ────────────────────────────────────────────────────────\n function hitTest(state: FunctionLayerState, plot: PlotPoint, ctx: LayerCtx) {\n if (!interactive) return null;\n const plotAnchors = projectAnchors(state.points, ctx);\n const a = hitTestAnchor(plotAnchors, plot, ANCHOR_SNAP_PX);\n if (a) return { kind: 'anchor' as const, payload: { index: a.index } };\n if (addPointMode === 'click-curve' && curveVisible) {\n const segs = segmentSamples(state.points, interpolation, ctx);\n const c = hitTestCurve(segs, plot, CURVE_HIT_PX);\n if (c) return { kind: 'curve' as const, payload: { segIdx: c.segIdx, t: c.t } };\n }\n return null;\n }\n\n // ── move constraint, shared by drag and keyboard ────────────────────\n function moveAnchor(state: FunctionLayerState, index: number, model: ModelPoint, ctx: LayerCtx): FunctionLayerState {\n const points = state.points;\n if (index < 0 || index >= points.length) return state;\n const mr = ctx.modelRange;\n const xMin = cfg.xClamp ? cfg.xClamp[0] : mr.xMin;\n const xMax = cfg.xClamp ? cfg.xClamp[1] : mr.xMax;\n let nx = model.x;\n let ny = model.y;\n const isEndpoint = index === 0 || index === points.length - 1;\n\n if (endpoints === 'pinned-both' && isEndpoint) {\n nx = points[index].x;\n ny = points[index].y;\n } else if (endpoints === 'pinned-x' && isEndpoint) {\n nx = index === 0 ? xMin : xMax;\n } else if (constrain === 'function' || domain === '1d') {\n const epsilon = constrain === 'function'\n ? (xMax - xMin) / 1000\n : 0;\n const left = index > 0 ? points[index - 1].x + epsilon : xMin;\n const right = index < points.length - 1 ? points[index + 1].x - epsilon : xMax;\n nx = Math.max(left, Math.min(right, nx));\n }\n\n // Always clamp x to the layer's own range (so free-mode\n // interior anchors of a sub-range layer can't escape it).\n // Normalize bounds for inverted ranges.\n {\n const lo = Math.min(xMin, xMax);\n const hi = Math.max(xMin, xMax);\n nx = Math.max(lo, Math.min(hi, nx));\n }\n const clamped = clampToModelRange({ x: nx, y: ny }, ctx);\n const next = points.slice();\n next[index] = { ...points[index], x: clamped.x, y: clamped.y };\n return { ...state, points: next, activeIndex: index };\n }\n\n // ── drag gesture ────────────────────────────────────────────────────\n function makeDragGesture(index: number): LayerGesture<FunctionLayerState> {\n return {\n onMove(state, model, _e, ctx) { return moveAnchor(state, index, model, ctx); },\n onCommit(state) { return { ...state, activeIndex: null }; },\n onCancel(state) { return { ...state, activeIndex: null }; },\n };\n }\n\n // ── pointerdown on a positive hit ───────────────────────────────────\n function onPointerDown(\n state: FunctionLayerState,\n hit: { kind: string; payload?: unknown },\n e: PointerEvent,\n ctx: LayerCtx,\n extra: EmptyDownArgs<FunctionLayerState>,\n ): LayerGesture<FunctionLayerState> | void {\n if (hit.kind === 'anchor') {\n const { index } = hit.payload as { index: number };\n dlog('function-layer', 'anchor-down', { id, index, shift: ctx.modifiers.shift, button: e.button });\n if (state.points[index]?.locked) return;\n if (ctx.modifiers.shift) {\n if (isPinnedEndpointAt(index, state.points.length, endpoints)) return;\n if (cfg.minPoints !== undefined && state.points.length <= cfg.minPoints) return;\n extra.commit({\n ...state,\n points: state.points.filter((_, i) => i !== index),\n activeIndex: null,\n });\n return;\n }\n if (e.button === 2) return;\n extra.commit({ ...state, activeIndex: index });\n return makeDragGesture(index);\n }\n if (hit.kind === 'curve') {\n const { segIdx } = hit.payload as { segIdx: number; t: number };\n if (cfg.maxPoints !== undefined && state.points.length >= cfg.maxPoints) return;\n const insertIndex = segIdx + 1;\n const modelPt = clampToModelRange(extra.model, ctx);\n\n // function/1d: refuse insert that would be immediately clamped\n // against a neighbor (mouse jitter would otherwise drop a phantom\n // point directly above an existing anchor). Snap to dragging the\n // neighbor instead.\n if (constrain === 'function' || domain === '1d') {\n const epsilon = constrain === 'function'\n ? (ctx.modelRange.xMax - ctx.modelRange.xMin) / 1000\n : 0;\n const left = insertIndex > 0 ? state.points[insertIndex - 1] : null;\n const right = insertIndex < state.points.length ? state.points[insertIndex] : null;\n if (left && Math.abs(modelPt.x - left.x) < epsilon * 2) {\n extra.commit({ ...state, activeIndex: insertIndex - 1 });\n return makeDragGesture(insertIndex - 1);\n }\n if (right && Math.abs(modelPt.x - right.x) < epsilon * 2) {\n extra.commit({ ...state, activeIndex: insertIndex });\n return makeDragGesture(insertIndex);\n }\n }\n\n const nextPoints = [...state.points.slice(0, insertIndex), modelPt, ...state.points.slice(insertIndex)];\n extra.commit({ ...state, points: nextPoints, activeIndex: insertIndex });\n return makeDragGesture(insertIndex);\n }\n }\n\n // ── empty-space click ───────────────────────────────────────────────\n function onEmptyPointerDown(\n state: FunctionLayerState,\n model: ModelPoint,\n _e: PointerEvent,\n ctx: LayerCtx,\n extra: EmptyDownArgs<FunctionLayerState>,\n ): LayerGesture<FunctionLayerState> | void {\n if (!interactive) return;\n if (addPointMode !== 'click-empty') return;\n if (cfg.maxPoints !== undefined && state.points.length >= cfg.maxPoints) return;\n\n const clamped = clampToModelRange(model, ctx);\n let insertIndex = state.points.length;\n if (domain === '1d') {\n for (let i = 0; i < state.points.length; i++) {\n if (state.points[i].x > clamped.x) { insertIndex = i; break; }\n }\n }\n const nextPoints = [...state.points.slice(0, insertIndex), clamped, ...state.points.slice(insertIndex)];\n extra.commit({ ...state, points: nextPoints, activeIndex: null });\n return;\n }\n\n // ── keyboard ────────────────────────────────────────────────────────\n function onKeyDown(\n state: FunctionLayerState,\n e: KeyboardEvent,\n ctx: LayerCtx,\n extra: KeyDownArgs<FunctionLayerState>,\n ): void {\n if (!interactive) return;\n const target = e.target as Element | null;\n if (target?.closest?.('[data-layer-id]')?.getAttribute('data-layer-id') !== id) return;\n const el = target.closest('[data-anchor-index]');\n if (!el) return;\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 if (dx === 0 && dy === 0) return;\n e.preventDefault();\n const index = Number(el.getAttribute('data-anchor-index'));\n const p = state.points[index];\n if (!p || p.locked) return;\n const m = ctx.modelRange;\n const mult = e.shiftKey ? SHIFT_MULTIPLIER : 1;\n const xSpan = cfg.xClamp ? cfg.xClamp[1] - cfg.xClamp[0] : m.xMax - m.xMin;\n const next = moveAnchor(state, index, {\n x: p.x + dx * Math.abs(xSpan) * KEY_STEP_FRACTION * mult,\n y: p.y + dy * Math.abs(m.yMax - m.yMin) * KEY_STEP_FRACTION * mult,\n }, ctx);\n const moved = next.points[index];\n if (moved.x === p.x && moved.y === p.y) return;\n extra.commit({ ...next, activeIndex: null });\n }\n\n return {\n id,\n render,\n hitTest,\n onPointerDown,\n onEmptyPointerDown,\n onKeyDown,\n };\n}\n\n/** Convenience: build a function-layer state from a points array. */\nexport function functionLayerState(points: readonly ControlPoint[]): FunctionLayerState {\n return { points, activeIndex: null };\n}\n","/**\n * Back-compat wrapper around `LayeredCurveEditor` that preserves the\n * original single-curve API. New consumers wanting multi-layer\n * composition should reach for `LayeredCurveEditor` + `createFunctionLayer`\n * directly.\n */\nimport {\n useCallback, useEffect, useMemo, useRef, useState,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from 'react';\nimport {\n type GridSettings,\n type AxesSettings,\n type TickSettings,\n} from '../Plot2D';\nimport type { InterpolationMode } from './interpolation';\nimport {\n createFunctionLayer,\n type ControlPoint,\n type CurveDomain,\n type EndpointMode,\n type AddPointMode,\n type CurveSettings,\n type FillSettings,\n type AnchorRenderProps,\n type FunctionLayerState,\n} from './createFunctionLayer';\nimport { LayeredCurveEditor } from './LayeredCurveEditor';\n\nexport type { GridSettings, AxesSettings, TickSettings };\nexport type {\n ControlPoint, CurveDomain, EndpointMode, AddPointMode,\n CurveSettings, FillSettings, AnchorRenderProps,\n};\n\n/**\n * Props for {@link CurveEditor}. `onInput` fires throughout a gesture and\n * `onChange` once at its end, with the pre-gesture points as `prev`.\n */\nexport interface CurveEditorProps {\n value: readonly ControlPoint[];\n onInput: (next: ControlPoint[]) => void;\n onChange?: (next: ControlPoint[], prev: readonly ControlPoint[]) => void;\n domain?: CurveDomain;\n interpolation?: InterpolationMode;\n endpoints?: EndpointMode;\n xRange?: readonly [number, number];\n yRange?: readonly [number, number];\n width: number;\n height: number;\n grid?: GridSettings | false | null;\n axes?: AxesSettings | false | null;\n xTicks?: TickSettings | false | null;\n yTicks?: TickSettings | false | null;\n curve?: CurveSettings | false | null;\n fill?: FillSettings | false | null;\n hideNonInteractive?: boolean;\n constrain?: 'none' | 'function';\n history?: boolean;\n minPoints?: number;\n maxPoints?: number;\n addPointMode?: AddPointMode;\n renderAnchor?: (info: AnchorRenderProps) => ReactNode;\n /** Extra SVG content rendered behind the curve and anchors. */\n decorations?: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Editable curve through a list of control points: drag anchors, click to\n * insert, right-click to delete, with optional built-in undo.\n *\n * This is the single-curve API, implemented as one `createFunctionLayer` on\n * a `LayeredCurveEditor`. Reach for those directly to stack several curves\n * on one plot.\n */\nexport function CurveEditor(props: CurveEditorProps) {\n const {\n value, onInput, onChange,\n domain, endpoints, interpolation, constrain, addPointMode,\n minPoints, maxPoints, curve, fill, hideNonInteractive, renderAnchor,\n width, height, xRange, yRange, grid, axes, xTicks, yTicks, history,\n className, style, decorations,\n } = props;\n\n // Layer is config-only; rebuild only when *config* changes.\n const layer = useMemo(() => createFunctionLayer({\n id: 'function',\n domain, endpoints, interpolation, constrain, addPointMode,\n minPoints, maxPoints, curve, fill, hideNonInteractive, renderAnchor,\n }), [\n domain, endpoints, interpolation, constrain, addPointMode,\n minPoints, maxPoints, curve, fill, hideNonInteractive, renderAnchor,\n ]);\n\n // Hybrid controlled-state: the wrapper holds the full FunctionLayerState\n // locally so that consumers using the original CurveEditor API don't\n // have to wire their `value` prop back through on every drag tick to\n // keep the in-flight gesture advancing. We adopt the consumer's\n // `value` prop when it changes externally (and no gesture is active).\n const [layerState, setLayerState] = useState<FunctionLayerState>(\n () => ({ points: value, activeIndex: null }),\n );\n // Ref mirror so the layerChange callback can compare against the\n // freshest state without re-binding on every render.\n const layerStateRef = useRef(layerState);\n layerStateRef.current = layerState;\n\n // Sync from controlled `value` when the consumer updates it externally\n // and we're idle. Skip the update during a gesture so drag-in-flight\n // points aren't clobbered by a stale `value`.\n useEffect(() => {\n if (layerStateRef.current.activeIndex !== null) return;\n if (layerStateRef.current.points === value) return;\n setLayerState({ points: value, activeIndex: null });\n }, [value]);\n\n const handleLayerChange = useCallback((_id: string, nextUnknown: unknown) => {\n const next = nextUnknown as FunctionLayerState;\n const prevPoints = layerStateRef.current.points;\n setLayerState(next);\n if (next.points !== prevPoints) {\n onInput(next.points as ControlPoint[]);\n }\n }, [onInput]);\n\n const handleLayerCommit = useCallback((_id: string, nextUnknown: unknown, prevUnknown: unknown) => {\n if (!onChange) return;\n const next = nextUnknown as FunctionLayerState;\n const prev = prevUnknown as FunctionLayerState;\n if (next.points !== prev.points) {\n onChange?.(next.points as ControlPoint[], prev.points);\n }\n }, [onChange]);\n\n // Right-click on an anchor → delete (preserves original CurveEditor\n // behavior). LayeredCurveEditor doesn't model contextmenu as a\n // gesture; we intercept at the wrapper level by walking the DOM\n // target for `data-anchor-index`.\n const onContextMenu = useCallback((e: ReactMouseEvent<HTMLDivElement>) => {\n const target = e.target as Element | null;\n const node = target?.closest?.('[data-anchor-index]') as Element | null;\n if (!node) return;\n e.preventDefault();\n e.stopPropagation();\n const idxAttr = node.getAttribute('data-anchor-index');\n if (idxAttr === null) return;\n const idx = Number(idxAttr);\n const points = layerStateRef.current.points;\n if (!Number.isInteger(idx) || idx < 0 || idx >= points.length) return;\n if (points[idx]?.locked) return;\n if (endpoints !== undefined && endpoints !== 'free' && (idx === 0 || idx === points.length - 1)) return;\n if (minPoints !== undefined && points.length <= minPoints) return;\n const next = points.filter((_, i) => i !== idx);\n setLayerState({ points: next, activeIndex: null });\n onInput(next as ControlPoint[]);\n onChange?.(next as ControlPoint[], points);\n }, [endpoints, minPoints, onInput, onChange]);\n\n const layers = useMemo(() => [{ layer, state: layerState }], [layer, layerState]);\n\n return (\n <div\n onContextMenu={onContextMenu}\n style={{ display: 'contents' }}\n >\n <LayeredCurveEditor\n layers={layers}\n onLayerChange={handleLayerChange}\n onLayerCommit={handleLayerCommit}\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 history={history}\n className={className}\n style={style}\n >\n {decorations}\n </LayeredCurveEditor>\n </div>\n );\n}\n","import { useCallback, useMemo } from 'react';\nimport { dlog } from '../../dlog';\nimport { type ControlPoint, CurveEditor } from '../CurveEditor';\nimport s from './CurveField.module.css';\n\n/** An annotation drawn over a curve plot: a shaded band across a range of x,\n * or a vertical line at one x. */\nexport type CurveMark =\n | { kind: 'band'; x: [number, number]; color?: string }\n | { kind: 'line'; x: number; color?: string };\n\n/** Props for `<CurveField>`. */\nexport interface CurveFieldProps {\n /** Flat [x0, y0, x1, y1, …] — matches how curve-as-array configs\n * serialize in JSON snapshots. */\n values: number[];\n min: number;\n max: number;\n step: number;\n /** Plot width in CSS px. Caller sizes (typically uses a ResizeObserver). */\n width: number;\n /** Plot height in CSS px. Default 110. */\n height?: number;\n /** Flat default curve. When provided, a Reset button restores it. */\n defaults?: readonly number[];\n onChange: (next: number[]) => void;\n /** Optional vertical marks overlaid on the plot (e.g. landmarks). */\n marks?: readonly CurveMark[];\n}\n\n/**\n * A function-domain (y = f(x), x ∈ [0,1]) curve editor with per-stop\n * numeric readouts and flip buttons. Wraps weasel-ui's\n * `CurveEditor`; consumers wanting the raw editor (2D paths,\n * custom anchors) should import that instead.\n */\nexport function CurveField({\n values,\n min,\n max,\n step,\n width,\n height = 110,\n defaults,\n onChange,\n marks,\n}: CurveFieldProps) {\n const points: ControlPoint[] = useMemo(() => {\n const out: ControlPoint[] = [];\n for (let i = 0; i + 1 < values.length; i += 2) out.push({ x: values[i], y: values[i + 1] });\n return out;\n }, [values]);\n\n const handleChange = useCallback(\n (next: ControlPoint[]) => {\n const flat: number[] = new Array(next.length * 2);\n for (let i = 0; i < next.length; i++) {\n const ySnap = Math.round(next[i].y / step) * step;\n const y = Math.max(min, Math.min(max, ySnap));\n flat[i * 2] = next[i].x;\n flat[i * 2 + 1] = y;\n }\n dlog('curve-field', 'handleChange', {\n nLen: next.length,\n flatLen: flat.length,\n sample: flat.slice(0, 4),\n });\n onChange(flat);\n },\n [onChange, min, max, step],\n );\n\n const handleFlip = useCallback(() => {\n const flipped: Array<{ x: number; y: number }> = [];\n for (let i = 0; i + 1 < values.length; i += 2) {\n flipped.push({ x: 1 - values[i], y: values[i + 1] });\n }\n flipped.sort((a, b) => a.x - b.x);\n const out: number[] = [];\n for (const p of flipped) out.push(p.x, p.y);\n onChange(out);\n }, [values, onChange]);\n\n const handleFlipVertical = useCallback(() => {\n const mid = (min + max) / 2;\n const flipped: number[] = new Array(values.length);\n for (let i = 0; i + 1 < values.length; i += 2) {\n flipped[i] = values[i];\n flipped[i + 1] = 2 * mid - values[i + 1];\n }\n onChange(flipped);\n }, [values, min, max, onChange]);\n\n return (\n <div className={s.field}>\n <div className={s.plot}>\n <CurveEditor\n value={points}\n onInput={handleChange}\n domain=\"1d\"\n constrain=\"function\"\n xRange={[0, 1]}\n yRange={[min, max]}\n width={width}\n height={height}\n endpoints=\"pinned-x\"\n addPointMode=\"click-curve\"\n minPoints={2}\n grid={{}}\n history={false}\n />\n {marks && marks.length > 0 && (\n <svg\n className={s.marks}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n aria-hidden=\"true\"\n >\n {marks.map((m) => {\n const color = m.color ?? '#ffcc00';\n if (m.kind === 'band') {\n const x0 = Math.max(0, Math.min(1, m.x[0])) * width;\n const x1 = Math.max(0, Math.min(1, m.x[1])) * width;\n const left = Math.min(x0, x1);\n const w = Math.abs(x1 - x0);\n return (\n <g key={`band-${m.x[0]}-${m.x[1]}-${color}`}>\n <rect x={left} y={0} width={w} height={height} fill={color} fillOpacity={0.4} />\n <line\n x1={left}\n y1={0}\n x2={left}\n y2={height}\n stroke={color}\n strokeOpacity={0.85}\n strokeWidth={1}\n />\n <line\n x1={left + w}\n y1={0}\n x2={left + w}\n y2={height}\n stroke={color}\n strokeOpacity={0.85}\n strokeWidth={1}\n />\n </g>\n );\n }\n const x = Math.max(0, Math.min(1, m.x)) * width;\n return (\n <line\n key={`mark-${m.x}-${color}`}\n x1={x}\n y1={0}\n x2={x}\n y2={height}\n stroke={color}\n strokeWidth={1}\n />\n );\n })}\n </svg>\n )}\n </div>\n <div className={s.actions}>\n <button type=\"button\" className={s.action} onClick={handleFlip}>\n Flip horizontally\n </button>\n <button type=\"button\" className={s.action} onClick={handleFlipVertical}>\n Flip vertically\n </button>\n {defaults && (\n <button\n type=\"button\"\n className={s.action}\n onClick={() => onChange([...defaults])}\n >\n Reset\n </button>\n )}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport s from './Properties.module.css';\n\nexport interface PinDotProps {\n /** Whether the row is currently auto. */\n auto: boolean;\n /** The row's label, used to name the control. */\n label: ReactNode;\n onChange: (next: boolean) => void;\n}\n\n/**\n * Pinned/auto affordance for a property row. Filled means the row holds a\n * pinned value; hollow means it is auto and the owner decides.\n *\n * Invisible at rest and revealed by the row's `:hover` / `:focus-within` — so\n * tabbing to the row's control brings it into view and into reach, which is\n * the whole keyboard path for going auto.\n */\nexport function PinDot({ auto, label, onChange }: PinDotProps) {\n const name = typeof label === 'string' ? label : 'this setting';\n const toggle = (e: { preventDefault: () => void; stopPropagation: () => void }) => {\n // The wrapping <label> would otherwise actuate the row's control.\n e.preventDefault();\n e.stopPropagation();\n onChange(!auto);\n };\n return (\n // A span, not a button: a <button> is a labelable element, so inside the\n // row's <label> it would take the row's name off the actual control.\n <span\n role=\"button\"\n tabIndex={0}\n className={auto ? `${s.pin} ${s.pinAuto}` : s.pin}\n // The name stays put and `aria-pressed` carries the state, so a voice\n // control user has something stable to say. Pressed means pinned, to\n // match the name.\n aria-pressed={!auto}\n aria-label={`Pin ${name}`}\n onClick={toggle}\n onKeyDown={(e) => {\n // A native button gives Enter and Space for free; a span gives neither,\n // and Space would scroll the panel.\n if (e.key === 'Enter' || e.key === ' ') toggle(e);\n }}\n onMouseDown={(e) => e.stopPropagation()}\n />\n );\n}\n","import {\n type CSSProperties,\n type ReactNode,\n type RefObject,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport { Focusable } from 'react-aria-components';\nimport { dlog } from '../../dlog';\nimport { formatCompact, formatNumber, parseNumber } from '../../format/number';\nimport type { PrefNumberFormat } from '../Prefs/schema';\nimport { PinDot } from './PinDot';\nimport { Tooltip, TooltipTrigger } from '../Tooltip';\nimport shared from '../range.module.css';\nimport s from './Properties.module.css';\nimport { Select } from '../Select';\nimport { Switch } from '../Switch';\n\n/**\n * How much room a container gives its rows — gaps, padding, and field height,\n * moved together. Set on any container in the family; it reaches every\n * descendant, so an inner group can differ from the panel around it.\n */\nexport type PropertyDensity = 'tight' | 'normal' | 'roomy';\n\n/** Where an inline row's label and control sit on the row's cross axis. Set on\n * a container to line a whole column of them up. */\nexport type PropertyAlign = 'start' | 'center' | 'end' | 'baseline';\n\n/** Metric props every container in the family takes. Both reach descendants,\n * so the nearest container that states one wins. */\nexport interface PropertyMetricProps {\n /** Room the rows get. Unset inherits from an outer container, else `normal`. */\n density?: PropertyDensity;\n /**\n * Cross-axis alignment of an inline row's label and control. `baseline` sits\n * the control on the label's first-line baseline, which is what lines a\n * column of swatches up against labels of different heights. Unset keeps each\n * variant's own alignment — a color row centers its label and swatch and\n * sinks the pair to the row's bottom edge, which keeps a paired alpha track\n * level with its neighbour.\n */\n align?: PropertyAlign;\n}\n\nconst DENSITY_CLASS: Record<PropertyDensity, string> = {\n tight: s.densityTight,\n normal: s.densityNormal,\n roomy: s.densityRoomy,\n};\n\nconst ALIGN_CLASS: Record<PropertyAlign, string> = {\n start: s.alignStart,\n center: s.alignCenter,\n end: s.alignEnd,\n baseline: s.alignBaseline,\n};\n\n/** Joins a container's base class with its metric classes and the consumer's.\n * Exported for the family's other files, which share the same two props. */\nexport function propertyMetricClass(\n base: string,\n { density, align }: PropertyMetricProps,\n className?: string,\n): string {\n return [base, density && DENSITY_CLASS[density], align && ALIGN_CLASS[align], className]\n .filter(Boolean)\n .join(' ');\n}\n\n/** Props for `<PropertyPanel>`. */\nexport interface PropertyPanelProps extends PropertyMetricProps {\n title?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\n/** A titled panel holding property rows — the sidebar container the rest of\n * this module's components fill. */\nexport function PropertyPanel({\n title,\n children,\n className,\n density,\n align,\n}: PropertyPanelProps) {\n return (\n <div className={propertyMetricClass(s.panel, { density, align }, className)}>\n {title != null && <h2 className={s.panelTitle}>{title}</h2>}\n {children}\n </div>\n );\n}\n\n/** How a property list packs its rows into two columns. */\nexport type PropertyListPack = 'auto-color' | 'pairs' | 'one-up';\n\n/** Props for `<PropertyList>`. */\nexport interface PropertyListProps extends PropertyMetricProps {\n children: ReactNode;\n className?: string;\n /**\n * How rows pack into the 2-column grid.\n * - `'auto-color'` (default): only color rows pair side-by-side; everything\n * else spans the full width. Right for sparse top-level panels.\n * - `'pairs'`: every row auto-places into the 2-column grid two-per-row.\n * Headers and subpanels still span the full width; wrap any other\n * full-width child in `<PropertySpan>`. Right for dense effect bodies.\n * - `'one-up'`: every row spans the full width, color rows included. Right\n * for a palette — a column of swatches read as a group.\n */\n pack?: PropertyListPack;\n}\n\n/**\n * Grid container for PropertyRows. Use standalone for chrome-less layouts, or\n * nest inside <PropertyPanel/> for the standard glass card.\n */\nexport function PropertyList({\n children,\n className,\n pack = 'auto-color',\n density,\n align,\n}: PropertyListProps) {\n const base = `${s.list}${pack === 'pairs' ? ` ${s.listPairs}` : pack === 'one-up' ? ` ${s.listOneUp}` : ''}`;\n return <div className={propertyMetricClass(base, { density, align }, className)}>{children}</div>;\n}\n\n/** Props for `<PropertySpan>`. */\nexport interface PropertySpanProps {\n children: ReactNode;\n className?: string;\n}\n\n/**\n * Wrapper that makes an arbitrary child span both columns of a\n * `<PropertyList pack=\"pairs\">`, a `<PropertyGroup pack=\"pairs\">` body, or a\n * `<Subpanel>`. `<PropertyRow span>` covers the row case; this covers\n * everything else a consumer puts in the grid.\n */\nexport function PropertySpan({ children, className }: PropertySpanProps) {\n return <div className={className ? `${s.span} ${className}` : s.span}>{children}</div>;\n}\n\n/** Which control shape a row holds, which decides its intrinsic layout. */\nexport type PropertyRowVariant = 'default' | 'color' | 'checkbox';\n/** Whether a row's label sits above its control or beside it. */\nexport type PropertyRowLayout = 'block' | 'inline';\n\n/** Props for `<PropertyRow>`. */\nexport interface PropertyRowProps extends PropertyMetricProps {\n label: ReactNode;\n /** Right-aligned readout shown next to the label (e.g. current value). */\n readout?: ReactNode;\n /**\n * Help text for the row, shown in a tooltip off an ⓘ affordance beside the\n * label. Empty or absent renders no affordance.\n */\n description?: string;\n variant?: PropertyRowVariant;\n /**\n * Label position relative to the control. Unset takes the variant's own\n * orientation: `block` — label above control — for the default variant, and\n * `inline` for the color and checkbox variants, which read as a row.\n */\n layout?: PropertyRowLayout;\n /**\n * Take the full width of the enclosing grid. Only has an effect inside a\n * `<PropertyList pack=\"pairs\">` or a `<Subpanel>`; elsewhere rows are already\n * full width.\n */\n span?: boolean;\n children: ReactNode;\n htmlFor?: string;\n /** The control is a group of several (a segmented toggle), not one element.\n * The row then renders as a `<div>`: a `<label>` hands a click on its text to\n * its first control, which in a group means selecting the first option. Each\n * member has to carry its own name. */\n group?: boolean;\n className?: string;\n /** The row is auto: its value is not pinned and the owner computes it. Draws\n * the control ghosted and colorless. */\n auto?: boolean;\n /** Given, the row carries a pin dot that toggles `auto`. Omitted, the row can\n * show an auto state but not change it. */\n onAutoChange?: (next: boolean) => void;\n /** Marks the row's element for a panel-level gesture handler. `PropertyRow`\n * does not spread unknown props, so this is declared rather than inherited. */\n 'data-auto-path'?: string;\n}\n\n/** The label-plus-control frame every typed row below is built from. Use it\n * directly for a control this module does not cover. */\nexport function PropertyRow({\n label,\n readout,\n description,\n variant = 'default',\n layout,\n span,\n children,\n htmlFor,\n group,\n className,\n density,\n align,\n auto,\n onAutoChange,\n 'data-auto-path': autoPath,\n}: PropertyRowProps) {\n const variantClass = variant === 'color' ? s.rowColor : variant === 'checkbox' ? s.rowCheckbox : '';\n // Each variant already lays out one way; a class is only needed for the\n // other one. The default variant stacks, so it needs `.rowInline`; color and\n // checkbox read as a row, so they need `.rowBlock`.\n const intrinsic: PropertyRowLayout = variant === 'default' ? 'block' : 'inline';\n const resolved = layout ?? intrinsic;\n const layoutClass =\n resolved === intrinsic ? '' : resolved === 'inline' ? s.rowInline : s.rowBlock;\n const cls = propertyMetricClass(\n [s.row, variantClass, layoutClass, span && s.span, auto && s.rowAuto].filter(Boolean).join(' '),\n { density, align },\n className,\n );\n const head = (\n <span className={s.rowLabel}>\n {label}\n {description ? <PropertyRowHelp label={label} description={description} /> : null}\n {onAutoChange ? <PinDot auto={auto ?? false} label={label} onChange={onAutoChange} /> : null}\n {readout != null && <em className={s.readout}>{readout}</em>}\n </span>\n );\n return group ? (\n <div className={cls} data-auto-path={autoPath}>\n {head}\n {children}\n </div>\n ) : (\n <label className={cls} htmlFor={htmlFor} data-auto-path={autoPath}>\n {head}\n {children}\n </label>\n );\n}\n\n/** Tooltip trigger for a row's `description`. A tooltip trigger has to be\n * interactive to be keyboard-reachable, so this is a real button. */\nfunction PropertyRowHelp({ label, description }: { label: ReactNode; description: string }) {\n const name = typeof label === 'string' ? label : 'this setting';\n return (\n <TooltipTrigger>\n <Focusable>\n <button\n type=\"button\"\n className={s.help}\n aria-label={`About ${name}`}\n onClick={(e) => {\n // The wrapping <label> would otherwise actuate the row's control.\n e.preventDefault();\n e.stopPropagation();\n }}\n onMouseDown={(e) => e.stopPropagation()}\n >\n ⓘ\n </button>\n </Focusable>\n <Tooltip>{description}</Tooltip>\n </TooltipTrigger>\n );\n}\n\n// ── Row implementations ──────────────────────────────────────────────\n\n// A row's <label> text also holds the help button's ⓘ and any readout, so a control takes its\n// name from the string label, not from the <label> that `for` points at it.\nfunction nameOf(label: ReactNode): string | undefined {\n return typeof label === 'string' ? label : undefined;\n}\n\n/**\n * A ref for an input whose commit half has to come off a real listener.\n *\n * A native `range`, `color` or `number` input fires `input` through the\n * interaction and `change` once at the end, but React's synthetic `onChange`\n * sees only the first: its value tracker drops the unchanged second. So a row\n * offering the live/committed split reads the live half from React and the\n * committed half from here.\n *\n * `commit` is `undefined` on a row given one callback, which then fires\n * continuously — what a row with one callback has always done.\n */\nfunction useCommitListener(\n commit: ((raw: string) => void) | undefined,\n): RefObject<HTMLInputElement | null> {\n const ref = useRef<HTMLInputElement>(null);\n const latest = useRef(commit);\n useEffect(() => {\n latest.current = commit;\n });\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const onCommit = () => latest.current?.(el.value);\n el.addEventListener('change', onCommit);\n return () => el.removeEventListener('change', onCommit);\n }, []);\n return ref;\n}\n\n/** Props for `<SliderRow>`. */\nexport interface SliderRowProps extends PropertyMetricProps {\n label: ReactNode;\n value: number;\n min: number;\n max: number;\n step?: number;\n /**\n * The committed value. Given `onInput` as well, it fires once a drag ends\n * or a typed readout is accepted; on its own it fires on every move, which\n * is what a row with one callback has always done.\n */\n onChange: (next: number) => void;\n /**\n * The live value, fired continuously through a drag. Pass it alongside\n * `onChange` when the write is expensive — cheap state here, the costly\n * work there. Mirrors `<Slider>`'s `onInput` / `onChange` pair.\n */\n onInput?: (next: number) => void;\n /** Override how the value is rendered next to the label. Defaults to `value.toString()`. */\n format?: (value: number) => ReactNode;\n /**\n * Static text in place of the editable readout. Use it when the row is not\n * showing a number a caller could type back — an auto row's `auto · 18`, say,\n * which an editable field would seed a draft with and then fail to parse.\n */\n readout?: ReactNode;\n /** A named display for the value: `compact` reads `2.0M`. `format` wins when both are given. */\n notation?: PrefNumberFormat;\n /**\n * Optional suffix rendered next to the readout. A string becomes a\n * baseline-aligned dim \"word\" unit (e.g. \"px\"); pass JSX like `<sup>°</sup>`\n * to get the browser's native super positioning for symbol units.\n */\n unit?: ReactNode;\n layout?: PropertyRowLayout;\n description?: string;\n /** Take the full width of the enclosing grid — see `<PropertyRow span>`. */\n span?: boolean;\n /** The row is auto — see `<PropertyRow auto>`. */\n auto?: boolean;\n /** Toggles `auto` from a pin dot — see `<PropertyRow onAutoChange>`. */\n onAutoChange?: (next: boolean) => void;\n /** Marks the row for a panel-level gesture handler — see `<PropertyRow data-auto-path>`. */\n 'data-auto-path'?: string;\n}\n\n/** A bounded number edited by dragging, with a live readout whose precision\n * follows `step`. */\nexport function SliderRow({\n label,\n value,\n min,\n max,\n step = 1,\n onChange,\n onInput,\n format,\n readout,\n notation,\n unit,\n layout,\n description,\n span,\n density,\n align,\n auto,\n onAutoChange,\n 'data-auto-path': autoPath,\n}: SliderRowProps) {\n // Default readout precision tracks `step`: integer steps → 0 decimals,\n // 0.1 → 1 decimal, 0.05/0.02/0.01 → 2 decimals, 0.005 → 3, etc. Callers\n // can still pass an explicit `format` to override (e.g. for a custom\n // unit string or a non-decimal display like fractions).\n const decimals = step >= 1 ? 0 : Math.min(6, Math.max(0, Math.ceil(-Math.log10(step))));\n const live = onInput ?? onChange;\n const commit = onInput ? onChange : undefined;\n const range = useCommitListener(commit && ((raw) => commit(Number(raw))));\n const effectiveFormat =\n format ??\n (notation === 'compact'\n ? (n: number) => formatCompact(n, decimals)\n : (n: number) =>\n formatNumber(n, {\n useGrouping: false,\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }));\n return (\n <PropertyRow\n span={span}\n label={label}\n readout={\n readout ?? (\n <EditableReadout\n name={nameOf(label)}\n value={value}\n min={min}\n max={max}\n format={effectiveFormat}\n unit={unit}\n onCommit={(next) => {\n live(next);\n commit?.(next);\n }}\n />\n )\n }\n layout={layout}\n description={description}\n density={density}\n align={align}\n auto={auto}\n onAutoChange={onAutoChange}\n data-auto-path={autoPath}\n >\n <input\n ref={range}\n type=\"range\"\n aria-label={nameOf(label)}\n className={shared.range}\n tabIndex={-1}\n min={min}\n max={max}\n step={step}\n value={value}\n onChange={(e) => {\n const v = Number(e.target.value);\n dlog('property-panel', 'slider', { label, value: v });\n live(v);\n }}\n />\n </PropertyRow>\n );\n}\n\ninterface EditableReadoutProps {\n name: string | undefined;\n value: number;\n min: number;\n max: number;\n format?: (value: number) => ReactNode;\n unit?: ReactNode;\n onCommit: (next: number) => void;\n}\n\n/**\n * Readout that swaps to a number input on click, commits on Enter/blur,\n * cancels on Escape. Clicks are stopped so the wrapping <label> doesn't\n * forward focus to the slider thumb.\n */\nfunction EditableReadout({ name, value, min, max, format, unit, onCommit }: EditableReadoutProps) {\n // Draft is non-null only while the input is focused. Live value mirrors\n // into the input otherwise. Pattern mirrors speech-balloons Lab.tsx:893-942.\n const [draft, setDraft] = useState<string | null>(null);\n const fmt = (n: number) =>\n format ? format(n) : formatNumber(n, { useGrouping: false, maximumFractionDigits: 20 });\n const text = (n: number) => {\n const formatted = fmt(n);\n return typeof formatted === 'string' ? formatted : String(formatted);\n };\n const displayValue = draft !== null ? draft : text(value);\n // The widest value the range can show, which the stylesheet widens the box to fit.\n const fit = { '--wzl-property-readout-fit': `${Math.max(text(min).length, text(max).length)}ch` };\n\n const suffix =\n unit == null ? null : typeof unit === 'string' ? (\n <span className={s.readoutUnit}>{unit}</span>\n ) : (\n unit\n );\n\n const commit = () => {\n if (draft !== null) {\n const n = parseNumber(draft);\n if (Number.isFinite(n)) onCommit(Math.min(max, Math.max(min, n)));\n }\n setDraft(null);\n };\n\n return (\n <span className={s.readoutGroup}>\n <input\n type=\"text\"\n aria-label={name}\n inputMode=\"decimal\"\n className={s.readoutInput}\n style={fit as CSSProperties}\n value={displayValue}\n onFocus={(e) => {\n const formatted = fmt(value);\n setDraft(typeof formatted === 'string' ? formatted : String(formatted));\n e.currentTarget.select();\n }}\n onChange={(e) => setDraft(e.target.value.replace(/-/g, '−'))}\n onBlur={commit}\n onClick={(e) => {\n // Stop the click from reaching the wrapping <label> (which would\n // forward focus to the slider thumb).\n e.preventDefault();\n e.stopPropagation();\n e.currentTarget.focus();\n }}\n onMouseDown={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n commit();\n e.currentTarget.blur();\n } else if (e.key === 'Escape') {\n setDraft(null);\n e.currentTarget.blur();\n }\n }}\n />\n {suffix}\n </span>\n );\n}\n\n/** Props for `<ColorRow>`. */\nexport interface ColorRowProps extends PropertyMetricProps {\n label: ReactNode;\n value: string;\n /**\n * The committed color. Given `onInput` as well, it fires once the picker\n * closes; on its own it fires on every move inside it, which is what a row\n * with one callback has always done.\n */\n onChange: (next: string) => void;\n /**\n * The live color, fired continuously while the picker is open. Pass it\n * alongside `onChange` when the write is expensive — cheap state here, the\n * costly work there. Mirrors `<Slider>`'s `onInput` / `onChange` pair.\n */\n onInput?: (next: string) => void;\n /** 0..1 alpha. When provided, a translucent slider renders beneath the swatch. */\n alpha?: number;\n /** The committed alpha, on the same terms as `onChange`. */\n onAlphaChange?: (next: number) => void;\n /** The live alpha, on the same terms as `onInput`. */\n onAlphaInput?: (next: number) => void;\n /**\n * Render the alpha track as inert (dimmed, no thumb, not-allowed cursor).\n * Use when the color's consumer drops alpha so the affordance reads dead.\n */\n alphaDisabled?: boolean;\n /** Label beside the swatch (default) or above it. */\n layout?: PropertyRowLayout;\n description?: string;\n /** Right-aligned readout shown next to the label — see `<PropertyRow readout>`. */\n readout?: ReactNode;\n /** Take the full width of the enclosing grid — see `<PropertyRow span>`. */\n span?: boolean;\n /** The row is auto — see `<PropertyRow auto>`. */\n auto?: boolean;\n /** Toggles `auto` from a pin dot — see `<PropertyRow onAutoChange>`. */\n onAutoChange?: (next: boolean) => void;\n /** Marks the row for a panel-level gesture handler — see `<PropertyRow data-auto-path>`. */\n 'data-auto-path'?: string;\n}\n\n/** A color swatch, optionally with an alpha slider beneath it. */\nexport function ColorRow({\n label,\n readout,\n value,\n onChange,\n onInput,\n alpha,\n onAlphaChange,\n onAlphaInput,\n alphaDisabled,\n layout,\n description,\n span,\n density,\n align,\n auto,\n onAutoChange,\n 'data-auto-path': autoPath,\n}: ColorRowProps) {\n const showAlpha = alpha != null;\n const liveColor = onInput ?? onChange;\n const color = useCommitListener(onInput && ((raw) => onChange(raw)));\n const liveAlpha = onAlphaInput ?? onAlphaChange;\n const alphaRange = useCommitListener(\n onAlphaInput && onAlphaChange && ((raw) => onAlphaChange(Number(raw))),\n );\n const id = useId();\n return (\n <PropertyRow\n span={span}\n label={label}\n readout={readout}\n variant=\"color\"\n layout={layout}\n description={description}\n density={density}\n align={align}\n auto={auto}\n onAutoChange={onAutoChange}\n data-auto-path={autoPath}\n htmlFor={id}\n >\n <input\n ref={color}\n id={id}\n type=\"color\"\n aria-label={nameOf(label)}\n value={value}\n onChange={(e) => liveColor(e.target.value)}\n />\n {showAlpha && (\n <input\n ref={alphaRange}\n type=\"range\"\n aria-label={typeof label === 'string' ? `${label} opacity` : undefined}\n className={`${shared.range} ${shared.alpha} ${s.alpha}`}\n min={0}\n max={1}\n step={0.01}\n value={alpha}\n disabled={alphaDisabled}\n onChange={(e) => liveAlpha?.(Number(e.target.value))}\n />\n )}\n </PropertyRow>\n );\n}\n\n/** Props for `<CheckboxRow>`. */\nexport interface CheckboxRowProps extends PropertyMetricProps {\n label: ReactNode;\n /** Absent reads as unchecked. */\n value: boolean | undefined;\n onChange: (next: boolean) => void;\n /** Label beside the box (default) or above it. */\n layout?: PropertyRowLayout;\n description?: string;\n /** Right-aligned readout shown next to the label — see `<PropertyRow readout>`. */\n readout?: ReactNode;\n /** Take the full width of the enclosing grid — see `<PropertyRow span>`. */\n span?: boolean;\n /** The row is auto — see `<PropertyRow auto>`. */\n auto?: boolean;\n /** Toggles `auto` from a pin dot — see `<PropertyRow onAutoChange>`. */\n onAutoChange?: (next: boolean) => void;\n /** Marks the row for a panel-level gesture handler — see `<PropertyRow data-auto-path>`. */\n 'data-auto-path'?: string;\n}\n\n/** A boolean checkbox. */\nexport function CheckboxRow({\n label,\n readout,\n value,\n onChange,\n layout,\n span,\n description,\n density,\n align,\n auto,\n onAutoChange,\n 'data-auto-path': autoPath,\n}: CheckboxRowProps) {\n const id = useId();\n return (\n <PropertyRow\n span={span}\n label={label}\n readout={readout}\n variant=\"checkbox\"\n layout={layout}\n description={description}\n density={density}\n align={align}\n auto={auto}\n onAutoChange={onAutoChange}\n data-auto-path={autoPath}\n htmlFor={id}\n >\n <input\n id={id}\n type=\"checkbox\"\n aria-label={nameOf(label)}\n checked={value === true}\n onChange={(e) => onChange(e.target.checked)}\n />\n </PropertyRow>\n );\n}\n\n/** Props for `<SwitchRow>`. */\nexport interface SwitchRowProps extends Omit<CheckboxRowProps, 'value'> {\n /** Absent reads as off. */\n value: boolean | undefined;\n}\n\n/**\n * A boolean switch — the same row as `<CheckboxRow>`, drawn as an on/off\n * toggle. Reach for it where the change takes effect immediately, and for\n * a checkbox where it is submitted with a form.\n */\nexport function SwitchRow({\n label,\n readout,\n value,\n onChange,\n layout,\n span,\n description,\n density,\n align,\n auto,\n onAutoChange,\n 'data-auto-path': autoPath,\n}: SwitchRowProps) {\n return (\n <PropertyRow\n // The switch renders its own <label>, so the row may not be one.\n group\n span={span}\n label={label}\n readout={readout}\n variant=\"checkbox\"\n layout={layout}\n description={description}\n density={density}\n align={align}\n auto={auto}\n onAutoChange={onAutoChange}\n data-auto-path={autoPath}\n >\n <Switch\n aria-label={nameOf(label)}\n isSelected={value === true}\n onChange={onChange}\n />\n </PropertyRow>\n );\n}\n\n/** Props for `<TextRow>`. */\nexport interface TextRowProps extends PropertyMetricProps {\n label: ReactNode;\n /** Absent reads as an empty field. */\n value: string | null | undefined;\n onChange: (next: string) => void;\n placeholder?: string;\n maxLength?: number;\n layout?: PropertyRowLayout;\n description?: string;\n /** Right-aligned readout shown next to the label — see `<PropertyRow readout>`. */\n readout?: ReactNode;\n /** Take the full width of the enclosing grid — see `<PropertyRow span>`. */\n span?: boolean;\n /** The row is auto — see `<PropertyRow auto>`. */\n auto?: boolean;\n /** Toggles `auto` from a pin dot — see `<PropertyRow onAutoChange>`. */\n onAutoChange?: (next: boolean) => void;\n /** Marks the row for a panel-level gesture handler — see `<PropertyRow data-auto-path>`. */\n 'data-auto-path'?: string;\n}\n\n/** A single-line text input. */\nexport function TextRow({\n label,\n readout,\n value,\n onChange,\n placeholder,\n maxLength,\n layout,\n description,\n span,\n density,\n align,\n auto,\n onAutoChange,\n 'data-auto-path': autoPath,\n}: TextRowProps) {\n const id = useId();\n return (\n <PropertyRow\n span={span}\n label={label}\n readout={readout}\n layout={layout}\n description={description}\n density={density}\n align={align}\n auto={auto}\n onAutoChange={onAutoChange}\n data-auto-path={autoPath}\n htmlFor={id}\n >\n <input\n id={id}\n type=\"text\"\n aria-label={nameOf(label)}\n value={value ?? ''}\n placeholder={placeholder}\n maxLength={maxLength}\n onChange={(e) => onChange(e.target.value)}\n />\n </PropertyRow>\n );\n}\n\n/** Props for `<NumberRow>`. */\nexport interface NumberRowProps extends PropertyMetricProps {\n label: ReactNode;\n /** Absent reads as an empty field. */\n value: number | null | undefined;\n /**\n * The committed value. Given `onInput` as well, it fires on blur or Enter;\n * on its own it fires on every keystroke, which is what a row with one\n * callback has always done.\n */\n onChange: (next: number) => void;\n /**\n * The live value, fired per keystroke. Pass it alongside `onChange` when the\n * write is expensive — cheap state here, the costly work there. Mirrors\n * `<Slider>`'s `onInput` / `onChange` pair.\n */\n onInput?: (next: number) => void;\n min?: number;\n max?: number;\n step?: number;\n placeholder?: string;\n /**\n * Optional suffix rendered after the field. A string becomes a dim \"word\"\n * unit (e.g. \"px\"); pass JSX like `<sup>°</sup>` for symbol units. Display\n * only — it never participates in parsing, and the value stays a number.\n */\n unit?: ReactNode;\n layout?: PropertyRowLayout;\n description?: string;\n /** Right-aligned readout shown next to the label — see `<PropertyRow readout>`. */\n readout?: ReactNode;\n /** Take the full width of the enclosing grid — see `<PropertyRow span>`. */\n span?: boolean;\n /** The row is auto — see `<PropertyRow auto>`. */\n auto?: boolean;\n /** Toggles `auto` from a pin dot — see `<PropertyRow onAutoChange>`. */\n onAutoChange?: (next: boolean) => void;\n /** Marks the row for a panel-level gesture handler — see `<PropertyRow data-auto-path>`. */\n 'data-auto-path'?: string;\n}\n\n/** A number typed directly. Reach for `<SliderRow>` when the range matters\n * more than the exact value. */\nexport function NumberRow({\n label,\n readout,\n value,\n onChange,\n onInput,\n min,\n max,\n step,\n placeholder,\n unit,\n layout,\n description,\n span,\n density,\n align,\n auto,\n onAutoChange,\n 'data-auto-path': autoPath,\n}: NumberRowProps) {\n const live = onInput ?? onChange;\n const field = useCommitListener(onInput && ((raw) => {\n if (raw === '') return;\n const n = Number(raw);\n if (Number.isFinite(n)) onChange(n);\n }));\n const id = useId();\n const input = (\n <input\n ref={field}\n id={id}\n type=\"number\"\n aria-label={nameOf(label)}\n value={value ?? ''}\n min={min}\n max={max}\n step={step}\n placeholder={placeholder}\n onChange={(e) => {\n const raw = e.target.value;\n if (raw === '') return;\n const n = Number(raw);\n if (Number.isFinite(n)) live(n);\n }}\n />\n );\n return (\n <PropertyRow\n span={span}\n label={label}\n readout={readout}\n layout={layout}\n description={description}\n density={density}\n align={align}\n auto={auto}\n onAutoChange={onAutoChange}\n data-auto-path={autoPath}\n htmlFor={id}\n >\n {unit == null ? (\n input\n ) : (\n <span className={s.fieldUnitGroup}>\n {input}\n {typeof unit === 'string' ? <span className={s.readoutUnit}>{unit}</span> : unit}\n </span>\n )}\n </PropertyRow>\n );\n}\n\nexport interface PropertyOption<T extends string> {\n value: T;\n label: ReactNode;\n}\n\n/** Props for `<SelectRow>`. */\nexport interface SelectRowProps<T extends string> extends PropertyMetricProps {\n label: ReactNode;\n /** Absent, or not one of `options`, shows a placeholder rather than the first option. */\n value: T | undefined;\n options: ReadonlyArray<PropertyOption<T>>;\n onChange: (next: T) => void;\n /** Shown while no option is chosen. Defaults to \"Choose option…\". */\n placeholder?: string;\n layout?: PropertyRowLayout;\n description?: string;\n /** Right-aligned readout shown next to the label — see `<PropertyRow readout>`. */\n readout?: ReactNode;\n /** Take the full width of the enclosing grid — see `<PropertyRow span>`. */\n span?: boolean;\n /** The row is auto — see `<PropertyRow auto>`. */\n auto?: boolean;\n /** Toggles `auto` from a pin dot — see `<PropertyRow onAutoChange>`. */\n onAutoChange?: (next: boolean) => void;\n /** Marks the row for a panel-level gesture handler — see `<PropertyRow data-auto-path>`. */\n 'data-auto-path'?: string;\n}\n\n/** A dropdown over a fixed set of choices. Prefer `<ToggleRow>` when there\n * are only two or three and they should all stay visible. */\nexport function SelectRow<T extends string>({\n label,\n readout,\n value,\n options,\n onChange,\n placeholder = 'Choose option…',\n layout,\n description,\n span,\n density,\n align,\n auto,\n onAutoChange,\n 'data-auto-path': autoPath,\n}: SelectRowProps<T>) {\n const chosen = options.some((opt) => opt.value === value);\n const id = useId();\n return (\n <PropertyRow\n span={span}\n label={label}\n readout={readout}\n layout={layout}\n description={description}\n density={density}\n align={align}\n auto={auto}\n onAutoChange={onAutoChange}\n data-auto-path={autoPath}\n htmlFor={id}\n >\n <Select<T>\n className={s.select}\n variant=\"bare\"\n triggerId={id}\n aria-label={nameOf(label)}\n placeholder={placeholder}\n selectedKey={chosen ? value : null}\n options={options}\n onSelectionChange={(v) => {\n dlog('property-panel', 'select', { label, value: v });\n onChange(v);\n }}\n />\n </PropertyRow>\n );\n}\n\n/** Props for `<ToggleRow>`. */\nexport interface ToggleRowProps<T extends string> extends PropertyMetricProps {\n label: ReactNode;\n value: T;\n options: ReadonlyArray<PropertyOption<T>>;\n onChange: (next: T) => void;\n layout?: PropertyRowLayout;\n description?: string;\n /** Right-aligned readout shown next to the label — see `<PropertyRow readout>`. */\n readout?: ReactNode;\n /** Take the full width of the enclosing grid — see `<PropertyRow span>`. */\n span?: boolean;\n /** The row is auto — see `<PropertyRow auto>`. */\n auto?: boolean;\n /** Toggles `auto` from a pin dot — see `<PropertyRow onAutoChange>`. */\n onAutoChange?: (next: boolean) => void;\n /** Marks the row for a panel-level gesture handler — see `<PropertyRow data-auto-path>`. */\n 'data-auto-path'?: string;\n}\n\n/** A segmented control: the same choice as a select, with every option\n * visible at once. */\nexport function ToggleRow<T extends string>({\n label,\n readout,\n value,\n options,\n onChange,\n layout,\n description,\n span,\n density,\n align,\n auto,\n onAutoChange,\n 'data-auto-path': autoPath,\n}: ToggleRowProps<T>) {\n return (\n <PropertyRow\n group\n span={span}\n label={label}\n readout={readout}\n layout={layout}\n description={description}\n density={density}\n align={align}\n auto={auto}\n onAutoChange={onAutoChange}\n data-auto-path={autoPath}\n >\n <div className={s.toggle} role=\"group\" aria-label={nameOf(label)}>\n {options.map((opt) => {\n const selected = opt.value === value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n aria-pressed={selected}\n aria-label={nameOf(opt.label)}\n className={\n selected ? `${s.toggleButton} ${s.toggleButtonSelected}` : s.toggleButton\n }\n onClick={() => onChange(opt.value)}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n </PropertyRow>\n );\n}\n","import { type CSSProperties, type ReactNode, useState } from 'react';\nimport s from './Properties.module.css';\nimport { type PropertyMetricProps, propertyMetricClass } from './PropertyPanel';\n\n// ── Subpanel ─────────────────────────────────────────────────────────\n// Headered group of controls inside a wider panel/list. The header is a\n// label flanked by a horizontal rule — no background, padding, or border;\n// purely a typographic divider. Ported from speech-balloons styles.css:277-313.\n\n/** Props for `<Subpanel>`. */\nexport interface SubpanelProps extends PropertyMetricProps {\n title: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\n/** A typographic divider inside a property list: a small title flanked by a\n * rule. Purely a heading — use `<PropertyGroup>` for a bordered section. */\nexport function Subpanel({ title, children, className, density, align }: SubpanelProps) {\n const cls = propertyMetricClass(s.subpanel, { density, align }, className);\n return (\n <div className={cls}>\n <h4 className={s.subpanelTitle}>\n <span>{title}</span>\n <hr />\n </h4>\n {children}\n </div>\n );\n}\n\n// ── EffectCard ───────────────────────────────────────────────────────\n// Draggable, collapsible card for stacked effect editors. Optional\n// --wzl-effect-card-accent per-instance recolors the title bar, border-left, and\n// (via re-binding --wzl-accent inside the card) every descendant control that\n// reads from the accent token.\n\n/** Props for `<EffectCard>`. */\nexport interface EffectCardProps {\n /** Card title rendered in the title bar (e.g. effect kind label or a select). */\n title: ReactNode;\n /** Optional badge/chip displayed before the remove button (e.g. primary value summary). */\n primary?: ReactNode;\n /** Optional accent color in any CSS color form. Sets --wzl-effect-card-accent on the card. */\n accent?: string;\n /** Optional ordinal badge that doubles as the drag handle (used by tail cards in SB). */\n index?: number;\n expanded?: boolean;\n onToggleExpanded?: () => void;\n onRemove?: () => void;\n /**\n * Drag-handle wiring. When provided, an inline handle (⋮⋮ icon or `index`)\n * activates HTML5 drag on press. Consumer owns the drag/drop coordination —\n * see EffectCardList for the batteries-included wrapper.\n */\n draggable?: boolean;\n onPressHandle?: () => void;\n onReleaseHandle?: () => void;\n onDragStart?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDragEnd?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDragOver?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDragLeave?: (e: React.DragEvent<HTMLDivElement>) => void;\n onDrop?: (e: React.DragEvent<HTMLDivElement>) => void;\n dragging?: boolean;\n children?: ReactNode;\n className?: string;\n}\n\n/** An accented, collapsible card for one item in a list of like things —\n * effects, layers, tails. The accent color rebinds the theme accent token\n * within the card, so its controls pick it up too. */\nexport function EffectCard({\n title,\n primary,\n accent,\n index,\n expanded = true,\n onToggleExpanded,\n onRemove,\n draggable,\n onPressHandle,\n onReleaseHandle,\n onDragStart,\n onDragEnd,\n onDragOver,\n onDragLeave,\n onDrop,\n dragging,\n children,\n className,\n}: EffectCardProps) {\n const stateClass = `${expanded ? ` ${s.cardExpanded}` : ''}${dragging ? ` ${s.cardDragging}` : ''}${accent ? ` ${s.cardAccented}` : ''}`;\n const cls = `${s.card}${stateClass}${className ? ` ${className}` : ''}`;\n // Per-instance dynamic color → CSS custom property requires inline style.\n // The card's CSS re-binds --wzl-accent to it so descendants tint.\n const style = accent ? ({ '--wzl-effect-card-accent': accent } as CSSProperties) : undefined;\n\n // When a toggle handler is supplied the header acts as a disclosure button:\n // role + tab stop + Enter/Space. Bundled together so the interactive props are\n // applied as a set (no half-interactive element when onToggleExpanded is absent).\n const headProps = onToggleExpanded\n ? {\n role: 'button' as const,\n tabIndex: 0,\n onClick: onToggleExpanded,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onToggleExpanded();\n }\n },\n }\n : {};\n\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: native HTML5 drag-and-drop container — drag events are not click/keyboard interactions and have no semantic element; the in-card handle and header carry the a11y affordances.\n <div\n className={cls}\n style={style}\n draggable={draggable}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragOver={onDragOver}\n onDragLeave={onDragLeave}\n onDrop={onDrop}\n >\n <div className={s.cardHead} {...headProps}>\n {index != null ? (\n <button\n type=\"button\"\n className={`${s.cardIndexBadge} ${s.cardHandle}`}\n title=\"Drag to reorder · click to toggle\"\n aria-label={`Item ${index + 1} — drag to reorder, click to toggle`}\n onMouseDown={onPressHandle}\n onMouseUp={onReleaseHandle}\n onClick={(e) => {\n e.stopPropagation();\n onToggleExpanded?.();\n }}\n >\n {index + 1}\n </button>\n ) : (\n <span\n className={s.cardHandle}\n aria-hidden=\"true\"\n title=\"Drag to reorder\"\n onMouseDown={onPressHandle}\n onMouseUp={onReleaseHandle}\n >\n <DragHandleIcon />\n </span>\n )}\n <span className={s.cardTitle}>{title}</span>\n {primary != null && <span className={s.cardPrimary}>{primary}</span>}\n {onRemove && (\n <button\n type=\"button\"\n className={s.cardRemove}\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n title=\"Remove\"\n aria-label=\"Remove\"\n >\n ✕\n </button>\n )}\n </div>\n {expanded && <div className={s.cardBody}>{children}</div>}\n </div>\n );\n}\n\nfunction DragHandleIcon() {\n return (\n <svg width=\"10\" height=\"14\" viewBox=\"0 0 10 14\" aria-hidden=\"true\">\n <circle cx=\"3\" cy=\"3\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"3\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"7\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"7\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"11\" r=\"1.3\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"11\" r=\"1.3\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n// ── EffectCardList ───────────────────────────────────────────────────\n// Batteries-included list wrapper that coordinates HTML5 drag-and-drop across\n// a list of EffectCards. Consumer supplies items + a renderItem callback;\n// onReorder fires with (sourceId, targetId, position) on drop. Mirrors the\n// LayerStack pattern from speech-balloons Lab.tsx:630-707.\n\n/** The minimum an item must carry to appear in an `<EffectCardList>`. */\nexport interface EffectCardListItem {\n id: string | number;\n}\n\n/** Props for `<EffectCardList>`. */\nexport interface EffectCardListProps<T extends EffectCardListItem> {\n items: ReadonlyArray<T>;\n renderItem: (\n item: T,\n helpers: {\n isExpanded: boolean;\n isDragging: boolean;\n toggleExpanded: () => void;\n cardProps: Pick<\n EffectCardProps,\n | 'expanded'\n | 'dragging'\n | 'draggable'\n | 'onToggleExpanded'\n | 'onPressHandle'\n | 'onReleaseHandle'\n | 'onDragStart'\n | 'onDragEnd'\n | 'onDragOver'\n | 'onDragLeave'\n | 'onDrop'\n >;\n },\n ) => ReactNode;\n onReorder: (sourceId: T['id'], targetId: T['id'], position: 'before' | 'after') => void;\n /** Optional rendered when the list is empty. */\n empty?: ReactNode;\n /** IDs to render expanded on first mount. Defaults to all collapsed. */\n defaultExpandedIds?: ReadonlyArray<T['id']>;\n}\n\n/** A drag-reorderable list of `<EffectCard>`s. Owns the expanded and dragging\n * state and hands it back to `renderItem`, so the caller only supplies each\n * card's contents. */\nexport function EffectCardList<T extends EffectCardListItem>({\n items,\n renderItem,\n onReorder,\n empty,\n defaultExpandedIds,\n}: EffectCardListProps<T>) {\n const [expanded, setExpanded] = useState<Set<T['id']>>(() => new Set(defaultExpandedIds ?? []));\n const [draggingId, setDraggingId] = useState<T['id'] | null>(null);\n const [pressedId, setPressedId] = useState<T['id'] | null>(null);\n const [dropHint, setDropHint] = useState<{ id: T['id']; position: 'before' | 'after' } | null>(\n null,\n );\n\n if (items.length === 0) {\n return <>{empty ?? <div className={s.cardListEmpty}>No items.</div>}</>;\n }\n\n return (\n <div className={s.cardList}>\n {items.map((item) => {\n const isExpanded = expanded.has(item.id);\n const isDragging = draggingId === item.id;\n const isPressed = pressedId === item.id;\n const showHintBefore =\n dropHint && dropHint.id === item.id && dropHint.position === 'before';\n const showHintAfter = dropHint && dropHint.id === item.id && dropHint.position === 'after';\n\n const toggleExpanded = () =>\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(item.id)) next.delete(item.id);\n else next.add(item.id);\n return next;\n });\n\n return (\n <div key={String(item.id)} className={s.cardListWrap}>\n {showHintBefore && <div className={s.cardDropHint} />}\n {renderItem(item, {\n isExpanded,\n isDragging,\n toggleExpanded,\n cardProps: {\n expanded: isExpanded,\n dragging: isDragging,\n draggable: isPressed,\n onToggleExpanded: toggleExpanded,\n onPressHandle: () => setPressedId(item.id),\n onReleaseHandle: () => setPressedId(null),\n onDragStart: (e) => {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', String(item.id));\n setDraggingId(item.id);\n },\n onDragEnd: () => {\n setDraggingId(null);\n setPressedId(null);\n setDropHint(null);\n },\n onDragOver: (e) => {\n if (draggingId === null || draggingId === item.id) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const position: 'before' | 'after' =\n e.clientY < rect.top + rect.height / 2 ? 'before' : 'after';\n setDropHint({ id: item.id, position });\n },\n onDragLeave: () => {\n setDropHint((h) => (h && h.id === item.id ? null : h));\n },\n onDrop: (e) => {\n e.preventDefault();\n if (draggingId === null || draggingId === item.id) {\n setDropHint(null);\n return;\n }\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const position: 'before' | 'after' =\n e.clientY < rect.top + rect.height / 2 ? 'before' : 'after';\n onReorder(draggingId, item.id, position);\n setDropHint(null);\n },\n },\n })}\n {showHintAfter && <div className={s.cardDropHint} />}\n </div>\n );\n })}\n </div>\n );\n}\n","import { type ReactNode, useId, useState } from 'react';\nimport { DisclosureRow } from '../Disclosure';\nimport s from './Properties.module.css';\nimport {\n type PropertyListPack,\n type PropertyMetricProps,\n propertyMetricClass,\n} from './PropertyPanel';\n\n/** Props for `<PropertyGroup>`. */\nexport interface PropertyGroupProps extends PropertyMetricProps {\n /** Title rendered between two rules at the top of the group. */\n title: ReactNode;\n /** When true the group renders nothing — useful for conditional sections. */\n hidden?: boolean;\n /**\n * Give the title a twisty that folds the rows away. Implied by any of the\n * three props below, so it is only needed for a group that starts open and\n * keeps its own state.\n */\n collapsible?: boolean;\n /** Start folded. Read once; the group owns the state from then on. */\n defaultCollapsed?: boolean;\n /**\n * Folded or not, as the consumer holds it. Given, the group keeps no state\n * of its own and every toggle arrives at `onCollapsedChange` instead — which\n * is what a panel that remembers its sections past a reload needs.\n */\n collapsed?: boolean;\n onCollapsedChange?: (next: boolean) => void;\n children: ReactNode;\n className?: string;\n /** How rows pack into the 2-column grid — see `<PropertyList pack>`. */\n pack?: PropertyListPack;\n}\n\n/**\n * Visually-bordered group inside a PropertyList. Use to scope a set of\n * related rows under a heading (e.g. \"Aqua\", \"Bevel\", \"Dome\" sections\n * inside a fill effect's controls).\n *\n * A collapsible group keeps its rows mounted and hides them, so a control's\n * local state survives being folded away.\n */\nexport function PropertyGroup({\n title,\n hidden,\n collapsible,\n defaultCollapsed,\n collapsed,\n onCollapsedChange,\n children,\n className,\n pack = 'auto-color',\n density,\n align,\n}: PropertyGroupProps) {\n const bodyId = useId();\n const [own, setOwn] = useState(defaultCollapsed ?? false);\n if (hidden) return null;\n\n const folds =\n collapsible ??\n (defaultCollapsed !== undefined || collapsed !== undefined || onCollapsedChange !== undefined);\n const folded = folds && (collapsed ?? own);\n const toggle = () => {\n if (collapsed === undefined) setOwn(!folded);\n onCollapsedChange?.(!folded);\n };\n\n const base = `${s.group}${pack === 'pairs' ? ` ${s.groupPairs}` : pack === 'one-up' ? ` ${s.groupOneUp}` : ''}`;\n const cls = propertyMetricClass(base, { density, align }, className);\n const heading = (\n <h3 className={s.groupTitle}>\n <hr />\n <span>{title}</span>\n <hr />\n </h3>\n );\n return (\n <div className={cls}>\n {folds ? (\n <DisclosureRow\n className={s.groupHead}\n open={!folded}\n onToggle={toggle}\n label={typeof title === 'string' ? title : 'this section'}\n controls={bodyId}\n >\n {heading}\n </DisclosureRow>\n ) : (\n heading\n )}\n <div id={bodyId} className={s.groupBody} hidden={folded}>\n {children}\n </div>\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport s from './Sidebar.module.css';\n\n/** Props for {@link Sidebar}. */\nexport interface SidebarProps {\n /**\n * Edge the sidebar docks to. Adds a class hook (`s.left` / `s.right`)\n * so consumers can target either edge for borders, shadows, etc.\n * Purely cosmetic — layout is the parent's job.\n */\n side?: 'left' | 'right';\n /**\n * Accessible label — rendered onto the `<aside>`. Without it, screen\n * readers fall back to \"complementary landmark,\" which is fine for\n * apps with a single sidebar but ambiguous when there's both a left\n * and a right.\n */\n ariaLabel?: string;\n children?: ReactNode;\n className?: string;\n /** Inline style — useful for width-as-custom-property handles or any\n * other one-off CSS property the consumer wants to set dynamically. */\n style?: CSSProperties;\n}\n\n/**\n * Generic sidebar shell — `<aside>` with column layout and token-driven\n * surface treatment. Width, sticky positioning, and resize handles stay\n * the consumer's concern (every app has its own layout grid); the kit\n * just provides the chrome.\n *\n * Pair with `<SidebarPanel>` for collapsible sections.\n */\nexport function Sidebar(props: SidebarProps) {\n const { side, ariaLabel, children, className, style } = props;\n const cls = [s.sidebar, side === 'left' && s.left, side === 'right' && s.right, className]\n .filter(Boolean).join(' ');\n return (\n <aside className={cls} aria-label={ariaLabel} style={style}>\n {children}\n </aside>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Focusable } from 'react-aria-components';\nimport { ChevronIcon } from '../../icons';\nimport { Tooltip, TooltipTrigger } from '../Tooltip';\nimport s from './SidebarPanel.module.css';\n\n/** Props for {@link SidebarPanel}. */\nexport interface SidebarPanelProps {\n /** Title rendered in the panel's header row. */\n title?: ReactNode;\n /**\n * Collapsed state — when true, only the header paints; the body is\n * omitted. Caller owns the state (typically via prefs) and flips it\n * back via `onToggleCollapse`.\n */\n collapsed?: boolean;\n /**\n * Click handler for the title row. When provided, the header renders\n * as a button (chevron + label) and acts as the collapse toggle.\n * When omitted, the title is static text and the panel can't collapse.\n */\n onToggleCollapse?(): void;\n /**\n * Optional close handler — when provided, the header gains a `×`\n * button on the trailing edge. Caller flips its \"hidden\" state and\n * conditionally unmounts the panel from the parent.\n */\n onHide?(): void;\n children?: ReactNode;\n className?: string;\n}\n\n/**\n * Generic collapsible panel section for sidebars. Pure presentation —\n * caller manages `collapsed`/`hidden` state externally (the pattern is\n * to drive it from app prefs so the Preferences modal and inline\n * chevrons toggle the same map).\n *\n * Pair with `<Sidebar>` for the docked column layout.\n */\nexport function SidebarPanel(props: SidebarPanelProps) {\n const { title, collapsed, onToggleCollapse, onHide, children, className } = props;\n const cls = [s.panel, collapsed && s.collapsed, className].filter(Boolean).join(' ');\n const headerInteractive = onToggleCollapse !== undefined;\n return (\n <div className={cls}>\n {title !== undefined && (\n <div className={s.titleRow}>\n {headerInteractive ? (\n <button\n type=\"button\"\n className={s.titleButton}\n onClick={onToggleCollapse}\n aria-expanded={!collapsed}\n >\n <ChevronIcon\n size={16}\n className={[s.chevron, collapsed && s.chevronCollapsed].filter(Boolean).join(' ')}\n />\n <span className={s.title}>{title}</span>\n </button>\n ) : (\n <span className={s.title}>{title}</span>\n )}\n {onHide !== undefined && (\n <TooltipTrigger>\n <Focusable>\n <button\n type=\"button\"\n className={s.hideButton}\n onClick={onHide}\n aria-label=\"Hide panel\"\n >\n ×\n </button>\n </Focusable>\n <Tooltip>Hide panel</Tooltip>\n </TooltipTrigger>\n )}\n </div>\n )}\n {!collapsed && <div className={s.body}>{children}</div>}\n </div>\n );\n}\n","import type { KeyboardEvent, ReactNode } from 'react';\nimport { Focusable } from 'react-aria-components';\nimport { Tooltip, TooltipTrigger } from '../Tooltip';\nimport s from './ToolButton.module.css';\n\n/** Props for {@link ToolButton}. */\nexport interface ToolButtonProps {\n /** Icon node (typically an SVG component). */\n icon: ReactNode;\n /** Human-readable label shown under the icon. */\n label: string;\n /** Optional shortcut hint (e.g. \"V\" or \"⌘Z\"). */\n shortcut?: string;\n /** Selected/active state — toggles the active visual treatment. */\n active?: boolean;\n /** Disabled state — passes through to the underlying button. */\n disabled?: boolean;\n /**\n * When true, sets `aria-disabled=\"true\"` on the button without using the\n * native `disabled` attribute. This keeps the button focusable and reachable\n * by keyboard (roving-tabindex still applies) while marking it as ineligible\n * to screen readers. The caller is responsible for making `onClick` a no-op.\n */\n ariaDisabled?: boolean;\n /**\n * Whether this button is the currently tabbable member of its toolbar.\n * Toolbars use roving tabindex: exactly one button has `tabIndex=0` at\n * a time; the rest are `-1`. Caller manages which.\n */\n tabbable?: boolean;\n /** Click handler. */\n onClick(): void;\n /** Key handler for the underlying button — a toolbar's roving-tabindex\n * navigation attaches here. */\n onKeyDown?(e: KeyboardEvent<HTMLElement>): void;\n /**\n * Tooltip content. Defaults to `label` (plus `shortcut` if provided).\n */\n title?: string;\n /** Additional class for the root button. */\n className?: string;\n}\n\n/**\n * Generic icon-+-label toolbar button — building block for `ToolPalette`\n * and similar surfaces. Headless about layout direction (parent group\n * supplies flex direction via `ToolGroup`). Theme via `--wzl-*` tokens.\n */\nexport function ToolButton(props: ToolButtonProps) {\n const {\n icon, label, shortcut, active, disabled, ariaDisabled, tabbable,\n onClick, onKeyDown, title, className,\n } = props;\n const resolvedTitle = title ?? (shortcut ? `${label} (${shortcut})` : label);\n const cls = [s.button, active && s.active, className].filter(Boolean).join(' ');\n return (\n <TooltipTrigger isDisabled={disabled}>\n <Focusable isDisabled={disabled}>\n <button\n type=\"button\"\n tabIndex={tabbable ? 0 : -1}\n className={cls}\n aria-current={active ? 'true' : undefined}\n aria-disabled={ariaDisabled ? 'true' : undefined}\n disabled={disabled}\n onClick={onClick}\n onKeyDown={onKeyDown}\n >\n <span className={s.icon} aria-hidden=\"true\">{icon}</span>\n <span className={s.label}>{label}</span>\n {shortcut && <span className={s.shortcut}>{shortcut}</span>}\n </button>\n </Focusable>\n <Tooltip>{resolvedTitle}</Tooltip>\n </TooltipTrigger>\n );\n}\n","import type { ReactNode } from 'react';\nimport s from './ToolGroup.module.css';\n\n/** Props for {@link ToolGroup}. */\nexport interface ToolGroupProps {\n children: ReactNode;\n /**\n * Lays children along an axis. `'vertical'` (default) stacks them in\n * a column; `'horizontal'` lays them in a row. Independent of the\n * parent toolbar's own orientation.\n */\n orientation?: 'vertical' | 'horizontal';\n /**\n * Optional `data-group` attribute — useful for parents that want to\n * select the group from CSS or tests by name.\n */\n groupKey?: string;\n /** Accessible name for the group (rendered as `aria-label`). */\n ariaLabel?: string;\n className?: string;\n}\n\n/**\n * Generic toolbar group — a `role=\"group\"` flex container that arranges\n * `<ToolButton>`s (or any children) along a chosen axis. No visual chrome\n * beyond layout; theming lives on the buttons.\n */\nexport function ToolGroup(props: ToolGroupProps) {\n const { children, orientation = 'vertical', groupKey, ariaLabel, className } = props;\n const cls = [s.group, orientation === 'horizontal' && s.horizontal, className]\n .filter(Boolean).join(' ');\n return (\n <div className={cls} role=\"group\" data-group={groupKey} aria-label={ariaLabel}>\n {children}\n </div>\n );\n}\n","/** The full vocabulary of capability tags shipped in the default preset.\n * Apps and other consumers can add their own tags; this list is what\n * `weasel-modes` itself uses. */\nexport const ALL_TAGS = [\n 'navigation',\n 'creates-selection',\n 'creates-paths',\n 'creates-shapes',\n 'creates-text',\n 'edits-anchors',\n 'edits-text',\n 'transforms-selection',\n 'samples-color',\n 'applies-fill',\n 'edits-page',\n] as const;\n\n/** One capability a tool or contribution declares, and a mode allows. Any\n * string is accepted so apps can add tags of their own; `ALL_TAGS` is the\n * set this package ships. */\nexport type CapabilityTag = (typeof ALL_TAGS)[number] | (string & {});\n\n/** Tags that are implicitly allowed in every mode — never listed per-mode.\n * A tool tagged with any of these is always eligible. */\nexport const IMPLICIT_TAGS: readonly CapabilityTag[] = ['navigation'];\n\n/** Whether a string is one of the shipped `ALL_TAGS`. An app-defined tag is\n * still a valid `CapabilityTag` and will answer `false` here. */\nexport function isCapabilityTag(value: string): value is CapabilityTag {\n return (ALL_TAGS as readonly string[]).includes(value);\n}\n","import { IMPLICIT_TAGS, type CapabilityTag } from './capabilities';\n\n/** How a mode tints the workspace — the area around the page — so the user\n * can see at a glance which mode is active. */\nexport interface WorkspaceVisual {\n tint?: string;\n gradient?: 'top-down' | 'bottom-up';\n intensity?: number;\n}\n\n/**\n * A mode: an app-level editing context that narrows which tools are usable and\n * how the workspace looks. Tools live inside modes; a tool is never \"in\" one.\n *\n * `kind` picks the lifecycle. A `soft` mode (path-edit, isolation, text-edit)\n * is a scoped context with no commit ceremony — every edit inside it is\n * independently undoable and `exit` is non-destructive. A `strict` mode\n * (free-transform, crop) is a transaction: the whole session collapses to one\n * undoable step and leaving requires an explicit `commit` or `cancel`.\n */\nexport interface ModeDefinition {\n id: string;\n kind: 'soft' | 'strict';\n /** Capability tags this mode allows beyond IMPLICIT_TAGS. */\n allows: CapabilityTag[];\n /** When true, out-of-target objects dim at the renderer layer. */\n scoping: boolean;\n workspace?: WorkspaceVisual;\n entry?: { shortcut?: string; trigger?: 'double-click-target' };\n exit?: { shortcut?: string };\n commit?: { shortcut?: string };\n cancel?: { shortcut?: string };\n}\n\n/** True iff a tool carrying `toolTags` is eligible for `mode`. */\nexport function eligibleForMode(mode: ModeDefinition, toolTags: readonly CapabilityTag[]): boolean {\n if (toolTags.length === 0) return false;\n const allowed = new Set<CapabilityTag>([...mode.allows, ...IMPLICIT_TAGS]);\n for (const t of toolTags) {\n if (allowed.has(t)) return true;\n }\n return false;\n}\n","import type { ModeRegistry } from './registry';\nimport type { CapabilityTag } from './capabilities';\nimport { eligibleForMode } from './modeDefinition';\n\n/** The part of a tool this package needs in order to judge eligibility: its\n * id and the capabilities it claims. Structural, so a real `ToolDef`\n * satisfies it without this package depending on the kit. */\nexport interface ToolLike {\n id: string;\n capabilities?: readonly CapabilityTag[];\n}\n\n/** True iff `tool` is usable in the registry's currently active mode. */\nexport function eligibleTool(reg: ModeRegistry, tool: ToolLike): boolean {\n return eligibleForMode(reg.current(), tool.capabilities ?? []);\n}\n\n/** True iff a contribution is usable in the registry's active mode. */\nexport function eligibleContribution(\n reg: ModeRegistry,\n entry: { id: string; eligibility?: { capabilities?: readonly CapabilityTag[] } },\n): boolean {\n return eligibleForMode(reg.current(), entry.eligibility?.capabilities ?? []);\n}\n","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","import { Fragment, type ReactNode } from 'react';\nimport { UnknownIcon } from '@weasel-js/core';\nimport type { AnyTool, ToolsApi } from '@weasel-js/core';\nimport { eligibleContribution, type ModeRegistry } from '@weasel-js/modes';\nimport { ToolButton } from '../ToolButton';\nimport { ToolGroup } from '../ToolGroup';\nimport { useRovingTabIndex } from '../../useRovingTabIndex';\nimport s from './ToolPalette.module.css';\nimport { formatShortcut, type ShortcutInput } from './formatShortcut';\n\nconst DEFAULT_GROUP_ORDER = ['select', 'shape', 'draw', 'type', 'view'] as const;\nconst MISC = 'misc';\n\nfunction partitionByGroup(list: AnyTool[]): Map<string, AnyTool[]> {\n const groups = new Map<string, AnyTool[]>();\n for (const tool of list) {\n const g = tool.presentation?.group ?? MISC;\n const bucket = groups.get(g) ?? [];\n bucket.push(tool);\n groups.set(g, bucket);\n }\n return groups;\n}\n\nfunction orderedGroupKeys(\n groups: Map<string, AnyTool[]>,\n groupOrder: readonly string[],\n): string[] {\n const seen = new Set(groups.keys());\n const ordered: string[] = [];\n for (const known of groupOrder) {\n if (seen.has(known)) {\n ordered.push(known);\n seen.delete(known);\n }\n }\n // Unknown groups in insertion order (Map preserves it), misc last.\n for (const key of groups.keys()) {\n if (seen.has(key) && key !== MISC) {\n ordered.push(key);\n seen.delete(key);\n }\n }\n if (seen.has(MISC)) ordered.push(MISC);\n return ordered;\n}\n\nfunction resolveIcon(tool: AnyTool): ReactNode {\n const rawIcon = tool.presentation?.icon;\n if (rawIcon == null) return <UnknownIcon />;\n if (typeof rawIcon === 'function') return rawIcon(undefined);\n return rawIcon;\n}\n\n/** Props for {@link ToolPalette}. */\nexport interface ToolPaletteProps {\n tools: ToolsApi;\n orientation?: 'vertical' | 'horizontal';\n className?: string;\n /** Derive the keyboard shortcut for a tool button from the action registry.\n * Called with the tool's id; return `undefined` to suppress a chip. When\n * omitted, falls back to `tool.keybinding` (legacy path). */\n lookupShortcut?: (toolId: string) => ShortcutInput | undefined;\n /**\n * Optional mode registry. When provided, tools whose `capabilities` do not\n * match the current mode are rendered greyed-out, aria-disabled, and their\n * onClick is suppressed. When omitted, all tools are treated as eligible\n * (preserves existing behaviour in consumers that haven't wired a registry).\n */\n modeRegistry?: ModeRegistry;\n /**\n * Presentation-group display order. Groups not listed keep their registry\n * insertion order after the listed ones; `misc` always renders last.\n * Defaults to `['select', 'shape', 'draw', 'type', 'view']`.\n */\n groupOrder?: readonly string[];\n}\n\n/**\n * Toolbar of the registered tools, split into separator-divided groups by\n * each tool's presentation group and navigable by arrow keys. Clicking a\n * button makes that tool active.\n *\n * Given a `modeRegistry`, tools whose capabilities the current mode does not\n * allow render greyed out and inert rather than disappearing.\n */\nexport function ToolPalette(props: ToolPaletteProps) {\n const {\n tools, orientation = 'vertical', className, lookupShortcut, modeRegistry,\n groupOrder = DEFAULT_GROUP_ORDER,\n } = props;\n const list = Object.values(tools.registry);\n const groups = partitionByGroup(list);\n const groupKeys = orderedGroupKeys(groups, groupOrder);\n const cls = [s.palette, orientation === 'horizontal' && s.horizontal, className]\n .filter(Boolean).join(' ');\n\n // Flat, in DOM order — the roving-tabindex hook indexes by this order.\n const ordered = groupKeys.flatMap((k) => groups.get(k)!);\n const eligibility = ordered.map(\n (tool) => (modeRegistry ? eligibleContribution(modeRegistry, tool) : true),\n );\n const activeIndex = ordered.findIndex((t) => t.id === tools.active);\n const roving = useRovingTabIndex({\n items: eligibility.map((enabled) => ({ disabled: !enabled })),\n itemClassName: s.paletteBtn,\n // An ineligible active tool can't hold the tab stop; fall back to the\n // hook's first-enabled default.\n ...(activeIndex >= 0 && eligibility[activeIndex] ? { tabStopIndex: activeIndex } : {}),\n });\n let index = -1;\n\n return (\n <div\n ref={roving.rootRef}\n className={cls}\n role=\"toolbar\"\n aria-label=\"Tools\"\n >\n {groupKeys.map((key, i) => (\n <Fragment key={key}>\n {i > 0 && (\n <div\n className={s.separator}\n role=\"separator\"\n aria-orientation={orientation === 'horizontal' ? 'vertical' : 'horizontal'}\n />\n )}\n <ToolGroup orientation={orientation} groupKey={key}>\n {groups.get(key)!.map((tool) => {\n const i = ++index;\n const label = tool.presentation?.label ?? tool.id;\n const shortcut = tool.presentation?.shortcut\n ?? formatShortcut(lookupShortcut ? lookupShortcut(tool.id) : tool.keybinding);\n const enabled = eligibility[i];\n const modeName = modeRegistry ? modeRegistry.current().id : undefined;\n const resolvedTitle = !enabled && modeName\n ? `${label}${shortcut ? ` (${shortcut})` : ''} — disabled in ${modeName} mode`\n : undefined;\n return (\n <ToolButton\n key={tool.id}\n icon={resolveIcon(tool)}\n label={label}\n shortcut={shortcut}\n active={tools.active === tool.id}\n tabbable={roving.tabIndexFor(i) === 0}\n ariaDisabled={!enabled}\n className={[s.paletteBtn, !enabled && s.ineligibleBtn].filter(Boolean).join(' ')}\n title={resolvedTitle}\n onClick={enabled ? () => tools.setActive(tool.id) : () => {}}\n onKeyDown={roving.onKeyDown(i)}\n />\n );\n })}\n </ToolGroup>\n </Fragment>\n ))}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n Tabs as RACTabs,\n TabList as RACTabList,\n Tab as RACTab,\n TabPanel as RACTabPanel,\n type TabsProps as RACTabsProps,\n type TabListProps as RACTabListProps,\n type TabProps as RACTabProps,\n type TabPanelProps as RACTabPanelProps,\n} from 'react-aria-components';\nimport s from './Tabs.module.css';\n\n/** Props for {@link Tabs}, on top of React Aria's `Tabs` props. */\nexport type TabsProps = Omit<RACTabsProps, 'className' | 'children'> & {\n children?: ReactNode;\n className?: string;\n};\n\n/**\n * Tab set wrapping React Aria's Tabs, skinned against the `--wzl-*` tokens.\n * Holds a {@link TabList} and one {@link TabPanel} per tab.\n */\nexport function Tabs({ children, className, ...rest }: TabsProps) {\n return (\n <RACTabs {...rest} className={[s.tabs, className].filter(Boolean).join(' ')}>\n {children}\n </RACTabs>\n );\n}\n\n/** Props for {@link TabList}, on top of React Aria's `TabList` props. */\nexport type TabListProps<T extends object> = Omit<RACTabListProps<T>, 'className'> & {\n className?: string;\n};\n\n/** The row of tab buttons inside a {@link Tabs}. */\nexport function TabList<T extends object>({ className, ...rest }: TabListProps<T>) {\n return <RACTabList<T> {...rest} className={[s.list, className].filter(Boolean).join(' ')} />;\n}\n\n/** Props for {@link Tab}, on top of React Aria's `Tab` props. */\nexport type TabProps = Omit<RACTabProps, 'className' | 'children'> & {\n children?: ReactNode;\n className?: string;\n};\n\n/** One tab button. Its `id` selects the {@link TabPanel} it reveals. */\nexport function Tab({ children, className, ...rest }: TabProps) {\n return (\n <RACTab {...rest} className={[s.tab, className].filter(Boolean).join(' ')}>\n {children}\n </RACTab>\n );\n}\n\n/** Props for {@link TabPanel}, on top of React Aria's `TabPanel` props. */\nexport type TabPanelProps = Omit<RACTabPanelProps, 'className' | 'children'> & {\n children?: ReactNode;\n className?: string;\n};\n\n/** The content shown for the {@link Tab} whose `id` matches this panel's. */\nexport function TabPanel({ children, className, ...rest }: TabPanelProps) {\n return (\n <RACTabPanel {...rest} className={[s.panel, className].filter(Boolean).join(' ')}>\n {children}\n </RACTabPanel>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n Button as RACButton,\n Menu as RACMenu,\n MenuItem as RACMenuItem,\n MenuTrigger,\n Popover as RACPopover,\n} from 'react-aria-components';\nimport { useOverlayPortal, type OverlayPortalProps } from '../../overlays/portalHost';\nimport s from './MenuButton.module.css';\n\n/** One row in a {@link MenuButton}'s list. */\nexport type MenuButtonItem<T extends string = string> = {\n value: T;\n label: ReactNode;\n isDisabled?: boolean;\n /** Plain-text form of `label`, for type-to-select and screen readers. A\n * string label supplies this itself. */\n textValue?: string;\n};\n\n/** Props for {@link MenuButton}. */\nexport type MenuButtonProps<T extends string = string> = {\n /** What the button says. It never changes to show a chosen row. */\n label: ReactNode;\n items: ReadonlyArray<MenuButtonItem<T>>;\n /** Fired with the value of the row chosen. */\n onAction: (value: T) => void;\n isDisabled?: boolean;\n className?: string;\n 'aria-label'?: string;\n} & OverlayPortalProps;\n\n/**\n * A button that opens a list and acts on the row chosen — \"Add trial…\",\n * \"Load…\". Unlike a {@link Select} it holds no value, so it sizes to its own\n * label rather than to its widest row.\n */\nexport function MenuButton<T extends string = string>({\n label,\n items,\n onAction,\n isDisabled,\n className,\n 'aria-label': ariaLabel,\n portalContainer,\n}: MenuButtonProps<T>) {\n const { anchor, portalProps } = useOverlayPortal(portalContainer);\n return (\n <MenuTrigger>\n {anchor}\n <RACButton\n className={[s.trigger, className].filter(Boolean).join(' ')}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n >\n <span className={s.label}>{label}</span>\n <svg className={s.chevron} viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <path d=\"M2 4 L5 7 L8 4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </RACButton>\n {/* `data-weasel-overlay`: see Select — the list renders in a portal,\n outside the subtree the trigger sits in. */}\n <RACPopover className={s.popover} data-weasel-overlay=\"\" {...portalProps}>\n <RACMenu className={s.menu} onAction={(key) => onAction(key as T)}>\n {items.map((item) => (\n <RACMenuItem\n key={item.value}\n id={item.value}\n className={s.item}\n isDisabled={item.isDisabled}\n textValue={item.textValue ?? (typeof item.label === 'string' ? item.label : undefined)}\n >\n {item.label}\n </RACMenuItem>\n ))}\n </RACMenu>\n </RACPopover>\n </MenuTrigger>\n );\n}\n","import { Children, isValidElement, useContext, type KeyboardEvent, type ReactNode } from 'react';\nimport {\n ComboBox as RACComboBox,\n ComboBoxStateContext,\n Label,\n Input as RACInput,\n Button as RACButton,\n Popover as RACPopover,\n ListBox as RACListBox,\n ListBoxItem as RACListBoxItem,\n Text,\n FieldError,\n type ComboBoxProps as RACComboBoxProps,\n type ListBoxItemProps as RACListBoxItemProps,\n type ValidationResult,\n} from 'react-aria-components';\nimport { fieldClasses } from '../Field/Field';\nimport { useOverlayPortal, type OverlayPortalProps } from '../../overlays/portalHost';\nimport s from './ComboBox.module.css';\n\n/**\n * One option in a {@link ComboBox}'s `options` list. `textValue` is the\n * plain-text form used for filtering and screen readers, needed only when\n * `label` isn't a bare string.\n */\nexport type ComboBoxOption = {\n value: string;\n label: ReactNode;\n textValue?: string;\n isDisabled?: boolean;\n};\n\ntype Key = string | number;\n\n/**\n * How the typed text narrows the options.\n *\n * `'contains'` is a locale-aware substring match over each option's text.\n * `'none'` shows every option given — what a list a server already filtered\n * and ranked needs, since a second pass would drop rows that do not contain\n * the query and reorder whatever survived.\n */\nexport type ComboBoxFilter = 'contains' | 'none' | ((textValue: string, inputValue: string) => boolean);\n\n/** What the user committed: an option they picked, or text they typed. */\nexport type ComboBoxCommit<T extends Key = string> =\n | { source: 'option'; key: T }\n | { source: 'text'; text: string };\n\nconst admitEverything = () => true;\n\n/**\n * Props for {@link ComboBox}, on top of React Aria's `ComboBox` props, with\n * the selection key narrowed to the option value type.\n */\nexport type ComboBoxProps<T extends Key = string> = Omit<RACComboBoxProps<object>, 'children' | 'className' | 'selectedKey' | 'defaultSelectedKey' | 'onSelectionChange'> & {\n label?: ReactNode;\n description?: ReactNode;\n errorMessage?: ReactNode | ((v: ValidationResult) => ReactNode);\n placeholder?: string;\n options?: ReadonlyArray<ComboBoxOption & { value: T }>;\n children?: ReactNode;\n selectedKey?: T | null;\n defaultSelectedKey?: T;\n onSelectionChange?: (key: T | null) => void;\n emptyLabel?: ReactNode;\n /** Shown in place of `emptyLabel` while `loadError` is set. */\n errorLabel?: ReactNode;\n /**\n * How typed text narrows `options`. Defaults to `'contains'`. `'none'` also\n * keeps the popover open on an empty collection: a list the kit does not\n * filter can arrive empty from a server mid-query, and without that the\n * popover closes and `emptyLabel` is never seen.\n */\n filter?: ComboBoxFilter;\n /** Marks the options as out of date while the next set is being fetched. */\n isLoading?: boolean;\n /** A failed load, shown as `errorLabel` rather than as an empty corpus. */\n loadError?: unknown | null;\n /**\n * Fires when the user commits — Enter on the active option, a click on one,\n * or Enter on text matching none of them when `allowsCustomValue` is set.\n * Empty text commits nothing.\n */\n onCommit?: (commit: ComboBoxCommit<T>) => void;\n /**\n * `'fill'` (the default) takes the width of whatever row the combo box sits\n * in. `'fit'` sizes the input to its widest option, so it neither swallows a\n * toolbar's slack nor cuts a selection off once one is made.\n */\n width?: 'fill' | 'fit';\n className?: string;\n} & OverlayPortalProps;\n\n/**\n * Filterable single-select wrapping React Aria's ComboBox. The user can\n * type to filter; selection commits to `onSelectionChange`. When no value\n * is in the input, selection clears (key becomes null).\n */\nexport function ComboBox<T extends Key = string>(props: ComboBoxProps<T>) {\n const {\n label,\n description,\n errorMessage,\n placeholder,\n options,\n children,\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n emptyLabel = 'No matches',\n errorLabel = \"Couldn't load options\",\n filter = 'contains',\n isLoading,\n loadError = null,\n onCommit,\n width = 'fill',\n className,\n portalContainer,\n ...rest\n } = props;\n\n const { anchor, portalProps } = useOverlayPortal(portalContainer);\n\n return (\n <RACComboBox\n {...rest}\n // 'contains' leaves this unset so React Aria uses its own locale-aware\n // match rather than a reimplementation of it.\n defaultFilter={filter === 'none' ? admitEverything : filter === 'contains' ? undefined : filter}\n allowsEmptyCollection={rest.allowsEmptyCollection ?? filter === 'none'}\n selectedKey={selectedKey}\n defaultSelectedKey={defaultSelectedKey}\n onSelectionChange={(k) => {\n onSelectionChange?.(k as T | null);\n if (k !== null) onCommit?.({ source: 'option', key: k as T });\n }}\n className={[s.field, width === 'fit' && s.fit, fieldClasses.root, className]\n .filter(Boolean)\n .join(' ')}\n >\n {anchor}\n {label !== undefined && <Label className={fieldClasses.label}>{label}</Label>}\n <ComboBoxFrame\n placeholder={placeholder}\n isLoading={isLoading}\n onCommitText={onCommit && ((text) => onCommit({ source: 'text', text }))}\n >\n {width === 'fit' && (\n <span className={s.sizer} aria-hidden=\"true\">\n {placeholder !== undefined && <span>{placeholder}</span>}\n {optionLabels(options, children).map((l, i) => (\n <span key={i}>{l}</span>\n ))}\n </span>\n )}\n </ComboBoxFrame>\n {description !== undefined && (\n <Text slot=\"description\" className={fieldClasses.hint}>\n {description}\n </Text>\n )}\n <FieldError className={fieldClasses.error}>{errorMessage}</FieldError>\n <RACPopover className={s.popover} data-weasel-overlay=\"\" {...portalProps}>\n <RACListBox\n className={s.listbox}\n renderEmptyState={() =>\n loadError !== null ? (\n <div className={s.error} role=\"alert\">{errorLabel}</div>\n ) : (\n <div className={s.empty}>{emptyLabel}</div>\n )\n }\n >\n {options !== undefined\n ? options.map((o) => (\n <ComboBoxItem key={String(o.value)} id={o.value} textValue={o.textValue} isDisabled={o.isDisabled}>\n {o.label}\n </ComboBoxItem>\n ))\n : children}\n </RACListBox>\n </RACPopover>\n </RACComboBox>\n );\n}\n\n/**\n * The input and its trigger. Split out so it can read `ComboBoxStateContext`,\n * which only exists below `RACComboBox`.\n */\nfunction ComboBoxFrame({\n placeholder,\n isLoading,\n onCommitText,\n children,\n}: {\n placeholder?: string;\n isLoading?: boolean;\n onCommitText?: (text: string) => void;\n children?: ReactNode;\n}) {\n const state = useContext(ComboBoxStateContext);\n\n // Capture, not bubble: React Aria's own Enter handler runs on the way up and\n // clears the focused key, so by then there is no way to tell an option\n // commit from a text one.\n const onKeyDownCapture = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key !== 'Enter' || e.nativeEvent.isComposing) return;\n if (state?.isOpen && state.selectionManager.focusedKey != null) return;\n const text = e.currentTarget.value;\n if (text !== '') onCommitText?.(text);\n };\n\n return (\n <div className={s.frame}>\n <RACInput\n placeholder={placeholder}\n aria-busy={isLoading || undefined}\n onKeyDownCapture={onCommitText ? onKeyDownCapture : undefined}\n />\n {children}\n <RACButton className={s.openButton} aria-label=\"Show options\">\n <svg viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <path d=\"M2 4 L5 7 L8 4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </RACButton>\n </div>\n );\n}\n\n/**\n * The labels a `width='fit'` input measures itself against. In the children\n * form the label sits one element deep, inside a `ComboBoxItem`.\n */\nfunction optionLabels(\n options: ReadonlyArray<ComboBoxOption> | undefined,\n children: ReactNode,\n): ReactNode[] {\n if (options !== undefined) return options.map((o) => o.label);\n return Children.toArray(children).map((c) =>\n isValidElement<{ children?: ReactNode }>(c) ? c.props.children : c,\n );\n}\n\n/** Props for {@link ComboBoxItem}, on top of React Aria's `ListBoxItem` props. */\nexport type ComboBoxItemProps = Omit<RACListBoxItemProps, 'className'> & {\n className?: string;\n};\n\n/** One row in a {@link ComboBox}'s filtered list. */\nexport function ComboBoxItem({ className, ...rest }: ComboBoxItemProps) {\n return <RACListBoxItem {...rest} className={[s.option, className].filter(Boolean).join(' ')} />;\n}\n","import { useCallback, useEffect, useId, useRef, type ReactNode, type RefObject } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n DialogTrigger,\n Popover as RACPopover,\n OverlayArrow,\n Dialog as RACDialog,\n Heading,\n type PopoverProps as RACPopoverProps,\n} from 'react-aria-components';\nimport { useOverlayPortal, type OverlayPortalProps, type WithoutPortalTarget } from '../../overlays/portalHost';\nimport s from './Callout.module.css';\n\n/** Accent color of a {@link Callout}'s border and arrow. */\nexport type CalloutTone = 'info' | 'warning' | 'danger';\n\n/**\n * Composition wrapper for press-to-open callouts:\n * `<CalloutTrigger><Pressable>…</Pressable><Callout>…</Callout></CalloutTrigger>`.\n * Re-exported RAC DialogTrigger — non-RAC trigger elements must be wrapped\n * in `<Pressable>` from react-aria-components.\n * In composed mode, put `defaultOpen` on `CalloutTrigger`, not `Callout` —\n * RAC detaches to local open state on the trigger, not the popover.\n */\nexport { DialogTrigger as CalloutTrigger };\n\n/** Props for {@link Callout}, on top of React Aria's `Popover` props. */\nexport type CalloutProps = Omit<\n WithoutPortalTarget<RACPopoverProps>,\n 'children' | 'className' | 'isNonModal' | 'triggerRef'\n> &\n OverlayPortalProps & {\n children?: ReactNode;\n className?: string;\n /** Optional heading rendered above the body. */\n title?: ReactNode;\n /** Footer slot — typically action buttons. */\n footer?: ReactNode;\n /** Accent tone for border + arrow. Default `info`. */\n tone?: CalloutTone;\n /**\n * `true` — blocks interaction with the rest of the app until dismissed;\n * inner dialog is `role=\"alertdialog\"`. `false` (default) — non-blocking:\n * the app stays interactive; Esc / outside click / close button dismiss.\n */\n modal?: boolean;\n /**\n * Show the × button. Defaults to `!modal`. In programmatic\n * `triggerRef`/`anchorRect` modes the close button needs controlled open\n * (`isOpen` + `onOpenChange`); with only `defaultOpen` it has no open-state\n * setter to call and cannot close.\n */\n showCloseButton?: boolean;\n /**\n * The user asked for this callout to go away — the × button or Escape.\n *\n * Distinct from `onOpenChange`, which a non-modal popover *also* fires when\n * interaction or focus merely leaves it. On a canvas that's every click on\n * the artwork, so a consumer that pins `isOpen` and treats `onOpenChange`\n * as dismissal retires messages nobody read. Use this instead: it fires\n * only on a deliberate act, and never on incidental focus loss.\n */\n onDismiss?: () => void;\n /** Anchor to an arbitrary element (programmatic use, with `isOpen`). */\n triggerRef?: RefObject<Element | null>;\n /**\n * Anchor to a client-coordinate rect — e.g. a scene node's on-screen box.\n * The callout re-anchors whenever this rect changes, so a consumer that\n * recomputes it on pan, zoom, or scene edits keeps the arrow on its target.\n * Takes precedence over `triggerRef`.\n */\n anchorRect?: { x: number; y: number; width: number; height: number };\n };\n\nconst toneClass: Record<CalloutTone, string> = {\n info: s.toneInfo,\n warning: s.toneWarning,\n danger: s.toneDanger,\n};\n\n/**\n * Anchored callout with an arrow pointing at its source — a trigger\n * element, an arbitrary `triggerRef`, or a client-space `anchorRect`.\n * Wraps React Aria Popover + Dialog; positioning, collision flipping,\n * dismissal, and focus behavior come from the underlying primitives.\n */\nexport function Callout(props: CalloutProps) {\n const {\n children,\n className,\n title,\n footer,\n tone = 'info',\n modal = false,\n showCloseButton,\n onDismiss,\n triggerRef,\n anchorRect,\n placement = 'top',\n offset = 12,\n maxHeight = 400,\n onOpenChange,\n shouldCloseOnInteractOutside,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n portalContainer,\n ...rest\n } = props;\n const anchorRef = useRef<HTMLSpanElement>(null);\n const { anchor: portalAnchor, portalProps } = useOverlayPortal(portalContainer);\n const showClose = showCloseButton ?? !modal;\n // Escape is a dismissal like the × is. It can't ride on a React `onKeyDown`:\n // RAC's Dialog runs its props through filterDOMProps, which drops handlers\n // it doesn't know, so the listener goes on the section itself. RAC's own\n // Escape handling is untouched — this only adds the signal.\n const onDismissRef = useRef(onDismiss);\n onDismissRef.current = onDismiss;\n const escapeListener = useRef((e: KeyboardEvent) => {\n if (e.key === 'Escape') onDismissRef.current?.();\n });\n const listeningTo = useRef<HTMLElement | null>(null);\n const dialogRef = useCallback((node: HTMLElement | null) => {\n listeningTo.current?.removeEventListener('keydown', escapeListener.current);\n listeningTo.current = node;\n node?.addEventListener('keydown', escapeListener.current);\n }, []);\n const titleId = useId();\n // RAC positions on open and recomputes on scroll, resize, and a\n // ResizeObserver on the anchor — none of which fire when `anchorRect` is\n // merely *translated*, as it is when a consumer tracks a scene node across a\n // pan. (Zoom happens to work, since scaling also changes the anchor's size.)\n // Nudging RAC's own resize listener is the supported way to make it\n // recompute; there's no public updatePosition on Popover.\n const hasAnchorRect = anchorRect !== undefined;\n useEffect(() => {\n if (!hasAnchorRect || typeof window === 'undefined') return;\n window.dispatchEvent(new Event('resize'));\n }, [hasAnchorRect, anchorRect?.x, anchorRect?.y, anchorRect?.width, anchorRect?.height]);\n // RAC's popover role-heuristic misses alertdialog; label the outer role\n // it stamps. Upstream: react-spectrum Popover.mjs querySelector('[role=dialog]').\n const popoverAriaLabelledby =\n modal && title !== undefined ? titleId : ariaLabelledby;\n const popoverAriaLabel = modal ? ariaLabel : undefined;\n return (\n <>\n {portalAnchor}\n {/* Harmless while closed — RAC reads the ref only when the popover is open. */}\n {anchorRect !== undefined &&\n createPortal(\n <span\n ref={anchorRef}\n data-callout-anchor=\"\"\n className={s.anchor}\n aria-hidden=\"true\"\n // Dynamic geometry — inline style is the mechanism here, not styling.\n style={{\n left: anchorRect.x,\n top: anchorRect.y,\n width: anchorRect.width,\n height: anchorRect.height,\n }}\n />,\n document.body,\n )}\n <RACPopover\n {...rest}\n triggerRef={anchorRect !== undefined ? anchorRef : triggerRef}\n isNonModal={!modal}\n placement={placement}\n offset={offset}\n maxHeight={maxHeight}\n onOpenChange={onOpenChange}\n shouldCloseOnInteractOutside={\n shouldCloseOnInteractOutside ?? (modal ? () => false : undefined)\n }\n aria-label={popoverAriaLabel}\n aria-labelledby={popoverAriaLabelledby}\n className={[s.popover, toneClass[tone], className].filter(Boolean).join(' ')}\n data-weasel-overlay=\"\"\n {...portalProps}\n >\n <OverlayArrow className={s.arrow}>\n <svg width={12} height={12} viewBox=\"0 0 12 12\" aria-hidden=\"true\">\n <path d=\"M0 0 L6 6 L12 0\" />\n </svg>\n </OverlayArrow>\n <RACDialog\n role={modal ? 'alertdialog' : 'dialog'}\n className={s.dialog}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n ref={dialogRef}\n >\n {({ close }) => (\n <>\n {(title !== undefined || showClose) && (\n <header className={s.header}>\n {title !== undefined && (\n <Heading id={titleId} slot=\"title\" className={s.title}>\n {title}\n </Heading>\n )}\n {showClose && (\n <button\n type=\"button\"\n className={s.close}\n onClick={() => {\n // `close()` resolves OverlayTriggerStateContext, only\n // provided by DialogTrigger (composed mode). In\n // triggerRef/anchorRect modes there is no such\n // context, so `close()` is a no-op there — the\n // controlled-open fallback below does the work.\n close();\n onOpenChange?.(false);\n onDismiss?.();\n }}\n aria-label=\"Close callout\"\n >\n ×\n </button>\n )}\n </header>\n )}\n <div className={s.body}>{children}</div>\n {footer !== undefined && <footer className={s.footer}>{footer}</footer>}\n </>\n )}\n </RACDialog>\n </RACPopover>\n </>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport {\n CurveEditor,\n type AnchorRenderProps,\n type ControlPoint,\n type CurveEditorProps,\n} from '../CurveEditor';\nimport type { GridSettings, AxesSettings, TickSettings } from '../Plot2D';\n\n/** Props for {@link PointPlotter}. */\nexport interface PointPlotterProps {\n /** Plotted points; caller-owned. */\n value: readonly ControlPoint[];\n /** Fires every frame during drag with the live in-flight value. */\n onInput: (next: ControlPoint[]) => void;\n /** Fires once per discrete user action (drag-end, add, delete) with\n * the new value and the value at gesture start. Wire history here. */\n onChange?: (next: ControlPoint[], prev: readonly ControlPoint[]) => void;\n /** Model-space x range. Default [0, 1]. */\n xRange?: readonly [number, number];\n /** Model-space y range. Default [0, 1]. */\n yRange?: readonly [number, number];\n width: number;\n height: number;\n grid?: GridSettings | false | null;\n axes?: AxesSettings | false | null;\n xTicks?: TickSettings | false | null;\n yTicks?: TickSettings | false | null;\n /** Minimum allowed point count. User-initiated deletion is refused\n * while `value.length <= minPoints`. */\n minPoints?: number;\n /** Maximum allowed point count. User-initiated insertion is refused\n * while `value.length >= maxPoints`. */\n maxPoints?: number;\n /** How new points are added. Default `'click-empty'`. Set to `'never'`\n * to disable insertion entirely. */\n addPointMode?: 'click-empty' | 'never';\n /** Built-in undo/redo via keyboard when the component has focus.\n * Default `true`. See `CurveEditor.history` for details. */\n history?: boolean;\n /** Custom per-anchor renderer. See `CurveEditor.renderAnchor`. */\n renderAnchor?: (info: AnchorRenderProps) => ReactNode;\n /** Extra SVG content beneath the anchors. See `CurveEditor.decorations`. */\n decorations?: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * 2D point plotter — a CurveEditor with the curve hidden. Anchors,\n * drag, shift+click delete, right-click delete, and click-empty insert\n * are inherited from CurveEditor verbatim, so the two components share\n * gesture semantics and stay in sync as CurveEditor evolves.\n *\n * Differences from CurveEditor: no curve `<path>` drawn, no fill, no\n * endpoint pinning, no interpolation, default `addPointMode` is\n * `'click-empty'` (CurveEditor defaults to `'click-curve'`, which\n * doesn't make sense without a curve to hit-test against).\n */\nexport function PointPlotter(props: PointPlotterProps) {\n const curveProps: CurveEditorProps = {\n ...props,\n addPointMode: props.addPointMode ?? 'click-empty',\n curve: false,\n fill: false,\n endpoints: 'free',\n };\n return <CurveEditor {...curveProps} />;\n}\n","const HEX = /^#(?:[\\da-f]{3,4}|[\\da-f]{6}|[\\da-f]{8})$/i;\nconst RGB = /^rgba?\\(\\s*(\\d{1,3})[\\s,]+(\\d{1,3})[\\s,]+(\\d{1,3})\\b/i;\nconst COLOR_FUNCTION = /^(?:rgba?|hsla?|hwb|lab|lch|oklab|oklch|color|color-mix)\\(.+\\)$/i;\nconst KEYWORDS = new Set([\n 'transparent',\n 'currentcolor',\n 'black',\n 'white',\n 'gray',\n 'silver',\n 'red',\n 'orange',\n 'yellow',\n 'gold',\n 'lime',\n 'green',\n 'teal',\n 'cyan',\n 'blue',\n 'navy',\n 'purple',\n 'magenta',\n 'pink',\n 'brown',\n]);\n\ntype Supports = ((value: string) => boolean) | null;\n\nfunction browserSupports(): Supports {\n return typeof CSS !== 'undefined' && typeof CSS.supports === 'function'\n ? (value) => CSS.supports('color', value)\n : null;\n}\n\n/** Whether `value` is a CSS color — the browser's answer where it has `CSS.supports`, a small parser's otherwise. */\nexport function parsesAsColor(value: string, supports: Supports = browserSupports()): boolean {\n const v = value.trim();\n // `CSS.supports` accepts any `var()` for any property.\n if (!v || v.includes('var(')) return false;\n if (supports) return supports(v);\n return HEX.test(v) || COLOR_FUNCTION.test(v) || KEYWORDS.has(v.toLowerCase());\n}\n\nfunction hexOf(v: string): string | null {\n if (HEX.test(v)) {\n const digits = v.slice(1).toLowerCase();\n return `#${digits.length <= 4 ? [...digits.slice(0, 3)].map((d) => d + d).join('') : digits.slice(0, 6)}`;\n }\n const rgb = RGB.exec(v);\n return rgb\n ? `#${rgb\n .slice(1, 4)\n .map((n) => Math.min(255, Number(n)).toString(16).padStart(2, '0'))\n .join('')}`\n : null;\n}\n\nlet paint: CanvasRenderingContext2D | null | undefined;\n\n/** The browser's serialization of a color, through a canvas fill style; null where it has none or rejects `value`. */\nfunction serialized(value: string): string | null {\n if (paint === undefined) {\n try {\n paint = document.createElement('canvas').getContext('2d');\n } catch {\n paint = null;\n }\n }\n if (!paint) return null;\n // A rejected value leaves the previous fill style, so two different ones tell a rejection apart.\n paint.fillStyle = '#000000';\n paint.fillStyle = value;\n const onBlack = String(paint.fillStyle);\n paint.fillStyle = '#ffffff';\n paint.fillStyle = value;\n return onBlack === String(paint.fillStyle) ? onBlack : null;\n}\n\n/** `value` as the `#rrggbb` a color input takes, alpha dropped; null when it cannot be converted. */\nexport function toHex(value: string): string | null {\n const v = value.trim();\n const direct = hexOf(v);\n if (direct) return direct;\n const browser = typeof document === 'undefined' ? null : serialized(v);\n return browser && browser !== v ? hexOf(browser) : null;\n}\n","import { parsesAsColor } from './color';\n\n/** A design token as `TokenPanel` edits it. */\nexport interface TokenEntry {\n /** The custom property, e.g. `--wzl-gray-50`. */\n name: string;\n /** A DTCG type name. A type the panel has no control for edits as text. */\n type: string;\n /** Tokens sharing a group sit together; a color group large enough draws as one row of swatches. */\n group: string;\n value: string;\n /** Whether `value` overrides the token's own, which offers Reset. */\n overridden?: boolean;\n description?: string;\n}\n\nexport type TokenCategory = 'color' | 'type' | 'size' | 'motion' | 'depth' | 'other';\n\n/** The panel's sections, in the order it draws them. */\nexport const TOKEN_CATEGORIES: readonly { id: TokenCategory; title: string }[] = [\n { id: 'color', title: 'Color' },\n { id: 'type', title: 'Type' },\n { id: 'size', title: 'Size' },\n { id: 'motion', title: 'Motion' },\n { id: 'depth', title: 'Depth' },\n { id: 'other', title: 'Other' },\n];\n\nconst TYPE_SCALE = /^(?:font|tracking|leading|letter|line-height)/;\n\n/** The section a token is filed under: by its type, and for a bare dimension or number by its group. */\nexport function tokenCategory(token: TokenEntry): TokenCategory {\n switch (token.type) {\n case 'color':\n return 'color';\n case 'fontFamily':\n case 'fontWeight':\n return 'type';\n case 'duration':\n case 'cubicBezier':\n return 'motion';\n case 'shadow':\n case 'gradient':\n return 'depth';\n case 'dimension':\n case 'number':\n if (TYPE_SCALE.test(token.group)) return 'type';\n if (token.type === 'number' && (token.group === 'z' || token.group === 'z-index')) return 'depth';\n return 'size';\n default:\n return 'other';\n }\n}\n\nconst AMOUNT = String.raw`-?(?:\\d+\\.?\\d*|\\.\\d+)`;\nconst DIMENSION = new RegExp(\n `^${AMOUNT}(?:px|rem|em|%|ch|ex|lh|rlh|vh|vw|vmin|vmax|svh|lvh|dvh|cqw|cqh|pt|pc|cm|mm|in|q)$`,\n 'i',\n);\nconst DURATION = new RegExp(`^${AMOUNT}m?s$`);\nconst NUMBER = new RegExp(`^${AMOUNT}$`);\nconst LENGTH = new RegExp(`^${AMOUNT}(?:px|rem|em)?$`);\nconst BEZIER = new RegExp(`^cubic-bezier\\\\(\\\\s*(${AMOUNT})\\\\s*,\\\\s*(${AMOUNT})\\\\s*,\\\\s*(${AMOUNT})\\\\s*,\\\\s*(${AMOUNT})\\\\s*\\\\)$`, 'i');\nconst GRADIENT = /^(?:repeating-)?(?:linear|radial|conic)-gradient\\(/i;\n/** Commas outside parentheses: a shadow's layers, not a color function's arguments. */\nconst LAYERS = /,(?![^(]*\\))/;\nconst PARTS = /[a-z-]+\\([^)]*\\)|\\S+/gi;\n\nfunction isShadow(value: string): boolean {\n return value.split(LAYERS).every((layer) => {\n const parts = layer.trim().replace(/^inset\\s+/i, '').match(PARTS) ?? [];\n const lengths = parts.filter((part) => LENGTH.test(part));\n const rest = parts.filter((part) => !LENGTH.test(part));\n return lengths.length >= 2 && lengths.length <= 4 && rest.length <= 1 && rest.every((part) => parsesAsColor(part));\n });\n}\n\n/** A DTCG type read off the shape of a value, for a token that arrives without one. `'string'` when nothing fits. */\nexport function inferTokenType(value: string): string {\n const v = value.trim();\n if (!v) return 'string';\n if (DURATION.test(v)) return 'duration';\n if (DIMENSION.test(v)) return 'dimension';\n if (NUMBER.test(v)) return 'number';\n if (BEZIER.test(v)) return 'cubicBezier';\n if (GRADIENT.test(v)) return 'gradient';\n if (parsesAsColor(v)) return 'color';\n if (isShadow(v)) return 'shadow';\n return 'string';\n}\n\n/** A number and its unit, or null for a value that is not one. */\nexport function splitUnit(value: string): { amount: number; unit: string } | null {\n const match = new RegExp(`^(${AMOUNT})([a-z%]*)$`, 'i').exec(value.trim());\n return match ? { amount: Number(match[1]), unit: match[2] ?? '' } : null;\n}\n\n/** The four control points of a `cubic-bezier()`, or null for any other easing. */\nexport function bezierPoints(value: string): readonly [number, number, number, number] | null {\n const match = BEZIER.exec(value.trim());\n if (!match) return null;\n const [x1, y1, x2, y2] = match.slice(1, 5).map(Number) as [number, number, number, number];\n return [x1, y1, x2, y2];\n}\n","import { type CSSProperties, memo, useCallback, useMemo, useState } from 'react';\nimport { Button } from '../Button';\nimport { DisclosureRow } from '../Disclosure';\nimport { Input } from '../Input';\nimport { NumberField } from '../NumberField';\nimport { Select } from '../Select';\nimport { toHex } from './color';\nimport s from './TokenPanel.module.css';\nimport {\n bezierPoints,\n splitUnit,\n TOKEN_CATEGORIES,\n type TokenCategory,\n type TokenEntry,\n tokenCategory,\n} from './tokenTypes';\n\ntype OnChange = (name: string, value: string | null) => void;\n\n/** Props for `<TokenPanel>`. */\nexport interface TokenPanelProps {\n tokens: readonly TokenEntry[];\n /** A token's new value, or null to drop its override. Keep it stable: rows re-render only when it or their token changes. */\n onChange: OnChange;\n /** Sections held closed, by category. Omit to let the panel keep that state itself. */\n collapsed?: Readonly<Partial<Record<TokenCategory, boolean>>>;\n onCollapsedChange?: (category: TokenCategory, collapsed: boolean) => void;\n /** Files a token under a section. Defaults to `tokenCategory`. */\n categorize?: (token: TokenEntry) => TokenCategory;\n /** The fewest colors sharing a group that draw as one row of swatches. Default 3. */\n familySize?: number;\n /**\n * Row layout. `tight` puts a token on one line — name, control, Reset — with the\n * names on a fixed rail so the values read down the panel as a column, and caps\n * the field rather than letting it span the panel. Default `normal` stacks the\n * control under its name.\n */\n density?: 'tight' | 'normal';\n className?: string;\n}\n\nconst WEIGHTS = ['100', '200', '300', '400', '500', '600', '700', '800', '900'];\nconst NUMBER_FORMAT = { maximumFractionDigits: 4, useGrouping: false } as const;\n\ntype Item = { kind: 'row'; token: TokenEntry } | { kind: 'family'; group: string; tokens: TokenEntry[] };\n\nfunction itemsOf(tokens: readonly TokenEntry[], familySize: number): Item[] {\n const colors = new Map<string, number>();\n for (const token of tokens) if (token.type === 'color') colors.set(token.group, (colors.get(token.group) ?? 0) + 1);\n const families = new Map<string, Extract<Item, { kind: 'family' }>>();\n const items: Item[] = [];\n for (const token of tokens) {\n if (token.type !== 'color' || (colors.get(token.group) ?? 0) < familySize) {\n items.push({ kind: 'row', token });\n continue;\n }\n let family = families.get(token.group);\n if (!family) {\n family = { kind: 'family', group: token.group, tokens: [] };\n families.set(token.group, family);\n items.push(family);\n }\n family.tokens.push(token);\n }\n return items;\n}\n\nfunction Curve({ points, label }: { points: readonly [number, number, number, number]; label: string }) {\n const [x1, y1, x2, y2] = points;\n // y is flipped so the curve rises, and the box grows to hold an overshoot.\n const top = Math.min(0, 1 - y1, 1 - y2);\n const bottom = Math.max(1, 1 - y1, 1 - y2);\n return (\n <svg className={s.curve} viewBox={`-0.1 ${top - 0.1} 1.2 ${bottom - top + 0.2}`} role=\"img\" aria-label={label}>\n <path d={`M0 1 C${x1} ${1 - y1} ${x2} ${1 - y2} 1 0`} fill=\"none\" stroke=\"currentColor\" strokeWidth={0.08} />\n </svg>\n );\n}\n\nfunction TokenControl({ token, set }: { token: TokenEntry; set: (value: string) => void }) {\n const { name, type, value } = token;\n const label = `${name} value`;\n const hex = useMemo(() => (type === 'color' ? toHex(value) : null), [type, value]);\n\n if (type === 'dimension' || type === 'duration' || type === 'number') {\n const split = splitUnit(value);\n if (split) {\n return (\n <>\n <NumberField\n className={s.number}\n aria-label={label}\n value={split.amount}\n hideSteppers\n formatOptions={NUMBER_FORMAT}\n onChange={(amount) => {\n if (Number.isFinite(amount)) set(`${amount}${split.unit}`);\n }}\n />\n {split.unit ? <span className={s.unit}>{split.unit}</span> : null}\n </>\n );\n }\n }\n\n if (type === 'fontWeight') {\n const options = (WEIGHTS.includes(value) ? WEIGHTS : [...WEIGHTS, value]).map((weight) => ({\n value: weight,\n label: weight,\n }));\n return <Select aria-label={name} width=\"fit\" selectedKey={value} options={options} onSelectionChange={set} />;\n }\n\n const points = type === 'cubicBezier' ? bezierPoints(value) : null;\n return (\n <>\n {points ? <Curve points={points} label={`${name} curve`} /> : null}\n <Input\n className={s.field}\n aria-label={label}\n value={value}\n onChange={set}\n leadingAdornment={\n type !== 'color' ? undefined : hex ? (\n <input\n type=\"color\"\n className={s.swatchInput}\n aria-label={`${name} color`}\n value={hex}\n onChange={(event) => set(event.target.value)}\n />\n ) : (\n <span className={s.chip} style={{ '--token-color': value } as CSSProperties} aria-hidden=\"true\" />\n )\n }\n />\n </>\n );\n}\n\nconst TokenRow = memo(\n function TokenRow({ token, onChange }: { token: TokenEntry; onChange: OnChange }) {\n const set = useCallback((value: string) => onChange(token.name, value), [onChange, token.name]);\n return (\n <div className={s.row} role=\"group\" aria-label={token.name}>\n <span className={s.name} title={token.description || token.name}>\n {token.name}\n </span>\n <div className={s.edit}>\n <TokenControl token={token} set={set} />\n {token.overridden ? (\n <Button variant=\"ghost\" size=\"sm\" ariaLabel={`Reset ${token.name}`} onClick={() => onChange(token.name, null)}>\n Reset\n </Button>\n ) : null}\n </div>\n </div>\n );\n },\n // Consumers rebuild their entries each render; a row only has to redraw when what it shows changed.\n (a, b) =>\n a.onChange === b.onChange &&\n a.token.name === b.token.name &&\n a.token.type === b.token.type &&\n a.token.value === b.token.value &&\n a.token.overridden === b.token.overridden &&\n a.token.description === b.token.description,\n);\n\nfunction Family({ group, tokens, onChange }: { group: string; tokens: readonly TokenEntry[]; onChange: OnChange }) {\n const [picked, setPicked] = useState<string | null>(null);\n const token = tokens.find((t) => t.name === picked) ?? null;\n return (\n <div className={s.family} role=\"group\" aria-label={group}>\n <span className={s.name}>{group}</span>\n <div className={s.strip}>\n {tokens.map((t) => (\n <button\n key={t.name}\n type=\"button\"\n className={s.swatch}\n style={{ '--token-color': t.value } as CSSProperties}\n aria-label={t.name}\n aria-pressed={t.name === picked}\n title={`${t.name}: ${t.value}`}\n data-overridden={t.overridden ? '' : undefined}\n onClick={() => setPicked((current) => (current === t.name ? null : t.name))}\n />\n ))}\n </div>\n {token ? <TokenRow token={token} onChange={onChange} /> : null}\n </div>\n );\n}\n\nfunction Section({\n title,\n open,\n onToggle,\n tokens,\n familySize,\n onChange,\n}: {\n title: string;\n open: boolean;\n onToggle: () => void;\n tokens: readonly TokenEntry[];\n familySize: number;\n onChange: OnChange;\n}) {\n const items = useMemo(() => itemsOf(tokens, familySize), [tokens, familySize]);\n return (\n <section className={s.section} aria-label={title}>\n <DisclosureRow className={s.sectionHead} open={open} onToggle={onToggle} label={title}>\n <span aria-hidden=\"true\">{title}</span>\n </DisclosureRow>\n {open ? (\n <div className={s.sectionBody}>\n {items.map((item) =>\n item.kind === 'row' ? (\n <TokenRow key={item.token.name} token={item.token} onChange={onChange} />\n ) : (\n <Family key={`family:${item.group}`} group={item.group} tokens={item.tokens} onChange={onChange} />\n ),\n )}\n </div>\n ) : null}\n </section>\n );\n}\n\n/**\n * Edits a set of design tokens by type: collapsible sections by category, a\n * color group drawn as one row of swatches sized to fit, and a control for each\n * type — a number with its unit for dimensions and durations, the nine weights\n * for a font weight, a curve beside a `cubic-bezier()`, a swatch beside a color,\n * and text for everything else.\n */\nexport function TokenPanel({\n tokens,\n onChange,\n collapsed,\n onCollapsedChange,\n categorize = tokenCategory,\n familySize = 3,\n density = 'normal',\n className,\n}: TokenPanelProps) {\n const [ownCollapsed, setOwnCollapsed] = useState<Partial<Record<TokenCategory, boolean>>>({});\n const closed = collapsed ?? ownCollapsed;\n const byCategory = useMemo(() => {\n const sections = new Map<TokenCategory, TokenEntry[]>();\n for (const token of tokens) {\n const category = categorize(token);\n sections.set(category, [...(sections.get(category) ?? []), token]);\n }\n return sections;\n }, [tokens, categorize]);\n\n return (\n <div className={[s.panel, density === 'tight' && s.tight, className].filter(Boolean).join(' ')}>\n {TOKEN_CATEGORIES.map(({ id, title }) => {\n const inSection = byCategory.get(id);\n if (!inSection) return null;\n const open = !closed[id];\n return (\n <Section\n key={id}\n title={title}\n open={open}\n onToggle={() => {\n if (collapsed === undefined) setOwnCollapsed((prev) => ({ ...prev, [id]: open }));\n onCollapsedChange?.(id, open);\n }}\n tokens={inSection}\n familySize={familySize}\n onChange={onChange}\n />\n );\n })}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { PauseIcon, PlayIcon, StepBackIcon, StepForwardIcon } from '../../icons';\nimport { Button } from '../Button';\nimport { Slider } from '../Slider/Slider';\nimport s from './Jog.module.css';\n\n/** Props for {@link Jog}. */\nexport interface JogProps {\n /** Which step is showing, 0-based. */\n index: number;\n /** How many steps there are. */\n count: number;\n playing: boolean;\n onPlay: (playing: boolean) => void;\n /** Move one step, back or forward. */\n onStep: (by: -1 | 1) => void;\n /** Jump to a step. Left out, no scrubber is drawn. */\n onScrub?: (index: number) => void;\n /** What one step is called, for the spoken labels. Defaults to `Step`. */\n unit?: string;\n /** Drawn after the readout — a beat's caption, a snapshot's date. */\n caption?: ReactNode;\n className?: string;\n}\n\n/**\n * Transport for something counted rather than timed: beat 3 of 24, not 4.20s of 12.00s.\n * `<Transport>` is the continuous-time one, and wants a playhead in milliseconds, a rate and\n * a loop, none of which a list of steps has.\n *\n * Named for the jog of jog/shuttle — moving one frame at a time, as against running at speed.\n */\nexport function Jog(props: JogProps) {\n const { index, count, playing, onPlay, onStep, onScrub, unit = 'Step', caption, className } =\n props;\n\n const last = Math.max(0, count - 1);\n const at = Math.min(Math.max(index, 0), last);\n const spoken = `${unit} ${at + 1} of ${count}`;\n\n return (\n <div className={[s.jog, className].filter(Boolean).join(' ')}>\n <Button\n iconOnly\n size=\"sm\"\n variant=\"ghost\"\n ariaLabel={`Previous ${unit.toLowerCase()}`}\n disabled={at <= 0}\n onClick={() => onStep(-1)}\n >\n <StepBackIcon size={14} />\n </Button>\n <Button\n iconOnly\n size=\"sm\"\n variant=\"ghost\"\n ariaLabel={playing ? 'Pause' : 'Play'}\n disabled={count < 2}\n onClick={() => onPlay(!playing)}\n >\n {playing ? <PauseIcon size={14} /> : <PlayIcon size={14} />}\n </Button>\n <Button\n iconOnly\n size=\"sm\"\n variant=\"ghost\"\n ariaLabel={`Next ${unit.toLowerCase()}`}\n disabled={at >= last}\n onClick={() => onStep(1)}\n >\n <StepForwardIcon size={14} />\n </Button>\n\n {onScrub && (\n <Slider\n className={s.scrub}\n min={0}\n max={last}\n step={1}\n snap=\"strict\"\n density=\"slim\"\n ariaLabel={unit}\n thumbs={[{ value: at, valueText: spoken }]}\n onInput={(next) => onScrub(Math.round(next[0]?.value ?? 0))}\n />\n )}\n\n <span className={s.readout} data-testid=\"jog-readout\">\n {pad(at + 1, count)}/{count}\n </span>\n {caption ? <span className={s.caption}>{caption}</span> : null}\n </div>\n );\n}\n\n/**\n * Figure spaces, not regular ones: the readout updates every beat, and a run from 9 to 10 that\n * widens by a digit shoves whatever follows it along the row. `tabular-nums` fixes the width of\n * a digit and not how many there are, so the padding is what holds the row still.\n */\nfunction pad(value: number, count: number): string {\n return String(value).padStart(String(count).length, ' ');\n}\n","// A `FillStyle` as one CSS background string, for the swatches and chips that\n// stand in for a paint in a panel.\n//\n// The gradient kinds are sampled rather than translated stop for stop: CSS\n// blends its own stops in sRGB, so an OKLCh gradient handed over as two stops\n// would preview as the sRGB blend of its ends. Sampling through\n// `sampleGradientStops` in the paint's own space puts the curve into the\n// stops themselves, and the browser only interpolates the short hops between.\n\nimport { sampleGradientStops, type FillStyle } from '@weasel-js/core';\n\n/** Sample count along a previewed gradient. Enough that a hue arc reads as a\n * curve at chip size; a straight sRGB ramp would need a fraction of it. */\nconst SAMPLES = 24;\n\n/**\n * A mesh patch as four corner radials over a flat base.\n *\n * This is an approximation and cannot be anything else — CSS has no mesh, and\n * the real surface only exists once the renderer has baked it. Each corner\n * fades out across the chip and they composite to something bilinear-ish,\n * which is enough for a swatch to say \"this one, not that one\". Zero alpha is\n * written as `color-mix` with `transparent` so a named or packed-alpha color\n * works without being parsed here.\n */\nfunction meshPreview(paint: { patches?: { colors: string[] }[] }): string | undefined {\n const colors = paint.patches?.[0]?.colors;\n if (!colors || colors.length < 4) return undefined;\n const fade = (c: string): string => `color-mix(in srgb, ${c} 0%, transparent)`;\n const at: [string, string][] = [\n ['0% 0%', colors[0]], ['100% 0%', colors[1]],\n ['100% 100%', colors[2]], ['0% 100%', colors[3]],\n ];\n const layers = at.map(([pos, c]) =>\n `radial-gradient(farthest-corner at ${pos}, ${c}, ${fade(c)})`);\n // The base keeps the middle opaque where the four fades have all thinned.\n layers.push(`linear-gradient(to bottom, ${colors[0]}, ${colors[2]})`);\n return layers.join(', ');\n}\n\n/** CSS color stops across the whole ramp, in the gradient's own blend space. */\nfunction sampledStops(paint: Extract<FillStyle, { stops: unknown }>): string {\n const space = paint.interpolate ?? 'rgb';\n const out: string[] = [];\n for (let i = 0; i <= SAMPLES; i++) {\n const t = i / SAMPLES;\n out.push(`${sampleGradientStops(paint.stops, t, space)} ${(t * 100).toFixed(1)}%`);\n }\n return out.join(', ');\n}\n\nconst DEG = 180 / Math.PI;\n\n/** A fraction of the box as a CSS percentage. A gradient in absolute units has\n * no box to be a fraction of, so its geometry only ever approximates here. */\nfunction pct(v: number): string {\n return `${(v * 100).toFixed(1)}%`;\n}\n\n/**\n * `paint` as a CSS `background` value, or `undefined` for a paint with no CSS\n * form — a pattern, a registered kind — which a caller shows as a checker or\n * a placeholder rather than as an invented color.\n *\n * Gradient geometry is honored as far as CSS can carry it: the angle of a\n * linear gradient, the center of a radial or conic one. A paint in `'world'`\n * or `'local'` units is measured in the scene rather than in the chip, so its\n * preview shows the ramp and not the placement.\n */\nexport function paintPreviewCss(paint: FillStyle | null | undefined): string | undefined {\n if (paint == null) return undefined;\n const kind = paint.fill ?? 'solid';\n if (kind === 'solid') return (paint as { color: string }).color;\n\n if (paint.fill === 'linear-gradient') {\n const dx = paint.to.x - paint.from.x;\n const dy = paint.to.y - paint.from.y;\n // CSS measures from \"to top\", clockwise; the paint measures in a\n // y-down plane from +x.\n const angle = dx === 0 && dy === 0 ? 90 : Math.atan2(dx, -dy) * DEG;\n return `linear-gradient(${angle.toFixed(1)}deg, ${sampledStops(paint)})`;\n }\n if (paint.fill === 'radial-gradient') {\n const at = `at ${pct(paint.center.x)} ${pct(paint.center.y)}`;\n return `radial-gradient(circle ${at}, ${sampledStops(paint)})`;\n }\n if ((paint.fill as string) === 'mesh-gradient') {\n return meshPreview(paint as unknown as { patches?: { colors: string[] }[] });\n }\n if (paint.fill === 'conic-gradient') {\n // CSS starts a conic gradient at \"to top\"; the paint starts at +x.\n const from = (paint.angle * DEG + 90).toFixed(1);\n return `conic-gradient(from ${from}deg at ${pct(paint.center.x)} ${pct(paint.center.y)}, ${sampledStops(paint)})`;\n }\n return undefined;\n}\n","import { type ReactElement } from 'react';\nimport {\n asPaint,\n isMeshGradientFill,\n type ColorSpace,\n type FillStyle,\n type MeshGradientFill,\n} from '@weasel-js/core';\nimport { ColorField } from '../ColorField';\nimport { ToggleBar, type ToggleBarItem } from '../ToggleBar';\nimport { paintPreviewCss } from '../../paintPreview';\nimport s from './MeshEditor.module.css';\n\nconst SPACES: readonly ToggleBarItem<ColorSpace>[] = [\n { value: 'rgb', label: 'sRGB' },\n { value: 'oklab', label: 'OKLab' },\n { value: 'oklch', label: 'OKLCh' },\n];\n\n/** Props for {@link MeshEditor}. `onInput` fires throughout a gesture and\n * `onChange` once at its end. */\nexport interface MeshEditorProps {\n value: MeshGradientFill;\n /** Emitted as a `FillStyle`, which is what every paint control passes\n * around — `FillStyle`'s discriminant stays closed over the built-in\n * members, so a registered kind's own shape only travels through it. */\n onInput?: (next: FillStyle) => void;\n onChange: (next: FillStyle) => void;\n /** Show the sRGB / OKLab / OKLCh switch. Default true. */\n spaceSwitch?: boolean;\n className?: string;\n}\n\n/**\n * Editor for a mesh gradient's colors.\n *\n * Geometry is absent for the same reason it is absent from `GradientEditor`:\n * a patch's twelve control points are a thing to drag on the artwork, not a\n * column of numbers in a panel. What is left is what a panel is good at — the\n * color at each corner, and the space the four of them blend through.\n *\n * Corners are numbered in the patch's own walk order, which is the order the\n * paint stores them in, so a corner's number is stable while it is dragged.\n */\nexport function MeshEditor(props: MeshEditorProps): ReactElement {\n const { value, onInput, onChange, spaceSwitch = true, className } = props;\n const space = value.interpolate ?? 'rgb';\n\n const withCorner = (patchIndex: number, corner: number, color: string): FillStyle => asPaint({\n ...value,\n patches: value.patches.map((patch, i) => {\n if (i !== patchIndex) return patch;\n const [a, b, c, d] = patch.colors;\n const next: [string, string, string, string] = [a, b, c, d];\n next[corner] = color;\n return { ...patch, colors: next };\n }),\n });\n\n return (\n <div className={[s.root, className].filter(Boolean).join(' ')}>\n {value.patches.map((patch, patchIndex) => (\n // A patch has no id; its position in the list is its identity, the way\n // a gradient stop's is.\n <div key={patchIndex} className={s.patch}>\n <span\n className={s.preview}\n aria-hidden=\"true\"\n style={{ background: previewOf(value, patchIndex) }}\n />\n <div className={s.corners}>\n {patch.colors.map((color, corner) => (\n <ColorField\n key={corner}\n value={color}\n alpha\n aria-label={`Patch ${patchIndex + 1} corner ${corner + 1}`}\n className={s.corner}\n onInput={(next) => onInput?.(withCorner(patchIndex, corner, next))}\n onChange={(next) => onChange(withCorner(patchIndex, corner, next))}\n />\n ))}\n </div>\n </div>\n ))}\n\n {spaceSwitch && (\n <ToggleBar<ColorSpace>\n items={SPACES}\n value={space}\n size=\"sm\"\n ariaLabel=\"Blend space\"\n onChange={(next) => next && onChange(asPaint({ ...value, interpolate: next }))}\n />\n )}\n </div>\n );\n}\n\n/** One patch as a swatch: the paint with the other patches taken out, so a\n * multi-patch mesh shows which row belongs to which part of it. */\nfunction previewOf(value: MeshGradientFill, patchIndex: number): string | undefined {\n return paintPreviewCss(\n { ...value, patches: [value.patches[patchIndex]] } as unknown as FillStyle,\n );\n}\n\n/** Narrowing for a consumer rendering this behind a kind switch. */\nexport function isMeshPaint(fill: FillStyle | null | undefined): fill is FillStyle & MeshGradientFill {\n return isMeshGradientFill(fill);\n}\n","/**\n * Public types for `@weasel-js/svg`. The package exposes a flat,\n * discriminated-union node model (`SvgNode`) that mirrors the SVG element\n * tree but uses weasel-native leaf data (`Path`, `FillStyle`) for geometry and\n * paint.\n *\n * Parsing collapses every `transform=\"...\"` onto its descendants' geometry,\n * so the `SvgNode` tree returned from `parseSvg` never has a non-identity\n * group transform. Consumers may still construct groups with explicit\n * transforms before serializing, in which case the serializer emits a\n * single `matrix(a b c d e f)` on the `<g>`.\n */\n\nimport type {\n Path, FillStyle, MarkerEntry, Stroke, StrokeAlign, StyledRun, TextStyle, TextVerticalAlign,\n} from '@weasel-js/core';\n\n/**\n * Opaque pass-through bag for namespaced XML content.\n *\n * weasel-svg does not interpret the contents — it only ensures that any\n * attributes or child elements in a *declared* XML namespace round-trip\n * losslessly through parse → serialize. Consumers (e.g. an app-specific\n * bridge layer) hang their domain semantics off this structure.\n *\n * Keyed by namespace prefix (the prefix is a write-time choice; the URI\n * is the canonical identifier and is supplied via `ParseOptions.namespaces`\n * / `SerializeOptions.namespaces`).\n */\nexport interface NamespaceMeta {\n [prefix: string]: {\n /** Local-name → string-value map for attributes in this namespace. */\n attrs?: Record<string, string>;\n /**\n * Child elements in this namespace, keyed by local name. Each entry\n * is an array because a namespace can host multiple sibling elements\n * with the same tag (e.g. `<wd:layer/><wd:layer/>`).\n */\n elements?: Record<string, NamespacedElement[]>;\n };\n}\n\n/** Opaque structured representation of a namespaced element. */\nexport interface NamespacedElement {\n /** Attribute local-name → string-value. */\n attrs: Record<string, string>;\n /** Text content, when the element contains only text (no child elements). */\n text?: string;\n /** Nested namespaced children, keyed by local name (recursive). */\n children?: Record<string, NamespacedElement[]>;\n}\n\n/**\n * 2x3 affine matrix in column-major form (SVG's `matrix(a b c d e f)`\n * order). Maps `[x', y'] = [a*x + c*y + e, b*x + d*y + f]`.\n */\nexport type Matrix = readonly [number, number, number, number, number, number];\n\n/** Identity matrix — useful as a default in tests / constructors. */\nexport const IDENTITY_MATRIX: Matrix = [1, 0, 0, 1, 0, 0];\n\n/**\n * FillStyle description in the SVG sense — either explicit `none`, a solid\n * color, or a reference to a weasel-native gradient `FillStyle`. Solid colors\n * are normalized to `#rrggbb` strings; opacity is carried separately so\n * `fill-opacity` and `stroke-opacity` round-trip cleanly.\n */\nexport type SvgPaint =\n | { kind: 'none' }\n | { kind: 'solid'; color: string; opacity?: number }\n | { kind: 'gradient'; paint: FillStyle };\n\n/** Stroke description: a paint plus structural line parameters. */\nexport interface SvgStroke {\n paint: SvgPaint;\n /** World units, or `{ px }` for a width that holds its rendered thickness\n * however the document is scaled — SVG's `vector-effect=\"non-scaling-stroke\"`,\n * and the same unit system as the kit's `Stroke.width`. */\n width: number | { px: number };\n opacity?: number;\n /** `stroke-linecap`. Default per SVG spec is `'butt'`. */\n cap?: 'butt' | 'round' | 'square';\n /** `stroke-linejoin`. Default per SVG spec is `'miter'`. SVG's `arcs` / `miter-clip` map to `'miter'` with a warning. */\n join?: 'miter' | 'round' | 'bevel';\n /** `stroke-dasharray` as a flat number array. Odd-length inputs are doubled per SVG spec. */\n dash?: number[];\n /**\n * `stroke-miterlimit`. SVG's default is 4. Weasel's renderer defaults to\n * 10 (Canvas2D) when unset, so parsed strokes without an explicit\n * attribute may render with longer miters than the source SVG intended.\n */\n miterLimit?: number;\n /** The kit stroke's `align`. SVG has no stroke alignment, so the serializer\n * writes the stroke centered and says so through `onWarn`; the parser\n * never sets it. */\n align?: StrokeAlign;\n /** `marker-start` / `marker-mid` / `marker-end`, as the bare `url(#id)` key. */\n markerStart?: string;\n markerMid?: string;\n markerEnd?: string;\n}\n\n/**\n * Leaf node: a path geometry plus fill/stroke. All other v1 shapes\n * (`<rect>`, `<ellipse>`, etc.) are lowered to this representation on\n * parse — `<rect>` uses weasel's `RectPath` fast-path subtype when\n * possible, everything else becomes a `PolygonPath`.\n */\nexport interface SvgPathNode {\n kind: 'path';\n path: Path;\n fill: SvgPaint;\n stroke?: SvgStroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the AABB\n * center of the underlying `path` geometry. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Group node: an SVG `<g>`. On parse, `transform` is always omitted (any\n * `transform` attribute is collapsed onto descendants' geometry). On\n * serialize, a non-identity `transform` is emitted as\n * `matrix(a b c d e f)`.\n */\nexport interface SvgGroupNode {\n kind: 'group';\n children: SvgNode[];\n transform?: Matrix;\n /** Clips the group's contents. Serializes to a `<clipPath>` def plus\n * `clip-path=\"url(#id)\"`, and lives in the same space as `children` —\n * SVG applies the group's own `transform` to the clip as well.\n * A `<clipPath>` of more than one shape parses back as no clip: SVG\n * unions them and a `Path` holds one outline. */\n clip?: Path;\n opacity?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Text leaf node. Mirrors the kit's `TextPose` shape — a bounding box plus\n * text content, optional rich-text `runs` (per-range styling), and an\n * optional `TextStyle` for the node-wide defaults.\n *\n * Note on SVG text geometry: native `<text>` flows from a baseline; it\n * doesn't have width/height attributes. The serializer emits\n * `dominant-baseline=\"text-before-edge\"` so `y` is the top of the text\n * box, plus `data-weasel-width` / `data-weasel-height` so weasel's\n * explicit box dimensions round-trip losslessly. External SVG text\n * (lacking the data-* attrs) imports with the width the kit's text layout\n * measures — an em-based estimate when no registered font can — and\n * `height = fontSize * lineHeight * (lineCount || 1)`.\n *\n * `x` here is always the box's left edge. In the SVG it is the\n * `text-anchor` point, and the parser and serializer convert between them.\n */\nexport interface SvgTextNode {\n kind: 'text';\n x: number;\n y: number;\n width: number;\n height: number;\n /** Plain text. When `runs` is set, `runsToPlainText(runs)` must equal `text`. */\n text: string;\n /** Optional per-range styling — same shape as `TextPose.runs`. */\n runs?: StyledRun[];\n /** Node-wide typography. Defaults applied at render time via `resolveTextStyle`. */\n style?: TextStyle;\n /** Where the laid-out text sits inside the box — `kit:text`'s\n * `data.verticalAlign`. SVG text has no box to align in, so this rides in\n * `data-weasel-vertical-align` and other readers draw the text top-aligned. */\n verticalAlign?: TextVerticalAlign;\n /**\n * Node-wide glyph paint, the `FillStyle` / `Stroke` a kit text node holds\n * in `data.fill` / `data.stroke`. Not `SvgPaint`, which is the path\n * nodes' shape — a text paint reaches the renderer through the runs, and\n * `StyledRun.fill` / `.stroke` override these per range.\n *\n * `null` is SVG's `fill=\"none\"`: outline-only text, painted by its stroke\n * alone. Absent takes the default black.\n */\n fill?: FillStyle | null;\n stroke?: Stroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Raster-image leaf — an SVG `<image>`. `href` is the element's `href` (or\n * legacy `xlink:href`) verbatim: an external URL or a `data:` URI. The\n * package neither fetches nor decodes it, so an external URL round-trips as\n * a reference and only resolves when something downstream loads it.\n *\n * SVG's `preserveAspectRatio` is not modeled; the box is taken literally.\n *\n * With a `source` rect or a flip, the element is written as a `<g\n * data-weasel-image>` holding a nested `<svg>` viewport at the box, whose\n * `viewBox` is the source window over a unit-square `<image>` — plain SVG 1.1,\n * which any reader crops and mirrors the same way, and which `parseSvg` reads\n * back as one image node.\n */\nexport interface SvgImageNode {\n kind: 'image';\n href: string;\n x: number;\n y: number;\n width: number;\n height: number;\n /** The part of the bitmap drawn into the box, as fractions of the bitmap's\n * width and height from its top-left. Omitted draws the whole bitmap.\n * Fractions rather than bitmap pixels because this package never decodes\n * the image, so it cannot know its size. */\n source?: { x: number; y: number; width: number; height: number };\n /** Mirror the drawn region within the box, as `ImageDrawCommand` does. The\n * box does not move. */\n flipX?: boolean;\n flipY?: boolean;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/** Discriminated-union node — the leaf of the public tree. */\nexport type SvgNode = SvgPathNode | SvgGroupNode | SvgTextNode | SvgImageNode;\n\n/** Options for {@link parseSvg}. */\nexport interface ParseOptions {\n /**\n * Map of prefix → URI for XML namespaces the caller wants surfaced.\n * Attributes / child elements in any declared namespace are collected\n * into `SvgNode.meta` (per element) or `ParseResult.documentMeta` (root).\n * Undeclared namespaces are preserved in the DOM but not promoted into\n * the structured `meta` bag; they are silently dropped at serialize time.\n */\n namespaces?: Record<string, string>;\n}\n\n/** Output of {@link parseSvg}. */\nexport interface ParseResult {\n nodes: SvgNode[];\n /** Non-fatal notices (unsupported elements, unrecognized attributes). */\n warnings: string[];\n /**\n * Opaque per-document bag for declared namespaces. Holds root-level\n * namespaced attributes (`documentMeta.<prefix>.attrs`) and namespaced\n * root children (`documentMeta.<prefix>.elements`).\n */\n documentMeta?: NamespaceMeta;\n /** Root `viewBox` attribute, parsed from `\"x y width height\"`. */\n viewBox?: { x: number; y: number; width: number; height: number };\n /** Root `width` attribute, parsed as a unitless number when present. */\n width?: number;\n /** Root `height` attribute, parsed as a unitless number when present. */\n height?: number;\n /** Text content of the first `<title>` child of `<svg>`, when present. */\n title?: string;\n /**\n * An entry for each document `<marker>` a stroke references under a key the\n * marker registry does not know, keyed as the strokes in `nodes` now name\n * them. Nothing draws them until they are registered (`registerMarker`),\n * which `unpackSvgFiles` does.\n */\n markers?: MarkerEntry[];\n}\n\n/** Options for {@link serializeSvg}. */\nexport interface SerializeOptions {\n /**\n * Override the root `viewBox`. When omitted, the serializer computes\n * a tight bounding box from the supplied nodes.\n */\n viewBox?: { x: number; y: number; width: number; height: number };\n /**\n * Called for what the document cannot carry the way weasel draws it: a\n * paint SVG cannot express (a pattern carrying a `TextureHandle` instead of\n * a `TilePatternSpec`), a stroke aligned off its edge, text that wraps or\n * sits lower than the top of its box. Each message is said once per call.\n * Without this the loss is silent.\n */\n onWarn?: (message: string) => void;\n /** Emit `width=\"...\"` on the root `<svg>`. */\n width?: number;\n /** Emit `height=\"...\"` on the root `<svg>`. */\n height?: number;\n /**\n * Emit `<title>...</title>` as the first child of the root `<svg>`. The\n * value is XML-escaped on output. Empty strings are skipped.\n */\n title?: string;\n /**\n * Map of prefix → URI for XML namespaces to declare on the root\n * `<svg>`. The serializer reads `documentMeta[prefix]` and\n * `node.meta[prefix]` to write the actual attributes and elements.\n */\n namespaces?: Record<string, string>;\n /**\n * Opaque per-document namespaced extras. Each `<prefix>.attrs` becomes\n * `<prefix>:<name>=\"...\"` attributes on the root `<svg>`. Each\n * `<prefix>.elements[localName]` becomes `<prefix>:<localName>...>`\n * children placed immediately before any geometry.\n */\n documentMeta?: NamespaceMeta;\n /** Pretty-print with newlines + indentation. Default `false`. */\n pretty?: boolean;\n}\n","/**\n * SVG transform attribute helpers. Parses the four primitive transform\n * functions weasel-svg supports (`matrix`, `translate`, `scale`, `rotate`)\n * into a single 2x3 affine matrix, and exposes the point/path mappers we\n * need to collapse `transform=` onto leaf geometry at parse time.\n */\n\nimport { invert } from '@weasel-js/geom';\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\n\n/** Multiply two 2x3 affine matrices (a then b applied to a column vector). */\nexport function multiply(a: Matrix, b: Matrix): Matrix {\n // [a0 a2 a4] [b0 b2 b4]\n // [a1 a3 a5] [b1 b3 b5]\n return [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n a[0] * b[4] + a[2] * b[5] + a[4],\n a[1] * b[4] + a[3] * b[5] + a[5],\n ];\n}\n\n/** Apply a 2x3 affine to a 2D point. */\nexport function applyMatrix(m: Matrix, x: number, y: number): { x: number; y: number } {\n return { x: m[0] * x + m[2] * y + m[4], y: m[1] * x + m[3] * y + m[5] };\n}\n\n/** True if `m` is the identity within a small epsilon. */\nexport function isIdentity(m: Matrix, eps = 1e-9): boolean {\n return (\n Math.abs(m[0] - 1) < eps &&\n Math.abs(m[1]) < eps &&\n Math.abs(m[2]) < eps &&\n Math.abs(m[3] - 1) < eps &&\n Math.abs(m[4]) < eps &&\n Math.abs(m[5]) < eps\n );\n}\n\nconst NUM_RE = /[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g;\n\nfunction readNumbers(s: string): number[] {\n const out: number[] = [];\n const matches = s.match(NUM_RE);\n if (!matches) return out;\n for (const m of matches) {\n const n = Number(m);\n if (Number.isFinite(n)) out.push(n);\n }\n return out;\n}\n\n/**\n * Parse an SVG `transform=\"...\"` string into a single 2x3 matrix.\n * Functions compose right-to-left in SVG's coordinate model: in\n * `transform=\"A B\"`, the rightmost function is applied first to a point's\n * local coordinates. We accumulate accordingly: `result = result * fn`.\n *\n * Unrecognized functions emit a warning via the optional callback and are\n * skipped (the rest of the transform list still applies).\n */\nexport function parseTransform(\n attr: string | null | undefined,\n onWarn?: (message: string) => void,\n): Matrix {\n if (!attr) return IDENTITY_MATRIX;\n let result: Matrix = IDENTITY_MATRIX;\n // Split into \"name(args)\" chunks.\n const fnRe = /([A-Za-z]+)\\s*\\(([^)]*)\\)/g;\n let match: RegExpExecArray | null;\n while ((match = fnRe.exec(attr)) !== null) {\n const name = match[1].toLowerCase();\n const nums = readNumbers(match[2]);\n let local: Matrix | null = null;\n if (name === 'matrix' && nums.length >= 6) {\n local = [nums[0], nums[1], nums[2], nums[3], nums[4], nums[5]];\n } else if (name === 'translate') {\n const tx = nums[0] ?? 0;\n const ty = nums[1] ?? 0;\n local = [1, 0, 0, 1, tx, ty];\n } else if (name === 'scale') {\n const sx = nums[0] ?? 1;\n const sy = nums.length >= 2 ? nums[1] : sx;\n local = [sx, 0, 0, sy, 0, 0];\n } else if (name === 'rotate') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const c = Math.cos(ang);\n const s = Math.sin(ang);\n const rot: Matrix = [c, s, -s, c, 0, 0];\n if (nums.length >= 3) {\n // rotate(angle, cx, cy) = translate(cx,cy) * rotate * translate(-cx,-cy)\n const cx = nums[1];\n const cy = nums[2];\n local = multiply(multiply([1, 0, 0, 1, cx, cy], rot), [1, 0, 0, 1, -cx, -cy]);\n } else {\n local = rot;\n }\n } else if (name === 'skewx' || name === 'skewy') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const t = Math.tan(ang);\n local = name === 'skewx' ? [1, 0, t, 1, 0, 0] : [1, t, 0, 1, 0, 0];\n } else {\n onWarn?.(`unsupported transform function: ${name}`);\n continue;\n }\n result = multiply(result, local);\n }\n return result;\n}\n\n/**\n * Re-express an element's own `transform` in the frame its inherited `ctm`\n * maps into: `ctm * local * ctm⁻¹`.\n *\n * A leaf's geometry is baked through `ctm` at parse time, so its own\n * transform has to move with it. Decomposing the raw local matrix against\n * bounds that have already been through `ctm` compares two different\n * coordinate spaces, and a rotation inside a translated `<g>` fails to\n * decompose for no reason but the offset.\n *\n * `null` when `@weasel-js/geom`'s `invert` finds `ctm` singular: the geometry\n * has collapsed through it, and the local transform has no frame to live in.\n */\nexport function rebaseTransform(ctm: Matrix, local: Matrix): Matrix | null {\n const inv = invert([...ctm]);\n if (!inv) return null;\n const [a, b, c, d, e, f] = inv;\n return multiply(multiply(ctm, local), [a, b, c, d, e, f]);\n}\n\n/** Try to factor `m` as \"rotation by theta about (cx, cy)\". Returns the\n * angle in radians when `m` is (within `eps`) a pure rotation about the\n * given pivot. Returns `null` otherwise.\n *\n * Pure rotation about (cx, cy) has the matrix form:\n * [ cos -sin cx - cx*cos + cy*sin ]\n * [ sin cos cy - cx*sin - cy*cos ]\n * i.e. m[0] = m[3] = cos, m[1] = -m[2] = sin, with a translation that\n * equals the pivot's \"rotate-then-translate-back\" residue. We reconstruct\n * theta from atan2(m[1], m[0]) and verify the rest.\n */\nexport function decomposeRotation(\n m: Matrix,\n cx: number,\n cy: number,\n eps = 1e-4,\n): number | null {\n const [a, b, c, d, e, f] = m;\n // Pure rotation requires a == d and b == -c.\n if (Math.abs(a - d) > eps) return null;\n if (Math.abs(b + c) > eps) return null;\n // Determinant must be 1 (no scale, no flip).\n const det = a * d - b * c;\n if (Math.abs(det - 1) > eps) return null;\n const theta = Math.atan2(b, a);\n // Verify translation = (cx - cx*cos + cy*sin, cy - cx*sin - cy*cos).\n const expectedE = cx - cx * a + cy * b;\n const expectedF = cy - cx * b - cy * a;\n if (Math.abs(e - expectedE) > eps) return null;\n if (Math.abs(f - expectedF) > eps) return null;\n return theta;\n}\n\n/** Best-effort rotational-component extraction for a general matrix (any\n * scale + rotation, ignoring translation). Used for parse-time warnings\n * on un-decomposable matrices: we can detect \"there is a rotation here\"\n * even if we won't preserve it as `node.rotation`. For a non-uniform\n * matrix the \"rotation\" is ambiguous; we report atan2(b, a) which\n * corresponds to where the +x basis vector points.\n */\nexport function rotationComponent(m: Matrix): number {\n return Math.atan2(m[1], m[0]);\n}\n\n/**\n * Format a matrix as an SVG `matrix(a b c d e f)` value. Returns `null`\n * when `m` is (effectively) the identity, so the caller can omit the\n * attribute entirely.\n */\nexport function formatMatrix(m: Matrix): string | null {\n if (isIdentity(m)) return null;\n return `matrix(${m.map((n) => trimNumber(n)).join(' ')})`;\n}\n\n/** Trim trailing zeros from a numeric value for compact SVG output. */\nexport function trimNumber(n: number): string {\n if (!Number.isFinite(n)) return '0';\n // Round to ~6 decimal places to avoid floating-point cruft.\n const r = Math.round(n * 1e6) / 1e6;\n if (Number.isInteger(r)) return String(r);\n return String(r);\n}\n","import { resolveAlign, type TextStyle } from '@weasel-js/core';\n\n/**\n * Distance from a text box's left edge to its SVG anchor point: `x` on a\n * `<text>` is where `text-anchor` lands, which is the box's left edge, center\n * or right edge once `align` and `direction` resolve to an absolute edge.\n */\nexport function anchorOffset(style: TextStyle | undefined, width: number): number {\n const edge = resolveAlign(style?.align ?? 'left', style?.direction ?? 'ltr');\n return edge === 'center' ? width / 2 : edge === 'right' ? width : 0;\n}\n","/**\n * Map between SVG `<pattern>` elements and weasel's `pattern` `FillStyle`.\n * The counterpart to `gradients.ts` for the other paint-server kind.\n *\n * The tile's shapes come from `tileGeometry` in core, so the vector form a\n * viewer sees is generated from the same description that rasterizes the GL\n * texture. Alongside them we write the spec itself onto a `data-weasel-tile`\n * attribute: any SVG consumer renders the shapes, and weasel reads the\n * attribute back to recover the exact spec rather than reverse-engineering\n * it from geometry.\n *\n * A pattern whose payload is a `TextureHandle` has no vector form — the\n * handle is a session-scoped registry key with no tile description behind\n * it — and exports as nothing, with a warning. Same treatment conic\n * gradients get.\n */\n\nimport { tileGeometry, type TileShape } from '@weasel-js/core/patterns-builtin';\nimport type { FillStyle, TilePatternSpec } from '@weasel-js/core';\nimport { collectElementsByTag } from './elements';\nimport { trimNumber } from './transform';\n\ntype PatternFill = Extract<FillStyle, { fill: 'pattern' }>;\n\n/** Collected pattern definitions, keyed by element id. */\nexport type PatternTable = Map<string, FillStyle>;\n\n/** Whether a pattern paint carries a serializable spec. */\nexport function patternSpecOf(paint: PatternFill): TilePatternSpec | null {\n return 'tile' in paint.pattern ? paint.pattern : null;\n}\n\nexport function patternXml(id: string, paint: PatternFill, onWarn?: (m: string) => void): string {\n const spec = patternSpecOf(paint);\n if (!spec) {\n onWarn?.('pattern fill carries a TextureHandle, which has no vector form — omitted from <defs>');\n return '';\n }\n const geometry = tileGeometry(spec);\n const body = geometry.shapes.map(shapeXml).join('');\n const origin = paint.origin ?? { x: 0, y: 0 };\n const attrs = [\n `id=\"${id}\"`,\n 'patternUnits=\"userSpaceOnUse\"',\n `width=\"${trimNumber(geometry.size)}\"`,\n `height=\"${trimNumber(geometry.size)}\"`,\n ];\n if (origin.x !== 0 || origin.y !== 0) {\n attrs.push(`x=\"${trimNumber(origin.x)}\"`, `y=\"${trimNumber(origin.y)}\"`);\n }\n attrs.push(`data-weasel-tile=\"${escapeAttr(JSON.stringify(spec))}\"`);\n return `<pattern ${attrs.join(' ')}>${body}</pattern>`;\n}\n\n/**\n * A single tile as a standalone `<svg>` document, sized to its own extent.\n * For UI that needs to show a tile outside a document — a picker swatch,\n * set as a repeating CSS `background-image` via a data URI. Shares the shape\n * mapper with `patternXml`, so a preview can't drift from what paints.\n */\nexport function tilePreviewSvg(spec: TilePatternSpec, background?: string): string {\n const geometry = tileGeometry(spec);\n const s = trimNumber(geometry.size);\n const bg = background\n ? `<rect width=\"${s}\" height=\"${s}\" fill=\"${background}\"/>`\n : '';\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${s}\" height=\"${s}\" `\n + `viewBox=\"0 0 ${s} ${s}\">${bg}${geometry.shapes.map(shapeXml).join('')}</svg>`;\n}\n\n/** `tilePreviewSvg` packed as a `url(...)` value for CSS `background-image`. */\nexport function tilePreviewCssUrl(spec: TilePatternSpec, background?: string): string {\n return `url(\"data:image/svg+xml,${encodeURIComponent(tilePreviewSvg(spec, background))}\")`;\n}\n\nfunction shapeXml(shape: TileShape): string {\n switch (shape.kind) {\n case 'line':\n return `<line x1=\"${trimNumber(shape.x1)}\" y1=\"${trimNumber(shape.y1)}\" `\n + `x2=\"${trimNumber(shape.x2)}\" y2=\"${trimNumber(shape.y2)}\" `\n + `stroke=\"${shape.color}\" stroke-width=\"${trimNumber(shape.width)}\"/>`;\n case 'circle':\n return `<circle cx=\"${trimNumber(shape.cx)}\" cy=\"${trimNumber(shape.cy)}\" `\n + `r=\"${trimNumber(shape.r)}\" fill=\"${shape.color}\"/>`;\n case 'ellipse': {\n const deg = (shape.rotation * 180) / Math.PI;\n const transform = deg === 0\n ? ''\n : ` transform=\"rotate(${trimNumber(deg)} ${trimNumber(shape.cx)} ${trimNumber(shape.cy)})\"`;\n return `<ellipse cx=\"${trimNumber(shape.cx)}\" cy=\"${trimNumber(shape.cy)}\" `\n + `rx=\"${trimNumber(shape.rx)}\" ry=\"${trimNumber(shape.ry)}\" `\n + `fill=\"${shape.color}\"${transform}/>`;\n }\n case 'rect':\n return `<rect x=\"${trimNumber(shape.x)}\" y=\"${trimNumber(shape.y)}\" `\n + `width=\"${trimNumber(shape.width)}\" height=\"${trimNumber(shape.height)}\" `\n + `fill=\"${shape.color}\"/>`;\n default:\n return '';\n }\n}\n\n/** Read every `<pattern>` in the document back into pattern paints. */\nexport function collectPatterns(svg: Element, onWarn?: (m: string) => void): PatternTable {\n const out: PatternTable = new Map();\n for (const [id, el] of collectElementsByTag(svg, PATTERN_TAGS)) {\n const paint = readPattern(el, onWarn);\n if (paint) out.set(id, paint);\n }\n return out;\n}\n\nconst PATTERN_TAGS = new Set(['pattern']);\n\nfunction readPattern(el: Element, onWarn?: (m: string) => void): FillStyle | null {\n const raw = el.getAttribute('data-weasel-tile');\n if (!raw) {\n // A hand-authored pattern (Illustrator, Inkscape) holds arbitrary\n // geometry no `TilePatternSpec` can express. Recognizing it would mean\n // reverse-engineering a tile from its children; dropping it with a\n // warning is honest, and the element survives in the source file.\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> has no data-weasel-tile — unsupported pattern, dropped`);\n return null;\n }\n let spec: TilePatternSpec;\n try {\n spec = JSON.parse(raw) as TilePatternSpec;\n } catch {\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> has malformed data-weasel-tile — dropped`);\n return null;\n }\n if (typeof spec?.tile !== 'string' || typeof spec?.color !== 'string') {\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> data-weasel-tile is not a tile spec — dropped`);\n return null;\n }\n const x = parseFloat(el.getAttribute('x') ?? '0');\n const y = parseFloat(el.getAttribute('y') ?? '0');\n const paint: PatternFill = { fill: 'pattern', pattern: spec };\n if (x !== 0 || y !== 0) paint.origin = { x, y };\n return paint;\n}\n\nfunction escapeAttr(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n","/**\n * Serialize a weasel `Path` to an SVG `d=` attribute string. `RectPath`\n * lowers to `M h v h Z`; `PolygonPath` walks the (commands, coords)\n * arrays, emitting one SVG command per kit command.\n *\n * Output uses absolute commands only and a small amount of whitespace\n * compression (no leading zeros stripped beyond what `Number.toString`\n * already does). Numbers are rounded to ~6 decimals via `trimNumber`.\n */\n\nimport {\n PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z,\n type Path,\n} from '@weasel-js/core';\nimport { trimNumber } from './transform';\n\n/** Serialize a weasel `Path` to an SVG `d=` attribute string. */\nexport function serializePathD(path: Path): string {\n if (path.kind === 'rect') {\n const { x, y, width, height } = path;\n return `M${trimNumber(x)} ${trimNumber(y)}h${trimNumber(width)}v${trimNumber(height)}h${trimNumber(-width)}Z`;\n }\n const cmds = path.commands;\n const xs = path.coords;\n const out: string[] = [];\n let ci = 0;\n for (let i = 0; i < cmds.length; i++) {\n const c = cmds[i];\n if (c === PATH_M) {\n out.push(`M${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])}`);\n ci += 2;\n } else if (c === PATH_L) {\n out.push(`L${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])}`);\n ci += 2;\n } else if (c === PATH_C) {\n out.push(\n `C${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])} ` +\n `${trimNumber(xs[ci + 2])} ${trimNumber(xs[ci + 3])} ` +\n `${trimNumber(xs[ci + 4])} ${trimNumber(xs[ci + 5])}`,\n );\n ci += 6;\n } else if (c === PATH_Q) {\n out.push(\n `Q${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])} ` +\n `${trimNumber(xs[ci + 2])} ${trimNumber(xs[ci + 3])}`,\n );\n ci += 4;\n } else if (c === PATH_Z) {\n out.push('Z');\n }\n }\n return out.join('');\n}\n","/**\n * Map between SVG `<linearGradient>` / `<radialGradient>` elements and\n * weasel's `FillStyle` gradient variants. Definitions are indexed by id\n * wherever in the document they appear, and looked up when a `fill` /\n * `stroke` attribute references one as `url(#id)`. On serialize, we\n * emit a fresh `<defs>` block with stable generated ids.\n */\n\nimport { getPaintKind, getMarker } from '@weasel-js/core';\nimport type { FillStyle, GradStop, GradientUnits, MarkerEntry, MarkerPaint, Path } from '@weasel-js/core';\nimport { parsePaintAttr } from './color';\nimport { trimNumber } from './transform';\nimport { patternXml } from './patterns';\nimport { collectElementsByTag, type ElementTable } from './elements';\nimport { serializePathD } from './path-serializer';\n\n/** Collected gradient definitions, keyed by element id. */\nexport type GradientTable = Map<string, FillStyle>;\n\n/**\n * The namespace weasel's own paint servers are written in, and the prefix they\n * are written under. A conic gradient has no SVG element to target — SVG has\n * `linearGradient` and `radialGradient` and nothing else — so it goes out as a\n * foreign-namespaced def that this package reads back and every other renderer\n * skips in favor of the paint fallback color beside the reference.\n *\n * A registered paint kind's own `toSvg` may use this prefix too: the root\n * declares it whenever any paint in the document lacks a native SVG form.\n */\nexport const WEASEL_NS = 'urn:weasel-js:svg';\nexport const WEASEL_NS_PREFIX = 'wzl';\n\n/** `true` when SVG has a paint server for this kind, so the reference needs no\n * fallback color and the root needs no foreign namespace. */\nfunction hasNativeSvgForm(paint: FillStyle): boolean {\n const kind = paint.fill ?? 'solid';\n return kind === 'solid' || kind === 'linear-gradient' || kind === 'radial-gradient' || kind === 'pattern';\n}\n\n/**\n * The spaces `interpolate` can name, as SVG spells them. SVG's own\n * `color-interpolation` carries `sRGB` and `linearRGB` only, so anything\n * perceptual goes out as a namespaced attribute a foreign renderer ignores —\n * which leaves it interpolating in sRGB. That is a shifted midpoint rather\n * than a lost paint, so these gradients keep their native element and take no\n * fallback color.\n */\nconst INTERPOLATE_SPACES = new Set(['rgb', 'oklab', 'oklch']);\n\n/** The `wzl:interpolate` attribute a gradient needs, or `''` for the sRGB\n * default every other renderer already assumes. */\nfunction interpolateAttr(space: string | undefined): string {\n if (!space || space === 'rgb') return '';\n return ` ${WEASEL_NS_PREFIX}:interpolate=\"${space}\"`;\n}\n\n/** `interpolate` off a gradient element, or `undefined` — for the field's\n * absence and for a space this package does not model alike. */\nfunction readInterpolate(el: Element, elements: ElementTable): 'oklab' | 'oklch' | undefined {\n const raw = inheritedAttr(el, elements, `${WEASEL_NS_PREFIX}:interpolate`)\n ?? el.getAttributeNS(WEASEL_NS, 'interpolate');\n if (raw === 'oklab' || raw === 'oklch') return raw;\n return undefined;\n}\n\n/** Whether any gradient in the document names a space SVG cannot, so the root\n * has to declare the namespace the attribute is written in. */\nfunction usesInterpolateAttr(paint: FillStyle): boolean {\n const space = (paint as { interpolate?: string }).interpolate;\n return space != null && space !== 'rgb' && INTERPOLATE_SPACES.has(space);\n}\n\n/** The local name of a tag, prefix stripped. */\nfunction localName(tag: string): string {\n const i = tag.indexOf(':');\n return (i < 0 ? tag : tag.slice(i + 1)).toLowerCase();\n}\n\nconst GRADIENT_TAGS = new Set([\n 'lineargradient', 'radialgradient', 'conicgradient', `${WEASEL_NS_PREFIX}:conicgradient`,\n 'meshgradient', `${WEASEL_NS_PREFIX}:meshgradient`,\n]);\n\nconst XLINK_NS = 'http://www.w3.org/1999/xlink';\n\n/** Read every gradient definition in the document, keyed by element id. */\nexport function collectGradients(svg: Element, onWarn?: (m: string) => void): GradientTable {\n const out: GradientTable = new Map();\n const elements = collectElementsByTag(svg, GRADIENT_TAGS);\n for (const [id, el] of elements) {\n const tag = localName(el.tagName);\n const paint = tag === 'lineargradient'\n ? readLinearGradient(el, elements, onWarn)\n : tag === 'conicgradient'\n ? readConicGradient(el, elements, onWarn)\n : tag === 'meshgradient'\n ? readMeshGradient(el, onWarn)\n : readRadialGradient(el, elements, onWarn);\n if (paint) out.set(id, paint);\n }\n warnUnsupportedDefsChildren(svg, onWarn);\n return out;\n}\n\n/** Paint servers, `<marker>` and `<clipPath>` aside, a `<defs>` child is\n * something this package does not model (a `<use>` template, a `<filter>`).\n * Say so once here. */\nfunction warnUnsupportedDefsChildren(svg: Element, onWarn?: (m: string) => void): void {\n if (!onWarn) return;\n const defs = svg.getElementsByTagName('defs');\n for (let d = 0; d < defs.length; d++) {\n const root = defs[d];\n for (let i = 0; i < root.children.length; i++) {\n const child = root.children[i];\n const tag = child.tagName.toLowerCase();\n if (GRADIENT_TAGS.has(tag) || GRADIENT_TAGS.has(localName(tag))) continue;\n if (tag === 'pattern' || tag === 'marker' || tag === 'clippath') continue;\n onWarn(`unsupported <defs> child: <${child.tagName}>`);\n }\n }\n}\n\n/**\n * The gradient a `href` / `xlink:href` attribute points at, or null. SVG lets\n * one gradient inherit another's stops and attributes this way, and authoring\n * tools lean on it heavily — a chain that isn't followed resolves to a\n * gradient with no stops, which paints nothing.\n */\nfunction hrefTarget(el: Element, elements: ElementTable): Element | null {\n const raw = el.getAttribute('href')\n ?? el.getAttributeNS(XLINK_NS, 'href')\n ?? el.getAttribute('xlink:href');\n if (!raw || !raw.startsWith('#')) return null;\n return elements.get(raw.slice(1)) ?? null;\n}\n\n/** An attribute's value on `el` or, when absent, on the gradient it inherits\n * from. `seen` breaks a reference cycle. */\nfunction inheritedAttr(\n el: Element, elements: ElementTable, name: string, seen: Set<Element> = new Set(),\n): string | null {\n if (el.hasAttribute(name)) return el.getAttribute(name);\n seen.add(el);\n const ref = hrefTarget(el, elements);\n if (!ref || seen.has(ref)) return null;\n return inheritedAttr(ref, elements, name, seen);\n}\n\n/** `el`'s own stops or, when it declares none, the stops it inherits. */\nfunction inheritedStops(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n seen: Set<Element> = new Set(),\n): GradStop[] {\n const own = readStops(el, onWarn);\n if (own.length > 0) return own;\n seen.add(el);\n const ref = hrefTarget(el, elements);\n if (!ref || seen.has(ref)) return own;\n return inheritedStops(ref, elements, onWarn, seen);\n}\n\n/** Parse a `stop-opacity` / offset value that may carry a `%` suffix. */\nfunction parseRatio(raw: string): number {\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return NaN;\n return raw.trimEnd().endsWith('%') ? n / 100 : n;\n}\n\nfunction readStops(el: Element, onWarn?: (m: string) => void): GradStop[] {\n const stops: GradStop[] = [];\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if (c.tagName.toLowerCase() !== 'stop') continue;\n const offsetRaw = parseRatio(c.getAttribute('offset') ?? '0');\n const offset = Number.isFinite(offsetRaw) ? offsetRaw : 0;\n const colorAttr = c.getAttribute('stop-color') ?? '#000000';\n const parsed = parsePaintAttr(colorAttr);\n if (parsed && parsed.kind === 'solid') {\n const opacityAttr = c.getAttribute('stop-opacity');\n const own = opacityAttr != null ? parseRatio(opacityAttr) : NaN;\n const alpha = Number.isFinite(own) ? own : parsed.alpha;\n stops.push({ offset, color: alpha < 1 ? applyAlpha(parsed.color, alpha) : parsed.color });\n } else {\n onWarn?.(`gradient stop has unrecognized stop-color: ${colorAttr}`);\n stops.push({ offset, color: '#000000' });\n }\n }\n return stops;\n}\n\nfunction applyAlpha(hex: string, alpha: number): string {\n // Pack alpha into an 8-digit hex so it round-trips through weasel's\n // string-color storage. This is non-standard CSS hex but parses cleanly\n // back via our color.ts parser.\n const a = Math.max(0, Math.min(255, Math.round(alpha * 255)));\n return `${hex}${a.toString(16).padStart(2, '0')}`;\n}\n\n/** SVG `gradientUnits` → the kit's `GradientUnits`. SVG's default is\n * `objectBoundingBox`, which is what the attribute defaults above assume\n * (`x2=\"1\"`, `r=\"0.5\"`), so the two have to be read together. */\nfunction readGradientUnits(el: Element, elements: ElementTable): 'bounds' | 'world' {\n return inheritedAttr(el, elements, 'gradientUnits') === 'userSpaceOnUse' ? 'world' : 'bounds';\n}\n\n/** `gradientTransform` has no slot in the kit's gradient model, so a gradient\n * carrying one paints in the wrong place rather than not at all. */\nfunction warnGradientTransform(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): void {\n const t = inheritedAttr(el, elements, 'gradientTransform');\n if (t != null && t.trim() !== '') {\n onWarn?.(`gradientTransform=\"${t}\" is not modeled; the gradient paints untransformed`);\n }\n}\n\nfunction num(raw: string | null, fallback: number): number {\n if (raw == null) return fallback;\n const n = parseRatio(raw);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction readLinearGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'linear-gradient',\n from: {\n x: num(inheritedAttr(el, elements, 'x1'), 0),\n y: num(inheritedAttr(el, elements, 'y1'), 0),\n },\n to: {\n x: num(inheritedAttr(el, elements, 'x2'), 1),\n y: num(inheritedAttr(el, elements, 'y2'), 0),\n },\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n interpolate: readInterpolate(el, elements),\n };\n}\n\nfunction readRadialGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'radial-gradient',\n center: {\n x: num(inheritedAttr(el, elements, 'cx'), 0.5),\n y: num(inheritedAttr(el, elements, 'cy'), 0.5),\n },\n radius: num(inheritedAttr(el, elements, 'r'), 0.5),\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n interpolate: readInterpolate(el, elements),\n };\n}\n\nfunction readConicGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'conic-gradient',\n center: {\n x: num(inheritedAttr(el, elements, 'cx'), 0.5),\n y: num(inheritedAttr(el, elements, 'cy'), 0.5),\n },\n angle: num(inheritedAttr(el, elements, 'angle'), 0),\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n interpolate: readInterpolate(el, elements),\n };\n}\n\n/**\n * A `<wzl:meshGradient>` back into the `mesh-gradient` paint core registers.\n *\n * Every patch carries all twelve (or sixteen) of its points, so nothing here\n * infers a shared edge — the trap that makes SVG's own abandoned\n * `<meshgradient>` hard to read correctly. A patch whose attributes do not\n * parse is dropped with a warning rather than guessed at: a mesh missing a\n * patch is visibly wrong, where a mesh holding an invented one is not.\n */\nfunction readMeshGradient(el: Element, onWarn?: (m: string) => void): FillStyle | null {\n const patches: { points: { x: number; y: number }[]; colors: string[] }[] = [];\n for (let i = 0; i < el.children.length; i++) {\n const child = el.children[i];\n if (localName(child.tagName) !== 'patch') continue;\n const points = (child.getAttribute('points') ?? '').trim().split(/\\s+/)\n .filter(Boolean)\n .map((pair) => {\n const [x, y] = pair.split(',').map(Number);\n return { x, y };\n });\n const colors = (child.getAttribute('colors') ?? '').trim().split(/\\s+/).filter(Boolean);\n const sane = (points.length === 12 || points.length === 16)\n && points.every((p) => Number.isFinite(p.x) && Number.isFinite(p.y))\n && colors.length === 4;\n if (!sane) {\n onWarn?.(`<${WEASEL_NS_PREFIX}:patch> with ${points.length} points and ${colors.length} colors — dropped`);\n continue;\n }\n patches.push({ points, colors });\n }\n if (patches.length === 0) return null;\n const space = el.getAttribute('interpolate') ?? el.getAttributeNS(WEASEL_NS, 'interpolate');\n return {\n fill: 'mesh-gradient',\n patches,\n units: el.getAttribute('gradientUnits') === 'objectBoundingBox' ? 'bounds' : 'world',\n ...(space === 'oklab' || space === 'oklch' ? { interpolate: space } : {}),\n } as unknown as FillStyle;\n}\n\n/**\n * Pre-pass that assigns stable serialization ids to the paint servers —\n * gradients and patterns — used by any leaf in the tree. We key on object\n * identity so two leaves sharing the exact same `FillStyle` reference reuse\n * one `<defs>` entry; structurally equal but distinct objects get separate\n * ids.\n */\nexport class PaintServerRegistry {\n private byPaint = new Map<FillStyle, string>();\n private order: FillStyle[] = [];\n private counter = 0;\n\n // Marker keys referenced by any stroke, in first-use order. The `<defs>`\n // id is the marker key itself, not a minted counter id: `parseSvg` reads a\n // `marker-end=\"url(#id)\"` fragment back as the marker key directly when the\n // registry knows it, so a synthetic id would come back as a stranger.\n private markerKeys: string[] = [];\n private markerKeySet = new Set<string>();\n\n // Clip paths, in first-use order. Identity, not value: two groups clipped by\n // equal outlines get a def each, which costs bytes and misleads nobody.\n private clips: Path[] = [];\n private clipIds = new Map<Path, string>();\n\n register(paint: FillStyle): string {\n const existing = this.byPaint.get(paint);\n if (existing) return existing;\n const id = paint.fill === 'pattern' ? `pat${this.counter++}` : `grad${this.counter++}`;\n this.byPaint.set(paint, id);\n this.order.push(paint);\n return id;\n }\n\n /**\n * The `fill` / `stroke` attribute value referencing this paint server: a\n * `url(#id)` reference, plus the fallback paint SVG's own grammar allows\n * after one for any kind SVG cannot express. A renderer that cannot resolve\n * the reference takes the fallback instead of dropping the fill, which is\n * the difference between a flat shape and a vanished one.\n */\n ref(paint: FillStyle): string {\n const id = this.register(paint);\n if (hasNativeSvgForm(paint)) return `url(#${id})`;\n return `url(#${id}) ${paintFallback(paint)}`;\n }\n\n /** Whether any registered paint serializes outside SVG's own vocabulary, so\n * the root has to declare {@link WEASEL_NS}. */\n usesPrivateNamespace(): boolean {\n return this.order.some((paint) => !hasNativeSvgForm(paint) || usesInterpolateAttr(paint));\n }\n\n /** The `<defs>` id for a marker key — the key itself, minting nothing.\n * `undefined` when nothing is registered under `key`, so a caller emits no\n * attribute at all rather than a `url(#…)` pointing at a def that will\n * never be written. */\n markerId(key: string): string | undefined {\n if (getMarker(key) === undefined) return undefined;\n if (!this.markerKeySet.has(key)) {\n this.markerKeySet.add(key);\n this.markerKeys.push(key);\n }\n return key;\n }\n\n /** Mint (or recall) the `<defs>` id for a clip outline. */\n clipId(path: Path): string {\n const existing = this.clipIds.get(path);\n if (existing) return existing;\n const id = `clip${this.clips.length}`;\n this.clipIds.set(path, id);\n this.clips.push(path);\n return id;\n }\n\n /** Emit `<defs>...</defs>` XML for every registered paint server, marker\n * and clip path. */\n toDefsXml(onWarn?: (m: string) => void): string {\n if (this.order.length === 0 && this.markerKeys.length === 0 && this.clips.length === 0) {\n return '';\n }\n const parts: string[] = ['<defs>'];\n for (const paint of this.order) {\n parts.push(paintServerXml(this.byPaint.get(paint)!, paint, onWarn));\n }\n for (const key of this.markerKeys) {\n const entry = getMarker(key);\n if (!entry) continue;\n parts.push(entry.toSvg ? entry.toSvg(key, entry) : defaultMarkerXml(key, entry, onWarn));\n }\n for (const path of this.clips) {\n parts.push(\n `<clipPath id=\"${this.clipIds.get(path)!}\">`\n + `<path d=\"${serializePathD(path)}\"/>`\n + '</clipPath>',\n );\n }\n parts.push('</defs>');\n return parts.join('');\n }\n}\n\n/** The `<marker>` def for an entry with no `toSvg` of its own. */\nfunction defaultMarkerXml(id: string, entry: MarkerEntry, onWarn?: (m: string) => void): string {\n const path = entry.path({ size: 1, stroke: { paint: { fill: 'solid', color: '#000' } } });\n const d = serializePathD(path);\n const fill = markerPaintAttrs('fill', entry.fill, id, onWarn);\n const outline = entry.outline\n ? ` ${markerPaintAttrs('stroke', entry.outline.paint, id, onWarn)} stroke-width=\"${trimNumber(entry.outline.width)}\"`\n + ' stroke-linecap=\"round\" stroke-linejoin=\"round\"'\n : '';\n // The kit turns every start marker around, which is what SVG 2 spells\n // `auto-start-reverse`; plain `auto` would point a start head into the line.\n const orient = typeof entry.orient === 'number'\n ? trimNumber((entry.orient * 180) / Math.PI)\n : 'auto-start-reverse';\n // `overflow=\"visible\"` overrides the UA default of `hidden`, which would\n // otherwise clip the arrowhead to the marker's viewport.\n return (\n `<marker id=\"${id}\" markerUnits=\"strokeWidth\" markerWidth=\"8\" markerHeight=\"8\"` +\n ` refX=\"0\" refY=\"0\" orient=\"${orient}\" overflow=\"visible\">` +\n `<path d=\"${d}\" ${fill}${outline}/></marker>`\n );\n}\n\n/** A marker paint as `fill` / `stroke` attributes. `'line'` is SVG 2's\n * `context-stroke`; a paint server has no `<defs>` slot from here, so it\n * falls back to the line's paint and says so. */\nfunction markerPaintAttrs(\n attr: 'fill' | 'stroke',\n paint: MarkerPaint | undefined,\n id: string,\n onWarn?: (m: string) => void,\n): string {\n if (paint === 'none') return `${attr}=\"none\"`;\n if (paint === undefined || paint === 'line') return `${attr}=\"context-stroke\"`;\n if ('color' in paint && (paint.fill === undefined || paint.fill === 'solid')) {\n return paint.opacity != null && paint.opacity !== 1\n ? `${attr}=\"${paint.color}\" ${attr}-opacity=\"${trimNumber(paint.opacity)}\"`\n : `${attr}=\"${paint.color}\"`;\n }\n onWarn?.(`marker \"${id}\" ${attr} is a paint server, which a <marker> def cannot reference here; written as the line's paint`);\n return `${attr}=\"context-stroke\"`;\n}\n\n/** One paint server's `<defs>` entry: the built-in mapping, else the kind's\n * own `toSvg`, else nothing plus a warning. The referencing element already\n * carries `fill=\"url(#id)\"`, so a silent omission is a dangling reference and\n * the shape vanishes in a viewer. */\nfunction paintServerXml(id: string, paint: FillStyle, onWarn?: (m: string) => void): string {\n if (paint.fill === 'pattern') return patternXml(id, paint, onWarn);\n const builtin = gradientXml(id, paint);\n if (builtin) return builtin;\n const custom = getPaintKind(paint.fill)?.toSvg?.(id, paint);\n if (custom) return custom;\n onWarn?.(`${paint.fill} fill has no vector form — omitted from <defs>`);\n return '';\n}\n\n/** `GradientUnits` → SVG `gradientUnits`. `'screen'` (the kit's default, and\n * a viewport-fixed wash) has no SVG analog at all; it lowers to user space,\n * which at least puts the paint somewhere the geometry is. */\nfunction gradientUnitsAttr(units: GradientUnits | undefined): string {\n return units === 'bounds' ? 'objectBoundingBox' : 'userSpaceOnUse';\n}\n\nfunction gradientXml(id: string, paint: FillStyle): string {\n if (paint.fill === 'linear-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<linearGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `x1=\"${trimNumber(paint.from.x)}\" y1=\"${trimNumber(paint.from.y)}\" ` +\n `x2=\"${trimNumber(paint.to.x)}\" y2=\"${trimNumber(paint.to.y)}\"` +\n `${interpolateAttr(paint.interpolate)}>${stops}</linearGradient>`\n );\n }\n if (paint.fill === 'conic-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n const P = WEASEL_NS_PREFIX;\n return (\n `<${P}:conicGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `cx=\"${trimNumber(paint.center.x)}\" cy=\"${trimNumber(paint.center.y)}\" ` +\n `angle=\"${trimNumber(paint.angle)}\"` +\n `${interpolateAttr(paint.interpolate)}>${stops}</${P}:conicGradient>`\n );\n }\n if (paint.fill === 'radial-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<radialGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `cx=\"${trimNumber(paint.center.x)}\" cy=\"${trimNumber(paint.center.y)}\" ` +\n `r=\"${trimNumber(paint.radius)}\"` +\n `${interpolateAttr(paint.interpolate)}>${stops}</radialGradient>`\n );\n }\n return '';\n}\n\n/**\n * The color a renderer that cannot resolve the reference should paint. `none`\n * when the paint has no single color to name — nothing painted is at least\n * honest, where an invented black is not.\n */\nfunction paintFallback(paint: FillStyle): string {\n const color = getPaintKind(paint.fill)?.colorOf(paint);\n if (!color) return 'none';\n // Whoever reads the fallback is by definition an older renderer, so the\n // packed alpha comes off rather than riding out as an 8-digit hex.\n const packed = /^#([0-9a-f]{6})[0-9a-f]{2}$/i.exec(color);\n return packed ? `#${packed[1].toLowerCase()}` : color;\n}\n\nfunction stopXml(s: GradStop): string {\n // Detect packed-alpha hex (#rrggbbaa) and split out stop-opacity.\n const m = /^#([0-9a-f]{6})([0-9a-f]{2})$/i.exec(s.color);\n if (m) {\n const alpha = parseInt(m[2], 16) / 255;\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"#${m[1].toLowerCase()}\" stop-opacity=\"${trimNumber(alpha)}\"/>`;\n }\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"${s.color}\"/>`;\n}\n","/**\n * Serialize a `SvgNode[]` tree to an SVG document string. Every leaf is\n * emitted as a `<path>` (even shapes that started as `<rect>` etc.) —\n * lossless geometry round-trip beats round-tripping the element-kind\n * label. Gradient paints are gathered into a single `<defs>` block.\n */\n\nimport type { Path, Stroke, StrokeAlign } from '@weasel-js/core';\nimport { boundsOfPath, resolveScreenLength, SCRIPT_METRICS } from '@weasel-js/core';\nimport type {\n Matrix, NamespaceMeta, NamespacedElement, SerializeOptions, SvgGroupNode,\n SvgNode, SvgPaint, SvgPathNode, SvgStroke, SvgTextNode, SvgImageNode,\n} from './types';\nimport { IDENTITY_MATRIX } from './types';\nimport { serializePathD } from './path-serializer';\nimport { formatMatrix, multiply, trimNumber } from './transform';\nimport { PaintServerRegistry, WEASEL_NS, WEASEL_NS_PREFIX } from './gradients';\nimport { anchorOffset } from './textAnchor';\n\n/**\n * Walk the tree and produce an SVG document string. The root `<svg>`'s\n * `viewBox` is taken from `opts.viewBox` if supplied, otherwise computed\n * as a tight bounding box around every leaf.\n */\nexport function serializeSvg(nodes: SvgNode[], opts: SerializeOptions = {}): string {\n const registry = new PaintServerRegistry();\n registerPaintServers(nodes, registry);\n\n const bounds = opts.viewBox ?? computeBounds(nodes);\n const vb = `${trimNumber(bounds.x)} ${trimNumber(bounds.y)} ${trimNumber(bounds.width)} ${trimNumber(bounds.height)}`;\n const namespaces = opts.namespaces ?? {};\n\n const rootAttrs: string[] = [`xmlns=\"http://www.w3.org/2000/svg\"`];\n // Declared before the caller's namespaces and only when something needs it,\n // so a document of ordinary paints carries no trace of it. The paint pre-pass\n // above has already seen every paint, so this answer is final.\n if (registry.usesPrivateNamespace() && namespaces[WEASEL_NS_PREFIX] == null) {\n rootAttrs.push(`xmlns:${WEASEL_NS_PREFIX}=\"${WEASEL_NS}\"`);\n }\n for (const [prefix, uri] of Object.entries(namespaces)) {\n rootAttrs.push(`xmlns:${prefix}=\"${escapeAttr(uri)}\"`);\n }\n rootAttrs.push(`viewBox=\"${vb}\"`);\n if (opts.width != null) rootAttrs.push(`width=\"${trimNumber(opts.width)}\"`);\n if (opts.height != null) rootAttrs.push(`height=\"${trimNumber(opts.height)}\"`);\n // documentMeta attrs onto the root, in declared-namespace order.\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n rootAttrs.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n }\n\n // documentMeta elements after <defs>, before geometry body.\n let docMetaXml = '';\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) docMetaXml += namespacedElementXml(prefix, localName, el);\n }\n }\n }\n\n const defsXml = registry.toDefsXml(opts.onWarn);\n // Once per message: a hundred inner-aligned strokes are one fact.\n const said = new Set<string>();\n const warn: Warn = (m) => {\n if (!opts.onWarn || said.has(m)) return;\n said.add(m);\n opts.onWarn(m);\n };\n const bodyXml = nodes.map((n) => nodeXml(n, registry, namespaces, warn)).join('');\n\n // `<title>` goes immediately inside `<svg>` per SVG-spec convention; it's\n // an accessibility hook and (for our purposes) a stable place to round-trip\n // the user-visible document title.\n const titleXml = opts.title && opts.title.length > 0\n ? `<title>${escapeText(opts.title)}</title>`\n : '';\n\n return `<svg ${rootAttrs.join(' ')}>${titleXml}${defsXml}${docMetaXml}${bodyXml}</svg>`;\n}\n\nfunction namespacedElementXml(prefix: string, localName: string, el: NamespacedElement): string {\n const attrs: string[] = [];\n for (const [name, value] of Object.entries(el.attrs)) {\n attrs.push(`${name}=\"${escapeAttr(value)}\"`);\n }\n const head = attrs.length > 0 ? `<${prefix}:${localName} ${attrs.join(' ')}>` : `<${prefix}:${localName}>`;\n let body = '';\n if (el.children) {\n for (const [childName, list] of Object.entries(el.children)) {\n for (const child of list) body += namespacedElementXml(prefix, childName, child);\n }\n } else if (el.text != null) {\n body = escapeText(el.text);\n }\n return `${head}${body}</${prefix}:${localName}>`;\n}\n\nfunction metaAttrsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n const parts: string[] = [];\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n parts.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n return parts.length > 0 ? ` ${parts.join(' ')}` : '';\n}\n\nfunction metaElementsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n let out = '';\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) out += namespacedElementXml(prefix, localName, el);\n }\n }\n return out;\n}\n\nfunction registerPaintServers(nodes: SvgNode[], registry: PaintServerRegistry): void {\n for (const n of nodes) {\n if (n.kind === 'group') {\n if (n.clip) registry.clipId(n.clip);\n registerPaintServers(n.children, registry);\n } else if (n.kind === 'path') {\n if (n.fill.kind === 'gradient') registry.register(n.fill.paint);\n if (n.stroke && n.stroke.paint.kind === 'gradient') registry.register(n.stroke.paint.paint);\n registerMarkers(n.stroke, registry);\n } else if (n.kind === 'text') {\n // Text paints flow through `style` / `runs` rather than a top-level\n // SvgPaint, so register direct FillStyle references when present. This\n // pre-pass is load-bearing: `<defs>` is emitted before the body, so a\n // paint first seen while writing an element would be referenced by an\n // id that no definition backs.\n registerTextPaint(n.fill, registry);\n registerTextPaint(n.stroke?.paint, registry);\n registerMarkers(n.stroke, registry);\n for (const run of n.runs ?? []) {\n registerTextPaint(run.fill, registry);\n registerTextPaint(run.stroke?.paint, registry);\n }\n }\n }\n}\n\n/** Register one text paint if it is a paint server rather than a colour. */\nfunction registerTextPaint(\n paint: import('@weasel-js/core').FillStyle | null | undefined,\n registry: PaintServerRegistry,\n): void {\n if (paint && !('color' in paint)) registry.register(paint);\n}\n\n/** A marker reference in either shape — `SvgStroke` stores a bare key, the kit\n * `Stroke` stores a `MarkerRef`. */\nfunction markerKeyOfRef(ref: unknown): string | undefined {\n if (typeof ref === 'string') return ref;\n if (ref && typeof ref === 'object' && 'key' in ref) return String((ref as { key: string }).key);\n return undefined;\n}\n\n/** Mint a `<defs>` id for every marker a stroke names, before the body is\n * written — same reason as the paint pre-pass above. */\nfunction registerMarkers(\n stroke: { markerStart?: unknown; markerMid?: unknown; markerEnd?: unknown } | undefined,\n registry: PaintServerRegistry,\n): void {\n if (!stroke) return;\n for (const ref of [stroke.markerStart, stroke.markerMid, stroke.markerEnd]) {\n const key = markerKeyOfRef(ref);\n if (key) registry.markerId(key);\n }\n}\n\ntype Warn = (message: string) => void;\n\nfunction nodeXml(\n node: SvgNode, registry: PaintServerRegistry, namespaces: Record<string, string>, warn: Warn,\n): string {\n if (node.kind === 'group') return groupXml(node, registry, namespaces, warn);\n if (node.kind === 'text') return textXml(node, registry, namespaces, warn);\n if (node.kind === 'image') return imageXml(node, namespaces);\n return pathXml(node, registry, namespaces, warn);\n}\n\n/** SVG 1.1 has no stroke alignment; SVG 2's `stroke-alignment` never shipped\n * in a browser. */\nfunction warnStrokeAlign(align: StrokeAlign | undefined, warn: Warn): void {\n if (align && align !== 'center') {\n warn(`a stroke aligned \"${align}\" of its edge is written centered: SVG has no stroke alignment`);\n }\n}\n\n/**\n * Emit an `<image>`. `preserveAspectRatio=\"none\"` is unconditional: the node\n * carries a literal box and nothing else, so letting a viewer letterbox it\n * would place the pixels somewhere the model never said.\n *\n * A source rect or a flip takes the cropped form described on `SvgImageNode`.\n * The nested `<svg>` cannot carry the rotation itself — SVG 1.1 gives it no\n * `transform` — so the rotation, opacity and meta go on the wrapping `<g>`.\n */\nfunction imageXml(node: SvgImageNode, namespaces: Record<string, string>): string {\n const box = `x=\"${trimNumber(node.x)}\" y=\"${trimNumber(node.y)}\"`\n + ` width=\"${trimNumber(node.width)}\" height=\"${trimNumber(node.height)}\"`;\n const outer: string[] = [];\n if (node.opacity != null && node.opacity !== 1) {\n outer.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n outer.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n const href = `href=\"${escapeAttr(node.href)}\"`;\n\n if (!node.source && !node.flipX && !node.flipY) {\n const attrs = [href, box, 'preserveAspectRatio=\"none\"', ...outer].join(' ');\n if (metaEls) return `<image ${attrs}${metaAttrs}>${metaEls}</image>`;\n return `<image ${attrs}${metaAttrs}/>`;\n }\n\n const src = node.source ?? { x: 0, y: 0, width: 1, height: 1 };\n const viewBox = [src.x, src.y, src.width, src.height].map(trimNumber).join(' ');\n // A mirror about the source window's center, so the flipped image still\n // fills exactly the window the viewport shows.\n const flip = node.flipX || node.flipY\n ? ` transform=\"matrix(${node.flipX ? -1 : 1} 0 0 ${node.flipY ? -1 : 1}`\n + ` ${trimNumber(node.flipX ? 2 * src.x + src.width : 0)}`\n + ` ${trimNumber(node.flipY ? 2 * src.y + src.height : 0)})\"`\n : '';\n const head = ['<g data-weasel-image=\"true\"', ...outer].join(' ');\n return `${head}${metaAttrs}>`\n + `<svg ${box} viewBox=\"${viewBox}\" preserveAspectRatio=\"none\">`\n + `<image ${href} x=\"0\" y=\"0\" width=\"1\" height=\"1\" preserveAspectRatio=\"none\"${flip}/>`\n + `</svg>${metaEls}</g>`;\n}\n\nfunction groupXml(\n node: SvgGroupNode, registry: PaintServerRegistry, namespaces: Record<string, string>, warn: Warn,\n): string {\n const attrs: string[] = [];\n if (node.transform) {\n const m = formatMatrix(node.transform);\n if (m) attrs.push(`transform=\"${m}\"`);\n }\n if (node.clip) {\n attrs.push(`clip-path=\"url(#${registry.clipId(node.clip)})\"`);\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n // `metaAttrs` already starts with a leading space (or is empty), so we\n // can splice it after the existing attr list without extra logic.\n const head = attrs.length > 0\n ? `<g ${attrs.join(' ')}${metaAttrs}>`\n : `<g${metaAttrs}>`;\n const body = node.children.map((c) => nodeXml(c, registry, namespaces, warn)).join('');\n return `${head}${body}${metaElementsXml(node.meta, namespaces)}</g>`;\n}\n\nfunction pathXml(\n node: SvgPathNode, registry: PaintServerRegistry, namespaces: Record<string, string>, warn: Warn,\n): string {\n const attrs: string[] = [`d=\"${serializePathD(node.path)}\"`];\n const fillAttrs = paintAttrs(node.fill, 'fill', registry);\n for (const a of fillAttrs) attrs.push(a);\n // Emit fill-rule only when it diverges from SVG's default ('nonzero').\n // RectPath has no fillRule field — only PolygonPath carries one.\n if (node.path.kind === 'polygon' && node.path.fillRule === 'evenodd') {\n attrs.push(`fill-rule=\"evenodd\"`);\n }\n if (node.stroke) {\n const strokeAttrs = strokeAttrsFor(node.stroke, registry, warn);\n for (const a of strokeAttrs) attrs.push(a);\n } else {\n attrs.push('stroke=\"none\"');\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const b = pathBounds(node.path);\n const cx = b.minX + (b.maxX - b.minX) / 2;\n const cy = b.minY + (b.maxY - b.minY) / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n if (metaEls) {\n return `<path ${attrs.join(' ')}${metaAttrs}>${metaEls}</path>`;\n }\n return `<path ${attrs.join(' ')}${metaAttrs}/>`;\n}\n\nfunction paintAttrs(\n paint: SvgPaint,\n name: 'fill' | 'stroke',\n registry: PaintServerRegistry,\n includeOpacity = true,\n): string[] {\n if (paint.kind === 'none') return [`${name}=\"none\"`];\n if (paint.kind === 'solid') {\n const out = [`${name}=\"${paint.color}\"`];\n if (includeOpacity && paint.opacity != null && paint.opacity !== 1) {\n out.push(`${name}-opacity=\"${trimNumber(paint.opacity)}\"`);\n }\n return out;\n }\n // gradient\n return [`${name}=\"${registry.ref(paint.paint)}\"`];\n}\n\n/**\n * Attributes for a kit `Stroke` — the shape text carries, whose `paint` is a\n * `FillStyle` rather than an `SvgPaint`. Text strokes ride inside\n * `TextStyle` / `StyledRun` rather than as a node-level `SvgStroke`, because\n * that is where the kit's text model puts them.\n *\n * Absent, unpainted, or zero-width emits nothing at all: unstroked text should\n * not carry a `stroke` attribute, and SVG's own default (`none`) already says\n * so.\n */\n/**\n * `stroke-width`, plus `vector-effect` when the width is in screen pixels.\n *\n * A `{ px }` width means \"this thickness once rendered, whatever the view is\n * doing\", which is exactly what `non-scaling-stroke` says — so the number goes\n * out unresolved and the attribute carries the unit. There is no accumulated\n * transform scale here to resolve it against, and picking one would bake a\n * single zoom level into the document.\n */\nfunction strokeWidthAttrs(width: number | { px: number }): string[] {\n if (typeof width === 'number') return [`stroke-width=\"${trimNumber(width)}\"`];\n return [`stroke-width=\"${trimNumber(width.px)}\"`, 'vector-effect=\"non-scaling-stroke\"'];\n}\n\nfunction coreStrokeAttrs(stroke: Stroke | undefined, registry: PaintServerRegistry, warn: Warn): string[] {\n const paint = stroke?.paint;\n if (!stroke || !paint) return [];\n const width = stroke.width ?? 1;\n if (!((typeof width === 'object' ? width.px : width) > 0)) return [];\n warnStrokeAlign(stroke.align, warn);\n const attrs: string[] = [];\n if ('color' in paint) {\n attrs.push(`stroke=\"${paint.color}\"`);\n if (paint.opacity != null && paint.opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(paint.opacity)}\"`);\n }\n } else {\n attrs.push(`stroke=\"${registry.ref(paint)}\"`);\n }\n attrs.push(...strokeWidthAttrs(width));\n if (stroke.cap) attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n if (stroke.join) attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n for (const [field, attr] of [\n ['markerStart', 'marker-start'],\n ['markerMid', 'marker-mid'],\n ['markerEnd', 'marker-end'],\n ] as const) {\n const ref = stroke[field];\n if (ref === undefined) continue;\n const key = typeof ref === 'string' ? ref : ref.key;\n const id = registry.markerId(key);\n if (id === undefined) continue;\n attrs.push(`${attr}=\"url(#${id})\"`);\n }\n return attrs;\n}\n\nfunction strokeAttrsFor(stroke: SvgStroke, registry: PaintServerRegistry, warn: Warn): string[] {\n warnStrokeAlign(stroke.align, warn);\n // `SvgStroke.opacity` and the paint's own `opacity` are two models of one\n // SVG attribute, and parse fills in both. Emitting each would write\n // `stroke-opacity` twice, which is not well-formed XML at all.\n const attrs = paintAttrs(stroke.paint, 'stroke', registry, false);\n attrs.push(...strokeWidthAttrs(stroke.width));\n const opacity = stroke.opacity\n ?? (stroke.paint.kind === 'solid' ? stroke.paint.opacity : undefined);\n if (opacity != null && opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(opacity)}\"`);\n }\n if (stroke.cap) {\n attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n }\n if (stroke.join) {\n attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n }\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) {\n attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n }\n for (const [field, attr] of [\n ['markerStart', 'marker-start'],\n ['markerMid', 'marker-mid'],\n ['markerEnd', 'marker-end'],\n ] as const) {\n const ref = stroke[field];\n if (ref === undefined) continue;\n const id = registry.markerId(ref);\n if (id === undefined) continue;\n attrs.push(`${attr}=\"url(#${id})\"`);\n }\n return attrs;\n}\n\n/**\n * Tight bounding box around everything the tree draws, in the root's\n * coordinates — the fallback `viewBox` when the caller supplies none. A\n * node's `rotation` and a group's `transform` both move ink, so both are\n * applied here; a box taken from unrotated geometry crops the document.\n */\nfunction computeBounds(nodes: SvgNode[]): { x: number; y: number; width: number; height: number } {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n const visit = (n: SvgNode, ctm: Matrix): void => {\n if (n.kind === 'group') {\n const childCtm = n.transform ? multiply(ctm, n.transform) : ctm;\n n.children.forEach((c) => visit(c, childCtm));\n return;\n }\n const b = n.kind === 'text' || n.kind === 'image'\n ? { minX: n.x, minY: n.y, maxX: n.x + n.width, maxY: n.y + n.height }\n : pathBounds(n.path);\n const local = n.rotation ? rotateAboutCenter(ctm, b, n.rotation) : ctm;\n for (const [x, y] of corners(b)) {\n const px = local[0] * x + local[2] * y + local[4];\n const py = local[1] * x + local[3] * y + local[5];\n if (px < minX) minX = px;\n if (py < minY) minY = py;\n if (px > maxX) maxX = px;\n if (py > maxY) maxY = py;\n }\n };\n nodes.forEach((n) => visit(n, IDENTITY_MATRIX));\n if (!Number.isFinite(minX)) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction corners(b: { minX: number; minY: number; maxX: number; maxY: number }): [number, number][] {\n return [[b.minX, b.minY], [b.maxX, b.minY], [b.maxX, b.maxY], [b.minX, b.maxY]];\n}\n\n/** `ctm` composed with the same `rotate(angle cx cy)` the element emits. */\nfunction rotateAboutCenter(\n ctm: Matrix,\n b: { minX: number; minY: number; maxX: number; maxY: number },\n angle: number,\n): Matrix {\n const cx = (b.minX + b.maxX) / 2;\n const cy = (b.minY + b.maxY) / 2;\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return multiply(ctm, [c, s, -s, c, cx - cx * c + cy * s, cy - cx * s - cy * c]);\n}\n\n/**\n * Emit a `<text>` element. `x` is the `text-anchor` point, per the SVG spec:\n * the box's left edge, center or right edge as its alignment resolves. Uses\n * `dominant-baseline=\"text-before-edge\"` so `y` matches weasel's top-of-box\n * pose; stashes the explicit width/height (which native SVG text doesn't\n * model) in `data-weasel-*` attributes so they round-trip through the parser\n * losslessly.\n */\nfunction textXml(\n node: SvgTextNode, registry: PaintServerRegistry, namespaces: Record<string, string>, warn: Warn,\n): string {\n const attrs: string[] = [\n `x=\"${trimNumber(node.x + anchorOffset(node.style, node.width))}\"`,\n `y=\"${trimNumber(node.y)}\"`,\n `dominant-baseline=\"text-before-edge\"`,\n // The runs model stores real line breaks; SVG's default whitespace\n // handling would collapse them (and any indentation) away on re-import.\n `xml:space=\"preserve\"`,\n `data-weasel-width=\"${trimNumber(node.width)}\"`,\n `data-weasel-height=\"${trimNumber(node.height)}\"`,\n ];\n\n const style = node.style;\n // SVG user space has no camera, so a `{ px }` size writes as that many\n // user units — the reading it already has at scale 1.\n if (style?.fontSize != null) attrs.push(`font-size=\"${trimNumber(resolveScreenLength(style.fontSize, 1))}\"`);\n if (style?.fontFamily) attrs.push(`font-family=\"${escapeAttr(style.fontFamily)}\"`);\n if (style?.fontWeight != null) attrs.push(`font-weight=\"${String(style.fontWeight)}\"`);\n if (style?.fontStyle && style.fontStyle !== 'normal') attrs.push(`font-style=\"${style.fontStyle}\"`);\n const direction = style?.direction ?? 'ltr';\n if (direction === 'rtl') attrs.push('direction=\"rtl\"');\n if (style?.align != null || direction === 'rtl') {\n // `text-anchor` is reading-order relative in SVG exactly as `start` / `end`\n // are here, so the two relative values pass straight through and only the\n // absolute pair has to be turned into an edge the reader resolves the same\n // way. Under `ltr` this collapses to what it always wrote.\n const align = style?.align ?? 'left';\n const anchor = align === 'center' ? 'middle'\n : align === 'start' ? 'start'\n : align === 'end' ? 'end'\n : (align === 'left') === (direction === 'ltr') ? 'start' : 'end';\n if (anchor !== 'start') attrs.push(`text-anchor=\"${anchor}\"`);\n }\n if (style?.letterSpacing != null && style.letterSpacing !== 0) {\n attrs.push(`letter-spacing=\"${trimNumber(resolveScreenLength(style.letterSpacing, 1))}\"`);\n }\n const decoration = textDecorationValue(style?.underline, style?.strikethrough, style?.overline);\n if (decoration) attrs.push(`text-decoration=\"${decoration}\"`);\n // SVG text never wraps, so this is for weasel's own reader, beside the box\n // width it wraps at.\n if (style?.wrap) {\n attrs.push('data-weasel-wrap=\"true\"');\n warn('text that wraps at its box width is written unwrapped: SVG text does not wrap, so other'\n + ' readers draw one line per hard break (weasel reads the wrap back)');\n }\n if (node.verticalAlign && node.verticalAlign !== 'top') {\n attrs.push(`data-weasel-vertical-align=\"${node.verticalAlign}\"`);\n warn(`text aligned to the ${node.verticalAlign} of its box is written top-aligned: SVG text has`\n + ' no box, so other readers draw it at the top (weasel reads the alignment back)');\n }\n // Note: `lineHeight` is NOT emitted here. The bridge layer (svgInterop)\n // lifts it into `meta.wd.attrs['line-height']`, which `metaAttrsXml`\n // below emits as `wd:line-height=\"...\"`. There is no compat write of\n // `data-weasel-line-height` — per the SVG-native plan's Migration section,\n // no installed base exists to compat against.\n if (node.fill === null) {\n attrs.push('fill=\"none\"');\n } else if (node.fill) {\n if ('color' in node.fill) {\n attrs.push(`fill=\"${node.fill.color}\"`);\n if (node.fill.opacity != null && node.fill.opacity !== 1) {\n attrs.push(`fill-opacity=\"${trimNumber(node.fill.opacity)}\"`);\n }\n } else {\n attrs.push(`fill=\"${registry.ref(node.fill)}\"`);\n }\n }\n for (const a of coreStrokeAttrs(node.stroke, registry, warn)) attrs.push(a);\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n\n const body = node.runs && node.runs.length > 0\n ? node.runs.map((r) => runXml(r, registry, warn)).join('')\n : escapeText(node.text);\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n return `<text ${attrs.join(' ')}${metaAttrs}>${body}${metaEls}</text>`;\n}\n\nfunction runXml(run: import('@weasel-js/core').StyledRun, registry: PaintServerRegistry, warn: Warn): string {\n const attrs: string[] = [];\n if (run.bold) attrs.push(`font-weight=\"700\"`);\n if (run.italic) attrs.push(`font-style=\"italic\"`);\n if (run.fontFamily) attrs.push(`font-family=\"${escapeAttr(run.fontFamily)}\"`);\n // A percentage `font-size` is relative to the parent's, which is what\n // `fontScale` means; an absolute `fontSize` wins over it here as it does in\n // the runs model.\n //\n // `baseline-shift=\"super\"` carries the preset's *size* as well as its rise,\n // so a run that overrode only the rise has no keyword left to say the size\n // with and must spell it out — without this the superscript comes back\n // full-size at a raised baseline.\n const presetScale = run.script != null && run.baselineShift != null\n ? SCRIPT_METRICS[run.script].size\n : undefined;\n const scale = run.fontScale ?? presetScale;\n if (run.fontSize != null) attrs.push(`font-size=\"${trimNumber(resolveScreenLength(run.fontSize, 1))}\"`);\n else if (scale != null) attrs.push(`font-size=\"${trimNumber(scale * 100)}%\"`);\n // Same story for `baseline-shift`: an SVG percentage resolves against the\n // parent's font size, which is the unit `baselineShift` is already in.\n if (run.baselineShift != null) {\n attrs.push(`baseline-shift=\"${trimNumber(run.baselineShift * 100)}%\"`);\n } else if (run.script) {\n attrs.push(`baseline-shift=\"${run.script}\"`);\n }\n // Unlike the node-level style guard above, a run-level `0` is a meaningful\n // *override* (distinct from \"inherit the node's letterSpacing\") per the\n // runs model's additive-flags contract — emit it whenever it's set.\n if (run.letterSpacing != null) {\n attrs.push(`letter-spacing=\"${trimNumber(resolveScreenLength(run.letterSpacing, 1))}\"`);\n }\n const runDecoration = textDecorationValue(run.underline, run.strikethrough, run.overline);\n if (runDecoration) attrs.push(`text-decoration=\"${runDecoration}\"`);\n if (run.fill) {\n if ('color' in run.fill) {\n attrs.push(`fill=\"${run.fill.color}\"`);\n } else {\n attrs.push(`fill=\"${registry.ref(run.fill)}\"`);\n }\n }\n for (const a of coreStrokeAttrs(run.stroke, registry, warn)) attrs.push(a);\n const head = attrs.length > 0 ? `<tspan ${attrs.join(' ')}>` : '<tspan>';\n return `${head}${escapeText(run.text)}</tspan>`;\n}\n\n/**\n * Combine the decoration flags into an SVG `text-decoration` value —\n * `\"underline line-through\"` when both are set, a single token when only\n * one is, or `null` (omit the attribute) when none is set.\n */\nfunction textDecorationValue(\n underline: boolean | undefined,\n strikethrough: boolean | undefined,\n overline: boolean | undefined,\n): string | null {\n const tokens: string[] = [];\n if (underline) tokens.push('underline');\n if (strikethrough) tokens.push('line-through');\n if (overline) tokens.push('overline');\n return tokens.length > 0 ? tokens.join(' ') : null;\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<');\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\nfunction pathBounds(path: Path): { minX: number; minY: number; maxX: number; maxY: number } {\n if (path.kind === 'rect') {\n return {\n minX: path.x, minY: path.y,\n maxX: path.x + path.width, maxY: path.y + path.height,\n };\n }\n const b = boundsOfPath(path);\n return { minX: b.x, minY: b.y, maxX: b.x + b.width, maxY: b.y + b.height };\n}\n\n","import type { ReactElement } from 'react';\nimport type { CSSProperties } from 'react';\nimport type { FillStyle, TilePatternSpec } from '@weasel-js/core';\nimport { tilePreviewCssUrl } from '@weasel-js/svg';\nimport { ToggleBar } from '../ToggleBar';\nimport s from './PatternPicker.module.css';\n\n/** The `pattern` member of the paint union. */\nexport type PatternFill = Extract<FillStyle, { fill: 'pattern' }>;\n\nconst TILES: readonly TilePatternSpec['tile'][] = ['hatch', 'crosshatch', 'dots', 'chunks'];\n\n/** Tile sizes the picker offers, coarse enough that each reads as a\n * distinct texture rather than a nudge. */\nconst TILE_SIZES: readonly { value: number; label: string }[] = [\n { value: 4, label: 'S' },\n { value: 8, label: 'M' },\n { value: 16, label: 'L' },\n { value: 32, label: 'XL' },\n];\n\nconst DEFAULT_TILE_SIZE = 8;\n\n/** Every swatch previews at one size so the grid compares tiles, not scales. */\nconst PREVIEW_SIZE = 16;\n\n/** The spec a pattern paint carries, if it carries one. A consumer-built\n * `TextureHandle` has no spec, so the picker shows no tile selected and\n * replaces it wholesale on the next click. */\nfunction specOf(fill: PatternFill): TilePatternSpec | null {\n return 'tile' in fill.pattern ? fill.pattern : null;\n}\n\n/**\n * A pattern seeded from a color. `units: 'bounds'` anchors the tile to the\n * node's box, so the texture travels with the shape.\n */\nexport function seedPattern(\n tile: TilePatternSpec['tile'],\n from: string,\n size: number = DEFAULT_TILE_SIZE,\n): PatternFill {\n const spec: TilePatternSpec = { tile, color: from, size };\n // `chunks` is a scatter over a ground rather than a line texture; without a\n // background it reads as loose specks on whatever sits beneath.\n if (tile === 'chunks') spec.bg = '#00000000';\n return { fill: 'pattern', pattern: spec, units: 'bounds' };\n}\n\n/** Props for {@link PatternPicker}. */\nexport interface PatternPickerProps {\n /** The pattern paint being edited. */\n value: PatternFill;\n /** The color new tiles are seeded with — the paint's own, normally. */\n color: string;\n /** Committed value: one call per click. A tile pick and a size change are\n * each a complete gesture, so there is no `onInput`. */\n onChange: (next: PatternFill) => void;\n className?: string;\n}\n\n/**\n * Grid of tile swatches over a size switch, each swatch previewing the real\n * tile at the current color.\n *\n * The preview shares its shape mapper with what the renderer paints, so a\n * swatch cannot drift from the texture it selects.\n */\nexport function PatternPicker(props: PatternPickerProps): ReactElement {\n const { value, color, onChange, className } = props;\n const spec = specOf(value);\n const size = spec?.size ?? DEFAULT_TILE_SIZE;\n\n const pick = (tile: TilePatternSpec['tile']): void => {\n onChange(seedPattern(tile, color, size));\n };\n\n const resize = (nextSize: number): void => {\n if (!spec) return;\n onChange({ ...value, pattern: { ...spec, size: nextSize } });\n };\n\n return (\n <div className={[s.root, className].filter(Boolean).join(' ')}>\n <div className={s.grid}>\n {TILES.map((tile) => {\n const preview: TilePatternSpec = { tile, color, size: PREVIEW_SIZE };\n if (tile === 'chunks') preview.bg = '#00000000';\n const selected = spec?.tile === tile;\n return (\n <button\n key={tile}\n type=\"button\"\n className={[s.swatch, selected && s.swatchActive].filter(Boolean).join(' ')}\n style={{ ['--tile-preview' as string]: tilePreviewCssUrl(preview) } as CSSProperties}\n title={tile}\n aria-label={tile}\n aria-pressed={selected}\n onClick={() => pick(tile)}\n />\n );\n })}\n </div>\n <ToggleBar<number>\n items={TILE_SIZES}\n value={size}\n size=\"sm\"\n ariaLabel=\"Tile size\"\n onChange={(v) => v != null && resize(v)}\n />\n </div>\n );\n}\n","import { useCallback, useRef, type ReactElement } from 'react';\nimport {\n getPaintKind,\n listPaintKinds,\n withGradientKind,\n type FillStyle,\n type GradientFill,\n type GradientKind,\n type PaintKind,\n} from '@weasel-js/core';\nimport { Icon } from '../../icons/Icon';\nimport { ICON_PATHS, type IconName } from '../../icons/paths';\nimport { ColorField } from '../ColorField';\nimport { GradientEditor } from '../GradientEditor';\nimport { MeshEditor, isMeshPaint } from '../MeshEditor';\nimport { PatternPicker, type PatternFill } from '../PatternPicker';\nimport { ToggleBar, type ToggleBarItem } from '../ToggleBar';\nimport s from './PaintInput.module.css';\n\n/** What a kind with no color of its own seeds from. */\nconst FALLBACK_COLOR = '#000000ff';\n\n/** The bar's answer for \"no paint at all\". Not a registered kind — absence\n * has no seed, no color and nothing to render — so it is this control's own\n * segment rather than a registry entry. */\nconst NONE = 'none';\n\nconst GRADIENT_KINDS: readonly string[] = [\n 'linear-gradient',\n 'radial-gradient',\n 'conic-gradient',\n];\n\nfunction isGradient(paint: FillStyle | undefined): paint is GradientFill {\n return paint !== undefined && GRADIENT_KINDS.includes(paint.fill ?? '');\n}\n\nfunction isPattern(paint: FillStyle | undefined): paint is PatternFill {\n return paint?.fill === 'pattern';\n}\n\n/** A paint's own discriminant. The solid member leaves `fill` off, and an\n * explicit `null` is the absence of paint rather than an unknown one. */\nfunction kindOf(paint: FillStyle | null | undefined): PaintKind | null {\n if (paint === null) return NONE;\n if (paint === undefined) return null;\n return paint.fill ?? 'solid';\n}\n\n/** Props for {@link PaintInput}. `onInput` fires throughout a gesture and\n * `onChange` once at its end. */\nexport interface PaintInputProps {\n /** The paint being edited. `null` is an explicit \"no paint\"; `undefined`\n * is no value to show. */\n value: FillStyle | null | undefined;\n /** Indeterminate presentation: no kind lit, and the body withheld because\n * there is no single paint to show. */\n mixed?: boolean;\n /** Dim the control — a value is in effect but was never chosen. */\n unset?: boolean;\n /** Restrict the kind bar. Default: every registered kind. */\n kinds?: readonly PaintKind[];\n /** Offer \"None\". Default `true` — the bar answers \"what kind of paint is\n * this?\" and no-paint is one of the answers. Turn it off where the slot\n * cannot express absence. */\n allowNone?: boolean;\n onInput?: (next: FillStyle | null) => void;\n onChange: (next: FillStyle | null) => void;\n /** Names the paint this control edits — `Fill`, `Color`. Carried by the\n * solid body's swatch, which is the part with a value to announce. */\n 'aria-label'?: string;\n className?: string;\n}\n\n/**\n * Editor for a whole `FillStyle` — a kind bar over whichever body that kind\n * wants.\n *\n * The bar is driven by the paint-kind registry rather than a fixed list, so a\n * consumer's registered kind appears in it and renders that entry's `Editor`.\n * The five built-in kinds keep their branch here: their editors live in this\n * package and `@weasel-js/core`, which owns the registry, cannot import it.\n *\n * Geometry is deliberately absent — on a canvas it belongs on the artwork,\n * via `<SceneGradientHandles>`.\n */\nexport function PaintInput(props: PaintInputProps): ReactElement {\n const {\n value, mixed = false, unset = false, kinds, allowNone = true,\n onInput, onChange, className,\n } = props;\n const ariaLabel = props['aria-label'];\n\n // Per-kind memory, so linear → solid → linear comes back with its stops.\n // A ref, not state: it must not survive the control being pointed at a\n // different selection, and nothing renders off it directly.\n const remembered = useRef(new Map<PaintKind, FillStyle>());\n\n const active = mixed ? null : kindOf(value);\n if (value != null && active !== null) remembered.current.set(active, value);\n\n const entries = listPaintKinds().filter(\n (entry) => kinds === undefined || kinds.includes(entry.id),\n );\n const segment = (id: string, label: string, icon: string | undefined): ToggleBarItem<PaintKind> =>\n icon && icon in ICON_PATHS\n // Icon-only: six labelled segments do not fit a property row, and the\n // full label stays the accessible name.\n // 14 to match the panel's other glyph segments. A `sm` bar is 17px tall\n // over 1px of padding, so 15 fills the segment box edge to edge.\n ? { value: id, label: <Icon name={icon as IconName} size={14} />, ariaLabel: label }\n : { value: id, label };\n\n const items: readonly ToggleBarItem<PaintKind>[] = [\n ...(allowNone ? [segment(NONE, 'None', 'paintNone')] : []),\n ...entries.map((entry) => segment(entry.id, entry.label, entry.icon)),\n ];\n\n /** The color a switch seeds from: whatever the current paint shows. */\n const currentColor = useCallback((): string => {\n if (value == null) return FALLBACK_COLOR;\n return getPaintKind(kindOf(value) ?? 'solid')?.colorOf(value) ?? FALLBACK_COLOR;\n }, [value]);\n\n const switchKind = (kind: PaintKind): void => {\n if (kind === active) return;\n if (kind === NONE) {\n onChange(null);\n return;\n }\n const seen = remembered.current.get(kind);\n if (seen !== undefined) {\n onChange(seen);\n return;\n }\n if (value != null && isGradient(value) && GRADIENT_KINDS.includes(kind)) {\n onChange(withGradientKind(value, kind as GradientKind));\n return;\n }\n const entry = getPaintKind(kind);\n if (entry) onChange(entry.seed(currentColor()));\n };\n\n return (\n <div\n className={[s.root, unset && s.unset, className].filter(Boolean).join(' ')}\n title={unset ? 'Not set' : undefined}\n >\n <ToggleBar<PaintKind>\n items={items}\n value={active}\n size=\"sm\"\n ariaLabel=\"Paint kind\"\n onChange={(kind) => kind && switchKind(kind)}\n />\n {renderBody()}\n </div>\n );\n\n function renderBody(): ReactElement | null {\n if (mixed || value === undefined) {\n return (\n <ColorField\n mixed\n aria-label={ariaLabel}\n onChange={(color) => onChange({ fill: 'solid', color })}\n />\n );\n }\n // Absence has nothing to edit. The lit segment is the whole statement.\n if (value === null) return null;\n // A registered `Editor` wins even for a built-in id: re-registering one is\n // how a consumer replaces a kit control, and the built-in branches below\n // are the fallback for the ids that ship without an entry editor.\n const entry = getPaintKind(kindOf(value) ?? 'solid');\n if (entry?.Editor) {\n const Editor = entry.Editor;\n return <Editor value={value} onInput={onInput} onChange={onChange} />;\n }\n if (isGradient(value)) {\n return (\n <GradientEditor\n value={value}\n kindSwitch={false}\n onInput={onInput}\n onChange={onChange}\n />\n );\n }\n if (isPattern(value)) {\n return <PatternPicker value={value} color={currentColor()} onChange={onChange} />;\n }\n if (isMeshPaint(value)) {\n return <MeshEditor value={value} onInput={onInput} onChange={onChange} />;\n }\n const kind = kindOf(value);\n if (kind !== 'solid') {\n // Editing a paint this control cannot represent would overwrite it, so\n // a kind with no editor is shown and left alone.\n return <div className={s.noEditor}>{entry?.label ?? kind}: no editor</div>;\n }\n return (\n <ColorField\n value={currentColor()}\n alpha\n aria-label={ariaLabel}\n onInput={(color) => onInput?.({ fill: 'solid', color })}\n onChange={(color) => onChange({ fill: 'solid', color })}\n />\n );\n }\n}\n","import { type ReactElement } from 'react';\nimport {\n Button as RACButton,\n Dialog as RACDialog,\n DialogTrigger,\n Popover as RACPopover,\n} from 'react-aria-components';\nimport { getPaintKind, type FillStyle, type PaintKind } from '@weasel-js/core';\nimport { useOverlayPortal, type OverlayPortalProps } from '../../overlays/portalHost';\nimport { paintPreviewCss } from '../../paintPreview';\nimport { PaintInput } from '../PaintInput';\nimport s from './PaintField.module.css';\n\n/** Props for {@link PaintField}. `onInput` fires throughout a gesture inside\n * the popover and `onChange` once at its end. */\nexport interface PaintFieldProps extends OverlayPortalProps {\n /** The paint being edited. `null` is an explicit \"no paint\"; `undefined` is\n * no value to show. */\n value: FillStyle | null | undefined;\n /** Indeterminate presentation: the trigger says \"Mixed\" and the editor\n * lights no kind. */\n mixed?: boolean;\n /** Dim the trigger — a value is in effect but was never chosen. */\n unset?: boolean;\n /** Restrict the editor's kind bar. Default: every registered kind. */\n kinds?: readonly PaintKind[];\n /** Offer \"None\" in the editor. Default `true`. */\n allowNone?: boolean;\n onInput?: (next: FillStyle | null) => void;\n onChange: (next: FillStyle | null) => void;\n /** Names the paint this field edits — `Fill`, `Color`. */\n 'aria-label'?: string;\n className?: string;\n}\n\n/** What the trigger says it is holding. */\nfunction kindLabel(paint: FillStyle | null | undefined, mixed: boolean): string {\n if (mixed) return 'Mixed';\n if (paint === null) return 'None';\n if (paint === undefined) return '—';\n return getPaintKind(paint.fill ?? 'solid')?.label ?? (paint.fill ?? 'solid');\n}\n\n/**\n * A whole `FillStyle` in one control slot: a swatch that says which kind it\n * holds, and a popover holding {@link PaintInput}.\n *\n * `PaintInput` itself is a kind bar over a body — six segments and a stop\n * editor — which a property row's control column cannot hold. This is the\n * shape for a narrow slot, and the difference that matters is fidelity: a\n * `ColorField` in that slot reads a gradient's first stop and writes a solid\n * back, so touching the control loses the paint.\n */\nexport function PaintField(props: PaintFieldProps): ReactElement {\n const {\n value, mixed = false, unset = false, kinds, allowNone = true,\n onInput, onChange, className, portalContainer,\n } = props;\n const ariaLabel = props['aria-label'];\n const { anchor, portalProps } = useOverlayPortal(portalContainer);\n const preview = mixed ? undefined : paintPreviewCss(value);\n\n return (\n <DialogTrigger>\n {anchor}\n <RACButton\n className={[s.trigger, className].filter(Boolean).join(' ')}\n aria-label={ariaLabel}\n {...(unset ? { 'data-unset': '' } : {})}\n {...(mixed ? { 'data-mixed': '' } : {})}\n >\n <span\n className={s.swatch}\n aria-hidden=\"true\"\n {...(preview ? { style: { background: preview } } : { 'data-empty': '' })}\n />\n <span className={s.label}>{kindLabel(value, mixed)}</span>\n </RACButton>\n {/* `data-weasel-overlay`: see Select — the popover renders in a portal,\n outside the subtree the trigger sits in. */}\n <RACPopover className={s.popover} data-weasel-overlay=\"\" {...portalProps}>\n <RACDialog className={s.body} aria-label={ariaLabel ? `${ariaLabel} editor` : 'Paint editor'}>\n <PaintInput\n value={value}\n mixed={mixed}\n unset={unset}\n kinds={kinds}\n allowNone={allowNone}\n onInput={onInput}\n onChange={onChange}\n aria-label={ariaLabel}\n />\n </RACDialog>\n </RACPopover>\n </DialogTrigger>\n );\n}\n","/**\n * \"A glyph the renderer asked for can now paint\" — the redraw signal shared\n * by every asynchronous glyph source.\n *\n * Both lazy tiers land their work *after* the frame that asked for it: the\n * dynamic canvas-SDF atlas defers bakes past a per-frame budget, and the\n * outline tier has to fetch and parse font bytes. Neither can paint anything\n * on the frame that first requests a glyph, so both have to tell the canvas\n * to draw again.\n *\n * One subscriber set, not one per tier: a consumer wiring \"redraw when text\n * becomes drawable\" should not have to know how many tiers exist, or grow a\n * second subscription every time one is added. `<SceneCanvas>` subscribes\n * once and both tiers reach it.\n */\n\nconst subscribers = new Set<() => void>();\n\n/** Advanced by every `notifyGlyphReady`, so state can be checked rather than\n * listened for. See {@link glyphGeneration}. */\nlet generation = 0;\n\n/**\n * How many times glyph availability has changed — the pull-based companion to\n * {@link subscribeGlyphReady}.\n *\n * For caches that cannot hold a subscription. Subscribing at module load is a\n * side effect that reaches across a package boundary: it makes importing the\n * module that holds the cache require this package's whole surface, so a\n * consumer partially mocking `@weasel-js/font` breaks at import rather than at\n * use, and import order starts to matter. Comparing a counter has neither\n * problem, and costs a field read on a path that was going to check a cache\n * key anyway.\n *\n * Callers keep the last value they saw and compare; any difference means\n * anything derived from font metrics is stale. The absolute value carries no\n * meaning and may wrap in principle — compare with `!==`, not `<`.\n */\nexport function glyphGeneration(): number {\n return generation;\n}\n\n/**\n * Subscribe to glyph availability. Fires after a batch of deferred SDF bakes\n * completes, and when an outline face finishes loading — in both cases, text\n * that painted nothing (or painted from a lower tier) can now paint. Returns\n * an unsubscribe.\n */\nexport function subscribeGlyphReady(cb: () => void): () => void {\n subscribers.add(cb);\n return () => {\n subscribers.delete(cb);\n };\n}\n\n/** @internal Fired by a glyph source once newly-available glyphs can paint. */\nexport function notifyGlyphReady(): void {\n generation++;\n for (const cb of subscribers) cb();\n}\n\n/** @internal Test seam — the subscriber set is module state. */\nexport function _clearGlyphReadySubscribers(): void {\n subscribers.clear();\n}\n","/**\n * Cross-family fallback policy. The per-family chain in `resolveFontVariant`\n * (weight → style → synthetic) has always been rich; what was missing is what\n * happens when the family itself was never registered. That case used to\n * render nothing at all, which is the single most common cause of \"my text is\n * invisible\".\n */\n\n/**\n * What happens when a requested family has no baked atlas:\n * - `'substitute'` — render with the default family (see\n * `setDefaultFontFamily`), reporting the swap on `ResolveResult.substituted`.\n * - `'canvas'` — auto-enroll the family with the dynamic canvas-SDF\n * rasterizer. The consumer gets the *real* typeface if the browser has it,\n * at canvas-SDF quality rather than baked-MSDF quality.\n * - `'none'` — hard miss; the run renders nothing.\n */\nexport type FontFallbackPolicy = 'substitute' | 'canvas' | 'none';\n\nlet policy: FontFallbackPolicy = 'substitute';\nlet defaultFamily: string | null = null;\n\n/** Set what happens when text asks for a family that was never registered.\n * Process-wide; defaults to `'substitute'`. */\nexport function setFontFallbackPolicy(next: FontFallbackPolicy): void {\n policy = next;\n}\n\n/** The cross-family fallback policy currently in force. */\nexport function getFontFallbackPolicy(): FontFallbackPolicy {\n return policy;\n}\n\n/** Explicit default family for `'substitute'`. When unset, the first\n * registered family wins — the right answer for the common case of an app\n * that registers exactly one. */\nexport function setDefaultFontFamily(family: string): void {\n defaultFamily = family;\n}\n\n/** The family `setDefaultFontFamily` named, or `null` if none was set — in\n * which case `'substitute'` falls back to the first registered family. */\nexport function getDefaultFontFamily(): string | null {\n return defaultFamily;\n}\n\n/**\n * Warn-once gate for the cross-family fallback warnings. The messages are\n * built in `registerFont.ts` (they read the registry to name the actual gap),\n * but the dedup state lives here so `_resetFallbackForTests` clears it —\n * warnings about a fallback are fallback state. While it sat in\n * `registerFont.ts`, only a registry reset cleared it, and a test that reset\n * just the policy silently swallowed its next warning.\n */\nconst warnedFallbacks = new Set<string>();\n\n/** @internal Claim `key` for a one-time warning; true the first time only. */\nexport function claimFallbackWarning(key: string): boolean {\n if (warnedFallbacks.has(key)) return false;\n warnedFallbacks.add(key);\n return true;\n}\n\n/** @internal Also called by `_resetFontRegistryForTests`: dropping the fonts\n * a warning was about has to drop the warning too. */\nexport function _clearFallbackWarnings(): void {\n warnedFallbacks.clear();\n}\n\n/** Test helper. Do not call from product code. */\nexport function _resetFallbackForTests(): void {\n policy = 'substitute';\n defaultFamily = null;\n warnedFallbacks.clear();\n}\n","/**\n * Shelf packer for the dynamic glyph atlas: fixed-size square pages, rows\n * (\"shelves\") of same-ish-height rects filled left to right. Simple and\n * good enough for glyph rects; no rotation, no eviction (v1).\n */\n\nexport interface ShelfAlloc {\n page: number;\n x: number;\n y: number;\n}\n\ninterface Shelf { y: number; height: number; x: number; }\ninterface Page { shelves: Shelf[]; nextY: number; }\n\nexport class ShelfPacker {\n private pages: Page[] = [];\n private warned = false;\n\n constructor(\n private readonly pageSize: number,\n private readonly maxPages: number,\n ) {}\n\n get pageCount(): number {\n return this.pages.length;\n }\n\n /** Allocate a w×h rect. Returns null (warning once) when capacity is out. */\n alloc(w: number, h: number): ShelfAlloc | null {\n if (w > this.pageSize || h > this.pageSize) return this.fail();\n for (let p = 0; p < this.pages.length; p++) {\n const spot = this.allocInPage(this.pages[p], w, h);\n if (spot) return { page: p, ...spot };\n }\n if (this.pages.length < this.maxPages) {\n const page: Page = { shelves: [], nextY: 0 };\n this.pages.push(page);\n const spot = this.allocInPage(page, w, h);\n if (spot) return { page: this.pages.length - 1, ...spot };\n }\n return this.fail();\n }\n\n private allocInPage(page: Page, w: number, h: number): { x: number; y: number } | null {\n for (const shelf of page.shelves) {\n if (h <= shelf.height && shelf.x + w <= this.pageSize) {\n const x = shelf.x;\n shelf.x += w;\n return { x, y: shelf.y };\n }\n }\n if (page.nextY + h <= this.pageSize) {\n const shelf: Shelf = { y: page.nextY, height: h, x: w };\n page.shelves.push(shelf);\n page.nextY += h;\n return { x: 0, y: shelf.y };\n }\n return null;\n }\n\n private fail(): null {\n if (!this.warned) {\n this.warned = true;\n console.warn(\n `weasel DynamicGlyphAtlas: glyph pages full (${this.maxPages} × ${this.pageSize}²); ` +\n 'further dynamic glyphs will not render.',\n );\n }\n return null;\n }\n}\n","/**\n * Euclidean distance transform for runtime SDF glyph baking (the TinySDF\n * technique): antialiased canvas coverage in → single-channel SDF bytes out.\n *\n * Uses Felzenszwalb & Huttenlocher's 1D squared-distance transform applied\n * along columns then rows. Pure JS, no dependencies, no allocation beyond\n * the work arrays sized to the input.\n */\n\nconst INF = 1e20;\n\n/** One 1D pass of the squared EDT (Felzenszwalb & Huttenlocher 2012, §2). */\nfunction edt1d(\n f: Float64Array, d: Float64Array, v: Int32Array, z: Float64Array, n: number,\n): void {\n v[0] = 0;\n z[0] = -INF;\n z[1] = INF;\n let k = 0;\n for (let q = 1; q < n; q++) {\n let s = (f[q] + q * q - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n while (s <= z[k]) {\n k--;\n s = (f[q] + q * q - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n }\n k++;\n v[k] = q;\n z[k] = s;\n z[k + 1] = INF;\n }\n k = 0;\n for (let q = 0; q < n; q++) {\n while (z[k + 1] < q) k++;\n d[q] = (q - v[k]) * (q - v[k]) + f[v[k]];\n }\n}\n\n/** In-place 2D squared EDT over `grid` (width × height): columns, then rows. */\nfunction edt2d(\n grid: Float64Array, width: number, height: number,\n f: Float64Array, d: Float64Array, v: Int32Array, z: Float64Array,\n): void {\n for (let x = 0; x < width; x++) {\n for (let y = 0; y < height; y++) f[y] = grid[y * width + x];\n edt1d(f, d, v, z, height);\n for (let y = 0; y < height; y++) grid[y * width + x] = d[y];\n }\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) f[x] = grid[y * width + x];\n edt1d(f, d, v, z, width);\n for (let x = 0; x < width; x++) grid[y * width + x] = d[x];\n }\n}\n\n/**\n * Convert an alpha-coverage bitmap (0–255) to single-channel SDF bytes.\n * Signed distance is positive outside the shape; the output maps it as\n * `255 − 255·(dist/radius + cutoff)` clamped to [0,255], so with\n * cutoff 0.5 the shape edge lands at byte ~128 (shader threshold 0.5).\n */\nexport function alphaToSdf(\n alpha: Uint8ClampedArray | Uint8Array,\n width: number,\n height: number,\n radius: number,\n cutoff: number,\n): Uint8Array {\n const n = width * height;\n const gridOuter = new Float64Array(n);\n const gridInner = new Float64Array(n);\n const size = Math.max(width, height);\n const f = new Float64Array(size);\n const d = new Float64Array(size);\n const v = new Int32Array(size);\n const z = new Float64Array(size + 1);\n\n for (let i = 0; i < n; i++) {\n const a = alpha[i] / 255;\n gridOuter[i] = a === 1 ? 0 : a === 0 ? INF : Math.max(0, 0.5 - a) ** 2;\n gridInner[i] = a === 1 ? INF : a === 0 ? 0 : Math.max(0, a - 0.5) ** 2;\n }\n edt2d(gridOuter, width, height, f, d, v, z);\n edt2d(gridInner, width, height, f, d, v, z);\n\n const out = new Uint8Array(n);\n for (let i = 0; i < n; i++) {\n const dist = Math.sqrt(gridOuter[i]) - Math.sqrt(gridInner[i]);\n const byte = Math.round(255 - 255 * (dist / radius + cutoff));\n out[i] = byte < 0 ? 0 : byte > 255 ? 255 : byte;\n }\n return out;\n}\n","/**\n * Canvas-2D glyph rasterizer for the dynamic SDF atlas. `fillText` is the\n * only web-platform route to *installed* machine fonts (no outline access),\n * which is exactly why this tier exists.\n *\n * Coordinate contract (all values in bake-size px, i.e. at BAKE_SIZE):\n * bitmap left = penX + left (left is negative: pad + left bearing)\n * bitmap top = baseline − top (top is positive above the baseline)\n * pen advance = advance\n * The bitmap includes a PAD border on all four sides so the SDF field has\n * room to fall off. Blank glyphs (e.g. space) return width/height 0.\n *\n * On BAKE_SIZE — measured 2026-07-29, comparing the reconstructed field\n * against a direct `fillText` of the same glyph at each display size, with\n * sub-pixel registration searched out so it measures fidelity and not\n * alignment. Mean per-pixel coverage error, averaged over A/S/e/W/8:\n *\n * display px 12 16 24 32 48 64 96 128\n * error .096 .083 .059 .039 .024 .023 .037 .049\n *\n * Two things follow, both of them counterintuitive enough to be worth\n * writing down. The error is minimized *at* the bake size, so raising\n * BAKE_SIZE does not improve small text — it moves the sweet spot away from\n * the 12–32px range where UI text actually lives and makes it worse. And the\n * magnification side is the mild one: 128px costs about twice the floor,\n * which is the corner rounding the shader header already owns.\n *\n * The 12–16px end is the largest divergence, and it is not undersampling —\n * 3×3 supersampling the reconstruction roughly halves the error at 24–48px\n * but recovers almost nothing at 12–16px (.096 → .089, .083 → .068). What is\n * left there is a hinted rasterizer placing stems on the pixel grid, which no\n * size-independent field can encode. So there is nothing to buy with more\n * taps, a bigger bake, or mipmaps (which a packed atlas cannot have anyway —\n * mip levels blend across glyph rects).\n */\n\nexport const BAKE_SIZE = 48;\nexport const PAD = 8;\n\nexport interface FaceMetrics {\n ascent: number;\n descent: number;\n}\n\nexport interface RasterizedGlyph {\n width: number;\n height: number;\n alpha: Uint8ClampedArray;\n left: number;\n top: number;\n advance: number;\n}\n\nexport interface GlyphRasterizer {\n faceMetrics(family: string, weight: number, style: 'normal' | 'italic'): FaceMetrics;\n rasterize(\n family: string, weight: number, style: 'normal' | 'italic', codepoint: number,\n ): RasterizedGlyph;\n}\n\ntype Canvas2D = OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n\nfunction cssFontString(weight: number, style: 'normal' | 'italic', family: string): string {\n return `${style === 'italic' ? 'italic ' : ''}${weight} ${BAKE_SIZE}px ${JSON.stringify(family)}`;\n}\n\nexport function createCanvasRasterizer(): GlyphRasterizer {\n let canvas: OffscreenCanvas | HTMLCanvasElement;\n if (typeof OffscreenCanvas !== 'undefined') {\n canvas = new OffscreenCanvas(BAKE_SIZE * 3, BAKE_SIZE * 3);\n } else if (typeof document !== 'undefined') {\n canvas = document.createElement('canvas');\n canvas.width = BAKE_SIZE * 3;\n canvas.height = BAKE_SIZE * 3;\n } else {\n throw new Error('weasel DynamicGlyphAtlas: no canvas available for glyph rasterization');\n }\n const ctx = canvas.getContext('2d', { willReadFrequently: true }) as Canvas2D | null;\n if (!ctx) throw new Error('weasel DynamicGlyphAtlas: 2D context unavailable');\n\n function setFont(family: string, weight: number, style: 'normal' | 'italic'): void {\n ctx!.font = cssFontString(weight, style, family);\n ctx!.textBaseline = 'alphabetic';\n ctx!.textAlign = 'left';\n }\n\n return {\n faceMetrics(family, weight, style) {\n setFont(family, weight, style);\n const m = ctx!.measureText('Hg');\n return {\n ascent: m.fontBoundingBoxAscent ?? BAKE_SIZE * 0.8,\n descent: m.fontBoundingBoxDescent ?? BAKE_SIZE * 0.2,\n };\n },\n\n rasterize(family, weight, style, codepoint) {\n setFont(family, weight, style);\n const chStr = String.fromCodePoint(codepoint);\n const m = ctx!.measureText(chStr);\n const advance = m.width;\n const inkLeft = Math.ceil(m.actualBoundingBoxLeft ?? 0);\n const inkRight = Math.ceil(m.actualBoundingBoxRight ?? advance);\n const inkAscent = Math.ceil(m.actualBoundingBoxAscent ?? BAKE_SIZE * 0.8);\n const inkDescent = Math.ceil(m.actualBoundingBoxDescent ?? BAKE_SIZE * 0.2);\n const inkW = inkLeft + inkRight;\n const inkH = inkAscent + inkDescent;\n if (inkW <= 0 || inkH <= 0) {\n return { width: 0, height: 0, alpha: new Uint8ClampedArray(0), left: 0, top: 0, advance };\n }\n const w = inkW + 2 * PAD;\n const h = inkH + 2 * PAD;\n if (canvas.width < w || canvas.height < h) {\n canvas.width = Math.max(canvas.width, w);\n canvas.height = Math.max(canvas.height, h);\n setFont(family, weight, style); // resizing resets 2D state\n }\n ctx!.clearRect(0, 0, w, h);\n ctx!.fillStyle = '#fff';\n ctx!.fillText(chStr, PAD + inkLeft, PAD + inkAscent);\n const img = ctx!.getImageData(0, 0, w, h);\n const alpha = new Uint8ClampedArray(w * h);\n for (let i = 0; i < alpha.length; i++) alpha[i] = img.data[i * 4 + 3];\n return {\n width: w,\n height: h,\n alpha,\n left: -(inkLeft + PAD),\n top: inkAscent + PAD,\n advance,\n };\n },\n };\n}\n","/**\n * DynamicGlyphAtlas — runtime single-channel SDF glyphs for canvas-sourced\n * (installed machine) fonts. TinySDF technique: canvas fillText at 48 px →\n * Euclidean distance transform → shelf-packed R8 pages (1024², max 4).\n *\n * Baked MSDF atlases always win: this tier only serves families registered\n * via `registerCanvasFont` that have no baked entry (see resolveFontVariant).\n *\n * Faces expose a BmFont-shaped `font` whose charMap grows as glyphs are\n * requested, so `layoutRuns` consumes them through the same code path as\n * baked atlases. A char's advance is valid immediately (measureText); its\n * atlas rect fills in when the bake lands (width 0 / page -1 until then, so\n * layout advances the pen but emits no quad).\n */\n\nimport type { BmFont, BmFontChar } from '../FontAtlas';\nimport type { GlyphTextureSink } from '../textureSink';\n// `fallback.ts` imports nothing, so this edge cannot close a cycle; keep it\n// that way. (registerFont.ts imports both this module and fallback.ts.)\nimport { getFontFallbackPolicy } from '../fallback';\nimport { notifyGlyphReady, _clearGlyphReadySubscribers } from '../glyphReady';\nimport { ShelfPacker } from './shelfPack';\nimport { alphaToSdf } from './distanceTransform';\nimport {\n createCanvasRasterizer, BAKE_SIZE,\n type GlyphRasterizer, type RasterizedGlyph,\n} from './glyphRasterizer';\n\nexport const PAGE_SIZE = 1024;\nexport const MAX_PAGES = 4;\nexport const SDF_RADIUS = 8;\nexport const SDF_CUTOFF = 0.5;\n/** How many glyphs the dynamic atlas will rasterize synchronously before\n * deferring the rest to a later flush. Caps the frame cost of text that\n * suddenly needs many new glyphs; the leftovers arrive a tick later and\n * notify through `onGlyphReady`. */\nexport const DEFAULT_BAKE_BUDGET = 16;\n\nexport interface DynamicFace {\n family: string;\n weight: number;\n style: 'normal' | 'italic';\n /** BmFont-shaped view consumed by layoutRuns; charMap grows lazily. */\n font: BmFont;\n /** Char record for `cp`, measured on first request (advance always valid\n * immediately; atlas rect fills in when the bake lands). */\n requestGlyph(cp: number): BmFontChar;\n}\n\ninterface DynamicPage {\n data: Uint8Array;\n /** Bumps on every glyph blit; each blit appends a patch with seq = version. */\n version: number;\n patches: { seq: number; x: number; y: number; w: number; h: number }[];\n}\n\ninterface PendingBake { char: BmFontChar; raster: RasterizedGlyph; }\n\n/** One family served by the dynamic canvas-SDF tier. See `listCanvasFonts`. */\nexport interface CanvasFontEntry {\n family: string;\n /** `'explicit'` — a `registerCanvasFont` call; `'auto'` — the `'canvas'`\n * fallback policy enrolled it on a miss, and the enrollment lapses if\n * that policy changes. */\n enrollment: 'explicit' | 'auto';\n}\n\nconst canvasFamilies = new Set<string>();\n// Enrollment provenance. A family the `'canvas'` fallback policy enrolled on\n// its own is only canvas-served while that policy is in force; one a consumer\n// named via registerCanvasFont outranks every policy. Tracked here rather\n// than in fallback.ts so the two sets can only ever be mutated together —\n// every register / unregister / reset path is in this file.\nconst autoEnrolledFamilies = new Set<string>();\nlet faces = new Map<string, DynamicFace>();\nlet pages: DynamicPage[] = [];\nlet packer = new ShelfPacker(PAGE_SIZE, MAX_PAGES);\nlet pending: PendingBake[] = [];\nlet flushScheduled = false;\nlet budget = DEFAULT_BAKE_BUDGET;\nlet rasterizer: GlyphRasterizer | null = null;\n\nfunction getRasterizer(): GlyphRasterizer {\n if (!rasterizer) rasterizer = createCanvasRasterizer();\n return rasterizer;\n}\n\n/** Mark `family` as canvas-sourced: when no baked atlas covers it,\n * resolveFontVariant serves it from this dynamic atlas. */\nexport function registerCanvasFont(family: string): void {\n canvasFamilies.add(family);\n // An explicit call promotes a previously auto-enrolled family for good.\n autoEnrolledFamilies.delete(family);\n}\n\n/**\n * Will `family` be served by the dynamic canvas-SDF tier *right now*?\n *\n * Service, not membership — the answer depends on the fallback policy in\n * force and can change without any enrollment call:\n * - explicitly enrolled via `registerCanvasFont` → `true` under every\n * policy; a consumer naming a family outranks the policy.\n * - auto-enrolled by the `'canvas'` policy → `true` only while that policy\n * is still in force. The enrollment lapses rather than being discarded,\n * so returning to `'canvas'` makes it `true` again.\n * - never enrolled → `false`, including under `'canvas'` (that policy\n * enrolls lazily, on the first miss).\n *\n * The membership reading would answer `true` for an auto-enrolled family\n * under `'substitute'` / `'none'`, where nothing routes to this tier — a\n * caller predicting what renders would be told the opposite of the truth.\n * Mirrors `listFonts`, which reports the baked registry alone for the same\n * reason: \"enrolled\" is not \"will render\".\n */\nexport function isCanvasFont(family: string): boolean {\n if (!canvasFamilies.has(family)) return false;\n return !autoEnrolledFamilies.has(family) || getFontFallbackPolicy() === 'canvas';\n}\n\n/**\n * Every family the dynamic canvas-SDF tier will serve *right now* — the\n * enumeration companion to `isCanvasFont`, which answers one family at a\n * time. Same \"service, not membership\" rule: an auto-enrolled family appears\n * only while the `'canvas'` policy is in force.\n *\n * Exists so a consumer can offer these families in a font picker.\n * `listFonts` reports the baked registry alone, so without this the only\n * ways to present canvas-served families were to hard-code a list beside the\n * `registerCanvasFont` calls or to omit them — a UI inventing its own answer\n * about what will render.\n *\n * `enrollment` distinguishes a consumer's explicit `registerCanvasFont` from\n * a lazy enrollment the policy made on a miss; both render identically, but\n * only the explicit one survives a policy change.\n */\nexport function listCanvasFonts(): readonly CanvasFontEntry[] {\n const out: CanvasFontEntry[] = [];\n for (const family of canvasFamilies) {\n if (!isCanvasFont(family)) continue;\n out.push({ family, enrollment: autoEnrolledFamilies.has(family) ? 'auto' : 'explicit' });\n }\n return out.sort((a, b) => a.family.localeCompare(b.family));\n}\n\n/**\n * @internal Enroll `family` on behalf of the `'canvas'` fallback policy.\n * Distinct from `registerCanvasFont` only in provenance: the enrollment\n * lapses (see `isExplicitCanvasFont`) if the policy later changes.\n */\nexport function autoEnrollCanvasFont(family: string): void {\n if (canvasFamilies.has(family) && !autoEnrolledFamilies.has(family)) return;\n canvasFamilies.add(family);\n autoEnrolledFamilies.add(family);\n}\n\n/**\n * @internal Enrolled by a consumer's own `registerCanvasFont` call rather than\n * by the `'canvas'` policy. Only these are served by the dynamic tier\n * regardless of the policy in force; an auto-enrolled family falls back to\n * whatever the current policy says once that policy is no longer `'canvas'`.\n */\nexport function isExplicitCanvasFont(family: string): boolean {\n return canvasFamilies.has(family) && !autoEnrolledFamilies.has(family);\n}\n\n/** Remove a canvas family. Its faces are dropped; already-baked glyph\n * pixels stay in their pages (no eviction in v1). */\nexport function unregisterCanvasFont(family: string): void {\n canvasFamilies.delete(family);\n autoEnrolledFamilies.delete(family);\n for (const key of [...faces.keys()]) {\n if (faces.get(key)!.family === family) faces.delete(key);\n }\n}\n\n/**\n * Internal resolver helper — not part of the public barrel; consumers go\n * through registerCanvasFont + resolveFontVariant.\n */\nexport function getDynamicFace(\n family: string, weight: number, style: 'normal' | 'italic',\n): DynamicFace {\n const key = `${family}|${weight}|${style}`;\n const existing = faces.get(key);\n if (existing) return existing;\n\n const r = getRasterizer();\n const metrics = r.faceMetrics(family, weight, style);\n const base = Math.round(metrics.ascent);\n const font: BmFont = {\n info: { face: family, size: BAKE_SIZE },\n common: {\n lineHeight: Math.round(metrics.ascent + metrics.descent),\n base,\n scaleW: PAGE_SIZE,\n scaleH: PAGE_SIZE,\n },\n chars: [],\n kernings: [], // no kerning in v1 (measured-pair kerning is future work)\n charMap: new Map(),\n kerningMap: new Map(),\n };\n\n const face: DynamicFace = {\n family, weight, style, font,\n requestGlyph(cp: number): BmFontChar {\n const cached = font.charMap.get(cp);\n if (cached) return cached;\n const raster = r.rasterize(family, weight, style, cp);\n const char: BmFontChar = {\n id: cp, x: 0, y: 0, width: 0, height: 0,\n xoffset: raster.left,\n yoffset: base - raster.top,\n xadvance: raster.advance,\n page: -1,\n };\n font.charMap.set(cp, char);\n font.chars.push(char);\n if (raster.width === 0 || raster.height === 0) {\n char.page = 0; // blank glyph (space): nothing to bake\n return char;\n }\n if (budget > 0) {\n budget--;\n bake(char, raster);\n } else {\n pending.push({ char, raster });\n scheduleFlush();\n }\n return char;\n },\n };\n faces.set(key, face);\n return face;\n}\n\nfunction bake(char: BmFontChar, raster: RasterizedGlyph): void {\n const spot = packer.alloc(raster.width, raster.height);\n if (!spot) return; // pages full — packer warned once; glyph stays invisible\n const sdf = alphaToSdf(raster.alpha, raster.width, raster.height, SDF_RADIUS, SDF_CUTOFF);\n while (pages.length <= spot.page) {\n pages.push({ data: new Uint8Array(PAGE_SIZE * PAGE_SIZE), version: 0, patches: [] });\n }\n const page = pages[spot.page];\n for (let row = 0; row < raster.height; row++) {\n page.data.set(\n sdf.subarray(row * raster.width, (row + 1) * raster.width),\n (spot.y + row) * PAGE_SIZE + spot.x,\n );\n }\n page.version++;\n page.patches.push({ seq: page.version, x: spot.x, y: spot.y, w: raster.width, h: raster.height });\n char.x = spot.x;\n char.y = spot.y;\n char.width = raster.width;\n char.height = raster.height;\n char.page = spot.page;\n}\n\nfunction scheduleFlush(): void {\n if (flushScheduled) return;\n flushScheduled = true;\n setTimeout(flushPending, 0);\n}\n\nfunction flushPending(): void {\n flushScheduled = false;\n let n = 0;\n while (pending.length > 0 && n < DEFAULT_BAKE_BUDGET) {\n const job = pending.shift()!;\n if (job.char.page !== -1) continue; // already baked\n bake(job.char, job.raster);\n n++;\n }\n if (pending.length > 0) scheduleFlush();\n notifyGlyphReady();\n}\n\n/** Reset the per-frame synchronous bake budget. Called by\n * `WeaselRenderer.render()` at frame start; the headless\n * `renderSceneToPixels` path passes Infinity so print never defers. */\nexport function resetBakeBudget(n: number = DEFAULT_BAKE_BUDGET): void {\n budget = n;\n}\n\n/* ------------------------------------------------------------------ */\n/* GPU sync */\n/* ------------------------------------------------------------------ */\n\n/** Texture-cache key for a dynamic page (parallel to `textureCacheKey`). */\nexport function dynamicPageTextureId(page: number): string {\n return `weasel-dyn-sdf-page-${page}`;\n}\n\n// Per-GL-cache upload progress: last page version each cache has seen.\n// WeakMap-keyed so disposed renderers don't pin anything.\nconst uploadedVersions = new WeakMap<GlyphTextureSink, Map<number, number>>();\n\n/** Bring `cache`'s copy of page `pageIndex` up to date: full R8 upload the\n * first time, `texSubImage2D` patches after. Returns false if the page\n * doesn't exist yet. */\nexport function syncDynamicPageTexture(cache: GlyphTextureSink, pageIndex: number): boolean {\n const page = pages[pageIndex];\n if (!page) return false;\n const id = dynamicPageTextureId(pageIndex);\n let seen = uploadedVersions.get(cache);\n if (!seen) {\n seen = new Map();\n uploadedVersions.set(cache, seen);\n }\n if (!cache.has(id)) {\n cache.uploadR8(id, PAGE_SIZE, PAGE_SIZE, page.data);\n seen.set(pageIndex, page.version);\n return true;\n }\n const last = seen.get(pageIndex) ?? 0;\n if (last >= page.version) return true;\n for (const patch of page.patches) {\n if (patch.seq <= last) continue;\n const tight = new Uint8Array(patch.w * patch.h);\n for (let row = 0; row < patch.h; row++) {\n const src = (patch.y + row) * PAGE_SIZE + patch.x;\n tight.set(page.data.subarray(src, src + patch.w), row * patch.w);\n }\n cache.subImageR8(id, patch.x, patch.y, patch.w, patch.h, tight);\n }\n seen.set(pageIndex, page.version);\n return true;\n}\n\n/* ------------------------------------------------------------------ */\n/* Test seams */\n/* ------------------------------------------------------------------ */\n\n/** @internal test seam — inject a fake rasterizer (jsdom has no canvas\n * metrics). Pass null to restore the lazy default. */\nexport function __setGlyphRasterizerForTests(r: GlyphRasterizer | null): void {\n rasterizer = r;\n}\n\n/** @internal test seam — inspect CPU-side pages. */\nexport function _getPagesForTests(): readonly DynamicPage[] {\n return pages;\n}\n\n/** @internal test seam — clear all dynamic-font state. */\nexport function _resetDynamicFontsForTests(): void {\n canvasFamilies.clear();\n autoEnrolledFamilies.clear();\n faces = new Map();\n pages = [];\n packer = new ShelfPacker(PAGE_SIZE, MAX_PAGES);\n pending = [];\n flushScheduled = false;\n budget = DEFAULT_BAKE_BUDGET;\n _clearGlyphReadySubscribers();\n rasterizer = null;\n}\n","/**\n * The outline tier's registry: which faces have real font bytes behind them,\n * and what a given glyph looks like.\n *\n * ### What this tier is for\n *\n * A distance field is a *sampled* representation. The baked MSDF atlas is\n * generated from outlines and holds up well; the dynamic canvas-SDF tier\n * (`../dynamic/`) reconstructs its field from a 48px raster, so magnifying it\n * past a few times the bake size exposes the raster as contour wobble — bumps\n * one bake-texel apart, ±2–3px at 8×. No bake size fixes that, it only moves\n * the size at which it appears (`glyphRasterizer.ts` measures the tradeoff:\n * error is *minimized at* the bake size, so raising it spoils the 12–32px\n * range where most text lives).\n *\n * Above a size threshold the answer is to stop sampling: parse the font, take\n * the glyph's outline, and hand it to the path renderer the kit already has.\n * Exact at every zoom, and — because a glyph becomes an ordinary path — it\n * takes strokes and non-solid fills for free.\n *\n * Below the threshold the atlas still wins, and not narrowly: outlines carry\n * no hinting and no stem darkening, so body text at 12–16px rendered from\n * them looks *worse* than a platform rasterizer that puts stems on the pixel\n * grid. Two tiers with a size threshold is the standard hybrid, not a\n * compromise.\n *\n * ### Metric neutrality (the load-bearing invariant)\n *\n * This tier replaces how a glyph is *painted*, never where it sits. Advances,\n * kerning, line breaking and baselines all keep coming from whichever tier\n * resolved the run — the baked atlas or the canvas face. That is what lets\n * the threshold be a rendering decision: zooming past it swaps glyph geometry\n * with the layout untouched, so text cannot reflow under the user's cursor,\n * and `measureTextBounds` / `textLineBoxes` need to know nothing about\n * outlines at all.\n *\n * The cost is that a face whose real advances disagree with the atlas's\n * inherits the atlas's. For the bundled Inter that is exact (the subset ships\n * from the same source the atlas was baked from), and for a machine font the\n * outline bytes and the canvas metrics come from the same file.\n *\n * ### Availability\n *\n * Everything here degrades rather than blocks. Bytes arrive over `fetch` or\n * `queryLocalFonts` — asynchronous, and in the local case gated behind a\n * permission the user can refuse — so `glyphOutline` answers `null` until a\n * face is loaded and forever if it failed, and the caller falls back down the\n * ladder to SDF. A family must never render *nothing* because the outline\n * tier could not get bytes.\n */\n\nimport { notifyGlyphReady } from '../glyphReady';\nimport type { OutlineFace, OutlineFontStyle, OutlineParser } from './OutlineFace';\nimport { openTypeParser } from './opentypeParser';\n\n/**\n * Where a face's bytes come from. A URL is fetched; a buffer or blob is used\n * as-is; a thunk is called at first use, which is what lets `queryLocalFonts`\n * results be registered eagerly and read lazily — the permission prompt and\n * the (potentially many megabytes of) blob only happen for a family the\n * document actually sets text in.\n */\nexport type OutlineSource =\n | string\n | ArrayBuffer\n | Blob\n | (() => ArrayBuffer | Blob | Promise<ArrayBuffer | Blob>);\n\n/** Which face within a family to register outlines for. Defaults to weight\n * 400, style `'normal'`. */\nexport interface OutlineVariant {\n weight?: number;\n style?: OutlineFontStyle;\n}\n\n/** Options for registering an outline font. */\nexport interface OutlineFontOptions {\n /** Override the default opentype.js parser. Mostly a test seam; also the\n * hook for a consumer who already has a font parser in their bundle. */\n parser?: OutlineParser;\n}\n\n/** Load state of one registered face. */\nexport type OutlineStatus = 'idle' | 'loading' | 'ready' | 'failed';\n\ninterface FaceSlot {\n family: string;\n weight: number;\n style: OutlineFontStyle;\n source: OutlineSource;\n parser: OutlineParser;\n status: OutlineStatus;\n face: OutlineFace | null;\n /** Memoized `glyphD` answers, including the `null` misses — a codepoint the\n * face lacks is asked for on every frame that draws it, and re-deriving\n * the miss means re-running the cmap lookup forever. */\n glyphs: Map<number, string | null>;\n}\n\nlet slots = new Map<string, FaceSlot>();\n\nfunction slotKey(family: string, weight: number, style: OutlineFontStyle): string {\n return `${family}|${weight}|${style}`;\n}\n\nfunction normalize(v: OutlineVariant): { weight: number; style: OutlineFontStyle } {\n return { weight: v.weight ?? 400, style: v.style ?? 'normal' };\n}\n\n/**\n * Register font file bytes for one face, so text set in it can render from\n * outlines above the size threshold.\n *\n * Registration is cheap and synchronous: nothing is fetched, and the parser\n * is not even imported, until a frame actually asks for a glyph from this\n * face. Registering a face that is never drawn large costs one map entry.\n *\n * The variant must match exactly what the layout tier resolved — this is\n * deliberately *not* a fallback chain. Painting 400-weight outlines at\n * 700-weight advances, or upright outlines where the shader was going to\n * fake an oblique, looks worse than the SDF it replaced; a miss here falls\n * back down the ladder instead, which is always safe.\n */\nexport function registerFontOutlines(\n family: string,\n variant: OutlineVariant,\n source: OutlineSource,\n opts: OutlineFontOptions = {},\n): void {\n const { weight, style } = normalize(variant);\n slots.set(slotKey(family, weight, style), {\n family, weight, style, source,\n parser: opts.parser ?? openTypeParser,\n status: 'idle',\n face: null,\n glyphs: new Map(),\n });\n // Layouts cache which tier each run resolved to and poll `glyphGeneration()`\n // to know when to drop it; a registration that leaves it still is invisible.\n notifyGlyphReady();\n}\n\n/** Drop a registration. Glyphs already handed out stay valid — they are\n * plain path data — but nothing further resolves from this face. */\nexport function unregisterFontOutlines(family: string, variant: OutlineVariant = {}): void {\n const { weight, style } = normalize(variant);\n // Only when something was actually dropped: `disableMachineFontOutlines`\n // sweeps every weight/style pair, and a miss must not invalidate any layout.\n if (slots.delete(slotKey(family, weight, style))) notifyGlyphReady();\n}\n\n/**\n * Is an outline face registered for this exact variant? Answers `true` while\n * the bytes are still loading — the question is \"could this face serve\n * outlines\", which is what a caller deciding whether to *ask* wants; use\n * `outlineStatus` for the narrower \"can it right now\".\n */\nexport function hasFontOutlines(\n family: string, weight = 400, style: OutlineFontStyle = 'normal',\n): boolean {\n return slots.has(slotKey(family, weight, style));\n}\n\n/** Load state of a registered face; `null` when nothing is registered. */\nexport function outlineStatus(\n family: string, weight = 400, style: OutlineFontStyle = 'normal',\n): OutlineStatus | null {\n return slots.get(slotKey(family, weight, style))?.status ?? null;\n}\n\n/** Every registered outline face and its load state — the enumeration a\n * debug overlay or font picker needs, mirroring `listFonts`. */\nexport function listFontOutlines(): readonly {\n family: string; weight: number; style: OutlineFontStyle; status: OutlineStatus;\n}[] {\n return [...slots.values()]\n .map(({ family, weight, style, status }) => ({ family, weight, style, status }))\n .sort((a, b) => a.family.localeCompare(b.family) || a.weight - b.weight\n || a.style.localeCompare(b.style));\n}\n\n/**\n * Em-space SVG path data for one glyph, or `null` when this tier cannot serve\n * it — no registration, bytes still loading, load failed, no such glyph, or a\n * glyph with no contours.\n *\n * Synchronous by construction: it is called from the per-frame glyph walk, so\n * it can only ever report what is already in hand. The first call for an\n * unloaded face starts the load and returns `null`; when the load lands,\n * `notifyGlyphReady` asks the canvas to draw again and the second frame gets\n * the outline. Same shape as the dynamic tier's deferred bakes.\n */\n/**\n * Close every contour of a glyph's path data.\n *\n * A glyph contour is closed by definition — neither TrueType nor CFF has any\n * other kind — but not every serializer writes the `Z` that says so, and the\n * omission is invisible until someone *strokes* the outline: a fill closes the\n * contour implicitly (earcut joins last point to first), while a stroke\n * follows exactly the path it is handed and leaves the closing edge unpainted,\n * with a cap at each loose end. That showed up as glyphs missing part of their\n * outline along long straight edges, which is where a contour's seam usually\n * falls.\n *\n * Normalized here rather than in one parser because the same hole is open to\n * every consumer-supplied `OutlineParser`, and a contract that says \"closed\"\n * is cheaper to guarantee than to document.\n */\nexport function closeContours(d: string): string {\n let out = '';\n let start = 0;\n for (let i = 1; i < d.length; i++) {\n const c = d[i];\n if (c !== 'M' && c !== 'm') continue;\n out += closeOne(d.slice(start, i));\n start = i;\n }\n return out + closeOne(d.slice(start));\n}\n\nfunction closeOne(contour: string): string {\n const trimmed = contour.trimEnd();\n if (trimmed.length === 0) return '';\n const last = trimmed[trimmed.length - 1];\n return last === 'Z' || last === 'z' ? trimmed : `${trimmed}Z`;\n}\n\n/**\n * Em-space SVG path data for one glyph of a registered outline face, or `null`\n * when there is nothing to draw.\n *\n * Synchronous and non-throwing by design: a face that has not been parsed yet\n * starts loading and answers `null` for now, so a renderer can call this every\n * frame and simply fall through to another text tier until the outline\n * arrives. Results are cached per codepoint.\n */\nexport function glyphOutline(\n family: string,\n weight: number,\n style: OutlineFontStyle,\n cp: number,\n): string | null {\n const slot = slots.get(slotKey(family, weight, style));\n if (!slot) return null;\n if (slot.status === 'idle') {\n void beginLoad(slot);\n return null;\n }\n if (slot.status !== 'ready') return null;\n\n const cached = slot.glyphs.get(cp);\n if (cached !== undefined) return cached;\n let d: string | null = null;\n try {\n const raw = slot.face!.glyphD(cp);\n d = raw === null ? null : closeContours(raw);\n } catch (err) {\n // A parser that throws on one glyph should cost that glyph, not the face.\n warnOnce(`glyph|${slotKey(family, weight, style)}`,\n `weasel: outline face \"${family}\" (${weight}/${style}) could not produce a glyph ` +\n `for U+${cp.toString(16).toUpperCase().padStart(4, '0')} — ` +\n `${err instanceof Error ? err.message : String(err)}. Falling back to the SDF tier.`);\n }\n slot.glyphs.set(cp, d);\n return d;\n}\n\n/**\n * Metrics for a registered outline face, or `null` when this tier cannot\n * supply them yet — nothing registered, bytes still loading, or a failed load.\n *\n * The face is the *only* metrics source for a family that has no atlas, which\n * is the case this exists for: without it such a family cannot lay out at all.\n * It does not disturb metric neutrality — a family that has an atlas resolves\n * to the atlas long before anything asks here, so registering outlines still\n * cannot move text that was already rendering.\n *\n * Starts the load on a first call and answers `null` for now, exactly like\n * `glyphOutline`, so a per-frame caller falls through and picks it up on the\n * frame after the bytes land.\n */\nexport function outlineMetrics(\n family: string,\n weight: number,\n style: OutlineFontStyle,\n): OutlineFace | null {\n const slot = slots.get(slotKey(family, weight, style));\n if (!slot) return null;\n if (slot.status === 'idle') {\n void beginLoad(slot);\n return null;\n }\n return slot.status === 'ready' ? slot.face! : null;\n}\n\nasync function beginLoad(slot: FaceSlot): Promise<void> {\n slot.status = 'loading';\n try {\n slot.face = await slot.parser(await readSource(slot.source));\n slot.status = 'ready';\n // The frame that asked for these glyphs has long since drawn. Without\n // this the outlines sit in memory until something else invalidates the\n // canvas, which on a static document is \"never\".\n notifyGlyphReady();\n } catch (err) {\n slot.status = 'failed';\n warnOnce(`load|${slotKey(slot.family, slot.weight, slot.style)}`,\n `weasel registerFontOutlines(\"${slot.family}\" ${slot.weight}/${slot.style}): ` +\n `${err instanceof Error ? err.message : String(err)}. Large text in this face ` +\n `keeps rendering from the SDF tier.`);\n }\n}\n\nasync function readSource(source: OutlineSource): Promise<ArrayBuffer> {\n const resolved = typeof source === 'function' ? await source() : source;\n if (typeof resolved === 'string') {\n const res = await fetch(resolved);\n if (!res.ok) throw new Error(`HTTP ${res.status} fetching ${resolved}`);\n return res.arrayBuffer();\n }\n if (resolved instanceof ArrayBuffer) return resolved;\n return resolved.arrayBuffer();\n}\n\n// Loading and glyph lookup both run off the render loop, so an unguarded warn\n// would repeat every frame.\nconst warned = new Set<string>();\n\nfunction warnOnce(key: string, message: string): void {\n if (warned.has(key)) return;\n warned.add(key);\n console.warn(message);\n}\n\n/** @internal Test seam — registry and warn-once keys are module state. */\nexport function _resetFontOutlinesForTests(): void {\n slots = new Map();\n warned.clear();\n}\n","/**\n * FontRegistry and registerFont() public API.\n *\n * Variants are keyed by (family, weight, style). registerFont() takes a\n * FontVariant alongside the family and the two URLs; the registry stores\n * entries in a two-level Map so resolveFontVariant() can iterate a family's\n * variants for the fallback chain.\n */\n\nimport { notifyGlyphReady } from './glyphReady';\nimport { parseBmFont, type BmFont } from './FontAtlas';\nimport type { GlyphTextureSink } from './textureSink';\nimport {\n isCanvasFont, isExplicitCanvasFont, autoEnrollCanvasFont, getDynamicFace,\n type DynamicFace,\n} from './dynamic/dynamicAtlas';\nimport {\n getFontFallbackPolicy, getDefaultFontFamily,\n claimFallbackWarning, _clearFallbackWarnings,\n} from './fallback';\nimport { outlineMetrics } from './outline/outlineRegistry';\nimport type { OutlineFace } from './outline/OutlineFace';\n\n/** A registered face: its parsed metrics and the atlas image to sample. */\nexport interface FontEntry {\n font: BmFont;\n bitmap: ImageBitmap;\n}\n\n/** Which face within a family. Defaults to weight 400, style `'normal'`. */\nexport interface FontVariant {\n weight?: number;\n style?: 'normal' | 'italic';\n}\n\ntype FontStyle = 'normal' | 'italic';\n\nlet registry = new Map<string, Map<string, FontEntry>>();\n\nfunction variantKey(weight: number, style: FontStyle): string {\n return `${weight}|${style}`;\n}\n\nfunction normalizeVariant(v: FontVariant): { weight: number; style: FontStyle } {\n return {\n weight: v.weight ?? 400,\n style: v.style ?? 'normal',\n };\n}\n\n/** Test helper. Do not call from product code. */\nexport function _resetFontRegistryForTests(): void {\n registry = new Map();\n _clearFallbackWarnings();\n}\n\n/** Exact lookup — does NOT walk the fallback chain. Use `resolveFontVariant` for that. */\nexport function getFont(\n family: string,\n weight: number = 400,\n style: FontStyle = 'normal',\n): FontEntry | null {\n return registry.get(family)?.get(variantKey(weight, style)) ?? null;\n}\n\n/** One family in the registry and the variants registered for it — what a\n * font picker can honestly offer. */\nexport interface RegisteredFont {\n family: string;\n variants: readonly { weight: number; style: FontStyle }[];\n}\n\n/**\n * Enumerate the registry — what a font picker can honestly offer. Families\n * come back in registration order; variants sorted by weight, then style, so\n * the output is stable enough to assert against.\n */\nexport function listFonts(): readonly RegisteredFont[] {\n const out: RegisteredFont[] = [];\n for (const [family, variantMap] of registry) {\n const variants = [...variantMap.keys()]\n .map((key) => {\n const [w, s] = key.split('|') as [string, FontStyle];\n return { weight: Number(w), style: s };\n })\n .sort((a, b) => a.weight - b.weight || a.style.localeCompare(b.style));\n out.push({ family, variants });\n }\n return out;\n}\n\n/**\n * Fetch a baked MSDF atlas and its metrics, and register them as one variant\n * of `family`. Resolves once the face is usable; re-registering a variant that\n * is already present is a no-op.\n */\nexport async function registerFont(\n family: string,\n variant: FontVariant,\n metricsUrl: string,\n atlasUrl: string,\n): Promise<void> {\n const { weight, style } = normalizeVariant(variant);\n const key = variantKey(weight, style);\n\n if (registry.get(family)?.has(key)) return;\n\n try {\n const [metricsRes, atlasRes] = await Promise.all([\n fetch(metricsUrl),\n fetch(atlasUrl),\n ]);\n\n if (!metricsRes.ok) {\n throw new Error(`HTTP ${metricsRes.status} fetching metrics from ${metricsUrl}`);\n }\n if (!atlasRes.ok) {\n throw new Error(`HTTP ${atlasRes.status} fetching atlas from ${atlasUrl}`);\n }\n\n const [rawJson, blob] = await Promise.all([\n metricsRes.json(),\n atlasRes.blob(),\n ]);\n\n const font = parseBmFont(rawJson);\n const bitmap = await createImageBitmap(blob);\n\n // Re-read the registry here (not the pre-await snapshot): concurrent\n // registerFont() calls for other variants of the same family (e.g. the\n // 400/700 weights registered together in Promise.all) may have created\n // the family's Map while this call was awaiting its fetch. Reusing a\n // stale local reference would recreate the Map and silently drop\n // whichever variant's registerFont() resolved first.\n let familyMap = registry.get(family);\n if (!familyMap) {\n familyMap = new Map();\n registry.set(family, familyMap);\n }\n familyMap.set(key, { font, bitmap });\n // Same meaning the lazy tiers give it: text that was painting from a\n // fallback face — or painting nothing — can now paint from this one. The\n // early return above covers the already-registered case, so this fires\n // once per variant that actually lands.\n notifyGlyphReady();\n } catch (err) {\n throw new Error(\n `weasel registerFont(\"${family}\" ${weight}/${style}): ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Ensure the atlas for `(family, weight, style)` is uploaded to\n * `textureCache`. Cache key is `${family}|${weight}|${style}` so each\n * variant occupies its own texture slot.\n */\nexport function ensureFontTexture(\n family: string,\n weight: number,\n style: FontStyle,\n textureCache: GlyphTextureSink,\n): boolean {\n const entry = getFont(family, weight, style);\n if (!entry) return false;\n textureCache.upload(textureCacheKey(family, weight, style), entry.bitmap);\n return true;\n}\n\n/** The texture cache key used by `ensureFontTexture` for a given variant. */\nexport function textureCacheKey(family: string, weight: number, style: FontStyle): string {\n return `${family}|${weight}|${style}`;\n}\n\n/** Kept as a no-op for context-restore call sites; per-cache dedup handles it now. */\nexport function markAllFontsNotUploaded(): void {}\n\n/** What `resolveFontVariant` found: the atlas to draw with, the face it\n * actually landed on after walking the fallback chain, and what has to be\n * synthesized to cover the difference. */\nexport interface ResolveResult {\n entry: FontEntry | null;\n /**\n * The (family, weight, style) triple that was actually matched. May differ\n * from the requested values when the resolver walked the fallback chain —\n * including `family`, when the cross-family policy substituted a default.\n *\n * This is the atlas identity: pass all three to `getFont` /\n * `textureCacheKey` and the lookup hits. Describing only weight and style\n * here once let a caller key its draw on the *requested* family, which\n * resolves to no atlas at all and paints nothing.\n *\n * The synthetic flags describe the gap between requested and resolved for\n * shader-side compensation. When `entry` is null, these mirror the\n * requested values.\n */\n resolved: { family: string; weight: number; style: FontStyle };\n synthetic: { bold: boolean; italic: boolean };\n /** Which tier resolved: a baked MSDF atlas, the runtime canvas-SDF dynamic\n * atlas, or a parsed font face serving both geometry and metrics. Misses\n * report 'atlas' (the default tier). */\n source: 'atlas' | 'canvas' | 'outline';\n /** Set only when source === 'canvas': the dynamic face whose BmFont-shaped\n * `font` layoutRuns consumes in place of `entry.font`. */\n dynamicFace?: DynamicFace;\n /** Set only when source === 'outline': the parsed face supplying advances,\n * kerning and the baseline. There is no atlas behind this tier, so it is\n * the only metrics source the run has. */\n outlineFace?: OutlineFace;\n /**\n * Set when the requested family was not registered and the fallback policy\n * substituted a different one. Reported structurally so a UI can say\n * \"Inter — not loaded, showing Roboto\" instead of leaving the user to\n * wonder why the family control did nothing.\n */\n substituted?: { requested: string; resolved: string };\n}\n\nfunction missResolveResult(\n family: string, weight: number, style: FontStyle, suppressWarn = false,\n): ResolveResult {\n // Canvas-dynamic tier: reached only when the fallback chain selected no\n // baked variant, so any selected baked match always wins. Dynamic faces\n // rasterize the real weight/style — no synthetic flags.\n //\n // Explicit enrollment only. A family the `'canvas'` policy enrolled for\n // itself must not keep routing here after the policy changes, or `'none'`\n // could never restore the hard miss it documents once any family had been\n // auto-enrolled.\n if (isExplicitCanvasFont(family)) {\n return {\n entry: null,\n dynamicFace: getDynamicFace(family, weight, style),\n resolved: { family, weight, style },\n synthetic: { bold: false, italic: false },\n source: 'canvas',\n };\n }\n\n // Outline-only: a family with parsed font bytes and no atlas. Ranked above\n // every fallback below because it is the *real* face — exact geometry and\n // the font's own advances — where the alternatives are a resampled raster\n // or a different typeface. Below explicit canvas enrollment, which is a\n // consumer saying which tier it wants for this family.\n const face = outlineMetrics(family, weight, style === 'italic' ? 'italic' : 'normal');\n if (face) {\n return {\n entry: null,\n outlineFace: face,\n resolved: { family, weight, style },\n synthetic: { bold: false, italic: false },\n source: 'outline',\n };\n }\n\n const policy = getFontFallbackPolicy();\n\n if (policy === 'canvas') {\n // Auto-enroll: the browser probably has this family even though no atlas\n // was baked for it. Real typeface, canvas-SDF quality.\n autoEnrollCanvasFont(family);\n return {\n entry: null,\n dynamicFace: getDynamicFace(family, weight, style),\n resolved: { family, weight, style },\n synthetic: { bold: false, italic: false },\n source: 'canvas',\n };\n }\n\n if (policy === 'substitute') {\n const fallback = getDefaultFontFamily() ?? firstRegisteredFamily();\n // Guard against recursing when the default family is itself unknown.\n // Canvas families never enter `registry`, so membership there alone would\n // reject `setDefaultFontFamily` pointed at one. `isCanvasFont` answers\n // \"served by the dynamic tier right now\", which is the question here: a\n // family the `'canvas'` policy auto-enrolled is not served under this\n // policy, so substituting *to* it would report a swap that paints nothing.\n if (fallback !== null && fallback !== family) {\n if (registry.has(fallback) || isCanvasFont(fallback)) {\n // Probing whether the fallback family renders, not resolving a\n // top-level request for it — suppress so this recursion can't also\n // land in the `fallback === family` branch below (the fallback\n // family's own default is itself) and double-warn for one miss.\n // Whichever of `warnMissingFamilyOnce` / `warnUnusableDefaultOnce`\n // fires below, based on this probe's result, is the single warning.\n const result = resolveFontVariantInternal(fallback, weight, style, true);\n // Renderable, not baked: a fallback served by the dynamic tier reports\n // `entry: null` with a dynamicFace, and testing entry alone threw it away.\n if (result.entry !== null || result.dynamicFace !== undefined) {\n if (!suppressWarn) warnMissingFamilyOnce(family, weight, style, fallback);\n return { ...result, substituted: { requested: family, resolved: fallback } };\n }\n }\n // Substitution was supposed to happen and produced nothing. Falling\n // through silently here is the invisible-text failure this whole policy\n // exists to eliminate, so say which of the two families to fix.\n if (!suppressWarn) warnUnusableDefaultOnce(family, weight, style, fallback);\n } else if (fallback === family && !suppressWarn) {\n // `fallback === family` above exists to stop the request from\n // substituting for itself — recursion into the same miss forever. But\n // when the family that can't serve this variant *is* the effective\n // default, that guard also throws away the one case it was most likely\n // to hit: a default registered at the wrong variant. Nothing renders\n // and, without this branch, nothing is logged either.\n // `suppressWarn` keeps this from firing when a *different* top-level\n // request's substitution probe happens to recurse into the default\n // family and find it can't serve either — that miss is reported by the\n // top-level caller via `warnUnusableDefaultOnce`, not from in here.\n if (registry.has(family)) {\n warnSelfUnusableDefaultOnce(family, weight, style);\n } else {\n // Unregistered, yet still the effective default: the default can only\n // have been named explicitly, because the implicit one is the first\n // *registered* family (and with nothing registered at all, `fallback`\n // is null and never equals `family`). So this is a real\n // misconfiguration — someone pointed setDefaultFontFamily at a family\n // that does not exist — and not the deliberately-silent case of an app\n // that simply hasn't loaded any fonts yet.\n warnUnregisteredDefaultOnce(family, weight, style);\n }\n }\n }\n\n return {\n entry: null,\n resolved: { family, weight, style },\n synthetic: { bold: false, italic: false },\n source: 'atlas',\n };\n}\n\n/** Insertion order of the registry Map — the first family an app registered. */\nfunction firstRegisteredFamily(): string | null {\n for (const family of registry.keys()) return family;\n return null;\n}\n\n// Resolution runs per frame, so an unguarded warn would flood the console.\n// Keyed per (family, weight, style) variant, not per family: each variant is a\n// distinct thing the app asked for and failed to get. The claimed keys live in\n// fallback.ts so both reset seams clear them.\nfunction warnMissingFamilyOnce(\n family: string, weight: number, style: FontStyle, resolved: string,\n): void {\n if (!claimFallbackWarning(`substituted|${family}|${weight}|${style}`)) return;\n // Two distinct failures land here. Saying \"not registered\" for a family\n // that IS registered — just not in a variant the within-family chain can\n // reach — sends the reader hunting for a registerFont call that already\n // exists. Name the actual gap so the fix is the obvious one.\n const cause = registry.has(family)\n ? `has no variant matching ${weight}/${style}, and none of its registered ` +\n `variants are close enough for the within-family chain to substitute — ` +\n `rendering with \"${resolved}\" instead. Bake that variant with ` +\n `registerFont(\"${family}\", { weight: ${weight}, style: '${style}' }, …)`\n : `is not registered — rendering with \"${resolved}\" instead. ` +\n `Call registerFont(\"${family}\", …)`;\n console.warn(\n `weasel: font family \"${family}\" (${weight}/${style}) ${cause}. ` +\n `Advance widths will differ from the requested font. Use ` +\n `setFontFallbackPolicy('none') to make this a hard miss instead.`,\n );\n}\n\n/**\n * The substitute policy engaged and still came up empty. Distinct from\n * `warnMissingFamilyOnce`, which reports a *successful* swap: here nothing\n * renders, and the fix is almost always in the fallback family rather than\n * the requested one — so name it, and say which way it was chosen.\n */\nfunction warnUnusableDefaultOnce(\n family: string, weight: number, style: FontStyle, fallback: string,\n): void {\n if (!claimFallbackWarning(`unusable-default|${family}|${weight}|${style}`)) return;\n const origin = getDefaultFontFamily() === fallback\n ? 'set via setDefaultFontFamily'\n : 'the first registered family, since setDefaultFontFamily was never called';\n // Same policy-aware question as the substitution guard: a fallback the\n // `'canvas'` policy auto-enrolled has nothing serving it under this policy,\n // so \"has no variant\" would send the reader looking for a variant to bake\n // when the family has no atlas at all.\n const gap = registry.has(fallback) || isCanvasFont(fallback)\n ? `has no variant that can serve ${weight}/${style}`\n : 'is not registered either';\n console.warn(\n `weasel: font family \"${family}\" (${weight}/${style}) is not available, and ` +\n `the fallback family \"${fallback}\" (${origin}) ${gap} — this text will not ` +\n `render at all. Bake that variant with registerFont(\"${fallback}\", ` +\n `{ weight: ${weight}, style: '${style}' }, …), or point ` +\n `setDefaultFontFamily() at a family that covers it.`,\n );\n}\n\n/**\n * The requested family is also the effective default — there is nowhere left\n * to fall back to. Distinct from `warnUnusableDefaultOnce`, which names a\n * *different* fallback family to fix; here the requested and fallback\n * families are the same one, so repeating the name the way that message does\n * would read as nonsense (\"X is not available, and the fallback X … \").\n * Named once, with both facts — registered-but-wrong-variant, and also the\n * fallback — folded into a single sentence.\n */\nfunction warnSelfUnusableDefaultOnce(\n family: string, weight: number, style: FontStyle,\n): void {\n if (!claimFallbackWarning(`self-unusable-default|${family}|${weight}|${style}`)) return;\n const origin = getDefaultFontFamily() === family\n ? 'set via setDefaultFontFamily'\n : 'the first registered family, since setDefaultFontFamily was never called';\n console.warn(\n `weasel: font family \"${family}\" (${weight}/${style}) has no variant that can ` +\n `serve this request, and \"${family}\" is also the fallback family (${origin}) — ` +\n `there is nothing left to fall back to, so this text will not render at all. ` +\n `Bake that variant with registerFont(\"${family}\", { weight: ${weight}, ` +\n `style: '${style}' }, …), or point setDefaultFontFamily() at a different family.`,\n );\n}\n\n/**\n * The requested family is the explicitly set default, and that default names\n * a family that was never registered at all. Distinct from\n * `warnSelfUnusableDefaultOnce`, which reports a default that *is* registered\n * but not in a variant that can serve the request: there the fix is to bake a\n * variant, here the family has no atlas whatsoever, so pointing the reader at\n * a missing variant would send them looking for a `registerFont` call to\n * amend rather than one to write.\n */\nfunction warnUnregisteredDefaultOnce(\n family: string, weight: number, style: FontStyle,\n): void {\n if (!claimFallbackWarning(`unregistered-default|${family}|${weight}|${style}`)) return;\n console.warn(\n `weasel: font family \"${family}\" (${weight}/${style}) was never registered, and ` +\n `it is also the fallback family — setDefaultFontFamily(\"${family}\") names a ` +\n `family with no registered variants at all, so there is nothing left to fall ` +\n `back to and this text will not render at all. Call registerFont(\"${family}\", ` +\n `{ weight: ${weight}, style: '${style}' }, …), or point setDefaultFontFamily() ` +\n `at a family you have registered.`,\n );\n}\n\nfunction weightBucket(w: number): 'regular' | 'bold' {\n return w >= 600 ? 'bold' : 'regular';\n}\n\n/**\n * Resolve a `(family, weight, style)` request to a registered font entry,\n * walking the fallback chain when an exact match isn't available. Returns\n * synthetic flags describing the gap between requested and resolved so the\n * renderer can apply SDF-thicken / vertex-skew fakes.\n */\nexport function resolveFontVariant(\n family: string,\n weight: number,\n style: FontStyle,\n): ResolveResult {\n return resolveFontVariantInternal(family, weight, style, false);\n}\n\n/**\n * Escalate a *single codepoint* to the dynamic tier when the atlas that\n * resolved for the run has no glyph for it.\n *\n * `resolveFontVariant` answers at family granularity: it picks one tier for a\n * whole run. But a baked MSDF atlas covers a fixed charset, so a run served by\n * a perfectly good atlas can still contain a character that atlas never baked\n * — an em dash, a curly quote, anything outside the subset. The dynamic tier\n * rasterizes on demand from installed fonts and can serve exactly those.\n *\n * Returns a canvas-tier `ResolveResult` whose `dynamicFace` the caller drives\n * with `requestGlyph(cp)`, or `null` when escalation isn't available:\n *\n * - Policy `'none'` documents a miss as a *hard* miss. Quietly reaching for\n * another tier per codepoint would undo that, so it doesn't.\n * - No canvas to rasterize into (SSR, a jsdom test without one) makes the\n * dynamic tier constructible-but-broken; `getDynamicFace` throws and this\n * reports the miss instead of taking the caller down with it.\n *\n * Cheap to call per missing codepoint: faces are cached by variant and glyphs\n * by codepoint, so a repeat is two map lookups.\n */\nexport function resolveGlyphFallback(\n family: string,\n weight: number,\n style: FontStyle,\n): ResolveResult | null {\n if (getFontFallbackPolicy() === 'none') return null;\n try {\n return {\n entry: null,\n dynamicFace: getDynamicFace(family, weight, style),\n resolved: { family, weight, style },\n // The dynamic tier rasterizes the real weight and style, so there is\n // nothing for the shader to fake.\n synthetic: { bold: false, italic: false },\n source: 'canvas',\n };\n } catch {\n return null;\n }\n}\n\n/**\n * `suppressWarn` is set only by the recursive substitution probe in\n * `missResolveResult`, which resolves the fallback family purely to check\n * whether it renders. That probe is not itself a request anything asked\n * for, so it must not emit — or claim the warn-once key for — a message\n * about a resolution the caller never made; the caller's own top-level\n * `missResolveResult` call decides, from the probe's result, which single\n * warning (if any) describes the overall miss.\n */\nfunction resolveFontVariantInternal(\n family: string,\n weight: number,\n style: FontStyle,\n suppressWarn: boolean,\n): ResolveResult {\n const familyMap = registry.get(family);\n if (!familyMap || familyMap.size === 0) {\n return missResolveResult(family, weight, style, suppressWarn);\n }\n\n // 1. Exact match\n const exact = familyMap.get(variantKey(weight, style));\n if (exact) {\n return {\n entry: exact,\n resolved: { family, weight, style },\n synthetic: { bold: false, italic: false },\n source: 'atlas',\n };\n }\n\n // 2. Same style, nearest weight in same bucket (ties broken by higher weight)\n const requestedBucket = weightBucket(weight);\n let bestSameStyle: { entry: FontEntry; weight: number; distance: number } | null = null;\n for (const [key, entry] of familyMap) {\n const [wStr, s] = key.split('|') as [string, FontStyle];\n const w = Number(wStr);\n if (s !== style) continue;\n if (weightBucket(w) !== requestedBucket) continue;\n const distance = Math.abs(w - weight);\n if (\n bestSameStyle === null ||\n distance < bestSameStyle.distance ||\n (distance === bestSameStyle.distance && w > bestSameStyle.weight)\n ) {\n bestSameStyle = { entry, weight: w, distance };\n }\n }\n if (bestSameStyle) {\n return {\n entry: bestSameStyle.entry,\n resolved: { family, weight: bestSameStyle.weight, style },\n synthetic: { bold: false, italic: false },\n source: 'atlas',\n };\n }\n\n // 3. (family, 400, style)\n const sameStyleRegular = familyMap.get(variantKey(400, style));\n if (sameStyleRegular) {\n return {\n entry: sameStyleRegular,\n resolved: { family, weight: 400, style },\n synthetic: {\n bold: weight >= 600,\n italic: false,\n },\n source: 'atlas',\n };\n }\n\n // 4. (family, weight, 'normal') — same weight, no italic\n const sameWeightNormal = familyMap.get(variantKey(weight, 'normal'));\n if (sameWeightNormal) {\n return {\n entry: sameWeightNormal,\n resolved: { family, weight, style: 'normal' },\n synthetic: {\n bold: false,\n italic: style === 'italic',\n },\n source: 'atlas',\n };\n }\n\n // 4b. Nearest weight, normal style, same bucket\n let bestNormal: { entry: FontEntry; weight: number; distance: number } | null = null;\n for (const [key, entry] of familyMap) {\n const [wStr, s] = key.split('|') as [string, FontStyle];\n const w = Number(wStr);\n if (s !== 'normal') continue;\n if (weightBucket(w) !== requestedBucket) continue;\n const distance = Math.abs(w - weight);\n if (\n bestNormal === null ||\n distance < bestNormal.distance ||\n (distance === bestNormal.distance && w > bestNormal.weight)\n ) {\n bestNormal = { entry, weight: w, distance };\n }\n }\n if (bestNormal) {\n return {\n entry: bestNormal.entry,\n resolved: { family, weight: bestNormal.weight, style: 'normal' },\n synthetic: {\n bold: false,\n italic: style === 'italic',\n },\n source: 'atlas',\n };\n }\n\n // 5. (family, 400, 'normal') — last resort within family\n const regular = familyMap.get(variantKey(400, 'normal'));\n if (regular) {\n return {\n entry: regular,\n resolved: { family, weight: 400, style: 'normal' },\n synthetic: {\n bold: weight >= 600,\n italic: style === 'italic',\n },\n source: 'atlas',\n };\n }\n\n return missResolveResult(family, weight, style, suppressWarn);\n}\n","/**\n * Font-family picker driven by the live font registry.\n *\n * **What it offers.** Both tiers that can actually paint: `listFonts()` for\n * families with a baked atlas, and `listCanvasFonts()` for families the\n * dynamic canvas-SDF tier will serve. Offer what will render, invent\n * nothing — and `listCanvasFonts` reports service rather than membership,\n * so a family auto-enrolled under a policy that is no longer in force\n * doesn't appear.\n *\n * **What it does with a value it can't offer.** Nothing about the model\n * stops a node from naming a family that was never registered — a pasted\n * node, an imported SVG, a document from a session that loaded more fonts.\n * The control keeps that value visible as its own entry and names what is\n * actually painting instead, read structurally off\n * `resolveFontVariant().substituted`. Dropping the value would silently\n * rewrite the document on the next edit; showing it bare would claim a font\n * is in use that isn't.\n */\nimport { listCanvasFonts, listFonts, resolveFontVariant } from '@weasel-js/font';\nimport { Select } from '../Select';\n\nexport interface FontFamilySelectProps {\n /** Current family, or `undefined` when the sources disagree (`mixed`). */\n value?: string;\n /** Indeterminate presentation — the aggregated sources name different families. */\n mixed?: boolean;\n onChange: (family: string) => void;\n /** The weight / style the text actually renders at, so the substitution\n * probe reports the variant that paints rather than a nominal 400/normal. */\n weight?: number;\n fontStyle?: 'normal' | 'italic';\n 'aria-label'?: string;\n className?: string;\n}\n\n/** Label for a value that isn't in the registry: name the substitute when the\n * fallback chain found one, otherwise say only what is known. */\nfunction unregisteredLabel(family: string, weight: number, style: 'normal' | 'italic'): string {\n const { substituted } = resolveFontVariant(family, weight, style);\n return substituted\n ? `${family} — not loaded, showing ${substituted.resolved}`\n : `${family} — not loaded`;\n}\n\nexport function FontFamilySelect(props: FontFamilySelectProps) {\n const { value, mixed = false, onChange, weight = 400, fontStyle = 'normal', className } = props;\n // Both tiers that actually render: families with a baked atlas, and\n // families the dynamic canvas-SDF tier will serve. Neither list is a guess\n // — `listCanvasFonts` reports what the registry will really route, so a\n // family reaches this menu only if it can paint.\n const baked = listFonts();\n const canvas = listCanvasFonts().filter((c) => !baked.some((f) => f.family === c.family));\n const available = [...baked.map((f) => f.family), ...canvas.map((c) => c.family)];\n const options = available.map((family) => ({ value: family, label: family }));\n if (value !== undefined && !available.includes(value)) {\n options.push({ value, label: unregisteredLabel(value, weight, fontStyle) });\n }\n return (\n <Select<string>\n className={className}\n options={options}\n selectedKey={mixed ? null : (value ?? null)}\n placeholder={mixed ? 'Mixed' : undefined}\n onSelectionChange={onChange}\n aria-label={props['aria-label'] ?? 'Font'}\n />\n );\n}\n","// Reading and writing the paint objects a property control may be pointed at.\n//\n// `data.fill` is a `FillStyle` and `data.stroke` a `Stroke`, so a control that\n// assumes either is a hex string reads `undefined` off it and writes a bare\n// string back over it. These helpers are what keep a control honest about the\n// shape it is holding.\n\n/** Whether a value is a `FillStyle` at all: an object naming a kind, or one\n * carrying a color, which is the solid member with its optional tag left off.\n * A pref's stored value is `unknown`, so this is what stands between a paint\n * control and a string someone saved there. */\nexport function isPaint(value: unknown): value is { fill?: string; color?: string } {\n if (typeof value !== 'object' || value === null) return false;\n const paint = value as { fill?: unknown; color?: unknown };\n return typeof paint.fill === 'string' || typeof paint.color === 'string';\n}\n\n/** The color of a solid paint, or `undefined` for anything else — including a\n * value that isn't a paint at all. `fill` is optional on the solid member of\n * the union, so the tag alone can't decide it. */\nexport function solidColorOf(value: unknown): string | undefined {\n if (typeof value !== 'object' || value === null) return undefined;\n const paint = value as { fill?: string; color?: unknown };\n if (paint.fill !== undefined && paint.fill !== 'solid') return undefined;\n return typeof paint.color === 'string' ? paint.color : undefined;\n}\n\n/** The single color a stroke shows, or `undefined` when it has none to show —\n * a gradient or pattern stroke, or no stroke at all. */\nexport function strokeColorOf(value: unknown): string | undefined {\n if (typeof value !== 'object' || value === null || !('paint' in value)) return undefined;\n return solidColorOf((value as { paint: unknown }).paint);\n}\n","import { useMemo, type ReactNode } from 'react';\nimport { Focusable } from 'react-aria-components';\nimport { Checkbox } from '../Checkbox';\nimport { ColorField } from '../ColorField';\nimport { FontFamilySelect } from '../FontFamilySelect';\nimport { isPaint } from '../paintValue';\nimport { PaintField } from '../PaintField';\nimport { Input } from '../Input';\nimport { NumberField, UnitField } from '../NumberField';\nimport { RadioGroup, Radio } from '../RadioGroup';\nimport { RangeSlider } from '../RangeSlider';\nimport { Select } from '../Select';\nimport { Switch } from '../Switch';\nimport { Tooltip, TooltipTrigger } from '../Tooltip';\nimport { isBuiltinToolPref, type FillStyle } from '@weasel-js/core';\nimport {\n isPrefLeaf,\n prefDisplayBounds,\n prefUnitAccepts,\n prefValueAtPath,\n visiblePrefSubtree,\n type PrefGroup,\n type PrefLeaf,\n} from './schema';\nimport s from './Prefs.module.css';\n\n/** What a {@link PrefRenderer} is given for the leaf it is rendering. */\nexport interface PrefRenderContext {\n /** Dotted path of the leaf within the schema root. */\n path: string;\n /** The schema node. App renderers narrow this to their own kind shape. */\n pref: PrefLeaf;\n /** Current value — `values` at `path`, falling back to `pref.default`. */\n value: unknown;\n setValue: (value: unknown) => void;\n /** Whether this leaf is currently auto — not pinned, computed by the owner. */\n auto: boolean;\n /** Toggle this leaf's auto state. */\n setAuto: (next: boolean) => void;\n}\n\n/**\n * Renders the control cell for one preference leaf. Returning `null`\n * collapses the row.\n */\nexport type PrefRenderer = (ctx: PrefRenderContext) => ReactNode;\n\n/** Props for {@link PrefsForm}. */\nexport interface PrefsFormProps {\n /** Root of the schema tree. Core `ToolPrefGroup`s assign structurally. */\n schema: PrefGroup;\n /** Nested value tree (shape mirrors the schema). Sparse is fine —\n * missing leaves fall back to their schema `default`. */\n values?: unknown;\n /** Change callback with the leaf's dotted path. Values apply live;\n * there is no dirty/commit state. */\n onChange: (path: string, value: unknown) => void;\n /**\n * Per-kind renderers for app-defined kinds. Entries also override the\n * built-in kinds when keys collide. A renderer owns the control cell\n * (the label/tooltip row chrome stays with the form, unless the leaf\n * sets `block`); returning `null` collapses the row entirely. Unknown\n * kinds with no renderer show a labeled placeholder instead of\n * crashing.\n */\n renderers?: Record<string, PrefRenderer>;\n /** Reveal `hidden` leaves (dev tooling). Default false. */\n showHidden?: boolean;\n className?: string;\n}\n\n/**\n * Schema-driven preferences form. Top-level groups render as columns,\n * nested groups as indented sub-panels, leaves as label + control rows.\n * Storage-agnostic: pair with `PrefsDialog` for the modal composition,\n * and persist however the app likes via `onChange`.\n */\nexport function PrefsForm(props: PrefsFormProps) {\n const { schema, values, onChange, renderers, showHidden = false, className } = props;\n const visibleRoot = useMemo(\n () => visiblePrefSubtree(schema, showHidden),\n [schema, showHidden],\n );\n const ctx: WalkCtx = { values, onChange, renderers };\n return (\n <div className={[s.columns, className].filter(Boolean).join(' ')}>\n {Object.entries(visibleRoot?.children ?? {}).map(([key, child]) => (\n <div key={key} className={s.column}>\n {isPrefLeaf(child) ? (\n // Top-level leaves are unusual but legal — give each its own\n // column for symmetry with grouped siblings.\n <PrefRow ctx={ctx} path={key} pref={child} />\n ) : (\n <GroupBody ctx={ctx} group={child} path={key} depth={0} />\n )}\n </div>\n ))}\n </div>\n );\n}\n\ninterface WalkCtx {\n values: unknown;\n onChange: (path: string, value: unknown) => void;\n renderers?: Record<string, PrefRenderer>;\n}\n\nfunction GroupBody({ ctx, group, path, depth }: {\n ctx: WalkCtx;\n group: PrefGroup;\n path: string;\n depth: number;\n}) {\n return (\n <div className={depth === 0 ? s.panel : s.subpanel}>\n <div className={s.groupHeader}>\n <h3 className={s.groupTitle}>{group.name}</h3>\n {group.description !== undefined && (\n <p className={s.groupDesc}>{group.description}</p>\n )}\n </div>\n <div className={s.rows}>\n {Object.entries(group.children).map(([key, child]) => {\n const childPath = `${path}.${key}`;\n return isPrefLeaf(child) ? (\n <PrefRow key={key} ctx={ctx} path={childPath} pref={child} />\n ) : (\n <GroupBody key={key} ctx={ctx} group={child} path={childPath} depth={depth + 1} />\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction PrefRow({ ctx, path, pref }: { ctx: WalkCtx; path: string; pref: PrefLeaf }) {\n const stored = prefValueAtPath(ctx.values, path);\n const renderCtx: PrefRenderContext = {\n path,\n pref,\n value: stored !== undefined ? stored : pref.default,\n setValue: (v) => ctx.onChange(path, v),\n // A prefs form pins every leaf: it has no computed state to hand back.\n auto: false,\n setAuto: () => {},\n };\n\n const custom = ctx.renderers?.[pref.kind];\n const control = custom ? custom(renderCtx) : renderBuiltin(renderCtx);\n if (custom && control === null) return null;\n\n // `block` leaves own their chrome (embedded editors with their own\n // header) — no label/tooltip row.\n if (pref.block) return <>{control}</>;\n\n return (\n <label className={s.row}>\n <span className={s.rowLabel}>\n {pref.name}\n {pref.description ? (\n // Help affordance carries the description tooltip. A tooltip\n // trigger must be interactive (keyboard-reachable), so this is\n // a real button — a bare label span would be neither focusable\n // nor announced.\n <TooltipTrigger>\n <Focusable>\n <button type=\"button\" className={s.help} aria-label={`About ${pref.name}`}>\n ⓘ\n </button>\n </Focusable>\n <Tooltip>{pref.description}</Tooltip>\n </TooltipTrigger>\n ) : null}\n </span>\n <span className={s.rowControl}>{control}</span>\n </label>\n );\n}\n\nfunction renderBuiltin(\n ctx: PrefRenderContext,\n // The object a nested leaf is a field of — what an enum `encoding` reads\n // and writes against. Undefined for a top-level leaf, which has none.\n siblings?: Record<string, unknown>,\n): ReactNode {\n const { pref, value, setValue } = ctx;\n if (pref.kind === 'font-family') {\n // Not a `ToolPref` kind: its options are the live font registry, which no\n // static schema can carry. Core's own text schema still declares it, so\n // the form ships the control rather than leaving every consumer to.\n //\n // The substitution probe runs at the weight and slant the family is stored\n // beside — fields of the same `TextStyle` object leaf — so the label names\n // the variant that will actually paint.\n const weight = siblings?.fontWeight;\n const slant = siblings?.fontStyle;\n return (\n <FontFamilySelect\n value={typeof value === 'string' ? value : undefined}\n onChange={setValue}\n weight={typeof weight === 'number' ? weight : undefined}\n fontStyle={slant === 'italic' ? 'italic' : undefined}\n aria-label={pref.name}\n />\n );\n }\n if (!isBuiltinToolPref(pref)) {\n // App-defined kind with no `renderers` entry: labeled placeholder, not a\n // crash — a missing wiring should be visible and recoverable.\n return <span className={s.unrenderable}>({pref.kind}: no renderer)</span>;\n }\n switch (pref.kind) {\n case 'boolean': {\n const checked = Boolean(value);\n return pref.control === 'switch' ? (\n <Switch isSelected={checked} onChange={setValue} aria-label={pref.name} />\n ) : (\n <Checkbox isSelected={checked} onChange={setValue} aria-label={pref.name} />\n );\n }\n case 'number': {\n const stored = typeof value === 'number' && Number.isFinite(value) ? value : 0;\n const unit = pref.unit;\n const display = unit ? unit.toDisplay(stored) : stored;\n // `min`/`max`/`step` are declared in the stored unit, like the value, so\n // they convert with it — a leaf storing radians and showing degrees was\n // clamping typed degrees against 0..6.28.\n const bounds = prefDisplayBounds(pref);\n const store = (v: number): void => setValue(unit ? unit.fromDisplay(v) : v);\n if (pref.control === 'slider') {\n return (\n <RangeSlider\n value={display}\n onChange={(v) => store(typeof v === 'number' ? v : v[0])}\n minValue={bounds.min}\n maxValue={bounds.max}\n step={bounds.step}\n aria-label={pref.name}\n />\n );\n }\n const field = unit ? (\n <UnitField\n value={display}\n onChange={store}\n minValue={bounds.min}\n maxValue={bounds.max}\n step={bounds.step}\n accepts={prefUnitAccepts(unit)}\n aria-label={pref.name}\n />\n ) : (\n <NumberField\n value={display}\n onChange={store}\n minValue={bounds.min}\n maxValue={bounds.max}\n step={bounds.step}\n aria-label={pref.name}\n />\n );\n if (unit?.suffix === undefined) return field;\n return (\n <>\n {field}\n <span className={s.unitSuffix} aria-hidden=\"true\">{unit.suffix}</span>\n </>\n );\n }\n case 'string': {\n const text = typeof value === 'string' ? value : '';\n if (pref.control === 'textarea') {\n return (\n <textarea\n className={s.textarea}\n value={text}\n onChange={(e) => setValue(e.target.value)}\n aria-label={pref.name}\n rows={3}\n />\n );\n }\n return <Input value={text} onChange={setValue} aria-label={pref.name} />;\n }\n case 'enum': {\n const encoding = pref.encoding;\n // An encoded leaf stores something other than the option string (a dash\n // array), so reading the raw value selects nothing and writing one\n // replaces the stored form with the option string.\n const option = encoding\n ? encoding.read(value, siblings)\n : typeof value === 'string'\n ? value\n : pref.default;\n const choose = (next: string): void =>\n setValue(encoding ? encoding.write(next, siblings) : next);\n if (pref.control === 'radio') {\n return (\n <RadioGroup value={option ?? null} onChange={choose} aria-label={pref.name}>\n {pref.options.map((o) => (\n <Radio key={o.value} value={o.value} isDisabled={o.disabled}>\n {o.label}\n </Radio>\n ))}\n </RadioGroup>\n );\n }\n return (\n <Select<string>\n options={pref.options.map((o) => ({\n value: o.value,\n label: o.label,\n isDisabled: o.disabled,\n }))}\n selectedKey={option ?? null}\n onSelectionChange={choose}\n aria-label={pref.name}\n />\n );\n }\n case 'color': {\n const hex = typeof value === 'string' ? value : pref.default;\n return (\n <ColorField\n value={hex}\n alpha={pref.alpha}\n onChange={setValue}\n aria-label={pref.name}\n />\n );\n }\n case 'paint': {\n // A whole `FillStyle`, edited as one: `PaintField` puts the kind bar and\n // the stop editor in a popover, so the control column holds a swatch and\n // a gradient survives being touched.\n const held = isPaint(value) ? value : isPaint(pref.default) ? pref.default : null;\n return (\n <PaintField\n value={held as FillStyle | null}\n onChange={setValue}\n aria-label={pref.name}\n />\n );\n }\n case 'object': {\n // One value with its fields hanging off it: each child renders its own\n // control and commits the parent object whole.\n const p = pref;\n const held = typeof value === 'object' && value !== null\n ? (value as Record<string, unknown>)\n : undefined;\n const objectRows = (children: Record<string, PrefLeaf | PrefGroup>): ReactNode[] => {\n const out: ReactNode[] = [];\n for (const [key, child] of Object.entries(children)) {\n if (!isPrefLeaf(child)) {\n const inner = objectRows(child.children);\n if (inner.length === 0) continue;\n out.push(<h4 key={`group:${key}`} className={s.objectGroup}>{child.name}</h4>, ...inner);\n continue;\n }\n out.push(\n <label key={key} className={s.objectRow}>\n <span className={s.objectLabel}>{child.name}</span>\n {renderBuiltin({\n path: `${ctx.path}.${key}`,\n pref: child,\n value: held?.[key],\n setValue: (v) => {\n const base = held ?? p.fromScalar?.(value) ?? {};\n setValue({ ...base, [key]: v });\n },\n // A field is not pinned on its own — it shares the state of\n // the object leaf it hangs off.\n auto: ctx.auto,\n setAuto: ctx.setAuto,\n }, held)}\n </label>,\n );\n }\n return out;\n };\n return <div className={s.objectLeaf}>{objectRows(p.children)}</div>;\n }\n default: {\n // Not reachable while every built-in kind has an arm — and a new kind\n // that lacks one is a compile error here, never a blank row.\n const _exhaustive: never = pref;\n throw new Error(\n `PrefsForm: no control for built-in pref kind \"${(_exhaustive as { kind: string }).kind}\"`,\n );\n }\n }\n}\n","/**\n * The row chrome behind a sidebar list — layers, history, anything that is a\n * flat column of selectable rows in a panel.\n *\n * It owns the container, the row box and the empty state, and nothing else:\n * what a row *means* stays with the consumer. History dims its redo entries\n * and rules a line under the current one; a layer list drags to reorder and\n * leads each row with a swatch. Both reach that through `className` and\n * `rowProps` rather than through options here, so this does not grow a flag\n * per consumer.\n *\n * Rows are one height and one inset for every list, which is the point: two\n * panels stacked in the same sidebar have to agree, and they did not while\n * each owned a private copy of the same CSS.\n */\nimport { forwardRef, type HTMLAttributes, type ReactNode, type Ref } from 'react';\nimport s from './ItemList.module.css';\n\n/** One row. `id` is the React key. */\nexport interface ItemListRow {\n id: string;\n label: ReactNode;\n /** Fixed-size content before the label — a color swatch, a checkbox. */\n leading?: ReactNode;\n /** The row the list considers current. */\n selected?: boolean;\n /** Present but not in effect — history's redo entries. */\n muted?: boolean;\n /** Consumer classes for states this component has no opinion about. */\n className?: string;\n /** Handlers and data attributes for this row's element. `data-*` is\n * spelled out because `HTMLAttributes` does not admit it, and every\n * consumer here marks its rows up with one. */\n rowProps?: HTMLAttributes<HTMLDivElement> & Record<`data-${string}`, unknown>;\n}\n\nexport interface ItemListProps {\n rows: readonly ItemListRow[];\n /** Shown in place of the rows when there are none. */\n empty?: ReactNode;\n className?: string;\n /** Rendered inside the container above the rows — a drop indicator. */\n overlay?: ReactNode;\n /** Spread onto the container: pointer handlers for a drag, `aria-label`. */\n containerProps?: HTMLAttributes<HTMLDivElement>;\n}\n\nexport const ItemList = forwardRef(function ItemList(\n { rows, empty, className, overlay, containerProps }: ItemListProps,\n ref: Ref<HTMLDivElement>,\n) {\n const cls = [s.list, className].filter(Boolean).join(' ');\n if (rows.length === 0) {\n return (\n <div className={cls} ref={ref} {...containerProps}>\n <div className={s.empty}>{empty ?? '—'}</div>\n </div>\n );\n }\n return (\n <div className={cls} ref={ref} {...containerProps}>\n {overlay}\n {rows.map((row) => (\n <div\n key={row.id}\n className={[\n s.row,\n row.selected && s.selected,\n row.muted && s.muted,\n row.className,\n ].filter(Boolean).join(' ')}\n {...row.rowProps}\n >\n {row.leading}\n <span className={s.label}>{row.label}</span>\n </div>\n ))}\n </div>\n );\n});\n","import type { ReactNode } from 'react';\nimport s from './ToolOptionsBar.module.css';\n\n/** Props for {@link ToolOptionsBar}. */\nexport interface ToolOptionsBarProps {\n /**\n * Context label for the row — e.g. the active tool's name. Rendered\n * before the children and doubles as the toolbar's `aria-label`. Omit\n * it and the row still renders (it's a permanently reserved slot), just\n * without an accessible name.\n *\n * Using `label` for both the visible text and `aria-label` means a\n * screen reader announces it twice when landing on the toolbar (\"Text,\n * toolbar\", then \"Text\" again when browsing into the visible span).\n * `aria-labelledby` would avoid the echo at the cost of id plumbing and\n * an awkward no-`id`-to-point-at case when `label` is omitted. The\n * double-announcement is common enough for labelled landmark regions\n * that it's left as-is — considered, not missed.\n */\n label?: string;\n children?: ReactNode;\n className?: string;\n}\n\n/**\n * Horizontal strip reserved above the workspace for contextual tool\n * options — its first tenant is the character controls a text tool\n * exposes while a caret range is active. Pure chrome: it renders an\n * optional label and a children slot, nothing else. It knows nothing\n * about text, or about any specific tool — any tool can fill it.\n *\n * The row always renders, even with no `label` and no `children`,\n * because the app reserves its height permanently rather than mounting\n * it on demand — mounting mid-edit would resize the workspace under a\n * canvas that's sized to the page.\n *\n * `role=\"toolbar\"` without roving tabindex: the ARIA authoring practices\n * expect arrow-key roving focus across a toolbar's items, but this\n * component doesn't own or know the shape of its children — they're\n * arbitrary, possibly compound controls (`NumberField`, `Select`,\n * `ColorField`) that already use arrow keys for their own value editing.\n * Imposing roving focus here would fight those controls' own key\n * handling. Tab order falls back to normal DOM order for now; revisit\n * once the first tenant's control set is concrete and a roving-focus\n * contract can be designed in coordination with those controls.\n */\nexport function ToolOptionsBar(props: ToolOptionsBarProps) {\n const { label, children, className } = props;\n const cls = [s.root, className].filter(Boolean).join(' ');\n return (\n <div className={cls} role=\"toolbar\" aria-label={label}>\n {label !== undefined && <span className={s.label}>{label}</span>}\n <div className={s.controls}>{children}</div>\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, type KeyboardEvent, type PointerEvent } from 'react';\nimport { openPointerSession, type PointerSession } from '@weasel-js/core';\nimport s from './ResizeHandle.module.css';\n\n/**\n * Props for {@link ResizeHandle}. `onInput` fires throughout the drag and\n * `onChange` once at the end.\n */\nexport interface ResizeHandleProps {\n /**\n * Which way the handle *runs*, matching `aria-orientation` on the\n * separator role: a `vertical` handle is a vertical bar between two\n * side-by-side panes and drags horizontally. `horizontal` is the\n * stacked case (a bar between rows, dragged up and down).\n */\n orientation?: 'vertical' | 'horizontal';\n /** Current size of the pane being resized, in pixels. */\n value: number;\n min: number;\n max: number;\n /**\n * Flip the sign of the drag. Panes docked to the *trailing* edge (a\n * right sidebar, a bottom drawer) grow as the pointer moves toward the\n * start of the axis, so they want `invert`. Leading-edge panes don't.\n */\n invert?: boolean;\n /**\n * Fires continuously while dragging and on each keyboard step, always\n * clamped to [min, max]. Drive the live size from this.\n */\n onInput(next: number): void;\n /**\n * Fires once when a drag ends or a keyboard step settles, with the final\n * size. Persist here rather than in `onInput` — one write per gesture\n * instead of one per pointer sample.\n */\n onChange?(next: number): void;\n /**\n * The granularity of `value`. Arrow keys move by one step (Shift by\n * eight), and pointer drags snap to the same grid — a pointer reports\n * fractional coordinates on a scaled display, and nobody wants\n * `362.9453125` in their persisted layout. Set a fractional step for a\n * pane measured in something finer than whole pixels.\n */\n step?: number;\n ariaLabel?: string;\n className?: string;\n}\n\nconst clamp = (n: number, min: number, max: number): number => Math.min(max, Math.max(min, n));\n\n/**\n * Snap to the step grid, then clamp. Bounds win over the grid: `min`/`max`\n * are hard limits, so a range that isn't a whole number of steps clips to\n * the bound rather than overshooting it.\n */\nfunction settle(n: number, min: number, max: number, step: number): number {\n const snapped = step > 0 ? Math.round(n / step) * step : n;\n // Re-round to kill the float dust `x / 0.1 * 0.1` leaves behind.\n const precise = Number.isInteger(step) ? snapped : Number(snapped.toFixed(10));\n return clamp(precise, min, max);\n}\n\n/**\n * Draggable divider for resizing a pane — the \"window splitter\" pattern.\n * Owns no size of its own: the consumer holds `value` and applies it\n * (typically as a CSS custom property on the pane), which keeps the handle\n * usable for flex, grid, and absolutely-positioned layouts alike.\n *\n * Keyboard-operable as a matter of course: it's focusable, arrows step by\n * `step` (Shift for a coarse step), Home/End jump to the bounds. A splitter\n * that only responds to a pointer drag strands anyone who can't make one.\n */\nexport function ResizeHandle(props: ResizeHandleProps) {\n const {\n orientation = 'vertical', value, min, max, invert, onInput, onChange,\n step = 1, ariaLabel, className,\n } = props;\n\n // The session reads current props rather than the ones the pointerdown\n // closed over, so a bound or a step changed mid-drag takes effect.\n const latest = useRef(props);\n latest.current = props;\n\n // Drag origin. Measured on pointerdown so every move is measured against\n // the gesture's start rather than the previous sample — accumulating\n // per-sample deltas drifts once the pointer leaves the clamped range.\n const drag = useRef<{ origin: number; startValue: number; last: number } | null>(null);\n const session = useRef<PointerSession | null>(null);\n useEffect(() => () => { session.current?.cancel(); }, []);\n\n const valueAt = (axis: number): number => {\n const d = drag.current!;\n const p = latest.current;\n const delta = axis - d.origin;\n return settle(d.startValue + (p.invert ? -delta : delta), p.min, p.max, p.step ?? 1);\n };\n\n const finish = (next: number) => {\n drag.current = null;\n session.current = null;\n latest.current.onChange?.(next);\n };\n\n const onPointerDown = useCallback((e: PointerEvent<HTMLDivElement>) => {\n if (e.button !== 0 || session.current) return;\n const p = latest.current;\n const vertical = (p.orientation ?? 'vertical') === 'vertical';\n const axisOf = (ev: { clientX: number; clientY: number }) => (vertical ? ev.clientX : ev.clientY);\n drag.current = {\n origin: axisOf(e),\n startValue: p.value,\n last: settle(p.value, p.min, p.max, p.step ?? 1),\n };\n session.current = openPointerSession(e.currentTarget, e, {\n onMove: (ev) => {\n const next = valueAt(axisOf(ev));\n drag.current!.last = next;\n latest.current.onInput(next);\n },\n onEnd: (ev) => { finish(valueAt(axisOf(ev))); },\n // A cancelled resize settles where it was left: `onInput` has already\n // moved the pane there and the consumer owns the value, so abandoning\n // the commit would persist a size the user is no longer looking at.\n onCancel: () => { finish(drag.current!.last); },\n });\n e.preventDefault();\n }, []);\n\n const onKeyDown = useCallback((e: KeyboardEvent<HTMLDivElement>) => {\n const grow = orientation === 'vertical' ? 'ArrowRight' : 'ArrowDown';\n const shrink = orientation === 'vertical' ? 'ArrowLeft' : 'ArrowUp';\n const amount = step * (e.shiftKey ? 8 : 1) * (invert ? -1 : 1);\n let next: number | undefined;\n if (e.key === grow) next = value + amount;\n else if (e.key === shrink) next = value - amount;\n else if (e.key === 'Home') next = invert ? max : min;\n else if (e.key === 'End') next = invert ? min : max;\n if (next === undefined) return;\n e.preventDefault();\n const settled = settle(next, min, max, step);\n onInput(settled);\n onChange?.(settled);\n }, [invert, max, min, onInput, onChange, orientation, step, value]);\n\n const cls = [s.handle, orientation === 'horizontal' && s.horizontal, className]\n .filter(Boolean).join(' ');\n\n return (\n <div\n className={cls}\n role=\"separator\"\n tabIndex={0}\n aria-label={ariaLabel}\n aria-orientation={orientation}\n aria-valuenow={value}\n aria-valuemin={min}\n aria-valuemax={max}\n onPointerDown={onPointerDown}\n onKeyDown={onKeyDown}\n />\n );\n}\n","import type { ReactNode } from 'react';\nimport s from './StatusBar.module.css';\n\n/** Props for {@link StatusBar}. */\nexport interface StatusBarProps {\n /**\n * Accessible label for the bar. Deliberately not a live region — a status\n * bar's readouts change on every pointer move (zoom, cursor position,\n * selection count), and announcing each one would make a screen reader\n * unusable. Screen-reader users reach the same facts through the controls\n * that own them.\n */\n ariaLabel?: string;\n children?: ReactNode;\n className?: string;\n}\n\n/**\n * The thin readout strip along the bottom of an editor window: monospace,\n * one row, items separated by a fixed gap, with an optional spacer that\n * pushes everything after it to the trailing edge.\n *\n * Pure presentation — it holds whatever the app puts in it. Compose with\n * `<StatusBarItem>` and `<StatusBarSpacer>`.\n */\nexport function StatusBar(props: StatusBarProps) {\n const { ariaLabel, children, className } = props;\n return (\n <footer className={[s.bar, className].filter(Boolean).join(' ')} aria-label={ariaLabel}>\n {children}\n </footer>\n );\n}\n\n/** Props for {@link StatusBarItem}. */\nexport interface StatusBarItemProps {\n /**\n * Hover text. Items that carry one also get a `help` cursor, so the\n * affordance is discoverable rather than hidden behind a hover delay.\n */\n title?: string;\n /**\n * Dim the item and use tabular figures. For reference material that\n * shouldn't compete with live readouts — build stamps, hints, units.\n */\n muted?: boolean;\n children?: ReactNode;\n className?: string;\n}\n\n/** One readout in a `<StatusBar>`. */\nexport function StatusBarItem(props: StatusBarItemProps) {\n const { title, muted, children, className } = props;\n const cls = [s.item, muted && s.muted, title !== undefined && s.hasTitle, className]\n .filter(Boolean).join(' ');\n return <span className={cls} title={title}>{children}</span>;\n}\n\n/**\n * Splits a status bar into leading and trailing runs — everything after the\n * spacer is pushed to the trailing edge. Decorative, so it's hidden from the\n * accessibility tree.\n */\nexport function StatusBarSpacer() {\n return <span className={s.spacer} aria-hidden=\"true\" />;\n}\n","import { useEffect, useRef, type ReactElement, type ReactNode } from 'react';\nimport { Slider, type SliderStop, type Thumb } from '../Slider/Slider';\nimport s from './DetentSlider.module.css';\n\n/** What a detent can carry. Narrowed so identity comparison and React keys\n * both work without a keying callback. */\nexport type DetentValue = string | number;\n\n/** One detent on a {@link DetentSlider}. */\nexport type DetentItem<V extends DetentValue = number> = {\n value: V;\n /** Drawn under the detent. Defaults to `formatLabel(value)`, then `value`. */\n label?: ReactNode;\n /** Spoken form, when the drawn label is not the right thing to say. */\n ariaLabel?: string;\n};\n\n/**\n * Props for {@link DetentSlider}.\n *\n * `items` takes bare values or `DetentItem`s interchangeably — a bare value is\n * a detent with no label of its own.\n *\n * `onChange` fires on every detent the control passes through, including\n * mid-drag: each one is a complete, legal choice, so there is no in-flight\n * value to withhold. `onCommit` fires once the gesture that changed things\n * ends, and is the one to write to history.\n */\nexport type DetentSliderProps<V extends DetentValue = number> = {\n items: readonly (V | DetentItem<V>)[];\n value: V;\n onChange: (value: V, index: number) => void;\n onCommit?: (value: V, index: number) => void;\n formatLabel?: (value: V, index: number) => ReactNode;\n labels?: 'all' | 'ends' | 'none';\n trackHeight?: number;\n ariaLabel?: string;\n className?: string;\n};\n\nfunction normalize<V extends DetentValue>(items: readonly (V | DetentItem<V>)[]): DetentItem<V>[] {\n return items.map(it => (typeof it === 'object' && it !== null ? it : ({ value: it } as DetentItem<V>)));\n}\n\n/**\n * The detent `value` selects. An exact match wins; a number that matches none\n * lands on the nearest one, so a value arriving from a numeric field or an\n * older save renders where it belongs rather than silently reading as the\n * first detent.\n */\nfunction resolveIndex<V extends DetentValue>(items: readonly DetentItem<V>[], value: V): number {\n const exact = items.findIndex(it => it.value === value);\n if (exact !== -1) return exact;\n if (typeof value !== 'number') return 0;\n let best = 0;\n let bestGap = Infinity;\n for (let i = 0; i < items.length; i++) {\n const v = items[i].value;\n if (typeof v !== 'number') continue;\n const gap = Math.abs(v - value);\n if (gap < bestGap) {\n bestGap = gap;\n best = i;\n }\n }\n return best;\n}\n\nfunction plainText(label: ReactNode, fallback: DetentValue): string {\n return typeof label === 'string' || typeof label === 'number' ? String(label) : String(fallback);\n}\n\n/**\n * Slider over a fixed list of values: one detent per value, evenly spaced, the\n * thumb resting on one of them.\n *\n * This is the shape to reach for when an option has a small set of allowed\n * values along a line — playback rate, zoom step, quality — in place of a\n * dropdown, which hides the ordering and the extent of the range behind a\n * click. The values need only be ordered, not numeric.\n *\n * It is a strict {@link Slider} over the *index* of `items`, which keeps the\n * detents evenly spaced however the values are distributed. Since the index is\n * meaningless to a screen reader, the value is published as `aria-valuetext`.\n * For numbers that may also rest between the detents, use `Slider` directly\n * with `spacing=\"even\"` and magnetic stops.\n */\nexport function DetentSlider<V extends DetentValue = number>(props: DetentSliderProps<V>): ReactElement {\n const { value, onChange, onCommit, formatLabel, ariaLabel, className } = props;\n const items = normalize(props.items);\n const index = resolveIndex(items, value);\n const lastIndex = Math.max(0, items.length - 1);\n\n const labelOf = (item: DetentItem<V>, i: number): ReactNode =>\n item.label ?? formatLabel?.(item.value, i) ?? String(item.value);\n\n // Deduped separately: `live` suppresses the repeat reports a drag produces\n // while the pointer crosses one detent, `changed` keeps a press that chose\n // nothing from landing a no-op entry in the consumer's history.\n const liveRef = useRef(index);\n const changedRef = useRef(false);\n useEffect(() => {\n liveRef.current = index;\n }, [index]);\n\n const handleInput = (next: Thumb[]) => {\n const i = next[0].value;\n if (i === liveRef.current) return;\n liveRef.current = i;\n changedRef.current = true;\n onChange(items[i].value, i);\n };\n\n const handleCommit = (next: Thumb[]) => {\n if (!changedRef.current) return;\n changedRef.current = false;\n const i = next[0].value;\n onCommit?.(items[i].value, i);\n };\n\n const current = items[index];\n if (!current) return <div className={className ? `${s.root} ${className}` : s.root} />;\n\n const thumbs: Thumb[] = [\n { value: index, valueText: current.ariaLabel ?? plainText(labelOf(current, index), current.value) },\n ];\n\n const stops: SliderStop[] = items.map((item, i) => ({ value: i, label: labelOf(item, i) }));\n\n return (\n <div className={className ? `${s.root} ${className}` : s.root}>\n <Slider\n className={s.slider}\n min={0}\n max={lastIndex}\n stops={stops}\n snap=\"strict\"\n stopLabels={props.labels ?? 'all'}\n trackClick=\"move-nearest\"\n trackHeight={props.trackHeight ?? 8}\n ariaLabel={ariaLabel}\n thumbs={thumbs}\n onInput={handleInput}\n onChange={handleCommit}\n />\n </div>\n );\n}\n","import { UNSTABLE_ToastQueue } from 'react-aria-components';\nimport { flushSync } from 'react-dom';\n\n/** Severity of a toast, driving its accent color and icon. */\nexport type ToastTone = 'info' | 'success' | 'warning' | 'error';\n\n/** Kit-owned payload rendered inside each toast. */\nexport interface ToastContent {\n title: string;\n description?: string;\n tone: ToastTone;\n}\n\n/** Options for a single toast. */\nexport interface ToastOptions {\n description?: string;\n /**\n * Auto-dismiss delay in ms. Default 8000. `null` — sticky until dismissed.\n * Must be > 0; RAC treats 0 as no timer (sticky).\n */\n ttlMs?: number | null;\n /** Stable identity: re-adding with the same id replaces the earlier toast. */\n id?: string;\n}\n\nconst DEFAULT_TTL_MS = 8000;\n\n// Tracks overlapping toast-triggered view transitions so the `:root`\n// marker class survives until the *last* one settles.\nlet activeToastTransitions = 0;\n\n/**\n * RAC's sanctioned toast-animation hook: wrap every queue mutation in a\n * view transition so entry, exit, and the surviving stack's reflow all\n * animate (choreography lives in `toastViewTransitions.css`). Falls back\n * to a plain synchronous update when the browser lacks the API or the\n * user prefers reduced motion — i.e. exactly the pre-animation behavior.\n * The jsdom test environment always takes the fallback path.\n */\nfunction viewTransitionWrapUpdate(fn: () => void): void {\n const reduceMotion =\n typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (typeof document === 'undefined' || !('startViewTransition' in document) || reduceMotion) {\n fn();\n return;\n }\n // The marker class scopes the CSS that un-names `:root` (keeps the rest\n // of the page live and interactive during the transition) to\n // toast-owned transitions only.\n const root = document.documentElement;\n activeToastTransitions++;\n root.classList.add('wzl-toast-vt');\n // flushSync: the DOM must reflect the queue change inside the\n // transition callback, before the browser snapshots the new state.\n const vt = document.startViewTransition(() => flushSync(fn));\n // `ready` rejects when the browser skips the transition — routine under\n // a rapid burst of toasts, where each new transition supersedes the\n // in-flight one. The DOM update has still applied by then, but an\n // untouched `ready` surfaces the rejection as a console error, so\n // consume it.\n vt.ready.catch(() => {});\n void vt.finished.finally(() => {\n if (--activeToastTransitions === 0) root.classList.remove('wzl-toast-vt');\n });\n}\n\n// The wrapped RAC queue lives in a module-scoped WeakMap so the public\n// class surface carries no RAC (UNSTABLE_) types — see the design spec's\n// containment rule. `racQueueOf` below is the folder-internal accessor.\nconst RAC_QUEUES = new WeakMap<ToastQueue, UNSTABLE_ToastQueue<ToastContent>>();\n\n/**\n * Kit-owned toast queue. Create isolated instances with\n * `createToastQueue()` (tests, secondary roots); most apps use the\n * module-level `defaultToastQueue` via `toast()`.\n *\n * At most 5 toasts are visible at once; adding a 6th shows immediately\n * and hides the oldest (it returns when a slot frees, with its ttl\n * restarted).\n */\nexport class ToastQueue {\n private keysById = new Map<string, string>();\n\n constructor() {\n RAC_QUEUES.set(\n this,\n new UNSTABLE_ToastQueue<ToastContent>({\n maxVisibleToasts: 5,\n wrapUpdate: viewTransitionWrapUpdate,\n }),\n );\n }\n\n add(tone: ToastTone, title: string, options: ToastOptions = {}): void {\n const { description, ttlMs = DEFAULT_TTL_MS, id } = options;\n const rac = RAC_QUEUES.get(this)!;\n if (id !== undefined) {\n const existing = this.keysById.get(id);\n if (existing !== undefined) rac.close(existing);\n }\n let key: string;\n const racOptions: { timeout?: number; onClose?: () => void } =\n ttlMs === null ? {} : { timeout: ttlMs };\n if (id !== undefined) {\n racOptions.onClose = () => {\n if (this.keysById.get(id) === key) this.keysById.delete(id);\n };\n }\n key = rac.add({ title, description, tone }, racOptions);\n if (id !== undefined) this.keysById.set(id, key);\n }\n\n /** Dismiss the toast previously added with this `id`. No-op if none is live. */\n dismiss(id: string): void {\n const key = this.keysById.get(id);\n if (key !== undefined) RAC_QUEUES.get(this)!.close(key);\n }\n\n /** Dismiss every queued toast. */\n clear(): void {\n RAC_QUEUES.get(this)!.clear();\n this.keysById.clear();\n }\n}\n\n/**\n * Creates an independent toast queue. Most apps use the module-level\n * `defaultToastQueue` that `toast()` writes to; make your own when a surface\n * needs its own stack, and pass it to `ToastRegion`.\n */\nexport function createToastQueue(): ToastQueue {\n return new ToastQueue();\n}\n\n/**\n * Folder-internal bridge to the wrapped RAC queue for `ToastRegion`.\n * Deliberately NOT exported from the Toast folder's `index.ts` — the\n * RAC toast surface is unstable and must not leak past this folder.\n */\nexport function racQueueOf(queue: ToastQueue): UNSTABLE_ToastQueue<ToastContent> {\n return RAC_QUEUES.get(queue)!;\n}\n\n/** Module-level default queue used by `toast()` and `<ToastRegion>`. */\nexport const defaultToastQueue = createToastQueue();\n\ntype ToastFn = {\n (title: string, options?: ToastOptions): void;\n info(title: string, options?: ToastOptions): void;\n success(title: string, options?: ToastOptions): void;\n warning(title: string, options?: ToastOptions): void;\n error(title: string, options?: ToastOptions): void;\n};\n\nfunction tonedAdd(tone: ToastTone) {\n return (title: string, options?: ToastOptions) => defaultToastQueue.add(tone, title, options);\n}\n\n/** Imperative convenience over `defaultToastQueue`. Bare `toast(...)` is `info`. */\nexport const toast: ToastFn = Object.assign(tonedAdd('info'), {\n info: tonedAdd('info'),\n success: tonedAdd('success'),\n warning: tonedAdd('warning'),\n error: tonedAdd('error'),\n});\n","import {\n UNSTABLE_ToastRegion as RACToastRegion,\n UNSTABLE_Toast as RACToast,\n UNSTABLE_ToastContent as RACToastContent,\n Text,\n Button,\n} from 'react-aria-components';\nimport { defaultToastQueue, racQueueOf, type ToastQueue, type ToastTone } from './queue';\nimport s from './Toast.module.css';\nimport './toastViewTransitions.css';\n\n/** Screen corner a toast stack anchors to. */\nexport type ToastPlacement = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n\n/** Props for {@link ToastRegion}. */\nexport interface ToastRegionProps {\n /** Queue to render. Defaults to the module-level `defaultToastQueue`. */\n queue?: ToastQueue;\n /** Screen corner for the stack. Default `bottom-right`. */\n placement?: ToastPlacement;\n className?: string;\n}\n\nconst placementClass: Record<ToastPlacement, string> = {\n 'bottom-right': s.bottomRight,\n 'bottom-left': s.bottomLeft,\n 'top-right': s.topRight,\n 'top-left': s.topLeft,\n};\n\nconst toneClass: Record<ToastTone, string> = {\n info: s.toneInfo,\n success: s.toneSuccess,\n warning: s.toneWarning,\n error: s.toneError,\n};\n\n/**\n * Renders the toast stack for a queue. Mount once, near the app root.\n * From the underlying React Aria region: landmark semantics (keyboard /\n * F6 reachable), screen-reader announcements, and hover pausing the\n * auto-dismiss timers.\n */\nexport function ToastRegion(props: ToastRegionProps) {\n const { queue = defaultToastQueue, placement = 'bottom-right', className } = props;\n return (\n <RACToastRegion\n queue={racQueueOf(queue)}\n aria-label=\"Notifications\"\n className={[s.region, placementClass[placement], className].filter(Boolean).join(' ')}\n >\n {({ toast: t }) => (\n <RACToast\n toast={t}\n className={[s.toast, toneClass[t.content.tone]].filter(Boolean).join(' ')}\n // Inline style is the one sanctioned exception here: each toast\n // needs a *unique* view-transition-name (so enter/exit/reflow\n // track per-toast), and a class can't mint unique idents. The\n // prefix keeps the ident valid (RAC keys can start with digits).\n style={{ viewTransitionName: `wzl-toast-${t.key.replace(/[^a-zA-Z0-9_-]/g, '_')}` }}\n >\n <RACToastContent className={s.content}>\n <Text slot=\"title\" className={s.title}>{t.content.title}</Text>\n {t.content.description !== undefined && (\n <Text slot=\"description\" className={s.description}>{t.content.description}</Text>\n )}\n </RACToastContent>\n <Button slot=\"close\" className={s.close} aria-label=\"Dismiss notification\">\n ×\n </Button>\n </RACToast>\n )}\n </RACToastRegion>\n );\n}\n","/** Maps a domain value onto its position along the track, and back. */\nexport interface BandScale {\n /** Domain → position in [0,1]. Must be monotonic increasing. */\n toUnit(value: number, min: number, max: number): number;\n /** Inverse of `toUnit`. */\n fromUnit(unit: number, min: number, max: number): number;\n}\n\nexport function clamp01(u: number): number {\n return u < 0 ? 0 : u > 1 ? 1 : u;\n}\n\n/** Even domain steps take even track steps. */\nexport const linearScale: BandScale = {\n toUnit: (value, min, max) => (max === min ? 0 : (value - min) / (max - min)),\n fromUnit: (unit, min, max) => min + unit * (max - min),\n};\n\n/** Even *ratios* take even track steps. Requires `min > 0`. */\nexport const logScale: BandScale = {\n toUnit: (value, min, max) => {\n const lo = Math.log(min);\n const hi = Math.log(max);\n return hi === lo ? 0 : (Math.log(value) - lo) / (hi - lo);\n },\n fromUnit: (unit, min, max) => {\n const lo = Math.log(min);\n return Math.exp(lo + unit * (Math.log(max) - lo));\n },\n};\n\nlet warnedNonPositiveMin = false;\n\nfunction isDev(): boolean {\n return typeof process !== 'undefined' ? process.env.NODE_ENV !== 'production' : true;\n}\n\n/**\n * Resolves the `scale` prop, substituting `linearScale` for a `logScale`\n * that `min` would send to `NaN`.\n */\nexport function resolveScale(\n scale: 'linear' | 'log' | BandScale | undefined,\n min: number,\n): BandScale {\n const requested =\n scale === undefined || scale === 'log'\n ? logScale\n : scale === 'linear'\n ? linearScale\n : scale;\n\n if (requested !== logScale || min > 0) return requested;\n\n if (isDev() && !warnedNonPositiveMin) {\n warnedNonPositiveMin = true;\n console.warn(\n `BandEditor: a log scale needs min > 0, but min is ${min}. Falling back to a linear scale. ` +\n `Pass scale=\"linear\" to silence this.`,\n );\n }\n return linearScale;\n}\n","import type { BandScale } from './scale';\nimport { clamp01 } from './scale';\n\nexport interface Band<T> {\n /** Domain value where this band starts. The first band's is normalized to `min`. */\n from: number;\n data: T;\n}\n\n/**\n * A band list covers `[min, max]` exactly: N bands, N−1 interior seams, no\n * gaps and no overlaps. Seam *k* is `bands[k + 1].from`, and lives between\n * `bands[k].from` and the start of the band after next (or `max`).\n *\n * Every function here preserves that. Each returns the array it was given\n * when the edit would be a no-op, so callers can skip a callback with `===`.\n */\n\n/** Pins the first band's start to `min`; leaves the rest alone. */\nexport function normalizeBands<T>(value: readonly Band<T>[], min: number): Band<T>[] {\n const bands = value.map((b) => ({ ...b }));\n if (bands.length > 0) bands[0].from = min;\n return bands;\n}\n\n/** `[from, to]` of band `index` in domain space. */\nexport function bandBounds<T>(\n bands: readonly Band<T>[],\n index: number,\n min: number,\n max: number,\n): [number, number] {\n const from = index === 0 ? min : bands[index].from;\n const to = index === bands.length - 1 ? max : bands[index + 1].from;\n return [from, to];\n}\n\n/** How far seam `index` can travel before it would cross a neighbour. */\nexport function seamBounds<T>(\n bands: readonly Band<T>[],\n index: number,\n min: number,\n max: number,\n): [number, number] {\n const lo = index === 0 ? min : bands[index].from;\n const hi = index + 2 <= bands.length - 1 ? bands[index + 2].from : max;\n return [lo, hi];\n}\n\n/** Clamps a target position for seam `index` to its neighbours, inclusive. */\nexport function clampSeamTo<T>(\n bands: readonly Band<T>[],\n index: number,\n to: number,\n min: number,\n max: number,\n): number {\n const [lo, hi] = seamBounds(bands, index, min, max);\n return Math.max(lo, Math.min(hi, to));\n}\n\nexport function setSeam<T>(bands: readonly Band<T>[], index: number, to: number): Band<T>[] {\n if (bands[index + 1] === undefined || bands[index + 1].from === to) return bands as Band<T>[];\n const next = bands.map((b) => ({ ...b }));\n next[index + 1].from = to;\n return next;\n}\n\n/** Band edges as track positions: `length + 1` values from 0 to 1. */\nexport function unitEdges<T>(\n bands: readonly Band<T>[],\n scale: BandScale,\n min: number,\n max: number,\n): number[] {\n const edges = bands.map((b, i) => (i === 0 ? 0 : clamp01(scale.toUnit(b.from, min, max))));\n edges.push(1);\n return edges;\n}\n\n/**\n * Largest part of `shift` band `index` can take without pushing a neighbour's\n * far edge past it. Zero for the first and last band, whose outer edges are\n * `min` and `max` and do not move.\n */\nexport function clampBandShift(edges: readonly number[], index: number, shift: number): number {\n const isFirst = index === 0;\n const isLast = index === edges.length - 2;\n if (isFirst || isLast) return 0;\n const lo = edges[index - 1] - edges[index];\n const hi = edges[index + 2] - edges[index + 1];\n return Math.max(lo, Math.min(hi, shift));\n}\n\n/** Moves both edges of band `index`, which is the same as moving two seams. */\nexport function moveBandEdges<T>(\n bands: readonly Band<T>[],\n index: number,\n from: number,\n to: number,\n): Band<T>[] {\n const next = bands.map((b) => ({ ...b }));\n next[index].from = from;\n if (next[index + 1] !== undefined) next[index + 1].from = to;\n return next;\n}\n\n/**\n * Splits the band containing `at` in two, the new band starting there.\n * A position already on a seam or on `min` / `max` splits nothing.\n */\nexport function splitBands<T>(\n bands: readonly Band<T>[],\n at: number,\n min: number,\n max: number,\n makeData: (at: number, from: T) => T,\n): Band<T>[] {\n if (bands.length === 0 || at <= min || at >= max) return bands as Band<T>[];\n let index = -1;\n for (let i = 0; i < bands.length; i++) {\n const [from, to] = bandBounds(bands, i, min, max);\n if (at > from && at < to) {\n index = i;\n break;\n }\n }\n if (index < 0) return bands as Band<T>[];\n const next = bands.map((b) => ({ ...b }));\n next.splice(index + 1, 0, { from: at, data: makeData(at, bands[index].data) });\n return next;\n}\n\n/**\n * Merges band `index` into its left neighbour, which keeps its payload and\n * absorbs the span. The first band has no left neighbour and cannot be\n * merged away — a partition always has at least one part.\n */\nexport function mergeBand<T>(bands: readonly Band<T>[], index: number): Band<T>[] {\n if (index <= 0 || index >= bands.length) return bands as Band<T>[];\n return bands.filter((_, i) => i !== index).map((b) => ({ ...b }));\n}\n","import {\n Fragment,\n useEffect,\n useId,\n useRef,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { openPointerSession, type PointerSession } from '@weasel-js/core';\nimport s from './BandEditor.module.css';\nimport { SNAP_RADIUS_PX, snapToNearest } from '../../snap';\nimport { clamp01, resolveScale, type BandScale } from './scale';\nimport {\n bandBounds,\n clampBandShift,\n clampSeamTo,\n mergeBand,\n moveBandEdges,\n normalizeBands,\n seamBounds,\n setSeam,\n splitBands,\n unitEdges,\n type Band,\n} from './bands';\n\nexport type { Band, BandScale };\n\nexport interface BandEditorProps<T> {\n /** Ascending by `from`. `value[0].from` is normalized to `min` on read. */\n value: Band<T>[];\n /** Live during a drag — wire for preview, do not write to history. */\n onInput?: (next: Band<T>[]) => void;\n /** Committed at gesture end: one call per gesture. */\n onChange: (next: Band<T>[]) => void;\n min: number;\n max: number;\n /** Default `'log'`. */\n scale?: 'linear' | 'log' | BandScale;\n ticks?: { at: number; label?: ReactNode }[];\n /** Snap a dragged seam to a tick within ~6px. Default true; `alt` defeats it per-drag. */\n snap?: boolean;\n renderBand?: (band: Band<T>, index: number) => ReactNode;\n selectedIndex?: number | null;\n onSelect?: (index: number) => void;\n /** Payload for a band split off an existing one. Default duplicates `from`. */\n splitBand?: (at: number, from: T) => T;\n label?: ReactNode;\n className?: string;\n}\n\n/** One arrow-key step, as a fraction of the track. */\nconst KEY_STEP = 0.01;\n\nfunction pct(unit: number): string {\n return `${clamp01(unit) * 100}%`;\n}\n\nfunction keepData<T>(_at: number, from: T): T {\n return from;\n}\n\nfunction isTextEntry(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.isContentEditable) return true;\n const tag = target.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';\n}\n\n/**\n * Divides a numeric axis into contiguous bands and lets you drag the seams\n * between them. Each band carries a payload the consumer supplies and\n * renders through `renderBand`; the control itself knows nothing about what\n * a band means.\n *\n * The axis is always fully covered — N bands, N−1 interior seams, no gaps and\n * no overlaps — so editing is editing a sorted list of seam positions. Seams\n * clamp at their neighbours rather than crossing, which means a drag can\n * never destroy a band: removal is only ever the explicit `x` / `Delete`\n * merge. The first band is doubly exceptional, its left edge pinned to `min`\n * and its body immovable, and it has no left neighbour to merge into.\n *\n * | Gesture | Effect |\n * |---|---|\n * | drag a seam | resize the two bands either side |\n * | drag a band body | move both its seams, preserving its span |\n * | click the ruler | split the band under the pointer |\n * | `x` / `Delete` | merge the selected band into its left neighbour |\n * | click a band | select it |\n * | `←` `→` on a focused seam | move it by one step; `shift` for ten |\n *\n * `scale` defaults to `'log'`, because the interesting part of a width axis\n * is usually its narrow end.\n */\nexport function BandEditor<T>(props: BandEditorProps<T>): ReactElement {\n const {\n value,\n onInput,\n onChange,\n min,\n max,\n scale,\n ticks,\n renderBand,\n selectedIndex,\n onSelect,\n label,\n className,\n } = props;\n const snap = props.snap ?? true;\n const splitBand = props.splitBand ?? keepData;\n\n const trackRef = useRef<HTMLDivElement | null>(null);\n const sessionRef = useRef<PointerSession | null>(null);\n useEffect(() => () => { sessionRef.current?.cancel(); }, []);\n const labelId = useId();\n const bands = normalizeBands(value, min);\n const sc = resolveScale(scale, min);\n const toUnit = (v: number): number => clamp01(sc.toUnit(v, min, max));\n const fromUnit = (u: number): number => sc.fromUnit(clamp01(u), min, max);\n\n const trackWidth = (): number => trackRef.current?.getBoundingClientRect().width ?? 0;\n\n const unitAt = (clientX: number): number => {\n const rect = trackRef.current?.getBoundingClientRect();\n if (!rect || rect.width === 0) return 0;\n return clamp01((clientX - rect.left) / rect.width);\n };\n\n const snapped = (unit: number, altKey: boolean): number => {\n if (!snap || altKey || !ticks || ticks.length === 0) return unit;\n const width = trackWidth();\n if (width === 0) return unit;\n return snapToNearest(unit, ticks.map((tick) => toUnit(tick.at)), SNAP_RADIUS_PX / width);\n };\n\n // No pointer capture: a band body is a `<button>` whose content the consumer\n // renders, and capture would retarget pointerup and kill the click on it.\n // A drag that ends without a release commits nothing.\n const drag = (\n down: ReactPointerEvent<HTMLElement>,\n onMove: (ev: PointerEvent) => void,\n onEnd: () => void,\n ): void => {\n sessionRef.current?.cancel();\n sessionRef.current = openPointerSession(down.currentTarget, down, {\n onMove,\n onEnd: () => { sessionRef.current = null; onEnd(); },\n onCancel: () => { sessionRef.current = null; },\n }, { capture: false });\n };\n\n const onSeamPointerDown = (index: number) => (e: ReactPointerEvent<HTMLDivElement>): void => {\n if (typeof e.button === 'number' && e.button > 0) return;\n e.preventDefault();\n e.stopPropagation();\n const base = bands;\n let latest: Band<T>[] | null = null;\n drag(\n e,\n (ev) => {\n const to = clampSeamTo(base, index, fromUnit(snapped(unitAt(ev.clientX), ev.altKey)), min, max);\n latest = setSeam(base, index, to);\n onInput?.(latest);\n },\n () => {\n if (latest) onChange(latest);\n },\n );\n };\n\n const onSeamKeyDown = (index: number) => (e: ReactKeyboardEvent<HTMLDivElement>): void => {\n const [lo, hi] = seamBounds(bands, index, min, max);\n let target: number;\n if (e.key === 'Home') target = lo;\n else if (e.key === 'End') target = hi;\n else {\n let delta = 0;\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') delta = e.shiftKey ? KEY_STEP * 10 : KEY_STEP;\n else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') delta = e.shiftKey ? -KEY_STEP * 10 : -KEY_STEP;\n else return;\n target = fromUnit(toUnit(bands[index + 1].from) + delta);\n }\n e.preventDefault();\n const next = setSeam(bands, index, clampSeamTo(bands, index, target, min, max));\n if (next !== bands) onChange(next);\n };\n\n const onBandPointerDown = (index: number) => (e: ReactPointerEvent<HTMLButtonElement>): void => {\n if (typeof e.button === 'number' && e.button > 0) return;\n if (index !== selectedIndex) onSelect?.(index);\n // The first and last bands' outer edges are `min` and `max`, which do not\n // move, so their bodies have nothing to translate.\n if (index === 0 || index === bands.length - 1) return;\n const base = bands;\n const edges = unitEdges(base, sc, min, max);\n const startUnit = unitAt(e.clientX);\n let latest: Band<T>[] | null = null;\n drag(\n e,\n (ev) => {\n const shift = clampBandShift(edges, index, unitAt(ev.clientX) - startUnit);\n latest = moveBandEdges(\n base,\n index,\n fromUnit(edges[index] + shift),\n fromUnit(edges[index + 1] + shift),\n );\n onInput?.(latest);\n },\n () => {\n if (latest) onChange(latest);\n },\n );\n };\n\n const onBandFocus = (index: number) => (): void => {\n if (index !== selectedIndex) onSelect?.(index);\n };\n\n const onTrackPointerDown = (e: ReactPointerEvent<HTMLDivElement>): void => {\n if (typeof e.button === 'number' && e.button > 0) return;\n e.preventDefault();\n const next = splitBands(bands, fromUnit(unitAt(e.clientX)), min, max, splitBand);\n if (next !== bands) onChange(next);\n };\n\n const onRootKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>): void => {\n if (e.key !== 'x' && e.key !== 'Delete') return;\n // `x` is a bare letter and Cmd/Ctrl+X is cut: neither may be swallowed\n // when the keystroke belongs to something a consumer put in a band.\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isTextEntry(e.target)) return;\n if (selectedIndex === null || selectedIndex === undefined) return;\n const next = mergeBand(bands, selectedIndex);\n if (next === bands) return;\n e.preventDefault();\n onChange(next);\n onSelect?.(selectedIndex - 1);\n };\n\n return (\n <div\n className={[s.root, className].filter(Boolean).join(' ')}\n role=\"group\"\n aria-label={typeof label === 'string' ? label : undefined}\n aria-labelledby={label !== undefined && typeof label !== 'string' ? labelId : undefined}\n onKeyDown={onRootKeyDown}\n >\n {label !== undefined && <div id={labelId} className={s.label}>{label}</div>}\n <div className={s.ruler} ref={trackRef} data-band-ruler=\"\" onPointerDown={onTrackPointerDown}>\n {ticks?.map((tick, i) => (\n <span\n key={i}\n className={s.tick}\n data-tick-at={tick.at}\n style={{ '--be-at': pct(toUnit(tick.at)) } as CSSProperties}\n >\n {tick.label !== undefined && <span className={s.tickLabel}>{tick.label}</span>}\n </span>\n ))}\n </div>\n <div className={s.bands}>\n {bands.map((band, i) => {\n const [from, to] = bandBounds(bands, i, min, max);\n const isSelected = selectedIndex === i;\n return (\n <Fragment key={i}>\n <button\n type=\"button\"\n className={[s.band, isSelected ? s.selected : null].filter(Boolean).join(' ')}\n style={{ '--be-from': pct(toUnit(from)), '--be-to': pct(toUnit(to)) } as CSSProperties}\n aria-label={`Band ${i + 1}`}\n aria-pressed={isSelected}\n data-band-index={i}\n onPointerDown={onBandPointerDown(i)}\n onFocus={onBandFocus(i)}\n >\n <span className={s.bandContent}>{renderBand?.(band, i)}</span>\n </button>\n {i < bands.length - 1 && (\n <div\n role=\"slider\"\n tabIndex={0}\n className={s.seam}\n style={{ '--be-at': pct(toUnit(bands[i + 1].from)) } as CSSProperties}\n aria-label={`Seam ${i + 1}`}\n aria-orientation=\"horizontal\"\n aria-valuemin={seamBounds(bands, i, min, max)[0]}\n aria-valuemax={seamBounds(bands, i, min, max)[1]}\n aria-valuenow={bands[i + 1].from}\n data-seam-index={i}\n onPointerDown={onSeamPointerDown(i)}\n onKeyDown={onSeamKeyDown(i)}\n />\n )}\n </Fragment>\n );\n })}\n </div>\n </div>\n );\n}\n","import { EASINGS, resolveEasing, type EasingName, type EasingSpec } from '@weasel-js/core';\n\nfunction bezierOf(spec: EasingSpec): readonly [number, number, number, number] | null {\n if (typeof spec === 'object' && spec !== null && 'bezier' in spec) return spec.bezier;\n return null;\n}\n\n/** Control points, for the graph view's draggable handles. `null` means this\n * spec has no handles to drag — the view offers to convert it to a bezier. */\nexport function easingBezier(spec?: EasingSpec): readonly [number, number, number, number] | null {\n if (spec === undefined) return null;\n return bezierOf(spec);\n}\n\n/** What the picker shows for a spec.\n *\n * A function is matched against the built-ins by reference so a consumer that\n * passed `easeOutBack` directly still reads back as `'easeOutBack'`. A wrapped\n * or hand-written function cannot be named and reads as `'custom'` — which is\n * why an editor writes names and control points rather than functions. */\nexport function easingLabel(spec?: EasingSpec): string {\n if (spec === undefined) return 'linear';\n if (typeof spec === 'string') return spec;\n const b = bezierOf(spec);\n if (b) return `cubic-bezier(${b.join(', ')})`;\n for (const [name, fn] of Object.entries(EASINGS)) {\n if (fn === spec) return name;\n }\n return 'custom';\n}\n\n/** `count` evenly spaced samples of the curve over 0..1, for drawing it. */\nexport function sampleEasing(spec: EasingSpec | undefined, count: number): number[] {\n const fn = resolveEasing(spec);\n const out = new Array<number>(count);\n const last = count - 1;\n for (let i = 0; i < count; i++) out[i] = fn(last === 0 ? 0 : i / last);\n return out;\n}\n\n/** Every built-in name, for the picker's list. */\nexport const EASING_NAMES = Object.keys(EASINGS) as EasingName[];\n","import type { ReactElement } from 'react';\nimport type { EasingSpec } from '@weasel-js/core';\nimport s from './Timeline.module.css';\nimport { EASING_NAMES, easingBezier, easingLabel, sampleEasing } from './easingSpec';\n\n/** Samples drawn in the inline curve preview. */\nconst PREVIEW_SAMPLES = 24;\n\n/** Control points for the named curves the picker can convert. A name the table\n * does not cover converts to the CSS default rather than refusing. */\nconst BEZIER_OF: Partial<Record<string, readonly [number, number, number, number]>> = {\n linear: [0, 0, 1, 1],\n easeInQuad: [0.11, 0, 0.5, 0],\n easeOutQuad: [0.5, 1, 0.89, 1],\n easeInOutQuad: [0.45, 0, 0.55, 1],\n easeInCubic: [0.32, 0, 0.67, 0],\n easeOutCubic: [0.33, 1, 0.68, 1],\n easeInOutCubic: [0.65, 0, 0.35, 1],\n easeInSine: [0.12, 0, 0.39, 0],\n easeOutSine: [0.61, 1, 0.88, 1],\n easeInOutSine: [0.37, 0, 0.63, 1],\n};\n\nconst DEFAULT_BEZIER: readonly [number, number, number, number] = [0.25, 0.1, 0.25, 1];\n\nexport interface EasingPickerProps {\n value: EasingSpec | undefined;\n onChange: (next: EasingSpec | undefined) => void;\n}\n\nexport function EasingPicker(props: EasingPickerProps): ReactElement {\n const { value, onChange } = props;\n const bezier = easingBezier(value);\n const label = easingLabel(value);\n const named = bezier === null && (EASING_NAMES as string[]).includes(label);\n const selectValue = bezier !== null ? 'custom' : named ? label : 'linear';\n\n const points = sampleEasing(value, PREVIEW_SAMPLES)\n .map((v, i) => `${(i / (PREVIEW_SAMPLES - 1)) * 100},${100 - v * 100}`)\n .join(' ');\n\n return (\n <div className={s.easingPicker}>\n <label>\n Easing\n <select\n value={selectValue}\n onChange={(e) => onChange(e.target.value === 'linear' ? undefined : e.target.value as EasingSpec)}\n >\n <option value=\"linear\">linear</option>\n {EASING_NAMES.filter((n) => n !== 'linear').map((n) => <option key={n} value={n}>{n}</option>)}\n {bezier !== null ? <option value=\"custom\">custom</option> : null}\n </select>\n </label>\n\n {bezier !== null ? <span className={s.easingLabel}>{label}</span> : (\n <button\n type=\"button\"\n className={s.transportButton}\n onClick={() => onChange({ bezier: BEZIER_OF[selectValue] ?? DEFAULT_BEZIER })}\n >\n Convert to bezier\n </button>\n )}\n\n <svg className={s.easingPreview} data-testid=\"easing-preview\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\">\n <polyline points={points} vectorEffect=\"non-scaling-stroke\" />\n </svg>\n </div>\n );\n}\n","import { niceStep } from '../Plot2D/ticks';\n\n/** A visible span of timeline time, in ms. */\nexport interface TimeWindow {\n from: number;\n to: number;\n}\n\nexport interface TimeScale {\n window: TimeWindow;\n widthPx: number;\n toPx(ms: number): number;\n toMs(px: number): number;\n}\n\n/** Narrowest window the user can zoom to, in ms. Below this the playhead and\n * the keys it sits between stop being separable at any sane track width. */\nconst MIN_SPAN_MS = 1;\n\nexport function createTimeScale(window: TimeWindow, widthPx: number): TimeScale {\n const span = window.to - window.from;\n const perMs = span === 0 ? 0 : widthPx / span;\n const perPx = widthPx === 0 ? 0 : span / widthPx;\n return {\n window,\n widthPx,\n toPx: (ms) => (ms - window.from) * perMs,\n toMs: (px) => window.from + px * perPx,\n };\n}\n\n/** Where `ms` sits in the window, as a fraction. The width-free half of\n * `createTimeScale` — a CSS `left: %` needs no pixel width, and asking for one\n * is what drove three copies of this arithmetic into the lane and the ruler. */\nexport function toFraction(window: TimeWindow, ms: number): number {\n const span = window.to - window.from;\n return span === 0 ? 0 : (ms - window.from) / span;\n}\n\n/** `toFraction` as a CSS percentage. */\nexport function toPercent(window: TimeWindow, ms: number): string {\n return `${toFraction(window, ms) * 100}%`;\n}\n\n/** A duration as a fraction of the window. Distinct from `toFraction`, which\n * measures a position and so subtracts `window.from`. */\nexport function spanFraction(window: TimeWindow, ms: number): number {\n const span = window.to - window.from;\n return span === 0 ? 0 : ms / span;\n}\n\n/** A duration as a CSS percentage, for a width. */\nexport function spanPercent(window: TimeWindow, ms: number): string {\n return `${spanFraction(window, ms) * 100}%`;\n}\n\nfunction clampWindow(w: TimeWindow, bounds: TimeWindow): TimeWindow {\n const span = Math.min(w.to - w.from, bounds.to - bounds.from);\n let from = w.from;\n if (from < bounds.from) from = bounds.from;\n if (from + span > bounds.to) from = bounds.to - span;\n return { from, to: from + span };\n}\n\n/** Scale the window by `factor` about `atMs`, which stays at the same fraction\n * of the track. `factor < 1` zooms in. */\nexport function zoomWindow(\n w: TimeWindow, atMs: number, factor: number, bounds: TimeWindow,\n): TimeWindow {\n const span = w.to - w.from;\n const maxSpan = bounds.to - bounds.from;\n const nextSpan = Math.min(maxSpan, Math.max(MIN_SPAN_MS, span * factor));\n const frac = span === 0 ? 0.5 : (atMs - w.from) / span;\n return clampWindow({ from: atMs - frac * nextSpan, to: atMs + (1 - frac) * nextSpan }, bounds);\n}\n\n/** Shift the window by `byMs`, preserving its span. */\nexport function panWindow(w: TimeWindow, byMs: number, bounds: TimeWindow): TimeWindow {\n return clampWindow({ from: w.from + byMs, to: w.to + byMs }, bounds);\n}\n\n/** Minimum gap between time ticks, in px — the ruler's and the graph grid's. */\nexport const TICK_SPACING_PX = 64;\n\n/** Ruler tick times inside `w`, spaced at least `minSpacingPx` apart. */\nexport function tickTimes(w: TimeWindow, widthPx: number, minSpacingPx: number): number[] {\n const span = w.to - w.from;\n if (widthPx <= 0 || span <= 0) return [];\n const step = niceStep((minSpacingPx / widthPx) * span);\n const out: number[] = [];\n for (let t = Math.ceil(w.from / step) * step; t <= w.to + 1e-9; t += step) {\n out.push(Math.round(t / step) * step);\n }\n return out;\n}\n","import { useLayoutEffect, useMemo, useRef, useState, type ReactElement } from 'react';\nimport type { Keyframe } from '@weasel-js/core';\nimport { LayeredCurveEditor } from '../CurveEditor/LayeredCurveEditor';\nimport {\n applyKeyframeDrag, createKeyframeLayer, type KeyframeLayerState,\n} from '../CurveEditor/createKeyframeLayer';\nimport s from './Timeline.module.css';\nimport { TICK_SPACING_PX, tickTimes, type TimeWindow } from './timeScale';\n\n/** Keeps the extreme keys inside the lane: at the very edge a key centers on\n * the lane's border and hangs half into its neighbor. As a percentage of\n * the lane's height, applied top and bottom. */\nconst V_INSET_PCT = 8;\n\n/** One arrow-key step, in ms; shift multiplies by ten. */\nconst KEY_STEP_MS = 10;\n\nexport interface LaneGraphProps {\n keys: readonly Keyframe<number>[];\n label: string;\n window: TimeWindow;\n /** Ruler time of this track's zero. */\n offset: number;\n /** Ruler times a dragged key snaps to. */\n snapTimes: readonly number[];\n selection: number | null;\n selectedSegment: number | null;\n onSelect: (keyIndex: number) => void;\n onSelectSegment?: (keyIndex: number) => void;\n /** Live during a key drag. */\n onKeysInput?: (keys: readonly Keyframe<number>[]) => void;\n /** Once per edit: a drag's end, a handle's release, a key press. */\n onKeysCommit: (keys: readonly Keyframe<number>[]) => void;\n}\n\n/** The value range a lane plots: its keys' extent, padded so no key sits on\n * the border. A flat track gets a unit span so it still has a middle. */\nfunction valueRange(keys: readonly Keyframe<number>[]): [number, number] {\n const values = keys.map((k) => k.value);\n const lo = Math.min(...values);\n const hi = Math.max(...values);\n const span = hi - lo || 1;\n const pad = (span * V_INSET_PCT) / (100 - 2 * V_INSET_PCT);\n return [lo - pad, lo + span + pad];\n}\n\n/** A numeric lane's graph: one keyframe layer on a curve editor, sized to the\n * lane and windowed to the ruler. */\nexport function LaneGraph(props: LaneGraphProps): ReactElement {\n const {\n keys, label, window: win, offset, snapTimes, selection, selectedSegment,\n onSelect, onSelectSegment, onKeysInput, onKeysCommit,\n } = props;\n\n const hostRef = useRef<HTMLDivElement | null>(null);\n const [size, setSize] = useState({ width: 0, height: 0 });\n useLayoutEffect(() => {\n const el = hostRef.current;\n if (!el) return;\n const update = (): void => {\n const r = el.getBoundingClientRect();\n setSize((prev) => (prev.width === r.width && prev.height === r.height ? prev : { width: r.width, height: r.height }));\n };\n update();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const layer = useMemo(() => createKeyframeLayer({\n id: 'keys',\n label,\n formatX: (t) => `${Math.round(t)} ms`,\n // The layer works in track time; the snap candidates are ruler times.\n snapX: snapTimes.map((t) => t - offset),\n xClamp: [0, Infinity],\n step: { x: KEY_STEP_MS },\n }), [label, snapTimes, offset]);\n\n const committed = useMemo<KeyframeLayerState>(\n () => ({ keys, selectedKey: selection, selectedSegment, drag: null }),\n [keys, selection, selectedSegment],\n );\n // Held only while a gesture is in flight, so a consumer echoing live input\n // back through `keys` cannot move the keys out from under the drag.\n const [live, setLive] = useState<KeyframeLayerState | null>(null);\n const state = live ?? committed;\n const stateRef = useRef(state);\n stateRef.current = state;\n\n const layers = useMemo(() => [{ layer, state: state as unknown }], [layer, state]);\n\n const onLayerChange = (_id: string, raw: unknown): void => {\n const next = raw as KeyframeLayerState;\n const prev = stateRef.current;\n if (next.selectedKey !== null && next.selectedKey !== prev.selectedKey) onSelect(next.selectedKey);\n if (next.selectedSegment !== null && next.selectedSegment !== prev.selectedSegment) onSelectSegment?.(next.selectedSegment);\n if (!next.drag) { setLive(null); return; }\n setLive(next);\n // A handle drag writes a fresh easing spec per move; publishing those\n // would grow the consumer's easing cache by one entry per pixel.\n if (next.drag.kind !== 'key') return;\n const applied = applyKeyframeDrag(next).keys;\n if (applied !== next.keys) onKeysInput?.(applied);\n };\n\n const onLayerCommit = (_id: string, raw: unknown, rawPrev: unknown): void => {\n setLive(null);\n const next = raw as KeyframeLayerState;\n if (next.keys !== (rawPrev as KeyframeLayerState).keys) onKeysCommit(next.keys);\n };\n\n const [yLo, yHi] = valueRange(state.keys);\n const ticks = size.width > 0 ? tickTimes(win, size.width, TICK_SPACING_PX) : [];\n\n return (\n <div ref={hostRef} className={s.graphHost}>\n {size.width > 0 && size.height > 0 ? (\n <LayeredCurveEditor\n className={s.graph}\n aria-label={`${label} graph`}\n layers={layers}\n onLayerChange={onLayerChange}\n onLayerCommit={onLayerCommit}\n width={size.width}\n height={size.height}\n xRange={[win.from - offset, win.to - offset]}\n yRange={[yLo, yHi]}\n grid={false}\n axes={false}\n // The ruler's ticks, carried into track time.\n xTicks={{ values: ticks.map((t) => t - offset), labels: false }}\n // Clears a key at the track's start edge, which hangs into the gutter.\n yTicks={{ labels: 'outside', gap: 10 }}\n history={false}\n />\n ) : null}\n </div>\n );\n}\n","import { useEffect, useRef, useState, type KeyboardEvent as ReactKeyboardEvent, type PointerEvent as ReactPointerEvent, type ReactElement } from 'react';\nimport { openPointerSession, type EventTrack, type Keyframe, type PointerSession, type SampledTrack, type TimelineTrack } from '@weasel-js/core';\nimport { ChevronIcon } from '../../icons';\nimport s from './Timeline.module.css';\nimport { createTimeScale, spanPercent, toPercent, type TimeWindow } from './timeScale';\nimport { SNAP_RADIUS_PX, snapToNearest } from '../../snap';\nimport { LaneGraph } from './LaneGraph';\nimport type { LaneRow } from './lanes';\n\n/** One arrow-key step, in ms; shift multiplies by ten. */\nconst KEY_STEP_MS = 10;\n\nexport interface LaneProps {\n row: LaneRow;\n window: TimeWindow;\n mode: 'dope' | 'graph';\n /** Index of the selected key on THIS row, or null. */\n selection: number | null;\n onSelect: (keyIndex: number) => void;\n /** Live during a dope-sheet drag. */\n onKeyInput: (keyIndex: number, toMs: number) => void;\n /** Once, at the end of a dope-sheet gesture. */\n onKeyCommit: (keyIndex: number, toMs: number) => void;\n /** Live during a graph-mode key drag: the row's whole key list. */\n onKeysInput?: (keys: readonly Keyframe<number>[]) => void;\n /** Once per graph-mode edit: the row's whole key list. */\n onKeysCommit?: (keys: readonly Keyframe<number>[]) => void;\n onInsert: (atMs: number) => void;\n onToggleExpand: () => void;\n expanded: boolean;\n /** Times a dragged key snaps to. */\n snapTimes: readonly number[];\n /** Index of the key a selected segment runs INTO, or null. */\n selectedSegment?: number | null;\n onSelectSegment?: (keyIndex: number) => void;\n}\n\nfunction entryTimes(row: LaneRow): number[] {\n if (row.kind === 'sampled') return (row.track as SampledTrack<unknown>).keys.map((k) => k.t);\n if (row.kind === 'event') return (row.track as EventTrack).events.map((e) => e.t);\n return [];\n}\n\nexport function Lane(props: LaneProps): ReactElement {\n const {\n row, window: win, mode, selection, onSelect, onKeyInput, onKeyCommit, onInsert, onToggleExpand, expanded, snapTimes,\n selectedSegment = null, onSelectSegment, onKeysInput, onKeysCommit,\n } = props;\n const trackRef = useRef<HTMLDivElement | null>(null);\n const sessionRef = useRef<PointerSession | null>(null);\n useEffect(() => () => { sessionRef.current?.cancel(); }, []);\n\n // Where the dragged key would land. Owned here rather than derived from the\n // tracks prop, so a drag previews whether or not the consumer wires\n // `onKeyInput` — the committed key stays put underneath as the origin.\n const [drag, setDrag] = useState<{ keyIndex: number; t: number } | null>(null);\n\n const pct = (ms: number): string => toPercent(win, ms + row.offset);\n\n const msAt = (clientX: number): number => {\n const rect = trackRef.current?.getBoundingClientRect();\n if (!rect) return win.from;\n return createTimeScale(win, rect.width).toMs(clientX - rect.left) - row.offset;\n };\n\n const snapPxToMs = (): number => {\n const width = trackRef.current?.getBoundingClientRect().width ?? 0;\n const scale = createTimeScale(win, width);\n return scale.toMs(SNAP_RADIUS_PX) - scale.toMs(0);\n };\n\n // Only a numeric sampled row has an honest value axis to graph.\n const graph = mode === 'graph' && row.numeric;\n const sampledKeys = row.kind === 'sampled' ? (row.track as SampledTrack<number>).keys : [];\n\n const onKeyPointerDown = (i: number) => (e: ReactPointerEvent<HTMLDivElement>): void => {\n if (e.button !== 0) return;\n e.stopPropagation();\n onSelect(i);\n\n // `snapTimes` are ruler times and `msAt` is track-local, so a nested row\n // has to cross into ruler space to snap and back out to commit.\n const at = (ev: { clientX: number; altKey: boolean }): number => {\n const raw = Math.max(0, msAt(ev.clientX));\n return ev.altKey ? raw : snapToNearest(raw + row.offset, snapTimes, snapPxToMs()) - row.offset;\n };\n\n setDrag({ keyIndex: i, t: times[i] });\n\n const end = (): void => {\n setDrag(null);\n sessionRef.current = null;\n };\n // No pointer capture — see `Ruler`, same idiom across the timeline.\n sessionRef.current?.cancel();\n sessionRef.current = openPointerSession(e.currentTarget, e, {\n onMove: (ev) => {\n setDrag({ keyIndex: i, t: at(ev) });\n onKeyInput(i, at(ev));\n },\n onEnd: (ev) => {\n onKeyCommit(i, at(ev));\n end();\n },\n onCancel: end,\n }, { capture: false });\n };\n\n const onKeyDown = (i: number, t: number) => (e: ReactKeyboardEvent<HTMLDivElement>): void => {\n const step = KEY_STEP_MS * (e.shiftKey ? 10 : 1);\n if (e.key === 'ArrowRight') { e.preventDefault(); onKeyCommit(i, t + step); }\n if (e.key === 'ArrowLeft') { e.preventDefault(); onKeyCommit(i, Math.max(0, t - step)); }\n };\n\n const times = entryTimes(row);\n\n return (\n <div className={s.lane} data-depth={row.depth} data-mode={mode} data-graph={graph ? 'true' : undefined}>\n <div className={s.laneLabel}>\n {row.kind === 'timeline' ? (\n <span\n role=\"button\"\n tabIndex={0}\n aria-expanded={expanded}\n data-testid=\"timeline-disclosure\"\n className={s.disclosure}\n onClick={onToggleExpand}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onToggleExpand(); } }}\n >\n <ChevronIcon\n size={14}\n className={[s.disclosureIcon, !expanded && s.disclosureCollapsed].filter(Boolean).join(' ')}\n />\n </span>\n ) : null}\n {row.label}\n </div>\n <div\n className={s.laneTrack}\n ref={trackRef}\n data-testid=\"timeline-lane-track\"\n onDoubleClick={(e) => { if (row.kind === 'sampled') onInsert(Math.max(0, msAt(e.clientX))); }}\n >\n {graph ? (\n <LaneGraph\n keys={sampledKeys}\n label={row.label}\n window={win}\n offset={row.offset}\n snapTimes={snapTimes}\n selection={selection}\n selectedSegment={selectedSegment}\n onSelect={onSelect}\n onSelectSegment={onSelectSegment}\n onKeysInput={onKeysInput}\n onKeysCommit={(keys) => onKeysCommit?.(keys)}\n />\n ) : (\n <>\n {row.kind === 'timeline' ? (\n <div\n className={s.nestedBar}\n data-testid=\"timeline-nested\"\n style={{ left: pct(0), width: spanPercent(win, (row.track as TimelineTrack).timeline.duration ?? 0) }}\n />\n ) : null}\n {row.kind === 'sampled' ? sampledKeys.slice(1).map((k, idx) => {\n const i = idx + 1;\n return (\n <div\n key={`seg-${i}`}\n role=\"button\"\n tabIndex={0}\n aria-label={`${row.label} segment into ${Math.round(k.t)} ms`}\n aria-current={selectedSegment === i ? 'true' : undefined}\n data-testid=\"timeline-segment\"\n className={s.segment}\n style={{ left: pct(sampledKeys[i - 1].t), width: spanPercent(win, k.t - sampledKeys[i - 1].t) }}\n onClick={() => onSelectSegment?.(i)}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onSelectSegment?.(i); } }}\n />\n );\n }) : null}\n {times.map((t, i) => (\n <div\n key={i}\n role=\"button\"\n tabIndex={0}\n aria-label={`${row.label} key at ${Math.round(t)} ms`}\n aria-current={selection === i ? 'true' : undefined}\n data-testid={row.kind === 'event' ? 'timeline-event' : 'timeline-key'}\n data-dragging={drag?.keyIndex === i ? 'true' : undefined}\n className={row.kind === 'event' ? s.eventMark : s.key}\n style={{ left: pct(t) }}\n onPointerDown={onKeyPointerDown(i)}\n onKeyDown={onKeyDown(i, t)}\n />\n ))}\n {drag ? (\n <div\n aria-hidden=\"true\"\n data-testid=\"timeline-key-ghost\"\n className={row.kind === 'event' ? s.eventGhost : s.keyGhost}\n style={{ left: pct(drag.t) }}\n />\n ) : null}\n </>\n )}\n </div>\n </div>\n );\n}\n","import { useEffect, useLayoutEffect, useRef, useState, type PointerEvent as ReactPointerEvent, type ReactElement, type WheelEvent as ReactWheelEvent } from 'react';\nimport { openPointerSession, type PointerSession } from '@weasel-js/core';\nimport s from './Timeline.module.css';\nimport { createTimeScale, panWindow, TICK_SPACING_PX, tickTimes, toPercent, zoomWindow, type TimeWindow } from './timeScale';\n\n/** One wheel notch's zoom factor. */\nconst ZOOM_STEP = 0.0015;\n\nexport interface RulerProps {\n window: TimeWindow;\n /** The full extent the window may cover — normally `{ from: 0, to: duration }`. */\n bounds: TimeWindow;\n playhead: number;\n onScrub: (t: number) => void;\n onWindowChange: (w: TimeWindow) => void;\n}\n\nfunction formatMs(ms: number): string {\n if (ms >= 1000) return `${(ms / 1000).toFixed(ms % 1000 === 0 ? 0 : 2)}s`;\n return `${Math.round(ms)}ms`;\n}\n\nexport function Ruler(props: RulerProps): ReactElement {\n const { window: win, bounds, playhead, onScrub, onWindowChange } = props;\n const trackRef = useRef<HTMLDivElement | null>(null);\n const sessionRef = useRef<PointerSession | null>(null);\n useEffect(() => () => { sessionRef.current?.cancel(); }, []);\n\n // Re-render once the track is mounted so ticks lay out against its real\n // width — `trackRef.current` is null on the render that first attaches it.\n const [width, setWidth] = useState(0);\n useLayoutEffect(() => {\n const el = trackRef.current;\n if (!el) return;\n const update = (): void => setWidth(el.getBoundingClientRect().width);\n update();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const widthOf = (): number => trackRef.current?.getBoundingClientRect().width ?? 0;\n const msAt = (clientX: number): number => {\n const rect = trackRef.current?.getBoundingClientRect();\n if (!rect) return win.from;\n const scale = createTimeScale(win, rect.width);\n const raw = scale.toMs(clientX - rect.left);\n return Math.min(win.to, Math.max(win.from, raw));\n };\n\n // `capture: false`: the session tracks the pointer off the ruler on its own,\n // and capture would retarget pointerup and kill the click on non-native\n // children of the scrubbed track.\n const onPointerDown = (e: ReactPointerEvent<HTMLDivElement>): void => {\n if (e.button !== 0) return;\n onScrub(msAt(e.clientX));\n\n sessionRef.current?.cancel();\n const end = (): void => { sessionRef.current = null; };\n sessionRef.current = openPointerSession(e.currentTarget, e, {\n onMove: (ev) => { onScrub(msAt(ev.clientX)); },\n onEnd: end,\n onCancel: end,\n }, { capture: false });\n };\n\n const onWheel = (e: ReactWheelEvent<HTMLDivElement>): void => {\n if (e.ctrlKey) {\n onWindowChange(zoomWindow(win, msAt(e.clientX), Math.exp(e.deltaY * ZOOM_STEP), bounds));\n } else {\n const width = widthOf();\n const perPx = width === 0 ? 0 : (win.to - win.from) / width;\n onWindowChange(panWindow(win, e.deltaY * perPx, bounds));\n }\n };\n\n const ticks = tickTimes(win, width, TICK_SPACING_PX);\n const pct = (ms: number): string => toPercent(win, ms);\n\n return (\n <div\n className={s.ruler}\n ref={trackRef}\n data-testid=\"timeline-ruler\"\n onPointerDown={onPointerDown}\n onWheel={onWheel}\n >\n {ticks.map((t) => (\n <span\n key={t}\n className={s.tick}\n data-testid=\"timeline-tick\"\n style={{ left: pct(t) }}\n >\n {formatMs(t)}\n </span>\n ))}\n <div\n className={s.playhead}\n data-testid=\"timeline-playhead\"\n style={{ left: pct(playhead) }}\n />\n </div>\n );\n}\n","import type { ReactElement } from 'react';\nimport { DetentSlider } from '../DetentSlider';\nimport { PauseIcon, PlayIcon } from '../../icons';\nimport s from './Timeline.module.css';\n\n/** Playback rates the transport offers. */\nconst RATES = [0.25, 0.5, 1, 2, 4] as const;\n\nexport interface TransportProps {\n paused: boolean;\n loop: boolean | number;\n rate: number;\n playhead: number;\n duration: number;\n onPlay: () => void;\n onPause: () => void;\n onLoopChange: (loop: boolean | number) => void;\n onRateChange: (rate: number) => void;\n}\n\nconst seconds = (ms: number): string => `${(ms / 1000).toFixed(2)}s`;\n\nexport function Transport(props: TransportProps): ReactElement {\n const { paused, loop, rate, playhead, duration, onPlay, onPause, onLoopChange, onRateChange } = props;\n const looping = loop !== false && loop !== 0;\n // The handle's scale is whatever anything holding it set, so an off-list rate\n // gets its own detent — `DetentSlider` would otherwise round it to the\n // nearest and label the thumb with a rate the timeline is not running at.\n const rates = RATES.includes(rate as typeof RATES[number])\n ? (RATES as readonly number[])\n : [...RATES, rate].sort((a, b) => a - b);\n\n return (\n <div className={s.transport}>\n <button\n type=\"button\"\n className={s.transportButton}\n aria-label={paused ? 'Play' : 'Pause'}\n onClick={paused ? onPlay : onPause}\n >\n {paused ? <PlayIcon size={14} /> : <PauseIcon size={14} />}\n </button>\n\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={looping}\n aria-label=\"Loop\"\n className={s.transportButton}\n onClick={() => onLoopChange(!looping)}\n >\n ⟲\n </button>\n\n <div className={s.rate}>\n Rate\n <DetentSlider\n ariaLabel=\"Rate\"\n items={rates}\n value={rate}\n onChange={onRateChange}\n formatLabel={(r) => `${r}x`}\n labels=\"none\"\n className={s.rateSlider}\n />\n <span className={s.rateReadout}>{rate}x</span>\n </div>\n\n <span className={s.time} data-testid=\"timeline-time\">\n {seconds(playhead)} / {seconds(duration)}\n </span>\n </div>\n );\n}\n","import type { SampledTrack, Track } from '@weasel-js/core';\n\nexport interface LaneRow {\n /** Stable across re-renders and edits: the dotted index path. */\n key: string;\n /** Index path into the track tree, outermost first. */\n path: number[];\n track: Track;\n label: string;\n /** Nesting depth; 0 for a top-level track. */\n depth: number;\n /** Accumulated `at` from every nested parent, in ms. A key drawn on this row\n * sits at `offset + key.t` on the ruler. */\n offset: number;\n kind: Track['kind'];\n /** True only for a sampled track whose every key value is a number — the\n * sole case where a value axis has an honest meaning. */\n numeric: boolean;\n}\n\nfunction isNumeric(track: Track): boolean {\n if (track.kind !== 'sampled') return false;\n const keys = (track as SampledTrack<unknown>).keys;\n return keys.length > 0 && keys.every((k) => typeof k.value === 'number');\n}\n\n/** Flatten the track tree to rows, descending only into expanded nested\n * timelines. `expanded` holds the `key` of each open nested row. */\nexport function buildLanes(\n tracks: readonly Track[],\n expanded: ReadonlySet<string>,\n): LaneRow[] {\n const out: LaneRow[] = [];\n const walk = (list: readonly Track[], path: number[], depth: number, offset: number): void => {\n list.forEach((track, i) => {\n const nextPath = [...path, i];\n const key = nextPath.join('.');\n out.push({\n key,\n path: nextPath,\n track,\n label: track.label ?? `${track.kind} ${i}`,\n depth,\n offset,\n kind: track.kind,\n numeric: isNumeric(track),\n });\n if (track.kind === 'timeline' && expanded.has(key)) {\n walk(track.timeline.tracks, nextPath, depth + 1, offset + track.at);\n }\n });\n };\n walk(tracks, [], 0, 0);\n return out;\n}\n\n/** The track at an index path, or `undefined` when the path leaves the tree. */\nexport function trackAtPath(tracks: readonly Track[], path: readonly number[]): Track | undefined {\n let list: readonly Track[] = tracks;\n let found: Track | undefined;\n for (const i of path) {\n found = list[i];\n if (!found) return undefined;\n list = found.kind === 'timeline' ? found.timeline.tracks : [];\n }\n return found;\n}\n","import { sampleTrack, type EasingSpec, type EventTrack, type Keyframe, type SampledTrack, type TimelineTrack, type Track } from '@weasel-js/core';\nimport { trackAtPath } from './lanes';\n\nexport interface KeySelection {\n /** Index path into the track tree, outermost first — a `LaneRow.path`. A\n * top-level track is `[i]`; a track inside the nested timeline at `i` is\n * `[i, j]`. */\n trackPath: readonly number[];\n keyIndex: number;\n}\n\nexport interface KeyEdit {\n tracks: Track[];\n selection: KeySelection | null;\n}\n\n/** True when two index paths address the same track. */\nexport function samePath(a: readonly number[], b: readonly number[]): boolean {\n return a.length === b.length && a.every((n, i) => n === b[i]);\n}\n\n/** Shallow-clone one track, replacing only its key list. `onTick`, `fire`,\n * `interpolate` and `interpolator` survive as references, which is what lets a\n * running timeline take an edited track without rewiring. */\nfunction withKeys(track: Track, keys: Keyframe<unknown>[]): Track {\n return { ...(track as SampledTrack<unknown>), keys } as Track;\n}\n\nfunction withEvents(track: Track, events: EventTrack['events']): Track {\n return { ...(track as EventTrack), events } as Track;\n}\n\n/** Replace the track at `path`, cloning the timeline tracks along the way so\n * the caller's tree is untouched at every level, not just the top. */\nfunction replaceAtPath(tracks: readonly Track[], path: readonly number[], next: Track): Track[] {\n const out = tracks.slice();\n const [i, ...rest] = path;\n if (rest.length === 0) {\n out[i] = next;\n return out;\n }\n const parent = out[i];\n if (parent?.kind !== 'timeline') return out;\n const tt = parent as TimelineTrack;\n out[i] = {\n ...tt,\n timeline: { ...tt.timeline, tracks: replaceAtPath(tt.timeline.tracks, rest, next) },\n };\n return out;\n}\n\n/** Move a key or an event crossing to `toMs`, clamped at zero. `toMs` is in the\n * addressed track's own time, not the ruler's — a nested track's keys are\n * measured from its parent's `at`.\n *\n * Re-sorts, and reports the moved entry's new index. `sampleTrack` binary-\n * searches without sorting first, so a drag past a neighbour that left the list\n * unsorted would sample the wrong segment and raise nothing. */\nexport function moveKey(\n tracks: readonly Track[], sel: KeySelection, toMs: number,\n): KeyEdit {\n const track = trackAtPath(tracks, sel.trackPath);\n const t = Math.max(0, toMs);\n\n if (track?.kind === 'sampled') {\n const st = track as SampledTrack<unknown>;\n const moved = { ...st.keys[sel.keyIndex], t };\n const keys = st.keys.filter((_, i) => i !== sel.keyIndex);\n const at = keys.findIndex((k) => k.t > t);\n const keyIndex = at === -1 ? keys.length : at;\n keys.splice(keyIndex, 0, moved);\n return {\n tracks: replaceAtPath(tracks, sel.trackPath, withKeys(track, keys)),\n selection: { trackPath: sel.trackPath, keyIndex },\n };\n }\n\n if (track?.kind === 'event') {\n const et = track as EventTrack;\n const moved = { ...et.events[sel.keyIndex], t };\n const events = et.events.filter((_, i) => i !== sel.keyIndex);\n const at = events.findIndex((e) => e.t > t);\n const keyIndex = at === -1 ? events.length : at;\n events.splice(keyIndex, 0, moved);\n return {\n tracks: replaceAtPath(tracks, sel.trackPath, withEvents(track, events)),\n selection: { trackPath: sel.trackPath, keyIndex },\n };\n }\n\n return { tracks: tracks.slice(), selection: sel };\n}\n\n/** Insert a key at `atMs`, seeded with whatever the track already reads there\n * so inserting alone never changes the motion. */\nexport function insertKey(\n tracks: readonly Track[], trackPath: readonly number[], atMs: number,\n): KeyEdit {\n const track = trackAtPath(tracks, trackPath);\n if (track?.kind !== 'sampled') return { tracks: tracks.slice(), selection: null };\n\n const st = track as SampledTrack<unknown>;\n const t = Math.max(0, atMs);\n const value = st.keys.length === 0 ? 0 : sampleTrack(st, t);\n const keys = st.keys.slice();\n const at = keys.findIndex((k) => k.t > t);\n const keyIndex = at === -1 ? keys.length : at;\n keys.splice(keyIndex, 0, { t, value });\n return {\n tracks: replaceAtPath(tracks, trackPath, withKeys(track, keys)),\n selection: { trackPath, keyIndex },\n };\n}\n\n/** Remove a key, selecting the one before it. */\nexport function deleteKey(tracks: readonly Track[], sel: KeySelection): KeyEdit {\n const track = trackAtPath(tracks, sel.trackPath);\n if (track?.kind !== 'sampled') return { tracks: tracks.slice(), selection: sel };\n\n const st = track as SampledTrack<unknown>;\n const keys = st.keys.filter((_, i) => i !== sel.keyIndex);\n return {\n tracks: replaceAtPath(tracks, sel.trackPath, withKeys(track, keys)),\n selection: keys.length === 0\n ? null\n : { trackPath: sel.trackPath, keyIndex: Math.max(0, sel.keyIndex - 1) },\n };\n}\n\n/** Set the easing shaping the approach INTO the selected key. */\nexport function setKeyEasing(\n tracks: readonly Track[], sel: KeySelection, easing: EasingSpec | undefined,\n): Track[] {\n const track = trackAtPath(tracks, sel.trackPath);\n if (track?.kind !== 'sampled') return tracks.slice();\n\n const st = track as SampledTrack<unknown>;\n const keys = st.keys.slice();\n const { easing: _drop, ...rest } = keys[sel.keyIndex];\n keys[sel.keyIndex] = easing === undefined ? rest : { ...rest, easing };\n return replaceAtPath(tracks, sel.trackPath, withKeys(track, keys));\n}\n\n/** Replace a sampled track's whole key list, keeping its callbacks. */\nexport function setKeys(\n tracks: readonly Track[], trackPath: readonly number[], keys: readonly Keyframe<unknown>[],\n): Track[] {\n const track = trackAtPath(tracks, trackPath);\n if (track?.kind !== 'sampled') return tracks.slice();\n return replaceAtPath(tracks, trackPath, withKeys(track, keys.slice()));\n}\n\n/** Set the selected key's value, leaving its time alone. */\nexport function setKeyValue(\n tracks: readonly Track[], sel: KeySelection, value: unknown,\n): Track[] {\n const track = trackAtPath(tracks, sel.trackPath);\n if (track?.kind !== 'sampled') return tracks.slice();\n\n const st = track as SampledTrack<unknown>;\n const keys = st.keys.slice();\n keys[sel.keyIndex] = { ...keys[sel.keyIndex], value };\n return replaceAtPath(tracks, sel.trackPath, withKeys(track, keys));\n}\n\nexport { snapToNearest as snapTime } from '../../snap';\n","import { useMemo, useState, type KeyboardEvent as ReactKeyboardEvent, type ReactElement, type ReactNode } from 'react';\nimport type { EasingSpec, Keyframe, SampledTrack, Track } from '@weasel-js/core';\nimport s from './Timeline.module.css';\nimport { EasingPicker } from './EasingPicker';\nimport { Lane } from './Lane';\nimport { Ruler } from './Ruler';\nimport { Transport, type TransportProps } from './Transport';\nimport { buildLanes, trackAtPath } from './lanes';\nimport { deleteKey, insertKey, moveKey, samePath, setKeyEasing, setKeys, setKeyValue, type KeySelection } from './keys';\nimport type { TimeWindow } from './timeScale';\n\nexport type { KeySelection } from './keys';\nexport type { TimeWindow } from './timeScale';\n\nexport interface KeyEditorCtx<T = unknown> {\n key: Keyframe<T>;\n track: SampledTrack<T>;\n selection: KeySelection;\n /** Replace the selected key; routed through this component's `onChange`. */\n commit: (next: Keyframe<T>) => void;\n /** Set the easing shaping the approach into this key. */\n setEasing: (easing: EasingSpec | undefined) => void;\n}\n\nexport interface TimelineProps {\n tracks: readonly Track[];\n duration: number;\n playhead: number;\n\n mode?: 'dope' | 'graph';\n onModeChange?: (mode: 'dope' | 'graph') => void;\n\n /** Live during a drag — wire for preview, do not write to history. */\n onInput?: (next: Track[]) => void;\n /** Committed at gesture end: one call per gesture. */\n onChange: (next: Track[]) => void;\n onScrub: (t: number) => void;\n\n /** `false` hides the transport. */\n transport?: Omit<TransportProps, 'playhead' | 'duration'> | false;\n selection?: KeySelection | null;\n onSelect?: (sel: KeySelection | null) => void;\n renderKeyEditor?: (ctx: KeyEditorCtx) => ReactNode;\n\n window?: TimeWindow;\n onWindowChange?: (w: TimeWindow) => void;\n\n label?: ReactNode;\n className?: string;\n}\n\nexport function Timeline(props: TimelineProps): ReactElement {\n const {\n tracks, duration, playhead,\n onInput, onChange, onScrub,\n renderKeyEditor, label, className,\n } = props;\n\n const [expanded, setExpanded] = useState<ReadonlySet<string>>(() => new Set());\n const [ownWindow, setOwnWindow] = useState<TimeWindow>({ from: 0, to: duration });\n const [ownSelection, setOwnSelection] = useState<KeySelection | null>(null);\n const [segmentSelection, setSegmentSelection] = useState<KeySelection | null>(null);\n\n const win = props.window ?? ownWindow;\n const setWindow = props.onWindowChange ?? setOwnWindow;\n const selection = props.selection !== undefined ? props.selection : ownSelection;\n const setSelection = props.onSelect ?? setOwnSelection;\n\n const bounds: TimeWindow = { from: 0, to: duration };\n const rows = useMemo(() => buildLanes(tracks, expanded), [tracks, expanded]);\n\n /** Every key time on every row — what a dragged key snaps to. */\n const snapTimes = useMemo(() => {\n const out = new Set<number>([0, duration]);\n for (const row of rows) {\n if (row.kind === 'sampled') for (const k of (row.track as SampledTrack<unknown>).keys) out.add(k.t + row.offset);\n }\n return [...out];\n }, [rows, duration]);\n\n const toggle = (key: string): void => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key); else next.add(key);\n return next;\n });\n };\n\n const onRootKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>): void => {\n if ((e.key === 'Delete' || e.key === 'Backspace') && selection) {\n e.preventDefault();\n const r = deleteKey(tracks, selection);\n onChange(r.tracks);\n setSelection(r.selection);\n }\n };\n\n const selectedTrack = selection ? trackAtPath(tracks, selection.trackPath) : undefined;\n const selectedKey = selectedTrack?.kind === 'sampled'\n ? (selectedTrack as SampledTrack<unknown>).keys[selection!.keyIndex]\n : undefined;\n\n const segmentTrack = segmentSelection ? trackAtPath(tracks, segmentSelection.trackPath) : undefined;\n const segmentKey = segmentTrack?.kind === 'sampled'\n ? (segmentTrack as SampledTrack<unknown>).keys[segmentSelection!.keyIndex]\n : undefined;\n\n return (\n <div\n className={[s.root, className].filter(Boolean).join(' ')}\n data-testid=\"timeline-root\"\n tabIndex={-1}\n onKeyDown={onRootKeyDown}\n >\n {label ? <div className={s.label}>{label}</div> : null}\n\n {props.transport === false ? null : (\n <div className={s.transportRow}>\n <Transport\n {...(props.transport ?? {\n paused: true, loop: false, rate: 1,\n onPlay: () => {}, onPause: () => {},\n onLoopChange: () => {}, onRateChange: () => {},\n })}\n playhead={playhead}\n duration={duration}\n />\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={(props.mode ?? 'dope') === 'graph'}\n aria-label=\"Graph mode\"\n className={s.transportButton}\n onClick={() => props.onModeChange?.((props.mode ?? 'dope') === 'graph' ? 'dope' : 'graph')}\n >\n Graph\n </button>\n </div>\n )}\n\n <div className={s.body}>\n <div className={s.gutter} />\n <div className={s.rulerWrap}>\n <Ruler\n window={win}\n bounds={bounds}\n playhead={playhead}\n onScrub={onScrub}\n onWindowChange={setWindow}\n />\n </div>\n </div>\n\n <div className={s.lanes}>\n {rows.map((row) => {\n const trackPath = row.path;\n return (\n <Lane\n key={row.key}\n row={row}\n window={win}\n mode={props.mode ?? 'dope'}\n selection={selection && samePath(selection.trackPath, trackPath) ? selection.keyIndex : null}\n expanded={expanded.has(row.key)}\n snapTimes={snapTimes}\n onToggleExpand={() => toggle(row.key)}\n onSelect={(keyIndex) => setSelection({ trackPath, keyIndex })}\n onKeyInput={(keyIndex, toMs) => {\n onInput?.(moveKey(tracks, { trackPath, keyIndex }, toMs).tracks);\n }}\n onKeyCommit={(keyIndex, toMs) => {\n const r = moveKey(tracks, { trackPath, keyIndex }, toMs);\n onChange(r.tracks);\n setSelection(r.selection);\n }}\n onKeysInput={(keys) => onInput?.(setKeys(tracks, trackPath, keys))}\n onKeysCommit={(keys) => onChange(setKeys(tracks, trackPath, keys))}\n onInsert={(atMs) => {\n const r = insertKey(tracks, trackPath, atMs);\n onChange(r.tracks);\n setSelection(r.selection);\n }}\n selectedSegment={segmentSelection && samePath(segmentSelection.trackPath, trackPath) ? segmentSelection.keyIndex : null}\n onSelectSegment={(keyIndex) => setSegmentSelection({ trackPath, keyIndex })}\n />\n );\n })}\n </div>\n\n {renderKeyEditor && selection && selectedKey && selectedTrack?.kind === 'sampled' ? (\n <div className={s.inspector}>\n {renderKeyEditor({\n key: selectedKey,\n track: selectedTrack as SampledTrack<unknown>,\n selection,\n commit: (next) => onChange(setKeyValue(tracks, selection, next.value)),\n setEasing: (easing) => onChange(setKeyEasing(tracks, selection, easing)),\n })}\n </div>\n ) : null}\n\n {segmentSelection && segmentKey ? (\n <div className={s.inspector}>\n <EasingPicker\n value={segmentKey.easing}\n onChange={(next) => onChange(setKeyEasing(tracks, segmentSelection, next))}\n />\n </div>\n ) : null}\n </div>\n );\n}\n","// OKLCH math from Björn Ottosson: https://bottosson.github.io/posts/oklab/\nimport { oklchToOklab, oklabToSrgbU8, rgbaToHex } from '@weasel-js/core';\n\n/**\n * A chroma envelope over lightness, as three linear segments: flat at `cBot`\n * below `lRange[0]`, rising to `cPeak` at `midL`, falling to `cTop` at\n * `lRange[1]`, flat beyond. Keeps a color ramp inside gamut at the light and\n * dark ends while staying saturated through the middle.\n */\nexport type ChromaCurve = {\n lRange: [number, number];\n midL: number;\n cBot: number;\n cPeak: number;\n cTop: number;\n};\n\n/** A single lightness/chroma sample. */\nexport type ChromaCurvePoint = { L: number; C: number };\n\n/**\n * Converts an OKLCH color to a gamut-clipped `#rrggbb` string. Hue is in\n * degrees, unlike the kit's OKLab helpers which take radians.\n */\nexport function oklchToHex(L: number, C: number, Hdeg: number): string {\n // Delegate to the kit's OKLab pipeline (kit angle unit is radians) →\n // gamut-clipped u8 sRGB → `#rrggbb`.\n const [l, a, b] = oklchToOklab(L, C, (Hdeg * Math.PI) / 180);\n const [r, g, bl] = oklabToSrgbU8(l, a, b);\n return rgbaToHex([r / 255, g / 255, bl / 255]);\n}\n\n/** Evaluates a {@link ChromaCurve} at a lightness, clamping outside its range. */\nexport function chromaAt(L: number, curve: ChromaCurve): number {\n const [lo, hi] = curve.lRange;\n if (L <= lo) return curve.cBot;\n if (L >= hi) return curve.cTop;\n if (L <= curve.midL) return curve.cBot + (curve.cPeak - curve.cBot) * ((L - lo) / (curve.midL - lo));\n return curve.cPeak + (curve.cTop - curve.cPeak) * ((L - curve.midL) / (hi - curve.midL));\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ComboBoxOption } from './components/ComboBox/ComboBox';\n\ntype Key = string | number;\n\n/** An option list keyed to the value type its combo box commits. */\nexport type AsyncOption<T extends Key> = ComboBoxOption & { value: T };\n\n/** Options for {@link useAsyncOptions}. */\nexport type UseAsyncOptionsProps<T extends Key> = {\n /**\n * Fetches the options for a query. The signal aborts when a later keystroke\n * supersedes this call, so a `fetch` should forward it.\n */\n load: (query: string, signal: AbortSignal) => Promise<ReadonlyArray<AsyncOption<T>>>;\n /** Quiet period before a query is sent. */\n debounceMs?: number;\n /** Shorter queries are not sent, and empty the options. */\n minLength?: number;\n};\n\n/** What {@link useAsyncOptions} returns, shaped to spread into a `ComboBox`. */\nexport type AsyncOptionsResult<T extends Key> = {\n options: ReadonlyArray<AsyncOption<T>>;\n isLoading: boolean;\n loadError: unknown | null;\n inputValue: string;\n onInputChange: (next: string) => void;\n};\n\n/**\n * Drives a combo box whose options come from a server: debounces the query,\n * discards responses overtaken by a later one, and reports a failed load\n * separately from an empty result.\n *\n * `options` holds the last *resolved* list and is never emptied to mean\n * \"working\", so the previous results stay on screen — and stay arrowable —\n * while the next request is in flight.\n */\nexport function useAsyncOptions<T extends Key = string>({\n load,\n debounceMs = 150,\n minLength = 0,\n}: UseAsyncOptionsProps<T>): AsyncOptionsResult<T> {\n const [inputValue, setInputValue] = useState('');\n const [options, setOptions] = useState<ReadonlyArray<AsyncOption<T>>>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [loadError, setLoadError] = useState<unknown | null>(null);\n\n // Read through a ref: a consumer passing an inline arrow re-creates `load`\n // every render, and depending on it directly would refire the request.\n const loadRef = useRef(load);\n loadRef.current = load;\n\n // A monotonic id per request, and the highest one whose result has been\n // applied. A liveness flag cannot do this job: two requests from adjacent\n // keystrokes are both live, so the slower one overwrites the newer result\n // if it lands second.\n const issued = useRef(0);\n const applied = useRef(0);\n const inFlight = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (inputValue.length < minLength) {\n inFlight.current?.abort();\n inFlight.current = null;\n applied.current = issued.current;\n setOptions([]);\n setIsLoading(false);\n setLoadError(null);\n return;\n }\n\n const timer = setTimeout(() => {\n const mine = ++issued.current;\n const controller = new AbortController();\n inFlight.current?.abort();\n inFlight.current = controller;\n setIsLoading(true);\n\n loadRef.current(inputValue, controller.signal).then(\n (next) => {\n if (mine <= applied.current) return;\n applied.current = mine;\n setOptions(next);\n setLoadError(null);\n setIsLoading(false);\n },\n (error: unknown) => {\n if (controller.signal.aborted || mine <= applied.current) return;\n applied.current = mine;\n setLoadError(error);\n setIsLoading(false);\n },\n );\n }, debounceMs);\n\n return () => clearTimeout(timer);\n }, [inputValue, debounceMs, minLength]);\n\n useEffect(() => () => inFlight.current?.abort(), []);\n\n const onInputChange = useCallback((next: string) => setInputValue(next), []);\n\n return { options, isLoading, loadError, inputValue, onInputChange };\n}\n"]}
|