@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
@@ -141,28 +141,3 @@
141
141
  U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
142
142
  U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
143
143
  }
144
-
145
- /* ═══════════════════════════════════════════════
146
- OFL FACE FILES — Fraunces (ornamental display)
147
- ═══════════════════════════════════════════════ */
148
-
149
- /* Fraunces — Latin subset (basic Latin + ASCII punctuation + common
150
- diacritics). The FULL variable font: a single woff2 carries wght 100..900
151
- AND the opsz / SOFT / WONK axes typography.css drives
152
- (`--font-display-variation-settings: "WONK" 1, "SOFT" 0`). Before AU.W4 the
153
- `--font-stack-display: "Fraunces"` token (tokens.css:43) had NO shipped face,
154
- so those axes were SILENTLY INERT (the slipped ship of the grand-audit/AS.W0b
155
- lineage); this face resolves the dangling display token. `font-display: swap`
156
- — the display register is a deliberate ornament, post-LCP, with the body
157
- carried by the calibrated sans/mono fallbacks. */
158
- @font-face {
159
- font-family: "Fraunces";
160
- font-style: normal;
161
- font-weight: 100 900;
162
- font-display: swap;
163
- src: url("@mkbabb/glass-ui/fonts/fraunces/fraunces-latin.woff2") format("woff2");
164
- unicode-range:
165
- U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
166
- U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122,
167
- U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
168
- }
@@ -100,21 +100,28 @@
100
100
  `var(--mouse-x, 50%)` floor is the centred fallback. */
101
101
  --specular-x: var(--mouse-x, 50%);
102
102
  --specular-y: var(--mouse-y, 50%);
103
- /* The catch-light intensity floor at rest; hover/active lift it (the
104
- interaction-light state machine below). */
105
- --specular-intensity: 0.35;
106
- /* The travelling catch-light — a soft warm-white circular glow centred
107
- on the tracked pointer position (NOT iOS blue; keeps the warm-cream
108
- identity). The `--specular-intensity` multiplier drives the layer
109
- `opacity`, not a per-stop alpha (a registered-`@property` var() nested
110
- in an hsl() alpha computes to 0 in Chromium). */
103
+ /* The catch-light intensity at REST — reads the token cohort
104
+ (tokens.css §specular-intensity), default 0 so a static, unwired
105
+ surface is CLEAN and the @property `initial-value: 0` dormancy is no
106
+ longer defeated by a floor. Hover/active lift it through the same
107
+ cohort (the interaction-light state machine below). */
108
+ --specular-intensity: var(--glass-specular-intensity-rest, 0);
109
+ /* The travelling catch-light — a genuinely WARM-CREAM, low-alpha circular
110
+ glow centred on the tracked pointer position (L < 100% so the warm hue
111
+ survives — the prior `hsl(40 30% 100%)` was PURE WHITE at L=100%, which
112
+ saturated the 30% away and blew out under the screen blend; the
113
+ warm-cream the comment claimed never painted). The `--specular-intensity`
114
+ multiplier drives the layer `opacity`, not a per-stop alpha (a
115
+ registered-`@property` var() nested in an hsl() alpha computes to 0 in
116
+ Chromium); the per-stop alphas here keep the core soft so even the lifted
117
+ hover/active states read as a lens, not a flash. */
111
118
  background: radial-gradient(
112
119
  circle at var(--specular-x, 50%) var(--specular-y, 50%),
113
- hsl(40 30% 100% / 0.55) 0%,
114
- hsl(40 30% 100% / 0.22) 22%,
120
+ hsl(40 30% 96% / 0.22) 0%,
121
+ hsl(40 30% 96% / 0.08) 22%,
115
122
  transparent 55%
116
123
  );
117
- opacity: var(--specular-intensity, 0.35);
124
+ opacity: var(--specular-intensity, 0);
118
125
  /* Clip the glow to the plate so it rides the surface. `mask-image`
119
126
  Baseline 2023-12-07; a non-supporting engine ignores it and the
120
127
  `inset: 0` + radius-inherit already bound the glow. */
@@ -142,8 +149,12 @@
142
149
  .dark .glass-card::before,
143
150
  .dark .glass-specular-track::before,
144
151
  .dark .dock-icon-button::before {
145
- /* Softer over the deep canvas — the screen blend lifts harder on dark. */
146
- --specular-intensity: 0.22;
152
+ /* Softer over the deep canvas — the screen blend lifts harder on dark.
153
+ The `.dark` magnitude lives in the token cohort (tokens.css §specular-
154
+ intensity `.dark` arm); the rest rung is already 0 so the dark arm only
155
+ softens hover/active via the cohort. The rest rung re-reads the (dark)
156
+ token here so a dark `:root` override resolves. */
157
+ --specular-intensity: var(--glass-specular-intensity-rest, 0);
147
158
  }
