@mkbabb/glass-ui 4.1.0 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{CardAction-8whJrLWt.js → CardAction-DlVP2evz.js} +58 -54
- package/dist/{CommandShortcut-D3yxgHNn.js → CommandShortcut-By-VQcLO.js} +3 -3
- package/dist/{ConfiguratorRow-CaP7U3ZA.js → ConfiguratorRow-YMXdINHx.js} +3 -3
- package/dist/{ContextMenuContent-B3ZsheLV.js → ContextMenuContent-CMWn6huB.js} +1 -1
- package/dist/{ContextMenuSubContent-DDRID3qC.js → ContextMenuSubContent-DvwWCUc0.js} +1 -1
- package/dist/{DataTable-Bc9kUtu_.js → DataTable-C4tG3eIJ.js} +4 -4
- package/dist/DialogContent-D8U9ZfWS.js +121 -0
- package/dist/{DialogScrollContent-TTuovQst.js → DialogScrollContent-BMekN7gq.js} +1 -1
- package/dist/{FadingScroll-DLRbH5Xr.js → FadingScroll-P8B30rAD.js} +1 -1
- package/dist/{HoverCardContent-Bel1gdLZ.js → HoverCardContent-DAmGYglo.js} +1 -1
- package/dist/{HoverPopover-BcIxvyqZ.js → HoverPopover-DYpBOzzF.js} +1 -1
- package/dist/{IconChip-DhbdGdFQ.js → IconChip-CQa7XZYc.js} +7 -5
- package/dist/{IconTooltip-B0zimd2H.js → IconTooltip-_df8M3xm.js} +1 -1
- package/dist/{Input-Cg9DF62r.js → Input-CyU4_hIC.js} +2 -2
- package/dist/{MetricBadge-RHdBP72w.js → MetricBadge-DQt_dGah.js} +1 -1
- package/dist/{Notification-CphK7AAm.js → Notification-BlSPJhtZ.js} +1 -1
- package/dist/{NumberFieldContent-D8cXeyO4.js → NumberFieldContent-Z3VxGu_6.js} +3 -3
- package/dist/PagerDots-CYlqVFd4.js +196 -0
- package/dist/PaperBackdrop-DYWgrnh8.js +42 -0
- package/dist/{PopoverContent-DL7E6vJP.js → PopoverContent-BuKyHZSz.js} +2 -2
- package/dist/{Progress-CnqB7gLm.js → Progress-C9SsdwIZ.js} +1 -1
- package/dist/{ScrollingText-CTZbA_cG.js → ScrollingText-DY3W1Jfh.js} +2 -2
- package/dist/{SelectScrollDownButton-DAKCBEdW.js → SelectScrollDownButton-3mFHX_R-.js} +15 -12
- package/dist/{Switch-B8RscmRu.js → Switch-uf-UKPA2.js} +1 -1
- package/dist/{Toaster-D9qIHjBI.js → Toaster-ozrsR4mP.js} +1 -1
- package/dist/{ToggleGroupItem-BLtr3TJq.js → ToggleGroupItem-BpzaVzNm.js} +4 -4
- package/dist/{TooltipProvider-BJ_Y5EGX.js → TooltipProvider-QQVM_80r.js} +1 -1
- package/dist/animated-digit.js +2 -2
- package/dist/api/index.d.ts +1 -0
- package/dist/api/types-extra.d.ts +3 -1
- package/dist/api.js +2 -2
- package/dist/aurora.js +163 -131
- package/dist/badge-Bt14yURi.js +72 -0
- package/dist/badge.js +1 -1
- package/dist/border-progress.js +1 -1
- package/dist/button-D1W9PrzI.js +130 -0
- package/dist/button.js +1 -1
- package/dist/canvas.js +1 -1
- package/dist/card.js +1 -1
- package/dist/carousel.js +227 -98
- package/dist/chipVariants-BJQ0I2kB.js +18 -0
- package/dist/collapsible.js +1 -1
- package/dist/color.js +1 -1
- package/dist/command.js +1 -1
- package/dist/components/custom/aurora/composables/glSetup.d.ts +1 -1
- package/dist/components/custom/aurora/composables/uniformBridgeWGPU.d.ts +1 -1
- package/dist/components/custom/aurora/constants/presets.d.ts +29 -0
- package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +1 -1
- package/dist/components/custom/aurora/index.d.ts +1 -1
- package/dist/components/custom/concentric/Concentric.vue.d.ts +15 -12
- package/dist/components/custom/concentric/composables/concentricGLSetup.d.ts +8 -3
- package/dist/components/custom/concentric/composables/concentricWGPUSetup.d.ts +8 -4
- package/dist/components/custom/concentric/composables/levelField.d.ts +50 -0
- package/dist/components/custom/concentric/composables/uniformBridgeWGPU.d.ts +7 -4
- package/dist/components/custom/concentric/composables/useConcentric.d.ts +3 -3
- package/dist/components/custom/concentric/constants.d.ts +62 -41
- package/dist/components/custom/concentric/index.d.ts +2 -2
- package/dist/components/custom/concentric/shaders/concentric.glsl.d.ts +2 -2
- package/dist/components/custom/concentric/shaders/concentric.wgsl.d.ts +1 -1
- package/dist/components/custom/configurator/Configurator.vue.d.ts +23 -2
- package/dist/components/custom/configurator/index.d.ts +1 -1
- package/dist/components/custom/dock/DockDropdownTrigger.vue.d.ts +4 -3
- package/dist/components/custom/dock/DockIconButton.vue.d.ts +10 -0
- package/dist/components/custom/dock/DockPopoverTrigger.vue.d.ts +19 -0
- package/dist/components/custom/dock/DockStack.vue.d.ts +35 -22
- package/dist/components/custom/dock/GlassDock.vue.d.ts +19 -3
- package/dist/components/custom/dock/composables/dockMorphContext.d.ts +18 -32
- package/dist/components/custom/dock/composables/dockMorphMeasure.d.ts +76 -145
- package/dist/components/custom/dock/composables/index.d.ts +1 -0
- package/dist/components/custom/dock/composables/railProjection.d.ts +45 -0
- package/dist/components/custom/dock/composables/useDockContextSilhouette.d.ts +192 -0
- package/dist/components/custom/dock/composables/useDockFission.d.ts +158 -0
- package/dist/components/custom/dock/composables/useDockItemDrag.d.ts +18 -0
- package/dist/components/custom/dock/composables/useDockShellProps.d.ts +38 -0
- package/dist/components/custom/dock/constants.d.ts +14 -3
- package/dist/components/custom/dock/index.d.ts +3 -0
- package/dist/components/custom/dot-flow-field/composables/flowField.d.ts +21 -0
- package/dist/components/custom/dot-flow-field/composables/flowGLProgram.d.ts +8 -0
- package/dist/components/custom/dot-flow-field/composables/flowSetupGL.d.ts +9 -0
- package/dist/components/custom/dot-flow-field/composables/flowSetupGLFlow.d.ts +12 -0
- package/dist/components/custom/dot-flow-field/composables/flowSetupWGPU.d.ts +7 -0
- package/dist/components/custom/dot-flow-field/composables/uniformBridgeWGPU.d.ts +28 -2
- package/dist/components/custom/dot-flow-field/composables/useFlowParticles.d.ts +18 -17
- package/dist/components/custom/dot-flow-field/constants.d.ts +51 -0
- package/dist/components/custom/dot-flow-field/index.d.ts +1 -1
- package/dist/components/custom/dot-flow-field/shaders/flow-field.compute.wgsl.d.ts +1 -1
- package/dist/components/custom/dot-flow-field/shaders/flow-field.glsl.d.ts +29 -0
- package/dist/components/custom/dot-flow-field/shaders/flow-field.render.wgsl.d.ts +2 -1
- package/dist/components/custom/dot-matrix/composables/uniformBridgeWGPU.d.ts +10 -1
- package/dist/components/custom/dot-matrix/composables/useDotSphere.d.ts +7 -0
- package/dist/components/custom/dot-matrix/constants.d.ts +14 -0
- package/dist/components/custom/dot-matrix/index.d.ts +1 -1
- package/dist/components/custom/dot-matrix/shaders/dot-matrix.glsl.d.ts +2 -2
- package/dist/components/custom/dot-matrix/shaders/dot-matrix.wgsl.d.ts +1 -1
- package/dist/components/custom/fourier-field/FourierField.vue.d.ts +4 -0
- package/dist/components/custom/fourier-field/composables/fourierFieldGLSetup.d.ts +9 -0
- package/dist/components/custom/fourier-field/composables/fourierFieldWGPUSetup.d.ts +11 -0
- package/dist/components/custom/fourier-field/composables/uniformBridgeWGPU.d.ts +16 -1
- package/dist/components/custom/fourier-field/composables/useFourierField.d.ts +22 -1
- package/dist/components/custom/fourier-field/constants.d.ts +53 -0
- package/dist/components/custom/fourier-field/shaders/fourier-field.glsl.d.ts +1 -1
- package/dist/components/custom/fourier-field/shaders/fourier-field.render.wgsl.d.ts +1 -1
- package/dist/components/custom/goo-blob/composables/easing.d.ts +1 -0
- package/dist/components/custom/goo-blob/composables/useBlobSatellites.d.ts +1 -0
- package/dist/components/custom/goo-blob/constants.d.ts +26 -1
- package/dist/components/custom/goo-blob/shaders/metaball-uniforms.glsl.d.ts +1 -1
- package/dist/components/custom/goo-blob/shaders/metaball.wgsl.d.ts +1 -1
- package/dist/components/custom/goo-blob/types.d.ts +50 -1
- package/dist/components/custom/goo-dot-matrix/composables/gooDotSetup.d.ts +32 -3
- package/dist/components/custom/goo-dot-matrix/composables/uniformBridgeWGPU.d.ts +14 -4
- package/dist/components/custom/goo-dot-matrix/constants.d.ts +55 -16
- package/dist/components/custom/goo-dot-matrix/index.d.ts +1 -1
- package/dist/components/custom/goo-dot-matrix/shaders/goo-dot.frag.d.ts +2 -0
- package/dist/components/custom/goo-dot-matrix/shaders/goo-dot.wgsl.d.ts +1 -0
- package/dist/components/custom/goo-filter/GooFilter.vue.d.ts +22 -0
- package/dist/components/custom/goo-filter/index.d.ts +1 -0
- package/dist/components/custom/handmark/brush.d.ts +17 -17
- package/dist/components/custom/handmark/constants.d.ts +28 -8
- package/dist/components/custom/handmark/geometry.d.ts +34 -1
- package/dist/components/custom/handmark/index.d.ts +1 -1
- package/dist/components/custom/icon-chip/types.d.ts +10 -0
- package/dist/components/custom/paper-backdrop/PaperBackdrop.vue.d.ts +18 -0
- package/dist/components/custom/paper-grid/composables/paperGrid.d.ts +44 -29
- package/dist/components/custom/paper-grid/composables/paperGridGLSetup.d.ts +2 -0
- package/dist/components/custom/paper-grid/composables/paperGridWGPUSetup.d.ts +3 -1
- package/dist/components/custom/paper-grid/composables/uniformBridgeWGPU.d.ts +2 -2
- package/dist/components/custom/paper-grid/constants.d.ts +44 -6
- package/dist/components/custom/paper-grid/index.d.ts +2 -2
- package/dist/components/custom/paper-grid/shaders/paper-grid.glsl.d.ts +1 -1
- package/dist/components/custom/paper-grid/shaders/paper-grid.wgsl.d.ts +1 -1
- package/dist/components/custom/selectable-chip/chipVariants.d.ts +39 -0
- package/dist/components/custom/selectable-chip/selectableChipVariants.d.ts +12 -20
- package/dist/components/custom/tabs/constants.d.ts +16 -8
- package/dist/components/custom/timeline/ScrubberTimeline.vue.d.ts +16 -0
- package/dist/components/custom/timeline/geometry.d.ts +0 -8
- package/dist/components/custom/toggle-chip/index.d.ts +15 -4
- package/dist/components/custom/watercolor-dot/WatercolorDot.vue.d.ts +12 -10
- package/dist/components/ui/_shared/useSurfaceAxis.d.ts +17 -3
- package/dist/components/ui/badge/Badge.vue.d.ts +14 -0
- package/dist/components/ui/badge/index.d.ts +1 -0
- package/dist/components/ui/button/Button.vue.d.ts +1 -0
- package/dist/components/ui/card/Card.vue.d.ts +1 -1
- package/dist/components/ui/card/ScrollCard.vue.d.ts +1 -1
- package/dist/components/ui/carousel/CarouselContent.vue.d.ts +2 -4
- package/dist/components/ui/dialog/DialogContent.vue.d.ts +9 -0
- package/dist/components/ui/drawer/Drawer.vue.d.ts +33 -14
- package/dist/components/ui/drawer/constants.d.ts +8 -6
- package/dist/components/ui/drawer/index.d.ts +12 -2
- package/dist/components/ui/select/SelectContent.vue.d.ts +9 -0
- package/dist/components/ui/slider/Slider.vue.d.ts +9 -0
- package/dist/composables/dom/index.d.ts +1 -0
- package/dist/composables/dom/useDragVelocity.d.ts +46 -0
- package/dist/composables/glass/wave/index.d.ts +4 -0
- package/dist/composables/glass/wave/waveField.d.ts +115 -0
- package/dist/composables/glass/wave/waveField.glsl.d.ts +1 -0
- package/dist/composables/glass/wave/waveField.wgsl.d.ts +1 -0
- package/dist/composables/glass/webgl/createCanvasLifecycle.d.ts +95 -2
- package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +40 -2
- package/dist/composables/glass/webgpu/index.d.ts +1 -0
- package/dist/composables/glass/webgpu/useGpuSubstrate.d.ts +37 -0
- package/dist/composables/glass/webgpu/useWebGPUCanvas.d.ts +49 -2
- package/dist/composables/glass/webgpu/webgpuDevice.d.ts +1 -1
- package/dist/composables/motion/core/index.d.ts +4 -0
- package/dist/composables/motion/core/useHaptic.d.ts +48 -0
- package/dist/composables/motion/core/writeVelocityWeight.d.ts +31 -0
- package/dist/composables/motion/index.d.ts +2 -0
- package/dist/composables/motion/springPresets.d.ts +16 -17
- package/dist/composables/motion/suite.d.ts +2 -2
- package/dist/composables/motion/useBloomUp.d.ts +97 -0
- package/dist/composables/motion/useCelebrationBurst.d.ts +50 -0
- package/dist/composables/motion/useDockCtaReceive.d.ts +10 -28
- package/dist/composables/motion/useGooMorph.d.ts +72 -0
- package/dist/composables/motion/useLiquidFlex.d.ts +18 -0
- package/dist/composables/motion/useLiquidMorph.d.ts +108 -0
- package/dist/composables/motion/useLiquidPress.d.ts +12 -0
- package/dist/composables/motion/useLiquidReveal.d.ts +7 -4
- package/dist/composables/motion/useMorphField.d.ts +157 -0
- package/dist/composables/motion/useScrollPin.d.ts +49 -0
- package/dist/composables/motion/useScrollScene.d.ts +67 -0
- package/dist/concentric.js +532 -563
- package/dist/configurator.js +2 -2
- package/dist/confirm-dialog.js +3 -3
- package/dist/constellation.js +4 -4
- package/dist/context-menu.js +2 -2
- package/dist/controls.js +2 -2
- package/dist/createCanvasLifecycle-CuCrGRfq.js +173 -0
- package/dist/dark.js +1 -1
- package/dist/data-table.js +1 -1
- package/dist/deck.js +1 -1
- package/dist/dialog.js +3 -3
- package/dist/dock.js +1163 -618
- package/dist/dockContext-gFVS2gMg.js +18 -0
- package/dist/dom.js +7 -6
- package/dist/dot-flow-field.js +1114 -523
- package/dist/dot-matrix.js +348 -204
- package/dist/drawer.js +106 -96
- package/dist/{dropdown-menu-aJmV5SqE.js → dropdown-menu-CCfcCQ68.js} +3 -3
- package/dist/dropdown-menu.js +1 -1
- package/dist/easing.js +3 -3
- package/dist/expandable-container.js +2 -2
- package/dist/fading-scroll.js +1 -1
- package/dist/forms.js +6 -6
- package/dist/fourier-field.js +441 -197
- package/dist/fourier-math.js +1 -1
- package/dist/glass-panel.js +2 -2
- package/dist/glass-ui.css +1 -1
- package/dist/glass-ui.js +139 -135
- package/dist/goo-blob.js +11 -9
- package/dist/goo-dot-matrix.js +418 -198
- package/dist/handmark.js +137 -94
- package/dist/header-ribbon.js +1 -1
- package/dist/hover-card.js +1 -1
- package/dist/hover-popover.js +1 -1
- package/dist/icon-chip.js +1 -1
- package/dist/icon-tooltip.js +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/instrument-chassis.js +1 -1
- package/dist/keyboard.js +1 -1
- package/dist/label.js +1 -1
- package/dist/labeled-field.js +7 -7
- package/dist/metric-badge.js +1 -1
- package/dist/metric-cell.js +1 -1
- package/dist/metric-stack.js +1 -1
- package/dist/motion-core.js +42 -39
- package/dist/motion-curves.js +20 -14
- package/dist/motion.js +226 -26
- package/dist/notification.js +1 -1
- package/dist/number-field.js +1 -1
- package/dist/pager-dots.js +1 -1
- package/dist/paper-backdrop.js +1 -1
- package/dist/paper-grid.js +315 -342
- package/dist/paperGrid-CXCSMbZ1.js +191 -0
- package/dist/popover.js +1 -1
- package/dist/{presets-CvOUqtdY.js → presets-QvYgnFIZ.js} +13 -12
- package/dist/progress.js +1 -1
- package/dist/pulse.js +1 -1
- package/dist/reactive.js +2 -2
- package/dist/{resolveCanvasColor-yPyIpJt9.js → resolveCanvasColor-DsSJk06I.js} +5 -5
- package/dist/scrolling-text.js +1 -1
- package/dist/search.js +7 -7
- package/dist/select.js +3 -3
- package/dist/selectable-chip.js +18 -35
- package/dist/separator.js +1 -1
- package/dist/{sheet-B2flBfLH.js → sheet-DUCIoOe0.js} +3 -3
- package/dist/sheet.js +1 -1
- package/dist/sidebar.js +1 -1
- package/dist/slider-CcICPe3u.js +149 -0
- package/dist/slider.js +1 -1
- package/dist/sortable-list.js +3 -3
- package/dist/{spectrum-walk-BVzA7Biz.js → spectrum-walk-cBNSx_zm.js} +1 -1
- package/dist/springPresets-DfoQ6XRY.js +64 -0
- package/dist/stacked-icons.js +54 -39
- package/dist/styles/cards.css +202 -2
- package/dist/styles/components.css +1 -3
- package/dist/styles/configurator.css +172 -7
- package/dist/styles/critical-partition.mjs +35 -2
- package/dist/styles/deferred.css +2 -0
- package/dist/styles/dock/adaptive-legibility.css +119 -0
- package/dist/styles/dock/density.css +18 -10
- package/dist/styles/dock/fission-bridge.css +552 -0
- package/dist/styles/dock/layers.css +88 -124
- package/dist/styles/dock/morph-bridge.css +15 -2
- package/dist/styles/dock/morph.css +45 -114
- package/dist/styles/dock/shape.css +137 -11
- package/dist/styles/dock/shell.css +1 -3
- package/dist/styles/dock/stack-rail.css +95 -7
- package/dist/styles/dock-controls/icon-button.css +34 -2
- package/dist/styles/dock-controls/triggers.css +23 -1
- package/dist/styles/dock-controls.css +18 -0
- package/dist/styles/dock.css +16 -1
- package/dist/styles/drawer.css +166 -0
- package/dist/styles/glass/glass-atom.css +244 -0
- package/dist/styles/glass/glass-capsule.css +143 -0
- package/dist/styles/glass/glass-chip.css +215 -0
- package/dist/styles/glass/liquid-enter.css +252 -0
- package/dist/styles/glass/liquid-morph.css +850 -0
- package/dist/styles/glass/material.css +70 -1
- package/dist/styles/glass/reveal.css +22 -2
- package/dist/styles/glass/rim.css +13 -1
- package/dist/styles/glass/surfaces.css +18 -8
- package/dist/styles/glass.css +11 -0
- package/dist/styles/icon-chip.css +45 -0
- package/dist/styles/index.css +11 -0
- package/dist/styles/jubilance.css +65 -0
- package/dist/styles/motion/morph-field.css +229 -0
- package/dist/styles/paper.css +230 -14
- package/dist/styles/scroll-choreography.css +135 -78
- package/dist/styles/segmented-tabs.css +85 -51
- package/dist/styles/select.css +151 -0
- package/dist/styles/tokens/color-radius.css +1 -1
- package/dist/styles/tokens/dark-arm.css +57 -8
- package/dist/styles/tokens/glass-deep.css +8 -4
- package/dist/styles/tokens/glass-fx.css +80 -2
- package/dist/styles/tokens/glass.css +140 -8
- package/dist/styles/tokens/light-dark.css +2 -2
- package/dist/styles/tokens/property-regs.css +144 -0
- package/dist/styles/tokens/scale-paper.css +20 -8
- package/dist/styles/tokens/scheme-motion.css +92 -157
- package/dist/styles/tokens/scheme-spring.css +239 -0
- package/dist/styles/tokens/scroll-tokens.css +15 -15
- package/dist/styles/tokens/shadow.css +73 -13
- package/dist/styles/tokens.css +9 -2
- package/dist/styles/utilities/btn.css +70 -0
- package/dist/switch.js +1 -1
- package/dist/tabs.js +198 -181
- package/dist/timeline.js +241 -206
- package/dist/toast.js +1 -1
- package/dist/toggle-chip.js +14 -41
- package/dist/toggle-group.js +1 -1
- package/dist/tooltip.js +1 -1
- package/dist/typewriter.js +1 -1
- package/dist/{uniformBridgeWGPU-CtAKl45L.js → uniformBridgeWGPU-BCse1SHU.js} +191 -127
- package/dist/{useAnimatedNumber-CLrxicG9.js → useAnimatedNumber-BntskVdQ.js} +1 -1
- package/dist/{useConfiguratorState-4xblKfwd.js → useConfiguratorState-22BcULzF.js} +37 -35
- package/dist/useDockCtaReceive-DX7RDb6_.js +88 -0
- package/dist/{useDragMorph-BUgAC-zK.js → useDragMorph-DGLSewwB.js} +2 -2
- package/dist/useDragVelocity-CjcfX3dA.js +57 -0
- package/dist/useGooMorph-Cs13NgYL.js +104 -0
- package/dist/useGpuSubstrate-Ceet70xq.js +347 -0
- package/dist/{useViewTransition-CUI1nAgn.js → useHaptic-CPz5BT9I.js} +40 -1
- package/dist/{useLiquidFlex-UmA6LMZu.js → useLiquidFlex-Cc6PjVJD.js} +8 -3
- package/dist/useLiquidPress-CtOQ8Z0_.js +43 -0
- package/dist/useMorphField-ogBM7ubT.js +141 -0
- package/dist/{useScrollChrome-D66AVP7C.js → useScrollChrome-JuImi1DM.js} +2 -2
- package/dist/{useSpringMount-BWDnKIwh.js → useSpringMount-DFxtzmkR.js} +1 -1
- package/dist/{useSpringPress-B1-Czp-V.js → useSpringPress-VM9RgVq3.js} +1 -1
- package/dist/{useSurfaceAxis-g0NloYEF.js → useSurfaceAxis-Ci7Dnaw2.js} +1 -1
- package/dist/{useTouchGate-CBZTD4SD.js → useTouchGate-B1Lf9XqN.js} +1 -1
- package/dist/virtual.js +1 -1
- package/dist/watercolor-dot.js +16 -26
- package/dist/writeVelocityWeight-Bh83xZfs.js +19 -0
- package/package.json +14 -3
- package/src/styles/cards.css +202 -2
- package/src/styles/configurator.css +172 -7
- package/src/styles/critical-partition.mjs +35 -2
- package/src/styles/dock/adaptive-legibility.css +119 -0
- package/src/styles/dock/density.css +18 -10
- package/src/styles/dock/fission-bridge.css +552 -0
- package/src/styles/dock/layers.css +88 -124
- package/src/styles/dock/morph-bridge.css +15 -2
- package/src/styles/dock/morph.css +45 -114
- package/src/styles/dock/shape.css +137 -11
- package/src/styles/dock/shell.css +1 -3
- package/src/styles/dock/stack-rail.css +95 -7
- package/src/styles/dock-controls/icon-button.css +34 -2
- package/src/styles/dock-controls/triggers.css +23 -1
- package/src/styles/dock-controls.css +18 -0
- package/src/styles/dock.css +16 -1
- package/src/styles/drawer.css +164 -0
- package/src/styles/glass/glass-atom.css +244 -0
- package/src/styles/glass/glass-capsule.css +143 -0
- package/src/styles/glass/glass-chip.css +215 -0
- package/src/styles/glass/liquid-enter.css +252 -0
- package/src/styles/glass/liquid-morph.css +850 -0
- package/src/styles/glass/material.css +70 -1
- package/src/styles/glass/reveal.css +22 -2
- package/src/styles/glass/rim.css +13 -1
- package/src/styles/glass/surfaces.css +18 -8
- package/src/styles/glass.css +11 -0
- package/src/styles/icon-chip.css +45 -0
- package/src/styles/index.css +11 -0
- package/src/styles/jubilance.css +65 -0
- package/src/styles/motion/morph-field.css +229 -0
- package/src/styles/paper.css +230 -14
- package/src/styles/scroll-choreography.css +135 -78
- package/src/styles/segmented-tabs.css +85 -47
- package/src/styles/select.css +151 -0
- package/src/styles/tokens/color-radius.css +1 -1
- package/src/styles/tokens/dark-arm.css +57 -8
- package/src/styles/tokens/glass-deep.css +8 -4
- package/src/styles/tokens/glass-fx.css +80 -2
- package/src/styles/tokens/glass.css +140 -8
- package/src/styles/tokens/light-dark.css +2 -2
- package/src/styles/tokens/property-regs.css +144 -0
- package/src/styles/tokens/scale-paper.css +20 -8
- package/src/styles/tokens/scheme-motion.css +92 -157
- package/src/styles/tokens/scheme-spring.css +239 -0
- package/src/styles/tokens/scroll-tokens.css +15 -15
- package/src/styles/tokens/shadow.css +73 -13
- package/src/styles/tokens.css +9 -2
- package/src/styles/utilities/btn.css +70 -0
- package/dist/DialogContent-6JtTB5x2.js +0 -106
- package/dist/PagerDots-Cjx96la-.js +0 -98
- package/dist/PaperBackdrop-CqwjnfLv.js +0 -31
- package/dist/badge-D9XWW4GT.js +0 -53
- package/dist/button-5dY1Dvhd.js +0 -125
- package/dist/components/custom/concentric/composables/ringField.d.ts +0 -85
- package/dist/createCanvasLifecycle-Gh45Ce-p.js +0 -93
- package/dist/dockContext-BNfyPLe9.js +0 -17
- package/dist/slider-2A0rPn79.js +0 -142
- package/dist/springPresets-Ce7OYCm9.js +0 -46
- package/dist/useDockCtaReceive-DfFkmgL1.js +0 -82
- package/dist/useGpuSubstrate-4pTcp6mX.js +0 -294
- package/dist/useLiquidPress-BooG97RY.js +0 -39
- /package/dist/{CollapsibleContent-68dEXIAl.js → CollapsibleContent-D7UNsXQr.js} +0 -0
- /package/dist/{DialogFooter-9phqcRIS.js → DialogFooter-DoLy0ewI.js} +0 -0
- /package/dist/{InstrumentChassis-CxsHSyMj.js → InstrumentChassis-UUJX0-mW.js} +0 -0
- /package/dist/{Label-C2ejNWeC.js → Label-B_HPqi_q.js} +0 -0
- /package/dist/{ModalOverlay-D1VrWyoi.js → ModalOverlay-DfAf7o15.js} +0 -0
- /package/dist/{SelectGroup-BFiod7X2.js → SelectGroup-Dcczq44n.js} +0 -0
- /package/dist/{SelectSeparator-C2UGOkXF.js → SelectSeparator-CNRGG7Ew.js} +0 -0
- /package/dist/{Separator-DQcwC2TR.js → Separator-Cf9-JFgi.js} +0 -0
- /package/dist/{_plugin-vue_export-helper-C1je1s0u.js → _plugin-vue_export-helper-gLzyemvl.js} +0 -0
- /package/dist/{color-Cs0-oxYL.js → color-B9jZdhJX.js} +0 -0
- /package/dist/{compile-nZ1xVYTp.js → compile-INR_tPk_.js} +0 -0
- /package/dist/{constants--C2DkLW8.js → constants-BWj7DkMn.js} +0 -0
- /package/dist/{createContext-CpBNTRMI.js → createContext-Cd23P9j0.js} +0 -0
- /package/dist/{dotMatrixField-D_x9_1qq.js → dotMatrixField-CRO0ZFk4.js} +0 -0
- /package/dist/{flow.glsl-B2P7e0MT.js → flow.glsl-DqEGRpl4.js} +0 -0
- /package/dist/{math-Eb0w3LqU.js → math-5RcIgCB4.js} +0 -0
- /package/dist/{menuItemVariants-D8VNHq22.js → menuItemVariants-DAXquKja.js} +0 -0
- /package/dist/{prng-B-d9eYX8.js → prng-B5tIXTtj.js} +0 -0
- /package/dist/{procedural-color.wgsl-m7Zgv35j.js → procedural-color.wgsl-C1Y5PkM6.js} +0 -0
- /package/dist/{scrollReader-DI1NWxUw.js → scrollReader-rc3Ns_NM.js} +0 -0
- /package/dist/{useControlSize-SH1UmJCi.js → useControlSize-DAZ062x7.js} +0 -0
- /package/dist/{useFuzzySearch-DIhcYtcw.js → useFuzzySearch-0fTYOhS4.js} +0 -0
- /package/dist/{useGlobalDark-CmjB9E32.js → useGlobalDark-B4HO9LXG.js} +0 -0
- /package/dist/{useIntersectionPause-Dbozzjgm.js → useIntersectionPause-DO8Vl4gs.js} +0 -0
- /package/dist/{useInterval-CNdua40W.js → useInterval-BVUI-sez.js} +0 -0
- /package/dist/{useKeyboardShortcuts-BPRp33Im.js → useKeyboardShortcuts-BEut54Tk.js} +0 -0
- /package/dist/{usePointerVelocityField-QLsy3_kv.js → usePointerVelocityField-BrkqZFhj.js} +0 -0
- /package/dist/{useResizeObserver-Bpoi7tRE.js → useResizeObserver-DdEn3v2f.js} +0 -0
- /package/dist/{useResolveTokenColor-vAylyR0x.js → useResolveTokenColor-ChOnCckA.js} +0 -0
- /package/dist/{useScrollProgress-c3yxmH6a.js → useScrollProgress-A0M6qRl7.js} +0 -0
- /package/dist/{useSortable-BVqlJRBR.js → useSortable-DQV_UNDw.js} +0 -0
- /package/dist/{useTextHighlight-NmBM5V_4.js → useTextHighlight-Bma3UlKA.js} +0 -0
- /package/dist/{useTimer-BHJOKr35.js → useTimer-BBLGPXR8.js} +0 -0
- /package/dist/{useUserInvalidAria-y5namzeE.js → useUserInvalidAria-EmmwWPOl.js} +0 -0
- /package/dist/{useViewportReady-anbac3m6.js → useViewportReady-C9pYnn7K.js} +0 -0
- /package/dist/{vReveal-D9k0jADx.js → vReveal-CT1KtwZA.js} +0 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type Ref } from "vue";
|
|
2
|
+
import { type SpringPresetName } from "./springPresets";
|
|
3
|
+
/** The burst spring register — `bouncy` (the emphatic playful default) or `snappy`. */
|
|
4
|
+
export type CelebrationBurstPreset = Extract<SpringPresetName, "bouncy" | "snappy">;
|
|
5
|
+
export interface UseCelebrationBurstOptions {
|
|
6
|
+
/** The number of glass petals to bloom. Default 12. */
|
|
7
|
+
count?: number;
|
|
8
|
+
/** The spring register (default `bouncy` — the playful overshoot). */
|
|
9
|
+
preset?: CelebrationBurstPreset;
|
|
10
|
+
/** The base outward radius in px (each petal lands at `radius × 0.7..1.0` seeded). Default 64. */
|
|
11
|
+
radius?: number;
|
|
12
|
+
/**
|
|
13
|
+
* An OPT-IN destination element whose `[data-reveal]` children get the chip-bloom-in
|
|
14
|
+
* settle cascade (the burst sets `--d` per child so the EXISTING `icon-chip-reveal`
|
|
15
|
+
* cascade plays). Omitted → no settle cascade (a pure radial burst).
|
|
16
|
+
*/
|
|
17
|
+
destination?: Ref<HTMLElement | null>;
|
|
18
|
+
/**
|
|
19
|
+
* An OPT-IN `:tone` axis — when set, the petals tint toward this hue (a complete CSS
|
|
20
|
+
* `<color>` written to `--glass-accent`, the W-GLASS-ACCENT rim-tint seam, for a
|
|
21
|
+
* hue-keyed burst — a download-complete petal blooms `--viz-download`). Omitted → the
|
|
22
|
+
* warm-cream identity (the default).
|
|
23
|
+
*/
|
|
24
|
+
tone?: string;
|
|
25
|
+
/** Honor `prefers-reduced-motion: reduce` (snap — terminal cascade only). Default true. */
|
|
26
|
+
respectReducedMotion?: boolean;
|
|
27
|
+
/** A fired-once callback when the burst settles (the overlay removed). */
|
|
28
|
+
onSettled?: () => void;
|
|
29
|
+
}
|
|
30
|
+
export interface UseCelebrationBurstReturn {
|
|
31
|
+
/**
|
|
32
|
+
* Fire the one-shot earned-moment petal bloom from the origin's center. Idempotent per
|
|
33
|
+
* call — a re-fire mid-bloom cancels the prior overlay + starts fresh. A no-op if the
|
|
34
|
+
* origin element is not mounted.
|
|
35
|
+
*/
|
|
36
|
+
burst: () => void;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The library's ONE EARNED-moment celebration primitive — a one-shot radial bloom of N
|
|
40
|
+
* warm-cream glass petals (scale + fade + decongest from the origin on the bouncy spring),
|
|
41
|
+
* then a coupled chip-bloom-in cascade settles the destination. Compositor-only + PRM-static.
|
|
42
|
+
* See the module header for the REUSE + burst-mechanism + the channel writes.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```ts
|
|
46
|
+
* const { burst } = useCelebrationBurst(metricCardRef, { preset: "bouncy", destination })
|
|
47
|
+
* onPersonalBest(() => burst())
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare function useCelebrationBurst(origin: Ref<HTMLElement | null>, options?: UseCelebrationBurstOptions): UseCelebrationBurstReturn;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Ref } from "vue";
|
|
1
|
+
import { type ComponentPublicInstance, type Ref } from "vue";
|
|
2
2
|
import { type SpringPresetName } from "./springPresets";
|
|
3
3
|
/** The receive spring register — `snappy` (the crisp absorb default) or `bouncy`
|
|
4
4
|
* (the emphatic land-with-overshoot). A subset of the named `SPRING_PRESETS` rows,
|
|
@@ -10,7 +10,14 @@ export interface UseDockCtaReceiveOptions {
|
|
|
10
10
|
* `<DockIconButton>`/dock control element). When null at receive time, the morph
|
|
11
11
|
* is a no-op snap (no destination to fly to) and `onReceived` fires immediately.
|
|
12
12
|
*/
|
|
13
|
-
|
|
13
|
+
/**
|
|
14
|
+
* The dock control the CTA flies onto — a templateRef to the control ELEMENT or to
|
|
15
|
+
* a component (e.g. `<DockIconButton>`), whose root element is resolved via `.$el`.
|
|
16
|
+
* Resolving both keeps the seam forgiving: a `useTemplateRef<HTMLElement>` annotation
|
|
17
|
+
* on a component ref (whose value is the component public instance) no longer throws
|
|
18
|
+
* `setAttribute is not a function` at runtime — the stale element-vs-component class.
|
|
19
|
+
*/
|
|
20
|
+
dockControl: Ref<HTMLElement | ComponentPublicInstance | null>;
|
|
14
21
|
/** The spring register (default `snappy`). */
|
|
15
22
|
preset?: DockCtaReceivePreset;
|
|
16
23
|
/** The ending congest blur radius in px (the CTA dissolves into the glass). Default 4. */
|
|
@@ -56,29 +63,4 @@ export interface UseDockCtaReceiveReturn {
|
|
|
56
63
|
/** The reactive seat state — the consumer binds `:class`/`v-if` off it. */
|
|
57
64
|
pending: Readonly<Ref<boolean>>;
|
|
58
65
|
}
|
|
59
|
-
|
|
60
|
-
* The external-CTA-into-dock-control morph. Composes the SAME kf `ElementMorph` +
|
|
61
|
-
* `springTimingFunction` substrate `useLiquidReveal` activates, driven FORWARD (the
|
|
62
|
-
* reveal's inverse): the CTA flies + reshapes from its own rect onto the dock
|
|
63
|
-
* control's rect, fades + congests into the glass on the spring clock, then hands off.
|
|
64
|
-
* Compositor-only + PRM-seats. See the module header for the REUSE + the FORWARD-play
|
|
65
|
-
* mechanism + the channel split.
|
|
66
|
-
*
|
|
67
|
-
* @example
|
|
68
|
-
* ```ts
|
|
69
|
-
* const { receive, setPending, clearPending, pending, reset } = useDockCtaReceive(
|
|
70
|
-
* ctaRef,
|
|
71
|
-
* {
|
|
72
|
-
* dockControl: dockTargetRef,
|
|
73
|
-
* preset: "snappy",
|
|
74
|
-
* onReceived: () => (ctaConsumed.value = true),
|
|
75
|
-
* },
|
|
76
|
-
* )
|
|
77
|
-
* // ARM the seat (the dock control shows the dim ghost + reserves its footprint).
|
|
78
|
-
* setPending()
|
|
79
|
-
* // on the CTA click: morph it into the dock (the default hand-off clearPending()s,
|
|
80
|
-
* // revealing the seated content with the opacity FLIP — no box jump).
|
|
81
|
-
* function onCta() { receive() }
|
|
82
|
-
* ```
|
|
83
|
-
*/
|
|
84
|
-
export declare function useDockCtaReceive(cta: Ref<HTMLElement | null>, options: UseDockCtaReceiveOptions): UseDockCtaReceiveReturn;
|
|
66
|
+
export declare function useDockCtaReceive(cta: Ref<HTMLElement | ComponentPublicInstance | null>, options: UseDockCtaReceiveOptions): UseDockCtaReceiveReturn;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { type Ref } from "vue";
|
|
2
|
+
/**
|
|
3
|
+
* The three barbell silhouette elements the engine projects per frame. NOT
|
|
4
|
+
* `morph.children[i]` index-reaching (the fragile KISS-violating path) — three EXPLICIT
|
|
5
|
+
* refs the consumer renders + binds.
|
|
6
|
+
*/
|
|
7
|
+
export interface GooBarbellRefs {
|
|
8
|
+
/** The trailing round body (the OUTGOING droplet). */
|
|
9
|
+
bodyARef: Ref<HTMLElement | null>;
|
|
10
|
+
/** The leading round body (the INCOMING droplet). */
|
|
11
|
+
bodyBRef: Ref<HTMLElement | null>;
|
|
12
|
+
/** The welling concave-throat neck between the two bodies. */
|
|
13
|
+
neckRef: Ref<HTMLElement | null>;
|
|
14
|
+
}
|
|
15
|
+
export interface UseGooMorphParams {
|
|
16
|
+
/**
|
|
17
|
+
* The barbell silhouette refs — two round bodies + a welling concave neck. The engine
|
|
18
|
+
* writes their three transforms each frame (the merge needs ≥2 masses; the neck is the
|
|
19
|
+
* bridge). NO single-element `morphRef` — the barbell IS the morph.
|
|
20
|
+
*/
|
|
21
|
+
barbellRefs: GooBarbellRefs;
|
|
22
|
+
/** The geometry origin + the `--goo-t` transition host (the rail/track root). */
|
|
23
|
+
hostRef: Ref<HTMLElement | null>;
|
|
24
|
+
/** Travel axis. `false` → horizontal (translateX), `true` → vertical (translateY). */
|
|
25
|
+
vertical: Ref<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Live center reader: the on-axis center (px, relative to the host content box)
|
|
28
|
+
* of slot `i`, on the travel axis. MEASURED off the live DOM (windowFit-correct,
|
|
29
|
+
* both axes) — never a hardcoded pitch.
|
|
30
|
+
*/
|
|
31
|
+
centerOf: (i: number) => number | null;
|
|
32
|
+
/**
|
|
33
|
+
* The resting slot pitch (px) on the travel axis. The barbell body diameter is the
|
|
34
|
+
* golden-minor `D = restSize()/φ` (a BLOB, not a plate) — so the consumer passes the
|
|
35
|
+
* slot STEP, not a pre-shrunk body size.
|
|
36
|
+
*/
|
|
37
|
+
restSize: () => number;
|
|
38
|
+
/**
|
|
39
|
+
* The token prefix for the flow/duration/max-stretch reads. Default `"pager-worm"`
|
|
40
|
+
* (the dot-pip register). The carousel passes `"carousel-goo"`; the deck `"deck-goo"`
|
|
41
|
+
* — each reads its OWN `--{prefix}-flow`/`-duration`/`-max-stretch` so a card-scale
|
|
42
|
+
* barbell dwells/swells at its own scale, the dot at its own. ONE engine, per-consumer
|
|
43
|
+
* tokens (the no-new-spring fence — they all resolve `--spring-*`-derived `linear()`).
|
|
44
|
+
*/
|
|
45
|
+
tokenPrefix?: string;
|
|
46
|
+
/**
|
|
47
|
+
* The neck-gap fraction — how near the two bodies draw at the midpoint (sep's floor:
|
|
48
|
+
* 1 at the slots → `neckGap` at mid). Lower = the bodies near closer → a tighter,
|
|
49
|
+
* gooier waist. Default 0.78 (carousel). Pager 0.7, deck 0.85. (= `--{prefix}-neck-gap`
|
|
50
|
+
* if the consumer prefers a token; the param is the engine default.)
|
|
51
|
+
*/
|
|
52
|
+
neckGap?: number;
|
|
53
|
+
}
|
|
54
|
+
export interface UseGooMorphReturn {
|
|
55
|
+
/**
|
|
56
|
+
* Travel the barbell from `from` to `to` (slot indices). Sets the `--goo-t`
|
|
57
|
+
* transition target (the spring glides it) and runs a short rAF that projects the
|
|
58
|
+
* interpolated scalar onto the three-element barbell each frame. PRM → instant snap to
|
|
59
|
+
* ONE resting body, no squish.
|
|
60
|
+
*/
|
|
61
|
+
travel(from: number, to: number): void;
|
|
62
|
+
/** Snap the barbell to ONE resting body on `index` immediately (first paint / resize / PRM). */
|
|
63
|
+
snap(index: number): void;
|
|
64
|
+
/**
|
|
65
|
+
* Drag-driven continuous drive: set `--goo-t` DIRECTLY to a fractional slot position
|
|
66
|
+
* (the live drag scrollProgress, e.g. embla's `scrollProgress()*lastIndex`) with NO
|
|
67
|
+
* transition, and project the barbell for it. The neck wells with the live drag; call
|
|
68
|
+
* `travel()` on the snap to glide the release. PRM → snap.
|
|
69
|
+
*/
|
|
70
|
+
drive(fractionalIndex: number): void;
|
|
71
|
+
}
|
|
72
|
+
export declare function useGooMorph(params: UseGooMorphParams): UseGooMorphReturn;
|
|
@@ -71,6 +71,24 @@ export interface UseLiquidFlexReturn {
|
|
|
71
71
|
* The SFC's CSS pairs `--stretch` reciprocally along the travel axis.
|
|
72
72
|
*/
|
|
73
73
|
stretchStyle: ComputedRef<Record<string, string>>;
|
|
74
|
+
/**
|
|
75
|
+
* BD.W-MOTION-WEIGHT — the SATURATING velocity term `tanh(|ṫ|·k) ∈ [0,1]` (the
|
|
76
|
+
* SAME term the squish already computes), exposed so a consumer can fold it into
|
|
77
|
+
* the universal `--motion-weight` velocity boost (§2c). 0 at rest; rises toward 1
|
|
78
|
+
* on a fast travel; self-extinguishes as the travel stills. In `"linear"` law it
|
|
79
|
+
* is the travel FRACTION (clamped to [0,1]); in `"tanh"` law it is `tanh(travel·k)`.
|
|
80
|
+
* The PRIMITIVE STAYS ELEMENT-LESS — it merely projects the term; the consumer
|
|
81
|
+
* writes it onto the driving element via the `writeVelocityWeight` helper.
|
|
82
|
+
*/
|
|
83
|
+
flexVel: ComputedRef<number>;
|
|
84
|
+
/**
|
|
85
|
+
* The velocity term as a CSS custom-property style object
|
|
86
|
+
* (`{ "--flex-vel": "0.42" }`). The consumer binds it on the driving element (the
|
|
87
|
+
* one extra style object — the term it ALREADY computes); the local
|
|
88
|
+
* `--motion-weight: calc(0.618 + 0.382 * var(--flex-vel))` boost rides it. The
|
|
89
|
+
* primitive stays element-less; this is a pure projection.
|
|
90
|
+
*/
|
|
91
|
+
velStyle: ComputedRef<Record<string, string>>;
|
|
74
92
|
/**
|
|
75
93
|
* Advance the morph: set the normalized progress to `next` (0→1). The squish
|
|
76
94
|
* travel velocity is the |Δt| since the prior `drive`, so calling `drive` on a
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { type MaybeRefOrGetter, type Ref } from "vue";
|
|
2
|
+
import { type SpringPresetName } from "./springPresets";
|
|
3
|
+
import { type LiquidRevealPreset } from "./useLiquidReveal";
|
|
4
|
+
/** The morph MODES the one scalar drives. */
|
|
5
|
+
export type LiquidMorphMode = "split" | "union" | "expand";
|
|
6
|
+
/**
|
|
7
|
+
* How a piece's travel ANGLE is resolved:
|
|
8
|
+
* • `radial` — the unit vector host-center -> piece-center (the n-ary fan).
|
|
9
|
+
* • `lateral` — the host's cross-axis (a single side bud).
|
|
10
|
+
* • `inward` — the negated radial (a union pull toward the host).
|
|
11
|
+
* • `directed` — the caller's explicit `piece.angle` (radians) — the
|
|
12
|
+
* configurable-angle case the playground's slider drives.
|
|
13
|
+
*/
|
|
14
|
+
export type LiquidMorphVector = "radial" | "lateral" | "inward" | "directed";
|
|
15
|
+
/** The named morphology signature — the goo neck/squish character per mode. */
|
|
16
|
+
export interface LiquidMorphSignature {
|
|
17
|
+
/** How each piece's travel angle is resolved (default `radial`). */
|
|
18
|
+
vector: LiquidMorphVector;
|
|
19
|
+
/** Where the goo neck snaps in the 0..1 travel (0.4 tense -> 0.7 long-tail). */
|
|
20
|
+
neckHold: number;
|
|
21
|
+
/** The LOW squish cap the bud-off swell can reach (>1; default 1.08). */
|
|
22
|
+
maxStretch: number;
|
|
23
|
+
}
|
|
24
|
+
/** The default radial-fan signature (the macOS goo-split read). */
|
|
25
|
+
export declare const RADIAL_SPLIT: LiquidMorphSignature;
|
|
26
|
+
/** The directed-beam signature (the configurable-angle / single-direction case). */
|
|
27
|
+
export declare const DIRECTED_SPLIT: LiquidMorphSignature;
|
|
28
|
+
export interface UseLiquidMorphOptions {
|
|
29
|
+
/** The host element carrying the `--liquid-morph-t` scalar (a card OR a dock). */
|
|
30
|
+
rootEl: Ref<HTMLElement | null>;
|
|
31
|
+
/**
|
|
32
|
+
* The ORIGIN element the split BUDS FROM (the dock pill). The pieces fan out of
|
|
33
|
+
* this element's center (a connecting goo neck back to the dock), NOT the host
|
|
34
|
+
* stage center — the WAVE-1 "bud from the dock" fix. Its center is measured
|
|
35
|
+
* relative to `rootEl` each episode and written as `--liquid-morph-origin-x/y`
|
|
36
|
+
* (px-from-the-host-top-left) which the goo group (liquid-morph.css) anchors at.
|
|
37
|
+
* When unset the goo group falls back to the host center (the standalone case).
|
|
38
|
+
*/
|
|
39
|
+
originEl?: Ref<HTMLElement | null>;
|
|
40
|
+
/** The morphology signature (default `RADIAL_SPLIT`). */
|
|
41
|
+
signature?: LiquidMorphSignature;
|
|
42
|
+
/**
|
|
43
|
+
* The spring register the scalar rides — a `SPRING_PRESETS` row name, or a
|
|
44
|
+
* ref/getter resolved PER-DRIVE so a host can vary the clock by gesture (a smooth
|
|
45
|
+
* card bloom vs a livelier split). Default `"dock"`. NO new family is minted.
|
|
46
|
+
*/
|
|
47
|
+
spring?: MaybeRefOrGetter<SpringPresetName>;
|
|
48
|
+
/** The bloom preset for `expand()` (default `"bouncy"`). */
|
|
49
|
+
revealPreset?: LiquidRevealPreset;
|
|
50
|
+
/** Honor `prefers-reduced-motion: reduce` (seat synchronously). Default true. */
|
|
51
|
+
respectReducedMotion?: boolean;
|
|
52
|
+
}
|
|
53
|
+
/** A registered split piece — its element + its vector descriptor. */
|
|
54
|
+
export interface LiquidMorphPiece {
|
|
55
|
+
/** The piece element (a free-floating glass shard). */
|
|
56
|
+
el: Ref<HTMLElement | null>;
|
|
57
|
+
/**
|
|
58
|
+
* The explicit travel angle in RADIANS for the `directed` vector. Ignored for
|
|
59
|
+
* `radial`/`lateral`/`inward` (those derive the angle from geometry).
|
|
60
|
+
*/
|
|
61
|
+
angle?: number;
|
|
62
|
+
/** The piece's fan rank (the stagger index; 0-based). */
|
|
63
|
+
rank?: number;
|
|
64
|
+
/** The travel distance in px (how far the piece flies). Default 96. */
|
|
65
|
+
distance?: number;
|
|
66
|
+
}
|
|
67
|
+
export interface RegisteredPiece extends LiquidMorphPiece {
|
|
68
|
+
/** Detach this piece from the morph (clears its inline customs). */
|
|
69
|
+
release(): void;
|
|
70
|
+
}
|
|
71
|
+
export interface UseLiquidMorphReturn {
|
|
72
|
+
/** Register a split piece; returns the live handle. */
|
|
73
|
+
registerPiece(p: LiquidMorphPiece): RegisteredPiece;
|
|
74
|
+
/** SPLIT — drive the scalar 0 -> 1 (the pieces bud off through the goo neck). */
|
|
75
|
+
split(): void;
|
|
76
|
+
/** UNION — drive the scalar 1 -> 0 (the SAME loop, reversed; bidirectional). */
|
|
77
|
+
union(): void;
|
|
78
|
+
/** SEEK — scrub the scalar to an arbitrary 0..1 value (the timeline scrubber). */
|
|
79
|
+
seek(value: number): void;
|
|
80
|
+
/** EXPAND — bloom a card FROM a trigger pill (the dock->card materialize). */
|
|
81
|
+
expand(opts: {
|
|
82
|
+
card: Ref<HTMLElement | null>;
|
|
83
|
+
trigger: Ref<HTMLElement | null>;
|
|
84
|
+
}): void;
|
|
85
|
+
/** COLLAPSE — conceal the expanded card back to the pill (the bloom's close). */
|
|
86
|
+
collapse(): void;
|
|
87
|
+
/** The live normalized scalar (0..1) — what `--liquid-morph-t` reads. */
|
|
88
|
+
readonly t: Readonly<Ref<number>>;
|
|
89
|
+
/** Whether a morph is in flight (the host carries `[data-liquid-morphing]`). */
|
|
90
|
+
readonly morphing: Readonly<Ref<boolean>>;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* The generalized liquid-morph driver. See the module header for the REUSE (the
|
|
94
|
+
* cloned dock loop shape + the composed reveal/flex leaves), the arbitrary-angle goo
|
|
95
|
+
* mechanism, and the compositor-only + PRM fences.
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```ts
|
|
99
|
+
* const root = ref<HTMLElement | null>(null)
|
|
100
|
+
* const morph = useLiquidMorph({ rootEl: root, signature: DIRECTED_SPLIT })
|
|
101
|
+
* for (const el of shardRefs) morph.registerPiece({ el, angle: theta.value })
|
|
102
|
+
* // n-ary split at an arbitrary angle:
|
|
103
|
+
* morph.split()
|
|
104
|
+
* // the dock -> card bloom:
|
|
105
|
+
* morph.expand({ card: cardRef, trigger: pillRef })
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
export declare function useLiquidMorph(options: UseLiquidMorphOptions): UseLiquidMorphReturn;
|
|
@@ -30,6 +30,18 @@ export interface UseLiquidPressOptions extends UseSpringPressOptions {
|
|
|
30
30
|
* then yields back to the cascade as it settles). Default 0.001.
|
|
31
31
|
*/
|
|
32
32
|
engageThreshold?: number;
|
|
33
|
+
/**
|
|
34
|
+
* BD.W-MOTION-WEIGHT — the pressed element (the host the consumer binds
|
|
35
|
+
* `pressStyle` on), so the press cap is derived SITE-LOCALLY off the live
|
|
36
|
+
* `--motion-weight` read at THAT element (the spike-corrected mechanism): the
|
|
37
|
+
* shipped `maxStretch` cap at rest weight 0.618 (byte-identical feel), 1.0 at
|
|
38
|
+
* weight 0 (the observer/PRM fence). When omitted, the cap is the static
|
|
39
|
+
* `maxStretch` (the no-element fallback — still correct at rest weight, the
|
|
40
|
+
* universal coupling is just not weight-scaled for that surface). The press is
|
|
41
|
+
* the GENTLE register — a button has no size span, so the weight-coupled cap is a
|
|
42
|
+
* lively settle, never a taffy-pull.
|
|
43
|
+
*/
|
|
44
|
+
el?: Ref<HTMLElement | null>;
|
|
33
45
|
}
|
|
34
46
|
export interface UseLiquidPressReturn {
|
|
35
47
|
/** The live spring press value (0 released → 1 pressed, with the spring overshoot). */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Ref } from "vue";
|
|
1
|
+
import { type ComponentPublicInstance, type Ref } from "vue";
|
|
2
2
|
import { type SpringPresetName } from "./springPresets";
|
|
3
3
|
/** The reveal spring register — `snappy` (the quick app-open default) or `bouncy`
|
|
4
4
|
* (the emphatic large-dialog bloom). A subset of the named `SPRING_PRESETS` rows. */
|
|
@@ -6,11 +6,14 @@ export type LiquidRevealPreset = Extract<SpringPresetName, "snappy" | "bouncy">;
|
|
|
6
6
|
export interface UseLiquidRevealOptions {
|
|
7
7
|
/**
|
|
8
8
|
* The trigger element the surface blooms FROM — the source rect (the button, the
|
|
9
|
-
* collapsed dock pill).
|
|
9
|
+
* collapsed dock pill). A templateRef to the trigger ELEMENT or to a COMPONENT (e.g.
|
|
10
|
+
* `<Button>`), whose root element is resolved via `.$el` — the binding-verification
|
|
11
|
+
* cure: a `ref` on a component is the public instance (no `getBoundingClientRect`),
|
|
12
|
+
* which silently no-oped the bloom. When null at reveal time, the bloom degrades to a
|
|
10
13
|
* center-anchored scale-from-self (the no-trigger fallback — still spring-clocked,
|
|
11
14
|
* never the flat bezier zoom).
|
|
12
15
|
*/
|
|
13
|
-
trigger?: Ref<HTMLElement | null>;
|
|
16
|
+
trigger?: Ref<HTMLElement | ComponentPublicInstance | null>;
|
|
14
17
|
/** The spring register (default `snappy`). */
|
|
15
18
|
preset?: LiquidRevealPreset;
|
|
16
19
|
/** The starting backdrop-blur radius in px (the decongest start). Default 4. */
|
|
@@ -48,4 +51,4 @@ export interface UseLiquidRevealReturn {
|
|
|
48
51
|
* watch(open, (o) => (o ? reveal() : conceal()))
|
|
49
52
|
* ```
|
|
50
53
|
*/
|
|
51
|
-
export declare function useLiquidReveal(surface: Ref<HTMLElement | null>, options?: UseLiquidRevealOptions): UseLiquidRevealReturn;
|
|
54
|
+
export declare function useLiquidReveal(surface: Ref<HTMLElement | ComponentPublicInstance | null>, options?: UseLiquidRevealOptions): UseLiquidRevealReturn;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { type MaybeRef, type Ref } from "vue";
|
|
2
|
+
/** The five motion VECTORS a signature selects (geometry/motion, never an app name). */
|
|
3
|
+
export type MorphVector = "lateral" | "radial" | "inward" | "axial" | "directed";
|
|
4
|
+
/** The render TIER a morph resolves to (the caps ladder). */
|
|
5
|
+
export type MorphTier = "css" | "svg-goo" | "gpu";
|
|
6
|
+
/** The silhouette a body presents. `capture` = sample its clip-path → SDF (Tier-G, the
|
|
7
|
+
* arbitrary-outline element→element morph — HARD-gated on useElementBloom). */
|
|
8
|
+
export type MorphSilhouette = "circle" | "squircle" | "capture";
|
|
9
|
+
/** A measured rectangle (the body endpoints; left/top/width/height in host-local px). */
|
|
10
|
+
export interface MorphFieldRect {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
width: number;
|
|
14
|
+
height: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The motion SIGNATURE — DATA, the only thing that distinguishes the morphs. `vector`
|
|
18
|
+
* picks the geometry; `kRest`/`kPeak` are gap-FRACTIONS (not px) the threshold band
|
|
19
|
+
* scales by; `neckHold` is how long the neck holds before it pinches; `maxStretch` the
|
|
20
|
+
* LOW squish cap (the anti-taffy fence).
|
|
21
|
+
*/
|
|
22
|
+
export interface MorphSignature {
|
|
23
|
+
vector: MorphVector;
|
|
24
|
+
/** The neck-gap fraction at REST (bodies apart) — the threshold band floor. */
|
|
25
|
+
kRest: number;
|
|
26
|
+
/** The neck-gap fraction at the PEAK (bodies near, the gooey waist) — the band ceiling. */
|
|
27
|
+
kPeak: number;
|
|
28
|
+
/** How long (0..1 of t) the neck HOLDS its girth before it pinches (the tense pop). */
|
|
29
|
+
neckHold: number;
|
|
30
|
+
/** The LOW on-axis squish cap (≤~1.14 — the loud register lives in NECK girth, not body taffy). */
|
|
31
|
+
maxStretch: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The canonical, motion-named SIGNATURE map (DATA — F3, the FLOOR). Every consumer
|
|
35
|
+
* passes a `MorphSignatureName`; one weld reads the row; one recipe paints it. NO app
|
|
36
|
+
* names, NO three code paths.
|
|
37
|
+
*/
|
|
38
|
+
export declare const MORPH_SIGNATURES: {
|
|
39
|
+
/** carousel / deck / pager goo: two equal beads bud apart, a concave neck wells, the
|
|
40
|
+
* filter merges them into one barbell with a thin pinched waist, then they coalesce. */
|
|
41
|
+
readonly lateralNeck: {
|
|
42
|
+
readonly vector: "lateral";
|
|
43
|
+
readonly kRest: 0.92;
|
|
44
|
+
readonly kPeak: 0.34;
|
|
45
|
+
readonly neckHold: 0.5;
|
|
46
|
+
readonly maxStretch: 1.12;
|
|
47
|
+
};
|
|
48
|
+
/** dock fission media: the now-playing anchor stays; flanking transport PEELS along
|
|
49
|
+
* the cross axis with a long tapering neck tail. */
|
|
50
|
+
readonly lateralPeel: {
|
|
51
|
+
readonly vector: "lateral";
|
|
52
|
+
readonly kRest: 0.88;
|
|
53
|
+
readonly kPeak: 0.4;
|
|
54
|
+
readonly neckHold: 0.4;
|
|
55
|
+
readonly maxStretch: 1.08;
|
|
56
|
+
};
|
|
57
|
+
/** dock fission search: controls fly outward like a bloom; the neck NECKS LATE (the
|
|
58
|
+
* tense radial pop), innermost-first — an outward ripple, not a simultaneous scatter. */
|
|
59
|
+
readonly radialBurst: {
|
|
60
|
+
readonly vector: "radial";
|
|
61
|
+
readonly kRest: 0.85;
|
|
62
|
+
readonly kPeak: 0.3;
|
|
63
|
+
readonly neckHold: 0.55;
|
|
64
|
+
readonly maxStretch: 1.08;
|
|
65
|
+
};
|
|
66
|
+
/** dock fission nav: the negative radial — N masses collapse INWARD to ONE; the bridge
|
|
67
|
+
* runs backward; --stretch peaks at coalescence. */
|
|
68
|
+
readonly inwardMerge: {
|
|
69
|
+
readonly vector: "inward";
|
|
70
|
+
readonly kRest: 0.8;
|
|
71
|
+
readonly kPeak: 0.28;
|
|
72
|
+
readonly neckHold: 0.35;
|
|
73
|
+
readonly maxStretch: 1.1;
|
|
74
|
+
};
|
|
75
|
+
/** dock V↔H: column-mass + row-mass are two distributions in ONE topology-free field;
|
|
76
|
+
* a gooey teardrop LOBS column→row through the midpoint (no crossfade dodge). */
|
|
77
|
+
readonly axialNeck: {
|
|
78
|
+
readonly vector: "axial";
|
|
79
|
+
readonly kRest: 0.9;
|
|
80
|
+
readonly kPeak: 0.36;
|
|
81
|
+
readonly neckHold: 0.5;
|
|
82
|
+
readonly maxStretch: 1.14;
|
|
83
|
+
};
|
|
84
|
+
/** dock collapse: the DEGENERATE 1-body field — a single mass squishes between two
|
|
85
|
+
* footprints (no waist, Tier-C). The ratio-free convex blend. */
|
|
86
|
+
readonly collapse: {
|
|
87
|
+
readonly vector: "axial";
|
|
88
|
+
readonly kRest: 1;
|
|
89
|
+
readonly kPeak: 1;
|
|
90
|
+
readonly neckHold: 0;
|
|
91
|
+
readonly maxStretch: 1.14;
|
|
92
|
+
};
|
|
93
|
+
/** drag morph: a grabbed rect → drop rect, an optional directed neck. */
|
|
94
|
+
readonly directed: {
|
|
95
|
+
readonly vector: "directed";
|
|
96
|
+
readonly kRest: 0.9;
|
|
97
|
+
readonly kPeak: 0.42;
|
|
98
|
+
readonly neckHold: 0.45;
|
|
99
|
+
readonly maxStretch: 1.1;
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
export type MorphSignatureName = keyof typeof MORPH_SIGNATURES;
|
|
103
|
+
/** A warm "body" the field welds — a measured endpoint pair + an optional silhouette. */
|
|
104
|
+
export interface BodySpec {
|
|
105
|
+
/** The DOM node this body IS (the weld writes its transform). */
|
|
106
|
+
el: Ref<HTMLElement | null>;
|
|
107
|
+
/** The body's REST rect (t=0), measured ONCE (dock-core: no per-frame measure). */
|
|
108
|
+
at0: () => MorphFieldRect;
|
|
109
|
+
/** The body's TARGET rect (t=1), measured ONCE. */
|
|
110
|
+
at1: () => MorphFieldRect;
|
|
111
|
+
/** The body diameter (px). Default `min(width,height)/φ` — a golden-minor BLOB. */
|
|
112
|
+
radius?: () => number;
|
|
113
|
+
/** circle (default) / squircle / capture (arbitrary outline → Tier-G, HARD-gated). */
|
|
114
|
+
silhouette?: MorphSilhouette;
|
|
115
|
+
}
|
|
116
|
+
export interface MorphFieldOptions {
|
|
117
|
+
/** 1..N warm masses. 1 body = collapse (no weld); 2 = a neck; (1+N) = fission. */
|
|
118
|
+
bodies: MaybeRef<BodySpec[]>;
|
|
119
|
+
/** The motion signature NAME (DATA). The weld reads its row from MORPH_SIGNATURES. */
|
|
120
|
+
signature: MorphSignatureName;
|
|
121
|
+
/**
|
|
122
|
+
* The EXISTING drive scalar this weld READS off the host (NO rename). Default
|
|
123
|
+
* `--goo-t`; dock passes `--dock-morph-t`, fission `--neck-t`. The consumer's
|
|
124
|
+
* spring/rAF writes it; the weld only samples + projects.
|
|
125
|
+
*/
|
|
126
|
+
driveVar?: string;
|
|
127
|
+
/** The host the drive scalar + the dedicated squish channel are read/written on. */
|
|
128
|
+
hostRef: Ref<HTMLElement | null>;
|
|
129
|
+
/** The cartoon-weight scalar source. Read live off the host `--motion-weight` if absent. */
|
|
130
|
+
weight?: MaybeRef<number>;
|
|
131
|
+
/** The render tier. `auto` (default) resolves from caps + body count + signature. */
|
|
132
|
+
tier?: MorphTier | "auto";
|
|
133
|
+
/** Travel axis for the neck span. `false` (default) horizontal, `true` vertical. */
|
|
134
|
+
vertical?: MaybeRef<boolean>;
|
|
135
|
+
}
|
|
136
|
+
export interface MorphFieldHandle {
|
|
137
|
+
/** Mirror of the consumer's drive scalar (last sampled). Read-only. */
|
|
138
|
+
readonly t: Readonly<Ref<number>>;
|
|
139
|
+
/** The neck waist FRACTION (waist/body) at the current frame — for π readback. */
|
|
140
|
+
readonly waist: Readonly<Ref<number>>;
|
|
141
|
+
/** The resolved render tier. */
|
|
142
|
+
readonly tier: Readonly<Ref<MorphTier>>;
|
|
143
|
+
/**
|
|
144
|
+
* PROJECT the field for an explicit drive value `t` (0..1). Reads the masses'
|
|
145
|
+
* measured endpoints + the signature, writes each body's transform + the welling
|
|
146
|
+
* neck + the dedicated squish channel + the live waist. The consumer calls this from
|
|
147
|
+
* its OWN rAF/spring callback (the weld owns no clock).
|
|
148
|
+
*/
|
|
149
|
+
project(t: number): void;
|
|
150
|
+
/**
|
|
151
|
+
* SEAT the endpoint silhouette at `t` with ZERO neck frames (the PRM cut / first
|
|
152
|
+
* paint). One resting mass at the endpoint, neck hidden, --stretch 1. The consumer's
|
|
153
|
+
* PRM branch calls this.
|
|
154
|
+
*/
|
|
155
|
+
seat(t: number): void;
|
|
156
|
+
}
|
|
157
|
+
export declare function useMorphField(opts: MorphFieldOptions): MorphFieldHandle;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type MaybeRefOrGetter, type Ref } from "vue";
|
|
2
|
+
import type { ComponentPublicInstance } from "vue";
|
|
3
|
+
import type { ScrollSource } from "./scrollReader";
|
|
4
|
+
export interface UseScrollPinOptions {
|
|
5
|
+
/**
|
|
6
|
+
* The tall `.scroll-pin` container (a templateRef to the element or a component). Its
|
|
7
|
+
* `getBoundingClientRect` gives the pin-slice ratio; `--pin-t` is written onto it (it
|
|
8
|
+
* `inherits: true` so the sticky stage + phase children read it).
|
|
9
|
+
*/
|
|
10
|
+
container: MaybeRefOrGetter<HTMLElement | ComponentPublicInstance | null>;
|
|
11
|
+
/**
|
|
12
|
+
* The scroll source the pin tracks — the demo passes `main.demo-main-scroller`. Passed
|
|
13
|
+
* EXPLICITLY (the reader does not auto-discover). Default: the window/document.
|
|
14
|
+
*/
|
|
15
|
+
source?: MaybeRefOrGetter<ScrollSource>;
|
|
16
|
+
/**
|
|
17
|
+
* The pin scrub ∈ [0, 1] — the pin drifts HEAVIER than a control (a scene, not a knob).
|
|
18
|
+
* Defaults to 1/φ² ≈ 0.382 (the golden heavier-drift rest). PRM → 0.
|
|
19
|
+
*/
|
|
20
|
+
scrub?: number;
|
|
21
|
+
/** The spring damping ratio ζ for the felt reveal. < 1 overshoots. Default 0.85. */
|
|
22
|
+
dampingFraction?: number;
|
|
23
|
+
/** Honor `prefers-reduced-motion: reduce`. Default true. */
|
|
24
|
+
respectReducedMotion?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface UseScrollPinReturn {
|
|
27
|
+
/** The spring-damped 0..1 pin progress (reactive — mirrors `--pin-t`). */
|
|
28
|
+
pinT: Readonly<Ref<number>>;
|
|
29
|
+
/** Force a re-read (post-resize). */
|
|
30
|
+
recalculate: () => void;
|
|
31
|
+
/** Detach. */
|
|
32
|
+
dispose: () => void;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Drive `--pin-t` ∈ [0, 1] onto a sticky `.scroll-pin` stage off the real scroll port,
|
|
36
|
+
* spring-damped so the pinned reveal arrives with inertia, overshoots, then settles. The
|
|
37
|
+
* phase recipes (`.scroll-pin-phase-reveal` / `-settle`) read `--pin-t` — no
|
|
38
|
+
* `animation-timeline`, every engine.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* const pinContainer = ref<HTMLElement | null>(null)
|
|
43
|
+
* useScrollPin({
|
|
44
|
+
* container: pinContainer,
|
|
45
|
+
* source: () => document.querySelector<HTMLElement>("main.demo-main-scroller"),
|
|
46
|
+
* })
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare function useScrollPin(options: UseScrollPinOptions): UseScrollPinReturn;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { type MaybeRefOrGetter, type Ref } from "vue";
|
|
2
|
+
import { type ScrollReader, type ScrollSource } from "./scrollReader";
|
|
3
|
+
/** The smoother register — a pure-lag low-pass (`SmoothProgress`) or an overshooting
|
|
4
|
+
* spring (`SpringProgress`). The FELT reveal wants the spring (it overshoots, then
|
|
5
|
+
* settles — the cartoon slam); the pure-lag legs (a progress number) want the smooth. */
|
|
6
|
+
export type ScrollSceneRegister = "smooth" | "spring";
|
|
7
|
+
export interface UseScrollSceneOptions {
|
|
8
|
+
/**
|
|
9
|
+
* The scroll source — an element with its own scroll port (the demo passes
|
|
10
|
+
* `main.demo-main-scroller`), the Window, or null. Resolved by `createScrollReader`:
|
|
11
|
+
* an HTMLElement listens on itself, else the document/window. Passed EXPLICITLY (the
|
|
12
|
+
* reader does NOT auto-discover a scroller).
|
|
13
|
+
*/
|
|
14
|
+
source: MaybeRefOrGetter<ScrollSource>;
|
|
15
|
+
/**
|
|
16
|
+
* Map a fresh reader read to the raw 0..1 target this scene tracks. Default: the
|
|
17
|
+
* reader's own `position()/extent()` extent-relative progress. A pin passes a custom
|
|
18
|
+
* mapper keyed off a per-tick `getBoundingClientRect` (the pin-slice ratio).
|
|
19
|
+
*/
|
|
20
|
+
map?: (reader: ScrollReader) => number;
|
|
21
|
+
/**
|
|
22
|
+
* The liquid-weight scrub ∈ [0, 1] — how much lag the scroll carries. 0 = a 1:1 snap
|
|
23
|
+
* (no weight); higher = heavier drift. Defaults to 1/φ ≈ 0.618 (the golden
|
|
24
|
+
* liquid-weight rest); a call site overrides per scene. PRM → 0. Mapped to the engine
|
|
25
|
+
* damping by `scrubToDamping` (a STATED function, no magic affine constants).
|
|
26
|
+
*/
|
|
27
|
+
scrub?: number;
|
|
28
|
+
/** The smoother register (default `smooth` — the pure-lag low-pass). */
|
|
29
|
+
register?: ScrollSceneRegister;
|
|
30
|
+
/**
|
|
31
|
+
* For the `spring` register: the damping ratio ζ. < 1 overshoots (the felt slam),
|
|
32
|
+
* 0.85 ≈ the `--spring-gentle` identity. Default 0.85. Ignored for `smooth`.
|
|
33
|
+
*/
|
|
34
|
+
dampingFraction?: number;
|
|
35
|
+
/** The element the damped value is written onto as a custom property (when bound). */
|
|
36
|
+
bindEl?: MaybeRefOrGetter<HTMLElement | null>;
|
|
37
|
+
/** The custom property name to write the damped 0..1 onto (e.g. `--pin-t`). */
|
|
38
|
+
property?: string;
|
|
39
|
+
/** Honor `prefers-reduced-motion: reduce` (scrub → 0, snap 1:1). Default true. */
|
|
40
|
+
respectReducedMotion?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface UseScrollSceneReturn {
|
|
43
|
+
/** The spring-damped 0..1 progress (reactive). The single writer of every felt axis. */
|
|
44
|
+
progress: Readonly<Ref<number>>;
|
|
45
|
+
/** Force a coalesced re-read + re-target now (post-resize / layout shift). */
|
|
46
|
+
recalculate: () => void;
|
|
47
|
+
/** Detach the reader + stop the smoother. */
|
|
48
|
+
dispose: () => void;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The liquid-weight scroll spine. Composes the ONE `createScrollReader` + a keyframes.js
|
|
52
|
+
* smoother (`SmoothProgress` / `SpringProgress`); on each coalesced scroll tick it sets the
|
|
53
|
+
* smoother target to the mapped raw progress; the smoother converges with inertia and keeps
|
|
54
|
+
* moving after scroll stops (the liquid weight). Writes the damped 0..1 to `progress` + the
|
|
55
|
+
* optional `property` on `bindEl`.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* const { progress } = useScrollScene({
|
|
60
|
+
* source: () => document.querySelector<HTMLElement>("main.demo-main-scroller"),
|
|
61
|
+
* scrub: 0.618,
|
|
62
|
+
* bindEl: stageRef,
|
|
63
|
+
* property: "--scroll-t",
|
|
64
|
+
* })
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function useScrollScene(options: UseScrollSceneOptions): UseScrollSceneReturn;
|