@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.
Files changed (164) hide show
  1. package/README.md +1 -6
  2. package/dist/{CardAction-q2qHCJFG.js → CardAction-DuArVky-.js} +4 -4
  3. package/dist/{CommandShortcut-SzWRhROC.js → CommandShortcut-CefCj5mt.js} +7 -7
  4. package/dist/{ContextMenuSubContent-Do977Cbf.js → ContextMenuSubContent-Bhg4f5jX.js} +3 -3
  5. package/dist/{DataTable-CvlWXz65.js → DataTable-CUHMukiQ.js} +1 -1
  6. package/dist/{DialogContent-DjZWT3lK.js → DialogContent-BRkT1cjP.js} +1 -1
  7. package/dist/{NumberFieldContent-CLNVR1iY.js → NumberFieldContent-BbLOh8RU.js} +2 -2
  8. package/dist/{SelectScrollDownButton-C7TRe-ep.js → SelectScrollDownButton-T32cVFeM.js} +3 -3
  9. package/dist/{SelectSeparator-L8pPEn4L.js → SelectSeparator-C4Ql0gzV.js} +1 -1
  10. package/dist/{TabsList-qyHZ2lKY.js → TabsList-B8CVOQPC.js} +2 -2
  11. package/dist/{Toaster-CabYEEF_.js → Toaster-1rYWrmAm.js} +1 -1
  12. package/dist/{ToggleGroupItem-CkXUcBlt.js → ToggleGroupItem-Cev4pOVK.js} +4 -4
  13. package/dist/animated-digit.js +1 -1
  14. package/dist/api/index.d.ts +1 -1
  15. package/dist/api.js +1 -1
  16. package/dist/aurora.js +10 -10
  17. package/dist/{badge-DHQrc_GQ.js → badge-BvwvT50i.js} +4 -4
  18. package/dist/badge.js +1 -1
  19. package/dist/{button-CAywcrhO.js → button-DN39cGqL.js} +13 -12
  20. package/dist/button.js +1 -1
  21. package/dist/card.js +1 -1
  22. package/dist/carousel.js +1 -1
  23. package/dist/color.js +1 -1
  24. package/dist/command.js +1 -1
  25. package/dist/{compile-BBTRjvQS.js → compile-DAjIoEy2.js} +1 -1
  26. package/dist/components/custom/configurator/ConfiguratorLayer.vue.d.ts +1 -1
  27. package/dist/components/custom/dock/DockSeparator.vue.d.ts +3 -0
  28. package/dist/components/custom/dock/GlassDock.vue.d.ts +45 -63
  29. package/dist/components/custom/dock/composables/dockContext.d.ts +7 -0
  30. package/dist/components/custom/dock/index.d.ts +2 -1
  31. package/dist/components/custom/goo-blob/composables/useBlobMood.d.ts +19 -5
  32. package/dist/components/custom/tabs/SegmentedTabs.vue.d.ts +92 -0
  33. package/dist/components/custom/tabs/composables/useTabIndicator.d.ts +49 -0
  34. package/dist/components/custom/tabs/index.d.ts +2 -5
  35. package/dist/components/ui/button/index.d.ts +1 -1
  36. package/dist/components/ui/card/Card.vue.d.ts +5 -3
  37. package/dist/components/ui/carousel/CarouselNext.vue.d.ts +1 -1
  38. package/dist/components/ui/carousel/CarouselPrevious.vue.d.ts +1 -1
  39. package/dist/components/ui/carousel/GlassCarouselPager.vue.d.ts +3 -4
  40. package/dist/components/ui/slider/index.d.ts +14 -7
  41. package/dist/components/ui/tabs/TabsList.vue.d.ts +1 -1
  42. package/dist/composables/context/createContext.d.ts +1 -1
  43. package/dist/configurator.js +1 -1
  44. package/dist/confirm-dialog.js +1 -1
  45. package/dist/constellation.js +1 -1
  46. package/dist/context-menu.js +1 -1
  47. package/dist/controls.js +1 -1
  48. package/dist/dark.js +1 -1
  49. package/dist/data-table.js +1 -1
  50. package/dist/deck-progress.js +1 -1
  51. package/dist/dialog.js +1 -1
  52. package/dist/dock.js +256 -243
  53. package/dist/{dropdown-menu-B_4bWyyG.js → dropdown-menu-D77jX6Df.js} +3 -3
  54. package/dist/dropdown-menu.js +1 -1
  55. package/dist/expandable-container.js +1 -1
  56. package/dist/forms.js +5 -5
  57. package/dist/fourier-field.js +3 -3
  58. package/dist/glass-ui.css +1 -1
  59. package/dist/glass-ui.js +101 -104
  60. package/dist/goo-blob.js +36 -32
  61. package/dist/hover-popover.js +1 -1
  62. package/dist/icon-tooltip.js +1 -1
  63. package/dist/index.d.ts +0 -2
  64. package/dist/keyboard.js +1 -1
  65. package/dist/labeled-field.js +4 -4
  66. package/dist/{menuItemVariants-DKM85SNE.js → menuItemVariants-CCoBNkU5.js} +1 -1
  67. package/dist/motion-core.js +4 -4
  68. package/dist/motion.js +2 -2
  69. package/dist/number-field.js +1 -1
  70. package/dist/pulse.js +1 -1
  71. package/dist/reactive.js +1 -1
  72. package/dist/scrolling-text.js +1 -1
  73. package/dist/search.js +4 -4
  74. package/dist/select.js +2 -2
  75. package/dist/{slider-D9puf-Ko.js → slider-DC2mwuoe.js} +1 -1
  76. package/dist/slider.js +1 -1
  77. package/dist/sortable-list.js +1 -1
  78. package/dist/status-dot.js +17 -16
  79. package/dist/styles/animations.css +6 -2
  80. package/dist/styles/components.css +1 -1
  81. package/dist/styles/dock/density.css +230 -0
  82. package/dist/styles/dock/layer-group.css +263 -0
  83. package/dist/styles/dock/layers.css +355 -0
  84. package/dist/styles/dock/morph.css +244 -0
  85. package/dist/styles/dock/overflow.css +201 -0
  86. package/dist/styles/dock/shell.css +457 -0
  87. package/dist/styles/dock-controls.css +166 -32
  88. package/dist/styles/dock.css +42 -1349
  89. package/dist/styles/glass.css +396 -75
  90. package/dist/styles/index.css +12 -11
  91. package/dist/styles/theme.css +51 -0
  92. package/dist/styles/tokens.css +501 -55
  93. package/dist/styles/utilities.css +89 -39
  94. package/dist/tabs.js +182 -151
  95. package/dist/timeline.js +1 -1
  96. package/dist/toast.js +1 -1
  97. package/dist/toggle-group.js +1 -1
  98. package/dist/{useAnimatedNumber-C_3wZLx4.js → useAnimatedNumber-C5I3wWd8.js} +1 -1
  99. package/dist/{useConfiguratorState-CMff4GzH.js → useConfiguratorState-DxAqksK6.js} +21 -10
  100. package/dist/watercolor-dot.js +1 -1
  101. package/package.json +32 -33
  102. package/src/styles/animations.css +6 -2
  103. package/src/styles/dock/density.css +230 -0
  104. package/src/styles/dock/layer-group.css +263 -0
  105. package/src/styles/dock/layers.css +355 -0
  106. package/src/styles/dock/morph.css +244 -0
  107. package/src/styles/dock/overflow.css +201 -0
  108. package/src/styles/dock/shell.css +457 -0
  109. package/src/styles/dock-controls.css +166 -32
  110. package/src/styles/dock.css +42 -1349
  111. package/src/styles/glass.css +396 -75
  112. package/src/styles/index.css +12 -11
  113. package/src/styles/theme.css +51 -0
  114. package/src/styles/tokens.css +501 -55
  115. package/src/styles/utilities.css +89 -39
  116. package/dist/DiscoGlyph-CG0F410s.js +0 -132
  117. package/dist/GlyphFace-DRjDkB0s.js +0 -51
  118. package/dist/UnderlineTabs-Uxn-R3MT.js +0 -39
  119. package/dist/components/custom/aurora/constants/shaders/painterly.wgsl.d.ts +0 -7
  120. package/dist/components/custom/aurora/constants/shaders/wake.wgsl.d.ts +0 -4
  121. package/dist/components/custom/disco-glyph/DiscoGlyph.vue.d.ts +0 -58
  122. package/dist/components/custom/disco-glyph/index.d.ts +0 -1
  123. package/dist/components/custom/glass-carousel/GlassCarousel.vue.d.ts +0 -36
  124. package/dist/components/custom/glass-carousel/GlassCarouselItem.vue.d.ts +0 -28
  125. package/dist/components/custom/glass-carousel/index.d.ts +0 -4
  126. package/dist/components/custom/glass-carousel/useGlassCarousel.d.ts +0 -30
  127. package/dist/components/custom/glyph-face/GlyphFace.vue.d.ts +0 -64
  128. package/dist/components/custom/glyph-face/index.d.ts +0 -2
  129. package/dist/components/custom/glyph-face/keys.d.ts +0 -9
  130. package/dist/components/custom/responsive-tabs/ResponsiveTabs.vue.d.ts +0 -73
  131. package/dist/components/custom/responsive-tabs/index.d.ts +0 -2
  132. package/dist/components/custom/tabs/BouncyTabs.vue.d.ts +0 -27
  133. package/dist/components/custom/tabs/BouncyToggle.vue.d.ts +0 -60
  134. package/dist/components/custom/tabs/UnderlineTabs.vue.d.ts +0 -20
  135. package/dist/components/custom/tabs/composables/useBouncySlider.d.ts +0 -39
  136. package/dist/disco-glyph.d.ts +0 -1
  137. package/dist/disco-glyph.js +0 -2
  138. package/dist/glass-carousel.d.ts +0 -1
  139. package/dist/glass-carousel.js +0 -219
  140. package/dist/glyph-face.d.ts +0 -1
  141. package/dist/glyph-face.js +0 -3
  142. package/dist/keys-BsYjEFOW.js +0 -9
  143. package/dist/responsive-tabs.d.ts +0 -1
  144. package/dist/responsive-tabs.js +0 -95
  145. package/dist/styles/disco-glyph.css +0 -26
  146. package/dist/styles/glyph-face.css +0 -92
  147. package/src/styles/disco-glyph.css +0 -26
  148. package/src/styles/glyph-face.css +0 -92
  149. /package/dist/{DeckProgress-AVgbIULY.js → DeckProgress-Dmk4_AKN.js} +0 -0
  150. /package/dist/{HoverPopover-D56O6Ylp.js → HoverPopover-2LOIW34a.js} +0 -0
  151. /package/dist/{IconTooltip-D2T5nYOM.js → IconTooltip-yefK7cJc.js} +0 -0
  152. /package/dist/{Input-DVG_J0ne.js → Input-DWQQIOC4.js} +0 -0
  153. /package/dist/{ScrollingText-CVyqxvfv.js → ScrollingText-BPP84wKo.js} +0 -0
  154. /package/dist/{color-DMLTunJK.js → color-8jBjWiJ6.js} +0 -0
  155. /package/dist/{constants-BPOqYJAm.js → constants-CS75AWHG.js} +0 -0
  156. /package/dist/{presets-D1XPuTj-.js → presets-BKVyQfbt.js} +0 -0
  157. /package/dist/{prng-COGhh02-.js → prng-wHuHlNHE.js} +0 -0
  158. /package/dist/{useGlobalDark-D3EBWzXK.js → useGlobalDark-yhL4Wp-s.js} +0 -0
  159. /package/dist/{useIntersectionPause-Bj4sPkMh.js → useIntersectionPause-Cc-H9ees.js} +0 -0
  160. /package/dist/{useInterval-CcLfq2WU.js → useInterval-Dsmqwi03.js} +0 -0
  161. /package/dist/{useKeyboardShortcuts-BXWXOZ-9.js → useKeyboardShortcuts-Be3w_Rwk.js} +0 -0
  162. /package/dist/{useScrollProgress-C9ysDic5.js → useScrollProgress-CAH8Ofwt.js} +0 -0
  163. /package/dist/{useSortable-MGAbCGVJ.js → useSortable-C8ReQ50P.js} +0 -0
  164. /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
+ }