@mkbabb/glass-ui 3.6.0 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/dist/CardAction-q2qHCJFG.js +157 -0
  2. package/dist/CollapsibleContent-CP9qF1v4.js +63 -0
  3. package/dist/{CommandShortcut-BiVyqipe.js → CommandShortcut-SzWRhROC.js} +4 -4
  4. package/dist/{ContextMenuContent-De01_83g.js → ContextMenuContent-DDa0v27s.js} +1 -1
  5. package/dist/{ContextMenuSubContent-DrWkXKQP.js → ContextMenuSubContent-Do977Cbf.js} +4 -4
  6. package/dist/{DataTable-BGVXx0Ww.js → DataTable-CvlWXz65.js} +14 -7
  7. package/dist/DeckProgress-AVgbIULY.js +23 -0
  8. package/dist/{DialogContent-IQ8_BRrC.js → DialogContent-DjZWT3lK.js} +24 -24
  9. package/dist/{DialogFooter-Er0wA3K6.js → DialogFooter-Gprw8H_A.js} +2 -2
  10. package/dist/{DiscoGlyph-BaZ8OawK.js → DiscoGlyph-CG0F410s.js} +1 -1
  11. package/dist/{GlyphFace-B_7vOmYn.js → GlyphFace-DRjDkB0s.js} +1 -1
  12. package/dist/{HoverCardContent-ICfIMZX1.js → HoverCardContent-B6CcQ8He.js} +1 -1
  13. package/dist/{HoverPopover-DTSYkJtw.js → HoverPopover-D56O6Ylp.js} +1 -1
  14. package/dist/{IconTooltip-DZlCkU-0.js → IconTooltip-D2T5nYOM.js} +1 -1
  15. package/dist/{Input-CRJ2owjN.js → Input-DVG_J0ne.js} +4 -1
  16. package/dist/{Label-CZk-3nTc.js → Label-zRfbQdCn.js} +1 -1
  17. package/dist/{MetricBadge-BlrdbOGN.js → MetricBadge-lTc002u2.js} +1 -1
  18. package/dist/{Notification-DP_ApJLo.js → Notification-BxK8LZMw.js} +5 -4
  19. package/dist/{NumberFieldContent-Bhhmk95p.js → NumberFieldContent-CLNVR1iY.js} +5 -5
  20. package/dist/{PopoverContent-B8WtJECb.js → PopoverContent-BId6ggf_.js} +2 -2
  21. package/dist/{Progress-DjM86vfb.js → Progress-iEuD9pxG.js} +7 -7
  22. package/dist/{ScrollingText-P9o_DuMn.js → ScrollingText-CVyqxvfv.js} +2 -2
  23. package/dist/{SelectScrollDownButton-BGn3rjs9.js → SelectScrollDownButton-C7TRe-ep.js} +8 -7
  24. package/dist/{Separator-C2XtAXRp.js → Separator-D7sD7RKj.js} +1 -1
  25. package/dist/{Switch-x8n6husW.js → Switch-LDKLmmgx.js} +8 -2
  26. package/dist/TabsList-qyHZ2lKY.js +101 -0
  27. package/dist/{Toaster-DdhMKfus.js → Toaster-CabYEEF_.js} +54 -60
  28. package/dist/{ToggleGroupItem-gyXj998A.js → ToggleGroupItem-CkXUcBlt.js} +13 -5
  29. package/dist/{TooltipProvider-D-JrSqDu.js → TooltipProvider-CmZzCuaG.js} +1 -1
  30. package/dist/{UnderlineTabs-CuIK16JI.js → UnderlineTabs-Uxn-R3MT.js} +2 -2
  31. package/dist/animated-digit.js +2 -2
  32. package/dist/api/index.d.ts +4 -2
  33. package/dist/api.js +1 -1
  34. package/dist/aurora.js +753 -359
  35. package/dist/{badge-Cl6JZ1B7.js → badge-DHQrc_GQ.js} +13 -9
  36. package/dist/badge.js +1 -1
  37. package/dist/{button-BcMzVrqs.js → button-CAywcrhO.js} +6 -3
  38. package/dist/button.js +1 -1
  39. package/dist/canvas.d.ts +1 -0
  40. package/dist/canvas.js +3 -0
  41. package/dist/card.js +2 -2
  42. package/dist/carousel.js +110 -109
  43. package/dist/{check-CdkxGxXJ.js → check-BBKKKSTf.js} +1 -1
  44. package/dist/{chevron-down-pBY8sYfV.js → chevron-down-BSkTP2aL.js} +1 -1
  45. package/dist/{chevron-right-BjeKC22V.js → chevron-right-sDM0Yvrf.js} +1 -1
  46. package/dist/{chevron-up-DBeNHUm1.js → chevron-up-CCOD_FTz.js} +1 -1
  47. package/dist/collapsible.js +1 -1
  48. package/dist/color-DMLTunJK.js +84 -0
  49. package/dist/color.js +2 -2
  50. package/dist/command.js +1 -1
  51. package/dist/compile-BBTRjvQS.js +158 -0
  52. package/dist/components/custom/aurora/Aurora.vue.d.ts +1 -0
  53. package/dist/components/custom/aurora/composables/atoms.d.ts +125 -0
  54. package/dist/components/custom/aurora/composables/color.d.ts +7 -25
  55. package/dist/components/custom/aurora/composables/cursorModel.d.ts +35 -2
  56. package/dist/components/custom/aurora/composables/glSetup.d.ts +1 -1
  57. package/dist/components/custom/aurora/composables/gpuRuntime.d.ts +16 -0
  58. package/dist/components/custom/aurora/composables/runtime.d.ts +18 -0
  59. package/dist/components/custom/aurora/composables/uniformBridge.d.ts +46 -12
  60. package/dist/components/custom/aurora/composables/useAurora.d.ts +6 -0
  61. package/dist/components/custom/aurora/composables/useCursorInteraction.d.ts +8 -0
  62. package/dist/components/custom/aurora/constants/presets.d.ts +60 -4
  63. package/dist/components/custom/aurora/constants/renderMode.d.ts +32 -0
  64. package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +7 -0
  65. package/dist/components/custom/aurora/constants/shaders/brush.glsl.d.ts +1 -1
  66. package/dist/components/custom/aurora/constants/shaders/composition.glsl.d.ts +1 -1
  67. package/dist/components/custom/aurora/constants/shaders/flow.glsl.d.ts +1 -1
  68. package/dist/components/custom/aurora/constants/shaders/mediums.glsl.d.ts +2 -2
  69. package/dist/components/custom/aurora/constants/shaders/painterly.wgsl.d.ts +7 -0
  70. package/dist/components/custom/aurora/constants/shaders/wake.wgsl.d.ts +4 -0
  71. package/dist/components/custom/aurora/index.d.ts +4 -3
  72. package/dist/components/custom/constellation/Constellation.vue.d.ts +40 -5
  73. package/dist/components/custom/constellation/constellationField.d.ts +110 -5
  74. package/dist/components/custom/constellation/index.d.ts +2 -2
  75. package/dist/components/custom/dock/GlassDock.vue.d.ts +12 -4
  76. package/dist/components/custom/dock/composables/dockMorphContext.d.ts +57 -0
  77. package/dist/components/custom/dock/composables/index.d.ts +3 -0
  78. package/dist/components/custom/dock/composables/useDockHold.d.ts +61 -0
  79. package/dist/components/custom/dock/composables/useLayerTransition.d.ts +13 -59
  80. package/dist/components/custom/dock/index.d.ts +2 -0
  81. package/dist/components/custom/fourier-field/FourierField.vue.d.ts +38 -0
  82. package/dist/components/custom/fourier-field/index.d.ts +2 -0
  83. package/dist/components/custom/fourier-field/math.d.ts +57 -0
  84. package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +15 -0
  85. package/dist/components/custom/goo-blob/composables/useBlobMood.d.ts +18 -2
  86. package/dist/components/custom/goo-blob/composables/useBlobPointer.d.ts +47 -4
  87. package/dist/components/custom/goo-blob/composables/useBlobSatellites.d.ts +2 -0
  88. package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +19 -4
  89. package/dist/components/custom/goo-blob/index.d.ts +1 -1
  90. package/dist/components/custom/goo-blob/shaders/sdf-body.glsl.d.ts +1 -1
  91. package/dist/components/custom/goo-blob/shaders/watercolor-edges.glsl.d.ts +2 -2
  92. package/dist/components/custom/goo-blob/types.d.ts +48 -0
  93. package/dist/components/custom/metric-cell/MetricCell.vue.d.ts +1 -1
  94. package/dist/components/custom/metric-stack/MetricStack.vue.d.ts +1 -1
  95. package/dist/components/ui/_shared/ModalOverlay.vue.d.ts +1 -1
  96. package/dist/components/ui/alert/index.d.ts +1 -1
  97. package/dist/components/ui/card/Card.vue.d.ts +26 -3
  98. package/dist/components/ui/card/CardAction.vue.d.ts +24 -0
  99. package/dist/components/ui/card/index.d.ts +2 -1
  100. package/dist/components/ui/collapsible/CollapsibleTrigger.vue.d.ts +5 -1
  101. package/dist/components/ui/progress/ProgressDefault.vue.d.ts +14 -4
  102. package/dist/components/ui/slider/Slider.vue.d.ts +3 -1
  103. package/dist/components/ui/tabs/TabsList.vue.d.ts +13 -3
  104. package/dist/components/ui/toast/Toast.vue.d.ts +5 -5
  105. package/dist/components/ui/toast/use-toast.d.ts +1 -1
  106. package/dist/composables/color/index.d.ts +69 -0
  107. package/dist/composables/dom/index.d.ts +1 -1
  108. package/dist/composables/dom/useResolveTokenColor.d.ts +27 -0
  109. package/dist/composables/glass/canvas2d/index.d.ts +2 -1
  110. package/dist/composables/glass/canvas2d/resolveCanvasColor.d.ts +20 -0
  111. package/dist/composables/glass/canvas2d/useCanvas2D.d.ts +15 -1
  112. package/dist/composables/glass/createGPUCanvas.d.ts +40 -0
  113. package/dist/composables/glass/index.d.ts +3 -1
  114. package/dist/composables/glass/useSpecularTracking.d.ts +33 -0
  115. package/dist/composables/glass/webgl/createCanvasLifecycle.d.ts +45 -0
  116. package/dist/composables/glass/webgl/shaders/procedural-color.glsl.d.ts +7 -0
  117. package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +5 -5
  118. package/dist/composables/motion/core/index.d.ts +1 -0
  119. package/dist/configurator.js +1 -1
  120. package/dist/confirm-dialog.js +3 -3
  121. package/dist/constellation.js +144 -75
  122. package/dist/context-menu.js +2 -2
  123. package/dist/controls.js +2 -2
  124. package/dist/dark.js +1 -1
  125. package/dist/data-table.js +1 -1
  126. package/dist/deck-progress.d.ts +1 -0
  127. package/dist/deck-progress.js +2 -0
  128. package/dist/dialog.js +2 -2
  129. package/dist/disco-glyph.js +1 -1
  130. package/dist/dock.js +388 -287
  131. package/dist/{dockContext-spUj_-E5.js → dockContext-BKeIMmNk.js} +1 -1
  132. package/dist/dom.js +6 -6
  133. package/dist/{dropdown-menu-EFjl5iKo.js → dropdown-menu-B_4bWyyG.js} +5 -5
  134. package/dist/dropdown-menu.js +1 -1
  135. package/dist/expandable-container.js +2 -2
  136. package/dist/fonts/README.md +26 -18
  137. package/dist/forms.js +10 -7
  138. package/dist/fourier-field.d.ts +1 -0
  139. package/dist/fourier-field.js +166 -0
  140. package/dist/glass-carousel.js +12 -7
  141. package/dist/glass-panel.js +7 -7
  142. package/dist/glass-ui.css +1 -1
  143. package/dist/glass-ui.js +209 -206
  144. package/dist/glyph-face.js +2 -2
  145. package/dist/goo-blob.js +485 -300
  146. package/dist/header-ribbon.js +1 -1
  147. package/dist/hover-card.js +1 -1
  148. package/dist/hover-popover.js +1 -1
  149. package/dist/icon-tooltip.js +1 -1
  150. package/dist/index.d.ts +1 -0
  151. package/dist/instrument-chassis.js +1 -1
  152. package/dist/instrument-rail.js +1 -1
  153. package/dist/keyboard.js +1 -1
  154. package/dist/{keys-BFoma9vm.js → keys-BsYjEFOW.js} +1 -1
  155. package/dist/label.js +1 -1
  156. package/dist/labeled-field.js +6 -6
  157. package/dist/metric-badge.js +1 -1
  158. package/dist/metric-stack.js +1 -1
  159. package/dist/{minimize-2-BP27-qBY.js → minimize-2-lcXOuc6V.js} +1 -1
  160. package/dist/motion-core.js +68 -98
  161. package/dist/motion.js +3 -3
  162. package/dist/notification.js +1 -1
  163. package/dist/number-field.js +1 -1
  164. package/dist/paper-backdrop.js +1 -1
  165. package/dist/popover.js +1 -1
  166. package/dist/progress.js +1 -1
  167. package/dist/pulse.js +1 -1
  168. package/dist/reactive.js +2 -2
  169. package/dist/resolveCanvasColor-BBiYfp8g.js +11 -0
  170. package/dist/responsive-tabs.js +2 -2
  171. package/dist/scrolling-text.js +1 -1
  172. package/dist/{search-DBG8qaRs.js → search-nbkvr2dC.js} +1 -1
  173. package/dist/search.js +12 -12
  174. package/dist/select.js +3 -3
  175. package/dist/separator.js +1 -1
  176. package/dist/{sheet-CQYYrkr9.js → sheet-VZEtNFvO.js} +4 -4
  177. package/dist/sheet.js +1 -1
  178. package/dist/slider-D9puf-Ko.js +142 -0
  179. package/dist/slider.js +1 -1
  180. package/dist/sortable-list.js +3 -3
  181. package/dist/styles/components.css +1 -1
  182. package/dist/styles/dock-controls.css +21 -18
  183. package/dist/styles/dock.css +415 -224
  184. package/dist/styles/fonts.css +0 -25
  185. package/dist/styles/glass.css +100 -41
  186. package/dist/styles/theme.css +58 -2
  187. package/dist/styles/tokens.css +139 -32
  188. package/dist/styles/typography.css +55 -72
  189. package/dist/styles/utilities.css +19 -14
  190. package/dist/styles/view-transition.css +12 -40
  191. package/dist/supportsCssTimeline-C5oe0lnD.js +12 -0
  192. package/dist/switch.js +1 -1
  193. package/dist/tabs.js +5 -5
  194. package/dist/timeline.js +3 -3
  195. package/dist/toast.js +1 -1
  196. package/dist/toggle-group.js +1 -1
  197. package/dist/tooltip.js +1 -1
  198. package/dist/typewriter.js +1 -1
  199. package/dist/{useAnimatedNumber-DfVgP4te.js → useAnimatedNumber-C_3wZLx4.js} +1 -1
  200. package/dist/{useCanvas2D-BeNJqqIS.js → useCanvas2D-ClrQuZtp.js} +2 -1
  201. package/dist/{useConfiguratorState-DUtC1jxr.js → useConfiguratorState-CMff4GzH.js} +5 -5
  202. package/dist/useResolveTokenColor-r9pnNjqK.js +24 -0
  203. package/dist/useScrollProgress-C9ysDic5.js +35 -0
  204. package/dist/useSpecularTracking-BVRZsRHA.js +26 -0
  205. package/dist/{useTextHighlight-Dmtofpk2.js → useTextHighlight-9nMW23Qb.js} +1 -1
  206. package/dist/{useTouchGate-CS5Csc2h.js → useTouchGate-WFyJYsth.js} +1 -1
  207. package/dist/vReveal-CqaCz_mC.js +44 -0
  208. package/dist/watercolor-dot.js +2 -2
  209. package/dist/{x-C4pz9nbD.js → x-Dfsegz9Y.js} +1 -1
  210. package/package.json +64 -4
  211. package/src/fonts/README.md +26 -18
  212. package/src/styles/dock-controls.css +21 -18
  213. package/src/styles/dock.css +415 -224
  214. package/src/styles/fonts.css +0 -25
  215. package/src/styles/glass.css +100 -41
  216. package/src/styles/theme.css +58 -2
  217. package/src/styles/tokens.css +139 -32
  218. package/src/styles/typography.css +55 -72
  219. package/src/styles/utilities.css +19 -14
  220. package/src/styles/view-transition.css +12 -40
  221. package/dist/CardFooter-C390imy7.js +0 -129
  222. package/dist/CollapsibleContent-cauTbZEM.js +0 -52
  223. package/dist/TabsIndicator-DA0x9gPr.js +0 -97
  224. package/dist/color-DS-iLRVM.js +0 -33
  225. package/dist/compile-C62K_FpC.js +0 -106
  226. package/dist/fonts/fraunces/fraunces-latin.woff2 +0 -0
  227. package/dist/slider-CgNzRSh6.js +0 -129
  228. package/dist/useViewTransition-DI0Rs2rV.js +0 -21
  229. package/dist/vReveal-u2wSG2El.js +0 -35
  230. package/src/fonts/fraunces/fraunces-latin.woff2 +0 -0
  231. /package/dist/{InstrumentChassis-DaHIZCqy.js → InstrumentChassis-C2f6cBaQ.js} +0 -0
  232. /package/dist/{InstrumentRail-B0qqLFN0.js → InstrumentRail-CUJ05YVG.js} +0 -0
  233. /package/dist/{ModalOverlay-B_CBtqcE.js → ModalOverlay-B1GkAjNb.js} +0 -0
  234. /package/dist/{PaperBackdrop-D_YZW47j.js → PaperBackdrop-CqwjnfLv.js} +0 -0
  235. /package/dist/{SelectGroup-CMdoCjRE.js → SelectGroup-BFiod7X2.js} +0 -0
  236. /package/dist/{SelectSeparator-CaJnPF3_.js → SelectSeparator-L8pPEn4L.js} +0 -0
  237. /package/dist/{_plugin-vue_export-helper-C1je1s0u.js → _plugin-vue_export-helper-ok8pgSl5.js} +0 -0
  238. /package/dist/composables/{dom → motion}/useTextHighlight.d.ts +0 -0
  239. /package/dist/{constants-C8NMonuo.js → constants-BPOqYJAm.js} +0 -0
  240. /package/dist/{createContext-DBMGRlx4.js → createContext-B44Sah_H.js} +0 -0
  241. /package/dist/{createLucideIcon-DuDoe_ra.js → createLucideIcon-B6uNAU9G.js} +0 -0
  242. /package/dist/{menuItemVariants-C2QlXqT3.js → menuItemVariants-DKM85SNE.js} +0 -0
  243. /package/dist/{presets-Dyv9Zl7W.js → presets-D1XPuTj-.js} +0 -0
  244. /package/dist/{prng-CjVgzjQT.js → prng-COGhh02-.js} +0 -0
  245. /package/dist/{useGlassRenderer-Dn3WpfG-.js → useGlassRenderer-5I0YkI4t.js} +0 -0
  246. /package/dist/{useGlobalDark-D7R9OypB.js → useGlobalDark-D3EBWzXK.js} +0 -0
  247. /package/dist/{useIntersectionPause-DsQYGc8V.js → useIntersectionPause-Bj4sPkMh.js} +0 -0
  248. /package/dist/{useInterval-CHVYFpXV.js → useInterval-CcLfq2WU.js} +0 -0
  249. /package/dist/{useKeyboardShortcuts-i8tHd5WO.js → useKeyboardShortcuts-BXWXOZ-9.js} +0 -0
  250. /package/dist/{useResizeObserver-DX-STszm.js → useResizeObserver-CWCbk5Px.js} +0 -0
  251. /package/dist/{useSortable-muI29agz.js → useSortable-MGAbCGVJ.js} +0 -0
  252. /package/dist/{useSpringMount-CnizvZGm.js → useSpringMount-BJSHcLl3.js} +0 -0
  253. /package/dist/{useTimer-DGgoxTXL.js → useTimer-3xqf_54b.js} +0 -0
  254. /package/dist/{useUserInvalidAria-DmvZ_6Dx.js → useUserInvalidAria-DoJKMZ3s.js} +0 -0
  255. /package/dist/{useViewportReady-Dcvf0c4p.js → useViewportReady-RIr5Wgkh.js} +0 -0
