@mkbabb/glass-ui 3.9.0 → 3.10.1

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 (265) hide show
  1. package/dist/{CardAction-DuArVky-.js → CardAction-DrAcAV4d.js} +2 -2
  2. package/dist/{CommandShortcut-CefCj5mt.js → CommandShortcut-mV2e1aG6.js} +2 -2
  3. package/dist/{DataTable-CUHMukiQ.js → DataTable-C3E6jZ5B.js} +2 -2
  4. package/dist/{DialogContent-BRkT1cjP.js → DialogContent-BxaaafFi.js} +1 -1
  5. package/dist/{HoverPopover-2LOIW34a.js → HoverPopover-CDA_SaCe.js} +1 -1
  6. package/dist/{MetricBadge-lTc002u2.js → MetricBadge-idgrkqoP.js} +1 -1
  7. package/dist/{Notification-BxK8LZMw.js → Notification-Cu0nN17_.js} +3 -3
  8. package/dist/{NumberFieldContent-BbLOh8RU.js → NumberFieldContent-CHEWghnY.js} +2 -2
  9. package/dist/{PopoverContent-BId6ggf_.js → PopoverContent-DpUvdYY-.js} +1 -1
  10. package/dist/{Progress-iEuD9pxG.js → Progress-BW-StFw2.js} +1 -1
  11. package/dist/{ScrollingText-BPP84wKo.js → ScrollingText-DruYCni_.js} +1 -1
  12. package/dist/{SelectScrollDownButton-T32cVFeM.js → SelectScrollDownButton-pirzjm--.js} +3 -3
  13. package/dist/{Switch-LDKLmmgx.js → Switch-DeAqg6pi.js} +1 -1
  14. package/dist/{TabsList-B8CVOQPC.js → TabsList-BAVzOZpg.js} +2 -2
  15. package/dist/{Toaster-1rYWrmAm.js → Toaster-CvuuW_y9.js} +49 -46
  16. package/dist/{ToggleGroupItem-Cev4pOVK.js → ToggleGroupItem-DtD37b4G.js} +4 -4
  17. package/dist/animated-digit.js +2 -2
  18. package/dist/api/index.d.ts +4 -4
  19. package/dist/api.js +1 -1
  20. package/dist/aurora.js +238 -547
  21. package/dist/{badge-BvwvT50i.js → badge-NdCQMvvB.js} +2 -2
  22. package/dist/badge.js +1 -1
  23. package/dist/{button-DN39cGqL.js → button-DyiWFAOE.js} +12 -12
  24. package/dist/button.js +1 -1
  25. package/dist/canvas.js +2 -2
  26. package/dist/card.js +1 -1
  27. package/dist/carousel.js +5 -5
  28. package/dist/collapsible.js +1 -1
  29. package/dist/{color-8jBjWiJ6.js → color-B65wWyQz.js} +9 -7
  30. package/dist/color.js +1 -1
  31. package/dist/command.js +1 -1
  32. package/dist/{compile-DAjIoEy2.js → compile-Ce_V55zi.js} +23 -23
  33. package/dist/components/custom/aurora/composables/atoms.d.ts +21 -4
  34. package/dist/components/custom/aurora/composables/runtime.d.ts +0 -9
  35. package/dist/components/custom/aurora/composables/uniformBridge.d.ts +0 -11
  36. package/dist/components/custom/aurora/constants/renderMode.d.ts +0 -32
  37. package/dist/components/custom/aurora/constants/shaders/brush.glsl.d.ts +1 -1
  38. package/dist/components/custom/aurora/constants/shaders/mediums.glsl.d.ts +2 -2
  39. package/dist/components/custom/aurora/constants/shaders/tonemap.glsl.d.ts +1 -1
  40. package/dist/components/custom/aurora/constants/shaders/vangogh-medium.glsl.d.ts +1 -0
  41. package/dist/components/custom/aurora/index.d.ts +1 -1
  42. package/dist/components/custom/constellation/Constellation.vue.d.ts +85 -1
  43. package/dist/components/custom/constellation/composables/createConstellationField.d.ts +35 -0
  44. package/dist/components/custom/constellation/composables/useConstellationPointer.d.ts +35 -0
  45. package/dist/components/custom/constellation/constants.d.ts +36 -0
  46. package/dist/components/custom/constellation/constellationDraw.d.ts +18 -0
  47. package/dist/components/custom/constellation/constellationField.d.ts +174 -63
  48. package/dist/components/custom/constellation/constellationInteraction.d.ts +102 -0
  49. package/dist/components/custom/constellation/index.d.ts +4 -2
  50. package/dist/components/custom/controls/DarkModeToggle.vue.d.ts +11 -0
  51. package/dist/components/custom/dock/GlassDock.vue.d.ts +2 -110
  52. package/dist/components/custom/dock/composables/dockMorphContext.d.ts +36 -0
  53. package/dist/components/custom/dock/composables/useDockMorphWindow.d.ts +15 -0
  54. package/dist/components/custom/dock/composables/useDockShellProps.d.ts +131 -0
  55. package/dist/components/custom/dock/composables/useLayerTransition.d.ts +44 -0
  56. package/dist/components/custom/dock/constants.d.ts +23 -0
  57. package/dist/components/custom/fourier-field/FourierField.vue.d.ts +6 -0
  58. package/dist/components/custom/fourier-field/index.d.ts +25 -1
  59. package/dist/components/custom/fourier-field/math.d.ts +20 -8
  60. package/dist/components/custom/fourier-field/presets.d.ts +54 -0
  61. package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +8 -10
  62. package/dist/components/custom/goo-blob/composables/buildMetaballProgram.d.ts +18 -0
  63. package/dist/components/custom/goo-blob/composables/uploadBlobUniforms.d.ts +41 -0
  64. package/dist/components/custom/goo-blob/composables/useBlobPointer.d.ts +4 -3
  65. package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +16 -21
  66. package/dist/components/custom/goo-blob/constants.d.ts +52 -0
  67. package/dist/components/custom/goo-blob/index.d.ts +1 -1
  68. package/dist/components/custom/goo-blob/shaders/metaball-uniforms.glsl.d.ts +1 -0
  69. package/dist/components/custom/goo-blob/types.d.ts +59 -25
  70. package/dist/components/custom/instrument-chassis/InstrumentChassis.vue.d.ts +2 -2
  71. package/dist/components/custom/tabs/constants.d.ts +12 -0
  72. package/dist/components/custom/underline/GlassUnderline.vue.d.ts +84 -0
  73. package/dist/components/custom/underline/index.d.ts +2 -0
  74. package/dist/components/custom/underline/types.d.ts +56 -0
  75. package/dist/components/ui/drawer/Drawer.vue.d.ts +1 -0
  76. package/dist/components/ui/dropdown-menu/DropdownMenuSubContent.vue.d.ts +2 -2
  77. package/dist/components/ui/slider/index.d.ts +25 -18
  78. package/dist/components/ui/toast/use-toast.d.ts +2 -2
  79. package/dist/composables/color/index.d.ts +24 -7
  80. package/dist/composables/glass/useSpecularTracking.d.ts +12 -3
  81. package/dist/composables/glass/webgl/shaders/procedural-color.glsl.d.ts +1 -6
  82. package/dist/composables/motion/curves.d.ts +48 -0
  83. package/dist/composables/motion/index.d.ts +2 -0
  84. package/dist/composables/motion/springPresets.d.ts +33 -0
  85. package/dist/composables/motion/suite.d.ts +2 -0
  86. package/dist/composables/motion/useSpringMount.d.ts +1 -1
  87. package/dist/configurator.js +1 -1
  88. package/dist/confirm-dialog.js +2 -2
  89. package/dist/constellation.js +322 -147
  90. package/dist/controls.js +48 -14
  91. package/dist/dark.js +1 -1
  92. package/dist/data-table.js +1 -1
  93. package/dist/dialog.js +2 -2
  94. package/dist/dock.js +340 -327
  95. package/dist/dockContext-bho8B1A4.js +17 -0
  96. package/dist/{dropdown-menu-D77jX6Df.js → dropdown-menu-DVnQcA0E.js} +7 -4
  97. package/dist/dropdown-menu.js +1 -1
  98. package/dist/expandable-container.js +1 -1
  99. package/dist/forms.js +2 -2
  100. package/dist/fourier-field.js +147 -120
  101. package/dist/fourier-math.d.ts +1 -0
  102. package/dist/fourier-math.js +2 -0
  103. package/dist/glass-ui.css +1 -1
  104. package/dist/glass-ui.js +286 -207
  105. package/dist/goo-blob.js +368 -322
  106. package/dist/hover-popover.js +1 -1
  107. package/dist/icon-tooltip.js +1 -1
  108. package/dist/index.d.ts +0 -2
  109. package/dist/keyboard.js +1 -1
  110. package/dist/labeled-field.js +5 -5
  111. package/dist/math-BUU9hHID.js +43 -0
  112. package/dist/metric-badge.js +1 -1
  113. package/dist/metric-stack.js +2 -2
  114. package/dist/motion-core.js +4 -4
  115. package/dist/motion-curves.d.ts +1 -0
  116. package/dist/motion-curves.js +130 -0
  117. package/dist/motion.js +38 -37
  118. package/dist/notification.js +1 -1
  119. package/dist/number-field.js +1 -1
  120. package/dist/popover.js +1 -1
  121. package/dist/progress.js +1 -1
  122. package/dist/pulse.js +1 -1
  123. package/dist/reactive.js +1 -1
  124. package/dist/scrolling-text.js +1 -1
  125. package/dist/search.js +6 -6
  126. package/dist/select.js +1 -1
  127. package/dist/{sheet-VZEtNFvO.js → sheet-ChSXcJpU.js} +1 -1
  128. package/dist/sheet.js +1 -1
  129. package/dist/{slider-DC2mwuoe.js → slider-sfl8gFDD.js} +8 -8
  130. package/dist/slider.js +1 -1
  131. package/dist/sortable-list.js +2 -2
  132. package/dist/springPresets-aRSm-4_k.js +40 -0
  133. package/dist/stacked-icons.js +6 -6
  134. package/dist/styles/cards.css +2 -2
  135. package/dist/styles/components.css +1 -1
  136. package/dist/styles/dock/layer-group.css +38 -4
  137. package/dist/styles/dock/layers.css +11 -1
  138. package/dist/styles/dock/morph.css +95 -19
  139. package/dist/styles/dock/shell.css +12 -0
  140. package/dist/styles/dock-controls.css +25 -12
  141. package/dist/styles/drawer.css +14 -4
  142. package/dist/styles/floating-panel.css +2 -0
  143. package/dist/styles/glass/a11y-fallback.css +245 -0
  144. package/dist/styles/glass/ladder.css +304 -0
  145. package/dist/styles/glass/material.css +238 -0
  146. package/dist/styles/glass/progress-rail.css +78 -0
  147. package/dist/styles/glass/squircle.css +66 -0
  148. package/dist/styles/glass/surfaces.css +306 -0
  149. package/dist/styles/glass-refract.css +2 -0
  150. package/dist/styles/glass.css +31 -1052
  151. package/dist/styles/hover-popover.css +2 -0
  152. package/dist/styles/index.css +24 -6
  153. package/dist/styles/instrument-chassis.css +4 -0
  154. package/dist/styles/theme.css +14 -14
  155. package/dist/styles/tokens/color-radius.css +250 -0
  156. package/dist/styles/tokens/dark-arm.css +194 -0
  157. package/dist/styles/tokens/glass.css +413 -0
  158. package/dist/styles/tokens/light-dark.css +158 -0
  159. package/dist/styles/tokens/offsets-sizing.css +406 -0
  160. package/dist/styles/tokens/property-regs.css +169 -0
  161. package/dist/styles/tokens/scale-paper.css +361 -0
  162. package/dist/styles/tokens/scheme-motion.css +334 -0
  163. package/dist/styles/tokens/shadow.css +132 -0
  164. package/dist/styles/tokens.css +22 -2269
  165. package/dist/styles/transitions.css +20 -2
  166. package/dist/styles/typography.css +18 -6
  167. package/dist/styles/utilities/a11y-overrides.css +140 -0
  168. package/dist/styles/utilities/animate.css +26 -0
  169. package/dist/styles/utilities/base.css +365 -0
  170. package/dist/styles/utilities/btn.css +399 -0
  171. package/dist/styles/utilities/components.css +317 -0
  172. package/dist/styles/utilities.css +19 -1170
  173. package/dist/switch.js +1 -1
  174. package/dist/tabs.js +98 -98
  175. package/dist/timeline.js +2 -2
  176. package/dist/toast.js +1 -1
  177. package/dist/toggle-group.js +1 -1
  178. package/dist/typewriter.js +1 -1
  179. package/dist/underline.d.ts +1 -0
  180. package/dist/underline.js +85 -0
  181. package/dist/{useAnimatedNumber-C5I3wWd8.js → useAnimatedNumber-DfVgP4te.js} +1 -1
  182. package/dist/{useConfiguratorState-DxAqksK6.js → useConfiguratorState-BdQXh9ie.js} +1 -1
  183. package/dist/useSpecularTracking-DFK_fhpG.js +32 -0
  184. package/dist/useSpringMount-DXUzxBjV.js +108 -0
  185. package/dist/watercolor-dot.js +2 -2
  186. package/package.json +62 -38
  187. package/src/styles/cards.css +2 -2
  188. package/src/styles/dock/layer-group.css +38 -4
  189. package/src/styles/dock/layers.css +11 -1
  190. package/src/styles/dock/morph.css +95 -19
  191. package/src/styles/dock/shell.css +12 -0
  192. package/src/styles/dock-controls.css +25 -12
  193. package/src/styles/drawer.css +12 -4
  194. package/src/styles/glass/a11y-fallback.css +245 -0
  195. package/src/styles/glass/ladder.css +304 -0
  196. package/src/styles/glass/material.css +238 -0
  197. package/src/styles/glass/progress-rail.css +78 -0
  198. package/src/styles/glass/squircle.css +66 -0
  199. package/src/styles/glass/surfaces.css +306 -0
  200. package/src/styles/glass.css +31 -1052
  201. package/src/styles/index.css +24 -6
  202. package/src/styles/theme.css +14 -14
  203. package/src/styles/tokens/color-radius.css +250 -0
  204. package/src/styles/tokens/dark-arm.css +194 -0
  205. package/src/styles/tokens/glass.css +413 -0
  206. package/src/styles/tokens/light-dark.css +158 -0
  207. package/src/styles/tokens/offsets-sizing.css +406 -0
  208. package/src/styles/tokens/property-regs.css +169 -0
  209. package/src/styles/tokens/scale-paper.css +361 -0
  210. package/src/styles/tokens/scheme-motion.css +334 -0
  211. package/src/styles/tokens/shadow.css +132 -0
  212. package/src/styles/tokens.css +22 -2269
  213. package/src/styles/transitions.css +20 -2
  214. package/src/styles/typography.css +18 -6
  215. package/src/styles/utilities/a11y-overrides.css +140 -0
  216. package/src/styles/utilities/animate.css +26 -0
  217. package/src/styles/utilities/base.css +365 -0
  218. package/src/styles/utilities/btn.css +399 -0
  219. package/src/styles/utilities/components.css +317 -0
  220. package/src/styles/utilities.css +19 -1170
  221. package/dist/DeckProgress-Dmk4_AKN.js +0 -23
  222. package/dist/InstrumentRail-CUJ05YVG.js +0 -44
  223. package/dist/components/custom/aurora/composables/gpuRuntime.d.ts +0 -16
  224. package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +0 -7
  225. package/dist/components/custom/deck-progress/DeckProgress.vue.d.ts +0 -27
  226. package/dist/components/custom/deck-progress/index.d.ts +0 -2
  227. package/dist/components/custom/dialog-native/GlassDialogNative.vue.d.ts +0 -57
  228. package/dist/components/custom/dialog-native/index.d.ts +0 -1
  229. package/dist/components/custom/glass-panel/GlassPanel.vue.d.ts +0 -41
  230. package/dist/components/custom/glass-panel/index.d.ts +0 -2
  231. package/dist/components/custom/header-ribbon/HeaderRibbon.vue.d.ts +0 -31
  232. package/dist/components/custom/header-ribbon/index.d.ts +0 -2
  233. package/dist/components/custom/header-ribbon/types.d.ts +0 -7
  234. package/dist/components/custom/instrument-rail/InstrumentRail.vue.d.ts +0 -91
  235. package/dist/components/custom/instrument-rail/index.d.ts +0 -2
  236. package/dist/composables/glass/createGPUCanvas.d.ts +0 -40
  237. package/dist/deck-progress.d.ts +0 -1
  238. package/dist/deck-progress.js +0 -2
  239. package/dist/dockContext-BKeIMmNk.js +0 -9
  240. package/dist/glass-panel.d.ts +0 -1
  241. package/dist/glass-panel.js +0 -44
  242. package/dist/header-ribbon.d.ts +0 -1
  243. package/dist/header-ribbon.js +0 -63
  244. package/dist/instrument-rail.d.ts +0 -1
  245. package/dist/instrument-rail.js +0 -2
  246. package/dist/useGlassRenderer-5I0YkI4t.js +0 -69
  247. package/dist/useSpecularTracking-BVRZsRHA.js +0 -26
  248. package/dist/useSpringMount-BJSHcLl3.js +0 -113
  249. /package/dist/{CollapsibleContent-CP9qF1v4.js → CollapsibleContent-Drow5WkV.js} +0 -0
  250. /package/dist/{DialogFooter-Gprw8H_A.js → DialogFooter-DufLHi0y.js} +0 -0
  251. /package/dist/{IconTooltip-yefK7cJc.js → IconTooltip-BrQ5p181.js} +0 -0
  252. /package/dist/{Input-DWQQIOC4.js → Input-B-F818RU.js} +0 -0
  253. /package/dist/{_plugin-vue_export-helper-ok8pgSl5.js → _plugin-vue_export-helper-DWghtRt7.js} +0 -0
  254. /package/dist/{constants-CS75AWHG.js → constants-C8NMonuo.js} +0 -0
  255. /package/dist/{presets-BKVyQfbt.js → presets-1OhFpaIC.js} +0 -0
  256. /package/dist/{prng-wHuHlNHE.js → prng-CjVgzjQT.js} +0 -0
  257. /package/dist/{resolveCanvasColor-BBiYfp8g.js → resolveCanvasColor-CRvVzOvP.js} +0 -0
  258. /package/dist/{useCanvas2D-ClrQuZtp.js → useCanvas2D-CSeH8h16.js} +0 -0
  259. /package/dist/{useGlobalDark-yhL4Wp-s.js → useGlobalDark-D7R9OypB.js} +0 -0
  260. /package/dist/{useIntersectionPause-Cc-H9ees.js → useIntersectionPause-DAdVPVp4.js} +0 -0
  261. /package/dist/{useInterval-Dsmqwi03.js → useInterval-D3USn0yc.js} +0 -0
  262. /package/dist/{useKeyboardShortcuts-Be3w_Rwk.js → useKeyboardShortcuts-i8tHd5WO.js} +0 -0
  263. /package/dist/{useScrollProgress-CAH8Ofwt.js → useScrollProgress-CcgmgMQt.js} +0 -0
  264. /package/dist/{useSortable-C8ReQ50P.js → useSortable-DnyGXKKY.js} +0 -0
  265. /package/dist/{useTextHighlight-DON84L8w.js → useTextHighlight-B3b10W6r.js} +0 -0
