@mkbabb/glass-ui 3.8.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-q2qHCJFG.js → CardAction-DuArVky-.js} +4 -4
- package/dist/{CommandShortcut-SzWRhROC.js → CommandShortcut-CefCj5mt.js} +7 -7
- package/dist/{ContextMenuSubContent-Do977Cbf.js → ContextMenuSubContent-Bhg4f5jX.js} +3 -3
- package/dist/{DataTable-CvlWXz65.js → DataTable-CUHMukiQ.js} +1 -1
- package/dist/{DialogContent-DjZWT3lK.js → DialogContent-BRkT1cjP.js} +1 -1
- package/dist/{NumberFieldContent-CLNVR1iY.js → NumberFieldContent-BbLOh8RU.js} +2 -2
- package/dist/{SelectScrollDownButton-C7TRe-ep.js → SelectScrollDownButton-T32cVFeM.js} +3 -3
- package/dist/{SelectSeparator-L8pPEn4L.js → SelectSeparator-C4Ql0gzV.js} +1 -1
- package/dist/{TabsList-qyHZ2lKY.js → TabsList-B8CVOQPC.js} +2 -2
- package/dist/{Toaster-CabYEEF_.js → Toaster-1rYWrmAm.js} +1 -1
- package/dist/{ToggleGroupItem-CkXUcBlt.js → ToggleGroupItem-Cev4pOVK.js} +4 -4
- package/dist/animated-digit.js +1 -1
- package/dist/api/index.d.ts +1 -1
- package/dist/api.js +1 -1
- package/dist/aurora.js +10 -10
- 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/card.js +1 -1
- package/dist/carousel.js +1 -1
- package/dist/color.js +1 -1
- package/dist/command.js +1 -1
- package/dist/{compile-BBTRjvQS.js → compile-DAjIoEy2.js} +1 -1
- package/dist/components/custom/configurator/ConfiguratorLayer.vue.d.ts +1 -1
- package/dist/components/custom/dock/DockSeparator.vue.d.ts +3 -0
- package/dist/components/custom/dock/GlassDock.vue.d.ts +45 -63
- package/dist/components/custom/dock/composables/dockContext.d.ts +7 -0
- package/dist/components/custom/dock/index.d.ts +2 -1
- package/dist/components/custom/goo-blob/composables/useBlobMood.d.ts +19 -5
- 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 +5 -3
- 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/slider/index.d.ts +14 -7
- package/dist/components/ui/tabs/TabsList.vue.d.ts +1 -1
- package/dist/composables/context/createContext.d.ts +1 -1
- package/dist/configurator.js +1 -1
- package/dist/confirm-dialog.js +1 -1
- package/dist/constellation.js +1 -1
- package/dist/context-menu.js +1 -1
- package/dist/controls.js +1 -1
- package/dist/dark.js +1 -1
- package/dist/data-table.js +1 -1
- package/dist/deck-progress.js +1 -1
- package/dist/dialog.js +1 -1
- package/dist/dock.js +256 -243
- package/dist/{dropdown-menu-B_4bWyyG.js → dropdown-menu-D77jX6Df.js} +3 -3
- package/dist/dropdown-menu.js +1 -1
- package/dist/expandable-container.js +1 -1
- package/dist/forms.js +5 -5
- package/dist/fourier-field.js +3 -3
- package/dist/glass-ui.css +1 -1
- package/dist/glass-ui.js +101 -104
- package/dist/goo-blob.js +36 -32
- package/dist/hover-popover.js +1 -1
- package/dist/icon-tooltip.js +1 -1
- package/dist/index.d.ts +0 -2
- package/dist/keyboard.js +1 -1
- package/dist/labeled-field.js +4 -4
- package/dist/{menuItemVariants-DKM85SNE.js → menuItemVariants-CCoBNkU5.js} +1 -1
- package/dist/motion-core.js +4 -4
- package/dist/motion.js +2 -2
- package/dist/number-field.js +1 -1
- package/dist/pulse.js +1 -1
- package/dist/reactive.js +1 -1
- package/dist/scrolling-text.js +1 -1
- package/dist/search.js +4 -4
- package/dist/select.js +2 -2
- package/dist/{slider-D9puf-Ko.js → slider-DC2mwuoe.js} +1 -1
- package/dist/slider.js +1 -1
- package/dist/sortable-list.js +1 -1
- 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 +166 -32
- package/dist/styles/dock.css +42 -1349
- package/dist/styles/glass.css +396 -75
- package/dist/styles/index.css +12 -11
- package/dist/styles/theme.css +51 -0
- package/dist/styles/tokens.css +501 -55
- package/dist/styles/utilities.css +89 -39
- package/dist/tabs.js +182 -151
- package/dist/timeline.js +1 -1
- package/dist/toast.js +1 -1
- package/dist/toggle-group.js +1 -1
- package/dist/{useAnimatedNumber-C_3wZLx4.js → useAnimatedNumber-C5I3wWd8.js} +1 -1
- package/dist/{useConfiguratorState-CMff4GzH.js → useConfiguratorState-DxAqksK6.js} +21 -10
- package/dist/watercolor-dot.js +1 -1
- package/package.json +32 -33
- 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 +166 -32
- package/src/styles/dock.css +42 -1349
- package/src/styles/glass.css +396 -75
- package/src/styles/index.css +12 -11
- package/src/styles/theme.css +51 -0
- package/src/styles/tokens.css +501 -55
- package/src/styles/utilities.css +89 -39
- package/dist/DiscoGlyph-CG0F410s.js +0 -132
- package/dist/GlyphFace-DRjDkB0s.js +0 -51
- package/dist/UnderlineTabs-Uxn-R3MT.js +0 -39
- 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/glass-carousel.d.ts +0 -1
- package/dist/glass-carousel.js +0 -219
- package/dist/glyph-face.d.ts +0 -1
- package/dist/glyph-face.js +0 -3
- package/dist/keys-BsYjEFOW.js +0 -9
- package/dist/responsive-tabs.d.ts +0 -1
- package/dist/responsive-tabs.js +0 -95
- package/dist/styles/disco-glyph.css +0 -26
- package/dist/styles/glyph-face.css +0 -92
- package/src/styles/disco-glyph.css +0 -26
- package/src/styles/glyph-face.css +0 -92
- /package/dist/{DeckProgress-AVgbIULY.js → DeckProgress-Dmk4_AKN.js} +0 -0
- /package/dist/{HoverPopover-D56O6Ylp.js → HoverPopover-2LOIW34a.js} +0 -0
- /package/dist/{IconTooltip-D2T5nYOM.js → IconTooltip-yefK7cJc.js} +0 -0
- /package/dist/{Input-DVG_J0ne.js → Input-DWQQIOC4.js} +0 -0
- /package/dist/{ScrollingText-CVyqxvfv.js → ScrollingText-BPP84wKo.js} +0 -0
- /package/dist/{color-DMLTunJK.js → color-8jBjWiJ6.js} +0 -0
- /package/dist/{constants-BPOqYJAm.js → constants-CS75AWHG.js} +0 -0
- /package/dist/{presets-D1XPuTj-.js → presets-BKVyQfbt.js} +0 -0
- /package/dist/{prng-COGhh02-.js → prng-wHuHlNHE.js} +0 -0
- /package/dist/{useGlobalDark-D3EBWzXK.js → useGlobalDark-yhL4Wp-s.js} +0 -0
- /package/dist/{useIntersectionPause-Bj4sPkMh.js → useIntersectionPause-Cc-H9ees.js} +0 -0
- /package/dist/{useInterval-CcLfq2WU.js → useInterval-Dsmqwi03.js} +0 -0
- /package/dist/{useKeyboardShortcuts-BXWXOZ-9.js → useKeyboardShortcuts-Be3w_Rwk.js} +0 -0
- /package/dist/{useScrollProgress-C9ysDic5.js → useScrollProgress-CAH8Ofwt.js} +0 -0
- /package/dist/{useSortable-MGAbCGVJ.js → useSortable-C8ReQ50P.js} +0 -0
- /package/dist/{useTextHighlight-9nMW23Qb.js → useTextHighlight-DON84L8w.js} +0 -0
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
/* dock/shell.css — the `.glass-dock` structural skeleton (AX.W06 carve).
|
|
2
|
+
*
|
|
3
|
+
* Carved from the dock.css god-module (slice 25). This partial owns the dock's
|
|
4
|
+
* STATIC structural surface: the `.glass-dock` root + the W02 single-axis
|
|
5
|
+
* `overflow: clip` morph aperture, the paper-grain `::after`, the vertical-root
|
|
6
|
+
* column layout, the shape/variant plates (rail · instrument-strip · the
|
|
7
|
+
* horizontal shape-rounded/card + the W56 squircle), the position helpers, and
|
|
8
|
+
* the W45 `#persistent` / vertical three-region body. The dynamic single-scalar
|
|
9
|
+
* morph chrome lives in dock/morph.css; the density × `--dock-scale` cascade in
|
|
10
|
+
* dock/density.css; the layer crossfade/hit-test in dock/layers.css.
|
|
11
|
+
*
|
|
12
|
+
* @import-ed by dock.css in cascade order, in the SAME `@layer components` — the
|
|
13
|
+
* carve is isomorphic (same layer, same source order → ZERO visual delta). */
|
|
14
|
+
|
|
15
|
+
@layer components {
|
|
16
|
+
.glass-dock {
|
|
17
|
+
--dock-surface-blur: var(--glass-blur-dock, var(--glass-blur-wash));
|
|
18
|
+
/* J.W3.C — vertical-rail max-block + horizontal max-inline caps
|
|
19
|
+
live as semantic tokens (defaults in `tokens.css`). When
|
|
20
|
+
content exceeds the cap, the appropriate axis container
|
|
21
|
+
scrolls with a mask-fade. Consumers override per-instance by
|
|
22
|
+
setting `--dock-max-block-size` / `--dock-max-inline-size`
|
|
23
|
+
on a `.glass-dock` directly. */
|
|
24
|
+
--dock-separator-height: calc(var(--dock-h, var(--size-icon-btn)) * 0.5);
|
|
25
|
+
--dock-collapsed-hover-scale: var(--scale-hover-dock);
|
|
26
|
+
/* AW.W3 — the spring-keyed child stagger knobs. `--dock-stagger-window-size`
|
|
27
|
+
is the fraction of the morph each child reveals over; `--dock-stagger-rise`
|
|
28
|
+
is the px the child rises from as it fades in. Consumers retune the
|
|
29
|
+
cascade feel per instance.
|
|
30
|
+
|
|
31
|
+
AX.W02 — `--dock-stagger-step` is the per-child onset BEAT: each
|
|
32
|
+
successive control's reveal starts this fraction-of-morph later than the
|
|
33
|
+
one before it, so the row fills outer→in. ONE token × the child index
|
|
34
|
+
replaces the hand-typed 0.08/0.16/0.24/0.32/0.4 onset ladder — the onset
|
|
35
|
+
is `step × (childIndex − 1)`, capped (the cap below). 0.08 = ~5% of the
|
|
36
|
+
~0.32s morph between items — inside Emil Kowalski's 30–60ms stagger band,
|
|
37
|
+
never the >100ms "slideshow" register. The onset rides the NORMALIZED
|
|
38
|
+
morph progress (`--dock-expand-t`), NOT a wall-clock timer, so a fast
|
|
39
|
+
flick and a slow hover-open both choreograph correctly and an interrupted
|
|
40
|
+
morph orphans no timers.
|
|
41
|
+
|
|
42
|
+
AX.W45 DK1/DK7 — the window NARROWED 0.55 → 0.4. The per-child onset caps
|
|
43
|
+
at `step × 5 = 0.40` (child 6+), so the LAST detail child used to finish at
|
|
44
|
+
`0.40 + 0.55 = 0.95` of the morph — it barely appeared until 95% through
|
|
45
|
+
(the "shrunken icon does not appear for a while" tail). Tightening the
|
|
46
|
+
window to 0.4 lands the last child at `0.40 + 0.4 = 0.80` (the iOS front-
|
|
47
|
+
loaded register: stagger the EXPANDING detail, never the persistent/summary
|
|
48
|
+
glyph). The step (0.08, Kowalski's band) is KEPT — it is the window, not the
|
|
49
|
+
beat, that was too wide. The summary/persistent glyph is front-loaded
|
|
50
|
+
structurally (onset 0, scalar-keyed below). */
|
|
51
|
+
--dock-stagger-window-size: 0.4;
|
|
52
|
+
--dock-stagger-rise: 4px;
|
|
53
|
+
--dock-stagger-step: 0.08;
|
|
54
|
+
/* AW.W3b — big-dock tokens. `--dock-card-radius` is the finite card-shell
|
|
55
|
+
radius (default --radius-dock-card = --radius-3xl, density-scaled
|
|
56
|
+
below); `--dock-tile-min` is the grid tile minimum (auto-fill track
|
|
57
|
+
floor). Both are density-scaled (compact tighter, spacious looser) — the
|
|
58
|
+
card radius + tile size ride the density cascade, never magic numbers. */
|
|
59
|
+
--dock-card-radius: var(--radius-dock-card);
|
|
60
|
+
--dock-tile-min: 4.5rem;
|
|
61
|
+
/* Individual-transform identity base (AQ.W3 §W3.2). `scale: 1` at rest
|
|
62
|
+
mints the stacking context once so a portaled popover over `--z-dock`
|
|
63
|
+
stays above the dock during a hover scale (the load-bearing
|
|
64
|
+
stacking-context guarantee). Covers every dock scale site. */
|
|
65
|
+
scale: 1;
|
|
66
|
+
position: relative;
|
|
67
|
+
display: inline-flex;
|
|
68
|
+
align-items: center;
|
|
69
|
+
/* AW.W1 — the dock does NOT establish a default inline-size container.
|
|
70
|
+
`container-type: inline-size` applies `contain: inline-size`, which
|
|
71
|
+
makes an element's inline size INDEPENDENT of its contents — fatally
|
|
72
|
+
incompatible with a shrink-to-fit pill: under it `.glass-dock` cannot
|
|
73
|
+
size to its content and collapses to its padding floor (~19px) with the
|
|
74
|
+
active layer overflowing (the 3.3.0 regression — every horizontal dock,
|
|
75
|
+
collapsed AND always-expanded, rendered as a sliver). The `dock`-named
|
|
76
|
+
container is now OPT-IN via the `containerName` prop: a consumer
|
|
77
|
+
embedding the dock in a width-CONSTRAINED host (a 320px sidebar) sets
|
|
78
|
+
`containerName="dock"` to get the descendant container-query reads (the
|
|
79
|
+
audacious-label compression below), trading shrink-to-fit for the
|
|
80
|
+
host-constrained width it already has there. The default free-floating
|
|
81
|
+
dock shrink-wraps to its content (AV.W16 TW3 made this a default and
|
|
82
|
+
silently broke dock sizing for the common case). */
|
|
83
|
+
border-radius: var(--radius-dock);
|
|
84
|
+
white-space: nowrap;
|
|
85
|
+
max-inline-size: var(--dock-max-inline-size);
|
|
86
|
+
padding: var(--dock-padding-block, 0.375rem) var(--dock-padding-inline, 0.5rem);
|
|
87
|
+
/* AX.W55 — the dock SHELL composes the oklab tint at the ELEMENT (not via the
|
|
88
|
+
pre-substituted `--glass-bg-dock` token, which resolves its tint at the
|
|
89
|
+
`:root` 0% strength before the @container bucket can re-point it — the
|
|
90
|
+
substitution-vs-inheritance trap). Wrapping here lets the bright-bucket
|
|
91
|
+
block below (which re-points --glass-tint-source/-strength on `.glass-dock`)
|
|
92
|
+
reach the shell: the inner `--glass-bg-dock` mix is a 0% no-op at rest, the
|
|
93
|
+
outer element mix does the adaptive darken. Zero-delta at the `0%` default
|
|
94
|
+
(both mixes resolve to the flat dock bg = byte-identical to today). */
|
|
95
|
+
background: color-mix(
|
|
96
|
+
in oklab,
|
|
97
|
+
var(--glass-bg-dock, var(--glass-bg-resting)),
|
|
98
|
+
var(--glass-tint-source) var(--glass-tint-strength)
|
|
99
|
+
);
|
|
100
|
+
backdrop-filter: var(--dock-surface-blur);
|
|
101
|
+
border: 1.5px solid var(--glass-border-dock, var(--glass-border-resting));
|
|
102
|
+
/* AV.W15 M3 — the full-perimeter `--glass-edge-light` rim rides as the
|
|
103
|
+
leading inset layer of the dock shadow stack (the navigation-band
|
|
104
|
+
silhouette catch-light, distinct from the top-only highlight). */
|
|
105
|
+
box-shadow: var(--glass-edge-light), var(--shadow-dock-override, var(--shadow-dock));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* AW.W2 — the box IS the reveal aperture (clip-reveal one-clock morph).
|
|
109
|
+
Migrated from `overflow: hidden` to a SINGLE-AXIS `overflow: clip` on the
|
|
110
|
+
MORPH axis (horizontal clips X / visible Y; vertical clips Y / visible X),
|
|
111
|
+
gated on a `data-morphing` attribute the driver owns (set at gesture START,
|
|
112
|
+
cleared on SETTLE). The clip PERSISTS through the morph — content is laid
|
|
113
|
+
out ONCE at its natural size behind the aperture and the growing/shrinking
|
|
114
|
+
box uncovers it, never spills it — and lifts to `visible` only at REST
|
|
115
|
+
expanded (so grown content + the focus ring paint past the box). The
|
|
116
|
+
prior `.expanded { overflow: visible }` (bound synchronously to
|
|
117
|
+
`visualExpanded`) lifted the clip at frame 0, leaving no aperture to reveal
|
|
118
|
+
through; the `:not([data-morphing])` guard holds the clip for the whole
|
|
119
|
+
gesture and lifts it on the final paint.
|
|
120
|
+
|
|
121
|
+
`overflow: clip` is PAINT-ONLY (not a scroll container): it never
|
|
122
|
+
participates in `scrollIntoView`/scroll-anchoring, cannot be a
|
|
123
|
+
scroll-driven-animation `scroller`, and drops the `min-width:0` scroll-box
|
|
124
|
+
dance for the non-scroll shell. The cross axis is ALWAYS explicitly
|
|
125
|
+
`visible` (the MDN single-axis-clip-degrades-to-hidden caveat). The
|
|
126
|
+
legitimate scroll ports (`.dock-scroll-{x,y}`, `overflow: auto`) STAY
|
|
127
|
+
`auto` — they are NOT migrated. AT.W7-dock-a's orthogonality holds: the
|
|
128
|
+
`containerName` opt-in does not touch the clip. */
|
|
129
|
+
.glass-dock:not(.vertical) {
|
|
130
|
+
overflow-x: clip;
|
|
131
|
+
overflow-y: visible;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.glass-dock.vertical {
|
|
135
|
+
overflow-x: visible;
|
|
136
|
+
overflow-y: clip;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/* DURING a morph the clip is the aperture — keyed off `data-morphing`, NOT
|
|
140
|
+
off `.expanded`, so it survives the whole gesture and the box reveals its
|
|
141
|
+
content rather than letting it spill. */
|
|
142
|
+
.glass-dock[data-morphing]:not(.vertical) {
|
|
143
|
+
overflow-x: clip;
|
|
144
|
+
overflow-y: visible;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.glass-dock[data-morphing].vertical {
|
|
148
|
+
overflow-x: visible;
|
|
149
|
+
overflow-y: clip;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* AT REST EXPANDED — lift the morph-axis clip (grown content + focus ring
|
|
153
|
+
paint past the box). Fires ONLY when NOT morphing; the [data-morphing]
|
|
154
|
+
rules above win during the gesture by being more specific + later. */
|
|
155
|
+
.glass-dock.expanded:not([data-morphing]),
|
|
156
|
+
.glass-dock.always-expanded:not([data-morphing]) {
|
|
157
|
+
overflow: visible;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* AX.W04 F6 — the vertical-dock max-block-size + internal-scroll CONTRACT.
|
|
161
|
+
A vertical rail caps at `--dock-max-block-size` (the `.vertical` rule), but
|
|
162
|
+
at rest the `overflow: visible` above let over-cap content SPILL — forcing a
|
|
163
|
+
consumer (bbnf-buddy ToolsLayer) to hand-anchor a max-height + scroll. Ship
|
|
164
|
+
the contract here: at rest a vertical column scrolls its OWN block axis when
|
|
165
|
+
content exceeds the cap (cross axis stays `visible` for focus rings + grown
|
|
166
|
+
popovers). When content fits under the cap (`height:auto` < cap) nothing
|
|
167
|
+
scrolls — the scroll port only engages on real over-cap content. The
|
|
168
|
+
block-axis morph clip stays `data-morphing`-gated above; this is the
|
|
169
|
+
AT-REST port only. Consumers set `--dock-max-block-size` per-instance to
|
|
170
|
+
anchor the column to the viewport without re-deriving the scroll plumbing. */
|
|
171
|
+
.glass-dock.vertical.always-expanded:not([data-morphing]),
|
|
172
|
+
.glass-dock.vertical.expanded:not([data-morphing]) {
|
|
173
|
+
overflow-x: visible;
|
|
174
|
+
overflow-y: auto;
|
|
175
|
+
scrollbar-width: none;
|
|
176
|
+
overscroll-behavior-y: contain;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.glass-dock.vertical.always-expanded:not([data-morphing])::-webkit-scrollbar,
|
|
180
|
+
.glass-dock.vertical.expanded:not([data-morphing])::-webkit-scrollbar {
|
|
181
|
+
display: none;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.glass-dock::after {
|
|
185
|
+
content: "";
|
|
186
|
+
position: absolute;
|
|
187
|
+
inset: 0;
|
|
188
|
+
border-radius: inherit;
|
|
189
|
+
background: var(--paper-clean-texture);
|
|
190
|
+
background-repeat: repeat;
|
|
191
|
+
background-size: var(--paper-texture-size);
|
|
192
|
+
opacity: var(--glass-grain-opacity);
|
|
193
|
+
pointer-events: none;
|
|
194
|
+
mix-blend-mode: overlay;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.dark .glass-dock::after {
|
|
198
|
+
mix-blend-mode: soft-light;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* Vertical rails grow-to-fit then clamp at `--dock-max-block-size` (the
|
|
202
|
+
AX.W04 F6 contract). At rest a capped column scrolls its OWN block axis
|
|
203
|
+
internally (the `.vertical.always-expanded:not([data-morphing])` port above)
|
|
204
|
+
so a consumer setting `--dock-max-block-size` gets a viewport-anchored
|
|
205
|
+
scrollable tool palette without hand-anchoring it. `overflow="wrap"` is
|
|
206
|
+
horizontal-only (the class is not emitted for a vertical orientation); a
|
|
207
|
+
vertical column's natural overflow story is this cap + internal scroll. No
|
|
208
|
+
edge-fade mask — the scroll is scrollbar-hidden, not feathered. */
|
|
209
|
+
.glass-dock.vertical {
|
|
210
|
+
display: inline-flex;
|
|
211
|
+
flex-direction: column;
|
|
212
|
+
align-items: stretch;
|
|
213
|
+
justify-content: flex-start;
|
|
214
|
+
/* AX.W45 D13-b — H/V PROPORTION PARITY. The hardcoded `gap: 0.25rem` + the
|
|
215
|
+
density-blind `--dock-vertical-padding` override are DELETED. The vertical
|
|
216
|
+
dock now reads the SAME `--dock-layer-gap` / `--dock-padding-*` density
|
|
217
|
+
cascade the horizontal dock tunes, so `density="spacious"` paints a LARGER
|
|
218
|
+
gap than `compact` on BOTH axes (the density axis was dead on the vertical
|
|
219
|
+
dock). ONE token ladder, both orientations; the `--dock-scale` multiplier
|
|
220
|
+
threads it for free (the cascade is `calc(* --dock-scale)`-keyed). */
|
|
221
|
+
gap: var(--dock-layer-gap, 0.375rem);
|
|
222
|
+
white-space: normal;
|
|
223
|
+
width: auto;
|
|
224
|
+
height: auto;
|
|
225
|
+
max-block-size: var(--dock-max-block-size);
|
|
226
|
+
/* overflow on the block (morph) axis is the data-morphing-gated clip
|
|
227
|
+
shell above; the cross axis stays visible there. */
|
|
228
|
+
padding: var(--dock-padding-block, 0.375rem);
|
|
229
|
+
border-radius: var(--radius-dock);
|
|
230
|
+
/* AX.W01 — a vertical rail is ALWAYS-EXPANDED (no collapse↔expand morph),
|
|
231
|
+
so its root padding/background/border-color never morph; the prior
|
|
232
|
+
`padding/background/border-color var(--dock-motion-*)` transition arms
|
|
233
|
+
are DELETED (a residual root CSS-transition on the morph-chrome props is
|
|
234
|
+
the second-clock smell the single-scalar rebuild retires). The block-axis
|
|
235
|
+
(height) morph is owned by the inner `.dock-layer-stack` / DockLayerGroup
|
|
236
|
+
via the `--dock-morph-t` scalar (the size `calc()` above), never a CSS
|
|
237
|
+
transition here. KEPT: the DECORATIVE hover-scale + press-squish (the
|
|
238
|
+
individual `scale`/`transform`) and the box-shadow fade — these are
|
|
239
|
+
interaction polish on the static rail, NOT the morph. */
|
|
240
|
+
transition:
|
|
241
|
+
box-shadow var(--dock-motion-standard),
|
|
242
|
+
transform var(--dock-motion-resize),
|
|
243
|
+
scale var(--dock-motion-resize);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.glass-dock.variant-rail {
|
|
247
|
+
padding: var(--dock-rail-padding, var(--dock-padding-inline, 0.5rem));
|
|
248
|
+
background: var(--glass-bg-dock, var(--glass-bg-wash));
|
|
249
|
+
border-color: var(--glass-border-dock, var(--glass-border-wash));
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.glass-dock.variant-rail.shape-pill {
|
|
253
|
+
border-radius: var(--radius-pill);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.glass-dock.variant-rail.shape-rounded {
|
|
257
|
+
border-radius: var(--radius-xl);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/* AW.W3b — horizontal-root shape rules. The `shape-*` class previously bound
|
|
261
|
+
ONLY under `.variant-rail`; on a horizontal `variant-dock` the prop silently
|
|
262
|
+
no-op'd (the root hardwired `--radius-dock` = `--radius-pill`). These rules
|
|
263
|
+
close that documented-but-dead prop — `shape="rounded"` / `shape="card"` now
|
|
264
|
+
paint on a horizontal dock. Scoped to `variant-dock:not(.vertical)` so the
|
|
265
|
+
rail + instrument-strip variants (which own their own radius) are untouched. */
|
|
266
|
+
.glass-dock.variant-dock:not(.vertical).shape-rounded {
|
|
267
|
+
border-radius: var(--radius-xl);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/* The big-dock CARD shell — a FINITE concentric radius above 2xl, below pill.
|
|
271
|
+
It does NOT collapse to a stadium. Collapsed it returns to a pill (the morph
|
|
272
|
+
target); the pill↔card radius now MORPHS on the SAME `--dock-expand-t` scalar
|
|
273
|
+
the box + chrome ride (ONE clock, no discrete snap) — `--radius-pill` at
|
|
274
|
+
expand-t 0 (collapsed), `--dock-card-radius` at expand-t 1 (expanded). The
|
|
275
|
+
prior two discrete `.shape-card` / `.shape-card.collapsed` rules + their
|
|
276
|
+
reliance on the deleted `border-radius var(--dock-motion-resize)` transition
|
|
277
|
+
are RETIRED for this single interpolation. */
|
|
278
|
+
.glass-dock.variant-dock:not(.vertical).shape-card {
|
|
279
|
+
border-radius: calc(
|
|
280
|
+
var(--radius-pill) +
|
|
281
|
+
(var(--dock-card-radius) - var(--radius-pill)) *
|
|
282
|
+
var(--dock-expand-t, 1)
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/* AX.W56 — the big-dock IS the one squircle surface (the rounded-vs-squircle
|
|
287
|
+
policy: cards/pills/panels stay round, big-docks + the like → superellipse).
|
|
288
|
+
The squircle reads markedly better at the large `--radius-dock-card` (24px)
|
|
289
|
+
shell — an `@supports`-gated ENHANCEMENT only (Chrome 139+, no FF/Safari 2026).
|
|
290
|
+
The `border-radius` arc is the cross-engine CONTRACT; the squircle is the
|
|
291
|
+
better tier (NOT a degraded fallback). The shape is now the tokenized
|
|
292
|
+
`var(--corner-shape-bigdock)` (theme.css) so it is as overridable as the
|
|
293
|
+
radius — a consumer retints the corner shape from `:root`, and W42's
|
|
294
|
+
dock-morph reads the same `--corner-k-*` vocabulary. The `@supports`
|
|
295
|
+
condition tests the LITERAL `superellipse(2)` (a `var()` is not evaluable in
|
|
296
|
+
an `@supports` query) — the same Chrome-139 feature the token resolves to. */
|
|
297
|
+
@supports (corner-shape: superellipse(2)) {
|
|
298
|
+
.glass-dock.variant-dock:not(.vertical).shape-card {
|
|
299
|
+
corner-shape: var(--corner-shape-bigdock);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/* AJ-W1-δ — `instrument-strip` variant (per G-AJ-D7 Path 1).
|
|
304
|
+
*
|
|
305
|
+
* The speedtest survey cockpit's vertical rail needs chassis-strip
|
|
306
|
+
* aesthetics, not the dock-rail's stadium-pill chrome. Adopts the
|
|
307
|
+
* surface vocabulary of the `<InstrumentChassis>` family so the
|
|
308
|
+
* strip reads as a journey-station slot — the same surface the
|
|
309
|
+
* speedtest + complete + thankyou stations ride.
|
|
310
|
+
*
|
|
311
|
+
* The variant intentionally inherits the rail variant's vertical
|
|
312
|
+
* layout (orientation: vertical; flex-direction: column) — the
|
|
313
|
+
* orientation + fitContent computeds in GlassDock.vue branch on
|
|
314
|
+
* `variant === "instrument-strip"` alongside the existing rail
|
|
315
|
+
* branch. Only the surface vocabulary changes vs the rail:
|
|
316
|
+
* - Border-radius drops from `--radius-pill` to `--radius-card`
|
|
317
|
+
* (matches `<InstrumentChassis> { border-radius: var(--radius-card) }`).
|
|
318
|
+
* - Background plate routes through `--glass-bg-chassis` (0.28α
|
|
319
|
+
* per tokens.css §V) instead of `--glass-bg-wash`.
|
|
320
|
+
* - Border routes through `--glass-border-quiet` to match the
|
|
321
|
+
* chassis primitive's at-rest stroke.
|
|
322
|
+
* - Box-shadow routes through `--glass-shadow-quiet` plus the
|
|
323
|
+
* inset-bottom hairline matching the chassis primitive
|
|
324
|
+
* (instrument-chassis.css:42-45).
|
|
325
|
+
*
|
|
326
|
+
* The `.shape-pill` / `.shape-rounded` class hooks are still emitted
|
|
327
|
+
* by the template but no rule binds them under
|
|
328
|
+
* `.variant-instrument-strip` — chassis-strip carries ONE canonical
|
|
329
|
+
* border-radius (`--radius-card`), per the chassis family. */
|
|
330
|
+
.glass-dock.variant-instrument-strip {
|
|
331
|
+
padding: var(
|
|
332
|
+
--dock-instrument-strip-padding,
|
|
333
|
+
var(--dock-padding-inline, 0.75rem)
|
|
334
|
+
);
|
|
335
|
+
/* AX.W55 — the chassis-strip threads the SAME oklab tint wrapper the five
|
|
336
|
+
rungs + the dock shell (--glass-bg-dock) carry, so the adaptive darken
|
|
337
|
+
reaches it. Zero-delta at the `0%` rest default (the mix is 0% toward the
|
|
338
|
+
source = byte-identical to the flat `var(--glass-bg-chassis)`); it only
|
|
339
|
+
activates under the bright bucket below. */
|
|
340
|
+
background: color-mix(
|
|
341
|
+
in oklab,
|
|
342
|
+
var(--glass-bg-chassis, var(--glass-bg-wash)),
|
|
343
|
+
var(--glass-tint-source) var(--glass-tint-strength)
|
|
344
|
+
);
|
|
345
|
+
border: 1px solid var(--glass-border-quiet, var(--glass-border-resting));
|
|
346
|
+
border-radius: var(--radius-card);
|
|
347
|
+
box-shadow:
|
|
348
|
+
var(--glass-shadow-quiet, var(--shadow-dock)),
|
|
349
|
+
inset 0 -0.5px 0 0 rgb(0 0 0 / 0.06);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/* Engraved-bezel inner stroke — matches `<InstrumentChassis>::before`
|
|
353
|
+
* (instrument-chassis.css:85-93). The chassis-strip silhouette without
|
|
354
|
+
* this stroke reads as a flat plate; with it the strip reads as the
|
|
355
|
+
* polished sleeve of an instrument-panel module. The `::before`
|
|
356
|
+
* z-index sits above the chassis backdrop but below the slotted
|
|
357
|
+
* content (the MetricBadge stack), matching the chassis primitive's
|
|
358
|
+
* z-order. The host `.glass-dock` is already `position: relative`. */
|
|
359
|
+
.glass-dock.variant-instrument-strip::before {
|
|
360
|
+
content: "";
|
|
361
|
+
position: absolute;
|
|
362
|
+
inset: 0.5px;
|
|
363
|
+
border-radius: calc(var(--radius-card) - 0.5px);
|
|
364
|
+
border: 1px solid var(--surface-tint-4);
|
|
365
|
+
pointer-events: none;
|
|
366
|
+
z-index: 1;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
.dark .glass-dock.variant-instrument-strip::before {
|
|
370
|
+
border-color: var(--surface-tint-6);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
.glass-dock:where(.fixed) {
|
|
374
|
+
z-index: var(--z-dock);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
.dock-inline {
|
|
378
|
+
margin: 0 auto;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
.dock-sticky {
|
|
382
|
+
position: sticky;
|
|
383
|
+
top: 0;
|
|
384
|
+
z-index: var(--z-dock);
|
|
385
|
+
margin: 0 auto;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/* AX.W45 D13-a — the PERSISTENT region (the iOS Now-Playing / Stage-Manager
|
|
389
|
+
idiom done STRUCTURALLY). The `#persistent` slot lives in-flow as a root flex
|
|
390
|
+
SIBLING of the morph-region (`.dock-layers`) in BOTH collapsed AND expanded —
|
|
391
|
+
NEVER `:inert`, NEVER a crossfade pane, NEVER a `registerGroup` morph target.
|
|
392
|
+
It is a stable always-present rail beside the expand-on-demand content region,
|
|
393
|
+
so a consumer keeps a control visible while collapsed WITHOUT hand-duplicating
|
|
394
|
+
it into both the `#default` and `#collapsed` slots. The region co-laid by the
|
|
395
|
+
root flex/grid; the morph scalar `--dock-morph-t` co-drives only its chrome
|
|
396
|
+
(it inherits the root padding/radius morph), it is NOT a morph TARGET. It holds
|
|
397
|
+
steady (no jitter) while the morph-region's aperture animates on the ONE
|
|
398
|
+
spring. `align-items: center` keeps it on the dock's centerline; the
|
|
399
|
+
`--dock-layer-gap` separates it from the morph region (same rhythm both
|
|
400
|
+
orientations). */
|
|
401
|
+
.dock-persistent {
|
|
402
|
+
display: flex;
|
|
403
|
+
align-items: center;
|
|
404
|
+
flex-shrink: 0;
|
|
405
|
+
gap: var(--dock-layer-gap, 0.375rem);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
.glass-dock:not(.vertical) .dock-persistent {
|
|
409
|
+
flex-direction: row;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
.glass-dock.vertical .dock-persistent {
|
|
413
|
+
flex-direction: column;
|
|
414
|
+
align-items: stretch;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/* The persistent region + the morph region share the dock's gap rhythm. The
|
|
418
|
+
region renders only when the consumer authors a `#persistent` slot
|
|
419
|
+
(GlassDock.vue guards it with `v-if="$slots.persistent"`), so a dock with no
|
|
420
|
+
persistent controls is byte-identical to before (no empty flex item). */
|
|
421
|
+
.glass-dock:not(.vertical) .dock-persistent + .dock-layers {
|
|
422
|
+
margin-inline-start: var(--dock-layer-gap, 0.375rem);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
.glass-dock.vertical .dock-persistent + .dock-layers {
|
|
426
|
+
margin-block-start: var(--dock-layer-gap, 0.375rem);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/* AX.W45-TUNE C7 — the VERTICAL three-region body. The vertical dock's default
|
|
430
|
+
slot is now wrapped in a structural `.dock-layers` column (parity with the
|
|
431
|
+
horizontal morph-region container) instead of a bare slot. A vertical dock is
|
|
432
|
+
always-expanded (no width morph), so this `.dock-layers` is NOT the grid-stacked
|
|
433
|
+
crossfade pair the horizontal `.dock-layers` is — it is a single column stack
|
|
434
|
+
carrying the dock's `--dock-layer-gap` rhythm so authored item groups +
|
|
435
|
+
`<DockSeparator>` rules read with the correct vertical cadence. The base
|
|
436
|
+
`.dock-layers { display: grid }` is re-pointed to a column flex here (the
|
|
437
|
+
vertical body is content-stacked, not pane-stacked). */
|
|
438
|
+
.glass-dock.vertical .dock-layer--vertical-body {
|
|
439
|
+
display: flex;
|
|
440
|
+
flex-direction: column;
|
|
441
|
+
align-items: stretch;
|
|
442
|
+
gap: var(--dock-layer-gap, 0.375rem);
|
|
443
|
+
min-width: 0;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/* The OPTIONAL trailing `#collapsed` section (the vertical analogue of the
|
|
447
|
+
horizontal summary pane) — a persistent secondary group below a structural
|
|
448
|
+
`<DockSeparator>`, sharing the column's gap rhythm. Renders only when the
|
|
449
|
+
consumer authors a `#collapsed` slot (GlassDock.vue guards it), so a vertical
|
|
450
|
+
dock with no collapsed slot keeps the prior single-stack body. */
|
|
451
|
+
.glass-dock.vertical .dock-layer--vertical-section {
|
|
452
|
+
display: flex;
|
|
453
|
+
flex-direction: column;
|
|
454
|
+
align-items: stretch;
|
|
455
|
+
gap: var(--dock-layer-gap, 0.375rem);
|
|
456
|
+
}
|
|
457
|
+
}
|