@@ -33,21 +33,24 @@
33
33
  accent-color: var(--accent-color);
34
34
 
35
35
  /* ═══════════════════════════════════════════════
36
- §0 THEME BRIDGE FALLBACKS
37
-
38
- theme.css uses these non-Tailwind names to register v4 utility
39
- namespaces without self-referential @theme variables. The public
40
- runtime tokens remain --font-*, --leading-*, and --tracking-* in
41
- typography.css.
42
- ═══════════════════════════════════════════════ */
43
- --font-stack-display: "Fraunces", Georgia, serif;
44
- --font-stack-serif: "Fraunces", Georgia, "Times New Roman", serif;
45
- --font-stack-sans: "Helvetica Neue", "Arial Nova", Arial, system-ui, sans-serif;
46
- /* AC.W6b (v1.5.0) — self-hosted Fira Code engages by default for
47
- every glass-ui consumer. The calibrated "Fira Code Fallback"
48
- face (declared in typography.css) wraps the system mono stack
49
- with metric overrides so the `font-display: swap` window is
50
- geometry-neutral. */
36
+ §0 FONT TOKEN SOURCE-OF-TRUTH
37
+
38
+ The single authoritative declaration of the library's font register.
39
+ theme.css bridges each --font-stack-* to its Tailwind --font-* namespace
40
+ var; typography.css consumes the bridged --font-* names. The public
41
+ runtime knobs remain --font-*, --leading-*, --tracking-*.
42
+
43
+ ONE brand register: Plus Jakarta Sans (text + display) + Fira Code (mono).
44
+ --font-stack-text drives the body/heading/prose/display register — the
45
+ library DEFAULT is the register every live surface paints (the demo +
46
+ speedtest render Plus Jakarta everywhere). The calibrated "Plus Jakarta
47
+ Sans Fallback" / "Fira Code Fallback" faces (declared in typography.css)
48
+ wrap the system stacks with Capsize metric overrides so the swap window
49
+ is geometry-neutral (zero CLS). --font-stack-display aliases the text
50
+ register: there is no separate display-serif voice. */
51
+ --font-stack-text: "Plus Jakarta Sans", "Plus Jakarta Sans Fallback", system-ui, sans-serif;
52
+ --font-stack-display: var(--font-stack-text);
53
+ --font-stack-sans: var(--font-stack-text);
51
54
  --font-stack-mono: "Fira Code", "Fira Code Fallback", "Fira Mono", monospace;
