@mkbabb/glass-ui 3.8.0 → 3.10.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/{MetricBadge-lTc002u2.js → MetricBadge-BZVWIxNy.js} +6 -4
- package/dist/{Notification-BxK8LZMw.js → Notification-DLMhblXR.js} +2 -2
- 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/{Switch-LDKLmmgx.js → Switch-Ch-k3Rv-.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 +2 -1
- package/dist/api.js +1 -1
- package/dist/aurora.js +236 -545
- package/dist/{badge-DHQrc_GQ.js → badge-CaoFJzRb.js} +5 -5
- 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-BOXjLUxu.js} +24 -24
- package/dist/components/custom/aurora/composables/atoms.d.ts +21 -4
- package/dist/components/custom/aurora/composables/runtime.d.ts +0 -9
- package/dist/components/custom/aurora/composables/uniformBridge.d.ts +0 -11
- package/dist/components/custom/aurora/constants/renderMode.d.ts +0 -32
- package/dist/components/custom/aurora/constants/shaders/brush.glsl.d.ts +1 -1
- package/dist/components/custom/aurora/constants/shaders/mediums.glsl.d.ts +2 -2
- package/dist/components/custom/aurora/constants/shaders/tonemap.glsl.d.ts +1 -1
- package/dist/components/custom/aurora/index.d.ts +1 -1
- package/dist/components/custom/configurator/ConfiguratorLayer.vue.d.ts +1 -1
- package/dist/components/custom/constellation/Constellation.vue.d.ts +73 -1
- package/dist/components/custom/constellation/constellationField.d.ts +255 -3
- package/dist/components/custom/constellation/index.d.ts +2 -2
- package/dist/components/custom/dock/DockSeparator.vue.d.ts +3 -0
- package/dist/components/custom/dock/DockTabButton.vue.d.ts +4 -3
- 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/expandable-container/ExpandableContainer.vue.d.ts +29 -0
- package/dist/components/custom/fourier-field/FourierField.vue.d.ts +6 -0
- package/dist/components/custom/fourier-field/index.d.ts +25 -1
- package/dist/components/custom/fourier-field/math.d.ts +3 -8
- package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +8 -10
- package/dist/components/custom/goo-blob/composables/useBlobMood.d.ts +19 -5
- package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +6 -14
- package/dist/components/custom/goo-blob/index.d.ts +1 -1
- package/dist/components/custom/goo-blob/types.d.ts +59 -25
- package/dist/components/custom/handmark/HandMark.vue.d.ts +29 -0
- package/dist/components/custom/handmark/brush.d.ts +219 -0
- package/dist/components/custom/handmark/freehand.d.ts +69 -0
- package/dist/components/custom/handmark/geometry.d.ts +32 -0
- package/dist/components/custom/handmark/index.d.ts +21 -0
- package/dist/components/custom/handmark/ink.d.ts +11 -0
- package/dist/components/custom/handmark/texture.d.ts +39 -0
- package/dist/components/custom/handmark/types.d.ts +53 -0
- package/dist/components/custom/handmark/useHandMark.d.ts +66 -0
- package/dist/components/custom/metric-badge/MetricBadge.vue.d.ts +8 -0
- package/dist/components/custom/tabs/SegmentedTabs.vue.d.ts +92 -0
- package/dist/components/custom/tabs/composables/useTabIndicator.d.ts +49 -0
- package/dist/components/custom/tabs/index.d.ts +2 -5
- package/dist/components/ui/button/index.d.ts +1 -1
- package/dist/components/ui/card/Card.vue.d.ts +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 +22 -11
- package/dist/components/ui/tabs/TabsList.vue.d.ts +1 -1
- package/dist/composables/color/index.d.ts +12 -7
- package/dist/composables/context/createContext.d.ts +1 -1
- package/dist/composables/glass/webgl/shaders/procedural-color.glsl.d.ts +1 -6
- package/dist/composables/motion/core/index.d.ts +1 -0
- package/dist/composables/motion/useRouteTransition.d.ts +42 -0
- package/dist/configurator.js +1 -1
- package/dist/confirm-dialog.js +1 -1
- package/dist/constellation.js +212 -72
- 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 +257 -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 +61 -38
- package/dist/forms.js +5 -5
- package/dist/fourier-field.js +89 -97
- package/dist/fourier-math.d.ts +1 -0
- package/dist/fourier-math.js +2 -0
- package/dist/glass-panel.js +1 -1
- package/dist/glass-ui.css +1 -1
- package/dist/glass-ui.js +107 -109
- package/dist/goo-blob.js +316 -297
- package/dist/handmark.d.ts +1 -0
- package/dist/handmark.js +609 -0
- package/dist/hover-popover.js +1 -1
- package/dist/icon-tooltip.js +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/keyboard.js +1 -1
- package/dist/labeled-field.js +5 -5
- package/dist/math-DTpRVC0e.js +27 -0
- package/dist/{menuItemVariants-DKM85SNE.js → menuItemVariants-CCoBNkU5.js} +1 -1
- package/dist/metric-badge.js +1 -1
- package/dist/metric-stack.js +1 -1
- package/dist/motion-core.js +70 -69
- package/dist/motion.js +2 -2
- package/dist/notification.js +1 -1
- 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-CyzcxBoh.js} +6 -6
- 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 +80 -20
- package/dist/styles/cards.css +2 -2
- package/dist/styles/components.css +1 -1
- package/dist/styles/dock/density.css +230 -0
- package/dist/styles/dock/layer-group.css +275 -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 +205 -55
- package/dist/styles/dock.css +42 -1349
- package/dist/styles/drawer.css +12 -4
- package/dist/styles/glass.css +535 -78
- package/dist/styles/index.css +12 -11
- package/dist/styles/paper.css +68 -2
- package/dist/styles/theme.css +58 -0
- package/dist/styles/tokens.css +601 -69
- package/dist/styles/transitions.css +20 -2
- package/dist/styles/utilities.css +218 -78
- package/dist/styles/view-transition.css +51 -0
- package/dist/switch.js +1 -1
- 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-Bcpy5Etf.js} +1 -1
- package/dist/{useConfiguratorState-CMff4GzH.js → useConfiguratorState-DxAqksK6.js} +21 -10
- package/dist/{useGlassRenderer-5I0YkI4t.js → useGlassRenderer-D7YGOYiM.js} +1 -1
- package/dist/useViewTransition-DaN5Zrox.js +21 -0
- package/dist/vReveal-zUIQk-rJ.js +53 -0
- package/dist/watercolor-dot.js +1 -1
- package/package.json +80 -39
- package/src/styles/animations.css +80 -20
- package/src/styles/cards.css +2 -2
- package/src/styles/dock/density.css +230 -0
- package/src/styles/dock/layer-group.css +275 -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 +205 -55
- package/src/styles/dock.css +42 -1349
- package/src/styles/drawer.css +12 -4
- package/src/styles/glass.css +535 -78
- package/src/styles/index.css +12 -11
- package/src/styles/paper.css +68 -2
- package/src/styles/theme.css +58 -0
- package/src/styles/tokens.css +601 -69
- package/src/styles/transitions.css +20 -2
- package/src/styles/utilities.css +218 -78
- package/src/styles/view-transition.css +51 -0
- 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/composables/gpuRuntime.d.ts +0 -16
- package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +0 -7
- 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/composables/glass/createGPUCanvas.d.ts +0 -40
- 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/dist/vReveal-CqaCz_mC.js +0 -44
- 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-Cus0fvK0.js} +0 -0
- /package/dist/{Input-DVG_J0ne.js → Input-xuDwALQR.js} +0 -0
- /package/dist/{ScrollingText-CVyqxvfv.js → ScrollingText-BPP84wKo.js} +0 -0
- /package/dist/{color-DMLTunJK.js → color-C5ls_QF7.js} +0 -0
- /package/dist/{constants-BPOqYJAm.js → constants-yKeKnE84.js} +0 -0
- /package/dist/{presets-D1XPuTj-.js → presets-Dkdv55Gt.js} +0 -0
- /package/dist/{prng-COGhh02-.js → prng-D27-B3tK.js} +0 -0
- /package/dist/{useGlobalDark-D3EBWzXK.js → useGlobalDark-d6waty-X.js} +0 -0
- /package/dist/{useIntersectionPause-Bj4sPkMh.js → useIntersectionPause-Cck5Uxk8.js} +0 -0
- /package/dist/{useInterval-CcLfq2WU.js → useInterval-Dsmqwi03.js} +0 -0
- /package/dist/{useKeyboardShortcuts-BXWXOZ-9.js → useKeyboardShortcuts-CyIYrndH.js} +0 -0
- /package/dist/{useScrollProgress-C9ysDic5.js → useScrollProgress-CffFGLa5.js} +0 -0
- /package/dist/{useSortable-MGAbCGVJ.js → useSortable-C8ReQ50P.js} +0 -0
- /package/dist/{useTextHighlight-9nMW23Qb.js → useTextHighlight-CWEi25hf.js} +0 -0
|
@@ -184,10 +184,28 @@
|
|
|
184
184
|
* surface). The grammar is single-event entrance + dwell + exit;
|
|
185
185
|
* the next toast (if any) enters on its own contract.
|
|
186
186
|
*
|
|
187
|
+
* §6 EASING-DOCTRINE EXEMPTION (AY.W-MOTION — DELIBERATE KEEP).
|
|
188
|
+
* Every glass-ui-OWNED entrance surface (`dialog-scale`, `pop`,
|
|
189
|
+
* `dropdown`, `fade-slide`, `dock-in`) rides the house `--spring-*`
|
|
190
|
+
* enter / `--ease-out`/`--ease-standard` exit vocabulary (the §6
|
|
191
|
+
* doctrine, tokens.css:162-190). The Toast does NOT — and that is
|
|
192
|
+
* BY DESIGN, not an unexamined default. The reka-ui `ToastRoot`
|
|
193
|
+
* primitive OWNS its data-state choreography: the entrance slide
|
|
194
|
+
* direction tracks the viewport origin AND the swipe-end gesture
|
|
195
|
+
* (`data-[swipe=end]:slide-out-to-right-full`), so the entrance/exit
|
|
196
|
+
* are coupled to reka's `tw-animate-css` data-state machinery. The §6
|
|
197
|
+
* spring vocabulary governs glass-ui-OWNED surfaces; the reka-Toast
|
|
198
|
+
* entrance is not one — re-authoring it onto a `<Transition>` would
|
|
199
|
+
* fork the primitive's swipe-coupled contract (and `tw-animate-css`
|
|
200
|
+
* is the shipped optionalPeer this contract depends on). The gate
|
|
201
|
+
* (proof:animation-coherence) carries the Toast surface in its
|
|
202
|
+
* REGISTER_ASSIGNMENT_ALLOW set so this keep reads as a gated,
|
|
203
|
+
* deliberate exemption.
|
|
204
|
+
*
|
|
187
205
|
* PRM is honoured at the `@media (prefers-reduced-motion: reduce)`
|
|
188
206
|
* block below — the slide motion retires; the fade-in/out
|
|
189
|
-
* remains. No source change
|
|
190
|
-
* documentation closure for the
|
|
207
|
+
* remains. No source motion change; this comment block IS the
|
|
208
|
+
* documentation closure for the toast contract row.
|
|
191
209
|
*/
|
|
192
210
|
|
|
193
211
|
/* ── Reduced motion: preserve fades, remove transform/scale motion ── */
|
|
@@ -143,6 +143,20 @@
|
|
|
143
143
|
box-shadow: var(--focus-ring-shadow);
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
+
/* D6.b — `focus-ring-gold`: the opt-in gilded focus ring. Overrides ONLY
|
|
147
|
+
`--focus-ring-color` (tokens.css) → the shared `--focus-ring-shadow`
|
|
148
|
+
re-resolves to gold for THIS element; the default ring elsewhere is
|
|
149
|
+
unchanged. Gold-as-state is the "you are here / this is live" mark — a
|
|
150
|
+
transient highlight (appears on focus-visible, gone on blur), so gold is
|
|
151
|
+
lawful here where a permanent gold furniture would not be. Mirror of the
|
|
152
|
+
`focus-ring` custom-property pattern: a consumer composes
|
|
153
|
+
`class="focus-ring focus-ring-gold"` to gild the ring on the active rung;
|
|
154
|
+
the resting mark keeps its structural color (the four-voice law: red is
|
|
155
|
+
identity, gold is distinction). */
|
|
156
|
+
.focus-ring-gold {
|
|
157
|
+
--focus-ring-color: var(--gold);
|
|
158
|
+
}
|
|
159
|
+
|
|
146
160
|
/* ── Hairline-accent — 0.5px catch-light + under-shadow pair ──
|
|
147
161
|
Composes the canonical `--border-hairline` token (tokens.css §
|
|
148
162
|
Glass-decorative). Adopt at any surface that wants the canonical
|
|
@@ -191,14 +205,32 @@
|
|
|
191
205
|
AL-W10 SLIM (X6 §M-1 + Y7 §3 + DESIGN.md §L3). I compose this
|
|
192
206
|
class onto every interactive surface that wants the iOS tap-
|
|
193
207
|
squish idiom; the press scales to `--scale-press` (0.96, the
|
|
194
|
-
canonical iOS `.regular` control rung)
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
208
|
+
canonical iOS `.regular` control rung). I keep this as a single
|
|
209
|
+
canonical rung — NOT a 3-rung ladder. The one outlier I leave
|
|
210
|
+
alone is the button `0.97` (`--scale-press-btn`), which consumes
|
|
211
|
+
its own slightly-softer token directly. The dock control now
|
|
212
|
+
tracks the canonical `--scale-press` (0.96) too (AT.W7-dock-b
|
|
213
|
+
press canon — the prior deeper `0.92` was retired to ONE source).
|
|
214
|
+
|
|
215
|
+
AX.W52 §6 doctrine — the `scale` register is reconciled onto
|
|
216
|
+
`--spring-smooth` (was `--spring-snappy`), the ONE button/interactive
|
|
217
|
+
scale register the §6 easing doctrine records and the gate asserts
|
|
218
|
+
across `.btn-pill`/`.tap-squish`/`.glass-btn`/`btn-interactive`. At
|
|
219
|
+
ζ=0.86 `--spring-smooth` settles a press crisply with a sub-perceptual
|
|
220
|
+
(~0.5%) peak — no visible bounce — so press still reads alive while
|
|
221
|
+
hover reads as a smooth glide on the SAME spring.
|
|
222
|
+
|
|
223
|
+
The transition lists the SURFACE legs (bg/border/box-shadow/color/
|
|
224
|
+
opacity) on the bezier `--ease-standard` alongside the spring `scale`
|
|
225
|
+
leg — the SAME coherent set `.btn-pill` carries. This is load-bearing:
|
|
226
|
+
`.tap-squish` and `.btn-pill` are co-composed on the button base and
|
|
227
|
+
this `transition` shorthand would otherwise CLOBBER `.btn-pill`'s
|
|
228
|
+
surface legs down to a scale-only animation (the cascade bug that left
|
|
229
|
+
every button transitioning ONLY `scale` — the live-readback RED). With
|
|
230
|
+
both classes carrying the full set, whichever wins the surface cross-
|
|
231
|
+
fade survives. On a non-button press surface the extra legs are inert
|
|
232
|
+
unless that prop changes, in which case a smooth cross-fade is the
|
|
233
|
+
desired interactive read anyway.
|
|
202
234
|
|
|
203
235
|
Under PRM I retire the press transform entirely and lean on the
|
|
204
236
|
consumer's own hover/active bg-tint cascade to acknowledge the
|
|
@@ -206,7 +238,13 @@
|
|
|
206
238
|
.tap-squish {
|
|
207
239
|
/* AQ.W3 §W3.2 identity base */
|
|
208
240
|
scale: 1;
|
|
209
|
-
transition:
|
|
241
|
+
transition:
|
|
242
|
+
background-color var(--duration-fast) var(--ease-standard),
|
|
243
|
+
border-color var(--duration-fast) var(--ease-standard),
|
|
244
|
+
box-shadow var(--duration-fast) var(--ease-standard),
|
|
245
|
+
color var(--duration-fast) var(--ease-standard),
|
|
246
|
+
opacity var(--duration-fast) var(--ease-standard),
|
|
247
|
+
scale var(--duration-fast) var(--spring-smooth);
|
|
210
248
|
transform-origin: center center;
|
|
211
249
|
}
|
|
212
250
|
.tap-squish:active {
|
|
@@ -342,6 +380,30 @@
|
|
|
342
380
|
}
|
|
343
381
|
}
|
|
344
382
|
|
|
383
|
+
/* D6.b — `.text-gilt`: the brand-polish ONE-SHOT shimmer. Same gold-clip
|
|
384
|
+
gradient pass as `.gold-shimmer`, but the gold passes ONCE then SETS — a
|
|
385
|
+
seal being pressed, not a marquee looping forever. This is the lawful home
|
|
386
|
+
for the chassis "Complete!" celebration the disco-star used to carry: the
|
|
387
|
+
gold sweeps once over the completion label on resolve, then holds the
|
|
388
|
+
static gold gradient.
|
|
389
|
+
|
|
390
|
+
`animation-iteration-count: 1` + `animation-fill-mode: forwards` so the
|
|
391
|
+
slide runs exactly one pass and the final keyframe (background-position
|
|
392
|
+
-200%) sticks — no per-frame repaint after settle. PRM users get the
|
|
393
|
+
static gradient, no pass (the gold is still present, just unanimated). */
|
|
394
|
+
.text-gilt {
|
|
395
|
+
background: linear-gradient(90deg, var(--color-gold-dark), var(--color-gold-light), var(--color-gold), var(--color-gold-light), var(--color-gold-dark));
|
|
396
|
+
background-size: 250% 100%;
|
|
397
|
+
background-clip: text;
|
|
398
|
+
-webkit-background-clip: text;
|
|
399
|
+
color: transparent;
|
|
400
|
+
}
|
|
401
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
402
|
+
.text-gilt {
|
|
403
|
+
animation: gold-shimmer-slide var(--duration-shimmer) var(--ease-out-expo) 1 forwards;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
345
407
|
/* ── Keyboard key ── */
|
|
346
408
|
.kbd {
|
|
347
409
|
display: inline-flex;
|
|
@@ -546,6 +608,56 @@
|
|
|
546
608
|
letter-spacing: 0.1em;
|
|
547
609
|
}
|
|
548
610
|
|
|
611
|
+
/* D6.b — `MetricBadge variant="record"`: the gilded record/peak value.
|
|
612
|
+
The highest-leverage gold moment on a DATA atlas — a tiny gilt pill on the
|
|
613
|
+
single record / peak / featured figure (the all-time-high, the top
|
|
614
|
+
district). Gold marks the SUPERLATIVE, exactly one per view: a gilt pill on
|
|
615
|
+
a single figure reads as a medal — civic and earned, not decorative.
|
|
616
|
+
|
|
617
|
+
The recipe composes ON the base `.metric-badge` glass plate (it is a
|
|
618
|
+
MODIFIER, never a replacement): a 1px `--gold-rim` tooled edge + `--gold-ink`
|
|
619
|
+
text + a FAINT gold wash (≤8% alpha — never an opaque gold fill, which would
|
|
620
|
+
read as a fourth DATA category and break one-color-one-meaning). The wash
|
|
621
|
+
sits over the badge's own `--glass-bg-quiet` plate via `color-mix`, so the
|
|
622
|
+
cream glass still reads through; the gold is the leaf, not the area.
|
|
623
|
+
|
|
624
|
+
`--gold-ink` clears cream-law ② (APCA |Lc| ≥ 45) on `--card` in both arms
|
|
625
|
+
(proof:gold-ink-contrast), and the faint wash only lightens the plate it
|
|
626
|
+
sits on, so the ink stays legible. */
|
|
627
|
+
.metric-badge--record {
|
|
628
|
+
border-color: var(--gold-rim);
|
|
629
|
+
background:
|
|
630
|
+
linear-gradient(
|
|
631
|
+
0deg,
|
|
632
|
+
color-mix(in oklab, var(--gold) 8%, transparent),
|
|
633
|
+
color-mix(in oklab, var(--gold) 8%, transparent)
|
|
634
|
+
),
|
|
635
|
+
var(--metric-badge-bg, var(--glass-bg-quiet));
|
|
636
|
+
box-shadow:
|
|
637
|
+
inset 0 0 0 1px var(--gold-rim),
|
|
638
|
+
inset 0 0.5px 0 0
|
|
639
|
+
color-mix(in oklab, var(--gold-light) 30%, transparent),
|
|
640
|
+
0 1px 6px color-mix(in srgb, var(--shadow-color) 8%, transparent);
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
/* The record value reads in legible gold ink (the medal numeral). Scoped to
|
|
644
|
+
the amount slot so the unit/label keep their muted register — the gold is
|
|
645
|
+
on the figure, not the furniture. */
|
|
646
|
+
.metric-badge--record .metric-badge__amount {
|
|
647
|
+
color: var(--gold-ink);
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
.metric-badge--record:hover {
|
|
651
|
+
/* Hover deepens the rim to full `--gold` and lifts the wash one rung —
|
|
652
|
+
the gilt edge catches a touch more light, never a fill. */
|
|
653
|
+
border-color: var(--gold);
|
|
654
|
+
box-shadow:
|
|
655
|
+
inset 0 0 0 1px var(--gold),
|
|
656
|
+
inset 0 0.5px 0 0
|
|
657
|
+
color-mix(in oklab, var(--gold-light) 40%, transparent),
|
|
658
|
+
0 2px 10px color-mix(in srgb, var(--shadow-color) 12%, transparent);
|
|
659
|
+
}
|
|
660
|
+
|
|
549
661
|
/* Q.W3 Lane A — the `.glass-dock[data-density="…"]` density rungs that
|
|
550
662
|
set `--dock-tab-h` + `--dock-label-size` were consolidated into
|
|
551
663
|
`dock.css` (their canonical dock-styles home). They formerly lived
|
|
@@ -683,9 +795,12 @@
|
|
|
683
795
|
`--duration-fast` + `--ease-standard` tokens. */
|
|
684
796
|
@utility scale-on-hover {
|
|
685
797
|
/* Individual-transform identity base (AQ.W3 §W3.2). Transition the `scale`
|
|
686
|
-
longhand (not `transform`) so the migrated hover scale animates.
|
|
798
|
+
longhand (not `transform`) so the migrated hover scale animates.
|
|
799
|
+
AX.W52 §6 doctrine — the `scale` transform leg rides `--spring-smooth`
|
|
800
|
+
(the settle register), NOT the bezier `--ease-standard` (a transform on a
|
|
801
|
+
bezier reads mechanical; springs read alive on transform). */
|
|
687
802
|
scale: 1;
|
|
688
|
-
transition: scale var(--duration-fast) var(--
|
|
803
|
+
transition: scale var(--duration-fast) var(--spring-smooth);
|
|
689
804
|
|
|
690
805
|
&:hover {
|
|
691
806
|
scale: var(--scale-hover);
|
|
@@ -824,28 +939,17 @@
|
|
|
824
939
|
--ripple-radius: var(--ripple-radius-max, 12rem);
|
|
825
940
|
}
|
|
826
941
|
|
|
827
|
-
/*
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
pointer-events: none;
|
|
839
|
-
opacity: 0;
|
|
840
|
-
will-change: transform, opacity;
|
|
841
|
-
z-index: 1;
|
|
842
|
-
}
|
|
843
|
-
|
|
844
|
-
@media (prefers-reduced-motion: no-preference) {
|
|
845
|
-
&:hover::after {
|
|
846
|
-
animation: sparkle-sweep var(--duration-sparkle) var(--ease-out-expo);
|
|
847
|
-
}
|
|
848
|
-
}
|
|
942
|
+
/* D6.b — the disco-star EXCISED. The `::after { content:"✦" }` glyph and
|
|
943
|
+
its `&:hover::after { animation: sparkle-sweep … }` trigger are gone (the
|
|
944
|
+
user's named removal: "remove the disco star from all glass-ui elements").
|
|
945
|
+
A primary action now announces itself by SETTLING into a richer surface,
|
|
946
|
+
not by emitting a sparkle: the whole hover affirmation rides the existing
|
|
947
|
+
`&:hover` specular catch-light box-shadow (`--glass-specular`, above) —
|
|
948
|
+
honest physics, not casino-skeuomorphism. Gold CTAs add the
|
|
949
|
+
`btn-gold-bg-sweep` metal-catch (a metal catching light is honest; a star
|
|
950
|
+
is not). One garish gesture out, zero garish gestures in. The
|
|
951
|
+
`sparkle-sweep` keyframe is TOMBSTONED in animations.css (empty body,
|
|
952
|
+
full delete in 3.11); `--duration-sparkle` is `@deprecated` in tokens.css. */
|
|
849
953
|
|
|
850
954
|
/* PRM bracket — the press-ripple retires; the press still reads
|
|
851
955
|
via the audacious recipe's transform/scale beat (the ripple is
|
|
@@ -873,14 +977,14 @@
|
|
|
873
977
|
token triad (tokens.css §13).
|
|
874
978
|
|
|
875
979
|
Design register:
|
|
876
|
-
• PRM no-preference:
|
|
877
|
-
|
|
980
|
+
• PRM no-preference: the gold sweep IS the gold-CTA affirmation — a metal
|
|
981
|
+
catching light is honest physics (the disco-star is gone, D6.b).
|
|
878
982
|
• PRM reduce: static gold tint shows on hover; no animation.
|
|
879
983
|
• The gold shimmer is a background-image layer ABOVE the existing
|
|
880
984
|
btn-audacious paper-grain + primary-radial layers, blended with
|
|
881
985
|
`overlay` so the glass substrate reads through at partial opacity.
|
|
882
|
-
• The `::before` ripple
|
|
883
|
-
|
|
986
|
+
• The `::before` ripple from btn-audacious is unchanged; the `::after`
|
|
987
|
+
sparkle is EXCISED (D6.b) — this modifier only retunes the hover layers.
|
|
884
988
|
• Consumer applies: `<Button variant="gold-audacious">Next →</Button>` */
|
|
885
989
|
@utility btn-audacious-gold {
|
|
886
990
|
/* At rest: a faint warm gold tint over the glass surface reads as "warm
|
|
@@ -893,27 +997,40 @@
|
|
|
893
997
|
color-mix(in srgb, var(--color-gold) 8%, transparent)
|
|
894
998
|
);
|
|
895
999
|
|
|
896
|
-
/* Hover:
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
1000
|
+
/* Hover: deepen the plate to a SATURATED gold the white label clears (AW.W13
|
|
1001
|
+
names a "saturated gold backplate"; the D1 fix). The bottom layer is the
|
|
1002
|
+
OPAQUE fixed deep gold (`--color-gold-deep`, mode-INVARIANT) — a solid plate
|
|
1003
|
+
at ~6.5:1 (light) / ~5.5:1 (dark) against white, well below the ~0.18
|
|
1004
|
+
luminance floor white text needs for ≥4.5:1 (was a translucent 22-30% wash
|
|
1005
|
+
over near-cream glass → 1.29:1 white-on-pale-gold). The plate is FIXED-dark
|
|
1006
|
+
in both modes — deepening toward the mode-flipping `--foreground` brightened
|
|
1007
|
+
the dark plate to a cream-gold; `--color-gold-deep` does not flip. The
|
|
1008
|
+
shimmer sweep rides ABOVE as a LOW-alpha gold gradient (normal blend, ≤18% —
|
|
1009
|
+
it textures the plate without brightening it past the floor), and the
|
|
1010
|
+
paper-grain overlays for the disco facet. */
|
|
900
1011
|
&:hover:not(:disabled) {
|
|
901
1012
|
background-image:
|
|
902
1013
|
var(--paper-clean-texture),
|
|
903
1014
|
linear-gradient(
|
|
904
1015
|
90deg,
|
|
905
1016
|
transparent 0%,
|
|
906
|
-
color-mix(in srgb, var(--color-gold
|
|
907
|
-
color-mix(in srgb, var(--color-gold
|
|
908
|
-
color-mix(in srgb, var(--color-gold
|
|
1017
|
+
color-mix(in srgb, var(--color-gold) 14%, transparent) 25%,
|
|
1018
|
+
color-mix(in srgb, var(--color-gold) 18%, transparent) 50%,
|
|
1019
|
+
color-mix(in srgb, var(--color-gold) 14%, transparent) 75%,
|
|
909
1020
|
transparent 100%
|
|
1021
|
+
),
|
|
1022
|
+
linear-gradient(
|
|
1023
|
+
135deg,
|
|
1024
|
+
var(--color-gold-deep),
|
|
1025
|
+
color-mix(in srgb, var(--color-gold-deep), var(--color-gold-dark) 18%) 50%,
|
|
1026
|
+
var(--color-gold-deep)
|
|
910
1027
|
);
|
|
911
|
-
background-blend-mode: overlay, normal;
|
|
912
|
-
background-size: var(--paper-texture-size), 250% 100%;
|
|
913
|
-
background-position: 0 0, 100% 0;
|
|
1028
|
+
background-blend-mode: overlay, normal, normal;
|
|
1029
|
+
background-size: var(--paper-texture-size), 250% 100%, 100% 100%;
|
|
1030
|
+
background-position: 0 0, 100% 0, 0 0;
|
|
914
1031
|
box-shadow:
|
|
915
1032
|
var(--glass-specular),
|
|
916
|
-
0 0 0 1px color-mix(in srgb, var(--color-gold)
|
|
1033
|
+
0 0 0 1px color-mix(in srgb, var(--color-gold-dark) 40%, transparent),
|
|
917
1034
|
0 0.5px 0 0 rgb(0 0 0 / 0.06);
|
|
918
1035
|
}
|
|
919
1036
|
|
|
@@ -929,8 +1046,8 @@
|
|
|
929
1046
|
a text-clip gradient). This variant sweeps the `background-position` of the
|
|
930
1047
|
250% wide gradient across the button's bounding box. */
|
|
931
1048
|
@keyframes btn-gold-bg-sweep {
|
|
932
|
-
0% { background-position: 0 0, 100% 0; }
|
|
933
|
-
100% { background-position: 0 0, -100% 0; }
|
|
1049
|
+
0% { background-position: 0 0, 100% 0, 0 0; }
|
|
1050
|
+
100% { background-position: 0 0, -100% 0, 0 0; }
|
|
934
1051
|
}
|
|
935
1052
|
|
|
936
1053
|
/* ── Table density utilities — AN.R0 ─────────────────────────────────────
|
|
@@ -1005,22 +1122,28 @@
|
|
|
1005
1122
|
|
|
1006
1123
|
/* ── Interactive-button four-state recipe ────────────────────────────────
|
|
1007
1124
|
`.btn-interactive` carries the canonical "Button-with-spring-hover"
|
|
1008
|
-
four-state contract — transition + hover-scale
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1125
|
+
four-state contract — transition + hover-scale + active-press + disabled-
|
|
1126
|
+
opacity + focus-ring fade-in. The Button primitive's variants emit the four
|
|
1127
|
+
states except `hover:scale-*`; this is the canonical opt-in that adds the
|
|
1128
|
+
spring-hover lift. Consumed by keyframes.js at 7 sites.
|
|
1129
|
+
|
|
1130
|
+
AX.W52 §6 — the hover lift is the restrained `--scale-hover-btn` (1.05, NOT
|
|
1131
|
+
the emphatic 1.08 `--scale-hover`) routed through `--spring-smooth` — the ONE
|
|
1132
|
+
button scale register the §6 doctrine records and the gate asserts across
|
|
1133
|
+
`.btn-pill`/`.tap-squish`/`.glass-btn`/`btn-interactive`. The surface legs
|
|
1134
|
+
stay on the bezier `--ease-standard` (a colour cross-fade reads as a wobble
|
|
1135
|
+
on a spring); only the `scale` transform leg springs. */
|
|
1013
1136
|
@utility btn-interactive {
|
|
1014
1137
|
/* AQ.W3 §W3.2 identity base */
|
|
1015
1138
|
scale: 1;
|
|
1016
1139
|
transition:
|
|
1017
1140
|
background-color var(--duration-fast) var(--ease-standard),
|
|
1018
1141
|
color var(--duration-fast) var(--ease-standard),
|
|
1019
|
-
scale var(--duration-fast) var(--
|
|
1142
|
+
scale var(--duration-fast) var(--spring-smooth),
|
|
1020
1143
|
opacity var(--duration-fast) var(--ease-standard);
|
|
1021
1144
|
|
|
1022
1145
|
&:hover {
|
|
1023
|
-
scale: var(--scale-hover);
|
|
1146
|
+
scale: var(--scale-hover-btn);
|
|
1024
1147
|
}
|
|
1025
1148
|
|
|
1026
1149
|
&:active {
|
|
@@ -1036,11 +1159,11 @@
|
|
|
1036
1159
|
box-shadow: var(--focus-ring-shadow);
|
|
1037
1160
|
outline: none;
|
|
1038
1161
|
/* Fade in; base state has no box-shadow transition → instant
|
|
1039
|
-
removal */
|
|
1162
|
+
removal. The `scale` leg keeps the `--spring-smooth` register. */
|
|
1040
1163
|
transition:
|
|
1041
1164
|
background-color var(--duration-fast) var(--ease-standard),
|
|
1042
1165
|
color var(--duration-fast) var(--ease-standard),
|
|
1043
|
-
scale var(--duration-fast) var(--
|
|
1166
|
+
scale var(--duration-fast) var(--spring-smooth),
|
|
1044
1167
|
opacity var(--duration-fast) var(--ease-standard),
|
|
1045
1168
|
box-shadow var(--duration-fast) var(--ease-standard);
|
|
1046
1169
|
}
|
|
@@ -1068,36 +1191,52 @@ html.no-transition *::after {
|
|
|
1068
1191
|
transition-duration: 0s !important;
|
|
1069
1192
|
}
|
|
1070
1193
|
|
|
1071
|
-
/* ── Forced-colors
|
|
1194
|
+
/* ── Forced-colors focus + silhouette rung (AQ.W2 §5 · generalized AX.W36) ────
|
|
1072
1195
|
Windows High Contrast / forced-colors mode STRIPS `box-shadow` — so the
|
|
1073
1196
|
glass focus rings (box-shadow + `outline: none`) vanish, leaving keyboard
|
|
1074
|
-
users with no visible focus
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1197
|
+
users with no visible focus. Restore a real `outline` keyed to the system
|
|
1198
|
+
`Highlight` color (outline survives forced-colors; box-shadow does not). The
|
|
1199
|
+
box-shadow ring stays the primary in normal mode (it carries the glass
|
|
1200
|
+
aesthetic) — these two are mutually exclusive by media query, NOT a parallel
|
|
1201
|
+
path.
|
|
1202
|
+
|
|
1203
|
+
AX.W36 — the focus-survival selector set is GENERALIZED to the broader
|
|
1204
|
+
interactive surface: the dock CONTROLS (`.dock-icon-button` / `.dock-tab-button`
|
|
1205
|
+
/ `.dock-select-trigger` / `.dock-dropdown-trigger`) + the pill button base
|
|
1206
|
+
(`.btn-pill`) all carry a box-shadow focus ring (dock.css / utilities.css) that
|
|
1207
|
+
vanishes under WHC just like the original five. This is the SAME `Highlight`
|
|
1208
|
+
outline rung extended to cover them — ONE block, ONE path (the glass-language
|
|
1209
|
+
structure-survival skin for the tier panes / StatusDot / floating surfaces lives
|
|
1210
|
+
co-located with the ladder it skins, in glass.css).
|
|
1211
|
+
|
|
1212
|
+
`forced-color-adjust: none` is deliberately NOT used — glass-ui's glassmorphic
|
|
1213
|
+
chrome is decorative and yields to the user's forced palette (css forced-colors
|
|
1214
|
+
guidance). Baseline Widely Available; this IS the fallback mechanism (it only
|
|
1215
|
+
activates under forced-colors), so no nested guard. */
|
|
1085
1216
|
@media (forced-colors: active) {
|
|
1086
1217
|
.focus-ring:focus-visible,
|
|
1087
1218
|
.glass-btn:focus-visible,
|
|
1088
1219
|
.interactive-item:focus-visible,
|
|
1220
|
+
.btn-pill:focus-visible,
|
|
1221
|
+
.dock-icon-button:focus-visible,
|
|
1222
|
+
.dock-tab-button:focus-visible,
|
|
1223
|
+
.dock-select-trigger:focus-visible,
|
|
1224
|
+
.dock-dropdown-trigger:focus-visible,
|
|
1089
1225
|
.input-pill:focus,
|
|
1090
1226
|
.input-pill:focus-visible {
|
|
1091
1227
|
outline: 2px solid Highlight;
|
|
1092
1228
|
outline-offset: 2px;
|
|
1093
1229
|
}
|
|
1094
1230
|
|
|
1095
|
-
/* Structural edges borne ONLY by box-shadow (the hairline catch-light
|
|
1096
|
-
|
|
1097
|
-
|
|
1231
|
+
/* Structural edges borne ONLY by box-shadow (the hairline catch-light + the
|
|
1232
|
+
dock SHELL pill edge) also vanish — restore a real border so the silhouette
|
|
1233
|
+
survives. CanvasText is the system text/border color. The `.glass-dock`
|
|
1234
|
+
shell is OUT of the glass-material group BY DESIGN (it hand-rolls a parallel
|
|
1235
|
+
surface — see glass.css), so it keeps its WHC edge HERE; the five-rung ladder
|
|
1236
|
+
+ `.glass-card` get their WHC border from the co-located glass-language skin
|
|
1237
|
+
in glass.css (one source per surface family, no double-declaration). */
|
|
1098
1238
|
.hairline-accent,
|
|
1099
|
-
.glass-dock
|
|
1100
|
-
.glass-card {
|
|
1239
|
+
.glass-dock {
|
|
1101
1240
|
border: 1px solid CanvasText;
|
|
1102
1241
|
}
|
|
1103
1242
|
}
|
|
@@ -1108,12 +1247,13 @@ html.no-transition *::after {
|
|
|
1108
1247
|
to the WCAG 2.5.5 (44px) minimum — ONE amendment retiring the per-consumer
|
|
1109
1248
|
`min-h-[44px]` one-liners. Token-driven (`--touch-target`); fine-pointer
|
|
1110
1249
|
byte-identical. Targets `Button size="icon"` (via the `data-size="icon"`
|
|
1111
|
-
attr Button.vue reflects), ExpandableContainer +
|
|
1250
|
+
attr Button.vue reflects), ExpandableContainer + SegmentedTabs (responsive
|
|
1251
|
+
mobile Select) triggers.
|
|
1112
1252
|
`min-block/inline-size` only RAISES — a larger explicit size is never lost. */
|
|
1113
1253
|
@media (pointer: coarse) {
|
|
1114
1254
|
[data-size="icon"],
|
|
1115
1255
|
.expandable-container__trigger,
|
|
1116
|
-
.
|
|
1256
|
+
.segmented-tabs__trigger {
|
|
1117
1257
|
min-block-size: var(--touch-target, 2.75rem);
|
|
1118
1258
|
min-inline-size: var(--touch-target, 2.75rem);
|
|
1119
1259
|
}
|
|
@@ -60,5 +60,56 @@
|
|
|
60
60
|
@keyframes gl-vt-slide-in { from { opacity: 0; translate: 0 var(--vt-rise, 8px); } }
|
|
61
61
|
@keyframes gl-vt-slide-out { to { opacity: 0; translate: 0 var(--vt-rise, 8px); } }
|
|
62
62
|
|
|
63
|
+
/* ── gl-shared-element — the named-pair MORPH group (D6.c M6) ──────────────────
|
|
64
|
+
* Distinct from `.gl-list-item` (a cross-fade of MANY members in a re-rank): a
|
|
65
|
+
* shared-element morph is ONE element that exists in BOTH the old and new states
|
|
66
|
+
* under the SAME `view-transition-name`, so the browser MORPHS it in place — the
|
|
67
|
+
* group interpolates its size+position (transform) while old/new cross-fade. The
|
|
68
|
+
* editorial case: the gallery card's title IS the dashboard masthead's title, so
|
|
69
|
+
* the name you clicked GROWS into the name you read (the card → masthead route
|
|
70
|
+
* morph). The consumer adds `view-transition-class: gl-shared-element` plus a
|
|
71
|
+
* MATCHED `view-transition-name: <id>` on BOTH the source and destination element
|
|
72
|
+
* (the MANDATORY runtime rule — ≤1 element per name per state, else the morph is
|
|
73
|
+
* skipped silently), and wraps the navigation in `useRouteTransition` /
|
|
74
|
+
* `startViewTransition`.
|
|
75
|
+
*
|
|
76
|
+
* The morph rides the SMOOTH register (the 700ms-class spring, C-ANIM-VIZ-MAP T1
|
|
77
|
+
* §7) — a longer, gentler curve than the list-item cross-fade, because a morph
|
|
78
|
+
* that travels across the viewport wants room to read. The old/new cross-fade is
|
|
79
|
+
* softened so the morphing GROUP is the figure and the rest recedes. */
|
|
80
|
+
::view-transition-group(.gl-shared-element) {
|
|
81
|
+
animation-duration: var(--vt-morph-duration, var(--duration-slow, 500ms));
|
|
82
|
+
animation-timing-function: var(--vt-morph-ease, var(--spring-smooth, ease-in-out));
|
|
83
|
+
}
|
|
84
|
+
::view-transition-old(.gl-shared-element),
|
|
85
|
+
::view-transition-new(.gl-shared-element) {
|
|
86
|
+
/* The image pair cross-fades UNDER the group's size/position morph — softer
|
|
87
|
+
than the group curve so the morph (the size/position travel) is the figure
|
|
88
|
+
and the pixel cross-fade is the recessive fill. */
|
|
89
|
+
animation-duration: var(--vt-morph-duration, var(--duration-slow, 500ms));
|
|
90
|
+
animation-timing-function: var(--vt-ease, var(--spring-smooth, ease-in-out));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* ── gl-expand — the plate → fullscreen MORPH recipe (D6.c M7) ─────────────────
|
|
94
|
+
* The expand verb (a plate growing to fullscreen) is a SHARED-ELEMENT morph, not
|
|
95
|
+
* an opacity jump-cut: the plate IS the fullscreen surface, growing. It is a
|
|
96
|
+
* specialization of `gl-shared-element` — the SAME named-pair morph, with the
|
|
97
|
+
* expand register (a touch snappier than a route morph, because the surface stays
|
|
98
|
+
* in place and only the rect grows, so it wants less travel-room). `ExpandableContainer`
|
|
99
|
+
* wires the `view-transition-name` plumbing on its plate↔fullscreen surfaces (an
|
|
100
|
+
* opt-in `viewTransitionName` prop), so a consumer opts in and the open/close
|
|
101
|
+
* mutation — wrapped in `startViewTransition` — morphs the plate's rect to the
|
|
102
|
+
* fullscreen rect and back. The named pair is the SAME element across states
|
|
103
|
+
* (the slot content), so the browser captures one group and grows it. */
|
|
104
|
+
::view-transition-group(.gl-expand) {
|
|
105
|
+
animation-duration: var(--vt-expand-duration, var(--duration-normal, 240ms));
|
|
106
|
+
animation-timing-function: var(--vt-expand-ease, var(--spring-bouncy, ease-out));
|
|
107
|
+
}
|
|
108
|
+
::view-transition-old(.gl-expand),
|
|
109
|
+
::view-transition-new(.gl-expand) {
|
|
110
|
+
animation-duration: var(--vt-expand-duration, var(--duration-normal, 240ms));
|
|
111
|
+
animation-timing-function: var(--vt-ease, var(--spring-bouncy, ease-out));
|
|
112
|
+
}
|
|
113
|
+
|
|
63
114
|
/* Keep the non-transitioned UI interactive while the snapshot animates. */
|
|
64
115
|
::view-transition { pointer-events: none; }
|
package/dist/switch.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as e } from "./Switch-
|
|
1
|
+
import { t as e } from "./Switch-Ch-k3Rv-.js";
|
|
2
2
|
export { e as Switch };
|