148
159
 
149
160
  /* (c) Interaction-light lockstep — hover/active lift the intensity in the
@@ -159,7 +170,7 @@
159
170
  .glass-card:hover::before,
160
171
  .glass-specular-track:hover::before,
161
172
  .dock-icon-button:hover::before {
162
- --specular-intensity: 0.6;
173
+ --specular-intensity: var(--glass-specular-intensity-hover, 0.22);
163
174
  }
164
175
  .glass-material:active::before,
165
176
  .glass-wash:active::before,
@@ -170,7 +181,7 @@
170
181
  .glass-card:active::before,
171
182
  .glass-specular-track:active::before,
172
183
  .dock-icon-button:active::before {
173
- --specular-intensity: 0.85;
184
+ --specular-intensity: var(--glass-specular-intensity-active, 0.32);
174
185
  }
175
186
 
176
187
  /* ── Five-tier surface ladder (v0.8.0; visual only, no geometry) ──
@@ -565,32 +576,6 @@
565
576
  border-color: var(--surface-tint-15);
566
577
  }
567
578
 
568
- /* ── Deck-position rail (AW.W16) ──────────────────────────────────────
569
- A CSS recipe that RESTYLES the shipped `<Progress variant="default">`
570
- (the reka-ui ProgressRoot track + its indicator child) into the thin
571
- bottom-of-deck position rail. It composes the EXISTING fill — it does NOT
572
- re-author a second track/range mechanic. Every visual axis is a
573
- `--progress-rail-*` token, so a consumer/dark-flip re-tints with zero
574
- library edit (`:root { --progress-rail-fill: … }`). The viewport-pinned
575
- chrome (`position: fixed`, `env(safe-area-inset-bottom)`, the z-index) is
576
- CONSUMER-supplied — this recipe owns only the LOOK. */
577
- .glass-progress-rail {
578
- /* The track hairline — the rail reads as a thin sliver, not a 16px bar. */
579
- height: var(--progress-rail-h, 3px);
580
- border-radius: 0;
581
- background: var(--progress-rail-track, color-mix(in srgb, var(--foreground) 8%, transparent));
582
- }
583
-
584
- /* The fill — the shipped ProgressIndicator child. A leading-edge glow on the
585
- fill's trailing edge reads as a moving position head. */
586
- .glass-progress-rail > * {
587
- border-radius: 0;
588
- background: var(--progress-rail-fill, var(--primary));
589
- box-shadow:
590
- var(--progress-rail-glow-x, 4px) 0 var(--progress-rail-glow-blur, 8px)
591
- color-mix(in srgb, var(--progress-rail-fill, var(--primary)) var(--progress-rail-glow-strength, 55%), transparent);
592
- }
593
-
594
579
  /* ── AW.W23 — chromatic edge dispersion (the polished-glass rim fringe) ──
595
580
  An opt-in `.glass-chromatic` composes the warm/cool oklab fringe OVER the
596
581
  W22 uniform rim (it does NOT replace it — the rim still rides each rung's
@@ -605,6 +590,80 @@
605
590
  }
606
591
  }
607
592
 
593
+ /* ── Deck-position rail (AW.W16 · AX.W24) ───────────────────────────────────
594
+ A Tailwind `@utility` that RESTYLES the shipped `<Progress variant="default">`
595
+ (the reka-ui ProgressRoot track + its indicator child) into the thin
596
+ bottom-of-deck position rail. It composes the EXISTING fill — it does NOT
597
+ re-author a second track/range mechanic. Every visual axis is a
598
+ `--progress-rail-*` token, so a consumer/dark-flip re-tints with zero library
599
+ edit (`:root { --progress-rail-fill: … }`). The viewport-pinned chrome
600
+ (`position: fixed`, `env(safe-area-inset-bottom)`, the z-index) is CONSUMER-
601
+ supplied — this recipe owns only the LOOK.
602
+
603
+ AX.W24 — WHY `@utility`, not `@layer components`. The rail RESTYLES the default
604
+ Progress: it must override the `h-4` height + `rounded-pill` radius utilities the
605
+ variant bakes. Those utilities live in `@layer utilities`, which ALWAYS outranks
606
+ `@layer components` regardless of source order, so the prior `@layer components`
607
+ recipe's `height: 3px` was a silent no-op (the rail painted as a 16px bar). An
608
+ `@utility` lands the recipe IN `@layer utilities` alongside `h-4`, where a single-
609
+ class selector wins the geometry by source order — the idiomatic Tailwind-v4 way
610
+ to author a restyle-class that out-ranks base utilities (the `btn-audacious` /
611
+ `cartoon-surface` pattern).
612
+
613
+ The COLOUR fix is the SEPARATE token-read-at-source path (NOT a layer-juggle):
614
+ `ProgressDefault` reads `--progress-fill`/`--progress-track` and dropped its
615
+ `bg-secondary`/`bg-primary` utilities, so this recipe FEEDS those tokens rather
616
+ than fighting a utility colour. The `--progress-fill` set on the rail root cascades
617
+ to the indicator child (a CSS custom property inherits), so the indicator reads the
618
+ override hue. */
619
+ @utility glass-progress-rail {
620
+ /* The track hairline + zero radius — the rail reads as a thin square sliver, not
621
+ the variant's 16px `rounded-pill` bar. A single-class @utility ties `h-4`/
622
+ `rounded-pill` on SPECIFICITY (both 0,1,0) and Tailwind's utility sort can emit
623
+ `h-4` later, so the bare tie loses. The doubled-class self-reference (`&&` →
624
+ `.glass-progress-rail.glass-progress-rail`, specificity 0,2,0) wins the geometry
625
+ DETERMINISTICALLY over the base utilities regardless of emit order — the precise,
626
+ contained way to out-rank a base utility without `!important`. */
627
+ && {
628
+ height: var(--progress-rail-h, 3px);
629
+ border-radius: 0;
630
+ }
631
+ /* Feed the token-read default variant — these route the consumer's
632
+ `--progress-rail-*` axes into the `--progress-fill`/`--progress-track` tokens
633
+ the variant reads at source (the cascade-correct colour path). */
634
+ --progress-track: var(
635
+ --progress-rail-track,
636
+ color-mix(in srgb, var(--foreground) 8%, transparent)
637
+ );
638
+ --progress-fill: var(--progress-rail-fill, var(--primary));
639
+
640
+ /* The fill — the shipped ProgressIndicator child. The indicator paints the
641
+ inherited `--progress-fill`; the leading-edge glow is re-authored (AX.W24 F2)
642
+ as a TRAILING right-edge INSET box-shadow that lives INSIDE the indicator's
643
+ own box. The prior `4px 0 8px` OUTSET rightward shadow extended PAST the fill
644
+ boundary into the ProgressRoot's load-bearing `overflow-hidden` clip and was
645
+ eaten — invisible at every value. An `inset` shadow offset leftward
646
+ (`inset -Npx 0 …`) brightens just inside the indicator's right (leading) edge
647
+ — the moving position head — and never crosses the fill boundary, so the clip
648
+ cannot eat it (the clip is never lifted; that would re-break the default
649
+ Progress look for every other consumer). `box-shadow` is a separate property
650
+ from `background`, so it composes cleanly over the token-read fill. */
651
+ && > * {
652
+ border-radius: 0;
653
+ box-shadow:
654
+ inset
655
+ calc(-1 * var(--progress-rail-glow-x, 4px))
656
+ 0
657
+ var(--progress-rail-glow-blur, 8px)
658
+ calc(-1 * var(--progress-rail-glow-spread, 2px))
659
+ color-mix(
660
+ in srgb,
661
+ hsl(0 0% 100%) var(--progress-rail-glow-strength, 55%),
662
+ transparent
663
+ );
664
+ }
665
+ }
666
+
608
667
  /* ── AW.W23 — corner-shape: squircle PE (Chrome 139+) ───────────────────────
609
668
  The literal iOS-26 superellipse corner geometry that `backdrop-filter`,
610
669
  borders, and shadows follow. `@supports (corner-shape: squircle)`-gated over
@@ -47,6 +47,15 @@
47
47
  --radius-dialog: var(--radius-2xl);
48
48
  --radius-input: var(--radius);
49
49
  --radius-button: var(--radius);
50
+ /* AW.W25 — form-radius unification. `--radius-field` is the non-pill field
51
+ rung the multi-line / stepper form atoms (Textarea, NumberFieldInput)
52
+ resolve so a multi-line box stops inheriting the `9999px` stadium pill;
53
+ single-line controls (Input, SelectTrigger) keep the pill. `--radius-control`
54
+ is the semantic control-corner rung that retires the raw `rounded-sm` (4px)
55
+ on Checkbox + base Tabs onto a softer, named radius. One geometry language
56
+ across the form family — token + class only, no new primitive. */
57
+ --radius-field: var(--radius-2xl);
58
+ --radius-control: var(--radius-md);
50
59
  --radius-badge: var(--radius-pill);