52
55
 
53
56
  --type-leading-micro: 1.2;
@@ -175,10 +178,8 @@
175
178
 
176
179
  /* Apple-inspired — micro-interactions, switches, dock hover */
177
180
  --motion-ease-apple: cubic-bezier(0.25, 0.1, 0.25, 1);
178
- --motion-ease-apple-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
179
181
 
180
182
  --ease-apple: var(--motion-ease-apple);
181
- --ease-apple-spring: var(--motion-ease-apple-spring);
182
183
  --ease-spring: var(--spring-snappy);
183
184
  --ease-decelerate: var(--ease-out);
184
185
  --ease-accelerate: var(--ease-in);
@@ -418,6 +419,46 @@
418
419
  --muted-soft: color-mix(in srgb, var(--muted) 30%, transparent);
419
420
  --muted-medium: color-mix(in srgb, var(--muted) 50%, transparent);
420
421
 
422
+ /* ═══════════════════════════════════════════════
423
+ §5c CONSTELLATION — Canvas2D proximity-graph lattice (AX.W17)
424
+
425
+ The H.W4 legibility intelligence promoted from the slides deck to
426
+ LIBRARY identity: the node tones, the edge hairline color, the per-mode
427
+ edge-alpha multipliers, and the field-yields-to-type translucency knob.
428
+ Only `--constellation-accent` (the anomaly tint) stays a CONSUMER preset
429
+ (slides aliases it to `--ncsu-red`); the library ships a neutral default.
430
+
431
+ PLAIN-hsl LITERALS, per arm — NEVER `light-dark()` and NEVER a
432
+ `var(--neutral-*)`/`var(--foreground)`/`var(--border)`/`var(--card)`
433
+ alias. Canvas2D silently REJECTS a `light-dark()` value into
434
+ `strokeStyle`/`fillStyle` (the W30 86.3%-red-splatter cardinal defect),
435
+ and the rejection is identical whether the value is a literal
436
+ `light-dark(…)` OR a `var()` that RESOLVES to one — so the constellation
437
+ tokens are plain-hsl LEAVES, the `:root` vs `.dark` cascade carrying two
438
+ literals. `proof:constellation-tokens` clause (c) machine-locks this
439
+ (the no-`light-dark(`-substring NOR transitive-`var()` static assertion).
440
+ ═══════════════════════════════════════════════ */
441
+ /* Node tones — readable on the warm-cream ground. The two-tone split (the
442
+ `dim` half rides `-node-dim`). Warm-grey ink, NOT a neutral-ladder alias. */
443
+ --constellation-node: hsl(36 8% 46%);
444
+ --constellation-node-dim: hsl(36 8% 60%);
445
+ /* Edge hairline stroke — warm near-black on cream (the plain-hsl complement
446
+ the slides deck reads to fix the `--foreground` light-dark() leak). */
447
+ --constellation-line: hsl(24 14% 14%);
448
+ /* Anomaly tint — NEUTRAL library default (a desaturated warm accent). The
449
+ consumer overrides this (slides → `--ncsu-red`); the library does NOT
450
+ bake a brand hue. This is the single consumer-preset boundary. */
451
+ --constellation-accent: hsl(18 58% 46%);
452
+ /* Edge-alpha multipliers — replace the magic `0.17` hairline / pointer-web
453
+ literals. The cream ground lifts the node tones, so the field can recede;
454
+ the focus-proximity edge reads a touch stronger. */
455
+ --constellation-edge-alpha: 0.22;
456
+ --constellation-edge-focus-alpha: 0.34;
457
+ /* §7 field-yields-to-type translucency knob — the legible-but-RECESSIVE
458
+ MIDPOINT, NOT max-legibility. On cream the node tones already read, so the
459
+ field recedes further: BELOW the slides 0.92 max-legibility reference. */
460
+ --constellation-alpha: 0.80;
461
+
421
462
  /* ═══════════════════════════════════════════════
422
463
  §6 SECTION PALETTE — 13-stop jewel tones (light)
423
464
  ═══════════════════════════════════════════════ */
