@mkbabb/glass-ui 3.9.0 → 3.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (265) hide show
  1. package/dist/{CardAction-DuArVky-.js → CardAction-DrAcAV4d.js} +2 -2
  2. package/dist/{CommandShortcut-CefCj5mt.js → CommandShortcut-mV2e1aG6.js} +2 -2
  3. package/dist/{DataTable-CUHMukiQ.js → DataTable-C3E6jZ5B.js} +2 -2
  4. package/dist/{DialogContent-BRkT1cjP.js → DialogContent-BxaaafFi.js} +1 -1
  5. package/dist/{HoverPopover-2LOIW34a.js → HoverPopover-CDA_SaCe.js} +1 -1
  6. package/dist/{MetricBadge-lTc002u2.js → MetricBadge-idgrkqoP.js} +1 -1
  7. package/dist/{Notification-BxK8LZMw.js → Notification-Cu0nN17_.js} +3 -3
  8. package/dist/{NumberFieldContent-BbLOh8RU.js → NumberFieldContent-CHEWghnY.js} +2 -2
  9. package/dist/{PopoverContent-BId6ggf_.js → PopoverContent-DpUvdYY-.js} +1 -1
  10. package/dist/{Progress-iEuD9pxG.js → Progress-BW-StFw2.js} +1 -1
  11. package/dist/{ScrollingText-BPP84wKo.js → ScrollingText-DruYCni_.js} +1 -1
  12. package/dist/{SelectScrollDownButton-T32cVFeM.js → SelectScrollDownButton-pirzjm--.js} +3 -3
  13. package/dist/{Switch-LDKLmmgx.js → Switch-DeAqg6pi.js} +1 -1
  14. package/dist/{TabsList-B8CVOQPC.js → TabsList-BAVzOZpg.js} +2 -2
  15. package/dist/{Toaster-1rYWrmAm.js → Toaster-CvuuW_y9.js} +49 -46
  16. package/dist/{ToggleGroupItem-Cev4pOVK.js → ToggleGroupItem-DtD37b4G.js} +4 -4
  17. package/dist/animated-digit.js +2 -2
  18. package/dist/api/index.d.ts +4 -4
  19. package/dist/api.js +1 -1
  20. package/dist/aurora.js +238 -547
  21. package/dist/{badge-BvwvT50i.js → badge-NdCQMvvB.js} +2 -2
  22. package/dist/badge.js +1 -1
  23. package/dist/{button-DN39cGqL.js → button-DyiWFAOE.js} +12 -12
  24. package/dist/button.js +1 -1
  25. package/dist/canvas.js +2 -2
  26. package/dist/card.js +1 -1
  27. package/dist/carousel.js +5 -5
  28. package/dist/collapsible.js +1 -1
  29. package/dist/{color-8jBjWiJ6.js → color-B65wWyQz.js} +9 -7
  30. package/dist/color.js +1 -1
  31. package/dist/command.js +1 -1
  32. package/dist/{compile-DAjIoEy2.js → compile-Ce_V55zi.js} +23 -23
  33. package/dist/components/custom/aurora/composables/atoms.d.ts +21 -4
  34. package/dist/components/custom/aurora/composables/runtime.d.ts +0 -9
  35. package/dist/components/custom/aurora/composables/uniformBridge.d.ts +0 -11
  36. package/dist/components/custom/aurora/constants/renderMode.d.ts +0 -32
  37. package/dist/components/custom/aurora/constants/shaders/brush.glsl.d.ts +1 -1
  38. package/dist/components/custom/aurora/constants/shaders/mediums.glsl.d.ts +2 -2
  39. package/dist/components/custom/aurora/constants/shaders/tonemap.glsl.d.ts +1 -1
  40. package/dist/components/custom/aurora/constants/shaders/vangogh-medium.glsl.d.ts +1 -0
  41. package/dist/components/custom/aurora/index.d.ts +1 -1
  42. package/dist/components/custom/constellation/Constellation.vue.d.ts +85 -1
  43. package/dist/components/custom/constellation/composables/createConstellationField.d.ts +35 -0
  44. package/dist/components/custom/constellation/composables/useConstellationPointer.d.ts +35 -0
  45. package/dist/components/custom/constellation/constants.d.ts +36 -0
  46. package/dist/components/custom/constellation/constellationDraw.d.ts +18 -0
  47. package/dist/components/custom/constellation/constellationField.d.ts +174 -63
  48. package/dist/components/custom/constellation/constellationInteraction.d.ts +102 -0
  49. package/dist/components/custom/constellation/index.d.ts +4 -2
  50. package/dist/components/custom/controls/DarkModeToggle.vue.d.ts +11 -0
  51. package/dist/components/custom/dock/GlassDock.vue.d.ts +2 -110
  52. package/dist/components/custom/dock/composables/dockMorphContext.d.ts +36 -0
  53. package/dist/components/custom/dock/composables/useDockMorphWindow.d.ts +15 -0
  54. package/dist/components/custom/dock/composables/useDockShellProps.d.ts +131 -0
  55. package/dist/components/custom/dock/composables/useLayerTransition.d.ts +44 -0
  56. package/dist/components/custom/dock/constants.d.ts +23 -0
  57. package/dist/components/custom/fourier-field/FourierField.vue.d.ts +6 -0
  58. package/dist/components/custom/fourier-field/index.d.ts +25 -1
  59. package/dist/components/custom/fourier-field/math.d.ts +20 -8
  60. package/dist/components/custom/fourier-field/presets.d.ts +54 -0
  61. package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +8 -10
  62. package/dist/components/custom/goo-blob/composables/buildMetaballProgram.d.ts +18 -0
  63. package/dist/components/custom/goo-blob/composables/uploadBlobUniforms.d.ts +41 -0
  64. package/dist/components/custom/goo-blob/composables/useBlobPointer.d.ts +4 -3
  65. package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +16 -21
  66. package/dist/components/custom/goo-blob/constants.d.ts +52 -0
  67. package/dist/components/custom/goo-blob/index.d.ts +1 -1
  68. package/dist/components/custom/goo-blob/shaders/metaball-uniforms.glsl.d.ts +1 -0
  69. package/dist/components/custom/goo-blob/types.d.ts +59 -25
  70. package/dist/components/custom/instrument-chassis/InstrumentChassis.vue.d.ts +2 -2
  71. package/dist/components/custom/tabs/constants.d.ts +12 -0
  72. package/dist/components/custom/underline/GlassUnderline.vue.d.ts +84 -0
  73. package/dist/components/custom/underline/index.d.ts +2 -0
  74. package/dist/components/custom/underline/types.d.ts +56 -0
  75. package/dist/components/ui/drawer/Drawer.vue.d.ts +1 -0
  76. package/dist/components/ui/dropdown-menu/DropdownMenuSubContent.vue.d.ts +2 -2
  77. package/dist/components/ui/slider/index.d.ts +25 -18
  78. package/dist/components/ui/toast/use-toast.d.ts +2 -2
  79. package/dist/composables/color/index.d.ts +24 -7
  80. package/dist/composables/glass/useSpecularTracking.d.ts +12 -3
  81. package/dist/composables/glass/webgl/shaders/procedural-color.glsl.d.ts +1 -6
  82. package/dist/composables/motion/curves.d.ts +48 -0
  83. package/dist/composables/motion/index.d.ts +2 -0
  84. package/dist/composables/motion/springPresets.d.ts +33 -0
  85. package/dist/composables/motion/suite.d.ts +2 -0
  86. package/dist/composables/motion/useSpringMount.d.ts +1 -1
  87. package/dist/configurator.js +1 -1
  88. package/dist/confirm-dialog.js +2 -2
  89. package/dist/constellation.js +322 -147
  90. package/dist/controls.js +48 -14
  91. package/dist/dark.js +1 -1
  92. package/dist/data-table.js +1 -1
  93. package/dist/dialog.js +2 -2
  94. package/dist/dock.js +340 -327
  95. package/dist/dockContext-bho8B1A4.js +17 -0
  96. package/dist/{dropdown-menu-D77jX6Df.js → dropdown-menu-DVnQcA0E.js} +7 -4
  97. package/dist/dropdown-menu.js +1 -1
  98. package/dist/expandable-container.js +1 -1
  99. package/dist/forms.js +2 -2
  100. package/dist/fourier-field.js +147 -120
  101. package/dist/fourier-math.d.ts +1 -0
  102. package/dist/fourier-math.js +2 -0
  103. package/dist/glass-ui.css +1 -1
  104. package/dist/glass-ui.js +286 -207
  105. package/dist/goo-blob.js +368 -322
  106. package/dist/hover-popover.js +1 -1
  107. package/dist/icon-tooltip.js +1 -1
  108. package/dist/index.d.ts +0 -2
  109. package/dist/keyboard.js +1 -1
  110. package/dist/labeled-field.js +5 -5
  111. package/dist/math-BUU9hHID.js +43 -0
  112. package/dist/metric-badge.js +1 -1
  113. package/dist/metric-stack.js +2 -2
  114. package/dist/motion-core.js +4 -4
  115. package/dist/motion-curves.d.ts +1 -0
  116. package/dist/motion-curves.js +130 -0
  117. package/dist/motion.js +38 -37
  118. package/dist/notification.js +1 -1
  119. package/dist/number-field.js +1 -1
  120. package/dist/popover.js +1 -1
  121. package/dist/progress.js +1 -1
  122. package/dist/pulse.js +1 -1
  123. package/dist/reactive.js +1 -1
  124. package/dist/scrolling-text.js +1 -1
  125. package/dist/search.js +6 -6
  126. package/dist/select.js +1 -1
  127. package/dist/{sheet-VZEtNFvO.js → sheet-ChSXcJpU.js} +1 -1
  128. package/dist/sheet.js +1 -1
  129. package/dist/{slider-DC2mwuoe.js → slider-sfl8gFDD.js} +8 -8
  130. package/dist/slider.js +1 -1
  131. package/dist/sortable-list.js +2 -2
  132. package/dist/springPresets-aRSm-4_k.js +40 -0
  133. package/dist/stacked-icons.js +6 -6
  134. package/dist/styles/cards.css +2 -2
  135. package/dist/styles/components.css +1 -1
  136. package/dist/styles/dock/layer-group.css +38 -4
  137. package/dist/styles/dock/layers.css +11 -1
  138. package/dist/styles/dock/morph.css +95 -19
  139. package/dist/styles/dock/shell.css +12 -0
  140. package/dist/styles/dock-controls.css +25 -12
  141. package/dist/styles/drawer.css +14 -4
  142. package/dist/styles/floating-panel.css +2 -0
  143. package/dist/styles/glass/a11y-fallback.css +245 -0
  144. package/dist/styles/glass/ladder.css +304 -0
  145. package/dist/styles/glass/material.css +238 -0
  146. package/dist/styles/glass/progress-rail.css +78 -0
  147. package/dist/styles/glass/squircle.css +66 -0
  148. package/dist/styles/glass/surfaces.css +306 -0
  149. package/dist/styles/glass-refract.css +2 -0
  150. package/dist/styles/glass.css +31 -1052
  151. package/dist/styles/hover-popover.css +2 -0
  152. package/dist/styles/index.css +24 -6
  153. package/dist/styles/instrument-chassis.css +4 -0
  154. package/dist/styles/theme.css +14 -14
  155. package/dist/styles/tokens/color-radius.css +250 -0
  156. package/dist/styles/tokens/dark-arm.css +194 -0
  157. package/dist/styles/tokens/glass.css +413 -0
  158. package/dist/styles/tokens/light-dark.css +158 -0
  159. package/dist/styles/tokens/offsets-sizing.css +406 -0
  160. package/dist/styles/tokens/property-regs.css +169 -0
  161. package/dist/styles/tokens/scale-paper.css +361 -0
  162. package/dist/styles/tokens/scheme-motion.css +334 -0
  163. package/dist/styles/tokens/shadow.css +132 -0
  164. package/dist/styles/tokens.css +22 -2269
  165. package/dist/styles/transitions.css +20 -2
  166. package/dist/styles/typography.css +18 -6
  167. package/dist/styles/utilities/a11y-overrides.css +140 -0
  168. package/dist/styles/utilities/animate.css +26 -0
  169. package/dist/styles/utilities/base.css +365 -0
  170. package/dist/styles/utilities/btn.css +399 -0
  171. package/dist/styles/utilities/components.css +317 -0
  172. package/dist/styles/utilities.css +19 -1170
  173. package/dist/switch.js +1 -1
  174. package/dist/tabs.js +98 -98
  175. package/dist/timeline.js +2 -2
  176. package/dist/toast.js +1 -1
  177. package/dist/toggle-group.js +1 -1
  178. package/dist/typewriter.js +1 -1
  179. package/dist/underline.d.ts +1 -0
  180. package/dist/underline.js +85 -0
  181. package/dist/{useAnimatedNumber-C5I3wWd8.js → useAnimatedNumber-DfVgP4te.js} +1 -1
  182. package/dist/{useConfiguratorState-DxAqksK6.js → useConfiguratorState-BdQXh9ie.js} +1 -1
  183. package/dist/useSpecularTracking-DFK_fhpG.js +32 -0
  184. package/dist/useSpringMount-DXUzxBjV.js +108 -0
  185. package/dist/watercolor-dot.js +2 -2
  186. package/package.json +62 -38
  187. package/src/styles/cards.css +2 -2
  188. package/src/styles/dock/layer-group.css +38 -4
  189. package/src/styles/dock/layers.css +11 -1
  190. package/src/styles/dock/morph.css +95 -19
  191. package/src/styles/dock/shell.css +12 -0
  192. package/src/styles/dock-controls.css +25 -12
  193. package/src/styles/drawer.css +12 -4
  194. package/src/styles/glass/a11y-fallback.css +245 -0
  195. package/src/styles/glass/ladder.css +304 -0
  196. package/src/styles/glass/material.css +238 -0
  197. package/src/styles/glass/progress-rail.css +78 -0
  198. package/src/styles/glass/squircle.css +66 -0
  199. package/src/styles/glass/surfaces.css +306 -0
  200. package/src/styles/glass.css +31 -1052
  201. package/src/styles/index.css +24 -6
  202. package/src/styles/theme.css +14 -14
  203. package/src/styles/tokens/color-radius.css +250 -0
  204. package/src/styles/tokens/dark-arm.css +194 -0
  205. package/src/styles/tokens/glass.css +413 -0
  206. package/src/styles/tokens/light-dark.css +158 -0
  207. package/src/styles/tokens/offsets-sizing.css +406 -0
  208. package/src/styles/tokens/property-regs.css +169 -0
  209. package/src/styles/tokens/scale-paper.css +361 -0
  210. package/src/styles/tokens/scheme-motion.css +334 -0
  211. package/src/styles/tokens/shadow.css +132 -0
  212. package/src/styles/tokens.css +22 -2269
  213. package/src/styles/transitions.css +20 -2
  214. package/src/styles/typography.css +18 -6
  215. package/src/styles/utilities/a11y-overrides.css +140 -0
  216. package/src/styles/utilities/animate.css +26 -0
  217. package/src/styles/utilities/base.css +365 -0
  218. package/src/styles/utilities/btn.css +399 -0
  219. package/src/styles/utilities/components.css +317 -0
  220. package/src/styles/utilities.css +19 -1170
  221. package/dist/DeckProgress-Dmk4_AKN.js +0 -23
  222. package/dist/InstrumentRail-CUJ05YVG.js +0 -44
  223. package/dist/components/custom/aurora/composables/gpuRuntime.d.ts +0 -16
  224. package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +0 -7
  225. package/dist/components/custom/deck-progress/DeckProgress.vue.d.ts +0 -27
  226. package/dist/components/custom/deck-progress/index.d.ts +0 -2
  227. package/dist/components/custom/dialog-native/GlassDialogNative.vue.d.ts +0 -57
  228. package/dist/components/custom/dialog-native/index.d.ts +0 -1
  229. package/dist/components/custom/glass-panel/GlassPanel.vue.d.ts +0 -41
  230. package/dist/components/custom/glass-panel/index.d.ts +0 -2
  231. package/dist/components/custom/header-ribbon/HeaderRibbon.vue.d.ts +0 -31
  232. package/dist/components/custom/header-ribbon/index.d.ts +0 -2
  233. package/dist/components/custom/header-ribbon/types.d.ts +0 -7
  234. package/dist/components/custom/instrument-rail/InstrumentRail.vue.d.ts +0 -91
  235. package/dist/components/custom/instrument-rail/index.d.ts +0 -2
  236. package/dist/composables/glass/createGPUCanvas.d.ts +0 -40
  237. package/dist/deck-progress.d.ts +0 -1
  238. package/dist/deck-progress.js +0 -2
  239. package/dist/dockContext-BKeIMmNk.js +0 -9
  240. package/dist/glass-panel.d.ts +0 -1
  241. package/dist/glass-panel.js +0 -44
  242. package/dist/header-ribbon.d.ts +0 -1
  243. package/dist/header-ribbon.js +0 -63
  244. package/dist/instrument-rail.d.ts +0 -1
  245. package/dist/instrument-rail.js +0 -2
  246. package/dist/useGlassRenderer-5I0YkI4t.js +0 -69
  247. package/dist/useSpecularTracking-BVRZsRHA.js +0 -26
  248. package/dist/useSpringMount-BJSHcLl3.js +0 -113
  249. /package/dist/{CollapsibleContent-CP9qF1v4.js → CollapsibleContent-Drow5WkV.js} +0 -0
  250. /package/dist/{DialogFooter-Gprw8H_A.js → DialogFooter-DufLHi0y.js} +0 -0
  251. /package/dist/{IconTooltip-yefK7cJc.js → IconTooltip-BrQ5p181.js} +0 -0
  252. /package/dist/{Input-DWQQIOC4.js → Input-B-F818RU.js} +0 -0
  253. /package/dist/{_plugin-vue_export-helper-ok8pgSl5.js → _plugin-vue_export-helper-DWghtRt7.js} +0 -0
  254. /package/dist/{constants-CS75AWHG.js → constants-C8NMonuo.js} +0 -0
  255. /package/dist/{presets-BKVyQfbt.js → presets-1OhFpaIC.js} +0 -0
  256. /package/dist/{prng-wHuHlNHE.js → prng-CjVgzjQT.js} +0 -0
  257. /package/dist/{resolveCanvasColor-BBiYfp8g.js → resolveCanvasColor-CRvVzOvP.js} +0 -0
  258. /package/dist/{useCanvas2D-ClrQuZtp.js → useCanvas2D-CSeH8h16.js} +0 -0
  259. /package/dist/{useGlobalDark-yhL4Wp-s.js → useGlobalDark-D7R9OypB.js} +0 -0
  260. /package/dist/{useIntersectionPause-Cc-H9ees.js → useIntersectionPause-DAdVPVp4.js} +0 -0
  261. /package/dist/{useInterval-Dsmqwi03.js → useInterval-D3USn0yc.js} +0 -0
  262. /package/dist/{useKeyboardShortcuts-Be3w_Rwk.js → useKeyboardShortcuts-i8tHd5WO.js} +0 -0
  263. /package/dist/{useScrollProgress-CAH8Ofwt.js → useScrollProgress-CcgmgMQt.js} +0 -0
  264. /package/dist/{useSortable-C8ReQ50P.js → useSortable-DnyGXKKY.js} +0 -0
  265. /package/dist/{useTextHighlight-DON84L8w.js → useTextHighlight-B3b10W6r.js} +0 -0