51
60
  --radius-dock: var(--radius-pill);
52
61
  /* AW.W3b — the big-dock card shell's default (comfortable-density) radius.
@@ -94,9 +103,17 @@
94
103
 
95
104
  /* ═══════════════════════════════════════════════
96
105
  Font families → font-* utilities
106
+
107
+ ONE brand register, bridged from tokens.css §0's --font-stack-* source.
108
+ --font-text is the body/heading/prose/display register (Plus Jakarta
109
+ Sans). --font-serif is a bridge alias for the demo configurator's "serif"
110
+ control slot — it resolves to the SAME text register (the library carries
111
+ no display-serif voice). A consumer rebrands the whole text register by
112
+ overriding --font-text once.
97
113
  ═══════════════════════════════════════════════ */
114
+ --font-text: var(--font-stack-text);
98
115
  --font-display: var(--font-stack-display);
99
- --font-serif: var(--font-stack-serif);
116
+ --font-serif: var(--font-stack-text);
100
117
  --font-sans: var(--font-stack-sans);
101
118
  --font-mono: var(--font-stack-mono);
102
119
 
@@ -349,7 +366,6 @@
349
366
  --ease-in: var(--motion-ease-in);
350
367
  --ease-out-expo: var(--motion-ease-out-expo);
351
368
  --ease-apple: var(--motion-ease-apple);