@@ -535,6 +576,22 @@
535
576
  --dock-shadow: var(--shadow-dock);
536
577
  --dock-shadow-collapsed: var(--shadow-dock-collapsed);
537
578
 
579
+ /* AX.W04 F1 — the wrap/card-tier dock shadow. A wrapped multi-row dock (and
580
+ any finite-radius card silhouette) is a THICKER material than a flat thin
581
+ pill — WWDC25 §219 "material thickens as glass flexes larger". So when the
582
+ wrap dock expands it lifts its elevation onto the FLOATING-tier shadow
583
+ stack (the `--glass-shadow-floating` family — `--shadow-xl` + the
584
+ `--glass-material-rim` hairline + the `--glass-under-shadow-vivid` under-cast)
585
+ rather than carrying the flat `--shadow-dock` glow of a 40px pill. Composed
586
+ on `:root` as ONE consumer-overridable token (per the cartoon-shadow
587
+ override contract — override on the cascade, never a dead local). The dock
588
+ reads it via `calc()`-on-`--dock-expand-t` so the lift glides in lockstep
589
+ with the pill→card radius morph (ONE clock, ONE register). */
590
+ --glass-material-rim: 0 0 0 0.5px color-mix(in srgb, var(--shadow-color) 5%, transparent);
591
+ --shadow-dock-wrap: var(--shadow-xl),
592
+ var(--glass-material-rim),
593
+ var(--glass-under-shadow-vivid);
594
+
538
595
  /* Cartoon shadow color primitives (kept for tiered cartoon utilities) */
