@mkbabb/glass-ui 3.13.0 → 4.0.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 +3 -1
- package/dist/CardAction-CW7a0m8M.js +253 -0
- package/dist/{CommandShortcut-RowNEO6i.js → CommandShortcut-DvZNQ_HF.js} +58 -53
- package/dist/ConfiguratorRow-BR4l-ixA.js +143 -0
- package/dist/{ContextMenuContent-CT3AS1WX.js → ContextMenuContent-uWnVxDab.js} +1 -1
- package/dist/{ContextMenuSubContent-BQmxTAdw.js → ContextMenuSubContent-xol4sD2q.js} +32 -37
- package/dist/{DataTable-BCddn3T3.js → DataTable-CuKwF7wr.js} +99 -97
- package/dist/DialogContent-DcKK8k9i.js +103 -0
- package/dist/{DialogFooter-Blu4t7tJ.js → DialogFooter-BZNX5aVr.js} +3 -3
- package/dist/FadingScroll-DI6hQhT9.js +76 -0
- package/dist/{HoverCardContent-Csywg3YF.js → HoverCardContent-b2uaAMRR.js} +1 -1
- package/dist/{HoverPopover-CISOJQuZ.js → HoverPopover-CbqbNwgU.js} +2 -2
- package/dist/IconChip-BTD-nay5.js +55 -0
- package/dist/{IconTooltip-DPzE09X9.js → IconTooltip-Bl8gFZ8d.js} +1 -1
- package/dist/{Input-DWQQIOC4.js → Input-h9v5LeXf.js} +1 -1
- package/dist/{MetricBadge-C9QMz1KT.js → MetricBadge-RHdBP72w.js} +1 -1
- package/dist/Notification-VUwexFUf.js +43 -0
- package/dist/NumberFieldContent-Cq7EzX-U.js +138 -0
- package/dist/PopoverContent-DL7E6vJP.js +127 -0
- package/dist/{Progress-DwlUKGbr.js → Progress-DctG61iZ.js} +98 -78
- package/dist/{ScrollingText-DfFrwSph.js → ScrollingText-yOpBzFYq.js} +2 -2
- package/dist/{SelectScrollDownButton-CiDUxfEj.js → SelectScrollDownButton-CrA8F0iV.js} +35 -20
- package/dist/{Switch-CsIuYP_e.js → Switch-CwYNf8bo.js} +1 -1
- package/dist/Toaster-Bw4xR8xV.js +274 -0
- package/dist/{ToggleGroupItem-D_AHlRw9.js → ToggleGroupItem-pEM9vIhs.js} +50 -37
- package/dist/{TooltipProvider-B3MkB_8P.js → TooltipProvider-rzvnXz60.js} +1 -1
- package/dist/animated-digit.js +2 -2
- package/dist/api/index.d.ts +16 -8
- package/dist/api/types-extra.d.ts +6 -0
- package/dist/api.js +2 -2
- package/dist/aurora.js +888 -230
- package/dist/badge.js +1 -1
- package/dist/border-progress.d.ts +1 -0
- package/dist/border-progress.js +106 -0
- package/dist/button-DYCUa-tH.js +126 -0
- package/dist/button.js +1 -1
- package/dist/canvas.js +2 -2
- package/dist/card.js +2 -2
- package/dist/carousel.d.ts +1 -1
- package/dist/carousel.js +90 -151
- package/dist/collapsible.js +1 -1
- package/dist/color-swatch.d.ts +1 -0
- package/dist/color-swatch.js +47 -0
- package/dist/color.js +1 -1
- package/dist/command.js +1 -1
- package/dist/compile-CQEFRTmx.js +19 -0
- package/dist/components/custom/aurora/composables/atoms-fields.d.ts +39 -0
- package/dist/components/custom/aurora/composables/auroraFallbackGround.d.ts +108 -0
- package/dist/components/custom/aurora/composables/runtime.d.ts +19 -0
- package/dist/components/custom/aurora/composables/uniformBridge.d.ts +5 -1
- package/dist/components/custom/aurora/composables/uniformBridgeWGPU.d.ts +51 -0
- package/dist/components/custom/aurora/composables/wgpuSetup.d.ts +29 -0
- package/dist/components/custom/aurora/constants/budget.d.ts +21 -0
- package/dist/components/custom/aurora/constants/presets.d.ts +30 -2
- package/dist/components/custom/aurora/constants/renderMode.d.ts +63 -10
- package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +1 -0
- package/dist/components/custom/aurora/constants/shaders/oil-modes.glsl.d.ts +1 -0
- package/dist/components/custom/aurora/constants/shaders/procedural-color.wgsl.d.ts +4 -0
- package/dist/components/custom/aurora/index.d.ts +3 -2
- package/dist/components/custom/border-progress/BorderProgress.vue.d.ts +46 -0
- package/dist/components/custom/border-progress/composables/useBorderSpectrum.d.ts +22 -0
- package/dist/components/custom/border-progress/constants.d.ts +59 -0
- package/dist/components/custom/border-progress/index.d.ts +4 -0
- package/dist/components/custom/color-swatch/ColorSwatch.vue.d.ts +22 -0
- package/dist/components/custom/color-swatch/index.d.ts +1 -0
- package/dist/components/custom/concentric/Concentric.vue.d.ts +39 -0
- package/dist/components/custom/concentric/composables/concentricGLSetup.d.ts +11 -0
- package/dist/components/custom/concentric/composables/concentricWGPUSetup.d.ts +13 -0
- package/dist/components/custom/concentric/composables/ringField.d.ts +44 -0
- package/dist/components/custom/concentric/composables/uniformBridgeWGPU.d.ts +13 -0
- package/dist/components/custom/concentric/composables/useConcentric.d.ts +35 -0
- package/dist/components/custom/concentric/constants.d.ts +43 -0
- package/dist/components/custom/concentric/index.d.ts +5 -0
- package/dist/components/custom/concentric/shaders/concentric.glsl.d.ts +4 -0
- package/dist/components/custom/concentric/shaders/concentric.wgsl.d.ts +1 -0
- package/dist/components/custom/configurator/Configurator.vue.d.ts +19 -8
- package/dist/components/custom/constellation/Constellation.vue.d.ts +18 -206
- package/dist/components/custom/constellation/composables/useConstellation.d.ts +26 -0
- package/dist/components/custom/constellation/constellationField.d.ts +2 -369
- package/dist/components/custom/constellation/constellationTypes.d.ts +369 -0
- package/dist/components/custom/constellation/index.d.ts +1 -1
- package/dist/components/custom/dock/DockIconButton.vue.d.ts +13 -4
- package/dist/components/custom/dock/DockLayerGroup.vue.d.ts +10 -2
- package/dist/components/custom/dock/DockRail.vue.d.ts +17 -16
- package/dist/components/custom/dock/DockSection.vue.d.ts +69 -0
- package/dist/components/custom/dock/DockSeparator.vue.d.ts +49 -1
- package/dist/components/custom/dock/DockTabButton.vue.d.ts +5 -5
- package/dist/components/custom/dock/composables/dockMorphMeasure.d.ts +75 -0
- package/dist/components/custom/dock/composables/useLayerTransition.d.ts +13 -0
- package/dist/components/custom/dock/constants.d.ts +35 -0
- package/dist/components/custom/dock/index.d.ts +2 -0
- package/dist/components/custom/dot-flow-field/DotFlowField.vue.d.ts +38 -0
- package/dist/components/custom/dot-flow-field/composables/flowField.d.ts +41 -0
- package/dist/components/custom/dot-flow-field/composables/uniformBridgeWGPU.d.ts +24 -0
- package/dist/components/custom/dot-flow-field/composables/useDotFlowField.d.ts +34 -0
- package/dist/components/custom/dot-flow-field/composables/useFlowParticles.d.ts +18 -0
- package/dist/components/custom/dot-flow-field/constants.d.ts +48 -0
- package/dist/components/custom/dot-flow-field/index.d.ts +5 -0
- package/dist/components/custom/dot-flow-field/shaders/flow-field.compute.wgsl.d.ts +1 -0
- package/dist/components/custom/dot-flow-field/shaders/flow-field.glsl.d.ts +20 -0
- package/dist/components/custom/dot-flow-field/shaders/flow-field.render.wgsl.d.ts +1 -0
- package/dist/components/custom/easing/EasingConfigurator.vue.d.ts +33 -0
- package/dist/components/custom/easing/EasingPicker.vue.d.ts +49 -0
- package/dist/components/custom/easing/composables/useEasingPicker.d.ts +75 -0
- package/dist/components/custom/easing/constants.d.ts +28 -0
- package/dist/components/custom/easing/index.d.ts +3 -0
- package/dist/components/custom/expandable-container/ExpandableContainer.vue.d.ts +10 -0
- package/dist/components/custom/fading-scroll/FadingScroll.vue.d.ts +25 -0
- package/dist/components/custom/fading-scroll/composables/useFadingScroll.d.ts +31 -0
- package/dist/components/custom/fading-scroll/constants.d.ts +19 -0
- package/dist/components/custom/fading-scroll/index.d.ts +2 -0
- package/dist/components/custom/fourier-field/FourierField.vue.d.ts +19 -2
- package/dist/components/custom/fourier-field/composables/useFourierField.d.ts +39 -0
- package/dist/components/custom/fourier-field/constants.d.ts +7 -0
- package/dist/components/custom/fourier-field/index.d.ts +1 -1
- package/dist/components/custom/fourier-field/math.d.ts +17 -0
- package/dist/components/custom/glass-panel/GlassPanel.vue.d.ts +9 -1
- package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +4 -2
- package/dist/components/custom/goo-blob/composables/uniformBridgeWGPU.d.ts +24 -0
- package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +29 -12
- package/dist/components/custom/goo-blob/composables/wgpuSetup.d.ts +23 -0
- package/dist/components/custom/goo-blob/constants.d.ts +6 -1
- package/dist/components/custom/goo-blob/shaders/metaball.wgsl.d.ts +1 -0
- package/dist/components/custom/handmark/HandMark.vue.d.ts +29 -0
- package/dist/components/custom/handmark/brush.d.ts +269 -0
- package/dist/components/custom/handmark/composables/useHandMark.d.ts +89 -0
- package/dist/components/custom/handmark/constants.d.ts +39 -0
- package/dist/components/custom/handmark/freehand.d.ts +69 -0
- package/dist/components/custom/handmark/geometry.d.ts +52 -0
- package/dist/components/custom/handmark/index.d.ts +27 -0
- package/dist/components/custom/handmark/ink.d.ts +11 -0
- package/dist/components/custom/handmark/texture.d.ts +39 -0
- package/dist/components/custom/handmark/types.d.ts +62 -0
- package/dist/components/custom/icon-chip/IconChip.vue.d.ts +4 -0
- package/dist/components/custom/icon-chip/index.d.ts +2 -0
- package/dist/components/custom/icon-chip/types.d.ts +82 -0
- package/dist/components/custom/instrument-chassis/InstrumentChassis.vue.d.ts +17 -2
- package/dist/components/custom/metric-stack/MetricStack.vue.d.ts +1 -1
- package/dist/components/custom/pager-dots/PagerDots.vue.d.ts +39 -0
- package/dist/components/custom/pager-dots/index.d.ts +2 -0
- package/dist/components/custom/spa-view/SpaView.vue.d.ts +50 -0
- package/dist/components/custom/spa-view/index.d.ts +2 -0
- package/dist/components/custom/tabs/SegmentedTabs.vue.d.ts +29 -24
- package/dist/components/custom/tabs/composables/useTabDragMorph.d.ts +42 -0
- package/dist/components/custom/tabs/composables/useTabIndicator.d.ts +30 -21
- package/dist/components/custom/tabs/constants.d.ts +9 -3
- package/dist/components/custom/tabs/index.d.ts +1 -1
- package/dist/components/custom/watercolor-dot/WatercolorDot.vue.d.ts +15 -1
- package/dist/components/ui/_shared/index.d.ts +2 -0
- package/dist/components/ui/_shared/menuItemVariants.d.ts +19 -0
- package/dist/components/ui/_shared/useSurfaceAxis.d.ts +41 -0
- package/dist/components/ui/badge/index.d.ts +1 -1
- package/dist/components/ui/button/Button.vue.d.ts +5 -2
- package/dist/components/ui/button/index.d.ts +2 -2
- package/dist/components/ui/card/Card.vue.d.ts +34 -4
- package/dist/components/ui/card/CardHeader.vue.d.ts +42 -16
- package/dist/components/ui/card/ScrollCard.vue.d.ts +33 -0
- package/dist/components/ui/card/ScrollCardHeader.vue.d.ts +17 -0
- package/dist/components/ui/card/index.d.ts +2 -0
- package/dist/components/ui/carousel/CarouselNext.vue.d.ts +2 -2
- package/dist/components/ui/carousel/CarouselPrevious.vue.d.ts +2 -2
- package/dist/components/ui/carousel/GlassCarouselPager.vue.d.ts +2 -2
- package/dist/components/ui/carousel/index.d.ts +0 -1
- package/dist/components/ui/command/Command.vue.d.ts +4 -1
- package/dist/components/ui/dialog/DialogContent.vue.d.ts +8 -3
- package/dist/components/ui/drawer/Drawer.vue.d.ts +46 -33
- package/dist/components/ui/drawer/DrawerContent.vue.d.ts +12 -8
- package/dist/components/ui/drawer/DrawerDescription.vue.d.ts +2 -2
- package/dist/components/ui/drawer/DrawerOverlay.vue.d.ts +1 -1
- package/dist/components/ui/drawer/DrawerTitle.vue.d.ts +2 -2
- package/dist/components/ui/drawer/composables/drawerSnapContext.d.ts +26 -0
- package/dist/components/ui/drawer/composables/useDrawerSnap.d.ts +17 -0
- package/dist/components/ui/drawer/constants.d.ts +45 -0
- package/dist/components/ui/drawer/index.d.ts +23 -15
- package/dist/components/ui/focus-scope/FocusScope.vue.d.ts +20 -0
- package/dist/components/ui/focus-scope/index.d.ts +2 -0
- package/dist/components/ui/index.d.ts +1 -1
- package/dist/components/ui/popover/PopoverContent.vue.d.ts +3 -0
- package/dist/components/ui/progress/ProgressDefault.vue.d.ts +3 -2
- package/dist/components/ui/progress/ProgressSectioned.vue.d.ts +14 -3
- package/dist/components/ui/select/SelectContent.vue.d.ts +1 -1
- package/dist/components/ui/select/SelectTrigger.vue.d.ts +27 -4
- package/dist/components/ui/sheet/SheetContent.vue.d.ts +6 -0
- package/dist/components/ui/sheet/index.d.ts +1 -1
- package/dist/components/ui/skeleton/Skeleton.vue.d.ts +3 -0
- package/dist/components/ui/tags-input/TagsInput.vue.d.ts +2 -2
- package/dist/components/ui/toast/Toast.vue.d.ts +5 -2
- package/dist/components/ui/toast/use-toast.d.ts +14 -0
- package/dist/components/ui/toggle/Toggle.vue.d.ts +1 -1
- package/dist/composables/dark/index.d.ts +1 -1
- package/dist/composables/dark/useGlobalDark.d.ts +23 -1
- package/dist/composables/glass/canvas2d/useCanvas2D.d.ts +13 -6
- package/dist/composables/glass/index.d.ts +5 -2
- package/dist/composables/glass/useSpecularPointer.d.ts +33 -0
- package/dist/composables/glass/useSpecularTracking.d.ts +20 -0
- package/dist/composables/glass/vSpecular.d.ts +2 -0
- package/dist/composables/glass/webgl/shaders/flow.glsl.d.ts +1 -0
- package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +16 -0
- package/dist/composables/glass/webgpu/index.d.ts +2 -0
- package/dist/composables/glass/webgpu/useGpuSubstrate.d.ts +54 -0
- package/dist/composables/glass/webgpu/useWebGPUCanvas.d.ts +84 -0
- package/dist/composables/motion/core/index.d.ts +1 -0
- package/dist/composables/motion/index.d.ts +4 -0
- package/dist/composables/motion/useDockCtaReceive.d.ts +59 -0
- package/dist/composables/motion/useDragMorph.d.ts +77 -0
- package/dist/composables/motion/useLiquidFlex.d.ts +11 -0
- package/dist/composables/motion/useLiquidPress.d.ts +71 -0
- package/dist/composables/motion/useLiquidReveal.d.ts +51 -0
- package/dist/composables/motion/useNumericTransition.d.ts +3 -3
- package/dist/composables/motion/usePointerVelocityField.d.ts +98 -0
- package/dist/composables/motion/useViewTransition.d.ts +36 -1
- package/dist/concentric.d.ts +1 -0
- package/dist/concentric.js +562 -0
- package/dist/configurator.js +3 -2
- package/dist/confirm-dialog.js +22 -24
- package/dist/constellation.js +93 -95
- package/dist/context-menu.js +3 -3
- package/dist/controls.js +10 -4
- package/dist/createCanvasLifecycle-CHD5XrDW.js +82 -0
- package/dist/dark.d.ts +1 -1
- package/dist/dark.js +1 -1
- package/dist/data-table.js +1 -1
- package/dist/dialog.js +2 -2
- package/dist/dock.js +738 -442
- package/dist/{dockContext-BegmJVmx.js → dockContext-BNfyPLe9.js} +1 -1
- package/dist/dom.js +5 -5
- package/dist/dot-flow-field.d.ts +1 -0
- package/dist/dot-flow-field.js +604 -0
- package/dist/drawer.d.ts +1 -0
- package/dist/drawer.js +380 -0
- package/dist/{dropdown-menu-DzkkyBwX.js → dropdown-menu-CofSZuk8.js} +14 -15
- package/dist/dropdown-menu.js +1 -1
- package/dist/easing.d.ts +1 -0
- package/dist/easing.js +463 -0
- package/dist/expandable-container.js +45 -38
- package/dist/fading-scroll.d.ts +1 -0
- package/dist/fading-scroll.js +2 -0
- package/dist/focus-scope.d.ts +1 -0
- package/dist/focus-scope.js +23 -0
- package/dist/forms.js +7 -7
- package/dist/fourier-field.js +135 -122
- package/dist/fourier-math.js +2 -2
- package/dist/glass-panel.js +39 -36
- package/dist/glass-ui.css +1 -1
- package/dist/glass-ui.js +154 -362
- package/dist/goo-blob.js +838 -227
- package/dist/handmark.d.ts +1 -0
- package/dist/handmark.js +707 -0
- 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.d.ts +1 -0
- package/dist/icon-chip.js +2 -0
- package/dist/icon-tooltip.js +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/instrument-chassis.js +1 -1
- package/dist/keyboard.js +1 -1
- package/dist/label.js +1 -1
- package/dist/labeled-field.js +6 -6
- package/dist/{math-U6-RrLmV.js → math-BINYmg5z.js} +11 -3
- package/dist/{menuItemVariants-DPiEarb0.js → menuItemVariants-D8VNHq22.js} +10 -4
- package/dist/metric-badge.js +1 -1
- package/dist/metric-cell.js +25 -22
- package/dist/metric-stack.js +4 -8
- package/dist/motion-core.js +36 -35
- package/dist/motion-curves.js +1 -1
- package/dist/motion.js +157 -55
- package/dist/notification.js +1 -1
- package/dist/number-field.js +1 -1
- package/dist/pager-dots.d.ts +1 -0
- package/dist/pager-dots.js +91 -0
- package/dist/paper-backdrop.js +1 -1
- package/dist/popover.js +1 -1
- package/dist/{presets-BKVyQfbt.js → presets-BW2b-fr1.js} +14 -1
- package/dist/{compile-B7NGOBcP.js → procedural-color.glsl-CIFsJhwI.js} +1 -155
- package/dist/procedural-color.wgsl-CToRHugY.js +224 -0
- package/dist/progress.js +1 -1
- package/dist/pulse.js +1 -1
- package/dist/reactive.js +2 -2
- package/dist/scrolling-text.js +1 -1
- package/dist/search.js +10 -12
- package/dist/select.js +3 -3
- package/dist/separator.js +1 -1
- package/dist/sheet-tZMg0E0w.js +218 -0
- package/dist/sheet.js +1 -1
- package/dist/{slider-B-JP2JlI.js → slider-DVb4HXU-.js} +7 -7
- package/dist/slider.js +1 -1
- package/dist/sortable-list.js +3 -3
- package/dist/spa-view.d.ts +1 -0
- package/dist/spa-view.js +46 -0
- package/dist/styles/animations.css +40 -31
- package/dist/styles/border-progress.css +109 -0
- package/dist/styles/cards.css +76 -0
- package/dist/styles/components.css +1 -1
- package/dist/styles/configurator.css +35 -0
- package/dist/styles/critical-partition.mjs +140 -0
- package/dist/styles/critical.css +12 -0
- package/dist/styles/deferred.css +31 -0
- package/dist/styles/dock/density.css +64 -0
- package/dist/styles/dock/layers.css +54 -30
- package/dist/styles/dock/morph.css +124 -7
- package/dist/styles/dock/overflow.css +31 -2
- package/dist/styles/dock/rail-extend.css +168 -71
- package/dist/styles/dock/section.css +59 -0
- package/dist/styles/dock/shell.css +83 -16
- package/dist/styles/dock-controls/icon-button.css +11 -1
- package/dist/styles/dock-controls/tab-button.css +24 -83
- package/dist/styles/dock-controls/triggers.css +7 -0
- package/dist/styles/dock.css +38 -3
- package/dist/styles/drawer.css +127 -35
- package/dist/styles/feedback-tone.css +104 -0
- package/dist/styles/glass/deep.css +44 -0
- package/dist/styles/glass/ladder.css +154 -52
- package/dist/styles/glass/material.css +78 -15
- package/dist/styles/glass/reveal.css +136 -0
- package/dist/styles/glass/rim.css +100 -0
- package/dist/styles/glass/surface-axis.css +113 -0
- package/dist/styles/glass/surfaces.css +189 -15
- package/dist/styles/glass-refract.css +96 -44
- package/dist/styles/glass-specular-track.css +7 -0
- package/dist/styles/glass.css +8 -2
- package/dist/styles/hover-popover.css +7 -6
- package/dist/styles/icon-chip.css +211 -0
- package/dist/styles/index.css +78 -4
- package/dist/styles/instrument-chassis.css +107 -2
- package/dist/styles/menu.css +127 -0
- package/dist/styles/scroll-choreography.css +300 -0
- package/dist/styles/segmented-tabs.css +188 -86
- package/dist/styles/select.css +50 -0
- package/dist/styles/theme/bridges.css +22 -1
- package/dist/styles/theme/literals.css +11 -2
- package/dist/styles/theme/radius.css +6 -1
- package/dist/styles/tokens/color-radius.css +40 -13
- package/dist/styles/tokens/dark-arm.css +200 -20
- package/dist/styles/tokens/glass-deep.css +75 -0
- package/dist/styles/tokens/glass-fx.css +333 -0
- package/dist/styles/tokens/glass.css +95 -315
- package/dist/styles/tokens/light-dark.css +64 -22
- package/dist/styles/tokens/offsets.css +116 -0
- package/dist/styles/tokens/on-glass-fg.css +39 -0
- package/dist/styles/tokens/property-regs.css +130 -10
- package/dist/styles/tokens/scale-paper.css +155 -84
- package/dist/styles/tokens/scheme-motion.css +102 -46
- package/dist/styles/tokens/scroll-tokens.css +123 -0
- package/dist/styles/tokens/{offsets-sizing.css → sizing.css} +88 -89
- package/dist/styles/tokens.css +9 -3
- package/dist/styles/transitions.css +7 -7
- package/dist/styles/typography/scale.css +153 -0
- package/dist/styles/typography/semantic.css +220 -0
- package/dist/styles/typography/utilities.css +174 -0
- package/dist/styles/typography.css +23 -507
- package/dist/styles/utilities/a11y-overrides.css +33 -4
- package/dist/styles/utilities/animate.css +27 -24
- package/dist/styles/utilities/base-misc.css +255 -0
- package/dist/styles/utilities/base.css +100 -138
- package/dist/styles/utilities/btn.css +21 -202
- package/dist/styles/utilities/metal.css +189 -0
- package/dist/styles/utilities.css +14 -7
- package/dist/styles/view-transition.css +4 -1
- package/dist/switch.js +1 -1
- package/dist/tabs.js +275 -191
- package/dist/timeline.js +2 -2
- package/dist/toast.js +1 -1
- package/dist/toggle-chip.js +3 -1
- package/dist/toggle-group.js +1 -1
- package/dist/tooltip.js +1 -1
- package/dist/typewriter.js +1 -1
- package/dist/{useAnimatedNumber-C5I3wWd8.js → useAnimatedNumber-BfUq2bUM.js} +1 -1
- package/dist/useCanvas2D-B8w_E3Rr.js +83 -0
- package/dist/useConfiguratorState-DNlOh6c8.js +161 -0
- package/dist/useDragMorph-DgxnsVJz.js +102 -0
- package/dist/{useGlobalDark-yhL4Wp-s.js → useGlobalDark-C28t0VWJ.js} +22 -3
- package/dist/useLiquidPress-kfb4KX79.js +39 -0
- package/dist/usePointerVelocityField-JbRd5CrM.js +137 -0
- package/dist/{useRAFLoop-Bxv0o6L5.js → useRAFLoop-UYa4zoiN.js} +1 -1
- package/dist/useSpring-C0jyvEJB.js +40 -0
- package/dist/useSpringMount-q1amq1SJ.js +71 -0
- package/dist/useSpringPress-BsqPr7FJ.js +34 -0
- package/dist/useSurfaceAxis-g0NloYEF.js +7 -0
- package/dist/{useTouchGate-Dg7MQI1G.js → useTouchGate-CBZTD4SD.js} +1 -1
- package/dist/vReveal-Czsb7zQC.js +10 -0
- package/dist/vSpecular-CQFmLNzA.js +68 -0
- package/dist/vendor-CKmzio-i.js +226 -0
- package/dist/watercolor-dot.js +12 -5
- package/package.json +193 -25
- package/src/styles/animations.css +40 -31
- package/src/styles/border-progress.css +109 -0
- package/src/styles/cards.css +76 -0
- package/src/styles/configurator.css +35 -0
- package/src/styles/critical-partition.mjs +140 -0
- package/src/styles/dock/density.css +64 -0
- package/src/styles/dock/layers.css +54 -30
- package/src/styles/dock/morph.css +124 -7
- package/src/styles/dock/overflow.css +31 -2
- package/src/styles/dock/rail-extend.css +168 -71
- package/src/styles/dock/section.css +59 -0
- package/src/styles/dock/shell.css +83 -16
- package/src/styles/dock-controls/icon-button.css +11 -1
- package/src/styles/dock-controls/tab-button.css +24 -83
- package/src/styles/dock-controls/triggers.css +7 -0
- package/src/styles/dock.css +38 -3
- package/src/styles/drawer.css +123 -35
- package/src/styles/feedback-tone.css +104 -0
- package/src/styles/glass/deep.css +44 -0
- package/src/styles/glass/ladder.css +154 -52
- package/src/styles/glass/material.css +78 -15
- package/src/styles/glass/reveal.css +136 -0
- package/src/styles/glass/rim.css +100 -0
- package/src/styles/glass/surface-axis.css +113 -0
- package/src/styles/glass/surfaces.css +189 -15
- package/src/styles/glass-refract.css +96 -44
- package/src/styles/glass-specular-track.css +7 -0
- package/src/styles/glass.css +8 -2
- package/src/styles/hover-popover.css +7 -6
- package/src/styles/icon-chip.css +211 -0
- package/src/styles/index.css +78 -4
- package/src/styles/instrument-chassis.css +107 -2
- package/src/styles/menu.css +127 -0
- package/src/styles/scroll-choreography.css +300 -0
- package/src/styles/segmented-tabs.css +184 -84
- package/src/styles/select.css +50 -0
- package/src/styles/theme/bridges.css +22 -1
- package/src/styles/theme/literals.css +11 -2
- package/src/styles/theme/radius.css +6 -1
- package/src/styles/tokens/color-radius.css +40 -13
- package/src/styles/tokens/dark-arm.css +200 -20
- package/src/styles/tokens/glass-deep.css +75 -0
- package/src/styles/tokens/glass-fx.css +333 -0
- package/src/styles/tokens/glass.css +95 -315
- package/src/styles/tokens/light-dark.css +64 -22
- package/src/styles/tokens/offsets.css +116 -0
- package/src/styles/tokens/on-glass-fg.css +39 -0
- package/src/styles/tokens/property-regs.css +130 -10
- package/src/styles/tokens/scale-paper.css +155 -84
- package/src/styles/tokens/scheme-motion.css +102 -46
- package/src/styles/tokens/scroll-tokens.css +123 -0
- package/src/styles/tokens/{offsets-sizing.css → sizing.css} +88 -89
- package/src/styles/tokens.css +9 -3
- package/src/styles/transitions.css +7 -7
- package/src/styles/typography/scale.css +153 -0
- package/src/styles/typography/semantic.css +220 -0
- package/src/styles/typography/utilities.css +174 -0
- package/src/styles/typography.css +23 -507
- package/src/styles/utilities/a11y-overrides.css +33 -4
- package/src/styles/utilities/animate.css +27 -24
- package/src/styles/utilities/base-misc.css +255 -0
- package/src/styles/utilities/base.css +100 -138
- package/src/styles/utilities/btn.css +21 -202
- package/src/styles/utilities/metal.css +189 -0
- package/src/styles/utilities.css +14 -7
- package/src/styles/view-transition.css +4 -1
- package/dist/CardAction-Cj2eycQ2.js +0 -157
- package/dist/DialogContent-Dl9WkAoS.js +0 -100
- package/dist/Notification-DdwNxIrI.js +0 -100
- package/dist/NumberFieldContent-CqaN-SvN.js +0 -145
- package/dist/PopoverContent-BYwt2-4x.js +0 -121
- package/dist/TabsList-Dttss653.js +0 -105
- package/dist/Toaster-D6q4HtXu.js +0 -263
- package/dist/button-ChXMfsud.js +0 -81
- package/dist/check-njhk-vfu.js +0 -7
- package/dist/chevron-down-DKkxb4VV.js +0 -7
- package/dist/chevron-right-CPXbqQQz.js +0 -7
- package/dist/chevron-up-n_24SqI-.js +0 -7
- package/dist/components/custom/underline/GlassUnderline.vue.d.ts +0 -84
- package/dist/components/custom/underline/index.d.ts +0 -2
- package/dist/components/custom/underline/types.d.ts +0 -56
- package/dist/components/ui/carousel/CarouselDots.vue.d.ts +0 -4
- package/dist/createLucideIcon-DydS2qgk.js +0 -43
- package/dist/minimize-2-BV31Ob_h.js +0 -38
- package/dist/search-BSGrf2Sk.js +0 -12
- package/dist/sheet-1fChZjtw.js +0 -214
- package/dist/underline.d.ts +0 -1
- package/dist/underline.js +0 -85
- package/dist/useCanvas2D-ClrQuZtp.js +0 -96
- package/dist/useConfiguratorState-DAoeHVue.js +0 -287
- package/dist/useSpecularTracking-Bo5su68i.js +0 -32
- package/dist/useSpringMount-CI2jOstM.js +0 -108
- package/dist/vReveal-CqaCz_mC.js +0 -44
- package/dist/x-BUwTKe50.js +0 -10
- /package/dist/{CollapsibleContent-CP9qF1v4.js → CollapsibleContent-68dEXIAl.js} +0 -0
- /package/dist/{InstrumentChassis-UUJX0-mW.js → InstrumentChassis-Bx0F_q5g.js} +0 -0
- /package/dist/{Label-r3WzWrsj.js → Label-C2ejNWeC.js} +0 -0
- /package/dist/{ModalOverlay-DVLI2VRr.js → ModalOverlay-D1VrWyoi.js} +0 -0
- /package/dist/{PaperBackdrop-DIXTtVq6.js → PaperBackdrop-Vf3tlpvd.js} +0 -0
- /package/dist/{SelectGroup-aumMgWLs.js → SelectGroup-DwwjicPY.js} +0 -0
- /package/dist/{SelectSeparator-BQ_1Fcbp.js → SelectSeparator-DXswVdRz.js} +0 -0
- /package/dist/{Separator-0JE6LtNu.js → Separator-pKF0oA4M.js} +0 -0
- /package/dist/{_plugin-vue_export-helper-ok8pgSl5.js → _plugin-vue_export-helper-C1je1s0u.js} +0 -0
- /package/dist/{badge-UILT_3pZ.js → badge-D9XWW4GT.js} +0 -0
- /package/dist/{color-CUYeFbgd.js → color-DweYl7pE.js} +0 -0
- /package/dist/{constants-CS75AWHG.js → constants-BPOqYJAm.js} +0 -0
- /package/dist/{createContext-BM46COQ-.js → createContext-CpBNTRMI.js} +0 -0
- /package/dist/{prng-D27-B3tK.js → prng-Za0Rmgag.js} +0 -0
- /package/dist/{resolveCanvasColor-BBiYfp8g.js → resolveCanvasColor-CUyHr5Uu.js} +0 -0
- /package/dist/{springPresets--YdWTHtm.js → springPresets-CFQGQfdl.js} +0 -0
- /package/dist/{useIntersectionPause-Cc-H9ees.js → useIntersectionPause-Bj4sPkMh.js} +0 -0
- /package/dist/{useInterval-iHludrxk.js → useInterval-CvK1mL92.js} +0 -0
- /package/dist/{useKeyboardShortcuts-Be3w_Rwk.js → useKeyboardShortcuts-BXWXOZ-9.js} +0 -0
- /package/dist/{useLiquidFlex-BL0lLLN2.js → useLiquidFlex-mZPMiNXh.js} +0 -0
- /package/dist/{useResizeObserver-BhgdhOIj.js → useResizeObserver-Bpoi7tRE.js} +0 -0
- /package/dist/{useResolveTokenColor-Dvn2RZJW.js → useResolveTokenColor-vAylyR0x.js} +0 -0
- /package/dist/{useScrollProgress-Dlvx-L3v.js → useScrollProgress-D7bYU2RK.js} +0 -0
- /package/dist/{useSortable-muI29agz.js → useSortable-DHjtZSEd.js} +0 -0
- /package/dist/{useTextHighlight-DmRYkOBx.js → useTextHighlight-CWEi25hf.js} +0 -0
- /package/dist/{useTimer-Dzarvzuk.js → useTimer-BHJOKr35.js} +0 -0
- /package/dist/{useUserInvalidAria-B2h6jAM_.js → useUserInvalidAria-y5namzeE.js} +0 -0
- /package/dist/{useViewportReady-B40FK4Pa.js → useViewportReady-anbac3m6.js} +0 -0
|
@@ -74,6 +74,28 @@
|
|
|
74
74
|
--phase-color: var(--muted-foreground);
|
|
75
75
|
--phase-color-label: var(--muted-foreground);
|
|
76
76
|
|
|
77
|
+
/* BB.W-PHASE-PALETTE (N18) — the `complete` phase ink is a CONSUMER
|
|
78
|
+
token, not a hardcoded brand metal. The four active phases
|
|
79
|
+
(ping/download/upload/jitter) already read a consumer-registerable
|
|
80
|
+
`--chart-{phase}` with a library `--viz-*` fallback (the bus carries
|
|
81
|
+
phase IDENTITY); `complete` was the one arm that pinned the gold
|
|
82
|
+
directly, so every completion gilded itself the moment the phase
|
|
83
|
+
flipped. `--phase-complete-color` (+ its WCAG-twin
|
|
84
|
+
`--phase-complete-color-label`) DEFAULT to the same gold the arm
|
|
85
|
+
hardcoded — an un-overriding consumer paints byte-identical gold (the
|
|
86
|
+
back-compat floor) — but a consumer (or any ancestor) overrides EITHER
|
|
87
|
+
on its host/preset to re-ink completion (its phase spectrum, an aurora
|
|
88
|
+
register, …), so gold is EARNED (the dock CTA + personal-best
|
|
89
|
+
garnish), never the chassis default leaking onto every completion.
|
|
90
|
+
The default lives at the chassis root (NOT :root/tokens.css) because
|
|
91
|
+
it is a chassis-phase register, scoped to the surface owning the bus —
|
|
92
|
+
the same home `--phase-color`'s idle default occupies above. It reads
|
|
93
|
+
`var(--color-gold)` / `var(--color-gold-dark)` (the existing mode-
|
|
94
|
+
resolved tokens, unedited), so it inherits the SAME .dark / light-dark
|
|
95
|
+
resolution the hardcoded form did. */
|
|
96
|
+
--phase-complete-color: var(--color-gold);
|
|
97
|
+
--phase-complete-color-label: var(--color-gold-dark, var(--color-gold));
|
|
98
|
+
|
|
77
99
|
/* AV.W16 TW3 — inline-size container named `chassis` so the dial reflow
|
|
78
100
|
below reads the chassis's OWN box, not the viewport (portable into a
|
|
79
101
|
narrow host). */
|
|
@@ -150,6 +172,51 @@
|
|
|
150
172
|
display: none;
|
|
151
173
|
}
|
|
152
174
|
|
|
175
|
+
/* ─────────────────────────────────────────────────────────────
|
|
176
|
+
BA.W-ATLAS-RECONCILE C-3 — structure variant (SILVER MILLED-METAL register)
|
|
177
|
+
|
|
178
|
+
The cool polished-steel housing read: the engraved-bezel `::before` stroke
|
|
179
|
+
AND the structural twin-line grooves re-point from the warm-cream
|
|
180
|
+
`--surface-tint-*` default onto the `--silver` quad (gold's cool mirror).
|
|
181
|
+
The chassis reads as an INDUSTRIAL precision-instrument panel — the
|
|
182
|
+
cool-metal twin of the warm-gold "complete"-phase affirmation the chassis
|
|
183
|
+
ships BY DEFAULT (the `--phase-complete-color` consumer token's gold
|
|
184
|
+
default; BB.W-PHASE-PALETTE — a consumer may re-ink completion, but the
|
|
185
|
+
silver register's narration is of the warm-gold completion default).
|
|
186
|
+
|
|
187
|
+
The phase cascade (`[data-phase="…"]`) stays ORTHOGONAL — a `structure`
|
|
188
|
+
chassis still retints its phase fills on `data-phase`; only the
|
|
189
|
+
structure-metal recipe (bezel + grooves) forks here. Consumer #2 of the
|
|
190
|
+
silver quad (the atlas's structure surface is consumer #1).
|
|
191
|
+
|
|
192
|
+
The silver is the W-NO-GRAY NAMED cool-neutral exception (a brand METAL
|
|
193
|
+
identity, not a neutral — its very-low chroma reads as milled steel, the
|
|
194
|
+
cool hue distinguishes it from the warm glass plate).
|
|
195
|
+
───────────────────────────────────────────────────────────── */
|
|
196
|
+
.instrument-chassis[data-variant="structure"] {
|
|
197
|
+
/* The milled-panel edge: the chassis border lifts off the resting glass
|
|
198
|
+
edge onto a hairline silver structure stroke. */
|
|
199
|
+
border-color: color-mix(in oklab, var(--color-silver-dark) 55%, transparent);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/* The engraved bezel re-tints to the cool silver catch (the polished sleeve
|
|
203
|
+
reads as steel, not warm-cream). */
|
|
204
|
+
.instrument-chassis[data-variant="structure"]::before {
|
|
205
|
+
border-color: color-mix(in oklab, var(--color-silver-light) 60%, transparent);
|
|
206
|
+
}
|
|
207
|
+
.dark .instrument-chassis[data-variant="structure"]::before {
|
|
208
|
+
border-color: color-mix(in oklab, var(--color-silver) 40%, transparent);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/* The structural grooves re-point to the silver twin-line: the catch reads
|
|
212
|
+
the light silver, the under-shadow the dark silver — a milled seam, not the
|
|
213
|
+
default warm twin-line. ONE re-point at the variant root; every
|
|
214
|
+
`<ChassisDivider>` inside a structure chassis inherits it. */
|
|
215
|
+
.instrument-chassis[data-variant="structure"] {
|
|
216
|
+
--twin-line-catch: color-mix(in oklab, var(--color-silver-light) 50%, transparent);
|
|
217
|
+
--twin-line-shadow: color-mix(in oklab, var(--color-silver-dark) 40%, transparent);
|
|
218
|
+
}
|
|
219
|
+
|
|
153
220
|
/* Phase-color cascade — single property, full chassis-wide retint.
|
|
154
221
|
`--phase-color-label` mirrors the cascade through the WCAG companion
|
|
155
222
|
tokens (AC.W6c F1.V-04). The label register falls back to the canvas
|
|
@@ -182,8 +249,15 @@
|
|
|
182
249
|
--phase-tint-amount: var(--phase-tint-peak);
|
|
183
250
|
}
|
|
184
251
|
.instrument-chassis[data-phase="complete"] {
|
|
185
|
-
|
|
186
|
-
|
|
252
|
+
/* BB.W-PHASE-PALETTE — demoted onto the `--phase-complete-color`
|
|
253
|
+
consumer seam (the exact `var(--chart-{phase}, …)` idiom the four
|
|
254
|
+
active arms above run). The arm reads ONLY the consumer token; the
|
|
255
|
+
gold lives in the token's DEFAULT at the chassis root, not as a
|
|
256
|
+
hardcoded ink here (a clean break with a back-compat default, NOT a
|
|
257
|
+
back-compat alias — no `--color-gold` dual-read survives). The warmth
|
|
258
|
+
ramp stays: `--phase-tint-amount` is orthogonal to the ink choice. */
|
|
259
|
+
--phase-color: var(--phase-complete-color);
|
|
260
|
+
--phase-color-label: var(--phase-complete-color-label);
|
|
187
261
|
--phase-tint-amount: var(--phase-tint-peak);
|
|
188
262
|
}
|
|
189
263
|
|
|
@@ -345,4 +419,35 @@
|
|
|
345
419
|
height: 1px;
|
|
346
420
|
}
|
|
347
421
|
}
|
|
422
|
+
|
|
423
|
+
/* BB.W-DESKTOP-RESERVE (B3) — the WIDE-AXIS (desktop) dial reserve, the
|
|
424
|
+
EXACT DISJOINT COMPLEMENT of the mobile `@container chassis (max-width:
|
|
425
|
+
44.9375rem)` reserve above: 44.9375rem ≈ 719px is the mobile ceiling, so
|
|
426
|
+
the desktop floor is 45rem ≈ 720px — the two container-query ranges share
|
|
427
|
+
no width, so a dial cell is reserved by exactly ONE branch at every box
|
|
428
|
+
width (no overlap, no gap, no competing `min-block-size`).
|
|
429
|
+
|
|
430
|
+
The mobile reflow reserves the dial box from frame 0; the wide box axis
|
|
431
|
+
had NO library reserve, so a `1fr` meter row collapsed to its pre-
|
|
432
|
+
hydration `<canvas>` intrinsic and grew on hydration, pushing the results
|
|
433
|
+
card + dock down (the desktop CLS the speedtest App.vue interim authored
|
|
434
|
+
a local `min-block-size: var(--chassis-max-block-size)` to cure — the
|
|
435
|
+
consumer interim this rung SUPERSEDES). The reserve is a STATIC
|
|
436
|
+
`min-block-size` — a frame-0 box reservation, NOT an animated height (no
|
|
437
|
+
per-frame layout, compositor-safe, `proof:no-layout-animation` holds: a
|
|
438
|
+
`min-block-size` reserve is never a `@keyframes`/`transition` target).
|
|
439
|
+
|
|
440
|
+
Token-first: `--instrument-dial-min-block-size-desktop` is the DESKTOP
|
|
441
|
+
DIAL a consumer overrides (default `var(--chassis-max-block-size)`, the
|
|
442
|
+
library's dock-adjusted dynamic-viewport guardrail, resolved at first
|
|
443
|
+
paint with no JS). The inline `var(--chassis-max-block-size)` fallback
|
|
444
|
+
carries the contract if the canonical token is unset. */
|
|
445
|
+
@container chassis (min-width: 45rem) {
|
|
446
|
+
.instrument-chassis .instrument-dial {
|
|
447
|
+
min-block-size: var(
|
|
448
|
+
--instrument-dial-min-block-size-desktop,
|
|
449
|
+
var(--chassis-max-block-size)
|
|
450
|
+
);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
348
453
|
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/* menu.css — the glass MENU-ROW + MENU-SECTION register (BA.W-MENU-GLASS).
|
|
2
|
+
|
|
3
|
+
The shared `menuItemVariants` CVA's `surface=glass` arm (the DEFAULT, glass-
|
|
4
|
+
first canon AX.W54) composes `.glass-menu-row`; all 13 menu/picker-family SFCs
|
|
5
|
+
inherit the glassy hover-lift register in ONE edit (no per-SFC menu-row CSS).
|
|
6
|
+
|
|
7
|
+
── The cascade-trap pre-empt (the AZ dock-rail `@layer`-loses-to-utility trap) ──
|
|
8
|
+
`.interactive-item:hover` (utilities/base.css, `@layer components`) paints a flat
|
|
9
|
+
`color-mix(--accent 50%)` hover background. An UNLAYERED Tailwind `hover:bg-accent`
|
|
10
|
+
utility would win over BOTH (the trap). The CVA's glass arm therefore DROPS the
|
|
11
|
+
flat-accent utilities entirely — so the only background-painters on a glass row are
|
|
12
|
+
the `@layer components` `.interactive-item:hover` rule and these `.glass-menu-row`
|
|
13
|
+
rules. This file is `@import`-ed AFTER `utilities.css` in `index.css`, so at equal
|
|
14
|
+
specificity (0-1-1 for the `:hover`/`[data-highlighted]` selectors) and equal layer
|
|
15
|
+
(`components`) the recipe wins by SOURCE ORDER over `.interactive-item:hover` —
|
|
16
|
+
exactly the discipline `glass/surface-axis.css` uses ("@import-ed AFTER ladder.css
|
|
17
|
+
so the attr rules win by source order"). NEVER re-add an unlayered flat-accent
|
|
18
|
+
utility to the glass arm — it would re-introduce the trap.
|
|
19
|
+
|
|
20
|
+
── The element-level tint discipline (substitution-vs-inheritance) ──
|
|
21
|
+
The row reads the ELEMENT-LEVEL glass-quiet oklab tint
|
|
22
|
+
`color-mix(in oklab, var(--glass-bg-quiet), var(--glass-tint-source) var(--glass-tint-strength))`
|
|
23
|
+
— the SAME seam `glass/ladder.css:58` / `glass/surfaces.css:19` compose — NOT the
|
|
24
|
+
pre-baked `--glass-bg-quiet` raw token. So the row darkens-over-light (W55 bright
|
|
25
|
+
bucket / `--glass-tint-strength` lift) AND lifts-over-dark per W-DARK-MATERIAL's
|
|
26
|
+
tint arm, in lockstep with every other glass surface. */
|
|
27
|
+
@layer components {
|
|
28
|
+
/* ── .glass-menu-row — the glassy hover-lift menu/picker item ──────────────
|
|
29
|
+
Every visual axis reads a `--menu-row-*` knob so a consumer retunes via a
|
|
30
|
+
`:root` override. The REST state is transparent (the row sits on the
|
|
31
|
+
container's own `glass-floating` plate — DropdownMenuContent /
|
|
32
|
+
ContextMenuContent are already `glass-floating rounded-panel`); the glass
|
|
33
|
+
PLATE materializes on hover/focus/highlight. */
|
|
34
|
+
.glass-menu-row {
|
|
35
|
+
/* The glass-quiet plate the row paints AT THE ELEMENT on hover/highlight
|
|
36
|
+
(the element-level oklab tint — see header). Overridable. */
|
|
37
|
+
--menu-row-bg: color-mix(
|
|
38
|
+
in oklab,
|
|
39
|
+
var(--glass-bg-quiet),
|
|
40
|
+
var(--glass-tint-source) var(--glass-tint-strength)
|
|
41
|
+
);
|
|
42
|
+
/* The PRM-gated hover-lift travel (zeroed under reduce, below). */
|
|
43
|
+
--menu-row-lift: -1px;
|
|
44
|
+
/* The 44px WCAG-2.5.5 touch floor (the row never reflows below it). The
|
|
45
|
+
base is the CVA's own py rhythm; the clamp guarantees the floor. Reads
|
|
46
|
+
`--touch-target` (the 44px token declared UNCONDITIONALLY at :root —
|
|
47
|
+
offsets-sizing.css), NOT `--control-floor` (which is declared ONLY inside
|
|
48
|
+
the `@media (pointer: coarse)` block, so on a FINE pointer `var(--control-
|
|
49
|
+
floor)` resolves to the guaranteed-invalid initial value → 0px in the
|
|
50
|
+
max(), and the floor silently vanished — the live π caught the 36px row).
|
|
51
|
+
The `2.75rem` literal fallback covers a consumer who unsets the token. */
|
|
52
|
+
min-block-size: max(2rem, var(--touch-target, 2.75rem));
|
|
53
|
+
|
|
54
|
+
/* The lift transform rides the §6 spring register (`--spring-smooth`); the
|
|
55
|
+
surface props (background) ride the bezier `--ease-standard` via the
|
|
56
|
+
`.interactive-item` base transition (already declared there). The
|
|
57
|
+
explicit transform leg here pairs the spring with the lift. */
|
|
58
|
+
transition: translate var(--duration-fast) var(--spring-smooth);
|
|
59
|
+
translate: 0 0;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* Hover / keyboard-focus / reka internal-highlight / sub-trigger-open all
|
|
63
|
+
reach the SAME glass register (Combobox/Command/Select parity — the CVA
|
|
64
|
+
routes all three input modes through `data-[highlighted]`). */
|
|
65
|
+
.glass-menu-row:hover:not([data-disabled]),
|
|
66
|
+
.glass-menu-row:focus:not([data-disabled]),
|
|
67
|
+
.glass-menu-row[data-highlighted]:not([data-disabled]),
|
|
68
|
+
.glass-menu-row[data-state="open"]:not([data-disabled]) {
|
|
69
|
+
background: var(--menu-row-bg);
|
|
70
|
+
color: var(--accent-foreground);
|
|
71
|
+
translate: 0 var(--menu-row-lift);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* ── .glass-menu-section — the mono section-label + hairline row-group ──────
|
|
75
|
+
The "section caption + hairline over a row group" recipe (the slides gear
|
|
76
|
+
hand-built ~120 lines of). Folds onto `typography.css` `.section-label` (the
|
|
77
|
+
mono / √φ-caption / small-caps register) for the caption and `--border-
|
|
78
|
+
hairline` for the divider. Tokenized on `--menu-section-*` so a consumer
|
|
79
|
+
retunes via a `:root` override. ≥2 consumers: the library menu defaults
|
|
80
|
+
(the section caption a DropdownMenuLabel composes) + the in-repo demo menu
|
|
81
|
+
story (Unit 2 adoption); the slides DeckSettings is the named foreign
|
|
82
|
+
downstream consumer. */
|
|
83
|
+
.glass-menu-section {
|
|
84
|
+
/* The caption register (mono / small-caps / quiet ink) — the same
|
|
85
|
+
vocabulary `.section-label` carries, exposed as overridable knobs. */
|
|
86
|
+
--menu-section-font: var(--font-mono);
|
|
87
|
+
--menu-section-size: var(--type-caption);
|
|
88
|
+
--menu-section-color: var(--muted-foreground);
|
|
89
|
+
--menu-section-tracking: var(--type-tracking-caps);
|
|
90
|
+
/* The hairline divider over the group (the catch-light + under-shadow
|
|
91
|
+
pair). Default-off feather; the rule below paints it. */
|
|
92
|
+
--menu-section-hairline: var(--border-hairline);
|
|
93
|
+
/* The block rhythm above the group (a section is a deliberate break). */
|
|
94
|
+
--menu-section-gap: 0.375rem;
|
|
95
|
+
|
|
96
|
+
display: block;
|
|
97
|
+
margin-block-start: var(--menu-section-gap);
|
|
98
|
+
padding-block-start: var(--menu-section-gap);
|
|
99
|
+
/* The hairline reads as a top divider over the group via box-shadow (the
|
|
100
|
+
house hairline pattern — a whisper, not a hard 1px rule). */
|
|
101
|
+
box-shadow: var(--menu-section-hairline);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* The section CAPTION — a mono small-caps label. Composes onto the label
|
|
105
|
+
element the section recipe wraps (or a nested `.glass-menu-section-label`);
|
|
106
|
+
the demo + library menu labels read this caption register. */
|
|
107
|
+
.glass-menu-section-label,
|
|
108
|
+
.glass-menu-section > [data-menu-section-label] {
|
|
109
|
+
font-family: var(--menu-section-font);
|
|
110
|
+
font-size: var(--menu-section-size);
|
|
111
|
+
color: var(--menu-section-color);
|
|
112
|
+
text-transform: uppercase;
|
|
113
|
+
letter-spacing: var(--menu-section-tracking);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* ── PRM gate — no deform/lift under reduce ───────────────────────────────────
|
|
118
|
+
The hover-lift `translate` is the only motion the row introduces; under
|
|
119
|
+
`prefers-reduced-motion: reduce` it collapses to the identity (0) and the
|
|
120
|
+
transition is removed (the surface bg cross-fade is not motion). The glass
|
|
121
|
+
plate still materializes on hover — only the geometric lift is suppressed. */
|
|
122
|
+
@media (prefers-reduced-motion: reduce) {
|
|
123
|
+
.glass-menu-row {
|
|
124
|
+
--menu-row-lift: 0px;
|
|
125
|
+
transition: none;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* scroll-choreography.css — the SOTA scroll-driven CHOREOGRAPHY register
|
|
3
|
+
* (BB.W-SCROLL-MOTION).
|
|
4
|
+
*
|
|
5
|
+
* Cascade rung AFTER scroll-driven.css. glass-ui owns the native scroll-driven
|
|
6
|
+
* SUBSTRATE (scroll-driven.css `scroll()`/`view()` + the `--demo-main-progress`
|
|
7
|
+
* named timeline + the `supportsCssTimeline` harden) but composes none of the
|
|
8
|
+
* CHOREOGRAPHY — the page-load BUILD, the section CASCADE, the scroll-PINNED
|
|
9
|
+
* fixed-stage-advances-time reveals + the smooth-scroll register. The award-winners
|
|
10
|
+
* hand-roll these on Lenis+GSAP (a 20-40KB JS dependency); glass-ui ships the
|
|
11
|
+
* NATIVE register — the platform now ships `scroll()`/`view()`/`timeline-scope`
|
|
12
|
+
* natively, off the compositor at 60fps (the no-net-dep fence; the 2026
|
|
13
|
+
* universal-support convergence). NO Lenis/GSAP/Locomotive dependency, ever.
|
|
14
|
+
*
|
|
15
|
+
* .scroll-build — the route-enter page-build (chrome -> hero -> body, a
|
|
16
|
+
* spring-clocked coupled-fade, @keyframes-on-mount [NOT a
|
|
17
|
+
* scroll timeline — the build fires on mount], PRM-snapped).
|
|
18
|
+
* .scroll-cascade — the orchestrated section cascade (per-child view() timeline,
|
|
19
|
+
* the implicit stagger [NO setTimeout], the spring-clocked
|
|
20
|
+
* coupled transform+opacity build).
|
|
21
|
+
* .scroll-pin — the fixed-stage-advances-time scroll-pinned register
|
|
22
|
+
* (position: sticky stage + a named scroll-timeline linked via
|
|
23
|
+
* timeline-scope; the stage's internal phases advance with
|
|
24
|
+
* scroll progress, compositor channels only).
|
|
25
|
+
* .smooth-scroll — the native scroll-behavior: smooth opt-in (PRM-gated,
|
|
26
|
+
* zero runtime — a smooth-scroll under reduce is a vestibular
|
|
27
|
+
* concern, so the smooth interpolation is dropped under PRM).
|
|
28
|
+
*
|
|
29
|
+
* THE DISCIPLINE (mirrors scroll-driven.css EXACTLY — the exemplary outer-gate):
|
|
30
|
+
* the whole register sits under `@media (prefers-reduced-motion: no-preference)`
|
|
31
|
+
* so under PRM no scroll/build animation attaches at all and content renders in
|
|
32
|
+
* its terminal state (the `from` keyframe never applies because the animation
|
|
33
|
+
* never binds; the .scroll-pin stage shows its terminal phase, no sweep). The
|
|
34
|
+
* scroll-driven recipes sit under a second `@supports (animation-timeline: …)`
|
|
35
|
+
* gate so a non-supporting engine gets the STATIC layout (the .scroll-pin stage
|
|
36
|
+
* is a correct non-pinned read, never a broken silent stage).
|
|
37
|
+
*
|
|
38
|
+
* COMPOSITOR-ONLY (the proof:no-layout-animation floor BB.W-CARD-COMPOSITE): every
|
|
39
|
+
* @keyframes step + transition animates ONLY transform/translate/scale/opacity/
|
|
40
|
+
* clip-path — NEVER a layout-triggering property (no height/padding/inline-size/
|
|
41
|
+
* top/grid-template). The SPATIAL (transform) legs ride the per-spring `--spring-*`
|
|
42
|
+
* + the matching `--spring-*-duration` settle clock (P2/P4); the EFFECTS (opacity)
|
|
43
|
+
* legs ride the no-overshoot `--ease-out` bezier (P1/P3 — a fade must never
|
|
44
|
+
* overshoot). The spring tokens are READ-ONLY (the W-GLASS-CAL clock fence — this
|
|
45
|
+
* register THREADS them, it never re-tunes a spring value or a duration).
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
/* ─────────────────────────────────────────────────────────────────────────────
|
|
49
|
+
* .scroll-build — the route-enter page-build.
|
|
50
|
+
*
|
|
51
|
+
* A MOUNT-driven entrance (route-enter), NOT a scroll-driven one — so it rides a
|
|
52
|
+
* plain `@keyframes ... animation` (NOT a `view()`/`scroll()` timeline; the build
|
|
53
|
+
* fires on first paint of the new route, not on scroll). It sits under the PRM
|
|
54
|
+
* no-preference gate ALONE (no `@supports (animation-timeline)` — it does not use a
|
|
55
|
+
* timeline, so it runs on every engine; under PRM it never binds, so the page
|
|
56
|
+
* mounts at its terminal state).
|
|
57
|
+
*
|
|
58
|
+
* The coordinated stagger: the .scroll-build container's direct children are the
|
|
59
|
+
* BEATS (chrome, hero, body), each delayed by `--scroll-build-step * --i` (the
|
|
60
|
+
* per-beat coordinated stagger — the page assembles chrome-first, then the hero,
|
|
61
|
+
* then the first section). `--i` is the beat index a consumer sets per child
|
|
62
|
+
* (0-based); the chassis sets it on the chrome/hero/section in reading order
|
|
63
|
+
* (W-HIERARCHY2 owns the ORDER; this register threads the entrance ON it).
|
|
64
|
+
* ─────────────────────────────────────────────────────────────────────────── */
|
|
65
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
66
|
+
@keyframes gl-page-build {
|
|
67
|
+
from {
|
|
68
|
+
opacity: 0;
|
|
69
|
+
/* SPATIAL leg — the build rise (a transform, compositor-only). */
|
|
70
|
+
transform: translateY(var(--scroll-build-rise, 1.5rem));
|
|
71
|
+
}
|
|
72
|
+
to {
|
|
73
|
+
opacity: 1;
|
|
74
|
+
transform: translateY(0);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* The page-build container marks the entrance; the beats are its children. */
|
|
79
|
+
.scroll-build > * {
|
|
80
|
+
/* The coupled build: the SPATIAL transform rides the snappy spring settle
|
|
81
|
+
clock (P2/P4 — the page parts arrive with crisp gravity); the opacity is
|
|
82
|
+
a coupled leg in the SAME keyframe on the SAME clock so the fade tracks
|
|
83
|
+
the rise as ONE coherent glide (P3 — fade coupled to transform). The
|
|
84
|
+
no-overshoot bezier governs the FADE channel where the spring's
|
|
85
|
+
overshoot is not wanted: `--ease-out` is named on the build's title beat
|
|
86
|
+
(the hero <h1> — audacious type arrives with GRAVITY, not bounce, per
|
|
87
|
+
W-HIERARCHY2); the other beats ride the snappy spring. */
|
|
88
|
+
animation: gl-page-build var(--spring-snappy-duration, 0.34s)
|
|
89
|
+
var(--spring-snappy) both;
|
|
90
|
+
animation-delay: calc(var(--scroll-build-step, 90ms) * var(--i, 0));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* The hero/title beat: the audacious-type-arrives-with-gravity register — the
|
|
94
|
+
no-overshoot `--ease-out` bezier (a strictly monotone settle, NO overshoot
|
|
95
|
+
past the terminal transform), the existing .story-hero-title--enter
|
|
96
|
+
discipline folded into the ONE entrance system. A consumer marks the hero
|
|
97
|
+
beat `.scroll-build-hero`. */
|
|
98
|
+
.scroll-build > .scroll-build-hero {
|
|
99
|
+
animation: gl-page-build 0.62s var(--ease-out, ease-out) both;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* The EXPLICIT P6 carve — under prefers-reduced-motion: reduce the page-build DROPS
|
|
104
|
+
the spatial transform (no movement — the vestibular floor) but KEEPS a gentle
|
|
105
|
+
terminal fade-in (the EFFECTS channel survives per P6: fade-keeps, transform-
|
|
106
|
+
drops). This sits OUTSIDE the no-preference gate as the reduce-arm of the
|
|
107
|
+
coordinated build (mirroring the transitions.css fade-slide PRM arm — the
|
|
108
|
+
opacity leg alone under reduce). The build is mount-driven, so the no-preference
|
|
109
|
+
gate above never binds under reduce; this arm gives PRM users the coupled-FADE
|
|
110
|
+
terminal entrance with ZERO motion frames (no translateY), the genuine P6 read. */
|
|
111
|
+
@media (prefers-reduced-motion: reduce) {
|
|
112
|
+
@keyframes gl-page-build-fade {
|
|
113
|
+
from {
|
|
114
|
+
opacity: 0;
|
|
115
|
+
}
|
|
116
|
+
to {
|
|
117
|
+
opacity: 1;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
.scroll-build > * {
|
|
121
|
+
/* fade-keeps (opacity only), transform-DROPS (no translateY) — P6. */
|
|
122
|
+
animation: gl-page-build-fade var(--duration-fast, 0.16s) var(--ease-out, ease-out)
|
|
123
|
+
both;
|
|
124
|
+
animation-delay: 0s; /* no coordinated stagger under reduce — a single calm paint */
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* ─────────────────────────────────────────────────────────────────────────────
|
|
129
|
+
* .scroll-cascade — the orchestrated section cascade.
|
|
130
|
+
*
|
|
131
|
+
* Extends the bare `[data-scroll-reveal] > *` 6px fade into the SOTA coordinated
|
|
132
|
+
* build: the per-child `view()` timeline stays the implicit-stagger mechanism (each
|
|
133
|
+
* child owns its own timeline — NO setTimeout cascade), but the entrance is the
|
|
134
|
+
* spring-clocked coupled build (a deeper rise + a tighter reveal window). It sits
|
|
135
|
+
* under the PRM no-preference gate + the `@supports (animation-timeline: view())`
|
|
136
|
+
* gate (the scroll-driven.css discipline) — under PRM/non-support the sections
|
|
137
|
+
* render at their terminal state.
|
|
138
|
+
* ─────────────────────────────────────────────────────────────────────────── */
|
|
139
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
140
|
+
@supports ((animation-timeline: view()) and (animation-range: entry)) {
|
|
141
|
+
@keyframes gl-cascade-build {
|
|
142
|
+
from {
|
|
143
|
+
/* EFFECTS leg — the coupled fade (no overshoot). */
|
|
144
|
+
opacity: 0;
|
|
145
|
+
/* SPATIAL leg — the build rise (a transform, compositor-only). */
|
|
146
|
+
transform: translateY(var(--scroll-cascade-rise, 1.25rem));
|
|
147
|
+
}
|
|
148
|
+
to {
|
|
149
|
+
opacity: 1;
|
|
150
|
+
transform: translateY(0);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.scroll-cascade > * {
|
|
155
|
+
/* The view()-timeline drives the build off each child's OWN entry into
|
|
156
|
+
the viewport (the implicit stagger). The progress-bound timeline maps
|
|
157
|
+
the entrance across the `animation-range` window; the keyframe's
|
|
158
|
+
coupled transform+opacity build is the orchestrated cascade (vs the
|
|
159
|
+
bare 6px reveal). `linear` is the right easing for a SCROLL-bound
|
|
160
|
+
progress map (the spring shaping lives in the section's own settle
|
|
161
|
+
where the build is mount-driven; a scroll-bound timeline reads
|
|
162
|
+
1:1 with scroll position — a spring on a scrubbed timeline reads as
|
|
163
|
+
a scrubbed spring, which is correct here as the linear progress map). */
|
|
164
|
+
animation: gl-cascade-build auto linear both;
|
|
165
|
+
animation-timeline: view(block);
|
|
166
|
+
animation-range: entry 0% entry var(--scroll-cascade-range-end, 45%);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/* The horizontal-scroller variant — a `view(inline)` axis. */
|
|
170
|
+
.scroll-cascade.scroll-cascade--inline > * {
|
|
171
|
+
animation-timeline: view(inline);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/* The OPT-IN column-stagger variant (the Codrops nuance — even columns
|
|
175
|
+
from top, odd from below). A GRID-surface flourish, NOT the default (the
|
|
176
|
+
proportion fence: a uniform vertical cascade is the calm StoryPage
|
|
177
|
+
default; the column-stagger is the front-door grid showcase). A consumer
|
|
178
|
+
sets `--col` (the column index) per child; even/odd rise from opposite
|
|
179
|
+
directions, offset by `--scroll-cascade-column-stagger`. */
|
|
180
|
+
@keyframes gl-cascade-build-col-even {
|
|
181
|
+
from {
|
|
182
|
+
opacity: 0;
|
|
183
|
+
transform: translateY(calc(-1 * var(--scroll-cascade-rise, 1.25rem)));
|
|
184
|
+
}
|
|
185
|
+
to {
|
|
186
|
+
opacity: 1;
|
|
187
|
+
transform: translateY(0);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
.scroll-cascade.scroll-cascade--columns > * {
|
|
191
|
+
animation-range: entry 0%
|
|
192
|
+
entry
|
|
193
|
+
calc(
|
|
194
|
+
var(--scroll-cascade-range-end, 45%) +
|
|
195
|
+
var(--scroll-cascade-column-stagger, 60ms) * 0
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
.scroll-cascade.scroll-cascade--columns > *:nth-child(even) {
|
|
199
|
+
animation-name: gl-cascade-build-col-even;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/* ─────────────────────────────────────────────────────────────────────────────
|
|
205
|
+
* .scroll-pin — the fixed-stage-advances-time scroll-pinned register.
|
|
206
|
+
*
|
|
207
|
+
* The SOTA "scrolling does not move the scene, it advances time inside it" model:
|
|
208
|
+
* a `.scroll-pin` tall container (the `--scroll-pin-stage-height` temporal space)
|
|
209
|
+
* holds a `.scroll-pin-stage` `position: sticky` element. The container declares
|
|
210
|
+
* a named `scroll-timeline`; the stage's internal phase animations bind to that
|
|
211
|
+
* named timeline via `timeline-scope` (so the stage animates against the
|
|
212
|
+
* CONTAINER'S scroll progress — the fixed stage advances time). The phase
|
|
213
|
+
* animations are compositor-only (transform/opacity/clip-path over the
|
|
214
|
+
* `animation-range` phase windows — the Codrops phased sequence: a reveal phase
|
|
215
|
+
* 0..45%, an expand phase 45..90%, a settle phase 90..100%).
|
|
216
|
+
*
|
|
217
|
+
* `timeline-scope` is the newest primitive — the `@supports` gate probes it (NOT
|
|
218
|
+
* just `scroll()`), so an engine with `scroll()`/`view()` but not `timeline-scope`
|
|
219
|
+
* gets the STATIC layout (a correct non-pinned read: the stage is a plain sticky
|
|
220
|
+
* element at its terminal phase, never a broken silent stage). In 2026
|
|
221
|
+
* `timeline-scope` ships alongside `scroll()`/`view()` (the universal-support
|
|
222
|
+
* convergence), so the CSS-only register is the ship; the JS fallback leaf (mirror
|
|
223
|
+
* useScrollProgress's dual-path single-writer) is BOOKED only on a material
|
|
224
|
+
* engine-gap reveal (the §Triumvirate support-matrix trigger) — never a JS scroll
|
|
225
|
+
* lib (the no-net-dep fence is binding either way).
|
|
226
|
+
* ─────────────────────────────────────────────────────────────────────────── */
|
|
227
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
228
|
+
@supports (animation-timeline: scroll()) and (timeline-scope: --gl-pin) {
|
|
229
|
+
@keyframes gl-pin-reveal {
|
|
230
|
+
from {
|
|
231
|
+
opacity: 0;
|
|
232
|
+
transform: translateY(var(--scroll-pin-lift, 2.5rem)) scale(0.96);
|
|
233
|
+
}
|
|
234
|
+
to {
|
|
235
|
+
opacity: 1;
|
|
236
|
+
transform: translateY(0) scale(1);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
@keyframes gl-pin-settle {
|
|
240
|
+
from {
|
|
241
|
+
transform: scale(1);
|
|
242
|
+
opacity: 1;
|
|
243
|
+
}
|
|
244
|
+
to {
|
|
245
|
+
/* The settle phase — a gentle compositor drift, never a layout move. */
|
|
246
|
+
transform: scale(1.02) translateY(calc(-1 * var(--scroll-pin-lift, 2.5rem)));
|
|
247
|
+
opacity: 1;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/* The tall temporal container declares a named scroll-timeline + exposes it
|
|
252
|
+
to descendants via timeline-scope (the fixed-stage-advances-time link). */
|
|
253
|
+
.scroll-pin {
|
|
254
|
+
position: relative;
|
|
255
|
+
block-size: var(--scroll-pin-stage-height, 320vh);
|
|
256
|
+
scroll-timeline-name: --gl-pin;
|
|
257
|
+
scroll-timeline-axis: block;
|
|
258
|
+
timeline-scope: --gl-pin;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/* The sticky stage — pinned to the viewport while the container scrolls
|
|
262
|
+
past; its phases advance against the container's --gl-pin timeline. */
|
|
263
|
+
.scroll-pin-stage {
|
|
264
|
+
position: sticky;
|
|
265
|
+
inset-block-start: 0;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/* Phase 1 — the reveal (0..45% of the container scroll). */
|
|
269
|
+
.scroll-pin-stage .scroll-pin-phase-reveal {
|
|
270
|
+
animation: gl-pin-reveal auto linear both;
|
|
271
|
+
animation-timeline: --gl-pin;
|
|
272
|
+
animation-range: 0% var(--scroll-pin-phase-reveal-end, 45%);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/* Phase 2 — the settle/expand (the reveal-end..expand-end window). */
|
|
276
|
+
.scroll-pin-stage .scroll-pin-phase-settle {
|
|
277
|
+
animation: gl-pin-settle auto linear both;
|
|
278
|
+
animation-timeline: --gl-pin;
|
|
279
|
+
animation-range: var(--scroll-pin-phase-reveal-end, 45%)
|
|
280
|
+
var(--scroll-pin-phase-expand-end, 90%);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/* ─────────────────────────────────────────────────────────────────────────────
|
|
286
|
+
* .smooth-scroll — the native smooth-scroll opt-in.
|
|
287
|
+
*
|
|
288
|
+
* The native `scroll-behavior: smooth` (CSS-first, zero runtime — NOT a JS rAF
|
|
289
|
+
* momentum loop, which IS Lenis and is the fence). An OPT-IN class the scroller
|
|
290
|
+
* (`<main>`, a `.scroll-pin` container) applies. PRM-GATED: under
|
|
291
|
+
* `prefers-reduced-motion: reduce` the smooth interpolation is DROPPED and the
|
|
292
|
+
* jump-scroll is correct (a smooth-scroll over an anchor-jump is a vestibular
|
|
293
|
+
* concern). A consumer wanting Lenis-grade momentum brings it in THEIR app (the
|
|
294
|
+
* presets-in-consumers discipline); the library ships the native register.
|
|
295
|
+
* ─────────────────────────────────────────────────────────────────────────── */
|
|
296
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
297
|
+
.smooth-scroll {
|
|
298
|
+
scroll-behavior: smooth;
|
|
299
|
+
}
|
|
300
|
+
}
|