@mkbabb/glass-ui 3.7.0 → 3.9.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/README.md +1 -6
- package/dist/CardAction-DuArVky-.js +157 -0
- package/dist/{CommandShortcut-CY0aQTz5.js → CommandShortcut-CefCj5mt.js} +7 -7
- package/dist/{ContextMenuSubContent-BeDz7G6f.js → ContextMenuSubContent-Bhg4f5jX.js} +3 -3
- package/dist/{DataTable-gtPOLZvl.js → DataTable-CUHMukiQ.js} +4 -4
- package/dist/DeckProgress-Dmk4_AKN.js +23 -0
- package/dist/{DialogContent-DG1YMR-P.js → DialogContent-BRkT1cjP.js} +3 -3
- package/dist/{DialogFooter-BCIaDP15.js → DialogFooter-Gprw8H_A.js} +1 -1
- package/dist/{HoverPopover-DXpOEw1P.js → HoverPopover-2LOIW34a.js} +1 -1
- package/dist/{IconTooltip-Cu86JR4e.js → IconTooltip-yefK7cJc.js} +1 -1
- package/dist/{MetricBadge-D-bRaQUD.js → MetricBadge-lTc002u2.js} +1 -1
- package/dist/{Notification-B5WHP3_1.js → Notification-BxK8LZMw.js} +1 -1
- package/dist/{NumberFieldContent-CLNVR1iY.js → NumberFieldContent-BbLOh8RU.js} +2 -2
- package/dist/{PopoverContent-F1bWnYoh.js → PopoverContent-BId6ggf_.js} +1 -1
- package/dist/{Progress-c4vo4ALi.js → Progress-iEuD9pxG.js} +4 -4
- package/dist/{ScrollingText-BEp377U5.js → ScrollingText-BPP84wKo.js} +2 -2
- package/dist/{SelectScrollDownButton-DAo5NmY_.js → SelectScrollDownButton-T32cVFeM.js} +4 -4
- package/dist/{SelectSeparator-COFMJGng.js → SelectSeparator-C4Ql0gzV.js} +1 -1
- package/dist/{TabsList-COqIdW7i.js → TabsList-B8CVOQPC.js} +2 -2
- package/dist/{Toaster-BMaeziJJ.js → Toaster-1rYWrmAm.js} +1 -1
- package/dist/{ToggleGroupItem-C-AIkBUw.js → ToggleGroupItem-Cev4pOVK.js} +5 -5
- package/dist/animated-digit.js +1 -1
- package/dist/api/index.d.ts +5 -3
- package/dist/aurora.js +339 -408
- package/dist/{badge-DHQrc_GQ.js → badge-BvwvT50i.js} +4 -4
- package/dist/badge.js +1 -1
- package/dist/{button-CAywcrhO.js → button-DN39cGqL.js} +13 -12
- package/dist/button.js +1 -1
- package/dist/canvas.d.ts +1 -0
- package/dist/canvas.js +3 -0
- package/dist/card.js +1 -1
- package/dist/carousel.js +106 -105
- package/dist/collapsible.js +1 -1
- package/dist/{color-DjJCAQ6f.js → color-8jBjWiJ6.js} +22 -14
- package/dist/color.js +2 -2
- package/dist/command.js +1 -1
- package/dist/compile-DAjIoEy2.js +158 -0
- package/dist/components/custom/aurora/composables/atoms.d.ts +90 -25
- package/dist/components/custom/aurora/composables/color.d.ts +0 -12
- package/dist/components/custom/aurora/composables/uniformBridge.d.ts +34 -23
- package/dist/components/custom/aurora/constants/presets.d.ts +10 -7
- package/dist/components/custom/aurora/constants/renderMode.d.ts +22 -0
- package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +1 -1
- package/dist/components/custom/aurora/constants/shaders/brush.glsl.d.ts +1 -1
- package/dist/components/custom/aurora/constants/shaders/composition.glsl.d.ts +1 -1
- package/dist/components/custom/aurora/constants/shaders/mediums.glsl.d.ts +1 -1
- package/dist/components/custom/aurora/index.d.ts +3 -3
- package/dist/components/custom/configurator/ConfiguratorLayer.vue.d.ts +1 -1
- package/dist/components/custom/constellation/Constellation.vue.d.ts +40 -5
- package/dist/components/custom/constellation/constellationField.d.ts +110 -5
- package/dist/components/custom/constellation/index.d.ts +2 -2
- package/dist/components/custom/dock/DockSeparator.vue.d.ts +3 -0
- package/dist/components/custom/dock/GlassDock.vue.d.ts +57 -67
- package/dist/components/custom/dock/composables/dockContext.d.ts +7 -0
- package/dist/components/custom/dock/composables/dockMorphContext.d.ts +57 -0
- package/dist/components/custom/dock/composables/index.d.ts +3 -0
- package/dist/components/custom/dock/composables/useDockHold.d.ts +61 -0
- package/dist/components/custom/dock/composables/useLayerTransition.d.ts +13 -59
- package/dist/components/custom/dock/index.d.ts +4 -1
- package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +13 -0
- package/dist/components/custom/goo-blob/composables/useBlobMood.d.ts +23 -5
- package/dist/components/custom/goo-blob/composables/useBlobPointer.d.ts +2 -0
- package/dist/components/custom/goo-blob/composables/useBlobSatellites.d.ts +2 -0
- package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +20 -5
- package/dist/components/custom/goo-blob/index.d.ts +1 -1
- package/dist/components/custom/goo-blob/shaders/sdf-body.glsl.d.ts +1 -1
- package/dist/components/custom/goo-blob/shaders/watercolor-edges.glsl.d.ts +2 -2
- package/dist/components/custom/goo-blob/types.d.ts +8 -0
- package/dist/components/custom/tabs/SegmentedTabs.vue.d.ts +92 -0
- package/dist/components/custom/tabs/composables/useTabIndicator.d.ts +49 -0
- package/dist/components/custom/tabs/index.d.ts +2 -5
- package/dist/components/ui/button/index.d.ts +1 -1
- package/dist/components/ui/card/Card.vue.d.ts +28 -10
- package/dist/components/ui/card/index.d.ts +1 -1
- package/dist/components/ui/carousel/CarouselNext.vue.d.ts +1 -1
- package/dist/components/ui/carousel/CarouselPrevious.vue.d.ts +1 -1
- package/dist/components/ui/carousel/GlassCarouselPager.vue.d.ts +3 -4
- package/dist/components/ui/progress/ProgressDefault.vue.d.ts +14 -4
- package/dist/components/ui/slider/Slider.vue.d.ts +3 -1
- package/dist/components/ui/slider/index.d.ts +14 -7
- package/dist/components/ui/tabs/TabsList.vue.d.ts +1 -1
- package/dist/composables/color/index.d.ts +19 -0
- package/dist/composables/context/createContext.d.ts +1 -1
- package/dist/composables/dom/index.d.ts +1 -1
- package/dist/composables/dom/useResolveTokenColor.d.ts +27 -0
- package/dist/composables/glass/canvas2d/index.d.ts +2 -1
- package/dist/composables/glass/canvas2d/resolveCanvasColor.d.ts +20 -0
- package/dist/composables/glass/canvas2d/useCanvas2D.d.ts +15 -1
- package/dist/composables/glass/index.d.ts +3 -1
- package/dist/composables/glass/useSpecularTracking.d.ts +33 -0
- package/dist/composables/glass/webgl/createCanvasLifecycle.d.ts +1 -1
- package/dist/composables/glass/webgl/shaders/procedural-color.glsl.d.ts +4 -0
- package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +1 -1
- package/dist/composables/motion/core/index.d.ts +1 -0
- package/dist/configurator.js +1 -1
- package/dist/confirm-dialog.js +2 -2
- package/dist/constellation.js +143 -74
- package/dist/context-menu.js +2 -2
- package/dist/controls.js +1 -1
- package/dist/data-table.js +1 -1
- package/dist/deck-progress.d.ts +1 -0
- package/dist/deck-progress.js +2 -0
- package/dist/dialog.js +2 -2
- package/dist/dock.js +468 -354
- package/dist/{dockContext-DLgrVWsU.js → dockContext-BKeIMmNk.js} +1 -1
- package/dist/dom.js +6 -6
- package/dist/{dropdown-menu-BWpwutt0.js → dropdown-menu-D77jX6Df.js} +4 -4
- package/dist/dropdown-menu.js +1 -1
- package/dist/fonts/README.md +26 -18
- package/dist/forms.js +5 -5
- package/dist/fourier-field.js +35 -35
- package/dist/glass-panel.js +7 -7
- package/dist/glass-ui.css +1 -1
- package/dist/glass-ui.js +154 -169
- package/dist/goo-blob.js +361 -274
- package/dist/header-ribbon.js +1 -1
- package/dist/hover-card.js +1 -1
- package/dist/hover-popover.js +1 -1
- package/dist/icon-tooltip.js +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/instrument-chassis.js +1 -1
- package/dist/instrument-rail.js +1 -1
- package/dist/label.js +1 -1
- package/dist/labeled-field.js +5 -5
- package/dist/{menuItemVariants-B4eFR5Ix.js → menuItemVariants-CCoBNkU5.js} +1 -1
- package/dist/metric-badge.js +1 -1
- package/dist/metric-stack.js +1 -1
- package/dist/motion-core.js +65 -65
- package/dist/motion.js +1 -1
- package/dist/notification.js +1 -1
- package/dist/number-field.js +1 -1
- package/dist/paper-backdrop.js +1 -1
- package/dist/popover.js +1 -1
- package/dist/progress.js +1 -1
- package/dist/pulse.js +2 -2
- package/dist/reactive.js +2 -2
- package/dist/resolveCanvasColor-BBiYfp8g.js +11 -0
- package/dist/scrolling-text.js +1 -1
- package/dist/search.js +9 -9
- package/dist/select.js +3 -3
- package/dist/separator.js +1 -1
- package/dist/{sheet-Cv1uO-Gq.js → sheet-VZEtNFvO.js} +2 -2
- package/dist/sheet.js +1 -1
- package/dist/slider-DC2mwuoe.js +142 -0
- package/dist/slider.js +1 -1
- package/dist/sortable-list.js +2 -2
- package/dist/status-dot.js +17 -16
- package/dist/styles/animations.css +6 -2
- package/dist/styles/components.css +1 -1
- package/dist/styles/dock/density.css +230 -0
- package/dist/styles/dock/layer-group.css +263 -0
- package/dist/styles/dock/layers.css +355 -0
- package/dist/styles/dock/morph.css +244 -0
- package/dist/styles/dock/overflow.css +201 -0
- package/dist/styles/dock/shell.css +457 -0
- package/dist/styles/dock-controls.css +187 -50
- package/dist/styles/dock.css +65 -1181
- package/dist/styles/fonts.css +0 -25
- package/dist/styles/glass.css +482 -102
- package/dist/styles/index.css +12 -11
- package/dist/styles/theme.css +60 -2
- package/dist/styles/tokens.css +625 -72
- package/dist/styles/typography.css +52 -69
- package/dist/styles/utilities.css +91 -40
- package/dist/styles/view-transition.css +12 -40
- package/dist/switch.js +1 -1
- package/dist/tabs.js +183 -152
- package/dist/timeline.js +3 -3
- package/dist/toast.js +1 -1
- package/dist/toggle-group.js +1 -1
- package/dist/tooltip.js +1 -1
- package/dist/typewriter.js +1 -1
- package/dist/{useCanvas2D-C31yfUGY.js → useCanvas2D-ClrQuZtp.js} +2 -1
- package/dist/{useConfiguratorState-B24TcgIn.js → useConfiguratorState-DxAqksK6.js} +24 -13
- package/dist/useResolveTokenColor-r9pnNjqK.js +24 -0
- package/dist/useSpecularTracking-BVRZsRHA.js +26 -0
- package/dist/{useTextHighlight-aMPdEpkq.js → useTextHighlight-DON84L8w.js} +1 -1
- package/dist/{useTouchGate-YQRwyUGU.js → useTouchGate-WFyJYsth.js} +1 -1
- package/dist/vReveal-CqaCz_mC.js +44 -0
- package/dist/watercolor-dot.js +1 -1
- package/package.json +67 -36
- package/src/fonts/README.md +26 -18
- package/src/styles/animations.css +6 -2
- package/src/styles/dock/density.css +230 -0
- package/src/styles/dock/layer-group.css +263 -0
- package/src/styles/dock/layers.css +355 -0
- package/src/styles/dock/morph.css +244 -0
- package/src/styles/dock/overflow.css +201 -0
- package/src/styles/dock/shell.css +457 -0
- package/src/styles/dock-controls.css +187 -50
- package/src/styles/dock.css +65 -1181
- package/src/styles/fonts.css +0 -25
- package/src/styles/glass.css +482 -102
- package/src/styles/index.css +12 -11
- package/src/styles/theme.css +60 -2
- package/src/styles/tokens.css +625 -72
- package/src/styles/typography.css +52 -69
- package/src/styles/utilities.css +91 -40
- package/src/styles/view-transition.css +12 -40
- package/dist/CardAction-D8nSE62a.js +0 -163
- package/dist/DiscoGlyph-ZoBYpoxI.js +0 -132
- package/dist/GlyphFace-Ce_oe3tM.js +0 -51
- package/dist/UnderlineTabs-D_c1iYo-.js +0 -39
- package/dist/compile-iM4IUB66.js +0 -158
- package/dist/components/custom/aurora/constants/shaders/painterly.wgsl.d.ts +0 -7
- package/dist/components/custom/aurora/constants/shaders/wake.wgsl.d.ts +0 -4
- package/dist/components/custom/disco-glyph/DiscoGlyph.vue.d.ts +0 -58
- package/dist/components/custom/disco-glyph/index.d.ts +0 -1
- package/dist/components/custom/glass-carousel/GlassCarousel.vue.d.ts +0 -36
- package/dist/components/custom/glass-carousel/GlassCarouselItem.vue.d.ts +0 -28
- package/dist/components/custom/glass-carousel/index.d.ts +0 -4
- package/dist/components/custom/glass-carousel/useGlassCarousel.d.ts +0 -30
- package/dist/components/custom/glyph-face/GlyphFace.vue.d.ts +0 -64
- package/dist/components/custom/glyph-face/index.d.ts +0 -2
- package/dist/components/custom/glyph-face/keys.d.ts +0 -9
- package/dist/components/custom/responsive-tabs/ResponsiveTabs.vue.d.ts +0 -73
- package/dist/components/custom/responsive-tabs/index.d.ts +0 -2
- package/dist/components/custom/tabs/BouncyTabs.vue.d.ts +0 -27
- package/dist/components/custom/tabs/BouncyToggle.vue.d.ts +0 -60
- package/dist/components/custom/tabs/UnderlineTabs.vue.d.ts +0 -20
- package/dist/components/custom/tabs/composables/useBouncySlider.d.ts +0 -39
- package/dist/disco-glyph.d.ts +0 -1
- package/dist/disco-glyph.js +0 -2
- package/dist/fonts/fraunces/fraunces-latin.woff2 +0 -0
- package/dist/glass-carousel.d.ts +0 -1
- package/dist/glass-carousel.js +0 -214
- package/dist/glyph-face.d.ts +0 -1
- package/dist/glyph-face.js +0 -3
- package/dist/keys-Dyf_uTs5.js +0 -9
- package/dist/responsive-tabs.d.ts +0 -1
- package/dist/responsive-tabs.js +0 -95
- package/dist/slider-BA9wIs5e.js +0 -130
- package/dist/styles/disco-glyph.css +0 -26
- package/dist/styles/glyph-face.css +0 -92
- package/dist/useViewTransition-DaN5Zrox.js +0 -21
- package/dist/vReveal-BE2TsPoR.js +0 -24
- package/src/fonts/fraunces/fraunces-latin.woff2 +0 -0
- package/src/styles/disco-glyph.css +0 -26
- package/src/styles/glyph-face.css +0 -92
- /package/dist/{CollapsibleContent-D7UNsXQr.js → CollapsibleContent-CP9qF1v4.js} +0 -0
- /package/dist/{ContextMenuContent-DGKZX1Du.js → ContextMenuContent-DDa0v27s.js} +0 -0
- /package/dist/{HoverCardContent-Bn0UBMY9.js → HoverCardContent-B6CcQ8He.js} +0 -0
- /package/dist/{InstrumentChassis-BLJBl1BW.js → InstrumentChassis-C2f6cBaQ.js} +0 -0
- /package/dist/{InstrumentRail-BElFwKyt.js → InstrumentRail-CUJ05YVG.js} +0 -0
- /package/dist/{Label-DBc7bKzZ.js → Label-zRfbQdCn.js} +0 -0
- /package/dist/{ModalOverlay-D1VrWyoi.js → ModalOverlay-B1GkAjNb.js} +0 -0
- /package/dist/{PaperBackdrop-DCGoGatv.js → PaperBackdrop-CqwjnfLv.js} +0 -0
- /package/dist/{SelectGroup-BcaFjvP4.js → SelectGroup-BFiod7X2.js} +0 -0
- /package/dist/{Separator-DZyqsCum.js → Separator-D7sD7RKj.js} +0 -0
- /package/dist/{Switch-2rsAtDfA.js → Switch-LDKLmmgx.js} +0 -0
- /package/dist/{TooltipProvider-CD2IXfRv.js → TooltipProvider-CmZzCuaG.js} +0 -0
- /package/dist/{_plugin-vue_export-helper-gLzyemvl.js → _plugin-vue_export-helper-ok8pgSl5.js} +0 -0
- /package/dist/composables/{dom → motion}/useTextHighlight.d.ts +0 -0
- /package/dist/{createContext-CvNyBk4o.js → createContext-B44Sah_H.js} +0 -0
- /package/dist/{useGlassRenderer-HebgSEgN.js → useGlassRenderer-5I0YkI4t.js} +0 -0
- /package/dist/{useInterval-D3USn0yc.js → useInterval-Dsmqwi03.js} +0 -0
- /package/dist/{useResizeObserver-CSyxGxIX.js → useResizeObserver-CWCbk5Px.js} +0 -0
- /package/dist/{useSpringMount-LRZqJTaF.js → useSpringMount-BJSHcLl3.js} +0 -0
- /package/dist/{useTimer-DEJonOZa.js → useTimer-3xqf_54b.js} +0 -0
- /package/dist/{useUserInvalidAria-CQKjEfwP.js → useUserInvalidAria-DoJKMZ3s.js} +0 -0
- /package/dist/{useViewportReady-K96m-Mdv.js → useViewportReady-RIr5Wgkh.js} +0 -0
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
/* dock/layers.css — the `.dock-layer` crossfade + hit-test + reveal-stagger
|
|
2
|
+
* contract (AX.W06 carve).
|
|
3
|
+
*
|
|
4
|
+
* Carved from the dock.css god-module (slice 25). This partial owns the dock's
|
|
5
|
+
* layer model: the `.dock-layers` grid container + the FLIP-driven box-size morph
|
|
6
|
+
* (the `--dock-morph-size` calc off the ONE `--dock-morph-t` scalar), the unified
|
|
7
|
+
* `.is-active` / `.is-leaving` 3-state crossfade + hit-test contract (the
|
|
8
|
+
* a11y-006 anchor), the per-child reveal stagger (the `--dock-stagger-*` ramp),
|
|
9
|
+
* and the `layout="grid"` 2D tile-grid arrangement. The `.dock-layer-group` /
|
|
10
|
+
* rail / stack live in dock/layer-group.css; the overflow strategies in
|
|
11
|
+
* dock/overflow.css.
|
|
12
|
+
*
|
|
13
|
+
* @import-ed by dock.css in cascade order, in the SAME `@layer components` — the
|
|
14
|
+
* carve is isomorphic (same layer, same source order → ZERO visual delta). */
|
|
15
|
+
|
|
16
|
+
@layer components {
|
|
17
|
+
/* J.W3.A — outer collapsed↔expanded pair drives width via FLIP.
|
|
18
|
+
`useLayerTransition` measures the natural width before/after the
|
|
19
|
+
slot swap and animates `width` between fixed pixel values via
|
|
20
|
+
the `--dock-motion-resize` spring; this eliminates the
|
|
21
|
+
`width: auto` non-interpolation diagnosed in R1+R6. The two
|
|
22
|
+
layers stack on a CSS grid (1/1 area) and crossfade opacity
|
|
23
|
+
in step with the FLIP. Spatial motion (width) is automatically
|
|
24
|
+
suppressed by the global `prefers-reduced-motion` gate in
|
|
25
|
+
`utilities.css` (which strips width from transition-property).
|
|
26
|
+
Opacity transitions remain — the 0.1s shortened cadence in PRM
|
|
27
|
+
still reads as a snap.
|
|
28
|
+
|
|
29
|
+
J.W3.C — when the active layer's natural width exceeds
|
|
30
|
+
`--dock-max-inline-size`, the dock root clips and the layer
|
|
31
|
+
scrolls horizontally with a mask-fade. `min-width: 0` lets the
|
|
32
|
+
grid item shrink under the cap (default min-content is the
|
|
33
|
+
child's intrinsic width which would prevent the clamp). */
|
|
34
|
+
.dock-layers {
|
|
35
|
+
display: grid;
|
|
36
|
+
min-width: 0;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
/* AX.W01 — the box size morph reads the SAME `--dock-morph-t` scalar as the
|
|
41
|
+
root chrome (ONE clock, co-temporal by construction). `useLayerTransition`
|
|
42
|
+
measures the from→to size ONCE per swap (the allowed one-time FLIP
|
|
43
|
+
measurement) and writes `--dock-morph-from`/`--dock-morph-to` px on the
|
|
44
|
+
morphing element; the live scalar interpolates between them. The size lands
|
|
45
|
+
on the morph AXIS — `inline-size` for a horizontal `.dock-layers` (always
|
|
46
|
+
inline) + a horizontal inner stack, `block-size` for a vertical inner stack.
|
|
47
|
+
Gated on the root `[data-morphing]`, so at REST the intrinsic / `width:100%`
|
|
48
|
+
rules below hold (the morph vars are cleared on settle). Replaces the prior
|
|
49
|
+
`transition: width var(--dock-motion-resize)` inline-FLIP — there is NO CSS
|
|
50
|
+
transition on the size axis; the spring writes the scalar, CSS reads it. The
|
|
51
|
+
active pane is REVEALED through the clip aperture as the box grows (the W2
|
|
52
|
+
clip-reveal contract). */
|
|
53
|
+
.glass-dock[data-morphing] .dock-layers,
|
|
54
|
+
.glass-dock[data-morphing] .dock-layer-stack {
|
|
55
|
+
--dock-morph-size: calc(
|
|
56
|
+
var(--dock-morph-from, 0px) +
|
|
57
|
+
(var(--dock-morph-to, 0px) - var(--dock-morph-from, 0px)) *
|
|
58
|
+
var(--dock-morph-t, 0)
|
|
59
|
+
);
|
|
60
|
+
inline-size: var(--dock-morph-size);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* A vertical inner group morphs the BLOCK axis — the same span lands on
|
|
64
|
+
block-size, and the inline axis stays intrinsic. */
|
|
65
|
+
.glass-dock[data-morphing] .dock-layer-group.vertical .dock-layer-stack {
|
|
66
|
+
inline-size: auto;
|
|
67
|
+
block-size: var(--dock-morph-size);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/* The inner DockLayerGroup stack has no collapsed/expanded class, so its
|
|
71
|
+
stagger directional scalar is the per-swap progress directly: `--dock-morph-t`
|
|
72
|
+
reads onto an inheriting `--dock-expand-t` on the morphing stack so the new
|
|
73
|
+
pane's children cascade in as it reveals. The geometry scalar
|
|
74
|
+
(`--dock-morph-t`) stays registered + non-inheriting on the root; this is the
|
|
75
|
+
small-subtree inheriting alias the stagger reads (the inheritance-bomb guard
|
|
76
|
+
only concerns the `:root`-wide write, which never happens). */
|
|
77
|
+
.glass-dock[data-morphing] .dock-layer-stack {
|
|
78
|
+
--dock-expand-t: var(--dock-morph-t, 1);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* Horizontal dock content grows visibly when the active layer's natural
|
|
82
|
+
width exceeds the content area (grow-to-fit; consumers needing wrap opt
|
|
83
|
+
into `overflow="wrap"`). No edge-fade mask — content never clips or scrolls,
|
|
84
|
+
so a feather has nothing to feather and only bleeds a stray ramp onto
|
|
85
|
+
the edge controls. */
|
|
86
|
+
.glass-dock.expanded:not(.dock-overflow-wrap) > .dock-layers {
|
|
87
|
+
overflow-x: visible;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* ── Layer crossfade + hit-test contract (ONE vocabulary) ──────────────
|
|
91
|
+
AX.W02 — the outer `.dock-layer` (GlassDock's built-in collapsed↔expanded
|
|
92
|
+
pair) and the inner `.dock-layer-item-host` (a DockLayer inside a
|
|
93
|
+
DockLayerGroup) now share ONE active-state vocabulary: `.is-active` /
|
|
94
|
+
`.is-leaving`. The prior `.layer-active` / `.is-active` / `.is-leaving`
|
|
95
|
+
TRIPLE collapsed to the pair — both surfaces drive crossfade + hit-test off
|
|
96
|
+
the same two state classes, and the morph orchestrator fold (one engine per
|
|
97
|
+
dock) means the box, both panes, and every child stagger ride one
|
|
98
|
+
`--dock-morph-t` clock. The greppable-sync tombstone that kept the two
|
|
99
|
+
never-merged vocabularies in lockstep is DELETED — there is nothing to keep
|
|
100
|
+
in sync once the vocabulary is one.
|
|
101
|
+
|
|
102
|
+
The 3-state active/inactive/leaving visibility contract here is LOAD-BEARING
|
|
103
|
+
(the a11y-006 anchor): the inactive layer leaves the hit-test tree
|
|
104
|
+
(`visibility:hidden`), the leaving layer stays painted-but-untouchable
|
|
105
|
+
through its fade (`visibility:visible` + `pointer-events:none`), and the
|
|
106
|
+
active layer shows IMMEDIATELY (`visibility 0s`, no fade-in delay). One
|
|
107
|
+
owner governs each concern — size = the spring scalar, opacity = the CSS
|
|
108
|
+
crossfade below, visibility = this 3-state fork.
|
|
109
|
+
|
|
110
|
+
An inactive layer must leave the paint AND hit-test tree: `opacity:0` alone
|
|
111
|
+
leaves the box answering `elementFromPoint()`, so an inactive layer's button
|
|
112
|
+
intercepts clicks meant for the active one. `visibility:hidden` removes it
|
|
113
|
+
from both while KEEPING it in layout flow, so the FLIP measurement still
|
|
114
|
+
reads its geometry (`display:none` would zero it). The delayed `visibility`
|
|
115
|
+
transition holds a leaving layer `visible` for the length of the opacity
|
|
116
|
+
crossfade, then flips it `hidden`.
|
|
117
|
+
|
|
118
|
+
AX.W45 DK7 — the crossfade is now on the ONE `--dock-morph-t` scalar (the
|
|
119
|
+
SAME clock the box size + child stagger ride), NOT a parallel fixed-duration
|
|
120
|
+
CSS transition. The prior `opacity var(--dock-motion-resize)` was a SECOND
|
|
121
|
+
clock: a velocity-dependent spring settles its meaningful travel in ~0.18s
|
|
122
|
+
while the 0.3s CSS transition lingered, so the leaving pane ghosted over the
|
|
123
|
+
settled box — the "laggy/delayed" layer-switch the user read. Driving the
|
|
124
|
+
leaving-pane opacity off `calc(1 - var(--dock-morph-t))` makes the fade a pure
|
|
125
|
+
FUNCTION of the same `t`: an interrupted/retargeted switch carries the
|
|
126
|
+
crossfade WITH it (no second timer to drift). Visibility is the ONLY surviving
|
|
127
|
+
CSS-timed leg — a 0s hold over `--duration-normal` keeps the leaving pane
|
|
128
|
+
paintable through the fade, then flips it hidden (the a11y-006 hit-test
|
|
129
|
+
anchor); the spring-settle clears the morph state so the hold releases in
|
|
130
|
+
lockstep. The base rule keeps NO opacity transition (the scalar IS the clock). */
|
|
131
|
+
.dock-layer,
|
|
132
|
+
.dock-layer-item-host {
|
|
133
|
+
transition: visibility 0s linear var(--duration-normal);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.dock-layer:not(.is-active):not(.is-leaving),
|
|
137
|
+
.dock-layer-item-host:not(.is-active):not(.is-leaving) {
|
|
138
|
+
opacity: 0;
|
|
139
|
+
visibility: hidden;
|
|
140
|
+
pointer-events: none;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.dock-layer.is-active,
|
|
144
|
+
.dock-layer-item-host.is-active {
|
|
145
|
+
opacity: 1;
|
|
146
|
+
visibility: visible;
|
|
147
|
+
pointer-events: auto;
|
|
148
|
+
/* AW.W2 — the active pane is STATICALLY opacity:1, REVEALED by the clip
|
|
149
|
+
aperture (the box is the reveal mechanism), never faded. There is ZERO
|
|
150
|
+
opacity authority on the active pane — the aperture uncovers a layout
|
|
151
|
+
that is laid out ONCE at natural size behind it. Only `visibility 0s`
|
|
152
|
+
survives (the active layer must paint at once, no fade-in delay — the
|
|
153
|
+
AU.W2 governing rule). The leaving pane fades on the scalar below. */
|
|
154
|
+
transition: visibility 0s;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/* AX.W45 DK7 — the leaving pane fades on the ONE `--dock-morph-t` scalar (the
|
|
158
|
+
single clock the box rides), gated on `[data-morphing]`. At rest (no morph)
|
|
159
|
+
the leaving class is already gone, so the scalar-fade is only authored DURING
|
|
160
|
+
the morph. `opacity: calc(1 - var(--dock-morph-t))` runs 1→0 as the box
|
|
161
|
+
morphs, in perfect lockstep — no ghost, no flash, no second timer. The pane
|
|
162
|
+
stays painted (visibility:visible) + untouchable (pointer-events:none) through
|
|
163
|
+
the fade; the base-rule `visibility 0s linear var(--duration-normal)` hold
|
|
164
|
+
flips it hidden once the morph state clears on spring-settle. */
|
|
165
|
+
.dock-layer.is-leaving,
|
|
166
|
+
.dock-layer-item-host.is-leaving {
|
|
167
|
+
opacity: 0;
|
|
168
|
+
visibility: visible;
|
|
169
|
+
pointer-events: none;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.glass-dock[data-morphing] .dock-layer.is-leaving,
|
|
173
|
+
.glass-dock[data-morphing] .dock-layer-item-host.is-leaving {
|
|
174
|
+
opacity: calc(1 - var(--dock-morph-t));
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/* AX.W45 — opacity now has ONE owner: the `--dock-morph-t` scalar (the leaving
|
|
178
|
+
pane via `calc(1 - t)`, the entering pane revealed by the clip aperture +
|
|
179
|
+
child stagger off the SAME scalar). Visibility keeps ONE owner: the delayed
|
|
180
|
+
`visibility 0s linear var(--duration-normal)` hold of the 3-state fork above
|
|
181
|
+
(the a11y-006 hit-test anchor, LOAD-BEARING) released on spring-settle. ONE
|
|
182
|
+
clock, every axis — the W01/W02 single-scalar thesis FINISHED for opacity. */
|
|
183
|
+
|
|
184
|
+
/* ── Base layout — distinct per surface ─────────────────────────── */
|
|
185
|
+
.dock-layer {
|
|
186
|
+
display: flex;
|
|
187
|
+
align-items: center;
|
|
188
|
+
grid-area: 1 / 1;
|
|
189
|
+
gap: var(--dock-layer-gap, 0.375rem);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* AW.W2 — content-intrinsic axis follows the MORPH axis. A horizontal dock
|
|
193
|
+
lays its inline content out ONCE at `width: max-content` (nowrap) so the
|
|
194
|
+
width aperture uncovers a static row; the fixed `height` keeps the row a
|
|
195
|
+
single line. Scoped to `:not(.vertical)` so a vertical rail (whose
|
|
196
|
+
block-axis morph reveals a column) is NOT forced onto one nowrap row — the
|
|
197
|
+
vertical group's active host block-sizes to `height: max-content` below
|
|
198
|
+
(the AP.W3 column treatment, KEPT). */
|
|
199
|
+
.glass-dock:not(.vertical) .dock-layer {
|
|
200
|
+
white-space: nowrap;
|
|
201
|
+
height: var(--dock-layer-height, 2.5rem);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.dock-layer.is-active {
|
|
205
|
+
position: relative;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.dock-layer:not(.is-active) {
|
|
209
|
+
position: absolute;
|
|
210
|
+
inset: 0;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/* AX.W01 — the spring-keyed child stagger, now off the SINGLE morph scalar.
|
|
214
|
+
The driver writes `--dock-morph-t` to the `.glass-dock` root and arms
|
|
215
|
+
`[data-morphing]` while the spring runs; `--dock-expand-t` (the inheriting
|
|
216
|
+
directional expanded-ness derived above — 0 collapsed, 1 expanded) cascades
|
|
217
|
+
to the active pane's children. Each direct child reveals when `--dock-expand-t`
|
|
218
|
+
crosses its per-child onset, so the controls cascade IN ON the physical morph
|
|
219
|
+
— symmetric in both directions (expand fades them in outer→in, collapse fades
|
|
220
|
+
them back out) and an interrupted morph carries the cascade with it (no
|
|
221
|
+
orphaned timers). The active PANE stays statically opacity:1 (revealed by the
|
|
222
|
+
clip aperture); only its CHILDREN ride this per-child onset (the W2
|
|
223
|
+
clip-reveal contract is NOT regressed).
|
|
224
|
+
|
|
225
|
+
The reveal is a pure `calc` ramp: `opacity = clamp(0, (expand-t − onset) /
|
|
226
|
+
window, 1)`. Gated on the root `[data-morphing]` so at REST the children
|
|
227
|
+
carry no opacity authority (default cascade → 1). Under PRM the spring's
|
|
228
|
+
`respectReducedMotion` jumps `--dock-morph-t` 0→1 in one frame → `--dock-expand-t`
|
|
229
|
+
lands at the endpoint → the cascade collapses to 0 stagger frames; the
|
|
230
|
+
global PRM gate strips `translate` so the rise snaps too. The inner
|
|
231
|
+
DockLayerGroup defines its own `--dock-expand-t` (= the per-swap progress)
|
|
232
|
+
in DockLayerGroup's scope so a pane swap reveals the new pane's children. */
|
|
233
|
+
.glass-dock[data-morphing] .dock-layer.is-active > *,
|
|
234
|
+
.glass-dock[data-morphing] .dock-layer-item-host.is-active > * {
|
|
235
|
+
--dock-stagger-window: var(--dock-stagger-window-size, 0.55);
|
|
236
|
+
--dock-stagger-onset: 0;
|
|
237
|
+
opacity: clamp(
|
|
238
|
+
0,
|
|
239
|
+
calc(
|
|
240
|
+
(var(--dock-expand-t, 1) - var(--dock-stagger-onset)) /
|
|
241
|
+
var(--dock-stagger-window)
|
|
242
|
+
),
|
|
243
|
+
1
|
|
244
|
+
);
|
|
245
|
+
translate: 0
|
|
246
|
+
calc(
|
|
247
|
+
(1 - clamp(0, calc((var(--dock-expand-t, 1) - var(--dock-stagger-onset)) / var(--dock-stagger-window)), 1)) *
|
|
248
|
+
var(--dock-stagger-rise, 4px)
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/* AX.W02 — per-child onsets off the ONE `--dock-stagger-step` token. Each
|
|
253
|
+
successive control starts `step` later than the one before it (`onset =
|
|
254
|
+
step × (childIndex − 1)`), so the row fills outer→in on expand. The
|
|
255
|
+
hand-typed 0.08/0.16/0.24/0.32/0.4 ladder is RETIRED — the onsets are now
|
|
256
|
+
derived from the single token, so retuning the cascade beat is a one-token
|
|
257
|
+
override. The set is capped at the 6th child (`nth-child(n + 6)` holds at
|
|
258
|
+
`step × 5`) so even a long row finishes within the morph window. ONE rule
|
|
259
|
+
over the unified `.is-active` vocabulary drives both the outer pane and the
|
|
260
|
+
inner pane-stack — no duplicated comma-group. (`sibling-index()` would
|
|
261
|
+
collapse this to a single declaration, but it is not yet Baseline across
|
|
262
|
+
Safari/Firefox — the token-keyed nth-child set is the cross-engine form, and
|
|
263
|
+
the magic ladder is gone either way.) */
|
|
264
|
+
.glass-dock[data-morphing] .dock-layer.is-active > *:nth-child(2),
|
|
265
|
+
.glass-dock[data-morphing] .dock-layer-item-host.is-active > *:nth-child(2) {
|
|
266
|
+
--dock-stagger-onset: calc(var(--dock-stagger-step) * 1);
|
|
267
|
+
}
|
|
268
|
+
.glass-dock[data-morphing] .dock-layer.is-active > *:nth-child(3),
|
|
269
|
+
.glass-dock[data-morphing] .dock-layer-item-host.is-active > *:nth-child(3) {
|
|
270
|
+
--dock-stagger-onset: calc(var(--dock-stagger-step) * 2);
|
|
271
|
+
}
|
|
272
|
+
.glass-dock[data-morphing] .dock-layer.is-active > *:nth-child(4),
|
|
273
|
+
.glass-dock[data-morphing] .dock-layer-item-host.is-active > *:nth-child(4) {
|
|
274
|
+
--dock-stagger-onset: calc(var(--dock-stagger-step) * 3);
|
|
275
|
+
}
|
|
276
|
+
.glass-dock[data-morphing] .dock-layer.is-active > *:nth-child(5),
|
|
277
|
+
.glass-dock[data-morphing] .dock-layer-item-host.is-active > *:nth-child(5) {
|
|
278
|
+
--dock-stagger-onset: calc(var(--dock-stagger-step) * 4);
|
|
279
|
+
}
|
|
280
|
+
.glass-dock[data-morphing] .dock-layer.is-active > *:nth-child(n + 6),
|
|
281
|
+
.glass-dock[data-morphing] .dock-layer-item-host.is-active > *:nth-child(n + 6) {
|
|
282
|
+
--dock-stagger-onset: calc(var(--dock-stagger-step) * 5);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/* AW.W2 — the at-rest clip-lift moved to `.expanded:not([data-morphing])` /
|
|
286
|
+
`.always-expanded:not([data-morphing])` (the clip-shell block at the top).
|
|
287
|
+
A plain `overflow: visible` here would lift the clip DURING the morph (the
|
|
288
|
+
load-bearing sequencing gap), so the `overflow` declarations are dropped
|
|
289
|
+
from these state rules; they keep only their non-overflow concerns.
|
|
290
|
+
|
|
291
|
+
AX.W01 — `:not([data-morphing])` gate: at REST expanded the layers fill the
|
|
292
|
+
box (`width:100%`), but DURING the morph the FLIP from→to px (the
|
|
293
|
+
`--dock-morph-size` calc above) is the SOLE size authority — a `width:100%`
|
|
294
|
+
here would win on specificity and snap the box past the spring. The gate
|
|
295
|
+
hands the size to the scalar for the morph and back to 100% on settle. */
|
|
296
|
+
.glass-dock.expanded:not(.fit-content):not([data-morphing]) .dock-layers {
|
|
297
|
+
width: 100%;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
.glass-dock.expanded:not(.fit-content) .dock-layer--full {
|
|
301
|
+
width: 100%;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
.glass-dock.always-expanded {
|
|
305
|
+
cursor: default;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/* ── AW.W3b — `layout="grid"` the 2D auto-grid big dock ──────────────
|
|
309
|
+
The active layer becomes a self-wrapping tile grid (Launchpad / Stage-Manager
|
|
310
|
+
track symmetry — `auto-fill` columns floored at `--dock-tile-min`, explicit
|
|
311
|
+
`grid-auto-rows` so the concentric look holds). DISTINCT from
|
|
312
|
+
`overflow="wrap"`'s content-ordered flex-wrap. A `layout="grid"` dock is
|
|
313
|
+
`alwaysExpanded` by contract (GlassDock.vue), so there is NO width morph and
|
|
314
|
+
hence NO per-frame grid-column reflow. `white-space: normal` releases the
|
|
315
|
+
single-row nowrap so the tiles wrap. */
|
|
316
|
+
.glass-dock.layout-grid {
|
|
317
|
+
white-space: normal;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.glass-dock.layout-grid .dock-layer--full {
|
|
321
|
+
display: grid;
|
|
322
|
+
grid-template-columns: repeat(
|
|
323
|
+
auto-fill,
|
|
324
|
+
minmax(var(--dock-tile-min, 4.5rem), 1fr)
|
|
325
|
+
);
|
|
326
|
+
grid-auto-rows: var(--dock-tile-min, 4.5rem);
|
|
327
|
+
gap: var(--dock-layer-gap, 0.375rem);
|
|
328
|
+
width: 100%;
|
|
329
|
+
height: auto;
|
|
330
|
+
white-space: normal;
|
|
331
|
+
/* AX.W45 DK4-a — center each fixed-size button in its tile cell on BOTH
|
|
332
|
+
axes. The grid layer only inherited `align-items: center` (block axis);
|
|
333
|
+
`justify-items` defaulted to `stretch`, which degenerates to `start` for a
|
|
334
|
+
fixed-width `inline-flex` button — so every icon hugged the inline-start
|
|
335
|
+
(left) edge of its tile, ~16px off-center (the "big-dock icons are not
|
|
336
|
+
aligned" defect). `place-items: center` centers on both axes, MIRRORING the
|
|
337
|
+
flex-wrap layer's `justify-content: center`. */
|
|
338
|
+
place-items: center;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/* A grid dock fills the inline cap; the active layer is the panel body, not a
|
|
342
|
+
shrink-to-fit row. The cap is the `--dock-max-inline-size` clamp (KEPT). */
|
|
343
|
+
.glass-dock.layout-grid .dock-layers {
|
|
344
|
+
width: 100%;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/* CONCENTRIC inner tiles — inner radius = outer card radius − padding (the
|
|
348
|
+
universal macOS / visionOS / Raycast rule). NEVER nest two pills
|
|
349
|
+
(stadium-in-stadium); a finite outer + a stepped-down inner. */
|
|
350
|
+
.glass-dock.layout-grid.shape-card .dock-layer--full > * {
|
|
351
|
+
border-radius: calc(
|
|
352
|
+
var(--dock-card-radius) - var(--dock-padding-inline, 0.5rem)
|
|
353
|
+
);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/* dock/morph.css — the SINGLE-SCALAR morph chrome + state response (AX.W06 carve).
|
|
2
|
+
*
|
|
3
|
+
* Carved from the dock.css god-module (slice 25). This partial owns the dock's
|
|
4
|
+
* DYNAMIC chrome: the W01 `--dock-expand-t` directional expanded-ness derivation,
|
|
5
|
+
* the root background/border/padding interpolation on the ONE `--dock-morph-t`
|
|
6
|
+
* clock, the collapsed/summary state (the W45-TUNE Q1 proportioned pill + the
|
|
7
|
+
* summary glyph reveal), the held / open-descendant surface response, and the
|
|
8
|
+
* W55 adaptive-legibility `--glass-backdrop: light` bucket. The static structural
|
|
9
|
+
* surface (root, clip, variants, persistent) lives in dock/shell.css.
|
|
10
|
+
*
|
|
11
|
+
* @import-ed by dock.css in cascade order, in the SAME `@layer components` — the
|
|
12
|
+
* carve is isomorphic (same layer, same source order → ZERO visual delta). */
|
|
13
|
+
|
|
14
|
+
@layer components {
|
|
15
|
+
/* AX.W01 — the root chrome morphs off the SINGLE `--dock-morph-t` scalar, NOT a
|
|
16
|
+
CSS transition (the prior `padding/scale/radius var(--dock-motion-resize)` +
|
|
17
|
+
`background/border-color var(--dock-motion-standard)` transition list — TWO
|
|
18
|
+
curves on TWO durations — is DELETED). `--dock-expand-t` is the directional
|
|
19
|
+
expanded-ness (0 = collapsed look, 1 = expanded look) derived from the
|
|
20
|
+
per-swap morph scalar + the synchronously-set `.expanded`/`.collapsed` class:
|
|
21
|
+
the box width AND the root padding/radius/color move on ONE clock. The
|
|
22
|
+
per-frame writes drive the registered `<number>` scalar; the `calc()` reads
|
|
23
|
+
below interpolate composited. Under PRM the spring's `respectReducedMotion`
|
|
24
|
+
settles instantly (the scalar jumps 0→1 in one frame → the chrome snaps). */
|
|
25
|
+
|
|
26
|
+
/* `--dock-expand-t` — the directional expanded-ness. `--dock-morph-t` is a
|
|
27
|
+
REGISTERED `@property` (initial-value 0), so it is NEVER guaranteed-invalid:
|
|
28
|
+
`var(--dock-morph-t, 1)` reads 0 at REST (the fallback is DEAD), which would
|
|
29
|
+
resolve every expanded dock to expand-t 0 → the collapsed resting look (the
|
|
30
|
+
pill-radius + collapsed bg/border/padding regression). So the resting value is
|
|
31
|
+
stated STATICALLY per class, and ONLY while a morph is in flight
|
|
32
|
+
(`[data-morphing]` armed on the root by useLayerTransition, cleared on settle)
|
|
33
|
+
does expand-t track the live spring scalar. The class is ALREADY the END state
|
|
34
|
+
during the morph, so the read resolves the correct in-flight blend (collapse
|
|
35
|
+
1→0 via `1 - t`; expand 0→1 via `t`); on settle `[data-morphing]` clears and
|
|
36
|
+
expand-t snaps to the exact class endpoint. */
|
|
37
|
+
.glass-dock:not(.vertical).expanded,
|
|
38
|
+
.glass-dock:not(.vertical).always-expanded {
|
|
39
|
+
--dock-expand-t: 1;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.glass-dock:not(.vertical).collapsed {
|
|
43
|
+
--dock-expand-t: 0;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.glass-dock:not(.vertical).expanded[data-morphing],
|
|
47
|
+
.glass-dock:not(.vertical).always-expanded[data-morphing] {
|
|
48
|
+
--dock-expand-t: var(--dock-morph-t);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.glass-dock:not(.vertical).collapsed[data-morphing] {
|
|
52
|
+
--dock-expand-t: calc(1 - var(--dock-morph-t));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* The morphing root chrome — background / border-color interpolate between the
|
|
56
|
+
collapsed and expanded endpoints on the ONE `--dock-expand-t` scalar. Scoped
|
|
57
|
+
to the horizontal `variant-dock` (the rail / instrument-strip variants own
|
|
58
|
+
their own surface vocabulary and do not collapse↔expand). The two color axes
|
|
59
|
+
blend in srgb (the house mix the token ladder speaks). The `.collapsed`
|
|
60
|
+
discrete bg/border declarations are RETIRED — this block is the single
|
|
61
|
+
authority, and at rest `--dock-expand-t` resolves to the class endpoint (0
|
|
62
|
+
collapsed / 1 expanded) so the resting look is exact. */
|
|
63
|
+
.glass-dock.variant-dock:not(.vertical) {
|
|
64
|
+
background: color-mix(
|
|
65
|
+
in srgb,
|
|
66
|
+
var(--glass-bg-dock, var(--glass-bg-resting))
|
|
67
|
+
calc(var(--dock-expand-t, 1) * 100%),
|
|
68
|
+
var(--glass-bg-wash)
|
|
69
|
+
);
|
|
70
|
+
border-color: color-mix(
|
|
71
|
+
in srgb,
|
|
72
|
+
var(--glass-border-dock, var(--glass-border-resting))
|
|
73
|
+
calc(var(--dock-expand-t, 1) * 100%),
|
|
74
|
+
var(--glass-border-floating)
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* The padding morph is split out + scoped `:not(.dock-overflow-wrap)` so the
|
|
79
|
+
wrap variant's own padding rules (W04 territory — `.dock-overflow-wrap` +
|
|
80
|
+
its `@media` snap-back) are NOT clobbered by this higher-specificity longhand.
|
|
81
|
+
Padding interpolates linearly between the collapsed floor and the expanded
|
|
82
|
+
block/inline padding on the same `--dock-expand-t` scalar. */
|
|
83
|
+
.glass-dock.variant-dock:not(.vertical):not(.dock-overflow-wrap) {
|
|
84
|
+
--dock-pad-collapsed: var(
|
|
85
|
+
--dock-collapsed-padding,
|
|
86
|
+
var(--dock-padding-block, 0.375rem)
|
|
87
|
+
);
|
|
88
|
+
padding-block: calc(
|
|
89
|
+
var(--dock-pad-collapsed) +
|
|
90
|
+
(var(--dock-padding-block, 0.375rem) - var(--dock-pad-collapsed)) *
|
|
91
|
+
var(--dock-expand-t, 1)
|
|
92
|
+
);
|
|
93
|
+
padding-inline: calc(
|
|
94
|
+
var(--dock-pad-collapsed) +
|
|
95
|
+
(var(--dock-padding-inline, 0.5rem) - var(--dock-pad-collapsed)) *
|
|
96
|
+
var(--dock-expand-t, 1)
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* AX.W01 — the collapsed padding / background / border-color are RETIRED here
|
|
101
|
+
(the `--dock-expand-t` morph block above is the single authority for those
|
|
102
|
+
three axes — they interpolate, never snap). `.collapsed` keeps only its
|
|
103
|
+
non-morphing concerns: the pointer affordance, the centred summary layout,
|
|
104
|
+
and the collapsed shadow (box-shadow crossfades discretely — a subtle,
|
|
105
|
+
acceptable swap that a `color-mix` cannot blend across its multi-layer
|
|
106
|
+
value). */
|
|
107
|
+
.glass-dock.collapsed {
|
|
108
|
+
cursor: pointer;
|
|
109
|
+
justify-content: center;
|
|
110
|
+
box-shadow: var(--shadow-dock-override, var(--shadow-dock-collapsed));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/* AX.W45-TUNE Q1 — the collapsed summary floors on BOTH axes off the SAME
|
|
114
|
+
`--dock-collapsed-summary-min-size` token (now MINTED in tokens.css §10 as a
|
|
115
|
+
tight ≈0.7× of the full control height). The prior rule floored ONLY
|
|
116
|
+
`min-width` and let the token fall to `--dock-layer-height` (the full control
|
|
117
|
+
height) — so the collapsed pill read as a full-row stub, not a proportioned
|
|
118
|
+
squircle. Adding the symmetric `min-block-size` makes the collapsed pill a
|
|
119
|
+
tight square-ish dot the consumer's glyph sits centred in (the proportioned-
|
|
120
|
+
pill target the user's Q1 named). */
|
|
121
|
+
.glass-dock.collapsed .dock-layer--summary {
|
|
122
|
+
min-width: var(
|
|
123
|
+
--dock-collapsed-summary-min-size,
|
|
124
|
+
var(--dock-layer-height, 2.5rem)
|
|
125
|
+
);
|
|
126
|
+
min-block-size: var(
|
|
127
|
+
--dock-collapsed-summary-min-size,
|
|
128
|
+
var(--dock-layer-height, 2.5rem)
|
|
129
|
+
);
|
|
130
|
+
justify-content: center;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* AX.W45 DK1 — the collapsed/summary glyph appears WITH the pill, no added
|
|
134
|
+
delay. The `--summary` pane is the INCOMING pane on collapse, but the shared
|
|
135
|
+
stagger ramp reads `--dock-expand-t` which runs 1→0 on collapse — so the
|
|
136
|
+
summary glyph used to fade OUT over the back half of the morph and pop in only
|
|
137
|
+
at settle (the "shrunken icon does not appear for a while" defect). Keying the
|
|
138
|
+
summary pane's stagger scalar to `--dock-morph-t` directly (the per-swap
|
|
139
|
+
incoming-ness, 0→1) reveals it as the box settles — appearing WITH the pill.
|
|
140
|
+
The summary is a single front-loaded glyph (onset 0), so this lands it at full
|
|
141
|
+
opacity by the morph's tail. The `--dock-expand-t` directional scalar stays
|
|
142
|
+
the right driver for the box CHROME (bg/border/padding/radius interpolate
|
|
143
|
+
between the collapsed↔expanded endpoints); only the summary pane's CONTENT
|
|
144
|
+
reveal is decoupled onto the incoming scalar. */
|
|
145
|
+
.glass-dock[data-morphing] .dock-layer--summary {
|
|
146
|
+
--dock-expand-t: var(--dock-morph-t);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* AW.W3 — the collapsed-hover scale rides the unified dock spring vocabulary.
|
|
150
|
+
The `scale var(--dock-motion-resize)` arm was added to the `.glass-dock`
|
|
151
|
+
root transition above, so this hover scale settles on the SAME spring curve
|
|
152
|
+
the expand morph uses — a collapsed→hover→expand gesture is one continuous
|
|
153
|
+
spring, not a `scale`-ease handed off to the width-spring. The hover scale
|
|
154
|
+
and the press squish (`--scale-press-dock`) are now one register on the dock
|
|
155
|
+
surface. */
|
|
156
|
+
.glass-dock.collapsed:hover {
|
|
157
|
+
background: var(--glass-bg-wash);
|
|
158
|
+
border-color: var(--glass-border-floating);
|
|
159
|
+
box-shadow: var(--shadow-dock-override, var(--shadow-dock));
|
|
160
|
+
scale: var(--dock-collapsed-hover-scale);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* J.W5.C — held-state substrate response.
|
|
164
|
+
*
|
|
165
|
+
* When a descendant signals `dockKeepOpen` (e.g. an active slider drag),
|
|
166
|
+
* `useDockState.isHeld` flips true and the root carries `data-held`.
|
|
167
|
+
* The dock background lifts a tier (resting → floating-equivalent) and
|
|
168
|
+
* the border quiets to the floating ring; the change tracks pointer
|
|
169
|
+
* movement on `--duration-fast` so it reads as a held-cursor cue, not
|
|
170
|
+
* a state change. The same flag is consumed by descendants (Slider
|
|
171
|
+
* thumb halo) via `useOptionalDockContext().held` for cross-substrate
|
|
172
|
+
* coordination (typed-key canonical shape; O.W2 invariant 25).
|
|
173
|
+
*/
|
|
174
|
+
.glass-dock[data-held] {
|
|
175
|
+
/* AX.W55 — the held tier threads the oklab tint wrapper (zero-delta at the
|
|
176
|
+
`0%` rest default) so the adaptive darken reaches the held state too. */
|
|
177
|
+
background: color-mix(
|
|
178
|
+
in oklab,
|
|
179
|
+
var(--glass-bg-floating, var(--glass-bg-resting)),
|
|
180
|
+
var(--glass-tint-source) var(--glass-tint-strength)
|
|
181
|
+
);
|
|
182
|
+
border-color: var(--glass-border-floating, var(--glass-border-resting));
|
|
183
|
+
transition:
|
|
184
|
+
background var(--duration-fast) var(--ease-standard),
|
|
185
|
+
border-color var(--duration-fast) var(--ease-standard),
|
|
186
|
+
box-shadow var(--duration-fast) var(--ease-standard);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/* AQ.W3 §W3.1b — open-descendant surface response. When a dock-hosted
|
|
190
|
+
trigger (`[data-state="open"]`) is open, the dock root holds its elevated
|
|
191
|
+
read natively (no consumer JS). Idempotent with `[data-held]` above (same
|
|
192
|
+
floating paint, different trigger). Decorative; `:has()` Baseline Widely. */
|
|
193
|
+
.glass-dock:has([data-state="open"]) {
|
|
194
|
+
/* AX.W55 — same oklab tint wrapper as `[data-held]` (zero-delta at rest). */
|
|
195
|
+
background: color-mix(
|
|
196
|
+
in oklab,
|
|
197
|
+
var(--glass-bg-floating, var(--glass-bg-resting)),
|
|
198
|
+
var(--glass-tint-source) var(--glass-tint-strength)
|
|
199
|
+
);
|
|
200
|
+
border-color: var(--glass-border-floating, var(--glass-border-resting));
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/* ── Adaptive legibility: the dock over a light backdrop (AX.W55 — the literal
|
|
204
|
+
G2 surface; "Glass dock over VERY LIGHT materials is unreadable") ──────────
|
|
205
|
+
The dock is the surface the user reported unreadable over light content. Its
|
|
206
|
+
shell (`--glass-bg-dock`), chassis-strip, and held/open tiers all now read the
|
|
207
|
+
SAME oklab tint seam the five rungs use, so this ONE bucket block — set when a
|
|
208
|
+
consumer marks `--glass-backdrop: light` on the dock's ancestor — lifts every
|
|
209
|
+
dock surface toward ink in lockstep. The tint tokens are INHERITING, so
|
|
210
|
+
re-pointing them on the `.glass-dock` root re-resolves every nested surface +
|
|
211
|
+
cascades to the dock CONTROLS (which read `--dock-fg-on-aurora` for their
|
|
212
|
+
foreground); `--dock-fg-on-aurora` re-points to the warm-ink here so the
|
|
213
|
+
control glyphs/labels clear AA over the now-darkened plate — ONE reconciled
|
|
214
|
+
path, the foreground twin folded INTO the probe, not a third fork. The
|
|
215
|
+
morph-root interp (`.variant-dock:not(.vertical)` above) stays `color-mix(in
|
|
216
|
+
srgb …)` for the transition; the adaptive darken rides its RESTING endpoint
|
|
217
|
+
(`--glass-bg-dock`, which carries the tint) — the in-flight morph frames are
|
|
218
|
+
sub-perceptual (the ratified resting-endpoint-only default). */
|
|
219
|
+
@container style(--glass-backdrop: light) {
|
|
220
|
+
.glass-dock {
|
|
221
|
+
--glass-tint-source: var(--glass-tint-ink);
|
|
222
|
+
--glass-tint-strength: var(--glass-tint-strength-aa);
|
|
223
|
+
--dock-fg-on-aurora: var(--glass-tint-ink);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/* AX.W55 — the `contrast-color()` flip for the dock control foreground (Chrome
|
|
228
|
+
147+/Safari 26+; progressive enhancement, NEVER the load-bearing floor). The
|
|
229
|
+
declarative bucket above already carries AA on all engines (it darkens the dock
|
|
230
|
+
plate so the warm-dark `--dock-fg-on-aurora` clears ~17:1 over white at the 18%
|
|
231
|
+
floor). On a supporting engine `contrast-color()` REFINES the control ink,
|
|
232
|
+
anchored on the LIGHT BACKDROP signal (`--card`, the warm-white surface base the
|
|
233
|
+
bright bucket implies) — `contrast-color(var(--card))` resolves to the legible
|
|
234
|
+
DARK ink. Anchoring on the dark ink instead inverts to white (illegible on the
|
|
235
|
+
still-light dock plate), so the anchor is the light surface, matching the rung
|
|
236
|
+
refinement in glass.css. The bucket is the floor; this is the native pick. */
|
|
237
|
+
@supports (color: contrast-color(white)) {
|
|
238
|
+
@container style(--glass-backdrop: light) {
|
|
239
|
+
.glass-dock {
|
|
240
|
+
--dock-fg-on-aurora: contrast-color(var(--card));
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|