539
596
  --shadow-cartoon-color: rgb(0 0 0 / 0.12);
540
597
  --shadow-cartoon-color-soft: rgb(0 0 0 / 0.06);
@@ -866,18 +923,16 @@
866
923
  than cliffs. Defaults clamp to 80vw / 80vh capped at sensible
867
924
  desktop widths; consumers override per-dock by setting either
868
925
  token directly on a `.glass-dock` instance. User findings 1 + 5a. */
926
+ /* AX.W04 — `--dock-max-inline-size` is the canonical inline cap EVERY overflow
927
+ strategy reads: `overflow="scroll"` scrolls past it, and `overflow="wrap"`
928
+ wraps to N rows on the over-cap crossing (the dock shrink-wraps to content,
929
+ `max-inline-size` caps that intrinsic width at this token). The prior
930
+ `--dock-overflow-bp: 640px` viewport-breakpoint token (the magic-640
931
+ snap-back) is DELETED — the wrap is content-driven, not viewport-coupled, so
932
+ there is no breakpoint threshold to name. */
869
933
  --dock-max-inline-size: min(80vw, 64rem);
870
934
  --dock-max-block-size: min(80vh, 48rem);
871
935
 
872
- /* AT.W7-dock-a — the `overflow="wrap"` desktop snap-back breakpoint, named
873
- once. Below this viewport width a wrap-mode dock reads as a multi-row pill
874
- that narrows to the viewport gutter; at/above it the pill snaps back to a
875
- single nowrap row. The single source-of-record for the threshold the
876
- `@media` in dock.css realizes (a `var()` cannot drive a media-query
877
- feature in Baseline CSS, so the MQ carries the literal value of THIS
878
- token; consumers reading the breakpoint do so through this name). */
879
- --dock-overflow-bp: 640px;
880
-
881
936
  /* AB.W1.T1 — chassis max-block-size guardrail.
882
937
  Maximum block size a centred consumer-app card may consume while
883
938
  preserving the inline dock footprint. The recipe subtracts the
@@ -1300,12 +1355,14 @@
1300
1355
  --top-layer-backdrop-dim: 0.5;
1301
1356
 
1302
1357
  --vt-duration: var(--duration-normal);
1303
- /* AV.W3 C2 — the spring-coverage sweep: every spring-flavored transition
1304
- reads a `--spring-*` token. `--ease-apple-spring`'s +27.5% overshoot maps
1305
- to `--spring-bouncy` (the closest `linear()` overshoot stop-set), so the
1306
- VT default and the cards/top-layer transitions share one spring primitive
1307
- (CPU + GPU sample the same curve). The apple-spring cubic-bezier survives
1308
- as a token DEFINITION only (a `@supports not (linear())` fallback seed). */
1358
+ /* AX.W05 — ONE iOS-spring vocabulary: every spring-flavored transition reads
1359
+ a governed `--spring-*` register. The legacy apple-spring cubic-bezier
1360
+ (+27.5% overshoot) was a SECOND authority beside the regen `--spring-*`
1361
+ cohort; it is EXCISED. Its emphatic-overshoot register maps to the playful
1362
+ `--spring-bouncy` (the closest `linear()` overshoot stop-set), so the VT
1363
+ default + the cards/top-layer transitions share one spring primitive
1364
+ (CPU + GPU sample the same curve). No cubic-bezier fallback seed survives —
1365
+ the `linear()` spring degrades to `ease` where `linear()` is unsupported. */
1309
1366
  --vt-ease: var(--spring-bouncy);
1310
1367
  --vt-rise: 8px;
1311
1368
 
@@ -1589,6 +1646,25 @@
1589
1646
  --shadow-cartoon-color: rgb(255 255 255 / 0.07);
1590
1647
  --shadow-cartoon-color-soft: rgb(255 255 255 / 0.03);
1591
1648
 
1649
+ /* §5c CONSTELLATION — dark arm (AX.W17). The H.W4 dark-mode lift: the node
1650
+ tones step UP off the ink ground (the light arm's mid-grey would vanish on
1651
+ L6 black), the hairline goes warm off-white, the field carries a touch more
1652
+ presence to read at all. PLAIN-hsl literals, NEVER light-dark()/var(). */
1653
+ --constellation-node: hsl(42 9% 72%);
1654
+ --constellation-node-dim: hsl(42 8% 56%);
1655
+ --constellation-line: hsl(45 12% 86%);
1656
+ /* Anomaly — brightened for the deep canvas (same neutral-default register;
1657
+ the consumer still overrides to its brand). */
1658
+ --constellation-accent: hsl(20 70% 60%);
1659
+ /* The dark hairlines lift harder over the ink ground, so the edge multipliers
1660
+ run a touch lower than light to keep the field recessive. */
1661
+ --constellation-edge-alpha: 0.20;
1662
+ --constellation-edge-focus-alpha: 0.32;
1663
+ /* §7 — the ink ground needs MORE field presence than cream to read at all, so
1664
+ the dark alpha is modestly HIGHER than the light arm — but still BELOW the
1665
+ slides 1.0 max-legibility reference (the recessive midpoint, not 1.0). */
1666
+ --constellation-alpha: 0.88;
1667
+
1592
1668
  /* Glass opacity + grain for dark — five-tier ladder, alpha-monotonic.
1593
1669
  Each rung lifts ~0.08 from its light counterpart so the dark surfaces
1594
1670
  carry comparable read-weight against the deeper canvas. */
@@ -1726,3 +1802,34 @@
1726
1802
  inherits: false;
1727
1803
  initial-value: 0;
1728
1804
  }