@@ -0,0 +1,334 @@
1
+ /* tokens/scheme-motion.css
2
+ §-1 color-scheme · §0 font · §1 duration · §2 easing (spring linear()) · §2.A ambient-motion · §2.B/§2.C · §3 z-index.
3
+ Carved from the tokens.css cascade root; @import-ed by tokens.css in
4
+ cascade order. Same :root cascade context as its siblings. */
5
+ :root {
6
+ /* ═══════════════════════════════════════════════
7
+ §-1 COLOR-SCHEME (AQ.W2 §1)
8
+
9
+ Lets native UI (scrollbars, spinbuttons, form-control chrome, the
10
+ default focus ring) honor the OS preference when the consumer has
11
+ NOT pinned a `.dark` class. glass-ui's dark mode is class-driven
12
+ (`.dark`, theme.css `@variant dark`), so `.dark` overrides to a hard
13
+ `dark` regardless of OS — but absent the class, native chrome should
14
+ still track `prefers-color-scheme`. `light dark` (not `only light`)
15
+ on `:root` delivers that; `.dark` hard-pins `dark`.
16
+
17
+ Baseline Widely Available → adopt natively, no `@supports` guard
18
+ (older engines ignore the property and keep default-light chrome).
19
+ `accent-color` (AQ.W2 §4) is the companion native-control brand;
20
+ both are inherited built-in <color>/keyword properties re-specified
21
+ inside `.dark`. The `--accent-color` token is defined in the §5
22
+ color block below (custom properties resolve order-independently).
23
+ ═══════════════════════════════════════════════ */
24
+ color-scheme: light dark;
25
+ accent-color: var(--accent-color);
26
+
27
+ /* ═══════════════════════════════════════════════
28
+ §0 FONT TOKEN SOURCE-OF-TRUTH
29
+
30
+ The single authoritative declaration of the library's font register.
31
+ theme.css bridges each --font-stack-* to its Tailwind --font-* namespace
32
+ var; typography.css consumes the bridged --font-* names. The public
33
+ runtime knobs remain --font-*, --leading-*, --tracking-*.
34
+
35
+ ONE brand register: Plus Jakarta Sans (text + display) + Fira Code (mono).
36
+ --font-stack-text drives the body/heading/prose/display register — the
37
+ library DEFAULT is the register every live surface paints (the demo +
38
+ speedtest render Plus Jakarta everywhere). The calibrated "Plus Jakarta
39
+ Sans Fallback" / "Fira Code Fallback" faces (declared in typography.css)
40
+ wrap the system stacks with Capsize metric overrides so the swap window
41
+ is geometry-neutral (zero CLS). --font-stack-display aliases the text
42
+ register: there is no separate display-serif voice. */
43
+ --font-stack-text: "Plus Jakarta Sans", "Plus Jakarta Sans Fallback", system-ui, sans-serif;
44
+ --font-stack-display: var(--font-stack-text);
45
+ --font-stack-sans: var(--font-stack-text);
46
+ --font-stack-mono: "Fira Code", "Fira Code Fallback", "Fira Mono", monospace;
47
+
48
+ --type-leading-micro: 1.2;
49
+ --type-leading-caption: 1.3;
50
+ --type-leading-small: 1.4;
51
+ --type-leading-body: 1.5;
52
+ --type-leading-prose: 1.618;
53
+ --type-leading-heading: 1.2;
54
+ --type-leading-display: 1.1;
55
+
56
+ --type-tracking-tight: -0.025em;
57
+ --type-tracking-snug: -0.01em;
58
+ --type-tracking-normal: 0;
59
+ --type-tracking-wide: 0.025em;
60
+ --type-tracking-wider: 0.05em;
61
+ --type-tracking-caps: 0.1em;
62
+
63
+ /* ═══════════════════════════════════════════════
64
+ §1 DURATION
65
+ ═══════════════════════════════════════════════ */
66
+ --duration-instant: 0.1s;
67
+ --duration-fast: 0.2s;
68
+ --duration-normal: 0.3s;
69
+ --duration-slow: 0.45s;
70
+ --duration-panel: 0.55s;
71
+ --duration-xl: 1s;
72
+ --duration-xxl: 1.5s;
73
+ --duration-shimmer-fast: 3s;
74
+ --duration-shimmer: 5s;
75
+ /* Sparkle micro-event — primary-CTA disco-grain sparkle sweep, success
76
+ affirmations. R5 vocab.γ gap row 3 (single-site at dock.css:735 today,
77
+ reserved for J.W2.7 §17 audacious-CTA buildout). */
78
+ --duration-sparkle: 600ms;
79
+
80
+ /* AH.W5-e (FA-8 §4d) — motion-duration + staged-reveal canon.
81
+
82
+ Six duration tokens + three delay tokens promoted from raw literals
83
+ at speedtest's celebratory-reveal SFCs (SpeedtestResults, ThankYou,
84
+ ResultStack, CompleteBadge). Unified under the `--motion-*`
85
+ namespace (parallel to `--motion-ease-*`) so all motion tokens
86
+ cluster at one canon — duration + easing arm together. */
87
+
88
+ /* Staged-entrance pairing — opacity + transform Vue <Transition> arms
89
+ in the celebratory headline + result-row reveals. Partners with
90
+ `--motion-ease-staged-entrance` / `--motion-ease-overshoot`. */
91
+ --motion-duration-staged: 320ms;
92
+
93
+ /* One-shot celebratory shimmer — gold-headline shimmer animation
94
+ duration + staging delay. Shared canon so the speedtest results
95
+ headline and the thank-you headline stay in lockstep. */
96
+ --motion-duration-complete-shimmer: 2.4s;
97
+ --motion-delay-complete-shimmer: 220ms;
98
+ /* The gold-headline shimmer reads these two tokens under a one-shot
99
+ animation: at 2.4s + 220ms delay the bright band traverses the headline
100
+ glyphs cleanly. Load-bearing — zeroing either collapses the shimmer to
101
+ an imperceptible blow-through. */
102
+
103
+ /* CompleteBadge staged-reveal cluster — the disc / ring / check curve
104
+ fires at three asymmetric durations + delays per the A4-AF staged-
105
+ variety design intent. Promoting the magic numbers makes the
106
+ staged-variety visible at the canon. */
107
+ --motion-duration-badge-disc: 420ms;
108
+ --motion-duration-badge-ring: 560ms;
109
+ --motion-duration-badge-check: 380ms;
110
+ --motion-delay-badge-disc: 80ms;
111
+ --motion-delay-badge-ring: 220ms;
112
+ --motion-delay-badge-check: 460ms;
113
+
114
+ /* Staggered-reveal increment canon — three perceptually-distinct tiers for
115
+ per-row/per-cell/per-bar cascades:
116
+ • tight (40ms) — dense row cascades, sub-perceptual gap
117
+ • default (80ms) — the canonical row-stagger rhythm (matches
118
+ `useStagger`'s built-in fallback)
119
+ • relaxed (120ms) — wider cascades where each reveal carries its own
120
+ attention budget
121
+ Adjacent tiers keep cross-beats quiet (80 is the LCM of 40 and 2/3 of
122
+ 120). Consumers read these via inline-style calc() or `getComputedStyle`
123
+ at runtime. */
124
+ --motion-stagger-tight: 40ms;
125
+ --motion-stagger-default: 80ms;
126
+ --motion-stagger-relaxed: 120ms;
127
+
128
+ /* ═══════════════════════════════════════════════
129
+ §2 EASING — Spring curves via linear()
130
+
131
+ Generated from `scripts/regen-spring-tokens.mjs` — DO NOT hand-edit.
132
+ To tune a spring: edit the PRESETS table in the script and re-run
133
+ `node scripts/regen-spring-tokens.mjs`. The script invokes
134
+ `springLinearStops()` from `@mkbabb/keyframes.js` which solves the
135
+ analytic second-order damped harmonic oscillator and emits CSS
136
+ `linear()` stops; this is the single source of truth tying each
137
+ (response, ζ) pair to its serialized curve.
138
+
139
+ iOS-canonical (response, dampingFraction) per AL-X4 §3:
140
+ smooth: (0.50s, ζ=0.86) — gentle settle, sub-perceptual overshoot ~0.5%
141
+ snappy: (0.35s, ζ=0.65) — quick crisp, overshoot ~+6.8%
142
+ bouncy: (0.50s, ζ=0.45) — emphatic overshoot ~+20.5%
143
+ gentle: (0.70s, ζ=1.00) — patient critically-damped
144
+ dock: (0.32s, ζ=0.70) — dock expand/collapse morph, overshoot ~+4.6%
145
+
146
+ Note on `smooth`: at ζ=0.86 the analytic solver produces a peak
147
+ of 1.00498 (+0.5%) at the 24% slot — mathematically present but
148
+ sub-perceptual. I keep ζ=0.86 rather than promoting to ζ=1.0
149
+ because true critical damping is `gentle`'s register, and
150
+ `smooth` wants a slightly faster visual settle than `gentle`'s
151
+ patient curve. The 0.5% peak does not read as overshoot to the
152
+ eye but does narrowly distinguish `smooth` from `gentle`.
153
+
154
+ ── EASING DOCTRINE (AX.W52 §6 — which easing fits which job) ──
155
+ ONE recorded rule so the animation easing stops forking live. This
156
+ FORMALIZES the already-correct `transitions.css` idiom (enter=spring,
157
+ exit=bezier) as the house rule every recipe reaches for:
158
+
159
+ | Transition kind | Easing |
160
+ |--------------------------------------------------|-------------------------------------|
161
+ | Surface props (bg, border, color, box-shadow, | `--ease-standard` (bezier — a |
162
+ | opacity) | colour cross-fade reads as a |
163
+ | | wobble on a spring) |
164
+ | Transform — hover/press/active (scale, translate,| `--spring-smooth` (the ONE button/ |
165
+ | rotate) | interactive scale register) or |
166
+ | | `--spring-snappy` (crisp press) |
167
+ | Enter (mount, popover open, dialog in) | `--spring-bouncy` / `--spring-snappy`|
168
+ | Exit (unmount, close) | `--ease-out` / `--ease-standard` |
169
+ | | (bezier, NO overshoot — an exit |
170
+ | | must never overshoot past gone) |
171
+ | Position-tracked (specular pointer follow) | `--ease-standard` |
172
+
173
+ The BUTTON family (`.btn-pill` / `.tap-squish` / `.glass-btn` /
174
+ `btn-interactive`) UNIFIES its `scale` transform leg onto ONE register —
175
+ `--spring-smooth` — so hover + press read as one motion language (the
176
+ hover lift is the restrained `--scale-hover-btn` = 1.05, not the 1.08
177
+ `--scale-hover`). Springs read alive on TRANSFORM and ENTER (overshoot =
178
+ physicality); a spring on a COLOR or an EXIT reads as a wobble/hesitation.
179
+ `--ease-apple` is the ambient-only register (consumed solely by the Pulse
180
+ aura `--animate-ambient-pulse-easing` — NOT a second smooth-ease authority
181
+ for interactive transforms; those use `--spring-smooth`).
182
+ ═══════════════════════════════════════════════ */
183
+ --spring-smooth: linear(0, 0.09804 2.041%, 0.29288 4.082%, 0.49447 6.122%, 0.66436 8.163%, 0.79208 10.204%, 0.88050 12.245%, 0.93754 14.286%, 0.97182 16.327%, 0.99083 18.367%, 1.00027 20.408%, 1.00413 22.449%, 1.00502 24.490%, 1.00453 26.531%, 1.00355 28.571%, 1.00254 30.612%, 1.00169 32.653%, 1.00105 34.694%, 1.00060 36.735%, 1.00031 38.776%, 1.00014 40.816%, 1.00005 42.857%, 1.00000 44.898%, 1.00000 46.939%, 1.00000 48.980%, 1.00000 51.020%, 1.00000 53.061%, 1.00000 55.102%, 1.00000 57.143%, 1.00000 59.184%, 1.00000 61.224%, 1.00000 63.265%, 1.00000 65.306%, 1.00000 67.347%, 1.00000 69.388%, 1.00000 71.429%, 1.00000 73.469%, 1.00000 75.510%, 1.00000 77.551%, 1.00000 79.592%, 1.00000 81.633%, 1.00000 83.673%, 1.00000 85.714%, 1.00000 87.755%, 1.00000 89.796%, 1.00000 91.837%, 1.00000 93.878%, 1.00000 95.918%, 1.00000 97.959%, 1);
184
+ --spring-snappy: linear(0, 0.10438 2.041%, 0.32622 4.082%, 0.56668 6.122%, 0.77153 8.163%, 0.91961 10.204%, 1.01073 12.245%, 1.05549 14.286%, 1.06804 16.327%, 1.06171 18.367%, 1.04686 20.408%, 1.03044 22.449%, 1.01629 24.490%, 1.00596 26.531%, 0.99954 28.571%, 0.99633 30.612%, 0.99537 32.653%, 0.99575 34.694%, 0.99674 36.735%, 0.99786 38.776%, 0.99884 40.816%, 0.99956 42.857%, 1.00001 44.898%, 1.00024 46.939%, 1.00000 48.980%, 1.00000 51.020%, 1.00000 53.061%, 1.00000 55.102%, 1.00000 57.143%, 1.00000 59.184%, 1.00000 61.224%, 1.00000 63.265%, 1.00000 65.306%, 1.00000 67.347%, 1.00000 69.388%, 1.00000 71.429%, 1.00000 73.469%, 1.00000 75.510%, 1.00000 77.551%, 1.00000 79.592%, 1.00000 81.633%, 1.00000 83.673%, 1.00000 85.714%, 1.00000 87.755%, 1.00000 89.796%, 1.00000 91.837%, 1.00000 93.878%, 1.00000 95.918%, 1.00000 97.959%, 1);
185
+ --spring-bouncy: linear(0, 0.11105 2.041%, 0.36430 4.082%, 0.65496 6.122%, 0.90929 8.163%, 1.08828 10.204%, 1.18289 12.245%, 1.20482 14.286%, 1.17641 16.327%, 1.12214 18.367%, 1.06276 20.408%, 1.01239 22.449%, 0.97809 24.490%, 0.96099 26.531%, 0.95826 28.571%, 0.96514 30.612%, 0.97666 32.653%, 0.98873 34.694%, 0.99867 36.735%, 1.00520 38.776%, 1.00825 40.816%, 1.00847 42.857%, 1.00686 44.898%, 1.00443 46.939%, 1.00199 48.980%, 1.00004 51.020%, 0.99880 53.061%, 0.99827 55.102%, 0.99829 57.143%, 0.99866 59.184%, 0.99916 61.224%, 0.99966 63.265%, 1.00004 65.306%, 1.00027 67.347%, 1.00000 69.388%, 1.00000 71.429%, 1.00000 73.469%, 1.00000 75.510%, 1.00000 77.551%, 1.00000 79.592%, 1.00000 81.633%, 1.00000 83.673%, 1.00000 85.714%, 1.00000 87.755%, 1.00000 89.796%, 1.00000 91.837%, 1.00000 93.878%, 1.00000 95.918%, 1.00000 97.959%, 1);
186
+ --spring-gentle: linear(0, 0.09415 2.041%, 0.27374 4.082%, 0.45506 6.122%, 0.60779 8.163%, 0.72570 10.204%, 0.81213 12.245%, 0.87336 14.286%, 0.91570 16.327%, 0.94445 18.367%, 0.96371 20.408%, 0.97645 22.449%, 0.98481 24.490%, 0.99025 26.531%, 0.99377 28.571%, 0.99604 30.612%, 0.99749 32.653%, 0.99841 34.694%, 0.99900 36.735%, 0.99937 38.776%, 0.99961 40.816%, 0.99975 42.857%, 0.99985 44.898%, 1.00000 46.939%, 1.00000 48.980%, 1.00000 51.020%, 1.00000 53.061%, 1.00000 55.102%, 1.00000 57.143%, 1.00000 59.184%, 1.00000 61.224%, 1.00000 63.265%, 1.00000 65.306%, 1.00000 67.347%, 1.00000 69.388%, 1.00000 71.429%, 1.00000 73.469%, 1.00000 75.510%, 1.00000 77.551%, 1.00000 79.592%, 1.00000 81.633%, 1.00000 83.673%, 1.00000 85.714%, 1.00000 87.755%, 1.00000 89.796%, 1.00000 91.837%, 1.00000 93.878%, 1.00000 95.918%, 1.00000 97.959%, 1);
187
+ --spring-dock: linear(0, 0.10282 2.041%, 0.31773 4.082%, 0.54783 6.122%, 0.74309 8.163%, 0.88550 10.204%, 0.97598 12.245%, 1.02452 14.286%, 1.04368 16.327%, 1.04501 18.367%, 1.03739 20.408%, 1.02681 22.449%, 1.01672 24.490%, 1.00873 26.531%, 1.00323 28.571%, 0.99996 30.612%, 0.99837 32.653%, 0.99789 34.694%, 0.99805 36.735%, 0.99848 38.776%, 0.99897 40.816%, 0.99940 42.857%, 0.99972 44.898%, 0.99993 46.939%, 1.00004 48.980%, 1.00000 51.020%, 1.00000 53.061%, 1.00000 55.102%, 1.00000 57.143%, 1.00000 59.184%, 1.00000 61.224%, 1.00000 63.265%, 1.00000 65.306%, 1.00000 67.347%, 1.00000 69.388%, 1.00000 71.429%, 1.00000 73.469%, 1.00000 75.510%, 1.00000 77.551%, 1.00000 79.592%, 1.00000 81.633%, 1.00000 83.673%, 1.00000 85.714%, 1.00000 87.755%, 1.00000 89.796%, 1.00000 91.837%, 1.00000 93.878%, 1.00000 95.918%, 1.00000 97.959%, 1);
188
+
189
+ /* Core cubic-bezier (exits, fallbacks, non-spring uses) */
190
+ --motion-ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
191
+ --motion-ease-out: cubic-bezier(0, 0, 0.2, 1);
192
+ --motion-ease-in: cubic-bezier(0.4, 0, 1, 1);
193
+ --motion-ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
194
+
195
+ --ease-standard: var(--motion-ease-standard);
196
+ --ease-out: var(--motion-ease-out);
197
+ --ease-in: var(--motion-ease-in);
198
+ --ease-out-expo: var(--motion-ease-out-expo);
199
+
200
+ /* Apple-inspired — micro-interactions, switches, dock hover */
201
+ --motion-ease-apple: cubic-bezier(0.25, 0.1, 0.25, 1);
202
+
203
+ --ease-apple: var(--motion-ease-apple);
204
+ --ease-spring: var(--spring-snappy);
205
+ --ease-decelerate: var(--ease-out);
206
+ --ease-accelerate: var(--ease-in);
207
+
208
+ /* ═══════════════════════════════════════════════
209
+ §2.A AMBIENT MOTION — Pulse aura tokens
210
+
211
+ Breathing rhythm for `<Pulse variant="aura">`. The 6s duration is the
212
+ canon ambient-pulse rate; scale 1.0 ↔ 1.15 reads as a quiet halo at
213
+ intensity="normal" (Pulse remaps min/max from its `intensity` prop).
214
+ Reduced motion: Pulse.vue parks at the min stop, breath cycle disabled.
215
+
216
+ AX.W57 (P6) — the aura re-baselined from a glowing DISC to an AMBIENT
217
+ halo. The egregiousness was doubly-stacked: a 0.55-density currentColor
218
+ radial multiplied by an element opacity the `ambient-pulse` keyframe
219
+ drove up to 0.95 mid-breath (so a saturated viz hue read as a near-
220
+ opaque throbbing blob). The fix is two decoupled, single-source knobs:
221
+ · `--pulse-aura-strength` (0..1) — the ONE gradient-density scalar
222
+ both color-mix stops derive via calc() (replaces the
223
+ `--pulse-aura-opacity-pct` / `-pct-num` twin desync trap — the
224
+ percent and the raw number had to be hand-kept in sync).
225
+ · `--pulse-aura-breath-{min,max}` — the aura's OWN element-opacity
226
+ range, decoupled from the shared `--pulse-aura-opacity-*` shimmer
227
+ tokens (those stay 0.55/0.95 for the neutral skeleton-breath, where
228
+ a grey shimmer at that range is the correct soft swell).
229
+ The loud old read is the explicit `intensity="vivid"` opt-in. */
230
+ --animate-ambient-pulse-duration: 6s;
231
+ --animate-ambient-pulse-scale-min: 1.0;
232
+ --animate-ambient-pulse-scale-max: 1.15;
233
+ --animate-ambient-pulse-easing: var(--ease-apple);
234
+
235
+ /* Aura gradient density — ONE scalar (0..1). The center stop paints at
236
+ `strength`, the mid stop at `strength * 0.35` (both via calc() in
237
+ Pulse.vue). 0.22 reads as an ambient wash, not a glowing disc. */
238
+ --pulse-aura-strength: 0.22;
239
+
240
+ /* Aura element-opacity breath range (the `ambient-pulse` keyframe stops).
241
+ Quiet: the halo stays a wash at every phase of the 6s cycle. */
242
+ --pulse-aura-breath-min: 0.28;
243
+ --pulse-aura-breath-max: 0.42;
244
+
245
+ /* Skeleton-breath shimmer range — the SHARED neutral-shimmer stops
246
+ (`.skeleton-breath` reads these; a grey shimmer at 0.55↔0.95 is the
247
+ correct soft swell, distinct from the aura's calmer breath above). */
248
+ --pulse-aura-opacity-min: 0.55;
249
+ --pulse-aura-opacity-max: 0.95;
250
+
251
+ /* ═══════════════════════════════════════════════
252
+ §2.B SECTIONED PROGRESS — phase-bus rail (AB.W3.T2)
253
+
254
+ The sectioned `<Progress variant="sectioned">` exposes one
255
+ height knob + one track tint knob. Defaults size the rail at
256
+ 0.875rem (14px) — the W3 spec minimum (≥ 14px mobile, ≥ 18px
257
+ desktop). Consumers override the height per breakpoint via the
258
+ same token name on the consumer-side surface.
259
+
260
+ The bar reads as a recessed glass channel: inner top
261
+ catch-light + lower inner shadow + small outer drop. The
262
+ depth lives entirely in the Progress.vue scoped block; this
263
+ token only parameterises the rail BACKGROUND and HEIGHT —
264
+ depth shadows compose from the existing --shadow-color rung.
265
+ ═══════════════════════════════════════════════ */
266
+ --progress-sectioned-height: 0.875rem;
267
+ --progress-sectioned-track: var(--secondary);
268
+
269
+ /* ═══════════════════════════════════════════════
270
+ §2.C ANIMATION EXPRESSIVENESS
271
+
272
+ Three idiom families:
273
+ • Progress lifecycle — the progress bar rides an intake pulse on
274
+ rising-edge, a crescendo brightening at ≥85%, and a one-shot discharge
275
+ flash at 100% (the crescendo is the typed `@property --progress-crescendo`).
276
+ • Chassis phase-tint companion — `@property --phase-tint-amount` so the
277
+ chassis backdrop warms toward the active phase, interpolating with
278
+ `--phase-color` across the consumer's phase-handoff window (600ms default).
279
+ • Audacious button press-ripple — `btn-audacious` gains a typed
280
+ `@property --ripple-radius` ramping 0 → max over the ripple duration.
281
+ ═══════════════════════════════════════════════ */
282
+
283
+ /* Progress lifecycle — typed crescendo + segment-local durations */
284
+ --motion-duration-progress-intake: 220ms; /* rising-edge pulse */
285
+ --motion-duration-progress-crescendo: 240ms; /* leading-edge brighten */
286
+ --motion-duration-progress-indeterminate: 4s; /* indeterminate sweep period */
287
+
288
+ /* Chassis depth-of-tint peak — the amount `--phase-tint-amount`
289
+ interpolates toward when a phase is active. Subtle by intent;
290
+ a 6% color-mix reads as "warmth toward the phase" without
291
+ overwhelming the chassis chrome's resting register. */
292
+ --phase-tint-peak: 6%;
293
+
294
+ /* Audacious button press-ripple — geometry + duration. The ripple
295
+ radius caps at 12rem so an oversized button doesn't paint a
296
+ transparent halo beyond its bounds (the parent's `overflow:
297
+ hidden` clips the visible region; the cap keeps the gradient
298
+ falloff well-defined). */
299
+ --ripple-radius-max: 12rem;
300
+ --motion-duration-ripple: 340ms;
301
+
302
+ /* Skeleton breath variant — the M.3 "known-imminent" loading
303
+ register. 6s cycle (the canon ambient rate) so a known-imminent
304
+ skeleton breathes in lockstep with the dial and the Pulse aura.
305
+ Coexists with the 1.5s shimmer (sliding gradient) and the
306
+ Tailwind animate-pulse (2s, short-wait) variants — distinct
307
+ temporal registers per use-case. */
308
+ --skeleton-breath-duration: 6s;
309
+
310
+ /* ═══════════════════════════════════════════════
311
+ §3 Z-INDEX SCALE
312
+ ═══════════════════════════════════════════════ */
313
+ /* V.W2 T12 — Aurora background tier (sits behind --z-background).
314
+ Consumed by `<Aurora>` in speedtest's App.vue (`-z-10` literal today). */
315
+ --z-behind: -10;
316
+ --z-background: 0;
317
+ --z-content: 10;
318
+ --z-controls: 20;
319
+ --z-bar: 30;
320
+ --z-header: 35;
321
+ --z-dock: 40;
322
+ --z-panel: 45;
323
+ --z-overlay: 50;
324
+ --z-hovercard: 120;
325
+ --z-tooltip: 120;
326
+ --z-popover: 130;
327
+ --z-modal: 140;
328
+ --z-fullscreen: 150;
329
+ --z-toast: 160;
330
+ --z-toggle: 999;
331
+ --z-max: 9999;
332
+ --z-debug: 99999;
333
+
334
+ }
@@ -0,0 +1,132 @@
1
+ /* tokens/shadow.css
2
+ §7 shadows — the cartoon offset-stamp signature + the shadow-color base.
3
+ Carved from the tokens.css cascade root; @import-ed by tokens.css in
4
+ cascade order. Same :root cascade context as its siblings. */
5
+ :root {
6
+ /* ═══════════════════════════════════════════════
7
+ §7 SHADOWS — cartoon offset is the signature
8
+ ═══════════════════════════════════════════════ */
9
+ --shadow-cartoon: 3px 3px 0px 0px color-mix(in srgb, var(--foreground) 8%, transparent);
10
+ --shadow-cartoon-hover: 4px 4px 0px 0px color-mix(in srgb, var(--foreground) 10%, transparent);
11
+ --shadow-soft: 0 4px 12px rgba(0, 0, 0, 0.1);
12
+ --shadow-elevated: 0 8px 24px rgba(0, 0, 0, 0.12);
13
+ --shadow-modal:
14
+ 4px 4px 0px 0px color-mix(in srgb, var(--foreground) 8%, transparent),
15
+ 0 24px 64px color-mix(in srgb, var(--foreground) 12%, transparent);
16
+
17
+ --cartoon-shadow: var(--shadow-cartoon);
18
+ --cartoon-shadow-hover: var(--shadow-cartoon-hover);
19
+ --soft-shadow: var(--shadow-soft);
20
+ --elevated-shadow: var(--shadow-elevated);
21
+ --modal-shadow: var(--shadow-modal);
22
+
23
+ /* Elevation scale */
24
+ --shadow-xs: 0 1px 3px color-mix(in srgb, var(--shadow-color) 4%, transparent),
25
+ 0 1px 2px color-mix(in srgb, var(--shadow-color) 6%, transparent);
26
+ --shadow-sm: 0 2px 8px color-mix(in srgb, var(--shadow-color) 6%, transparent);
27
+ --shadow-md: 0 4px 16px color-mix(in srgb, var(--shadow-color) 8%, transparent);
28
+ --shadow-lg: 0 4px 20px color-mix(in srgb, var(--shadow-color) 12%, transparent);
29
+ --shadow-xl: 0 8px 24px color-mix(in srgb, var(--shadow-color) 14%, transparent);
30
+ --shadow-2xl: 0 25px 50px -12px color-mix(in srgb, var(--shadow-color) 25%, transparent);
31
+
32
+ /* Z.W2.T3a — uniform-cast shadow rung. Offset 0 / 0, no directional
33
+ Y bias. Use case: dock-hosted icons (e.g. the speedtest settings
34
+ gear) where the surrounding dock shadow's downward cast reads as
35
+ a per-icon right-edge halo on the rightmost child (A2 §B7). The
36
+ uniform variant carries the same color-mix recipe family as the
37
+ sized rungs (`--shadow-md`, `--shadow-lg`) so the perceived
38
+ elevation is a peer, not a sibling. Consumers compose via
39
+ `--shadow-dock-override: var(--shadow-uniform)` per-instance, or
40
+ attach to per-icon-button stacks where directional cast is wrong-
41
+ shape. Documented in DESIGN.md token table. */
42
+ --shadow-uniform: 0 0 12px color-mix(in srgb, var(--shadow-color) 8%, transparent);
43
+
44
+ /* Card = soft drop plate by default. The cartoon offset is a brand-flavoured
45
+ decoration (a sticker look), not the canonical card shape. Consumers
46
+ wanting the cartoon look pass <Card surface="cartoon">, which composes the
47
+ `.cartoon-surface` utility (it reads --shadow-cartoon directly). R3-spec
48
+ §F.1, S.W4; Q.W3 Lane H. */
49
+ --shadow-card: var(--shadow-md);
50
+ --card-shadow: var(--shadow-card);
51
+
52
+ /* AI.W1-α — sticky CardHeader background. Parameterises the
53
+ `bg-card/60` literal value.js's PaneHeader.vue carried so the
54
+ glass-ui canon owns the recipe. The scroll-driven `<CardHeader
55
+ shrink>` choreography reads this token for its sticky-header
56
+ backdrop tint; consumers retune per-app by overriding the
57
+ variable at any ancestor. Auto-dark via `--card`. */
58
+ --card-header-bg: color-mix(in srgb, var(--card) 60%, transparent);
59
+
60
+ /* Dock shadows — a single omnidirectional glow in the
61
+ `--shadow-md`/`--shadow-lg` family (a directional drop concentrated on
62
+ the pill's rounded right cap as a right-edge halo; the dock's own
63
+ border already defines the silhouette). Per-instance directional drop
64
+ reinstates via `--shadow-dock-override` (consumed by every `.glass-dock`
65
+ state selector — see dock.css). */
66
+ --shadow-dock: 0 0 20px color-mix(in srgb, var(--shadow-color) 14%, transparent);
67
+ --shadow-dock-collapsed: 0 0 12px color-mix(in srgb, var(--shadow-color) 12%, transparent);
68
+ --dock-shadow: var(--shadow-dock);
69
+ --dock-shadow-collapsed: var(--shadow-dock-collapsed);
70
+
71
+ /* AX.W04 F1 — the wrap/card-tier dock shadow. A wrapped multi-row dock (and
72
+ any finite-radius card silhouette) is a THICKER material than a flat thin
73
+ pill — WWDC25 §219 "material thickens as glass flexes larger". So when the
74
+ wrap dock expands it lifts its elevation onto the FLOATING-tier shadow
75
+ stack (the `--glass-shadow-floating` family — `--shadow-xl` + the
76
+ `--glass-material-rim` hairline + the `--glass-under-shadow-vivid` under-cast)
77
+ rather than carrying the flat `--shadow-dock` glow of a 40px pill. Composed
78
+ on `:root` as ONE consumer-overridable token (per the cartoon-shadow
79
+ override contract — override on the cascade, never a dead local). The dock
80
+ reads it via `calc()`-on-`--dock-expand-t` so the lift glides in lockstep
81
+ with the pill→card radius morph (ONE clock, ONE register). */
82
+ --glass-material-rim: 0 0 0 0.5px color-mix(in srgb, var(--shadow-color) 5%, transparent);
83
+ --shadow-dock-wrap: var(--shadow-xl),
84
+ var(--glass-material-rim),
85
+ var(--glass-under-shadow-vivid);
86
+
87
+ /* Cartoon shadow color primitives (kept for tiered cartoon utilities) */
88
+ --shadow-cartoon-color: rgb(0 0 0 / 0.12);
89
+ --shadow-cartoon-color-soft: rgb(0 0 0 / 0.06);
90
+
91
+ /* Tiered cartoon shadows */
92
+ --shadow-cartoon-sm: -3px 2px 1px color-mix(in srgb, var(--shadow-color) 10%, transparent),
93
+ 0 3px 1px color-mix(in srgb, var(--shadow-color) 10%, transparent),
94
+ -3px 3px 1px color-mix(in srgb, var(--shadow-color) 6%, transparent);
95
+ --shadow-cartoon-md: -4px 3px 1px color-mix(in srgb, var(--shadow-color) 12%, transparent),
96
+ 0 4px 1px color-mix(in srgb, var(--shadow-color) 12%, transparent),
97
+ -4px 4px 2px color-mix(in srgb, var(--shadow-color) 8%, transparent);
98
+ --shadow-cartoon-lg: -6px 4px 1px color-mix(in srgb, var(--shadow-color) 12%, transparent),
99
+ 0 6px 1px color-mix(in srgb, var(--shadow-color) 12%, transparent),
100
+ -6px 6px 2px color-mix(in srgb, var(--shadow-color) 8%, transparent);
101
+ --cartoon-shadow-sm: var(--shadow-cartoon-sm);
102
+ --cartoon-shadow-md: var(--shadow-cartoon-md);
103
+ --cartoon-shadow-lg: var(--shadow-cartoon-lg);
104
+
105
+ /* AY.W-COHERE E2 — the gel-bead ambient contact shadow (the GooBlob lit dome).
106
+ The metaball bead is NOT a Memphis sticker — it is a lit gel dome sitting IN
107
+ a scene, so it casts a SOFT, NEAR-CENTERED, low-offset ambient contact
108
+ shadow (small downward offset, a large soft blur, ambient-tinted), in the
109
+ same soft-ambient-light register the constellation / fourier / aurora
110
+ substrates speak — NOT the hard `5px 5px` near-black offset-stamp the
111
+ cartoon family carries (that stamp stays the identity of
112
+ <Card surface="cartoon">; it is removed ONLY from the gel bead, a different
113
+ lighting language). The shadow color is ambient: the bead's own
114
+ `--blob-color` mixed toward `--shadow-color` at a LOW strength, so the dome
115
+ casts a faint tinted contact shade. Adaptive-by-construction: `--shadow-color`
116
+ is `var(--foreground)`, which flips light→dark, so the contact shadow
117
+ re-resolves under `.dark` with NO hardcoded `.dark` re-declaration (the house
118
+ cartoon-shadow contract's pattern, applied to the ambient shadow). A consumer
119
+ retunes the bead's lighting by overriding `--blob-shadow` (or the
120
+ `--blob-shadow-*` sub-axes) on the cascade. */
121
+ --blob-shadow-offset: 0 4px;
122
+ --blob-shadow-blur: 14px;
123
+ --blob-shadow-color: color-mix(in srgb,
124
+ var(--blob-color, var(--shadow-color)) 22%, var(--shadow-color));
125
+ --blob-shadow-strength: 20%;
126
+ --blob-shadow: var(--blob-shadow-offset) var(--blob-shadow-blur)
127
+ color-mix(in srgb, var(--blob-shadow-color) var(--blob-shadow-strength), transparent);
128
+ /* The hover lift — a touch deeper + softer (the dome rises slightly). */
129
+ --blob-shadow-hover: 0 6px 20px
130
+ color-mix(in srgb, var(--blob-shadow-color) 26%, transparent);
131
+
132
+ }