@@ -0,0 +1,406 @@
1
+ /* tokens/offsets-sizing.css
2
+ §9 animation offsets · §10 sizing (control heights, dropdown, carousel, stack-overlap, touch-target floor).
3
+ Carved from the tokens.css cascade root; @import-ed by tokens.css in
4
+ cascade order. Same :root cascade context as its siblings. */
5
+ :root {
6
+ /* ═══════════════════════════════════════════════
7
+ §9 ANIMATION OFFSETS
8
+ ═══════════════════════════════════════════════ */
9
+ /* Hover lift offsets */
10
+ --lift-sm: -1px;
11
+ --lift-md: -2px;
12
+ --lift-lg: -4px;
13
+
14
+ /* Layout tokens */
15
+ --mask-fade-width: 1rem;
16
+ /* J.W3.C — dock content overflow caps. When dock content exceeds
17
+ these dimensions, the inner `.dock-layers` (horizontal) /
18
+ `.glass-dock.vertical` (rail) container scrolls with a
19
+ `.scroll-fade-{x,y}` mask-fade so the boundary feathers rather
20
+ than cliffs. Defaults clamp to 80vw / 80vh capped at sensible
21
+ desktop widths; consumers override per-dock by setting either
22
+ token directly on a `.glass-dock` instance. User findings 1 + 5a. */
23
+ /* AX.W04 — `--dock-max-inline-size` is the canonical inline cap EVERY overflow
24
+ strategy reads: `overflow="scroll"` scrolls past it, and `overflow="wrap"`
25
+ wraps to N rows on the over-cap crossing (the dock shrink-wraps to content,
26
+ `max-inline-size` caps that intrinsic width at this token). The prior
27
+ `--dock-overflow-bp: 640px` viewport-breakpoint token (the magic-640
28
+ snap-back) is DELETED — the wrap is content-driven, not viewport-coupled, so
29
+ there is no breakpoint threshold to name. */
30
+ --dock-max-inline-size: min(80vw, 64rem);
31
+ --dock-max-block-size: min(80vh, 48rem);
32
+
33
+ /* AB.W1.T1 — chassis max-block-size guardrail.
34
+ Maximum block size a centred consumer-app card may consume while
35
+ preserving the inline dock footprint. The recipe subtracts the
36
+ consumer-owned `--dock-footer-space` (dock height + dock inset +
37
+ card-edge inset) and `--page-padding-top` from the dynamic viewport,
38
+ then takes one further rem of breathing room so the card never
39
+ butts the dock — the user mandate is `≥ 1rem visible gap above
40
+ dock`. Both consumer tokens carry safe fallbacks for callers that
41
+ have not declared them.
42
+
43
+ Consumers should shrink internal regions (meter, readout, timeline)
44
+ before falling back to scroll. This token is a guardrail against
45
+ chassis overflow, NOT a license to make the card scroll as the
46
+ default solution; clamp-first / no-scroll-first is the canon.
47
+ See DESIGN.md `## Chassis sizing — dock-adjusted viewport`. */
48
+ --chassis-max-block-size: calc(
49
+ 100dvh
50
+ - var(--dock-footer-space, 5.75rem)
51
+ - var(--page-padding-top, 0rem)
52
+ - 1rem
53
+ );
54
+ /* R0G-2 (AO.W3/W4) — chassis mobile dial-reserve canon. instrument-
55
+ chassis.css's mobile breakpoint reserves the dial's final box from
56
+ frame 0 via these vars (with the same values as inline fallbacks, the
57
+ safety net). Token-first home so the vars resolve canonically. */
58
+ --instrument-dial-min-height-mobile: 24rem;
59
+ --instrument-dial-meter-reserve-mobile: minmax(0, 1fr);
60
+
61
+ --max-width-input: 24rem;
62
+ --input-min-width-sm: 5rem;
63
+ --min-width-input-sm: var(--input-min-width-sm);
64
+ /* AU.W8b.4 — canonical popover width (Combobox list + anchor). Lifts the
65
+ `w-[200px]` arbitrary-value wrap to the `w-popover` @theme utility. */
66
+ --popover-width: 200px;
67
+ --chart-height-compact: 15rem;
68
+ --chart-height-default: 22.5rem;
69
+ --chart-height-large: 25rem;
70
+ --chart-margin: 1.25rem;
71
+ --paper-texture-size: 200px 200px;
72
+
73
+ /* Border opacity scale */
74
+ --border-opacity-light: 0.15;
75
+ --border-opacity-medium: 0.25;
76
+ --border-opacity-strong: 0.6;
77
+
78
+ /* ═══════════════════════════════════════════════
79
+ §10 SIZING
80
+ ═══════════════════════════════════════════════ */
81
+ /* ── The ONE comfortable-sizing scale doctrine (AX.W51 D18) ──────────────
82
+ `--ui-scale` is the MASTER comfortable-sizing scalar — ONE unitless knob
83
+ (registered @property <number>, inherits:true, default the identity 1)
84
+ every interactive-control magnitude derives through `calc(<base> *
85
+ var(--ui-scale))`, so a single override grows control HEIGHT + PADDING +
86
+ GAP + FONT-SIZE + GLYPH in LOCKSTEP, proportion preserved, no per-component
87
+ hack. The cohorts below (`--control-h-*` heights, `--control-text*` control
88
+ fonts, `--ui-glyph*` glyphs) are its reading surfaces; the CVA bases + the
89
+ `.btn-pill`/`.input-pill` pills consume them.
90
+
91
+ ONE scale system, not three. The dock (`--dock-scale`) and the dropdown
92
+ family (`--dropdown-text`, W50) are SPECIALIZATIONS that read this axis:
93
+ `--dock-scale: calc(var(--ui-scale) * var(--dock-local-scale, 1))` — the
94
+ dock multiplies ON TOP of the global comfort axis (its existing geometry
95
+ `calc` cascade inherits the global axis for free, zero edit). A consumer
96
+ re-tints the whole library's comfort from ONE `:root { --ui-scale: … }`
97
+ override (or a scoped region — a dense data-table sets it lower) — the
98
+ token-first axis.
99
+
100
+ EXCLUDED — the φ-DISPLAY ladder (`--type-display-*` / `--type-title` /
101
+ `--type-heading` / `--type-subheading`): a hero/title is a TYPOGRAPHIC
102
+ identity, NOT a touch target, so it does NOT grow on the comfort/coarse
103
+ axis. Only interactive-CONTROL text rides `--ui-scale`. Containers (card /
104
+ panel radii + paddings) are separate `--radius-*` / `--space-*` axes.
105
+
106
+ The desktop default is the IDENTITY (1) — byte-exact preservation, no
107
+ reflow of shipped consumers. The comfort GROWTH lives at the coarse-pointer
108
+ default (`--ui-coarse-scale`, §below) + the consumer override. The
109
+ WCAG-2.5.5 44px touch floor survives as a `max(…, --control-floor)` clamp
110
+ inside the scaled control-size (the coarse block lifts `--control-floor` to
111
+ `--touch-target`, so a sub-1 scale cannot drop a control under the target).
112
+ Coordinates with W54's `--glass-level` + W55's `--glass-tint-*` — SEPARATE
113
+ axes (size vs material vs legibility); a control is comfortably-sized AND
114
+ glass AND legible, three orthogonal knobs. */
115
+ --ui-scale: 1;
116
+ /* The global coarse-pointer comfort default — the WHOLE library grows ~1.5×
117
+ on touch from ONE place (the @media (pointer: coarse) block at §below lifts
118
+ :root --ui-scale to this). The dock's prior parallel 1.5× becomes the global
119
+ default it now shares. Public library-default identity — a consumer sets
120
+ 1.3 / 1.75 on :root or a scope. */
121
+ --ui-coarse-scale: 1.5;
122
+ /* The control-height cohort — the h-7/h-9/h-10/h-11 register (28/36/40/44px)
123
+ the CVA size rungs encode, each scaled by the master axis. The CVA rungs
124
+ read these via `h-[var(--control-h-*)]` instead of the raw `h-N` literal.
125
+ `--control-floor` is the WCAG-2.5.5 clamp seam (0 at desktop, lifted to
126
+ --touch-target under coarse-pointer); each height is `max(scaled, floor)`. */
127
+ --control-floor: 0px;
128
+ --control-h-xs: max(calc(1.75rem * var(--ui-scale)), var(--control-floor));
129
+ --control-h-sm: max(calc(2.25rem * var(--ui-scale)), var(--control-floor));
130
+ --control-h-md: max(calc(2.5rem * var(--ui-scale)), var(--control-floor));
131
+ --control-h-lg: max(calc(2.75rem * var(--ui-scale)), var(--control-floor));
132
+ /* The control-FONT register (RED 3 — the user's "font too small"). A comfort
133
+ multiplier BETWEEN the static φ-ladder rung and the painted control font,
134
+ so interactive-control text grows on the comfort axis while the φ-DISPLAY
135
+ ladder stays a pure typographic scale (display headings do NOT grow on
136
+ touch). `--control-text` is the workhorse (the `text-sm` register the
137
+ buttons/inputs/triggers carried); `--control-text-sm` is the quieter rung
138
+ (the `text-xs` badge/caption register). W50's `--dropdown-text` IS the
139
+ picker-family specialization of this register.
140
+
141
+ AY.W-SCALE1 — the no-double-vw reconcile: the desktop-fluid viewport base
142
+ lives ONCE in `--type-small` / `--type-caption` (typography.css §scale — a
143
+ gentle `clamp(…vw…)` so the control font grows on a wide display); the
144
+ `--ui-scale` comfort scalar multiplies that FLUID base exactly ONCE HERE. The
145
+ vw term is applied once (in the rung), the comfort factor once (here) — under
146
+ the coarse 1.5× the font grows by the comfort factor ONCE, NOT vw×1.5
147
+ over-scaled. Do NOT inline a second clamp() here, and do NOT multiply the rung
148
+ by --ui-scale at the rung. */
149
+ --control-text: calc(var(--type-small) * var(--ui-scale));
150
+ --control-text-sm: calc(var(--type-caption) * var(--ui-scale));
151
+ /* The control-GLYPH cohort (RED 4 — the glyph grows WITH the box). The
152
+ 1rem/0.875rem control-glyph register the `size-4`/`size-3.5` literals
153
+ encode; the un-sized-<svg> CVA rule reads these via
154
+ `size-[var(--ui-glyph)]`, KEEPING the `:not([class*=size-])` host-sized-icon
155
+ escape intact (an explicit `size-9` still wins). */
156
+ --ui-glyph: calc(1rem * var(--ui-scale));
157
+ --ui-glyph-sm: calc(0.875rem * var(--ui-scale));
158
+
159
+ /* ── The picker-family type-scale (AX.W50 D17) ───────────────────────────
160
+ ONE governed two-rung scale the WHOLE shadcn picker family (Select /
161
+ DropdownMenu / Combobox / ContextMenu / Command / MultiSelect) reads, so the
162
+ family paints at ONE uniform scale instead of the scattered raw
163
+ `text-sm`/`text-xs` Tailwind-literal lottery (item rows at `text-sm`,
164
+ headings/shortcuts at `text-xs`, the two filter inputs at mismatched heights).
165
+ A consumer re-tints the whole family from ONE override.
166
+
167
+ It is a SPECIALIZATION of W51's control-font register (one scale system, not
168
+ three): `--dropdown-text` reads `--control-text` (the comfort-scaled `text-sm`)
169
+ and `--dropdown-text-secondary` reads `--control-text-sm` (the comfort-scaled
170
+ `text-xs`), so the picker family rides the SAME `--ui-scale` comfort axis as
171
+ every other control — a `--ui-scale` bump grows the dropdowns too. A consumer
172
+ wanting the family LARGER than the rest overrides `--dropdown-text` directly
173
+ (e.g. `var(--type-body)`); the override re-resolves every family surface.
174
+
175
+ Scale-contract (which surface reads which rung):
176
+ • PRIMARY (`--dropdown-text`) → item rows, triggers, filter inputs, empties.
177
+ • SECONDARY (`--dropdown-text-secondary`) → section labels, group-headings,
178
+ keyboard shortcuts (the quieter-than-item caption register; resolves the
179
+ witness-2 contradiction — the Select/DropdownMenu/ContextMenu labels
180
+ collapse DOWN to the secondary rung to match the Combobox/Command headings,
181
+ ONE rung for the section-label role family-wide).
182
+ `--dropdown-input-height` unifies the two filter-input heights (Combobox was
183
+ h-10, Command was h-11) onto ONE register — a specialization of W51's
184
+ `--control-h-md` so the picker input scales on the comfort axis with the font. */
185
+ --dropdown-text: var(--control-text);
186
+ --dropdown-text-secondary: var(--control-text-sm);
187
+ --dropdown-input-height: var(--control-h-md);
188
+
189
+ --size-icon-btn: 2.5rem;
190
+ --icon-xs: 0.75rem;
191
+ --icon-sm: 0.875rem;
192
+ --icon-md: 1rem;
193
+ --icon-lg: 1.25rem;
194
+ --icon-xl: 1.5rem;
195
+ /* V.W2 T9 — 32px rung; spinner glyphs (Loader2) + dense table-row buttons.
196
+ Naming follows the radius ladder + Tailwind convention (2xl > xl > xxl) —
197
+ see B6 §2.4 for the naming rationale. */
198
+ --icon-2xl: 2rem;
199
+ /* V.W2 T10 — 40px rung; empty-state hero glyph (DashboardMap MapIcon).
200
+ AI.W5-ζ — rebound from `2.5rem` literal to `var(--size-icon-btn)` so
201
+ the alignment is contractual single-source-of-truth rather than the
202
+ coincidental numerical match noted prior. */
203
+ --icon-3xl: var(--size-icon-btn);
204
+ /* V.W2 T11 — 56px rung; FlowSelector school/home survey-flow picker.
205
+ Largest rung in the icon ladder; reserved for hero-class glyphs. */
206
+ --icon-hero: 3.5rem;
207
+
208
+ /* Golden-ratio spacing rungs — φ² and φ³. Preemptive substrate; W4 hero
209
+ chassis + W5 StoryChassis migration land the consumers. R3 §A row 1.
210
+ The 0..4 rungs are not currently named (consumers reach via
211
+ Tailwind's spacing scale); 5/6 land here because their values fall
212
+ outside the default ladder and the audacious chassis pattern wants
213
+ a named handle. */
214
+ --space-phi-5: 2.618rem; /* φ² */
215
+ --space-phi-6: 4.236rem; /* φ³ */
216
+
217
+ /* Dock geometry — consumers may override locally */
218
+ --dock-h: calc(var(--size-icon-btn) + 0.75rem + 3px);
219
+ --dock-margin: 0.5rem;
220
+ --dock-menubar-reserve: 4rem;
221
+
222
+ /* AX.W45 — the dock geometry multiplier. `--dock-scale` threads the WHOLE
223
+ `.glass-dock[data-density]` geometry cascade (box, padding, gap, tab,
224
+ tile-min, glyph) via `calc(<base> * --dock-scale)`, so a single knob grows
225
+ every dock axis in lockstep. The WCAG 2.5.5 44px floor survives as a `max(…,
226
+ 44px)` clamp INSIDE the scaled control-size.
227
+
228
+ AX.W51 RECONCILE (D18) — `--dock-scale` is RE-HOMED as a SPECIALIZATION of
229
+ the global `--ui-scale` comfort axis: `calc(var(--ui-scale) *
230
+ var(--dock-local-scale, 1))`. The dock now MULTIPLIES on top of the global
231
+ comfort scalar — its whole existing geometry `calc` chain inherits the global
232
+ axis for FREE (zero edit to the density cascade; the reconcile is at this ONE
233
+ definition line). At the desktop identity (`--ui-scale: 1`,
234
+ `--dock-local-scale: 1`) the dock is byte-identical to HEAD. On coarse-pointer
235
+ the GLOBAL `:root { --ui-scale: var(--ui-coarse-scale, 1.5) }` block grows the
236
+ dock WITH the rest of the library — ONE consistent touch scale, not a parallel
237
+ dock-only 1.5×. `--dock-local-scale` is the dock-local EXTRA multiplier
238
+ (default 1): a consumer who wants the dock LARGER than the global comfort sets
239
+ it, and the coarse block lifts it to `--dock-mobile-scale` (default 1, the
240
+ stack-extra) so the dock can grow an extra notch ON TOP of the global coarse
241
+ default. `--dock-mobile-scale` is the public library-default identity
242
+ (presets-in-consumers: a consumer sets 1.3/1.75 on `:root` or a dock scope). */
243
+ --dock-scale: calc(var(--ui-scale) * var(--dock-local-scale, 1));
244
+ --dock-local-scale: 1;
245
+ --dock-mobile-scale: 1;
246
+ /* Library glyph ownership — `.dock-icon-button > svg` reads this so the dock
247
+ icon glyph scales WITH the box (mirroring `.dark-mode-toggle-button > svg`).
248
+ A consumer-passed explicit lucide size class still WINS (utility layer >
249
+ component layer); this is a DEFAULT, not a ceiling. */
250
+ --dock-icon-glyph: calc(1.25rem * var(--dock-scale));
251
+
252
+ /* AX.W45-TUNE Q1 — the COLLAPSED-pill floor tokens. The collapsed summary
253
+ used to fall to `--dock-layer-height` (the FULL control height, ~2.5rem) for
254
+ its `min-width` with NO block floor, so the shrunken pill read as an
255
+ un-collapsed control row, not a tight proportioned squircle. These two floor
256
+ tokens (referenced by dock.css's `.collapsed .dock-layer--summary` min-size +
257
+ the `--dock-pad-collapsed` morph floor) mint a TIGHT proportioned pill: the
258
+ summary min-size is ≈70% of the full control height (a proportioned dot, not a
259
+ full-row stub — the ratified default), and the collapsed padding is a step
260
+ BELOW the expanded `--dock-padding-block` so the collapsed chrome hugs the
261
+ glyph. The summary carries a SYMMETRIC `min-block-size` (dock.css) keyed to the
262
+ same token so the pill floors on BOTH axes — a squircle, not a stub. Consumers
263
+ retune the pill geometry per-instance via these two handles. */
264
+ /* AY.W-DOCK-NAV B4 — the collapsed pill is a PERFECT CIRCLE (the user's
265
+ "circle, not oval" bar). The diameter is the collapsed-summary min-size on
266
+ BOTH axes; the morph.css `.collapsed .dock-layer--summary` rule LIFTS the
267
+ `.dock-layer` height-lock (`height: var(--dock-layer-height)`) for the
268
+ collapsed summary so the pane is square at this token (the prior oval —
269
+ 38×50, aspect 0.76 — was the locked 40px height against a 28px min-width).
270
+ The 0.85× value is a TIGHT proportioned circle a step below the full control
271
+ (so the collapsed dot reads smaller than an expanded control row) while
272
+ staying large enough that the centred glyph is not cramped. A consumer
273
+ retunes the circle diameter via this one handle. */
274
+ --dock-collapsed-summary-min-size: calc(var(--dock-layer-height, 2.5rem) * 0.85);
275
+ /* AX.W61 — the collapsed padding now threads the ONE `--dock-scale` coarse-pointer
276
+ multiplier DIRECTLY (at HEAD it was a flat 0.25rem off the scale, so the
277
+ collapsed pad alone stayed desktop-sized at the 1.5x mobile scale while the
278
+ box/glyph/min-size grew — a desync the morph then interpolated FROM). The
279
+ summary min-size already threads `--dock-scale` transitively through
280
+ `--dock-layer-height` (itself `calc(* --dock-scale)` at every density rung); this
281
+ lands the collapsed pad on the same thread so the whole collapsed pill scales
282
+ coherently on touch. The 0.25rem base stays the ratified tight floor. */
283
+ --dock-collapsed-padding: calc(0.25rem * var(--dock-scale));
284
+
285
+ /* AX.W45-TUNE Q3/C3 + C5 — the dock-control family reads a real GLASS register
286
+ on hover/active, NOT a same-hue `--card` mix at an alpha adjacent to the dock's
287
+ own `--glass-bg-dock` substrate (a sub-1%-ΔL no-op — the loud Q3 tell: "nothing
288
+ on hover, something on click"). Both legs now point at NAMED glass tiers a
289
+ measurable step ABOVE the dock's 42%-opacity substrate:
290
+ • hover → `--glass-bg-resting` (the 65% glass plate) — the control surface
291
+ WAKES as a brighter glass tier on hover, reading the blurred dock
292
+ substrate through it. The +ΔL above `--glass-bg-dock` is perceptible
293
+ BEFORE click; the specular gleam + scale ride alongside (one register).
294
+ • active → `--glass-bg-floating` (the 80% glass plate) — a tier ABOVE hover,
295
+ the keyframes-dock "selected element reads as glass" model the user
296
+ named (`pass-3:13`): the selected tile is a glass tier that shows the
297
+ substrate through it, NOT the flat `--surface-tint-12` ink wash. The
298
+ active ≠ hover register is the glass-tier step, not an alpha nudge.
299
+ This is a REGISTER change (substrate→glass-tier), not a magnitude knob. The
300
+ per-control `--dock-icon-hover-bg` override still wins if a consumer set it. */
301
+ --dock-control-hover-bg: var(--glass-bg-resting);
302
+ --dock-control-active-bg: var(--glass-bg-floating);
303
+
304
+ /* AX.W45-TUNE C4/C5 — the small-tile specular override. The 40px dock-control
305
+ tile is a fraction of a card's plate, so the global `--glass-specular-size`
306
+ (36% of the plate) blooms a disproportionate disc on a hover/active dock tile
307
+ (the I.W6 finding). The dock controls scope a TIGHTER radius (22%) so the gleam
308
+ wakes as a restrained EDGE-catch on the small tile, not a tile-filling bloom —
309
+ the right resolution of I.W6 (sized-down on the small surface), not turning the
310
+ specular off everywhere. Read by the dock-control `::before` recipe (glass.css)
311
+ via the family-scoped override below; the global card/panel size is untouched. */
312
+ --dock-control-specular-size: 22%;
313
+
314
+ /* AX.W45 DK8 — the layer-switcher rail surface ladder. The rail
315
+ (`.dock-layer-rail` inside a `<DockLayerGroup>`) gets its own quiet plate +
316
+ a tunable hover/active affordance, replacing the raw `--primary 15%` /
317
+ `--accent 40%` mixes the indicator/tab used against an absent plate. */
318
+ --dock-layer-rail-bg: var(--surface-tint-8);
319
+ --dock-layer-rail-hover: color-mix(in srgb, var(--accent) 40%, transparent);
320
+ --dock-layer-rail-active: color-mix(in srgb, var(--primary) 15%, transparent);
321
+ /* AY.W-DOCK-NAV B6 — the switcher-rail TAB is a COMPACT square, distinct from
322
+ the 40px dock CONTROL. The prior fallback chain (`var(--dock-control-size,
323
+ 1.75rem)`) resolved to the full 40px control, so a 3-tab column rail stood
324
+ ~140px tall — a giant pill of dead space. A dedicated tighter tab size
325
+ (1.75rem = 28px, density-scaled) keeps the rail a compact icon column the
326
+ indicator travels cleanly, and the dock grows only as tall as the rail needs.
327
+ Consumers retune the rail-tab size via this one handle. */
328
+ --dock-layer-tab-size: calc(1.75rem * var(--dock-scale));
329
+
330
+ /* Dock active-state ladder (O.W6 Lane B)
331
+ Token-overridable active paint for `.dock-icon-button`. Promoted
332
+ from hardcoded `background: var(--muted); color: var(--foreground)`
333
+ per bbnf-buddy O11/c R1: 7 `:deep()` escapes at `ToolsLayer.vue`
334
+ redefine bg/color/scale/border/shadow on the active variant; the
335
+ ladder absorbs ~3 of 7 at a stroke. Defaults preserve the prior
336
+ visual contract (no transform, no border, no shadow) — overrides
337
+ take effect per-instance via `:root` or a parent scope, e.g.
338
+ `.tools-layer { --dock-active-scale: 1.2; --dock-active-bg: …; }`.
339
+ ≥ 2-consumer coverage: bbnf-buddy ToolsLayer (override consumer) +
340
+ speedtest dock (default consumer).
341
+
342
+ AX.W45 DK2 — re-pointed off the opaque `--muted` plate onto the glass-
343
+ correct `--dock-control-active-bg` (a translucent tint a ladder step above
344
+ hover), so the icon-button active no longer stamps a solid cream rectangle
345
+ over the dock glass. The O.W6 active-ladder override consumers still retint
346
+ per-instance; only the DEFAULT moved to glass-correct. */
347
+ --dock-active-bg: var(--dock-control-active-bg);
348
+ --dock-active-color: var(--foreground);
349
+ --dock-active-scale: 1;
350
+ --dock-active-border: none;
351
+ --dock-active-shadow: none;
352
+
353
+ /* Q.W3 Lane G (Q-cos-13) — the O.W6 Lane D `--icon-tooltip-hit-area`
354
+ token retired here. IconTooltip no longer owns a wrap-span; the
355
+ slotted child carries its own WCAG 2.5.5 hit-area (interactive
356
+ children via their four-state contract, bare glyphs via a
357
+ `min-h-11 min-w-11` host). No orphaned token left behind. */
358
+
359
+ /* O.W6 Lane D — Dock touch-target floor. Mirrors the IconTooltip
360
+ hit-area but for the dock-control surface. The base value tracks
361
+ the desktop default (`--size-icon-btn`); the
362
+ `@media (pointer: coarse)` block at `dock.css` lifts it to the
363
+ WCAG 2.5.5 floor on touch devices. */
364
+ --dock-touch-target: 2.75rem; /* 44px */
365
+
366
+ /* AQ.W3 §7 — canonical WCAG 2.5.5 (44px) touch-target floor for the
367
+ NON-dock coarse-pointer surfaces (`Button size="icon"`,
368
+ ExpandableContainer triggers, SegmentedTabs responsive mobile trigger). One
369
+ named rung the `@media (pointer: coarse)` block in utilities.css reads,
370
+ retiring the per-consumer one-liner `min-h-[44px]` patches. Equals
371
+ `--dock-touch-target` numerically; kept as a distinct token so the
372
+ dock floor and the general floor can be retuned independently. */
373
+ --touch-target: 2.75rem; /* 44px */
374
+
375
+ /* MetricBadge — stacked variant geometry. The 2-row stacked layout
376
+ (label / value+unit) wants a taller floor than the inline pill so the
377
+ label has breathing room above the baseline pair. T.W2.T2 +
378
+ audit B-spec §3.2 vertical-rhythm table land 42px (2.625rem) as the
379
+ min-height with 6px (0.375rem) block padding. The inline ladder
380
+ keeps its tight defaults via `--metric-badge-min-height` /
381
+ `--metric-badge-padding-block` (declared inline at the
382
+ `.metric-badge` selector). */
383
+ --metric-badge-min-height-stacked: 2.625rem;
384
+ --metric-badge-padding-block-stacked: 0.375rem;
385
+
386
+ /* Configurator — N.W2 Lane A density axis (4 rungs).
387
+ The `comfortable` rung restates the pre-N.W2 baked recipe exactly
388
+ (`gap-1.5 py-2` = 0.375rem / 0.5rem) so unparameterised consumers
389
+ see no visual change. `mobile` halves the vertical breathing room
390
+ for narrow-viewport studios; `spacious` doubles it for settings-
391
+ page hosts. See `<ConfiguratorRow>` scoped CSS for the attribute-
392
+ selector binding. */
393
+ --configurator-row-gap-mobile: 0.25rem; /* 4px — tight */
394
+ --configurator-row-gap-compact: 0.3125rem; /* 5px — slightly tighter */
395
+ --configurator-row-gap-comfortable: 0.375rem; /* 6px — pre-N.W2 default */
396
+ --configurator-row-gap-spacious: 0.75rem; /* 12px — generous */
397
+
398
+ --configurator-row-py-mobile: 0.25rem; /* 4px — tight */
399
+ --configurator-row-py-compact: 0.375rem; /* 6px — slightly tighter */
400
+ --configurator-row-py-comfortable: 0.5rem; /* 8px — pre-N.W2 default */
401
+ --configurator-row-py-spacious: 0.875rem; /* 14px — generous */
402
+
403
+ /* Component font override (consumers override locally) */
404
+ --select-font: inherit;
405
+
406
+ }
@@ -0,0 +1,169 @@
1
+ /* tokens/property-regs.css
2
+ §18 Houdini @property registrations (progress/phase/ripple/specular/glass-level/ui-scale) + §11b the pointer-anchored moving-specular :root/.dark magnitude cohort. LAST — registrations + the magnitude cohort that reads them.
3
+ Carved from the tokens.css cascade root; @import-ed by tokens.css in
4
+ cascade order. Same :root cascade context as its siblings. */
5
+ /* ═══════════════════════════════════════════════
6
+ §18 TYPED CSS PROPERTIES — Houdini @property registrations
7
+ (AI.W4 grammar — adjacent to §2.C tokens above)
8
+
9
+ Three typed custom properties register with the CSS Houdini @property
10
+ API so transitions interpolate VALUES (percentage / length) rather
11
+ than the textual representation. Unregistered fallback is safe — the
12
+ `initial-value` provides a sensible default for any consumer that
13
+ imports this stylesheet on a browser that doesn't yet support the
14
+ typed @property registration (the cross-fade collapses to the
15
+ initial value, then re-paints at the new state).
16
+
17
+ Browser support: Chromium 85+, Safari 16.4+, Firefox 128+. The
18
+ speedtest deployment target sits well within the floor.
19
+
20
+ • --progress-crescendo (percentage) — the leading-edge brightness
21
+ ramp on `<Progress variant="gradient">` past 85% modelValue.
22
+ `inherits: false` because the value is consumed at one
23
+ declaration only (the gradient stop calculation); inheriting
24
+ would let an unrelated ancestor accidentally drive a sibling
25
+ progress bar.
26
+
27
+ • --phase-tint-amount (percentage) — the chassis depth-of-tint
28
+ companion to `--phase-color`. `inherits: true` because the
29
+ value cascades from the chassis root through every region
30
+ wrapper that reads it for a sympathetic tint (matches the
31
+ `--phase-color` inheritance pattern).
32
+
33
+ • --ripple-radius (length) — the `btn-audacious` press ripple
34
+ radial. `inherits: false` because each button owns its own
35
+ ripple state (a hovered parent must not push a ripple-radius
36
+ onto a non-pressed child).
37
+ ═══════════════════════════════════════════════ */
38
+
39
+ @property --progress-crescendo {
40
+ syntax: "<percentage>";
41
+ inherits: false;
42
+ initial-value: 0%;
43
+ }
44
+
45
+ @property --phase-tint-amount {
46
+ syntax: "<percentage>";
47
+ inherits: true;
48
+ initial-value: 0%;
49
+ }
50
+
51
+ @property --ripple-radius {
52
+ syntax: "<length>";
53
+ inherits: false;
54
+ initial-value: 0px;
55
+ }
56
+
57
+ /* ═══════════════════════════════════════════════
58
+ §11b POINTER-ANCHORED MOVING SPECULAR (AV.W15)
59
+
60
+ The iOS-26 Liquid Glass "light travels around the material /
61
+ illuminate under your fingertip" behaviour. A masked radial-gradient
62
+ catch-light rides the surface at (--specular-x, --specular-y), driven
63
+ by the consumer's pointer-tracked --mouse-x/--mouse-y write. Registered
64
+ as typed custom properties so the position INTERPOLATES smoothly between
65
+ pointer samples (a bare unregistered var() snaps; the @property reg lets
66
+ the engine animate the percentage stop).
67
+
68
+ • --specular-x / --specular-y (percentage) — the catch-light centre.
69
+ `inherits: false` because each glass surface owns its own pointer
70
+ position (a hovered parent must not push its specular onto a child —
71
+ the no-glass-on-glass discipline made mechanical).
72
+
73
+ • --specular-intensity (number) — the catch-light alpha multiplier.
74
+ `inherits: false` for the same per-surface-ownership reason; rises on
75
+ hover/active, settles to its rest floor on leave.
76
+
77
+ @property crosses Baseline 2024-07-09. The consumption (the masked
78
+ radial + the reduced-motion static bracket + the var() fallback) lives
79
+ in glass-specular-track.css; the registrations live here alongside the
80
+ other three regs so the typed-property tier has one home.
81
+ ═══════════════════════════════════════════════ */
82
+
83
+ @property --specular-x {
84
+ syntax: "<percentage>";
85
+ inherits: false;
86
+ initial-value: 50%;
87
+ }
88
+
89
+ @property --specular-y {
90
+ syntax: "<percentage>";
91
+ inherits: false;
92
+ initial-value: 50%;
93
+ }
94
+
95
+ @property --specular-intensity {
96
+ syntax: "<number>";
97
+ inherits: false;
98
+ initial-value: 0;
99
+ }
100
+
101
+ /* AX.W54 — the GLASS-FIRST single knob. `--glass-level` is the ONE clarity
102
+ scalar threaded through BOTH glass ladders at their single sites (the
103
+ `--glass-bg-*` opacity recipe + the `--glass-blur-*` radii). It is a typed,
104
+ INHERITING <number> so a host setting it on any ancestor retunes every
105
+ descendant glass surface (the @container-free cascade path) — and so it
106
+ animates smoothly rather than snapping. The level acts as a clarity multiplier
107
+ that PRESERVES level=1 (byte-identical to the hand-tuned ladder):
108
+ • level 1 — the calibrated glass (today's surfaces, unchanged).
109
+ • level 0 — the OPAQUE escape: solid `--card` + `blur(0)` through the SAME
110
+ machinery (the `.glass-opaque` rung + the a11y brackets ride it).
111
+ • level >1 — clearer (more transparent + more diffuse) in lockstep.
112
+ Glass is the DEFAULT surface register for EVERY band (USER-DECIDED MAXIMAL);
113
+ the opaque level-0 rung is the explicit opt-out. W55 carries the over-light
114
+ legibility on the SEPARATE `--glass-tint-*` axis (the `--glass-backdrop` probe
115
+ lifts the tint toward ink — level = opacity+blur, tint = darken-over-light, the
116
+ two axes coordinate but never collapse: the a11y Clear↔Tinted escape rides
117
+ level-up here AND tint-toward-ink under `prefers-contrast: more`). */
118
+ @property --glass-level {
119
+ syntax: "<number>";
120
+ inherits: true;
121
+ initial-value: 1;
122
+ }
123
+
124
+ /* AX.W51 D18 — the master comfortable-sizing scalar registered typed. The
125
+ `<number>` syntax guarantees `calc(<base> * var(--ui-scale))` is always valid (a
126
+ malformed override CLAMPS to the initial value 1, not an invalidated calc — the
127
+ fail-safe); `inherits: true` (unlike the per-element specular @property cohort)
128
+ so a SCOPED override (a dense data-table region) cascades to every descendant
129
+ control without a per-element set; the type makes it animatable (a density
130
+ toggle COULD spring it). Mirrors the `--glass-level` registration above (the
131
+ cascading-scalar idiom), distinct from the per-element specular @property cohort
132
+ (those are `inherits: false`). */
133
+ @property --ui-scale {
134
+ syntax: "<number>";
135
+ inherits: true;
136
+ initial-value: 1;
137
+ }
138
+
139
+ /* ── The specular-intensity magnitude cohort (AX.W09) ──────────────────────
140
+ The catch-light alpha multiplier at each interaction state, as a SINGLE
141
+ overridable token cohort (was three buried literals across glass.css —
142
+ `0.35` rest floor / `0.6` hover / `0.85` active — and the `.dark` arm's
143
+ `0.22`). `glass.css`'s `.glass-material::before` rest/hover/active rules READ
144
+ these, so the subtle-vs-extreme magnitude is a knob a consumer (or the dark
145
+ arm) retunes ON THE CASCADE — never a re-buried literal. Override on `:root`
146
+ to retune library-wide; the cartoon-shadow override contract is the precedent.
147
+
148
+ Re-baselined AGAIN at AX.W52 D19 — with the central screen-disc replaced by a
149
+ BOUNDED plus-lighter edge gleam (glass.css), the gleam is a whisper at every
150
+ rung, so the cohort drops further (the W09 0.22/0.32 ceiling still lifted the
151
+ whole-tile disc on hover):
152
+ • rest 0 — static, unwired surfaces are CLEAN; the gleam wakes only on
153
+ hover/active or on a pointer-wired surface. Aligns the painted
154
+ rest with the @property `--specular-intensity { initial-value:
155
+ 0 }` dormancy.
156
+ • hover 0.10 — a whisper edge gleam, not a bloom.
157
+ • active 0.16 — the press whisper. */
158
+ :root {
159
+ --glass-specular-intensity-rest: 0;
160
+ --glass-specular-intensity-hover: 0.1;
161
+ --glass-specular-intensity-active: 0.16;
162
+ }
163
+
164
+ /* Over the deep canvas `plus-lighter` still lifts, so the dark arm runs a touch
165
+ softer on the interaction rungs (rest already 0). */
166
+ .dark {
167
+ --glass-specular-intensity-hover: 0.08;
168
+ --glass-specular-intensity-active: 0.12;
169
+ }