1805
+
1806
+ /* ── The specular-intensity magnitude cohort (AX.W09) ──────────────────────
1807
+ The catch-light alpha multiplier at each interaction state, as a SINGLE
1808
+ overridable token cohort (was three buried literals across glass.css —
1809
+ `0.35` rest floor / `0.6` hover / `0.85` active — and the `.dark` arm's
1810
+ `0.22`). `glass.css`'s `.glass-material::before` rest/hover/active rules READ
1811
+ these, so the subtle-vs-extreme magnitude is a knob a consumer (or the dark
1812
+ arm) retunes ON THE CASCADE — never a re-buried literal. Override on `:root`
1813
+ to retune library-wide; the cartoon-shadow override contract is the precedent.
1814
+
1815
+ Re-baselined to a SUBTLE ladder (≈ half the retired `0.35/0.6/0.85`):
1816
+ • rest 0 — static, unwired surfaces are CLEAN; the catch-light wakes
1817
+ only on hover/active or on a pointer-wired surface. This
1818
+ aligns the painted rest behaviour with the @property
1819
+ `--specular-intensity { initial-value: 0 }` dormancy the
1820
+ prior unconditional `0.35` floor defeated.
1821
+ • hover 0.22 — a subtle warm-cream lens, not a flash.
1822
+ • active 0.32 — the press whisper; ≈ 0.22α × the warm-cream core, a lens
1823
+ not the prior ≈ 0.47 pure-white-screen hotspot. */
1824
+ :root {
1825
+ --glass-specular-intensity-rest: 0;
1826
+ --glass-specular-intensity-hover: 0.22;
1827
+ --glass-specular-intensity-active: 0.32;
1828
+ }
1829
+
1830
+ /* Over the deep canvas the `screen` blend lifts harder, so the dark arm runs a
1831
+ touch softer on the interaction rungs (rest already 0). */
1832
+ .dark {
1833
+ --glass-specular-intensity-hover: 0.18;
1834
+ --glass-specular-intensity-active: 0.26;
1835
+ }
@@ -1,22 +1,25 @@
1
1
  /*
2
- * typography.css — Fraunces serif/display + Plus Jakarta Sans + Fira Code mono
3
- * (all three OFL faces self-hosted via fonts.css)
2
+ * typography.css — Plus Jakarta Sans (text + display) + Fira Code (mono)
3
+ * (both OFL faces self-hosted via fonts.css)
4
4
  *
5
- * Golden-ratio scale (√φ ≈ 1.272). Fraunces carries the serif register —
6
- * body, headings, prose, and math — and the ornamental display register
7
- * with WONK=1 / SOFT=0. Plus Jakarta Sans is the brand sans; Fira Code is mono.
5
+ * Golden-ratio scale (√φ ≈ 1.272). ONE brand register: Plus Jakarta Sans
6
+ * carries the text register — body, headings, prose, display, and math — and
7
+ * Fira Code carries mono. The library DEFAULT is the register every live
8
+ * surface paints (the demo + speedtest render Plus Jakarta everywhere). There
9
+ * is no display-serif voice and no preset opt-out: the default IS the register.
8
10
  *
9
11
  * Semantic type classes expose both Tailwind-friendly utility names
10
12
  * (`.text-display-*`, `.text-body`, `.text-admin-label`) and feature
11
13
  * utilities (`.cm-serif`, `.fira-code`, `.fourier-f`).
12
14
  *
13
15
  * Self-host font subsystem — glass-ui ships two OFL-1.1 face families as
14
- * bundled woff2 assets: Plus Jakarta Sans (brand display sans, font-display:
16
+ * bundled woff2 assets: Plus Jakarta Sans (brand text + display, font-display:
15
17
  * optional) + Fira Code (canonical mono, font-display: swap). Both ship with
16
18
  * Capsize-calibrated size-adjust / ascent-override / descent-override on the
17
- * matching fallback faces so the swap is geometry-neutral (zero CLS). Consumers
18
- * map --font-brand-sans / --font-display / --font-mono to reference them, no
19
- * third-party CDN dependency on the LCP-critical path.
19
+ * matching fallback faces so the swap is geometry-neutral (zero CLS). The
20
+ * register lives in tokens.css §0 (--font-stack-text/-display/-mono), bridged
21
+ * to --font-text/-display/-mono in theme.css; consumers override --font-text
22
+ * once to rebrand, no third-party CDN dependency on the LCP-critical path.
20
23
  */
21
24
 
22
25
  /* ═══════════════════════════════════════════════
@@ -82,21 +85,15 @@
82
85
  }
83
86
 
84
87
  :root {
85
- /* Font family tokens. `--font-serif` / `--font-display` / `--font-mono`
86
- are NOT declared here — their source-of-truth lives in tokens.css
87
- (`--font-stack-*`), bridged to Tailwind via theme.css's `@theme` block;
88
- declaring `:root` literals here would shadow consumer `@theme` overrides
89
- (un-layered `:root` wins over `@layer theme`). The self-hosted faces
90
- above expose `"Plus Jakarta Sans"` + `"Fira Code"`, each pairing with a
91
- calibrated `"... Fallback"`. `--font-brand-sans` ships a neutral default;
92
- consumers opting into Plus Jakarta via the `brand-uniform-sans` preset
93
- override it. `--font-mono` references `"Fira Code"` first (engages by
94
- default) then the fallback chain. */
95
- /* Independent brand/system sans stack; consumers override once for uniform sans. */
96
- --font-brand-sans: "Helvetica Neue", "Arial Nova", Arial, system-ui, sans-serif;
97
- --font-sans: var(--font-brand-sans);
98
- --font-display-variation-settings: "WONK" 1, "SOFT" 0;
99
- --font-display-weight: 400;
88
+ /* Font family tokens. `--font-text` / `--font-display` / `--font-serif` /
89
+ `--font-mono` are NOT declared here — their source-of-truth lives in
90
+ tokens.css §0 (`--font-stack-*`), bridged to Tailwind via theme.css's
91
+ `@theme` block; declaring `:root` literals here would shadow consumer
92
+ `@theme` overrides (un-layered `:root` wins over `@layer theme`). The
93
+ self-hosted faces above expose `"Plus Jakarta Sans"` + `"Fira Code"`,
94
+ each pairing with a calibrated `"... Fallback"`. The brand text register
95
+ (Plus Jakarta Sans) engages by default for every consumer; --font-mono
96
+ references `"Fira Code"` first then the fallback chain. */
100
97
 
101
98
  /* Scale tokens */
102
99
  --type-admin-label: 0.625rem; /* 10px */
@@ -116,8 +113,7 @@
116
113
  /* Audacious display tier (v1.0.3). Extends the φ-ladder three rungs
117
114
  beyond display-5 for poster-type consumers (speedtest hero,
118
115
  dashboard pane titles when the consumer wants the number to win).
119
- Same vw-axis as display-1..5 — consumer-agnostic. Brand-uniform-
120
- sans preset still overrides via the existing :root override. */
116
+ Same vw-axis as display-1..5 — consumer-agnostic. */
121
117
  --type-display-mega: clamp(5.382rem, 4rem + 9vw, 11.089rem); /* φ^(9/2) — peak 177px */
122
118
  --type-display-hero: clamp(6.854rem, 4.5rem + 12vw, 17.942rem); /* φ^5 — peak 287px */
123
119
  --type-display-audacious: clamp(8.728rem, 5rem + 16vw, 22rem); /* φ^(11/2) — peak 352px (fast.com peg) */
@@ -129,25 +125,18 @@
129
125
  were retired in v0.8.6 (audit U.W0.C-c §1.1 / Union 2). */
130
126
  }
131
127
 
132
- :root[data-typography-preset="brand-uniform-sans"] {
133
- --font-serif: var(--font-brand-sans);
134
- --font-display: var(--font-brand-sans);
135
- --font-display-variation-settings: normal;
136
- --font-display-weight: 600;
137
- }
138
-
139
128
  /* ═══════════════════════════════════════════════
140
- BODY CASCADE — CM serif inherits globally
129
+ BODY CASCADE — the brand text register inherits globally
141
130
  ═══════════════════════════════════════════════ */
142
131
  body {
143
- font-family: var(--font-serif);
132
+ font-family: var(--font-text);
144
133
  color: var(--foreground);
145
134
  font-size: var(--type-body);
146
135
  line-height: var(--type-leading-body);
147
136
  }
