@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
package/dist/styles/drawer.css
CHANGED
|
@@ -26,6 +26,46 @@
|
|
|
26
26
|
initial-value: 1;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
/* BD.W-OVERLAY-STAGE-COUPLE — `--stage-t`, the ONE registered STAGING scalar (0 =
|
|
30
|
+
* closed/un-staged → 1 = fully staged). The whole modal band rides this ONE knob:
|
|
31
|
+
* the drawer's surface FREEZE (A), the scrim DEEPEN (B), the page RECEDE+SCALE (C),
|
|
32
|
+
* the opt-in blur ENGAGE (D) are all pure `calc()` reads OF it. `inherits: true` so
|
|
33
|
+
* a single writer at `:root` reaches the portaled scrim AND the page-wrapper sibling
|
|
34
|
+
* AND the sheet descendants from ONE write (the scrim is NOT a descendant of the
|
|
35
|
+
* content, so a content-local mirror could never reach it — the `:root` write is the
|
|
36
|
+
* cross-subtree path).
|
|
37
|
+
*
|
|
38
|
+
* THE SINGLE WRITER (fold C1·R2 — no dual scalar desync). `useDrawerSnap.writeScalar`
|
|
39
|
+
* writes BOTH `--glass-drawer-t` (the sheet's per-element translate) AND `--stage-t`
|
|
40
|
+
* (the scene scalar at `:root`) in the SAME call — atomically, never separately, so
|
|
41
|
+
* the two can never desync on a drag-cancel / fling-overshoot / interrupted snap. A
|
|
42
|
+
* plain modal (Dialog/Command) flips `--stage-t` 0→1 on `--spring-snappy` at open;
|
|
43
|
+
* the close-write removes the inline value so the registered property reverts to its
|
|
44
|
+
* `initial-value: 0` (the stale-latch fix). `initial-value: 0` so an un-staged page never
|
|
45
|
+
* recedes. EVERY consumer `clamp(0, …, 1)`-bounds it (a `--ease-cartoon-punch` fling
|
|
46
|
+
* can overshoot >1 — the page-scale / radius / scrim must not run past their
|
|
47
|
+
* endpoints). */
|
|
48
|
+
@property --stage-t {
|
|
49
|
+
syntax: "<number>";
|
|
50
|
+
inherits: true;
|
|
51
|
+
initial-value: 0;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* The stage-t transition + close-write reset (the registered-property stale-latch
|
|
55
|
+
* fix, fold C3·R7).
|
|
56
|
+
*
|
|
57
|
+
* The drawer's single writer (useDrawerSnap) drives `--stage-t` per frame and
|
|
58
|
+
* REMOVES the inline value on close → the registered property reverts to its
|
|
59
|
+
* `initial-value: 0`. The centered modal (DialogContent) flips it 0→1 on open via the
|
|
60
|
+
* `data-stage-flip` marker on `:root`; this rule owns the FLIP TRANSITION (a snappy
|
|
61
|
+
* spring) so the dialog's `:root --stage-t` value glides 0→1 rather than snapping — a
|
|
62
|
+
* CSS-owned transition, NOT an inline `transition` shorthand on `:root` (which would
|
|
63
|
+
* clobber unrelated root transitions). On close the marker is dropped and the inline
|
|
64
|
+
* value removed → the property reverts to 0 (no stale full-staged latch on re-open). */
|
|
65
|
+
:root[data-stage-flip] {
|
|
66
|
+
transition: --stage-t var(--spring-snappy-duration, 0.4s) var(--spring-snappy, ease);
|
|
67
|
+
}
|
|
68
|
+
|
|
29
69
|
:root {
|
|
30
70
|
/* Detent grammar knobs — overridable per-consumer */
|
|
31
71
|
--drawer-handle-w: 2.25rem;
|
|
@@ -137,6 +177,82 @@
|
|
|
137
177
|
margin-top: 0;
|
|
138
178
|
}
|
|
139
179
|
|
|
180
|
+
/*
|
|
181
|
+
* BD.W-OVERLAY-STAGE-COUPLE — coupling (A): the surface FREEZE, composed AT THE
|
|
182
|
+
* ELEMENT. A detented sheet is SEE-THROUGH at peek/half (the page bleeds) and
|
|
183
|
+
* SOLIDIFIES toward a warm-tinted card at full (page does not bleed, blur → 0). This
|
|
184
|
+
* is the iOS-27 bottom-sheet crown the live α-0.95-at-every-detent flattened.
|
|
185
|
+
*
|
|
186
|
+
* A TWO-SEGMENT lerp on the ONE `--stage-t` knob (the self-standing crown — the wave
|
|
187
|
+
* owns BOTH endpoints so it does not block on BE.W-SHEET-TRANSLUCENT, fold C3·R1):
|
|
188
|
+
* • DESCENT t ∈ [0, 0.85] — the transmissive crown sinks `--glass-bg-overlay` α
|
|
189
|
+
* toward the shipped see-through `--glass-bg-sheet` floor (`--glass-opacity-sheet:
|
|
190
|
+
* 0.74`). At peek/half the page bleeds through.
|
|
191
|
+
* • SOLIDIFY t ∈ [0.85, 1] — `--sheet-freeze` lerps the descended plate toward a
|
|
192
|
+
* WARM-TINTED card-mix (NOT bare `--card` — the gray-at-full carve hole, fold
|
|
193
|
+
* C1·R4); `backdrop-filter` blur decays to 0 (a solid plate has no backdrop to
|
|
194
|
+
* bend — a Safari win, no wasted sample behind an opaque plate).
|
|
195
|
+
*
|
|
196
|
+
* Composed AT THE ELEMENT (the `[data-surface=opaque]` substitution-safe path) via
|
|
197
|
+
* element-level `color-mix` — NEVER an ancestor `filter` (which would clobber the
|
|
198
|
+
* sheet's own backdrop-filter, the dock-hub goo-tear lesson, §7). `--stage-t` reads
|
|
199
|
+
* the `:root` scalar the single writer drives (mirrored from `--glass-drawer-t`).
|
|
200
|
+
*/
|
|
201
|
+
.glass-drawer[data-glass-drawer-snap-points="true"] {
|
|
202
|
+
/* the DESCENT fraction — 0 at closed → 1 at the commit floor (t=0.85). */
|
|
203
|
+
--sheet-descent: clamp(0, calc(var(--stage-t) / 0.85), 1);
|
|
204
|
+
/* the SOLIDIFY fraction — 0 below the commit floor → 1 at full (t=1). */
|
|
205
|
+
--sheet-freeze: clamp(0, calc((var(--stage-t) - 0.85) / 0.15), 1);
|
|
206
|
+
/* the transmissive crown plate: the warm overlay fill sunk toward the shipped
|
|
207
|
+
see-through `--glass-bg-sheet` floor across the descent. */
|
|
208
|
+
--sheet-crown: color-mix(
|
|
209
|
+
in oklab,
|
|
210
|
+
color-mix(
|
|
211
|
+
in oklab,
|
|
212
|
+
var(--glass-bg-overlay),
|
|
213
|
+
var(--glass-tint-source) var(--glass-tint-strength)
|
|
214
|
+
),
|
|
215
|
+
var(--glass-bg-sheet) calc(var(--sheet-descent) * 100%)
|
|
216
|
+
);
|
|
217
|
+
/* the warm-tinted SOLID escape (fold C1·R4 — a warm card-mix toward the EXPLICIT
|
|
218
|
+
warm `--glass-capsule-warm` amber, NEVER bare `--card` and NEVER the
|
|
219
|
+
`--glass-tint-source` alias which resolves back to `--card` and would be a
|
|
220
|
+
no-op warm; build-trap-(d) safe — a warm oklch color, never bare `transparent`).
|
|
221
|
+
At the shared 16% warm floor a dark full sheet stays C ≥ 0.02 warm — no
|
|
222
|
+
charcoal holiday at full. */
|
|
223
|
+
--sheet-solid: color-mix(
|
|
224
|
+
in oklab,
|
|
225
|
+
var(--card),
|
|
226
|
+
var(--glass-capsule-warm) var(--glass-capsule-warm-floor, 16%)
|
|
227
|
+
);
|
|
228
|
+
background: color-mix(
|
|
229
|
+
in oklab,
|
|
230
|
+
var(--sheet-crown),
|
|
231
|
+
var(--sheet-solid) calc(var(--sheet-freeze) * 100%)
|
|
232
|
+
);
|
|
233
|
+
backdrop-filter: blur(
|
|
234
|
+
calc(var(--glass-blur-overlay-radius, 20px) * (1 - var(--sheet-freeze)))
|
|
235
|
+
)
|
|
236
|
+
saturate(1.6);
|
|
237
|
+
-webkit-backdrop-filter: blur(
|
|
238
|
+
calc(var(--glass-blur-overlay-radius, 20px) * (1 - var(--sheet-freeze)))
|
|
239
|
+
)
|
|
240
|
+
saturate(1.6);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/* The `surface=opaque` explicit escape still wins (it sets the solid plate
|
|
244
|
+
unconditionally regardless of detent) — the freeze is the DEFAULT glass crown; the
|
|
245
|
+
opt-out plate is the consumer's hard override. Source order keeps the opaque rule
|
|
246
|
+
(declared above) — re-assert it here so it beats the snap-points freeze at equal
|
|
247
|
+
specificity for a detented opaque sheet. */
|
|
248
|
+
.glass-drawer[data-glass-drawer-snap-points="true"][data-surface="opaque"] {
|
|
249
|
+
background: color-mix(in srgb, var(--card), transparent 0%);
|
|
250
|
+
-webkit-backdrop-filter: none;
|
|
251
|
+
|
|
252
|
+
backdrop-filter: none;
|
|
253
|
+
-webkit-backdrop-filter: none;
|
|
254
|
+
}
|
|
255
|
+
|
|
140
256
|
/* Direction variants — the content root tags itself with the drag axis
|
|
141
257
|
(`data-glass-drawer-direction`). Bottom is the default; the others ride the same
|
|
142
258
|
surface so a top/side sheet inherits the grammar. The side-lens (left/right) is
|
|
@@ -228,6 +344,56 @@
|
|
|
228
344
|
background-color: var(--drawer-snap-rule-color);
|
|
229
345
|
}
|
|
230
346
|
|
|
347
|
+
/*
|
|
348
|
+
* BD.W-OVERLAY-STAGE-COUPLE — coupling (B): the scrim DEEPEN. The scrim α tracks
|
|
349
|
+
* `--stage-t` so a peek drawer barely dims and a full drawer commits hard (the live
|
|
350
|
+
* fixed-α-0.8 at every detent is the born-RED). Reuses the SHIPPED warm
|
|
351
|
+
* `--overlay-scrim-ink` (the F7 warm near-black, never flat black), now t-coupled.
|
|
352
|
+
* `clamp(0,…,1)` bounds the fling overshoot. The scrim element gains
|
|
353
|
+
* `[data-stage-scrim]` (DrawerOverlay.vue) and reads the inherited `:root` scalar.
|
|
354
|
+
*/
|
|
355
|
+
[data-stage-scrim] {
|
|
356
|
+
background: color-mix(
|
|
357
|
+
in srgb,
|
|
358
|
+
var(--overlay-scrim-ink)
|
|
359
|
+
calc((0.28 + clamp(0, var(--stage-t), 1) * 0.44) * 100%),
|
|
360
|
+
transparent
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/*
|
|
365
|
+
* BD.W-OVERLAY-STAGE-COUPLE — coupling (C): the page RECEDE + SCALE. The page wrapper
|
|
366
|
+
* scales `1 → 0.95` + corner-radius blooms as `--stage-t → 1` (the iOS "card recedes"
|
|
367
|
+
* depth cue), retiring the dead `shouldScaleBackground` boolean. `scale` +
|
|
368
|
+
* `border-radius` ONLY — NO `filter` (the ancestor-filter trap: `filter` on the app
|
|
369
|
+
* root establishes a containing block for `position:fixed` and force-rasterizes the
|
|
370
|
+
* page subtree every frame — fold C2·R1; §7). The wrapper is the consumer's app-root
|
|
371
|
+
* marker (`demo/App.vue` mounts `[data-stage-wrapper]`); when the honest
|
|
372
|
+
* `stage="none|dim"` enum is set the marker carries no `--stage-t` drive (or the
|
|
373
|
+
* `data-stage-scale` gate is absent) so (C) is a real no-op, never a lie. Under PRM
|
|
374
|
+
* `stage="scale"` degrades to `dim` at the SFC (no `data-stage-scale` attr) so the
|
|
375
|
+
* page never transforms (fold C1·R6) — this rule only fires when the scale gate is on.
|
|
376
|
+
*/
|
|
377
|
+
[data-stage-wrapper][data-stage-scale] {
|
|
378
|
+
scale: calc(1 - 0.05 * clamp(0, var(--stage-t), 1));
|
|
379
|
+
border-radius: calc(var(--radius-panel) * clamp(0, var(--stage-t), 1));
|
|
380
|
+
transform-origin: 50% 0; /* recede toward the top, iOS */
|
|
381
|
+
overflow: clip;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/*
|
|
385
|
+
* BD.W-OVERLAY-STAGE-COUPLE — coupling (D): the blur ENGAGE (opt-in `immersive`, the
|
|
386
|
+
* Command spotlight). The scrim's `backdrop-filter` radius ramps `0 → deep` on
|
|
387
|
+
* `--stage-t`. ONE-SHOT over the open window (gated to the modal-flip 0→1 via
|
|
388
|
+
* `[data-stage-immersive]`, NEVER the drawer's per-frame scalar — the §L7 Safari
|
|
389
|
+
* fence: a per-frame full-viewport re-blur is the cardinal sin, fold C2·R). WebKit
|
|
390
|
+
* pays the sample once as the flip lands. Default OFF.
|
|
391
|
+
*/
|
|
392
|
+
[data-stage-scrim][data-stage-immersive] {
|
|
393
|
+
backdrop-filter: blur(calc(clamp(0, var(--stage-t), 1) * 16px));
|
|
394
|
+
-webkit-backdrop-filter: blur(calc(clamp(0, var(--stage-t), 1) * 16px));
|
|
395
|
+
}
|
|
396
|
+
|
|
231
397
|
/* Reduced-motion — the house `SpringProgress` snaps the detent deterministically
|
|
232
398
|
under `prefers-reduced-motion: reduce` (its `respectReducedMotion` jumps the
|
|
233
399
|
`--glass-drawer-t` scalar to target in one frame, zero motion frames); here we
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/* ════════════════════════════════════════════════════════════════════════
|
|
2
|
+
.glass-atom — BD.W-GLASS-ATOM-REGISTER: the ONE shared warm-glass register
|
|
3
|
+
the four small atoms (Badge-glass · metric-badge · slider fill · the `+N`
|
|
4
|
+
chip) consume in two registers (loud opaque identity vs quiet transmissive
|
|
5
|
+
glass).
|
|
6
|
+
|
|
7
|
+
CONSUME-ONLY — declares ZERO own glass tokens (the no-fork fence, Fence 1).
|
|
8
|
+
It COMPOSES:
|
|
9
|
+
· `.glass-capsule` — the warm-transmissive lozenge BODY (warm floor +
|
|
10
|
+
rim + lift). `.glass-atom` is a PEER of any
|
|
11
|
+
sized chip, NEVER `.glass-chip` itself (Fence 2):
|
|
12
|
+
both compose `.glass-capsule`. A consumer applies
|
|
13
|
+
BOTH classes (`class="glass-capsule glass-atom"`)
|
|
14
|
+
or composes the capsule body via the glass tier
|
|
15
|
+
the host already wears.
|
|
16
|
+
· `--glass-fill-tint` / `--glass-fill-strength` (BE.W-TINTED-CHIP, glass.css)
|
|
17
|
+
— the per-instance plate-fill data hue. The atom
|
|
18
|
+
is its ≥Nth consumer; it APPLIES the axis on the
|
|
19
|
+
quiet register, never re-mints a tint.
|
|
20
|
+
· `--glass-material-rim` — the keyed directional rim (the defined edge), the
|
|
21
|
+
SHIPPED two-stop rim re-pointed by `--glass-key`.
|
|
22
|
+
· the inert `.cartoon-cast` child + `--cartoon-ink` / `--shadow-cartoon-*`
|
|
23
|
+
(BD.W-CARTOON-CASTER / -CEL-INK) — the warm cel
|
|
24
|
+
stamp; the loud register intensifies on `data-cast`.
|
|
25
|
+
· `--motion-weight` × `--ease-cartoon-punch` (BD.W-MOTION-WEIGHT /
|
|
26
|
+
-CARTOON-PUNCH) — the non-uniform press squash +
|
|
27
|
+
the weight-coupled smear/settle.
|
|
28
|
+
|
|
29
|
+
@layer components, @import-ed by icon-chip.css (in-lane) AFTER glass.css (so
|
|
30
|
+
`.glass-capsule` + the `--glass-*` axes resolve) and BEFORE the consuming
|
|
31
|
+
recipes. Every channel is compositor-only + Safari-native (no
|
|
32
|
+
`backdrop-filter: url()`, no goo — Fence 8). The warm 0-alpha sources are
|
|
33
|
+
explicit `oklch(L C H / 0)` (NEVER bare `transparent` — the WebKit
|
|
34
|
+
black-premultiply hole, build-trap-(d)).
|
|
35
|
+
════════════════════════════════════════════════════════════════════════ */
|
|
36
|
+
|
|
37
|
+
@layer components {
|
|
38
|
+
/* ── The warm idle floor (the #2 dormant-tint cure) ──
|
|
39
|
+
The atom carries chroma BEFORE any field paints + on a dead ground. The
|
|
40
|
+
floor is NON-self-referential (build-trap-(b): a property reading ITSELF in
|
|
41
|
+
its own `max()` resolves to guaranteed-invalid and the term drops). A
|
|
42
|
+
SEPARATE input var is the source: a consumer (the accent ramp) writes
|
|
43
|
+
`--accent-fill-strength-in`, and the resolved fill strength floors at
|
|
44
|
+
`--atom-tint-floor` — PLAIN per-mode (12% light / 15% dark), NEVER
|
|
45
|
+
`light-dark()` (the inset-shadow trap). */
|
|
46
|
+
.glass-atom {
|
|
47
|
+
--atom-tint-floor: 12%;
|
|
48
|
+
--accent-fill-strength: max(
|
|
49
|
+
var(--accent-fill-strength-in, 0%),
|
|
50
|
+
var(--atom-tint-floor)
|
|
51
|
+
);
|
|
52
|
+
/* The quiet register's tint application — the plate body mixes toward the
|
|
53
|
+
per-instance data hue ON TOP of the capsule's warm composite. At the
|
|
54
|
+
`@property` defaults (`--glass-fill-tint: transparent` / strength 0%)
|
|
55
|
+
this is the byte-identical no-op floor; the warm floor above keeps the
|
|
56
|
+
idle body warm even at a transparent tint. The mix is `in oklab` (the
|
|
57
|
+
perceptual glass-tint family — NOT the in-srgb brand fence). */
|
|
58
|
+
--glass-atom-tinted: color-mix(
|
|
59
|
+
in oklab,
|
|
60
|
+
var(--glass-capsule-warm) calc(var(--atom-tint-floor) + var(--glass-fill-strength)),
|
|
61
|
+
oklch(0.9 0.05 75 / 0)
|
|
62
|
+
);
|
|
63
|
+
/* The motion register — the press/hover deform rides
|
|
64
|
+
`--motion-weight × --ease-cartoon-punch`. The atom inherits the rest
|
|
65
|
+
`--motion-weight: 0.618`; the loud register (`data-cast`, below) pushes
|
|
66
|
+
it to 1 so the punch is never muted (the loud-register coupling). The
|
|
67
|
+
SPATIAL legs (scale/translate) settle on the punch clock; the EFFECTS
|
|
68
|
+
legs (background/box-shadow) stay on the bezier (motion-canon P1). */
|
|
69
|
+
transition:
|
|
70
|
+
background var(--duration-fast) var(--ease-standard),
|
|
71
|
+
box-shadow var(--duration-fast) var(--ease-standard),
|
|
72
|
+
scale var(--duration-normal) var(--ease-cartoon-punch),
|
|
73
|
+
translate var(--duration-normal) var(--ease-cartoon-punch);
|
|
74
|
+
}
|
|
75
|
+
.dark .glass-atom {
|
|
76
|
+
--atom-tint-floor: 15%;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/* ── The non-uniform PRESS squash (the punch, NOT a shrink) ──
|
|
80
|
+
Widen X, compress Y (`scale: 1.04 0.94`) — real squash & stretch. The
|
|
81
|
+
`:active` is the no-JS floor; a consumer's `useLiquidPress` may drive a
|
|
82
|
+
continuous ramp via `--cartoon-press-t` (the caster reads it). The
|
|
83
|
+
`border-radius` is the pill, so under non-uniform scale the end-caps track
|
|
84
|
+
the scaled box (challenge #2 R4 — the capsule radius stays circle-tolerant). */
|
|
85
|
+
.glass-atom:active:not([data-disabled]):not(:disabled) {
|
|
86
|
+
scale: 1.04 0.94;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* ── The cel cast — UNIVERSAL-but-GRADED (challenge #1 R5 / #3 R5) ──
|
|
90
|
+
Every atom carries a hairline warm rim-cast at rest (the family floor); the
|
|
91
|
+
loud flagships (`data-cast`) INTENSIFY to the loud layered-offset stamp.
|
|
92
|
+
The cast rides the inert `.cartoon-cast` child (BD.W-CARTOON-CASTER) — the
|
|
93
|
+
child carries `--shadow-cartoon-md` at rest and moves on `translate`/`scale`
|
|
94
|
+
only; here the atom only RE-POINTS the loud register's resting/hover rung
|
|
95
|
+
(it does not re-author the caster). The loud register pushes
|
|
96
|
+
`--motion-weight: 1` so the punch reads at full amplitude. */
|
|
97
|
+
.glass-atom[data-cast] {
|
|
98
|
+
--motion-weight: 1;
|
|
99
|
+
}
|
|
100
|
+
.glass-atom[data-cast] .cartoon-cast {
|
|
101
|
+
box-shadow: var(--shadow-cartoon-sm);
|
|
102
|
+
}
|
|
103
|
+
@media (hover: hover) {
|
|
104
|
+
.glass-atom[data-cast]:hover:not(:active) .cartoon-cast {
|
|
105
|
+
box-shadow: var(--shadow-cartoon-md);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* ── The QUIET register (`[data-surface="glass"]`) — the transmissive tint ──
|
|
110
|
+
The quiet capsule applies the per-instance fill tint over the warm floor.
|
|
111
|
+
This is where the warm-not-gray read is won (badge-glass, the `+N` chip).
|
|
112
|
+
The body composes `.glass-capsule` (the consumer applies both classes); the
|
|
113
|
+
atom only LAYERS the tinted fill on top of the capsule's warm composite via
|
|
114
|
+
`background-image` (a later layer over the capsule's `background:` shorthand
|
|
115
|
+
— the proven `.paper-grid` coexistence seam, paints OVER the translucent
|
|
116
|
+
fill, UNDER content). The 0-alpha stop is warm `oklch(… / 0)`, never bare
|
|
117
|
+
`transparent` (challenge #1 R4 / #2 R4 — the WebKit desaturation fix). */
|
|
118
|
+
.glass-atom[data-surface="glass"] {
|
|
119
|
+
background-image: linear-gradient(
|
|
120
|
+
var(--glass-atom-tinted),
|
|
121
|
+
var(--glass-atom-tinted)
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/* ── PRM/PRT carve ──
|
|
126
|
+
Under reduced-motion `--motion-weight: 0` zeroes the squash + the cast
|
|
127
|
+
travel/lag in ONE assignment (every `calc(… * --motion-weight)` in the
|
|
128
|
+
caster collapses to rest); the press scale collapses to 1. The warm tint +
|
|
129
|
+
the rim + the STATIC cel STAMP persist (a still frame, never a frozen
|
|
130
|
+
mid-animation — the legibility floor). */
|
|
131
|
+
@media (prefers-reduced-motion: reduce) {
|
|
132
|
+
.glass-atom {
|
|
133
|
+
--motion-weight: 0;
|
|
134
|
+
}
|
|
135
|
+
.glass-atom:active:not([data-disabled]):not(:disabled) {
|
|
136
|
+
scale: 1;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* ── prefers-contrast: more — the rim α floors UP (WCAG 1.4.11 non-text) ──
|
|
141
|
+
The keyed rim is the legibility CONTRACT (the cast is a supplement,
|
|
142
|
+
challenge #2 R6). Under more-contrast the atom floors its border ink so the
|
|
143
|
+
lit edge clears ≥3:1 vs the OPAQUE body, not only the glass body. */
|
|
144
|
+
@media (prefers-contrast: more) {
|
|
145
|
+
.glass-atom {
|
|
146
|
+
border-color: color-mix(in srgb, var(--foreground) 24%, transparent);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/* ════════════════════════════════════════════════════════════════════════
|
|
151
|
+
.badge-atom — the Badge consumer of the register (loud + quiet).
|
|
152
|
+
|
|
153
|
+
The LOUD register (the default opaque identity pill): the family signature
|
|
154
|
+
WITHOUT the glass body — the keyed warm rim (the defined edge, the
|
|
155
|
+
`border-transparent` melt fix), the non-uniform press-squish, the
|
|
156
|
+
universal-but-graded cel. The badge applies `.badge-atom` on EVERY variant
|
|
157
|
+
(the CVA base); `surface="glass"` ALSO applies `.glass-capsule .glass-atom`
|
|
158
|
+
for the quiet transmissive body.
|
|
159
|
+
════════════════════════════════════════════════════════════════════════ */
|
|
160
|
+
.badge-atom {
|
|
161
|
+
position: relative;
|
|
162
|
+
/* AQ.W3 identity base — `scale`/`translate` longhands mint the stacking
|
|
163
|
+
context once so the press squash + the cast child compose cleanly. */
|
|
164
|
+
scale: 1;
|
|
165
|
+
translate: 0;
|
|
166
|
+
/* The DEFINED EDGE — the SHIPPED keyed two-stop rim (re-pointed by
|
|
167
|
+
`--glass-key`) as the pill's silhouette, so a sand `secondary` no longer
|
|
168
|
+
melts into a cream panel (the live `border-transparent` melt). It is a
|
|
169
|
+
box-shadow rim, NOT a `border` (the base CVA retired the `border`
|
|
170
|
+
keyword), so it adds zero layout box + reads warm. The press/lift scale
|
|
171
|
+
rides the punch register `× --motion-weight`. */
|
|
172
|
+
box-shadow: var(--glass-material-rim);
|
|
173
|
+
transition:
|
|
174
|
+
background var(--duration-fast) var(--ease-standard),
|
|
175
|
+
box-shadow var(--duration-fast) var(--ease-standard),
|
|
176
|
+
scale var(--duration-normal) var(--ease-cartoon-punch),
|
|
177
|
+
translate var(--duration-normal) var(--ease-cartoon-punch);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* The non-uniform PRESS squash (widen X, compress Y — NOT a uniform shrink). */
|
|
181
|
+
.badge-atom:active:not([data-disabled]):not([aria-disabled='true']) {
|
|
182
|
+
scale: 1.04 0.94;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/* `outline` variant — the rim reads a louder warm-ink edge (it IS the edge). */
|
|
186
|
+
.badge-atom--outline {
|
|
187
|
+
box-shadow: var(--glass-material-rim);
|
|
188
|
+
border: 1px solid color-mix(in srgb, var(--foreground) 14%, transparent);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/* The LOUD cel stamp (opt-in, `data-cast`) — pushes the weight to 1 so the
|
|
192
|
+
punch reads at full amplitude + intensifies the inert child's cast. The
|
|
193
|
+
hairline rim-cast family floor is the rim above; this is the LOUD layered
|
|
194
|
+
offset (the flagship sticker stamp). */
|
|
195
|
+
.badge-atom[data-cast] {
|
|
196
|
+
--motion-weight: 1;
|
|
197
|
+
}
|
|
198
|
+
.badge-atom[data-cast] .cartoon-cast {
|
|
199
|
+
box-shadow: var(--shadow-cartoon-sm);
|
|
200
|
+
}
|
|
201
|
+
@media (hover: hover) {
|
|
202
|
+
.badge-atom[data-cast]:hover:not(:active) .cartoon-cast {
|
|
203
|
+
box-shadow: var(--shadow-cartoon-md);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/* The QUIET glass register — retire the opaque `bg-*` plate so the warm-glass
|
|
208
|
+
`.glass-capsule` body + the `.glass-atom` tinted `background-image` paint the
|
|
209
|
+
surface (no double-fill). The variant `bg-*` utility sets `background-color`;
|
|
210
|
+
this resets it to transparent so the capsule fill + the data-hue tint win.
|
|
211
|
+
The text color (the variant's `text-*`) is kept — the label still reads. */
|
|
212
|
+
.badge-atom--glass {
|
|
213
|
+
background-color: transparent !important;
|
|
214
|
+
/* The quiet capsule tints toward the variant's SEMANTIC hue via the shared
|
|
215
|
+
`--glass-fill-tint` axis (BE.W-TINTED-CHIP) — colored glass, never a
|
|
216
|
+
forked tint. The strength is a calm stop (the body ink stays legible).
|
|
217
|
+
A consumer overrides `--glass-fill-tint` per-instance for a bespoke hue. */
|
|
218
|
+
--glass-fill-strength: var(--badge-glass-strength, 16%);
|
|
219
|
+
}
|
|
220
|
+
/* Per-variant glass tint — the data hue the quiet body mixes toward. The
|
|
221
|
+
semantic plate token becomes the tint source (the loud fill demoted to a
|
|
222
|
+
transmissive hue). `secondary`/`outline` are the calm/neutral routes. */
|
|
223
|
+
.badge-atom--glass[data-variant='default'] { --glass-fill-tint: var(--primary); }
|
|
224
|
+
.badge-atom--glass[data-variant='secondary'] { --glass-fill-tint: var(--glass-capsule-warm); }
|
|
225
|
+
.badge-atom--glass[data-variant='outline'] { --glass-fill-tint: var(--glass-capsule-warm); }
|
|
226
|
+
.badge-atom--glass[data-variant='destructive'] { --glass-fill-tint: var(--destructive); }
|
|
227
|
+
.badge-atom--glass[data-variant='success'] { --glass-fill-tint: var(--success); }
|
|
228
|
+
.badge-atom--glass[data-variant='warning'] { --glass-fill-tint: var(--warning); }
|
|
229
|
+
.badge-atom--glass[data-variant='info'] { --glass-fill-tint: var(--info); }
|
|
230
|
+
|
|
231
|
+
@media (prefers-reduced-motion: reduce) {
|
|
232
|
+
.badge-atom {
|
|
233
|
+
--motion-weight: 0;
|
|
234
|
+
}
|
|
235
|
+
.badge-atom:active:not([data-disabled]) {
|
|
236
|
+
scale: 1;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
@media (prefers-contrast: more) {
|
|
240
|
+
.badge-atom {
|
|
241
|
+
border: 1px solid color-mix(in srgb, var(--foreground) 28%, transparent);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/* ════════════════════════════════════════════════════════════════════════
|
|
2
|
+
.glass-capsule — the ONE shared glassy register (BD.W-TAB-IOS-CAPSULE).
|
|
3
|
+
|
|
4
|
+
The warm-transmissive lifted lozenge + the recessed warm channel it rides in
|
|
5
|
+
+ the glass hover/press register, factored ONCE so EVERY consumer (segmented
|
|
6
|
+
pill · dock-tab selected · Button glass · chips · cards) COMPOSES it instead
|
|
7
|
+
of re-forking the lifted-plate composite. ≥3 consumers by construction — the
|
|
8
|
+
overfitting bar cleared by extraction. The tabs facility is the reference
|
|
9
|
+
implementation; "make buttons glassy like the tabs" is a one-recipe substitution.
|
|
10
|
+
|
|
11
|
+
Clean break — the prior inline `.segmented-indicator` composite (fill + rim +
|
|
12
|
+
lift) moves here VERBATIM and the pill COMPOSES the class. No alias, no legacy.
|
|
13
|
+
|
|
14
|
+
@layer components, @import-ed in index.css AFTER the glass ladder (so the
|
|
15
|
+
`--glass-bg-*`/`--glass-rim-*`/`--glass-shadow-*` tokens resolve) and BEFORE
|
|
16
|
+
the consuming tabs/dock/button recipes.
|
|
17
|
+
|
|
18
|
+
THREE states:
|
|
19
|
+
· REST = .glass-capsule — the warm-glass lifted plate.
|
|
20
|
+
· TRACK = .glass-capsule-track — the recessed warm channel.
|
|
21
|
+
· HOVER = .glass-capsule-hover — specular catch-light lift + press-snap.
|
|
22
|
+
|
|
23
|
+
Every channel is compositor-only + Safari-native by construction (the §7 floor):
|
|
24
|
+
no `backdrop-filter: url()`, no SVG goo, no WebGL. The recess is a STATIC inset
|
|
25
|
+
shadow built off a PLAIN per-mode token pair (NEVER a `light-dark()` fragment —
|
|
26
|
+
an inset-shadow leg inside light-dark() computes the WHOLE box-shadow to `none`,
|
|
27
|
+
the binding MEMORY lesson). The hover lift is a `scale` + `--glass-specular`
|
|
28
|
+
step (the SHARED specular-lift primitive `.glass-drag-lift` also composes).
|
|
29
|
+
════════════════════════════════════════════════════════════════════════ */
|
|
30
|
+
|
|
31
|
+
@layer components {
|
|
32
|
+
/* ── .glass-capsule — the raised lit warm-glass lozenge ──
|
|
33
|
+
The fill reads the SHARED element-level oklab-tinted floating pair (the W55
|
|
34
|
+
adaptive seam, `surfaces.css` `:where(.btn-glass, .segmented-indicator,
|
|
35
|
+
.glass-capsule)`) — over a bright field it darkens-to-legible, over a calm
|
|
36
|
+
field it stays warm-cream/near-white. The FORWARD-ness comes from the rim +
|
|
37
|
+
lift, NOT from cranking the same-hue alpha. */
|
|
38
|
+
.glass-capsule {
|
|
39
|
+
/* The WARM-FLOOR re-invent (BD.W-TAB-IOS-CAPSULE C6). The bare
|
|
40
|
+
`--glass-bg-floating-tinted` desaturates to near-gray over a vibrant
|
|
41
|
+
aurora (live-measured oklab(0.793 0.005 0.012), chroma 0.0128 < 0.02).
|
|
42
|
+
Compose a SMALL floor toward an explicitly WARM oklch source so the
|
|
43
|
+
CAPSULE's own resolved fill carries chroma — independent of the
|
|
44
|
+
`--glass-tint-strength: 0%` adaptive default (which is zero-delta at rest
|
|
45
|
+
and only lifts under the bright bucket). This exercises the REAL
|
|
46
|
+
`color-mix(in oklab)` seam over the live light-dark() fill (NOT a
|
|
47
|
+
hardcoded hsl look-alike — the amendment's fake-gate ban). The source is
|
|
48
|
+
a warm oklch (build-trap-(d) safe form — warm color, never bare
|
|
49
|
+
`transparent`); at `--glass-capsule-warm-floor: 16%` the painted capsule
|
|
50
|
+
clears meanChroma ≥ 0.02 BOTH modes with negligible L lift (stays near-
|
|
51
|
+
white). `--glass-capsule-warm` is a warm cream amber both modes. */
|
|
52
|
+
/* The fill is INDIRECTED through `--glass-capsule-fill` so a consumer can
|
|
53
|
+
re-point the rung (quiet/loud/selected — buttons' quiet triplet, the dock
|
|
54
|
+
selected pill) WITHOUT forking the register; the default keeps the warm
|
|
55
|
+
floor compose. */
|
|
56
|
+
background: var(
|
|
57
|
+
--glass-capsule-fill,
|
|
58
|
+
color-mix(
|
|
59
|
+
in oklab,
|
|
60
|
+
var(--glass-bg-floating-tinted),
|
|
61
|
+
var(--glass-capsule-warm) var(--glass-capsule-warm-floor)
|
|
62
|
+
)
|
|
63
|
+
);
|
|
64
|
+
backdrop-filter: var(--glass-blur-floating);
|
|
65
|
+
-webkit-backdrop-filter: var(--glass-blur-floating);
|
|
66
|
+
/* The lifted-plate composite: the directional rim (bright top catch-light +
|
|
67
|
+
warm bottom under-shadow — the iOS-27 top-light/bottom-shadow thickness)
|
|
68
|
+
PLUS a layered glass under-shadow lifting the plate ~2-3px off the quiet
|
|
69
|
+
track. */
|
|
70
|
+
box-shadow:
|
|
71
|
+
var(--glass-rim-top),
|
|
72
|
+
var(--glass-rim-bottom),
|
|
73
|
+
var(--glass-shadow-floating);
|
|
74
|
+
border-radius: var(--radius-pill);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/* ── .glass-capsule-track — the recessed warm channel (the iOS-27 sunken well) ──
|
|
78
|
+
The track SINKS: rim + a STATIC inset recess leg. The recess ink is a PLAIN
|
|
79
|
+
per-mode token pair (`tokens/glass-fx.css` light arm, `tokens/dark-arm.css`
|
|
80
|
+
dark arm) — NEVER a `light-dark()` fragment (the inset-shadow trap). The
|
|
81
|
+
recess is static (a sunken channel does not pulse — never a @keyframes
|
|
82
|
+
target; `proof:no-layout-animation` holds). */
|
|
83
|
+
.glass-capsule-track {
|
|
84
|
+
background: var(--glass-bg-quiet);
|
|
85
|
+
backdrop-filter: var(--glass-blur-quiet);
|
|
86
|
+
-webkit-backdrop-filter: var(--glass-blur-quiet);
|
|
87
|
+
box-shadow:
|
|
88
|
+
var(--glass-rim-top),
|
|
89
|
+
var(--glass-rim-bottom),
|
|
90
|
+
inset 0 1px 2px var(--tab-track-recess-ink);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* ── .glass-capsule-hover — the SHARED specular-lift primitive ──
|
|
94
|
+
The two-channel glass hover (specular catch-light lift + a hair of scale) +
|
|
95
|
+
the press-snap, on the FAST bezier clock (hover is a bezier ease, not a
|
|
96
|
+
spring), volume-preserving, compositor-only. This is the SAME specular-lift
|
|
97
|
+
idiom `.glass-drag-lift` carries — factored here ONCE; `.glass-drag-lift`
|
|
98
|
+
re-composes `--glass-specular`-step + `will-change` rather than forking a
|
|
99
|
+
parallel block. The non-selected pill + the buttons greenfield compose this
|
|
100
|
+
wholesale: glass at rest + specular-lift on hover + press-snap on active. */
|
|
101
|
+
.glass-capsule-hover {
|
|
102
|
+
/* The SPATIAL leg (scale) rides the weighty cartoon-punch curve (the
|
|
103
|
+
liquid-weight-universal mandate — a hover lift carries inertia/overshoot,
|
|
104
|
+
never an abrupt bezier jerk; the SAME spatial currency `.glass-chip`/
|
|
105
|
+
`.glass-atom` ride, PRM-zeroed via the `--ease-cartoon-punch` fallback). The
|
|
106
|
+
EFFECTS leg (the `--specular-intensity` gleam channel) stays on the fast
|
|
107
|
+
bezier (motion-canon P1 — an effects cross-fade is not a spatial motion). */
|
|
108
|
+
transition:
|
|
109
|
+
scale var(--duration-fast) var(--ease-cartoon-punch),
|
|
110
|
+
--specular-intensity var(--duration-fast) var(--ease-standard);
|
|
111
|
+
}
|
|
112
|
+
/* The SHARED specular-lift step — declared ONCE here, COMPOSED by both the hover
|
|
113
|
+
register AND the drag-lift (BD.W-TAB-IOS-CAPSULE C7: one declaration of the
|
|
114
|
+
`--glass-specular` catch-light step, never a parallel fork). `.glass-drag-lift`
|
|
115
|
+
(segmented-tabs.css) re-points its grabbed-state catch-light onto THIS step
|
|
116
|
+
rather than re-declaring `--glass-specular`; it adds only its distinct grabbing
|
|
117
|
+
bits (the grab cursor + the `will-change` compositor hint). The W-GLASS-CAL
|
|
118
|
+
sub-perceptual catch — a hair brighter at the specular edge, disco-FREE. */
|
|
119
|
+
.glass-capsule-hover:hover,
|
|
120
|
+
.glass-drag-lift {
|
|
121
|
+
/* Drive the REAL gleam-opacity channel (`--specular-intensity`, read by the
|
|
122
|
+
moving-specular `::before` at material.css opacity) — not the dead
|
|
123
|
+
`--glass-specular` name. Composes with the material hover system; fires for
|
|
124
|
+
both the :hover register AND the grabbed `.glass-drag-lift` class. */
|
|
125
|
+
--specular-intensity: 0.14;
|
|
126
|
+
}
|
|
127
|
+
.glass-capsule-hover:hover {
|
|
128
|
+
/* the 1.5% press-ready lift (the lift is hover-only; the drag-lift carries no
|
|
129
|
+
scale of its own — the translate/squish are the morph primitive's writes) */
|
|
130
|
+
scale: 1.015;
|
|
131
|
+
}
|
|
132
|
+
.glass-capsule-hover:active {
|
|
133
|
+
/* the --scale-press snap */
|
|
134
|
+
scale: var(--scale-press-sm, 0.97);
|
|
135
|
+
}
|
|
136
|
+
@media (prefers-reduced-motion: reduce) {
|
|
137
|
+
/* the lift is motion; the specular catch (a static legibility cue) stays. */
|
|
138
|
+
.glass-capsule-hover:hover,
|
|
139
|
+
.glass-capsule-hover:active {
|
|
140
|
+
scale: 1;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|