352
- --ease-apple-spring: var(--motion-ease-apple-spring);
353
369
  --ease-spring: var(--spring-snappy);
354
370
  --ease-decelerate: var(--motion-ease-out);
355
371
  --ease-accelerate: var(--motion-ease-in);
@@ -416,6 +432,46 @@
416
432
  ═══════════════════════════════════════════════ */
417
433
  --opacity-disabled: 0.5;
418
434
  --opacity-icon-muted: 0.8;
435
+
436
+ /* ═══════════════════════════════════════════════
437
+ text-shadow → text-shadow-* utilities (AW.W26)
438
+
439
+ text-shadow is the lone shadow family that shipped no `@theme` bridge
440
+ (Tailwind v4.1 minted the `text-shadow-{2xs,xs,sm,md,lg}` utilities). The
441
+ rungs are warm-`--shadow-color`-derived via `color-mix` per the box-shadow
442
+ ladder (tokens.css §7) + the cartoon-shadow precept's one-source chain, so
443
+ they re-tint under `.dark` BY CONSTRUCTION — `--shadow-color: var(--foreground)`
444
+ flips light→dark with no hardcoded `.dark` re-declaration. The hand-rolled
445
+ multi-stop `text-shadow:` literals in `.depth-text` (utilities.css) +
446
+ `.text-engraved` (typography.css) now compose these tokens. */
447
+ --text-shadow-2xs: 0 1px 0 color-mix(in srgb, var(--shadow-color) 12%, transparent);
448
+ --text-shadow-xs: 0 1px 1px color-mix(in srgb, var(--shadow-color) 16%, transparent);
449
+ --text-shadow-sm: 0 1px 0 color-mix(in srgb, var(--shadow-color) 14%, transparent),
450
+ 0 2px 3px color-mix(in srgb, var(--shadow-color) 18%, transparent);
451
+ --text-shadow-md: 0 1px 0 color-mix(in srgb, var(--shadow-color) 16%, transparent),
452
+ 0 2px 4px color-mix(in srgb, var(--shadow-color) 20%, transparent),
453
+ 0 4px 8px color-mix(in srgb, var(--shadow-color) 14%, transparent);
454
+ --text-shadow-lg: 0 1px 0 color-mix(in srgb, var(--shadow-color) 18%, transparent),
455
+ 0 2px 4px color-mix(in srgb, var(--shadow-color) 22%, transparent),
456
+ 0 6px 12px color-mix(in srgb, var(--shadow-color) 18%, transparent);
457
+
458
+ /* Two IDENTITY text-shadow tokens — the hard offset STAMP (`.depth-text`)
459
+ + the two-stop EMBOSS (`.text-engraved`). These hold the multi-stop
460
+ literals INSIDE the `@theme` defs so the utilities compose `var(--text-shadow-*)`
461
+ and no raw `text-shadow:` literal survives in `utilities.css`/`typography.css`
462
+ (AW.W26 gate 4). Both are `--shadow-color`/surface-tint-derived, so they
463
+ re-tint under `.dark` BY CONSTRUCTION. */
464
+ --text-shadow-depth: 1px 1px 0 var(--shadow),
465
+ 2px 2px 0 var(--shadow),
466
+ 3px 3px 0 var(--shadow),
467
+ 4px 4px 0 var(--shadow),
468
+ 5px 5px 0 var(--shadow),
469
+ 5px 5px 1px color-mix(in srgb, var(--shadow-color) 10%, transparent),
470
+ 2px 2px 2px color-mix(in srgb, var(--shadow-color) 20%, transparent),
471
+ 4px 4px 5px color-mix(in srgb, var(--shadow-color) 25%, transparent),
472
+ 6px 6px 10px color-mix(in srgb, var(--shadow-color) 15%, transparent);
473
+ --text-shadow-engraved: 0 1px 0 color-mix(in srgb, var(--background) 30%, transparent),
474
+ 0 -1px 0 var(--surface-tint-8);
419
475
  }
420
476
 
421
477
  /* Class-based dark mode */
@@ -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
+ }