148
137
 
149
138
  /* ═══════════════════════════════════════════════
150
- DISPLAY — Fraunces, WONK=1 SOFT=0, tracking-tight
139
+ DISPLAY — Plus Jakarta Sans display, tracking-tight
151
140
  ═══════════════════════════════════════════════ */
152
141
  @utility text-display-audacious {
153
142
  font-family: var(--font-display);
@@ -155,8 +144,7 @@ body {
155
144
  line-height: var(--type-leading-display);
156
145
  letter-spacing: var(--type-tracking-tight);
157
146
  font-optical-sizing: auto;
158
- font-variation-settings: var(--font-display-variation-settings);
159
- font-weight: var(--font-display-weight);
147
+ font-weight: 600;
160
148
  /* AQ.W3 §W3.3 — balance multi-line display headlines. Text-only (no box) so
161
149
  balance is safe; degrades to unbalanced wrapping with zero break. */
162
150
  text-wrap: balance;
@@ -177,7 +165,6 @@ body {
177
165
  font-feature-settings: "ss01", "tnum", "lnum";
178
166
  font-variant-numeric: tabular-nums lining-nums;
179
167
  font-optical-sizing: auto;
180
- font-variation-settings: var(--font-display-variation-settings);
181
168
  display: inline-block;
182
169
  max-inline-size: 100%;
183
170
  /* AQ.W3 §W3.3 — `text-wrap: nowrap` (modern) sits AFTER `white-space:
@@ -193,8 +180,7 @@ body {
193
180
  line-height: var(--type-leading-display);
194
181
  letter-spacing: var(--type-tracking-tight);
195
182
  font-optical-sizing: auto;
196
- font-variation-settings: var(--font-display-variation-settings);
197
- font-weight: var(--font-display-weight);
183
+ font-weight: 600;
198
184
  text-wrap: balance; /* AQ.W3 §W3.3 */
199
185
  }
200
186
 
@@ -204,8 +190,7 @@ body {
204
190
  line-height: var(--type-leading-display);
205
191
  letter-spacing: var(--type-tracking-tight);
206
192
  font-optical-sizing: auto;
207
- font-variation-settings: var(--font-display-variation-settings);
208
- font-weight: var(--font-display-weight);
193
+ font-weight: 600;
209
194
  text-wrap: balance; /* AQ.W3 §W3.3 */
210
195
  }
211
196
 
@@ -215,8 +200,7 @@ body {
215
200
  line-height: var(--type-leading-display);
216
201
  letter-spacing: var(--type-tracking-tight);
217
202
  font-optical-sizing: auto;
218
- font-variation-settings: var(--font-display-variation-settings);
219
- font-weight: var(--font-display-weight);
203
+ font-weight: 600;
220
204
  text-wrap: balance; /* AQ.W3 §W3.3 */
221
205
  }
222
206
 
@@ -226,8 +210,7 @@ body {
226
210
  line-height: var(--type-leading-display);
227
211
  letter-spacing: var(--type-tracking-tight);
228
212
  font-optical-sizing: auto;
229
- font-variation-settings: var(--font-display-variation-settings);
230
- font-weight: var(--font-display-weight);
213
+ font-weight: 600;
231
214
  text-wrap: balance; /* AQ.W3 §W3.3 */
232
215
  }
233
216
 
@@ -237,8 +220,7 @@ body {
237
220
  line-height: var(--type-leading-display);
238
221
  letter-spacing: var(--type-tracking-tight);
239
222
  font-optical-sizing: auto;
240
- font-variation-settings: var(--font-display-variation-settings);
241
- font-weight: var(--font-display-weight);
223
+ font-weight: 600;
242
224
  text-wrap: balance; /* AQ.W3 §W3.3 */
243
225
  }
244
226
 
@@ -248,8 +230,7 @@ body {
248
230
  line-height: var(--type-leading-display);
249
231
  letter-spacing: var(--type-tracking-tight);
250
232
  font-optical-sizing: auto;
251
- font-variation-settings: var(--font-display-variation-settings);
252
- font-weight: var(--font-display-weight);
233
+ font-weight: 600;
253
234
  text-wrap: balance; /* AQ.W3 §W3.3 */
254
235
  }
255
236
 
@@ -259,16 +240,15 @@ body {
259
240
  line-height: var(--type-leading-display);
260
241
  letter-spacing: var(--type-tracking-tight);
261
242
  font-optical-sizing: auto;
262
- font-variation-settings: var(--font-display-variation-settings);
263
- font-weight: var(--font-display-weight);
243
+ font-weight: 600;
264
244
  text-wrap: balance; /* AQ.W3 §W3.3 */
265
245
  }
266
246
 
267
247
  /* ═══════════════════════════════════════════════
268
- HEADINGS / BODY — Fraunces serif register
248
+ HEADINGS / BODY — Plus Jakarta Sans text register
269
249
  ═══════════════════════════════════════════════ */
270
250
  @utility text-title {
271
- font-family: var(--font-serif);
251
+ font-family: var(--font-text);
272
252
  font-size: var(--type-title);
273
253
  line-height: var(--type-leading-heading);
274
254
  letter-spacing: var(--type-tracking-tight);
@@ -277,7 +257,7 @@ body {
277
257
  }
278
258
 
279
259
  @utility text-heading {
280
- font-family: var(--font-serif);
260
+ font-family: var(--font-text);
281
261
  font-size: var(--type-heading);
282
262
  line-height: var(--type-leading-heading);
283
263
  font-weight: 700;
@@ -285,7 +265,7 @@ body {
285
265
  }
286
266
 
287
267
  @utility text-subheading {
288
- font-family: var(--font-serif);
268
+ font-family: var(--font-text);
289
269
  font-size: var(--type-subheading);
290
270
  line-height: var(--type-leading-body);
291
271
  font-weight: 600;
@@ -300,7 +280,7 @@ body {
300
280
  reads heavier than its numeric weight at pill size, so regular is the
301
281
  not-bold register. */
302
282
  @utility dock-label {
303
- font-family: var(--font-serif);
283
+ font-family: var(--font-text);
304
284
  font-size: var(--dock-label-size, var(--type-subheading));
305
285
  line-height: var(--type-leading-body);
306
286
  font-weight: 400;
@@ -308,7 +288,7 @@ body {
308
288
  }
309
289
 
310
290
  @utility text-prose {
311
- font-family: var(--font-serif);
291
+ font-family: var(--font-text);
312
292
  font-size: var(--type-prose);
313
293
  line-height: var(--type-leading-prose);
314
294
  font-weight: 400;
@@ -318,7 +298,7 @@ body {
318
298
  }
319
299
 
320
300
  @utility text-body {
321
- font-family: var(--font-serif);
301
+ font-family: var(--font-text);
322
302
  font-size: var(--type-body);
323
303
  line-height: var(--type-leading-body);
324
304
  font-weight: 400;
@@ -326,14 +306,14 @@ body {
326
306
  }
327
307
 
328
308
  @utility text-small {
329
- font-family: var(--font-serif);
309
+ font-family: var(--font-text);
330
310
  font-size: var(--type-small);
331
311
  line-height: var(--type-leading-small);
332
312
  font-weight: 400;
333
313
  }
334
314
 
335
315
  @utility text-caption {
336
- font-family: var(--font-serif);
316
+ font-family: var(--font-text);
337
317
  font-size: var(--type-caption);
338
318
  line-height: var(--type-leading-caption);
339
319
  font-style: italic;
@@ -358,15 +338,15 @@ body {
358
338
  }
359
339
 
360
340
  /* ═══════════════════════════════════════════════
361
- MATH — Fraunces serif italic
341
+ MATH — Plus Jakarta Sans italic
362
342
  ═══════════════════════════════════════════════ */
363
343
  @utility text-math {
364
- font-family: var(--font-serif);
344
+ font-family: var(--font-text);
365
345
  font-style: italic;
366
346
  }
367
347
 
368
348
  @utility text-math-body {
369
- font-family: var(--font-serif);
349
+ font-family: var(--font-text);
370
350
  font-size: var(--type-prose);
371
351
  line-height: var(--type-leading-prose);
372
352
  font-style: italic;
@@ -406,8 +386,13 @@ body {
406
386
  /* ═══════════════════════════════════════════════
407
387
  FONT FAMILY UTILITIES
408
388
  ═══════════════════════════════════════════════ */
389
+ /* .cm-serif — the Computer-Modern math/serif voice. A DISTINCT face from the
390
+ brand text register: it resolves to the consumer-supplied serif (system
391
+ serif by default; a math consumer maps Computer Modern / KaTeX over it). It
392
+ is NOT the Plus Jakarta text register — the one serif survivor of the
393
+ register reconciliation. */
409
394
  @utility cm-serif {
410
- font-family: var(--font-serif);
395
+ font-family: var(--font-serif-math, serif);
411
396
  }
412
397
 
413
398
  @utility fira-code {
@@ -426,7 +411,6 @@ body {
426
411
  vertical-align: -0.05em;
427
412
  font-weight: 700;
428
413
  display: inline-block;
429
- font-variation-settings: var(--font-display-variation-settings);
430
414
  }
431
415
 
432
416
  /* ═══════════════════════════════════════════════
@@ -439,9 +423,8 @@ body {
439
423
  font-size: clamp(2.4rem, 1.8rem + 2vw, 3.33rem);
440
424
  line-height: var(--type-leading-display);
441
425
  letter-spacing: var(--type-tracking-tight);
442
- font-weight: var(--font-display-weight);
426
+ font-weight: 600;
443
427
  font-optical-sizing: auto;
444
- font-variation-settings: var(--font-display-variation-settings);
445
428
  }
446
429
 
447
430
  /* AV.W16 TW3 — the pane title scales off its PANE's box, not the viewport.
@@ -486,8 +469,8 @@ body {
486
469
  surface read as a fade, not as engraving. */
487
470
  .text-engraved {
488
471
  color: var(--muted-foreground);
489
- text-shadow:
490
- 0 1px 0 color-mix(in srgb, var(--background) 30%, transparent),
491
- 0 -1px 0 var(--surface-tint-8);
472
+ /* AW.W26 — composes the `--text-shadow-engraved` @theme identity token
473
+ (the two-stop emboss) instead of a hand-rolled literal (gate 4). */
474
+ text-shadow: var(--text-shadow-engraved);
492
475
  }
493
476
  }
@@ -173,7 +173,12 @@
173
173
  box-shadow: var(--focus-ring-shadow);
174
174
  }
175
175
  .interactive-item:active {
176
- scale: 0.98;
176
+ /* AW.W31.a — fold the residual literal press scale onto the canonical
177
+ `--scale-press*` cohort (the prior `0.98` was the sole per-atom press
178
+ literal surviving the W2/W3/W25 sweeps). `--scale-press-sm` (0.97) is
179
+ the soft press rung the button + slider recipes consume — ONE press
180
+ vocabulary, no per-atom literal. The 0.98→0.97 delta is sub-perceptual. */
181
+ scale: var(--scale-press-sm);
177
182
  }
178
183
  .interactive-item:disabled,
179
184
  .interactive-item[data-disabled] {
@@ -227,22 +232,16 @@
227
232
  background var(--duration-fast) var(--ease-standard),
228
233
  box-shadow var(--duration-fast) var(--ease-standard);
229
234
  }
230
- /* ── Depth text (layered shadow with customizable colors) ── */
235
+ /* ── Depth text (layered offset stamp) ──
236
+ AW.W26 — composes the `--text-shadow-depth` @theme identity token (the
237
+ hard offset stack + soft ambient tail) instead of a hand-rolled multi-stop
238
+ literal. The token holds the stack inside the `@theme` defs (gate 4) and
239
+ re-tints under `.dark` via `--shadow`/`--shadow-color` BY CONSTRUCTION. */
231
240
  .depth-text {
232
241
  --depth-color-primary: var(--primary);
233
- --depth-color-shadow: var(--shadow);
234
242
 
235
243
  color: var(--depth-color-primary);
236
- text-shadow:
237
- 1px 1px 0 var(--depth-color-shadow),
238
- 2px 2px 0 var(--depth-color-shadow),
239
- 3px 3px 0 var(--depth-color-shadow),
240
- 4px 4px 0 var(--depth-color-shadow),
241
- 5px 5px 0 var(--depth-color-shadow),
242
- 5px 5px 1px color-mix(in srgb, var(--shadow-color) 10%, transparent),
243
- 2px 2px 2px color-mix(in srgb, var(--shadow-color) 20%, transparent),
244
- 4px 4px 5px color-mix(in srgb, var(--shadow-color) 25%, transparent),
245
- 6px 6px 10px color-mix(in srgb, var(--shadow-color) 15%, transparent);
244
+ text-shadow: var(--text-shadow-depth);
246
245
  }
247
246
 
248
247
  /* ── 3D preserve ── */
@@ -397,6 +396,11 @@
397
396
 
398
397
  .metric-badge > span {
399
398
  line-height: 1;
399
+ /* AW.W26 — `wrap-anywhere` (overflow-wrap: anywhere) on the value slot:
400
+ a long metric value breaks WITHIN the badge rather than being clipped
401
+ by the host `overflow: hidden`. v4.1 `wrap-anywhere` / mwg css §7.
402
+ Scoped to the value span, NOT a universal selector (mwg perf caveat). */
403
+ overflow-wrap: anywhere;
400
404
  }
401
405
 
402
406
  .metric-badge:hover {
@@ -978,7 +982,8 @@
978
982
 
979
983
  /* ── Text-highlight paint (CSS Custom Highlight API) ─────────────────────
980
984
  The default `::highlight()` paint for the `useTextHighlight` composable
981
- (composables/dom). A named `Highlight` registered in `CSS.highlights`
985
+ (composables/motion; the `/motion-core` subpath, AX.W37). A named `Highlight`
986
+ registered in `CSS.highlights`
982
987
  under one of these keys paints its `Range` set without a `<mark>` wrapper.
983
988
  Token-bridged: the search mark reads the canonical pastel-yellow rainbow
984
989
  token at a soft alpha; the equation/variable mark reads `--primary`. Both