@mkbabb/glass-ui 2.1.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{CardFooter-Yi0xtLLd.js → CardFooter-CSGcJkqa.js} +1 -1
- package/dist/{CommandShortcut-_INFUMu6.js → CommandShortcut-DWT19a2Y.js} +3 -3
- package/dist/{ContextMenuSubContent-DCkweFW9.js → ContextMenuSubContent-gAFxJ-qi.js} +1 -1
- package/dist/{DataTable-Ce00dbHD.js → DataTable-R8-Zidms.js} +3 -3
- package/dist/{DialogContent-CmCijgX9.js → DialogContent-2fALDSvc.js} +3 -3
- package/dist/{DialogFooter-DRdaCok0.js → DialogFooter-ClrNEOVU.js} +2 -2
- package/dist/{DiscoGlyph-wRA02zAJ.js → DiscoGlyph-C3JfMnRV.js} +1 -1
- package/dist/{GlyphFace-BnPMUZ16.js → GlyphFace-BRS8vUb7.js} +1 -1
- package/dist/HoverPopover-CWFCfLx3.js +96 -0
- package/dist/{IconTooltip-ge_mBSWR.js → IconTooltip-BkaA7tZ2.js} +1 -1
- package/dist/{Input-CbakTe3B.js → Input-DDpFn568.js} +3 -5
- package/dist/Label-DJty89bp.js +36 -0
- package/dist/{MetricBadge-DRBB18Xq.js → MetricBadge-DmAihkXd.js} +1 -1
- package/dist/{Notification-DrI1DT2v.js → Notification-OqIpADml.js} +2 -2
- package/dist/NumberFieldContent-DTH9gb_N.js +141 -0
- package/dist/{PopoverContent-BCH4eYs8.js → PopoverContent-EiklFrna.js} +1 -1
- package/dist/{Progress-CCH-2UBR.js → Progress-FApA9fm_.js} +1 -1
- package/dist/{ScrollingText-7P8skg5W.js → ScrollingText-BFd0i2zJ.js} +2 -2
- package/dist/{SelectScrollDownButton-yu8EYUnu.js → SelectScrollDownButton-Dth8-wXQ.js} +2 -2
- package/dist/{Toaster-DY8_jtHv.js → Toaster-Bjlunvq4.js} +69 -58
- package/dist/UnderlineTabs-DAWMLmJG.js +37 -0
- package/dist/animated-digit.js +2 -2
- package/dist/api/index.d.ts +2 -0
- package/dist/api.js +1 -1
- package/dist/aurora.js +103 -90
- package/dist/badge.js +1 -1
- package/dist/{button-BlOW34DT.js → button-C0aHmBbt.js} +2 -0
- package/dist/button.js +1 -1
- package/dist/card.js +1 -1
- package/dist/carousel.js +1 -1
- package/dist/collapsible.js +1 -1
- package/dist/command.js +1 -1
- package/dist/components/custom/aurora/composables/runtime.d.ts +24 -1
- package/dist/components/custom/dialog-native/GlassDialogNative.vue.d.ts +57 -0
- package/dist/components/custom/dialog-native/index.d.ts +1 -0
- package/dist/components/custom/dock/composables/useLayerTransition.d.ts +20 -10
- package/dist/components/custom/hover-popover/HoverPopover.vue.d.ts +26 -4
- package/dist/components/custom/labeled-field/LabeledField.vue.d.ts +16 -2
- package/dist/components/custom/labeled-field/LabeledInput.vue.d.ts +17 -1
- package/dist/components/custom/labeled-field/LabeledSelect.vue.d.ts +2 -0
- package/dist/components/custom/labeled-field/LabeledSlider.vue.d.ts +2 -0
- package/dist/components/custom/labeled-field/LabeledSwitch.vue.d.ts +2 -0
- package/dist/components/custom/toggle-chip/ToggleChip.vue.d.ts +6 -4
- package/dist/components/ui/input/Input.vue.d.ts +10 -7
- package/dist/components/ui/label/Label.vue.d.ts +8 -0
- package/dist/components/ui/textarea/Textarea.vue.d.ts +45 -8
- package/dist/components/ui/toast/Toaster.vue.d.ts +7 -1
- package/dist/components/ui/toast/index.d.ts +1 -0
- package/dist/composables/dark/index.d.ts +1 -0
- package/dist/composables/dom/index.d.ts +2 -0
- package/dist/composables/dom/useIdleReady.d.ts +63 -0
- package/dist/composables/dom/useUserInvalidAria.d.ts +32 -0
- package/dist/composables/index.d.ts +1 -0
- package/dist/composables/motion/core/index.d.ts +8 -0
- package/dist/composables/motion/index.d.ts +0 -7
- package/dist/composables/motion/supportsCssTimeline.d.ts +8 -0
- package/dist/composables/motion/useRAFLoop.d.ts +7 -0
- package/dist/composables/motion/useScrollProgress.d.ts +6 -2
- package/dist/composables/motion/useStaggerReveal.d.ts +6 -0
- package/dist/composables/motion/useViewTransition.d.ts +31 -0
- package/dist/composables/motion/useYieldToMain.d.ts +29 -0
- package/dist/configurator.js +1 -1
- package/dist/confirm-dialog.js +2 -2
- package/dist/constants-DwBwnG8N.js +13 -0
- package/dist/context-menu.js +2 -2
- package/dist/controls.js +2 -2
- package/dist/dark.d.ts +1 -1
- package/dist/dark.js +13 -2
- package/dist/data-table.js +1 -1
- package/dist/dialog.js +2 -2
- package/dist/disco-glyph.js +1 -1
- package/dist/dock.js +195 -176
- package/dist/dom.js +5 -4
- package/dist/{dropdown-menu-2K-SGkZU.js → dropdown-menu-BvRUamNs.js} +2 -2
- package/dist/dropdown-menu.js +1 -1
- package/dist/expandable-container.js +3 -3
- package/dist/forms.d.ts +1 -0
- package/dist/forms.js +47 -42
- package/dist/glass-carousel.js +1 -1
- package/dist/glass-panel.js +2 -2
- package/dist/glass-ui.css +1 -1
- package/dist/glass-ui.js +156 -275
- package/dist/glyph-face.js +2 -2
- 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 -0
- package/dist/instrument-chassis.js +1 -1
- package/dist/instrument-rail.js +1 -1
- package/dist/keyboard.js +1 -1
- package/dist/label.js +1 -1
- package/dist/labeled-field.js +96 -57
- package/dist/metric-badge.js +1 -1
- package/dist/metric-stack.js +1 -1
- package/dist/motion-core.d.ts +1 -0
- package/dist/motion-core.js +229 -0
- package/dist/motion.js +26 -228
- package/dist/notification.js +1 -1
- package/dist/number-field.d.ts +1 -0
- package/dist/number-field.js +2 -0
- package/dist/paper-backdrop.js +1 -1
- package/dist/popover.js +1 -1
- package/dist/progress.js +1 -1
- package/dist/pulse.js +1 -1
- package/dist/reactive.js +2 -2
- package/dist/responsive-tabs.js +3 -3
- package/dist/scrolling-text.js +1 -1
- package/dist/search.js +6 -6
- package/dist/select.js +3 -3
- package/dist/separator.js +1 -1
- package/dist/{sheet-CLVkb3AO.js → sheet-CukNDezz.js} +53 -53
- package/dist/sheet.js +1 -1
- package/dist/{slider-BQaLYFLh.js → slider-DJvHkTRe.js} +3 -3
- package/dist/slider.js +1 -1
- package/dist/sortable-list.js +2 -2
- package/dist/styles/animations.css +77 -0
- package/dist/styles/cards.css +6 -2
- package/dist/styles/dock.css +109 -109
- package/dist/styles/drawer.css +2 -2
- package/dist/styles/glass.css +89 -6
- package/dist/styles/index.css +10 -1
- package/dist/styles/instrument-chassis.css +28 -1
- package/dist/styles/scroll-driven.css +72 -0
- package/dist/styles/theme.css +6 -0
- package/dist/styles/tokens.css +345 -289
- package/dist/styles/typography.css +65 -131
- package/dist/styles/utilities.css +199 -81
- package/dist/styles/view-transition.css +62 -0
- package/dist/switch.d.ts +1 -0
- package/dist/switch.js +2 -0
- package/dist/tabs.js +40 -36
- package/dist/timeline.js +2 -2
- 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/{useAnimatedNumber-DcvTR9B4.js → useAnimatedNumber-DKQYVB7s.js} +9 -20
- package/dist/{useConfiguratorState-BlaevW0S.js → useConfiguratorState-BR5vUDL8.js} +5 -5
- package/dist/{useBreakpoint-BHlX-MhR.js → useIdleReady-Cmkhm03v.js} +30 -2
- package/dist/{useTouchGate-BhhEMlwJ.js → useTouchGate-D9Zvrzyc.js} +1 -1
- package/dist/useUserInvalidAria-DVu1eTXG.js +29 -0
- package/dist/useViewTransition-DYIK6Gzb.js +16 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/moveBefore.d.ts +15 -0
- package/package.json +27 -6
- package/src/styles/animations.css +77 -0
- package/src/styles/cards.css +6 -2
- package/src/styles/dock.css +109 -109
- package/src/styles/drawer.css +2 -2
- package/src/styles/glass.css +89 -6
- package/src/styles/index.css +10 -1
- package/src/styles/instrument-chassis.css +28 -1
- package/src/styles/scroll-driven.css +72 -0
- package/src/styles/theme.css +6 -0
- package/src/styles/tokens.css +345 -289
- package/src/styles/typography.css +65 -131
- package/src/styles/utilities.css +199 -81
- package/src/styles/view-transition.css +62 -0
- package/dist/HoverPopover-Btv4RQfv.js +0 -80
- package/dist/Label-C8QMJSsf.js +0 -32
- package/dist/UnderlineTabs-BtrUcXn-.js +0 -64
- package/dist/composables/motion/useSpringOrchestrator.d.ts +0 -15
- /package/dist/{CollapsibleContent-DHRuXE3P.js → CollapsibleContent-CVMOcYlV.js} +0 -0
- /package/dist/{ContextMenuContent-CvXfU5qz.js → ContextMenuContent-otjFIu8v.js} +0 -0
- /package/dist/{HoverCardContent-4nN5-5bz.js → HoverCardContent-DaGrgJBO.js} +0 -0
- /package/dist/{InstrumentChassis-DOaVYyWq.js → InstrumentChassis-CnHTMxds.js} +0 -0
- /package/dist/{InstrumentRail-jHDqXj70.js → InstrumentRail-C6dEbi8E.js} +0 -0
- /package/dist/{ModalOverlay-DKLVY-cj.js → ModalOverlay-iWiAgbYH.js} +0 -0
- /package/dist/{PaperBackdrop-Bc2drCqJ.js → PaperBackdrop-CeZ-w0R0.js} +0 -0
- /package/dist/{SelectGroup-O69GTQ77.js → SelectGroup-DdR4tdDY.js} +0 -0
- /package/dist/{SelectSeparator-GTHxKO0a.js → SelectSeparator-CXm_hlqA.js} +0 -0
- /package/dist/{Separator-_NCypg_C.js → Separator-D8AUMhxY.js} +0 -0
- /package/dist/{Switch-CL0uxu8F.js → Switch-Cr1t_F_U.js} +0 -0
- /package/dist/{ToggleGroupItem-BYG_8M9M.js → ToggleGroupItem-OesUouE7.js} +0 -0
- /package/dist/{TooltipProvider-C5QLSPto.js → TooltipProvider-DE78vbEP.js} +0 -0
- /package/dist/{_plugin-vue_export-helper-n-_DRHWS.js → _plugin-vue_export-helper-Dq1MygBL.js} +0 -0
- /package/dist/{badge-BbxVKZfw.js → badge-x46my_Fo.js} +0 -0
- /package/dist/composables/{motion → dark}/installDarkModeSync.d.ts +0 -0
- /package/dist/{dockContext-BDGSrwsV.js → dockContext-D5NZCWJs.js} +0 -0
- /package/dist/{keys-DVkcUktU.js → keys-CaTQS-vx.js} +0 -0
- /package/dist/{menuItemVariants-B2nDL7zH.js → menuItemVariants-BsbGNq9C.js} +0 -0
- /package/dist/{presets-BMzCDrmR.js → presets-a-D93K1S.js} +0 -0
- /package/dist/{search-ocd8tmL9.js → search-DBAiUABx.js} +0 -0
- /package/dist/{useGlassRenderer-DMDdMH55.js → useGlassRenderer-Ds-nmrGz.js} +0 -0
- /package/dist/{useGlobalDark-PMiP5Jku.js → useGlobalDark-B0WvLJE3.js} +0 -0
- /package/dist/{useIntersectionPause-CXYfYg_C.js → useIntersectionPause-IY2CwPQb.js} +0 -0
- /package/dist/{useInterval-COlTCeVa.js → useInterval-DVgGUf_y.js} +0 -0
- /package/dist/{useKeyboardShortcuts-B1ev1YEC.js → useKeyboardShortcuts-Dpw_RUcB.js} +0 -0
- /package/dist/{useResizeObserver-F4aRR4Cj.js → useResizeObserver-Cg9npuM3.js} +0 -0
- /package/dist/{useSortable-Ck0rBJ4g.js → useSortable-Cq2Y1JLO.js} +0 -0
- /package/dist/{useSpringMount-BTRBNzXP.js → useSpringMount-Cfk1XK1R.js} +0 -0
- /package/dist/{useTimer-lp5NlH4w.js → useTimer-NAaj9zNq.js} +0 -0
- /package/dist/{x-cdWAmO-q.js → x-q7pJa83X.js} +0 -0
package/src/styles/dock.css
CHANGED
|
@@ -22,6 +22,29 @@
|
|
|
22
22
|
--dock-motion-resize: var(--duration-normal) var(--spring-snappy);
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
/* Shared four-state contract — the focus-visible ring + disabled paint are
|
|
26
|
+
identical across every dock control, so they are expressed ONCE here as a
|
|
27
|
+
comma group over the control family rather than copied per rule-set. The
|
|
28
|
+
group keeps full class+pseudo specificity (NOT `:where()`, which would
|
|
29
|
+
zero the class and let a per-control :hover box-shadow override the focus
|
|
30
|
+
ring). Per-control transition extensions (the box-shadow fade on
|
|
31
|
+
focus-visible) stay with their own selectors below where they differ. */
|
|
32
|
+
.dock-icon-button:focus-visible,
|
|
33
|
+
.dock-tab-button:focus-visible,
|
|
34
|
+
.dock-select-trigger:focus-visible,
|
|
35
|
+
.dock-dropdown-trigger:focus-visible {
|
|
36
|
+
box-shadow: var(--focus-ring-shadow);
|
|
37
|
+
outline: none;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.dock-icon-button:disabled,
|
|
41
|
+
.dock-tab-button:disabled,
|
|
42
|
+
.dock-select-trigger:disabled,
|
|
43
|
+
.dock-dropdown-trigger:disabled {
|
|
44
|
+
opacity: var(--opacity-disabled);
|
|
45
|
+
cursor: not-allowed;
|
|
46
|
+
}
|
|
47
|
+
|
|
25
48
|
.glass-dock {
|
|
26
49
|
--dock-surface-blur: var(--glass-blur-dock, var(--glass-blur-wash));
|
|
27
50
|
/* J.W3.C — vertical-rail max-block + horizontal max-inline caps
|
|
@@ -33,6 +56,11 @@
|
|
|
33
56
|
--dock-wrap-max-width: calc(100vw - var(--dock-viewport-inline-gutter, 1rem));
|
|
34
57
|
--dock-separator-height: calc(var(--dock-h, var(--size-icon-btn)) * 0.5);
|
|
35
58
|
--dock-collapsed-hover-scale: var(--scale-hover-dock);
|
|
59
|
+
/* Individual-transform identity base (AQ.W3 §W3.2). `scale: 1` at rest
|
|
60
|
+
mints the stacking context once so a portaled popover over `--z-dock`
|
|
61
|
+
stays above the dock during a hover scale (the load-bearing
|
|
62
|
+
stacking-context guarantee). Covers every dock scale site. */
|
|
63
|
+
scale: 1;
|
|
36
64
|
position: relative;
|
|
37
65
|
display: inline-flex;
|
|
38
66
|
align-items: center;
|
|
@@ -68,6 +96,7 @@
|
|
|
68
96
|
--dock-trigger-padding-inline: var(--dock-density-compact-trigger-padding-inline, 0.4375rem);
|
|
69
97
|
--dock-tab-padding-block: var(--dock-density-compact-tab-padding-block, 0.3125rem);
|
|
70
98
|
--dock-tab-padding-inline: var(--dock-density-compact-tab-padding-inline, 0.625rem);
|
|
99
|
+
--dock-tab-h: 32px;
|
|
71
100
|
}
|
|
72
101
|
|
|
73
102
|
/* Comfortable density — the GlassDock default. Sits between compact
|
|
@@ -82,6 +111,7 @@
|
|
|
82
111
|
--dock-trigger-padding-inline: var(--dock-density-comfortable-trigger-padding-inline, 0.5rem);
|
|
83
112
|
--dock-tab-padding-block: var(--dock-density-comfortable-tab-padding-block, 0.4375rem);
|
|
84
113
|
--dock-tab-padding-inline: var(--dock-density-comfortable-tab-padding-inline, 0.75rem);
|
|
114
|
+
--dock-tab-h: 38px;
|
|
85
115
|
}
|
|
86
116
|
|
|
87
117
|
.glass-dock[data-density="spacious"] {
|
|
@@ -94,6 +124,7 @@
|
|
|
94
124
|
--dock-trigger-padding-inline: var(--dock-density-spacious-trigger-padding-inline, 0.625rem);
|
|
95
125
|
--dock-tab-padding-block: var(--dock-density-spacious-tab-padding-block, 0.5rem);
|
|
96
126
|
--dock-tab-padding-inline: var(--dock-density-spacious-tab-padding-inline, 0.875rem);
|
|
127
|
+
--dock-tab-h: 44px;
|
|
97
128
|
}
|
|
98
129
|
|
|
99
130
|
/* Audacious density — typography-forward chrome where the dock reads as
|
|
@@ -111,41 +142,13 @@
|
|
|
111
142
|
--dock-tab-padding-block: var(--dock-density-audacious-tab-padding-block, 0.5rem);
|
|
112
143
|
--dock-tab-padding-inline: var(--dock-density-audacious-tab-padding-inline, 1.5rem);
|
|
113
144
|
--dock-tab-min-height: var(--dock-density-audacious-tab-min-height, 3.5rem);
|
|
145
|
+
--dock-tab-h: var(--dock-density-audacious-tab-min-height, 3.5rem);
|
|
114
146
|
}
|
|
115
147
|
|
|
116
|
-
/*
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
height via `--dock-control-size` (set per density tier above);
|
|
121
|
-
DockTabButton's analogous `--dock-tab-h` knob lives in the same
|
|
122
|
-
density rungs so the tab-button row no longer free-floats to the
|
|
123
|
-
glyph + padding sum. Compact density lands at 32px to match the
|
|
124
|
-
deployed product's bottom-dock height. The `.dock-tab-button` rule
|
|
125
|
-
(further down this file) consumes `--dock-tab-h`. */
|
|
126
|
-
.glass-dock[data-density="compact"] {
|
|
127
|
-
--dock-tab-h-compact: 32px;
|
|
128
|
-
--dock-tab-h: var(--dock-tab-h-compact);
|
|
129
|
-
}
|
|
130
|
-
.glass-dock[data-density="comfortable"] {
|
|
131
|
-
--dock-tab-h-comfortable: 38px;
|
|
132
|
-
--dock-tab-h: var(--dock-tab-h-comfortable);
|
|
133
|
-
}
|
|
134
|
-
.glass-dock[data-density="spacious"] {
|
|
135
|
-
--dock-tab-h-spacious: 44px;
|
|
136
|
-
--dock-tab-h: var(--dock-tab-h-spacious);
|
|
137
|
-
}
|
|
138
|
-
.glass-dock[data-density="audacious"] {
|
|
139
|
-
--dock-tab-h-audacious: var(--dock-density-audacious-tab-min-height, 3.5rem);
|
|
140
|
-
--dock-tab-h: var(--dock-tab-h-audacious);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/* Density-audacious mobile carve (R3-spec / audit-D D-Rec-5;
|
|
144
|
-
consolidated into dock.css at Q.W3 Lane A). At narrow viewports
|
|
145
|
-
the audacious-dock label glyphs compress so the audacious chrome
|
|
146
|
-
doesn't overflow its host: `≤14px at <480` and `15px at 480–719`.
|
|
147
|
-
Consumer dock label spans bind `font-size: var(--dock-label-size)`
|
|
148
|
-
(typography.css `.dock-label` recipe is the canonical consumer). */
|
|
148
|
+
/* Density-audacious mobile carve — at narrow viewports the audacious-dock
|
|
149
|
+
label glyphs compress so the chrome doesn't overflow its host
|
|
150
|
+
(≤14px at <480, 15px at 480–719). Consumer dock label spans bind
|
|
151
|
+
`font-size: var(--dock-label-size)` (typography.css `.dock-label`). */
|
|
149
152
|
@media (max-width: 479px) {
|
|
150
153
|
.glass-dock[data-density="audacious"] {
|
|
151
154
|
--dock-label-size: 14px;
|
|
@@ -188,22 +191,11 @@
|
|
|
188
191
|
border-color var(--dock-motion-standard);
|
|
189
192
|
}
|
|
190
193
|
|
|
191
|
-
/*
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
`dock-wrap`) or to clamp via `--dock-max-block-size` and let the
|
|
197
|
-
cap fail visibly rather than mask the overflow as a scroll
|
|
198
|
-
affordance.
|
|
199
|
-
|
|
200
|
-
The edge-fade `mask-image` retired here in lockstep with the
|
|
201
|
-
horizontal `.dock-layers` rule. With grow-to-fit + visible
|
|
202
|
-
overflow the rail never scrolls, so a scroll-feather mask has
|
|
203
|
-
nothing to feather — it only bled a transparent ramp onto the
|
|
204
|
-
top and bottom rail items, casting a stray directional shadow
|
|
205
|
-
on those edge controls. J.W3.C's auto + mask-fade shape is fully
|
|
206
|
-
superseded: grow-to-fit is the whole contract, no feather. */
|
|
194
|
+
/* Vertical rails grow-to-fit + clamp, no scroll: descendants wrap to
|
|
195
|
+
multiple rows (opt-in via `dock-wrap`) or clamp via
|
|
196
|
+
`--dock-max-block-size`; the cap fails visibly rather than masking
|
|
197
|
+
overflow as a scroll affordance. No edge-fade mask — a rail that never
|
|
198
|
+
scrolls has nothing to feather. */
|
|
207
199
|
.glass-dock.vertical {
|
|
208
200
|
display: inline-flex;
|
|
209
201
|
flex-direction: column;
|
|
@@ -321,7 +313,7 @@
|
|
|
321
313
|
background: var(--glass-bg-wash);
|
|
322
314
|
border-color: var(--glass-border-floating);
|
|
323
315
|
box-shadow: var(--shadow-dock-override, var(--shadow-dock));
|
|
324
|
-
|
|
316
|
+
scale: var(--dock-collapsed-hover-scale);
|
|
325
317
|
}
|
|
326
318
|
|
|
327
319
|
/* J.W5.C — held-state substrate response.
|
|
@@ -344,6 +336,15 @@
|
|
|
344
336
|
box-shadow var(--duration-fast) var(--ease-standard);
|
|
345
337
|
}
|
|
346
338
|
|
|
339
|
+
/* AQ.W3 §W3.1b — open-descendant surface response. When a dock-hosted
|
|
340
|
+
trigger (`[data-state="open"]`) is open, the dock root holds its elevated
|
|
341
|
+
read natively (no consumer JS). Idempotent with `[data-held]` above (same
|
|
342
|
+
floating paint, different trigger). Decorative; `:has()` Baseline Widely. */
|
|
343
|
+
.glass-dock:has([data-state="open"]) {
|
|
344
|
+
background: var(--glass-bg-floating, var(--glass-bg-resting));
|
|
345
|
+
border-color: var(--glass-border-floating, var(--glass-border-resting));
|
|
346
|
+
}
|
|
347
|
+
|
|
347
348
|
.glass-dock:where(.fixed) {
|
|
348
349
|
z-index: var(--z-dock);
|
|
349
350
|
}
|
|
@@ -382,23 +383,11 @@
|
|
|
382
383
|
transition: width var(--dock-motion-resize);
|
|
383
384
|
}
|
|
384
385
|
|
|
385
|
-
/*
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
when it shouldn't" — the wrong escape valve.
|
|
391
|
-
|
|
392
|
-
The edge-fade `mask-image` retired here. Once Z.W2.T2 made the
|
|
393
|
-
dock grow-to-fit, content is never clipped and never scrolls, so
|
|
394
|
-
the mask had nothing left to feather — it was kept only "for
|
|
395
|
-
visual symmetry" with the vertical rule. In practice the 1rem
|
|
396
|
-
transparent ramp at each edge bled onto the first and last dock
|
|
397
|
-
items: the rightmost control (e.g. a settings cog) had its outer
|
|
398
|
-
edge faded into the glass backdrop, which read as a stray
|
|
399
|
-
directional shadow on that item. A scroll-affordance feather on
|
|
400
|
-
a surface that never scrolls is pure cosmetic damage, so it is
|
|
401
|
-
removed at the root rather than masked per-consumer. */
|
|
386
|
+
/* Horizontal dock content grows visibly when the active layer's natural
|
|
387
|
+
width exceeds the content area (grow-to-fit; consumers needing wrap opt
|
|
388
|
+
into `dock-wrap`). No edge-fade mask — content never clips or scrolls,
|
|
389
|
+
so a feather has nothing to feather and only bleeds a stray ramp onto
|
|
390
|
+
the edge controls. */
|
|
402
391
|
.glass-dock.expanded:not(.dock-wrap) > .dock-layers {
|
|
403
392
|
overflow-x: visible;
|
|
404
393
|
}
|
|
@@ -650,11 +639,30 @@
|
|
|
650
639
|
min-width: 0;
|
|
651
640
|
}
|
|
652
641
|
|
|
642
|
+
/* AP.W3 — axis-aware layer pane. The stack + `useLayerTransition` are
|
|
643
|
+
axis-aware, but the pane was hardcoded to a no-wrap ROW with
|
|
644
|
+
`width: max-content` — forcing a `vertical` group's content onto one
|
|
645
|
+
horizontal line that could not grow down (the vertical-overflow fight).
|
|
646
|
+
A vertical group stacks in a column, stretches, wraps, and block-sizes
|
|
647
|
+
to the height the stack animates. Horizontal byte-identical. */
|
|
648
|
+
.dock-layer-group.vertical .dock-layer-item-host {
|
|
649
|
+
flex-direction: column;
|
|
650
|
+
align-items: stretch;
|
|
651
|
+
white-space: normal;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
.dock-layer-group.vertical .dock-layer-item-host.is-active {
|
|
655
|
+
width: auto;
|
|
656
|
+
height: max-content;
|
|
657
|
+
}
|
|
658
|
+
|
|
653
659
|
.dock-icon-button {
|
|
654
660
|
display: inline-flex;
|
|
655
661
|
align-items: center;
|
|
656
662
|
justify-content: center;
|
|
657
663
|
flex-shrink: 0;
|
|
664
|
+
/* AQ.W3 §W3.2 identity base */
|
|
665
|
+
scale: 1;
|
|
658
666
|
width: var(--dock-control-size, var(--size-icon-btn));
|
|
659
667
|
height: var(--dock-control-size, var(--size-icon-btn));
|
|
660
668
|
padding: var(--dock-icon-padding, 0);
|
|
@@ -667,7 +675,7 @@
|
|
|
667
675
|
transition:
|
|
668
676
|
background-color var(--dock-motion-fast),
|
|
669
677
|
color var(--dock-motion-fast),
|
|
670
|
-
|
|
678
|
+
scale var(--dock-motion-fast),
|
|
671
679
|
opacity var(--dock-motion-fast);
|
|
672
680
|
}
|
|
673
681
|
|
|
@@ -681,11 +689,11 @@
|
|
|
681
689
|
.dock-icon-button:hover:not(:disabled) {
|
|
682
690
|
background: var(--muted);
|
|
683
691
|
color: var(--btn-hover-color, var(--foreground));
|
|
684
|
-
|
|
692
|
+
scale: var(--scale-hover-dock);
|
|
685
693
|
}
|
|
686
694
|
|
|
687
695
|
.dock-icon-button:active:not(:disabled) {
|
|
688
|
-
|
|
696
|
+
scale: var(--scale-press-dock);
|
|
689
697
|
}
|
|
690
698
|
|
|
691
699
|
.dock-icon-button:focus:not(:focus-visible) {
|
|
@@ -693,22 +701,17 @@
|
|
|
693
701
|
outline: none;
|
|
694
702
|
}
|
|
695
703
|
|
|
704
|
+
/* focus-visible ring + disabled paint hoisted to the shared `:where()`
|
|
705
|
+
group at the top; this rule adds only the box-shadow fade transition. */
|
|
696
706
|
.dock-icon-button:focus-visible {
|
|
697
|
-
box-shadow: var(--focus-ring-shadow);
|
|
698
|
-
outline: none;
|
|
699
707
|
transition:
|
|
700
708
|
background-color var(--dock-motion-fast),
|
|
701
709
|
color var(--dock-motion-fast),
|
|
702
|
-
|
|
710
|
+
scale var(--dock-motion-fast),
|
|
703
711
|
opacity var(--dock-motion-fast),
|
|
704
712
|
box-shadow var(--dock-motion-fast);
|
|
705
713
|
}
|
|
706
714
|
|
|
707
|
-
.dock-icon-button:disabled {
|
|
708
|
-
opacity: var(--opacity-disabled);
|
|
709
|
-
cursor: not-allowed;
|
|
710
|
-
}
|
|
711
|
-
|
|
712
715
|
/* O.W6 Lane B — token-ladder active paint. Defaults match the prior
|
|
713
716
|
hardcoded recipe (--muted bg + --foreground color, no transform / border
|
|
714
717
|
/ shadow). Consumers override the active variant via the
|
|
@@ -718,7 +721,7 @@
|
|
|
718
721
|
.dock-icon-button:is(.is-active, .active, [aria-expanded="true"], [aria-pressed="true"]) {
|
|
719
722
|
background: var(--dock-active-bg);
|
|
720
723
|
color: var(--dock-active-color);
|
|
721
|
-
|
|
724
|
+
scale: var(--dock-active-scale);
|
|
722
725
|
border: var(--dock-active-border);
|
|
723
726
|
box-shadow: var(--dock-active-shadow);
|
|
724
727
|
}
|
|
@@ -822,10 +825,12 @@
|
|
|
822
825
|
cursor: pointer;
|
|
823
826
|
white-space: nowrap;
|
|
824
827
|
outline: none;
|
|
828
|
+
/* AQ.W3 §W3.2 identity base */
|
|
829
|
+
scale: 1;
|
|
825
830
|
transition:
|
|
826
831
|
background-color var(--dock-motion-fast),
|
|
827
832
|
color var(--dock-motion-fast),
|
|
828
|
-
|
|
833
|
+
scale var(--dock-motion-fast);
|
|
829
834
|
}
|
|
830
835
|
|
|
831
836
|
.dock-tab-button:hover:not(:disabled) {
|
|
@@ -834,22 +839,15 @@
|
|
|
834
839
|
}
|
|
835
840
|
|
|
836
841
|
.dock-tab-button:active:not(:disabled) {
|
|
837
|
-
|
|
842
|
+
scale: var(--scale-press-dock);
|
|
838
843
|
}
|
|
839
844
|
|
|
840
845
|
.dock-tab-button:focus:not(:focus-visible) {
|
|
841
846
|
box-shadow: none;
|
|
842
847
|
}
|
|
843
848
|
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
outline: none;
|
|
847
|
-
}
|
|
848
|
-
|
|
849
|
-
.dock-tab-button:disabled {
|
|
850
|
-
opacity: var(--opacity-disabled);
|
|
851
|
-
cursor: not-allowed;
|
|
852
|
-
}
|
|
849
|
+
/* focus-visible ring + disabled paint hoisted to the shared `:where()`
|
|
850
|
+
group at the top. */
|
|
853
851
|
|
|
854
852
|
.dock-tab-button:is(.is-active, .active, [aria-current="page"], [aria-pressed="true"]) {
|
|
855
853
|
background: var(--surface-tint-10);
|
|
@@ -958,6 +956,8 @@
|
|
|
958
956
|
align-items: center;
|
|
959
957
|
justify-content: center;
|
|
960
958
|
flex-shrink: 0;
|
|
959
|
+
/* AQ.W3 §W3.2 identity base */
|
|
960
|
+
scale: 1;
|
|
961
961
|
gap: var(--dock-trigger-gap, 0.25rem);
|
|
962
962
|
min-height: var(--dock-trigger-min-height, auto);
|
|
963
963
|
padding:
|
|
@@ -973,7 +973,7 @@
|
|
|
973
973
|
transition:
|
|
974
974
|
background-color var(--dock-motion-fast),
|
|
975
975
|
color var(--dock-motion-fast),
|
|
976
|
-
|
|
976
|
+
scale var(--dock-motion-fast),
|
|
977
977
|
opacity var(--dock-motion-fast);
|
|
978
978
|
}
|
|
979
979
|
|
|
@@ -984,12 +984,12 @@
|
|
|
984
984
|
}
|
|
985
985
|
|
|
986
986
|
.dock-dropdown-trigger:hover:not(:disabled) {
|
|
987
|
-
|
|
987
|
+
scale: var(--scale-hover-dock);
|
|
988
988
|
}
|
|
989
989
|
|
|
990
990
|
.dock-select-trigger:active:not(:disabled),
|
|
991
991
|
.dock-dropdown-trigger:active:not(:disabled) {
|
|
992
|
-
|
|
992
|
+
scale: var(--scale-press-dock);
|
|
993
993
|
}
|
|
994
994
|
|
|
995
995
|
.dock-select-trigger:focus:not(:focus-visible),
|
|
@@ -998,24 +998,18 @@
|
|
|
998
998
|
outline: none;
|
|
999
999
|
}
|
|
1000
1000
|
|
|
1001
|
+
/* focus-visible ring + disabled paint hoisted to the shared `:where()`
|
|
1002
|
+
group at the top; this rule adds only the box-shadow fade transition. */
|
|
1001
1003
|
.dock-select-trigger:focus-visible,
|
|
1002
1004
|
.dock-dropdown-trigger:focus-visible {
|
|
1003
|
-
box-shadow: var(--focus-ring-shadow);
|
|
1004
|
-
outline: none;
|
|
1005
1005
|
transition:
|
|
1006
1006
|
background-color var(--dock-motion-fast),
|
|
1007
1007
|
color var(--dock-motion-fast),
|
|
1008
|
-
|
|
1008
|
+
scale var(--dock-motion-fast),
|
|
1009
1009
|
opacity var(--dock-motion-fast),
|
|
1010
1010
|
box-shadow var(--dock-motion-fast);
|
|
1011
1011
|
}
|
|
1012
1012
|
|
|
1013
|
-
.dock-select-trigger:disabled,
|
|
1014
|
-
.dock-dropdown-trigger:disabled {
|
|
1015
|
-
opacity: var(--opacity-disabled);
|
|
1016
|
-
cursor: not-allowed;
|
|
1017
|
-
}
|
|
1018
|
-
|
|
1019
1013
|
.dock-select-trigger:is(.is-active, .active, [aria-expanded="true"], [aria-pressed="true"]),
|
|
1020
1014
|
.dock-dropdown-trigger:is(.is-active, .active, [aria-expanded="true"], [aria-pressed="true"]) {
|
|
1021
1015
|
background: var(--muted);
|
|
@@ -1027,11 +1021,14 @@
|
|
|
1027
1021
|
height: var(--dock-trigger-icon-size, 0.75rem);
|
|
1028
1022
|
flex-shrink: 0;
|
|
1029
1023
|
opacity: 0.5;
|
|
1030
|
-
|
|
1024
|
+
/* Individual-transform identity base (AQ.W3 §W3.2) — `rotate:` longhand
|
|
1025
|
+
for family consistency (not a stacking-context hazard: child glyph). */
|
|
1026
|
+
rotate: 0deg;
|
|
1027
|
+
transition: rotate var(--dock-motion-fast);
|
|
1031
1028
|
}
|
|
1032
1029
|
|
|
1033
1030
|
.dock-select-trigger[data-state="open"] .dock-select-trigger__chevron {
|
|
1034
|
-
|
|
1031
|
+
rotate: 180deg;
|
|
1035
1032
|
}
|
|
1036
1033
|
|
|
1037
1034
|
@media (min-width: 640px) {
|
|
@@ -1072,12 +1069,15 @@
|
|
|
1072
1069
|
that wires `var(--size-icon-btn)` for trigger sizing) inherit
|
|
1073
1070
|
the same floor.
|
|
1074
1071
|
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1072
|
+
AP.W3 R0G-6 — selector is `.glass-dock[data-density]`, not bare
|
|
1073
|
+
`.glass-dock`: the always-present density setter (0,2,0) shadowed a
|
|
1074
|
+
bare (0,1,0) coarse floor, pinning the touch box at 40px. The
|
|
1075
|
+
presence-selector (0,2,0) wins by source order, lifting
|
|
1076
|
+
`--dock-control-size` to 44px — read by both the button box and the
|
|
1077
|
+
dock width-math, so the slot reserves 44px (no overflow). Fine pointer
|
|
1078
|
+
byte-identical. Proof: design/W1.2-motion-carve-and-dock.md §B.2. */
|
|
1079
1079
|
@media (pointer: coarse) {
|
|
1080
|
-
.glass-dock {
|
|
1080
|
+
.glass-dock[data-density] {
|
|
1081
1081
|
--dock-control-size: var(--dock-touch-target, 2.75rem);
|
|
1082
1082
|
--size-icon-btn: var(--dock-touch-target, 2.75rem);
|
|
1083
1083
|
}
|
package/src/styles/drawer.css
CHANGED
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
border-bottom: 0;
|
|
47
47
|
border-start-start-radius: var(--radius-panel);
|
|
48
48
|
border-start-end-radius: var(--radius-panel);
|
|
49
|
-
background-color:
|
|
49
|
+
background-color: var(--background);
|
|
50
50
|
box-shadow: var(--shadow-2xl);
|
|
51
51
|
}
|
|
52
52
|
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
width: var(--drawer-handle-w);
|
|
99
99
|
height: var(--drawer-handle-h);
|
|
100
100
|
border-radius: var(--radius-pill);
|
|
101
|
-
background-color:
|
|
101
|
+
background-color: var(--drawer-handle-color);
|
|
102
102
|
opacity: var(--drawer-handle-opacity);
|
|
103
103
|
transition: opacity var(--duration-fast) var(--ease-out),
|
|
104
104
|
width var(--duration-fast) var(--ease-out);
|
package/src/styles/glass.css
CHANGED
|
@@ -101,13 +101,30 @@
|
|
|
101
101
|
Interactive cards live in <Card> (which owns its own hover composition)
|
|
102
102
|
or in components that explicitly opt into a hover variant. */
|
|
103
103
|
.glass-card {
|
|
104
|
+
/* Focus-elevation rungs (AQ.W3 §W3.1a) — identity = at-rest paint; the
|
|
105
|
+
`:has(:focus-visible)` rule redefines them (one source, shared with
|
|
106
|
+
the fallback). */
|
|
107
|
+
--card-focus-shadow: var(--shadow-card);
|
|
108
|
+
--card-focus-border: var(--glass-border-quiet);
|
|
104
109
|
position: relative;
|
|
105
110
|
background: var(--glass-bg-quiet);
|
|
106
111
|
backdrop-filter: var(--glass-blur-quiet);
|
|
107
|
-
border: 1px solid var(--
|
|
112
|
+
border: 1px solid var(--card-focus-border);
|
|
108
113
|
border-radius: var(--radius-card);
|
|
109
|
-
box-shadow: var(--shadow
|
|
114
|
+
box-shadow: var(--card-focus-shadow);
|
|
110
115
|
contain: layout style;
|
|
116
|
+
transition:
|
|
117
|
+
box-shadow var(--duration-fast) var(--ease-standard),
|
|
118
|
+
border-color var(--duration-fast) var(--ease-standard);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/* Elevate one rung on descendant KEYBOARD focus (`:focus-visible`, not
|
|
122
|
+
pointer). Scoped to `.glass-card`. `:has()` Baseline Widely; the
|
|
123
|
+
`@supports not selector(:has(*))` class fallback (below) ships anyway
|
|
124
|
+
(focus-elevation is UX-critical — child-state-styling MANDATORY clause). */
|
|
125
|
+
.glass-card:has(:focus-visible) {
|
|
126
|
+
--card-focus-shadow: var(--shadow-md);
|
|
127
|
+
--card-focus-border: var(--glass-border-floating);
|
|
111
128
|
}
|
|
112
129
|
|
|
113
130
|
/* ── Glassmorphic circular icon button ── */
|
|
@@ -115,6 +132,10 @@
|
|
|
115
132
|
.glass-btn {
|
|
116
133
|
@apply flex items-center justify-center cursor-pointer;
|
|
117
134
|
|
|
135
|
+
/* Individual-transform identity base (AQ.W3 §W3.2) — `scale: 1` at rest
|
|
136
|
+
mints the stacking context once so the hover/press scale below does
|
|
137
|
+
not flicker it into being (the z-index/anchor hazard). */
|
|
138
|
+
scale: 1;
|
|
118
139
|
width: var(--size-icon-btn);
|
|
119
140
|
height: var(--size-icon-btn);
|
|
120
141
|
border-radius: var(--radius-pill);
|
|
@@ -126,18 +147,18 @@
|
|
|
126
147
|
background var(--duration-fast) var(--ease-standard),
|
|
127
148
|
border-color var(--duration-fast) var(--ease-standard),
|
|
128
149
|
color var(--duration-fast) var(--ease-standard),
|
|
129
|
-
|
|
150
|
+
scale var(--duration-normal) var(--spring-snappy);
|
|
130
151
|
}
|
|
131
152
|
|
|
132
153
|
.glass-btn:hover:not(:disabled) {
|
|
133
154
|
background: color-mix(in srgb, var(--background) 85%, transparent);
|
|
134
155
|
border-color: var(--surface-tint-22);
|
|
135
156
|
color: var(--foreground);
|
|
136
|
-
|
|
157
|
+
scale: var(--scale-hover);
|
|
137
158
|
}
|
|
138
159
|
|
|
139
160
|
.glass-btn:active:not(:disabled) {
|
|
140
|
-
|
|
161
|
+
scale: var(--scale-press);
|
|
141
162
|
}
|
|
142
163
|
|
|
143
164
|
.glass-btn:focus-visible {
|
|
@@ -210,12 +231,60 @@
|
|
|
210
231
|
color: var(--surface-tint-35);
|
|
211
232
|
}
|
|
212
233
|
|
|
213
|
-
.
|
|
234
|
+
/* AQ.W4 §W4.6 — keyboard-focus ring only. Was bare `:focus` (showed the
|
|
235
|
+
accent ring on a mouse click); `:focus-visible` matches the
|
|
236
|
+
`.focus-ring` / `.glass-btn` / dock-control discipline. Ordered BEFORE
|
|
237
|
+
the `:user-invalid` rungs so an invalid focused field shows destructive,
|
|
238
|
+
not accent (the `:user-invalid:focus-visible` rule below wins by order +
|
|
239
|
+
specificity). `:focus-visible` Baseline Widely — no fallback. */
|
|
240
|
+
.input-pill:focus-visible {
|
|
214
241
|
outline: none;
|
|
215
242
|
border-color: var(--color-accent-opaque, var(--ring));
|
|
216
243
|
box-shadow: 0 0 0 2px var(--color-accent, color-mix(in srgb, var(--ring) 30%, transparent));
|
|
217
244
|
}
|
|
218
245
|
|
|
246
|
+
/* AQ.W4 §W4.1 — validity vocabulary on `.input-pill` (Input + Textarea).
|
|
247
|
+
The forgiving `:where(:user-invalid, .user-invalid-fallback)` group is
|
|
248
|
+
ONE rule covering native + the `useUserInvalidAria` fallback class (css
|
|
249
|
+
§3.2; NOT a live+dead alias — the class is the SOLE fallback for engines
|
|
250
|
+
without `:user-invalid`). The destructive/success tints reuse the
|
|
251
|
+
semantic tokens via `color-mix` per the house pattern (W2). Non-color
|
|
252
|
+
reinforcement is the error TEXT (W4.5 `error` slot) + the `required`
|
|
253
|
+
asterisk — the border/bg shift is the supplementary cue, never the sole
|
|
254
|
+
one. `:user-valid` is intentionally subtle (border only, no bg fill) so
|
|
255
|
+
a long valid form is not a wall of green. */
|
|
256
|
+
.input-pill:where(:user-invalid, .user-invalid-fallback) {
|
|
257
|
+
border-color: var(--destructive);
|
|
258
|
+
background: color-mix(in srgb, var(--destructive) 8%, var(--glass-bg-quiet));
|
|
259
|
+
}
|
|
260
|
+
.input-pill:where(:user-valid, .user-valid-fallback) {
|
|
261
|
+
border-color: var(--success);
|
|
262
|
+
}
|
|
263
|
+
/* Invalid + keyboard-focused → destructive ring (overrides the accent
|
|
264
|
+
`:focus-visible` ring above by order + the extra `:user-invalid`
|
|
265
|
+
compound). */
|
|
266
|
+
.input-pill:where(:user-invalid, .user-invalid-fallback):focus-visible {
|
|
267
|
+
border-color: var(--destructive);
|
|
268
|
+
box-shadow: 0 0 0 var(--focus-ring-width)
|
|
269
|
+
color-mix(in srgb, var(--destructive) 35%, transparent);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/* AQ.W4 §W4.3 — `field-sizing: content` autosize (opt-in via the Textarea
|
|
273
|
+
`autosize` prop → `[data-autosize]`). The textarea grows vertically with
|
|
274
|
+
content between a 3-line floor and a token-driven ceiling, then scrolls.
|
|
275
|
+
`field-sizing` Baseline Newly (Chromium 2024) — on a non-supporting
|
|
276
|
+
engine the declaration is ignored and the element keeps the
|
|
277
|
+
`min/max-block-size` bounds + standard scroll (no JS, no `@supports`,
|
|
278
|
+
no grid-mirror polyfill). The fixed-size path (default, `min-h-20`) is
|
|
279
|
+
the unchanged no-op fallback. */
|
|
280
|
+
.input-pill[data-autosize] {
|
|
281
|
+
field-sizing: content;
|
|
282
|
+
width: 100%;
|
|
283
|
+
min-block-size: 3lh;
|
|
284
|
+
max-block-size: var(--textarea-autosize-max, 12lh);
|
|
285
|
+
resize: vertical;
|
|
286
|
+
}
|
|
287
|
+
|
|
219
288
|
.input-pill:disabled {
|
|
220
289
|
opacity: 0.5;
|
|
221
290
|
cursor: not-allowed;
|
|
@@ -275,3 +344,17 @@
|
|
|
275
344
|
}
|
|
276
345
|
}
|
|
277
346
|
}
|
|
347
|
+
|
|
348
|
+
/* ── :has() focus-elevation fallback (AQ.W3 §W3.1a) ──────────────────────
|
|
349
|
+
SOLE fallback for engines without `:has()`. `.is-focus-within` is toggled
|
|
350
|
+
by a ≤6-LOC focusin/focusout guard in `Card.vue` that runs ONLY when
|
|
351
|
+
`!CSS.supports('selector(:has(*))')` (modern engines run zero JS). The
|
|
352
|
+
class redefines the SAME `--card-focus-*` rungs as the `:has()` rule, so the
|
|
353
|
+
override values have one source. NOT a live+dead alias — `:has()` is the
|
|
354
|
+
enhancement, this the documented degradation path. */
|
|
355
|
+
@supports not selector(:has(*)) {
|
|
356
|
+
.glass-card.is-focus-within {
|
|
357
|
+
--card-focus-shadow: var(--shadow-md);
|
|
358
|
+
--card-focus-border: var(--glass-border-floating);
|
|
359
|
+
}
|
|
360
|
+
}
|
package/src/styles/index.css
CHANGED
|
@@ -63,7 +63,14 @@
|
|
|
63
63
|
* pop, dialog-scale, dropdown, tab-fade).
|
|
64
64
|
* 10. animations.css — @keyframes for components consumed via
|
|
65
65
|
* `animation:` properties in (9) and component
|
|
66
|
-
* <style> blocks.
|
|
66
|
+
* <style> blocks. Includes the §TOP-LAYER
|
|
67
|
+
* `@starting-style` entry/exit grammar (AQ.W5).
|
|
68
|
+
* 10a. scroll-driven.css — native scroll-driven recipes (.scroll-progress
|
|
69
|
+
* + [data-scroll-reveal]); the `@supports`-gated
|
|
70
|
+
* primary over the JS-composable fallback (AQ.W5).
|
|
71
|
+
* 10b. view-transition.css — the `.gl-list-item` View-Transitions group
|
|
72
|
+
* recipe + `--vt-*` axes (AQ.W5; the
|
|
73
|
+
* `useViewTransition` substrate's CSS half).
|
|
67
74
|
* 11. utilities.css — focus-ring, btn-audacious + btn-interactive
|
|
68
75
|
* (press cluster; K W6 + Q.W3 Lane E),
|
|
69
76
|
* rainbow-vivid + rainbow-pastel. Consumes earlier
|
|
@@ -95,6 +102,8 @@
|
|
|
95
102
|
@import "./floating-panel.css";
|
|
96
103
|
@import "./transitions.css";
|
|
97
104
|
@import "./animations.css";
|
|
105
|
+
@import "./scroll-driven.css";
|
|
106
|
+
@import "./view-transition.css";
|
|
98
107
|
@import "./utilities.css";
|
|
99
108
|
@import "./instrument-chassis.css";
|
|
100
109
|
@import "./instrument-rail.css";
|
|
@@ -292,7 +292,34 @@
|
|
|
292
292
|
@media (max-width: 720px) {
|
|
293
293
|
.instrument-chassis .instrument-dial {
|
|
294
294
|
grid-template-columns: 1fr;
|
|
295
|
-
|
|
295
|
+
/* R0G-2 (AO.W3) — reserve the dial's FINAL box from frame 0. The
|
|
296
|
+
desktop axis is already CLS-clean (the 3-column `align-items:
|
|
297
|
+
center` grid reserves row height from intrinsic min + the AP-Pγ
|
|
298
|
+
transform-only idle recentre). The mobile reflow previously
|
|
299
|
+
collapsed to `grid-template-rows: auto auto auto`, which reserves
|
|
300
|
+
NO height — the meter row, divider, and readout column sit at
|
|
301
|
+
zero height until the consumer's meter <canvas> + readout
|
|
302
|
+
numbers hydrate, then grow collapsed → final and push everything
|
|
303
|
+
below down ~326-331px → mobile-390 CLS 0.32-0.38.
|
|
304
|
+
|
|
305
|
+
The fix pins the dial box from frame 0: the meter row carries the
|
|
306
|
+
dominant reserve (`minmax(0, 1fr)` — it expands to fill the
|
|
307
|
+
envelope the `min-height` establishes), divider + readout stay
|
|
308
|
+
intrinsic (`auto`). The load-bearing reserve is `min-height` —
|
|
309
|
+
it fixes the dial's outer box so the rows distribute WITHIN a
|
|
310
|
+
reserved envelope rather than growing it post-hydration.
|
|
311
|
+
|
|
312
|
+
Both knobs are CSS custom properties (token-first). The
|
|
313
|
+
`--instrument-dial-min-height-mobile` canonical rung lands in
|
|
314
|
+
tokens.css at AO.W4; until then the inline `24rem` fallback IS
|
|
315
|
+
the default and carries the contract. A consumer whose meter is
|
|
316
|
+
a different size retunes the token — a tuning knob, not a
|
|
317
|
+
workaround for a missing reserve. */
|
|
318
|
+
grid-template-rows:
|
|
319
|
+
var(--instrument-dial-meter-reserve-mobile, minmax(0, 1fr))
|
|
320
|
+
auto
|
|
321
|
+
auto;
|
|
322
|
+
min-height: var(--instrument-dial-min-height-mobile, 24rem);
|
|
296
323
|
gap: var(--instrument-dial-gap-mobile, 1.5rem);
|
|
297
324
|
}
|
|
298
325
|
|