@mkbabb/glass-ui 4.0.0 → 4.0.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 (394) hide show
  1. package/README.md +3 -1
  2. package/dist/CardAction-CW7a0m8M.js +253 -0
  3. package/dist/{CommandShortcut-DdtWXxOK.js → CommandShortcut-DvZNQ_HF.js} +4 -4
  4. package/dist/ConfiguratorRow-BR4l-ixA.js +143 -0
  5. package/dist/{ContextMenuContent-ON3x7cuk.js → ContextMenuContent-uWnVxDab.js} +1 -1
  6. package/dist/{ContextMenuSubContent-B0Vs6atR.js → ContextMenuSubContent-xol4sD2q.js} +32 -37
  7. package/dist/{DataTable-C464Zbqd.js → DataTable-CuKwF7wr.js} +4 -4
  8. package/dist/{DialogContent-DDE6pQBU.js → DialogContent-DcKK8k9i.js} +5 -5
  9. package/dist/{DialogFooter-8eZbdmPc.js → DialogFooter-BZNX5aVr.js} +3 -3
  10. package/dist/{FadingScroll-DwNnvKMs.js → FadingScroll-DI6hQhT9.js} +1 -1
  11. package/dist/{HoverCardContent-DkMaQzH5.js → HoverCardContent-b2uaAMRR.js} +1 -1
  12. package/dist/{HoverPopover-Dpzwvc4t.js → HoverPopover-CbqbNwgU.js} +2 -2
  13. package/dist/{IconChip-BDw1j5mu.js → IconChip-BTD-nay5.js} +3 -2
  14. package/dist/{IconTooltip-DSjasZIt.js → IconTooltip-Bl8gFZ8d.js} +1 -1
  15. package/dist/{Input-DVG_J0ne.js → Input-h9v5LeXf.js} +1 -1
  16. package/dist/{MetricBadge-BpC0R_Ec.js → MetricBadge-RHdBP72w.js} +1 -1
  17. package/dist/Notification-VUwexFUf.js +43 -0
  18. package/dist/NumberFieldContent-Cq7EzX-U.js +138 -0
  19. package/dist/{PopoverContent-BTorlp--.js → PopoverContent-DL7E6vJP.js} +4 -4
  20. package/dist/{Progress-hAT4gqGH.js → Progress-DctG61iZ.js} +4 -4
  21. package/dist/{ScrollingText-CUVFTWk2.js → ScrollingText-yOpBzFYq.js} +2 -2
  22. package/dist/{SelectScrollDownButton-C1jb3b3K.js → SelectScrollDownButton-CrA8F0iV.js} +18 -19
  23. package/dist/Toaster-Bw4xR8xV.js +274 -0
  24. package/dist/{ToggleGroupItem-Dzk9hWsF.js → ToggleGroupItem-pEM9vIhs.js} +50 -37
  25. package/dist/{TooltipProvider-B3MkB_8P.js → TooltipProvider-rzvnXz60.js} +1 -1
  26. package/dist/animated-digit.js +2 -2
  27. package/dist/api/index.d.ts +8 -3
  28. package/dist/api/types-extra.d.ts +6 -0
  29. package/dist/aurora.js +885 -242
  30. package/dist/badge.js +1 -1
  31. package/dist/border-progress.d.ts +1 -0
  32. package/dist/border-progress.js +106 -0
  33. package/dist/{button-BNDWhAZb.js → button-DYCUa-tH.js} +71 -26
  34. package/dist/button.js +1 -1
  35. package/dist/canvas.js +2 -2
  36. package/dist/card.js +2 -2
  37. package/dist/carousel.js +93 -110
  38. package/dist/collapsible.js +1 -1
  39. package/dist/command.js +1 -1
  40. package/dist/compile-CQEFRTmx.js +19 -0
  41. package/dist/components/custom/aurora/composables/atoms-fields.d.ts +39 -0
  42. package/dist/components/custom/aurora/composables/auroraFallbackGround.d.ts +108 -0
  43. package/dist/components/custom/aurora/composables/runtime.d.ts +19 -0
  44. package/dist/components/custom/aurora/composables/uniformBridge.d.ts +5 -1
  45. package/dist/components/custom/aurora/composables/uniformBridgeWGPU.d.ts +51 -0
  46. package/dist/components/custom/aurora/composables/wgpuSetup.d.ts +29 -0
  47. package/dist/components/custom/aurora/constants/budget.d.ts +21 -0
  48. package/dist/components/custom/aurora/constants/presets.d.ts +2 -2
  49. package/dist/components/custom/aurora/constants/renderMode.d.ts +63 -12
  50. package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +1 -0
  51. package/dist/components/custom/aurora/constants/shaders/oil-modes.glsl.d.ts +1 -0
  52. package/dist/components/custom/aurora/constants/shaders/procedural-color.wgsl.d.ts +4 -0
  53. package/dist/components/custom/aurora/index.d.ts +2 -1
  54. package/dist/components/custom/border-progress/BorderProgress.vue.d.ts +46 -0
  55. package/dist/components/custom/border-progress/composables/useBorderSpectrum.d.ts +22 -0
  56. package/dist/components/custom/border-progress/constants.d.ts +59 -0
  57. package/dist/components/custom/border-progress/index.d.ts +4 -0
  58. package/dist/components/custom/concentric/Concentric.vue.d.ts +39 -0
  59. package/dist/components/custom/concentric/composables/concentricGLSetup.d.ts +11 -0
  60. package/dist/components/custom/concentric/composables/concentricWGPUSetup.d.ts +13 -0
  61. package/dist/components/custom/concentric/composables/ringField.d.ts +44 -0
  62. package/dist/components/custom/concentric/composables/uniformBridgeWGPU.d.ts +13 -0
  63. package/dist/components/custom/concentric/composables/useConcentric.d.ts +35 -0
  64. package/dist/components/custom/concentric/constants.d.ts +43 -0
  65. package/dist/components/custom/concentric/index.d.ts +5 -0
  66. package/dist/components/custom/concentric/shaders/concentric.glsl.d.ts +4 -0
  67. package/dist/components/custom/concentric/shaders/concentric.wgsl.d.ts +1 -0
  68. package/dist/components/custom/dock/DockIconButton.vue.d.ts +13 -4
  69. package/dist/components/custom/dock/DockLayerGroup.vue.d.ts +10 -2
  70. package/dist/components/custom/dock/composables/dockMorphMeasure.d.ts +75 -0
  71. package/dist/components/custom/dock/composables/useLayerTransition.d.ts +13 -0
  72. package/dist/components/custom/dot-flow-field/DotFlowField.vue.d.ts +38 -0
  73. package/dist/components/custom/dot-flow-field/composables/flowField.d.ts +41 -0
  74. package/dist/components/custom/dot-flow-field/composables/uniformBridgeWGPU.d.ts +24 -0
  75. package/dist/components/custom/dot-flow-field/composables/useDotFlowField.d.ts +34 -0
  76. package/dist/components/custom/dot-flow-field/composables/useFlowParticles.d.ts +18 -0
  77. package/dist/components/custom/dot-flow-field/constants.d.ts +48 -0
  78. package/dist/components/custom/dot-flow-field/index.d.ts +5 -0
  79. package/dist/components/custom/dot-flow-field/shaders/flow-field.compute.wgsl.d.ts +1 -0
  80. package/dist/components/custom/dot-flow-field/shaders/flow-field.glsl.d.ts +20 -0
  81. package/dist/components/custom/dot-flow-field/shaders/flow-field.render.wgsl.d.ts +1 -0
  82. package/dist/components/custom/easing/EasingConfigurator.vue.d.ts +33 -0
  83. package/dist/components/custom/easing/EasingPicker.vue.d.ts +49 -0
  84. package/dist/components/custom/easing/composables/useEasingPicker.d.ts +75 -0
  85. package/dist/components/custom/easing/constants.d.ts +28 -0
  86. package/dist/components/custom/easing/index.d.ts +3 -0
  87. package/dist/components/custom/fourier-field/FourierField.vue.d.ts +12 -2
  88. package/dist/components/custom/fourier-field/composables/useFourierField.d.ts +39 -0
  89. package/dist/components/custom/fourier-field/constants.d.ts +7 -0
  90. package/dist/components/custom/glass-panel/GlassPanel.vue.d.ts +1 -1
  91. package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +4 -2
  92. package/dist/components/custom/goo-blob/composables/uniformBridgeWGPU.d.ts +24 -0
  93. package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +18 -11
  94. package/dist/components/custom/goo-blob/composables/wgpuSetup.d.ts +23 -0
  95. package/dist/components/custom/goo-blob/shaders/metaball.wgsl.d.ts +1 -0
  96. package/dist/components/custom/handmark/HandMark.vue.d.ts +1 -1
  97. package/dist/components/custom/icon-chip/types.d.ts +11 -1
  98. package/dist/components/custom/instrument-chassis/InstrumentChassis.vue.d.ts +3 -1
  99. package/dist/components/custom/metric-stack/MetricStack.vue.d.ts +1 -1
  100. package/dist/components/custom/spa-view/SpaView.vue.d.ts +50 -0
  101. package/dist/components/custom/spa-view/index.d.ts +2 -0
  102. package/dist/components/custom/tabs/SegmentedTabs.vue.d.ts +10 -0
  103. package/dist/components/custom/tabs/composables/useTabDragMorph.d.ts +42 -0
  104. package/dist/components/custom/watercolor-dot/WatercolorDot.vue.d.ts +1 -1
  105. package/dist/components/ui/_shared/menuItemVariants.d.ts +1 -1
  106. package/dist/components/ui/badge/index.d.ts +1 -1
  107. package/dist/components/ui/button/Button.vue.d.ts +5 -2
  108. package/dist/components/ui/button/index.d.ts +2 -2
  109. package/dist/components/ui/card/Card.vue.d.ts +34 -4
  110. package/dist/components/ui/card/CardHeader.vue.d.ts +42 -16
  111. package/dist/components/ui/card/ScrollCard.vue.d.ts +33 -0
  112. package/dist/components/ui/card/ScrollCardHeader.vue.d.ts +17 -0
  113. package/dist/components/ui/card/index.d.ts +2 -0
  114. package/dist/components/ui/carousel/CarouselNext.vue.d.ts +2 -2
  115. package/dist/components/ui/carousel/CarouselPrevious.vue.d.ts +2 -2
  116. package/dist/components/ui/carousel/GlassCarouselPager.vue.d.ts +2 -2
  117. package/dist/components/ui/command/Command.vue.d.ts +1 -1
  118. package/dist/components/ui/drawer/Drawer.vue.d.ts +46 -33
  119. package/dist/components/ui/drawer/DrawerContent.vue.d.ts +7 -8
  120. package/dist/components/ui/drawer/DrawerDescription.vue.d.ts +2 -2
  121. package/dist/components/ui/drawer/DrawerOverlay.vue.d.ts +1 -1
  122. package/dist/components/ui/drawer/DrawerTitle.vue.d.ts +2 -2
  123. package/dist/components/ui/drawer/composables/drawerSnapContext.d.ts +26 -0
  124. package/dist/components/ui/drawer/composables/useDrawerSnap.d.ts +17 -0
  125. package/dist/components/ui/drawer/constants.d.ts +45 -0
  126. package/dist/components/ui/drawer/index.d.ts +23 -15
  127. package/dist/components/ui/focus-scope/FocusScope.vue.d.ts +20 -0
  128. package/dist/components/ui/focus-scope/index.d.ts +2 -0
  129. package/dist/components/ui/index.d.ts +1 -0
  130. package/dist/components/ui/progress/ProgressDefault.vue.d.ts +3 -2
  131. package/dist/components/ui/select/SelectContent.vue.d.ts +1 -1
  132. package/dist/components/ui/sheet/index.d.ts +1 -1
  133. package/dist/components/ui/tags-input/TagsInput.vue.d.ts +2 -2
  134. package/dist/components/ui/toast/Toast.vue.d.ts +5 -2
  135. package/dist/components/ui/toast/use-toast.d.ts +14 -0
  136. package/dist/components/ui/toggle/Toggle.vue.d.ts +1 -1
  137. package/dist/composables/glass/canvas2d/useCanvas2D.d.ts +13 -6
  138. package/dist/composables/glass/index.d.ts +5 -2
  139. package/dist/composables/glass/useSpecularPointer.d.ts +33 -0
  140. package/dist/composables/glass/useSpecularTracking.d.ts +20 -0
  141. package/dist/composables/glass/vSpecular.d.ts +2 -0
  142. package/dist/composables/glass/webgl/shaders/flow.glsl.d.ts +1 -0
  143. package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +16 -0
  144. package/dist/composables/glass/webgpu/index.d.ts +2 -0
  145. package/dist/composables/glass/webgpu/useGpuSubstrate.d.ts +54 -0
  146. package/dist/composables/glass/webgpu/useWebGPUCanvas.d.ts +84 -0
  147. package/dist/composables/motion/core/index.d.ts +1 -0
  148. package/dist/composables/motion/index.d.ts +4 -0
  149. package/dist/composables/motion/useDockCtaReceive.d.ts +59 -0
  150. package/dist/composables/motion/useDragMorph.d.ts +77 -0
  151. package/dist/composables/motion/useLiquidFlex.d.ts +11 -0
  152. package/dist/composables/motion/useLiquidPress.d.ts +71 -0
  153. package/dist/composables/motion/useLiquidReveal.d.ts +51 -0
  154. package/dist/composables/motion/useNumericTransition.d.ts +3 -3
  155. package/dist/composables/motion/usePointerVelocityField.d.ts +98 -0
  156. package/dist/concentric.d.ts +1 -0
  157. package/dist/concentric.js +562 -0
  158. package/dist/configurator.js +3 -2
  159. package/dist/confirm-dialog.js +22 -24
  160. package/dist/constellation.js +11 -11
  161. package/dist/context-menu.js +3 -3
  162. package/dist/controls.js +1 -1
  163. package/dist/createCanvasLifecycle-CHD5XrDW.js +82 -0
  164. package/dist/data-table.js +1 -1
  165. package/dist/dialog.js +2 -2
  166. package/dist/dock.js +564 -457
  167. package/dist/{dockContext-Bu1Avy-a.js → dockContext-BNfyPLe9.js} +1 -1
  168. package/dist/dom.js +5 -5
  169. package/dist/dot-flow-field.d.ts +1 -0
  170. package/dist/dot-flow-field.js +604 -0
  171. package/dist/drawer.d.ts +1 -0
  172. package/dist/drawer.js +380 -0
  173. package/dist/{dropdown-menu-BJ7E9js_.js → dropdown-menu-CofSZuk8.js} +14 -15
  174. package/dist/dropdown-menu.js +1 -1
  175. package/dist/easing.d.ts +1 -0
  176. package/dist/easing.js +463 -0
  177. package/dist/expandable-container.js +7 -4
  178. package/dist/fading-scroll.js +1 -1
  179. package/dist/focus-scope.d.ts +1 -0
  180. package/dist/focus-scope.js +23 -0
  181. package/dist/forms.js +7 -7
  182. package/dist/fourier-field.js +128 -116
  183. package/dist/fourier-math.js +1 -1
  184. package/dist/glass-panel.js +2 -2
  185. package/dist/glass-ui.css +1 -1
  186. package/dist/glass-ui.js +149 -341
  187. package/dist/goo-blob.js +830 -224
  188. package/dist/handmark.js +2 -2
  189. package/dist/header-ribbon.js +1 -1
  190. package/dist/hover-card.js +1 -1
  191. package/dist/hover-popover.js +1 -1
  192. package/dist/icon-chip.js +1 -1
  193. package/dist/icon-tooltip.js +1 -1
  194. package/dist/index.d.ts +1 -1
  195. package/dist/instrument-chassis.js +1 -1
  196. package/dist/label.js +1 -1
  197. package/dist/labeled-field.js +6 -6
  198. package/dist/metric-badge.js +1 -1
  199. package/dist/metric-cell.js +1 -1
  200. package/dist/metric-stack.js +4 -8
  201. package/dist/motion-core.js +36 -36
  202. package/dist/motion-curves.js +1 -1
  203. package/dist/motion.js +157 -55
  204. package/dist/notification.js +1 -1
  205. package/dist/number-field.js +1 -1
  206. package/dist/pager-dots.js +1 -1
  207. package/dist/paper-backdrop.js +1 -1
  208. package/dist/popover.js +1 -1
  209. package/dist/{compile-EXXzEr1q.js → procedural-color.glsl-CIFsJhwI.js} +1 -155
  210. package/dist/procedural-color.wgsl-CToRHugY.js +224 -0
  211. package/dist/progress.js +1 -1
  212. package/dist/pulse.js +1 -1
  213. package/dist/reactive.js +2 -2
  214. package/dist/scrolling-text.js +1 -1
  215. package/dist/search.js +9 -11
  216. package/dist/select.js +3 -3
  217. package/dist/separator.js +1 -1
  218. package/dist/{sheet-CquRYOAw.js → sheet-tZMg0E0w.js} +5 -5
  219. package/dist/sheet.js +1 -1
  220. package/dist/{slider-DQ95MET2.js → slider-DVb4HXU-.js} +3 -3
  221. package/dist/slider.js +1 -1
  222. package/dist/sortable-list.js +3 -3
  223. package/dist/spa-view.d.ts +1 -0
  224. package/dist/spa-view.js +46 -0
  225. package/dist/styles/animations.css +33 -9
  226. package/dist/styles/border-progress.css +109 -0
  227. package/dist/styles/cards.css +76 -0
  228. package/dist/styles/components.css +1 -1
  229. package/dist/styles/critical-partition.mjs +140 -0
  230. package/dist/styles/critical.css +12 -0
  231. package/dist/styles/deferred.css +31 -0
  232. package/dist/styles/dock/density.css +45 -0
  233. package/dist/styles/dock/layers.css +54 -30
  234. package/dist/styles/dock/morph.css +124 -7
  235. package/dist/styles/dock/overflow.css +16 -2
  236. package/dist/styles/dock/shell.css +54 -16
  237. package/dist/styles/dock.css +32 -0
  238. package/dist/styles/drawer.css +81 -35
  239. package/dist/styles/glass/deep.css +44 -0
  240. package/dist/styles/glass/ladder.css +87 -31
  241. package/dist/styles/glass/material.css +78 -15
  242. package/dist/styles/glass/reveal.css +136 -0
  243. package/dist/styles/glass/rim.css +100 -0
  244. package/dist/styles/glass/surfaces.css +101 -3
  245. package/dist/styles/glass-refract.css +96 -44
  246. package/dist/styles/glass-specular-track.css +7 -0
  247. package/dist/styles/glass.css +3 -0
  248. package/dist/styles/hover-popover.css +7 -6
  249. package/dist/styles/icon-chip.css +77 -15
  250. package/dist/styles/index.css +21 -9
  251. package/dist/styles/instrument-chassis.css +66 -3
  252. package/dist/styles/scroll-choreography.css +300 -0
  253. package/dist/styles/segmented-tabs.css +31 -0
  254. package/dist/styles/theme/bridges.css +11 -0
  255. package/dist/styles/theme/literals.css +11 -2
  256. package/dist/styles/theme/radius.css +6 -1
  257. package/dist/styles/tokens/dark-arm.css +98 -26
  258. package/dist/styles/tokens/glass-deep.css +75 -0
  259. package/dist/styles/tokens/glass-fx.css +333 -0
  260. package/dist/styles/tokens/glass.css +39 -319
  261. package/dist/styles/tokens/light-dark.css +15 -2
  262. package/dist/styles/tokens/offsets.css +116 -0
  263. package/dist/styles/tokens/on-glass-fg.css +39 -0
  264. package/dist/styles/tokens/property-regs.css +127 -0
  265. package/dist/styles/tokens/scale-paper.css +117 -89
  266. package/dist/styles/tokens/scheme-motion.css +70 -32
  267. package/dist/styles/tokens/scroll-tokens.css +123 -0
  268. package/dist/styles/tokens/{offsets-sizing.css → sizing.css} +37 -100
  269. package/dist/styles/tokens.css +9 -3
  270. package/dist/styles/typography/semantic.css +8 -8
  271. package/dist/styles/typography/utilities.css +22 -7
  272. package/dist/styles/utilities/animate.css +27 -24
  273. package/dist/styles/utilities/base-misc.css +255 -0
  274. package/dist/styles/utilities/base.css +47 -261
  275. package/dist/styles/utilities/btn.css +3 -1
  276. package/dist/styles/utilities/metal.css +189 -0
  277. package/dist/styles/utilities.css +14 -7
  278. package/dist/switch.js +1 -1
  279. package/dist/tabs.js +220 -107
  280. package/dist/timeline.js +2 -2
  281. package/dist/toast.js +1 -1
  282. package/dist/toggle-group.js +1 -1
  283. package/dist/tooltip.js +1 -1
  284. package/dist/typewriter.js +1 -1
  285. package/dist/useCanvas2D-B8w_E3Rr.js +83 -0
  286. package/dist/useConfiguratorState-DNlOh6c8.js +161 -0
  287. package/dist/useDragMorph-DgxnsVJz.js +102 -0
  288. package/dist/useLiquidPress-kfb4KX79.js +39 -0
  289. package/dist/usePointerVelocityField-JbRd5CrM.js +137 -0
  290. package/dist/useSpring-C0jyvEJB.js +40 -0
  291. package/dist/useSpringMount-q1amq1SJ.js +71 -0
  292. package/dist/useSpringPress-BsqPr7FJ.js +34 -0
  293. package/dist/{useTouchGate-28Tk2-t2.js → useTouchGate-CBZTD4SD.js} +1 -1
  294. package/dist/vSpecular-CQFmLNzA.js +68 -0
  295. package/dist/vendor-CKmzio-i.js +226 -0
  296. package/dist/watercolor-dot.js +2 -2
  297. package/package.json +126 -22
  298. package/src/styles/animations.css +33 -9
  299. package/src/styles/border-progress.css +109 -0
  300. package/src/styles/cards.css +76 -0
  301. package/src/styles/critical-partition.mjs +140 -0
  302. package/src/styles/dock/density.css +45 -0
  303. package/src/styles/dock/layers.css +54 -30
  304. package/src/styles/dock/morph.css +124 -7
  305. package/src/styles/dock/overflow.css +16 -2
  306. package/src/styles/dock/shell.css +54 -16
  307. package/src/styles/dock.css +32 -0
  308. package/src/styles/drawer.css +81 -35
  309. package/src/styles/glass/deep.css +44 -0
  310. package/src/styles/glass/ladder.css +87 -31
  311. package/src/styles/glass/material.css +78 -15
  312. package/src/styles/glass/reveal.css +136 -0
  313. package/src/styles/glass/rim.css +100 -0
  314. package/src/styles/glass/surfaces.css +101 -3
  315. package/src/styles/glass-refract.css +96 -44
  316. package/src/styles/glass-specular-track.css +7 -0
  317. package/src/styles/glass.css +3 -0
  318. package/src/styles/hover-popover.css +7 -6
  319. package/src/styles/icon-chip.css +77 -15
  320. package/src/styles/index.css +12 -0
  321. package/src/styles/instrument-chassis.css +66 -3
  322. package/src/styles/scroll-choreography.css +300 -0
  323. package/src/styles/segmented-tabs.css +31 -0
  324. package/src/styles/theme/bridges.css +11 -0
  325. package/src/styles/theme/literals.css +11 -2
  326. package/src/styles/theme/radius.css +6 -1
  327. package/src/styles/tokens/dark-arm.css +98 -26
  328. package/src/styles/tokens/glass-deep.css +75 -0
  329. package/src/styles/tokens/glass-fx.css +333 -0
  330. package/src/styles/tokens/glass.css +39 -319
  331. package/src/styles/tokens/light-dark.css +15 -2
  332. package/src/styles/tokens/offsets.css +116 -0
  333. package/src/styles/tokens/on-glass-fg.css +39 -0
  334. package/src/styles/tokens/property-regs.css +127 -0
  335. package/src/styles/tokens/scale-paper.css +117 -89
  336. package/src/styles/tokens/scheme-motion.css +70 -32
  337. package/src/styles/tokens/scroll-tokens.css +123 -0
  338. package/src/styles/tokens/{offsets-sizing.css → sizing.css} +37 -100
  339. package/src/styles/tokens.css +9 -3
  340. package/src/styles/typography/semantic.css +8 -8
  341. package/src/styles/typography/utilities.css +22 -7
  342. package/src/styles/utilities/animate.css +27 -24
  343. package/src/styles/utilities/base-misc.css +255 -0
  344. package/src/styles/utilities/base.css +47 -261
  345. package/src/styles/utilities/btn.css +3 -1
  346. package/src/styles/utilities/metal.css +189 -0
  347. package/src/styles/utilities.css +14 -7
  348. package/dist/CardAction-XH4YBVEK.js +0 -158
  349. package/dist/Notification-DKjKsQq8.js +0 -100
  350. package/dist/NumberFieldContent-1VtwDSgf.js +0 -145
  351. package/dist/Toaster-Bm_HQSpc.js +0 -263
  352. package/dist/check-njhk-vfu.js +0 -7
  353. package/dist/chevron-down-DKkxb4VV.js +0 -7
  354. package/dist/chevron-right-CPXbqQQz.js +0 -7
  355. package/dist/chevron-up-n_24SqI-.js +0 -7
  356. package/dist/createLucideIcon-DydS2qgk.js +0 -43
  357. package/dist/minimize-2-BV31Ob_h.js +0 -38
  358. package/dist/search-BSGrf2Sk.js +0 -12
  359. package/dist/useCanvas2D-ClrQuZtp.js +0 -96
  360. package/dist/useConfiguratorState-kiIlun8I.js +0 -303
  361. package/dist/useSpecularTracking-Bo5su68i.js +0 -32
  362. package/dist/useSpringMount-CvopqiFr.js +0 -108
  363. package/dist/useViewTransition-COsPjQVZ.js +0 -47
  364. package/dist/x-BUwTKe50.js +0 -10
  365. /package/dist/{CollapsibleContent-C_s6fG7r.js → CollapsibleContent-68dEXIAl.js} +0 -0
  366. /package/dist/{InstrumentChassis-UUJX0-mW.js → InstrumentChassis-Bx0F_q5g.js} +0 -0
  367. /package/dist/{Label-Ck9SWEKM.js → Label-C2ejNWeC.js} +0 -0
  368. /package/dist/{ModalOverlay-CkPRRgl_.js → ModalOverlay-D1VrWyoi.js} +0 -0
  369. /package/dist/{PaperBackdrop-nBKe0vkB.js → PaperBackdrop-Vf3tlpvd.js} +0 -0
  370. /package/dist/{SelectGroup-Dcczq44n.js → SelectGroup-DwwjicPY.js} +0 -0
  371. /package/dist/{SelectSeparator-DK2y1Bun.js → SelectSeparator-DXswVdRz.js} +0 -0
  372. /package/dist/{Separator-BArl4OaB.js → Separator-pKF0oA4M.js} +0 -0
  373. /package/dist/{Switch-Dr--uLGH.js → Switch-CwYNf8bo.js} +0 -0
  374. /package/dist/{_plugin-vue_export-helper-CBt_VvXa.js → _plugin-vue_export-helper-C1je1s0u.js} +0 -0
  375. /package/dist/{badge-UILT_3pZ.js → badge-D9XWW4GT.js} +0 -0
  376. /package/dist/{createContext-B2RaZ-b8.js → createContext-CpBNTRMI.js} +0 -0
  377. /package/dist/{math-DeuJwLFx.js → math-BINYmg5z.js} +0 -0
  378. /package/dist/{menuItemVariants-DWRQXBxJ.js → menuItemVariants-D8VNHq22.js} +0 -0
  379. /package/dist/{prng-Cg22zv8g.js → prng-Za0Rmgag.js} +0 -0
  380. /package/dist/{resolveCanvasColor-BBiYfp8g.js → resolveCanvasColor-CUyHr5Uu.js} +0 -0
  381. /package/dist/{springPresets-WXaLbu8u.js → springPresets-CFQGQfdl.js} +0 -0
  382. /package/dist/{useAnimatedNumber-C_3wZLx4.js → useAnimatedNumber-BfUq2bUM.js} +0 -0
  383. /package/dist/{useInterval-CNdua40W.js → useInterval-CvK1mL92.js} +0 -0
  384. /package/dist/{useLiquidFlex-C12hXwOZ.js → useLiquidFlex-mZPMiNXh.js} +0 -0
  385. /package/dist/{useRAFLoop-CdwJ7284.js → useRAFLoop-UYa4zoiN.js} +0 -0
  386. /package/dist/{useResizeObserver-V6nq5gJb.js → useResizeObserver-Bpoi7tRE.js} +0 -0
  387. /package/dist/{useResolveTokenColor-NUG2zYAW.js → useResolveTokenColor-vAylyR0x.js} +0 -0
  388. /package/dist/{useSortable-BVqlJRBR.js → useSortable-DHjtZSEd.js} +0 -0
  389. /package/dist/{useSurfaceAxis-CMnF2zHb.js → useSurfaceAxis-g0NloYEF.js} +0 -0
  390. /package/dist/{useTextHighlight-NmBM5V_4.js → useTextHighlight-CWEi25hf.js} +0 -0
  391. /package/dist/{useTimer-B_PAasDL.js → useTimer-BHJOKr35.js} +0 -0
  392. /package/dist/{useUserInvalidAria-CDfJuakL.js → useUserInvalidAria-y5namzeE.js} +0 -0
  393. /package/dist/{useViewportReady-CvBcCYDf.js → useViewportReady-anbac3m6.js} +0 -0
  394. /package/dist/{vReveal-D9k0jADx.js → vReveal-Czsb7zQC.js} +0 -0
@@ -18,7 +18,12 @@
18
18
  position: relative;
19
19
  background: color-mix(in oklab, var(--glass-bg-quiet), var(--glass-tint-source) var(--glass-tint-strength));
20
20
  backdrop-filter: var(--glass-blur-quiet);
21
- border: 1px solid var(--card-focus-border);
21
+ /* BB.W-GLASS-ACCENT — the card border feeds its focus-elevation ink into the
22
+ accent-composed `--glass-border-accent` (ladder.css rim group); byte-
23
+ identical at 0% strength. The focus rung still re-points `--card-focus-
24
+ border`, which flows through `--glass-border-rung`. */
25
+ --glass-border-rung: var(--card-focus-border);
26
+ border: 1px solid var(--glass-border-accent);
22
27
  border-radius: var(--radius-card);
23
28
  box-shadow: var(--glass-material-rim), var(--card-focus-shadow);
24
29
  /* AY.W-A11Y-PERF O-4 — upgrade `layout style` → include `paint` so the
@@ -181,6 +186,96 @@
181
186
  dedup-and-keep-prefixed, which modern Chromium then drops). */
182
187
  .btn-glass {
183
188
  backdrop-filter: var(--glass-blur-btn);
189
+
190
+ /* BB.W-BUTTON-GLASS (d) — the button-scoped DEPTH stack + the hover-specular
191
+ bump. The glass button was the flattest wash rung (a bare backdrop-filter,
192
+ no rim, no under-shadow) — it read as a tinted rectangle, not a lifted
193
+ glass lozenge. The `--glass-btn-*` knobs compose ALREADY-MINTED tokens (the
194
+ `--glass-edge-light` rim + the `quiet`/`resting`-tier `--glass-under-shadow-*`
195
+ drop) so a consumer retints the whole button depth from ONE override; NO new
196
+ compositing axis. The rim+under-shadow lifts the lozenge; the box-shadow is
197
+ additive over the variant's own focus/press shadow legs (the `.btn-pill`
198
+ transition carries box-shadow on the §6 bezier, so the depth cross-fades
199
+ coherently). */
200
+ --glass-btn-rim: var(--glass-edge-light);
201
+ --glass-btn-under-shadow: var(--glass-under-shadow-quiet);
202
+ --glass-btn-under-shadow-hover: var(--glass-under-shadow-default);
203
+ box-shadow: var(--glass-btn-rim), var(--glass-btn-under-shadow);
204
+ /* The button-scoped hover gleam bump (0.10 → ~0.14): a hovered glass button
205
+ reads a notch brighter at the grazing edge than the global hover whisper.
206
+ Token-scoped to `.btn-glass` (NOT the global `:root` cohort property-regs.css
207
+ owns) so only the button lifts. The active/rest rungs ride the global cohort
208
+ (the press whisper + the dormant rest). */
209
+ --glass-specular-intensity-hover: var(--glass-specular-btn-hover);
210
+ }
211
+
212
+ /* The depth deepens one rung on hover (the lifted-lozenge read) — additive over
213
+ the variant's own hover surface legs. The variants paint the bg/border on
214
+ hover; this adds the deeper drop. */
215
+ .btn-glass:hover:not(:disabled, [data-disabled]) {
216
+ box-shadow: var(--glass-btn-rim), var(--glass-btn-under-shadow-hover);
217
+ }
218
+
219
+ /* BB.W-BUTTON-GLASS (a) — the ELEMENT-LEVEL oklab-tinted hover/active fill pair
220
+ (the substitution-vs-inheritance trap fixed on the button register). The glass
221
+ button variants painted `hover:bg-(--glass-bg-resting) active:bg-(--glass-bg-
222
+ floating)` — the RAW `:root` rung tokens, which carry NO `color-mix(in oklab, …,
223
+ --glass-tint-source --glass-tint-strength)` wrapper. So the W55 adaptive darken
224
+ + the `contrast-color()` ink flip + the content-tier floor (all of which the REST
225
+ bg `.glass-wash` composes via the element-level oklab seam) DROPPED the moment the
226
+ pointer landed — "more glass would cost legibility" exactly inverted from the
227
+ iOS-27 ask. These two tokens wrap the raw rungs in the SAME element-level oklab
228
+ seam `ladder.css` composes for the rest bg + `--glass-bg-dock` for the dock — ZERO
229
+ new compositing axis, the literal darken-over-light recipe reached at the lit
230
+ fill. ZERO-delta at the `--glass-tint-strength: 0%`/floor default (the mix toward
231
+ the source is 0%); under the declared/sampled bright bucket the lit fill darkens
232
+ to AA in lockstep with the rest bg. The `:root` raw `--glass-bg-*` tokens are
233
+ UNTOUCHED (other surfaces compose them at the element correctly — the raw token +
234
+ the element-level oklab wrapper is the correct ladder shape). */
235
+ .btn-glass {
236
+ --glass-bg-resting-tinted: color-mix(
237
+ in oklab,
238
+ var(--glass-bg-resting),
239
+ var(--glass-tint-source) var(--glass-tint-strength)
240
+ );
241
+ --glass-bg-floating-tinted: color-mix(
242
+ in oklab,
243
+ var(--glass-bg-floating),
244
+ var(--glass-tint-source) var(--glass-tint-strength)
245
+ );
246
+ }
247
+
248
+ /* BB.W-BUTTON-GLASS (e) — the optional refraction-edge opt-in. CONSUMES the
249
+ EXISTING refraction axis (glass-refract.css, the `#glass-refract` SVG-filter
250
+ lens, `@supports (backdrop-filter: url(#…))`-gated with the un-gated blur base
251
+ as the off-Chromium floor) — NEVER a button-local lens fork. BB.W-LENSING landed
252
+ the squircle bevel-profile + the typed `--glass-refract` axis + the `.glass-lens`
253
+ opt-in class (renamed off `.glass-refract`, clean break); the button COMPOSES
254
+ `.glass-lens`.
255
+
256
+ A `<Button :liquid>` adds `.glass-lens` to the host; on a supporting engine the
257
+ button reads the edge-bend over its blur base. The base recipe (the
258
+ `@supports`-gated `.glass-lens` rule in glass-refract.css) already paints the
259
+ displacement filter over `--glass-blur-resting`; this block adds NOTHING to the
260
+ filter graph (it would fork the axis) — the button merely COMPOSES `.glass-lens`.
261
+
262
+ The `:active` LENS-SWELL is the CHEAP coupled read, NOT a per-frame displacement-
263
+ map re-rasterize (the §Triumvirate / R2 budget: `feDisplacementMap` is resize-
264
+ expensive — only the `scale` attr animates without rebuilding the map, and even
265
+ that re-rasterizes; the one-refractive-element-per-route budget forbids the per-
266
+ frame cost). The swell is the press SQUISH (Button.vue, the `useLiquidFlex`
267
+ reciprocal X/Y deform) + the coupled `--glass-specular-intensity-active` gleam
268
+ lift on the SAME `--glass-btn-press-t` drive — the glass reads as DEFORMING under
269
+ the press without re-rasterizing the lens map. Off-Chromium the whole arm degrades
270
+ to the un-gated `.btn-glass` blur+tint base (the no-workaround floor). The
271
+ `--glass-btn-press-t` typed drive (property-regs.css) is the ONE press scalar the
272
+ squish + the gleam coupling both read. */
273
+ .btn-glass.glass-lens {
274
+ /* The press drive scalar (0 rest → 1 pressed) Button.vue writes off the spring;
275
+ the resting default is 0 so an unwired refraction button is the static lens.
276
+ The `:active` LENS-SWELL on this drive lives in material.css's `.glass-lens`
277
+ block (`--glass-refract` bumps on press); this block only floors the drive. */
278
+ --glass-btn-press-t: 0;
184
279
  }
185
280
 
186
281
  /* ── Pill input ───────────────────────────────── */
@@ -289,8 +384,11 @@
289
384
  invalid field shows the destructive ring on focus too. */
290
385
  .input-pill:where(:user-invalid, .user-invalid-fallback, [aria-invalid="true"]):focus-visible {
291
386
  border-color: var(--destructive);
292
- box-shadow: 0 0 0 var(--focus-ring-width)
293
- color-mix(in srgb, var(--destructive) 35%, transparent);
387
+ /* BB.W-INVALID-RING — the shared destructive ring register (the
388
+ --focus-ring-shadow sibling). The byte-identical recipe is now ONE
389
+ token; the `8%` at-rest bg arm above stays `.input-pill`-local (a
390
+ glass-tint substrate the bare-ring surfaces do not carry). */
391
+ box-shadow: var(--invalid-ring);
294
392
  }
295
393
 
296
394
  /* AQ.W4 §W4.3 — `field-sizing: content` autosize (opt-in via the Textarea
@@ -1,59 +1,111 @@
1
- /* AW.W23 — the #glass-refract convex-lens SVG filter, shipped as a library
2
- * asset so `.glass-refract` works OUT OF THE BOX (no consumer hand-mounts a
3
- * filter node).
1
+ /* BB.W-LENSING — the #glass-refract edge-lensing SVG filter, EVOLVED off the
2
+ * AW.W23 crude-radial garnish onto the real squircle bevel-profile + the typed
3
+ * `--glass-refract` axis driving the animatable displacement `scale` (the press
4
+ * lens-swell). Shipped as a library asset so `.glass-lens` works OUT OF THE BOX
5
+ * (no consumer hand-mounts a filter node).
4
6
  *
5
- * The refraction recipe is the canonical 3-primitive graph (kube.io /
7
+ * The refraction recipe is the canonical 3-primitive graph (kube.io / ekino /
6
8
  * LogRocket, 2025):
7
9
  *
8
- * feImage — a pre-baked displacement map computed from the convex-
9
- * squircle surface profile y = ⁴√(1 − (1 − x)⁴) (Apple's
10
- * preferred corner curve) via Snell's law (n₁ = 1 air,
11
- * n₂ = 1.5 glass). The map is authored as an embedded SVG
12
- * whose R channel carries the x-shift and G channel the
13
- * y-shift (neutral 128 = no shift; bright edges bend light
14
- * inward like a lens), expressed as two crossed linear
15
- * gradients over the squircle silhouette.
10
+ * feImage — the displacement map computed from the convex-squircle
11
+ * surface profile f(x) = ⁴√(1 − (1 − x)⁴) (Apple's preferred
12
+ * corner curve) via Snell's law (n₁ = 1 air, n₂ = 1.5 glass).
13
+ * The map's R channel carries the x-shift and G the y-shift
14
+ * (neutral 128 = no shift). The squircle slope is near-flat past
15
+ * the outer ~14% band and STEEP at the rim, so the bend
16
+ * CONCENTRATES at the edge (thin interior) — the iOS edge-lensing
17
+ * read, NOT a uniform radial bulge (the retired AW.W23 placeholder).
18
+ * Encoding: TWO crossed linear gradients — a HORIZONTAL gradient
19
+ * drives the R channel (255 @0% → 128 across the flat interior →
20
+ * 0 @100%, the squircle ramp held in the bevel band) and a VERTICAL
21
+ * gradient drives the G channel the same way — SCREEN-composited
22
+ * over a black base so each channel carries its own axis EXACTLY
23
+ * (`screen(C, 0) = C`; the displacement map reads only R/G, B unused).
24
+ * The map carries ZERO color (the warm-cream identity HOLDS —
25
+ * refraction is DEPTH not hue). The asset is baked ONCE (the
26
+ * squircle CURVE is fixed, the Apple-preferred profile); only the
27
+ * `scale` param animates the magnitude (scope 2 — no map re-bake).
16
28
  * feDisplacementMap— displaces the backdrop by the baked map (R = x-shift,
17
- * G = y-shift, `scale` = max px, neutral 128).
18
- * feImage specular — a soft top-left specular highlight…
19
- * feBlend screen — …blended `screen` over the displaced backdrop for the
20
- * polished-glass catch.
29
+ * G = y-shift, `scale` = max px the `--glass-refract` axis drives).
30
+ * feImage specular — a soft warm top-left specular highlight (PRESERVED from HEAD —
31
+ * the polished-glass catch).
32
+ * feBlend screen — blended `screen` over the displaced backdrop.
21
33
  *
22
- * The filter ships INLINE as a data-URI in the `backdrop-filter` declaration, so
23
- * the consumer gets it with zero markup. `backdrop-filter: url(#…)` is
24
- * Chromium-only (WebKit bug 245510 open, Firefox not shipping), so the whole
25
- * decl sits behind `@supports (backdrop-filter: url(#…))`; a non-supporting
26
- * engine paints the un-gated blur base alone (no broken `url()` reference).
34
+ * DDR-LENS-BAKE — the displacement `scale` is a BAKED LITERAL (`scale='28'`, the §10
35
+ * default depth), NOT a var()-driven axis. WHY (the reversal of BB.W-LENSING scope 2):
36
+ * the scope-2 design split the filter across `var(--…head) var(--glass-refract) var(--…tail)`
37
+ * to splice the typed `@property --glass-refract` value between a head ending `…scale='`
38
+ * and a tail beginning `'…`. That construction is doubly broken, proven on the real edge
39
+ * (Chromium, playwright):
40
+ * (1) PARSE — head/tail each carry a COMPLETE `url(…)`, so the composite is the three
41
+ * tokens `url("…") 28 url("…")`, which a `backdrop-filter` REJECTS. The lens
42
+ * computed-`backdrop-filter: none` — it never rendered. (A var() inside a single
43
+ * url() STRING token is not re-tokenised by the engine either — tested — so there
44
+ * is no CSS-legal path to a dynamic `scale` inside one self-contained data-URI.)
45
+ * (2) BUNDLER — the tail `url("'…")` starts with a bare quote, so a consumer's CSS
46
+ * url()-rewriter (vite/postcss) reads it as a relative asset path and fails
47
+ * `ENOENT: open ''`, breaking EVERY bundler-based consumer.
48
+ * The fix: ONE complete, valid `url("data:…scale='28'…")` token. A `data:` URI is the
49
+ * single form that both PARSES as a filter value AND is skipped by the url()-rewriter
50
+ * (the rewriter only resolves non-data/non-#/non-http content as a file). RE-LITIGATE-IF
51
+ * the platform ships a way to substitute a value into a url() string token (then the
52
+ * press-swell `scale` animation could return). TRADEOFF: the per-instance `:active`
53
+ * lens-swell (28→44 `scale` on press) is dropped — but it was already inert (it animated
54
+ * a value that reached no rendering filter), so the lived read is UNCHANGED (and the lens
55
+ * now actually renders). The `@property --glass-refract` reg + `--glass-refract-swell`
56
+ * knob are retired with it. The bevel-band width is the `--glass-refract-bevel` knob
57
+ * (default 14% — the iOS edge band); the baked stops fix the squircle CURVE, the knob
58
+ * documents the rim concentration the map encodes.
27
59
  *
28
- * RE-HOME (AW.W23 — decouple from the W22-folded compound). At HEAD the
29
- * refraction rule was bound to `.glass-specular-track.glass-refract`. W22 folds
30
- * `glass-specular-track` into `.glass-material`, retiring the compound's left
31
- * operand, so the rule is re-homed onto `.glass-material.glass-refract` — the
32
- * refraction garnish opts in on ANY `.glass-material` surface, no dependency on
33
- * the now-aliased `glass-specular-track` class. The garnish stays PE-only over
34
- * the blur base; it is NEVER promoted to the card/primitive substrate
35
- * (feDisplacementMap is resize-expensive — only the `scale` attr animates
36
- * without rebuilding the map).
60
+ * The filter ships INLINE as a data-URI in the `backdrop-filter` declaration, so the
61
+ * consumer gets it with zero markup. `backdrop-filter: url(#…)` is Chromium-only (WebKit
62
+ * bug 245510 open, Firefox not shipping), so the whole decl sits behind
63
+ * `@supports (backdrop-filter: url(#…))`; a non-supporting engine paints the un-gated blur
64
+ * base alone (no broken `url()` reference — the no-workaround degrade floor, PRESERVED).
65
+ *
66
+ * CLASS RENAME (BB.W-LENSING scope 5 — clean break, no alias, BB inv-7). The AW.W23
67
+ * `.glass-refract` opt-in class is RENAMED to `.glass-lens` (the §2 vocabulary); the
68
+ * `--glass-refract*` AXIS/token names are KEPT (the lens magnitude is the refraction
69
+ * axis). Consumers (`<Button :liquid>`, the demo witness) compose `.glass-lens`. The
70
+ * rename is the only public-surface delta (MIGRATION.md row). The garnish stays PE-only
71
+ * over the blur base; it is NEVER promoted to the card/primitive substrate
72
+ * (feDisplacementMap is resize-expensive — only the `scale` param animates without
73
+ * rebuilding the map).
37
74
  */
38
75
 
39
76
  @layer components {
40
- /* The shipped filter graph as a data-URI SVG. A `0×0` host SVG mounted via
41
- the CSS asset keeps the `#glass-refract` id resolvable in-document. */
42
- .glass-refract {
43
- /* The named convex-lens displacement filter, baked from the squircle
44
- surface profile. Composed as a custom property so the @supports arm
45
- below references one source. */
46
- --glass-refract-filter: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='glass-refract' x='0' y='0' width='100%25' height='100%25'%3E%3CfeImage href='data:image/svg+xml,%253Csvg xmlns=%2522http://www.w3.org/2000/svg%2522 width=%2522100%2522 height=%2522100%2522%253E%253CradialGradient id=%2522m%2522 cx=%252250%2525%2522 cy=%252250%2525%2522 r=%252250%2525%2522%253E%253Cstop offset=%25220%2525%2522 stop-color=%2522rgb(128,128,128)%2522/%253E%253Cstop offset=%252270%2525%2522 stop-color=%2522rgb(128,128,128)%2522/%253E%253Cstop offset=%2522100%2525%2522 stop-color=%2522rgb(255,255,128)%2522/%253E%253C/radialGradient%253E%253Crect width=%2522100%2522 height=%2522100%2522 fill=%2522url(%2523m)%2522/%253E%253C/svg%253E' result='map'/%3E%3CfeDisplacementMap in='SourceGraphic' in2='map' scale='28' xChannelSelector='R' yChannelSelector='G' result='disp'/%3E%3CfeImage href='data:image/svg+xml,%253Csvg xmlns=%2522http://www.w3.org/2000/svg%2522 width=%2522100%2522 height=%2522100%2522%253E%253CradialGradient id=%2522s%2522 cx=%252230%2525%2522 cy=%252225%2525%2522 r=%252260%2525%2522%253E%253Cstop offset=%25220%2525%2522 stop-color=%2522rgba(255,255,255,0.5)%2522/%253E%253Cstop offset=%2522100%2525%2522 stop-color=%2522rgba(255,255,255,0)%2522/%253E%253C/radialGradient%253E%253Crect width=%2522100%2522 height=%2522100%2522 fill=%2522url(%2523s)%2522/%253E%253C/svg%253E' result='spec'/%3E%3CfeBlend in='disp' in2='spec' mode='screen'/%3E%3C/filter%3E%3C/svg%3E#glass-refract");
77
+ /* The shipped filter graph as ONE self-contained data-URI SVG (`scale='28'` baked,
78
+ DDR-LENS-BAKE). A single `url("data:…")` token is the only form that PARSES as a
79
+ `backdrop-filter` value AND survives a consumer bundler's url()-rewrite (a `data:`
80
+ URI is skipped; any other `url("…")` content is mis-resolved as a file). The
81
+ `#glass-refract` id is resolvable in-document (the data-URI is self-contained). */
82
+ .glass-lens {
83
+ /* The bevel-band width the squircle map encodes (the iOS edge concentration).
84
+ Documents the rim thickness the baked stops fix; a consumer reads it to tune
85
+ the perceived rim band on a successor re-bake. */
86
+ --glass-refract-bevel: 14%;
87
+
88
+ /* The shipped filter — ONE complete, valid `url("data:…")` token carrying the
89
+ whole 3-primitive graph with the `scale='28'` baked in (the §10 default depth,
90
+ DDR-LENS-BAKE). A single self-contained `data:` URI is (a) the ONLY form that
91
+ PARSES as a `backdrop-filter` value — the prior var()-spliced head/tail emitted
92
+ `url("…") <n> url("…")`, three tokens a `backdrop-filter` rejects, so the lens
93
+ silently rendered `none`; and (b) bundler-SAFE — a consumer's CSS url()-rewriter
94
+ skips a `data:` URI but mis-resolves any `url("…")` whose content starts with a
95
+ bare char (the old tail began `'…` → ENOENT, breaking every bundler consumer).
96
+ See the DDR-LENS-BAKE note in the header for the lost-tunability tradeoff. */
97
+ --glass-refract-filter: url("data:image/svg+xml,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27%3E%3Cfilter id=%27glass-refract%27 x=%270%27 y=%270%27 width=%27100%25%27 height=%27100%25%27%3E%3CfeImage href=%27data:image/svg+xml,%253Csvg xmlns=%2522http://www.w3.org/2000/svg%2522 width=%2522100%2522 height=%2522100%2522%253E%253ClinearGradient id=%2522hx%2522 x1=%25220%2522 y1=%25220%2522 x2=%2522100%2525%2522 y2=%25220%2522%253E%253Cstop offset=%25220%2525%2522 stop-color=%2522rgb(255,0,0)%2522/%253E%253Cstop offset=%252214%2525%2522 stop-color=%2522rgb(128,0,0)%2522/%253E%253Cstop offset=%252286%2525%2522 stop-color=%2522rgb(128,0,0)%2522/%253E%253Cstop offset=%2522100%2525%2522 stop-color=%2522rgb(0,0,0)%2522/%253E%253C/linearGradient%253E%253ClinearGradient id=%2522vy%2522 x1=%25220%2522 y1=%25220%2522 x2=%25220%2522 y2=%2522100%2525%2522%253E%253Cstop offset=%25220%2525%2522 stop-color=%2522rgb(0,255,0)%2522/%253E%253Cstop offset=%252214%2525%2522 stop-color=%2522rgb(0,128,0)%2522/%253E%253Cstop offset=%252286%2525%2522 stop-color=%2522rgb(0,128,0)%2522/%253E%253Cstop offset=%2522100%2525%2522 stop-color=%2522rgb(0,0,0)%2522/%253E%253C/linearGradient%253E%253Crect width=%2522100%2522 height=%2522100%2522 fill=%2522black%2522/%253E%253Crect width=%2522100%2522 height=%2522100%2522 fill=%2522url(%2523hx)%2522/%253E%253Crect width=%2522100%2522 height=%2522100%2522 fill=%2522url(%2523vy)%2522 style=%2522mix-blend-mode:screen%2522/%253E%253C/svg%253E%27 result=%27map%27/%3E%3CfeDisplacementMap in=%27SourceGraphic%27 in2=%27map%27 scale=%2728%27 xChannelSelector=%27R%27 yChannelSelector=%27G%27 result=%27disp%27/%3E%3CfeImage href=%27data:image/svg+xml,%253Csvg xmlns=%2522http://www.w3.org/2000/svg%2522 width=%2522100%2522 height=%2522100%2522%253E%253CradialGradient id=%2522s%2522 cx=%252230%2525%2522 cy=%252225%2525%2522 r=%252260%2525%2522%253E%253Cstop offset=%25220%2525%2522 stop-color=%2522rgba(255,255,255,0.5)%2522/%253E%253Cstop offset=%2522100%2525%2522 stop-color=%2522rgba(255,255,255,0)%2522/%253E%253C/radialGradient%253E%253Crect width=%2522100%2522 height=%2522100%2522 fill=%2522url(%2523s)%2522/%253E%253C/svg%253E%27 result=%27spec%27/%3E%3CfeBlend in=%27disp%27 in2=%27spec%27 mode=%27screen%27/%3E%3C/filter%3E%3C/svg%3E%23glass-refract");
47
98
  }
48
99
 
49
- /* The gated consuming selector — RE-HOMED onto `.glass-material.glass-refract`
50
- (decoupled from the W22-folded `.glass-specular-track` compound). The
51
- refraction composes the shipped `#glass-refract` filter OVER the host's
52
- existing blur; it is additive (the blur already painted, this sharpens the
53
- refraction edge where the engine supports it). */
100
+ /* The gated consuming selector. The squircle map + the baked `scale='28'` ride
101
+ INSIDE the `@supports (backdrop-filter: url(#…))` block;
102
+ the refraction composes the shipped `#glass-refract` filter OVER the host's existing
103
+ blur — additive (the blur already painted, this bends + concentrates the refraction
104
+ at the rim where the engine supports it). A non-supporting engine never reaches this
105
+ block and paints the un-gated `--glass-blur-*` + `--glass-tint-*` base ALONE. */
54
106
  @supports (backdrop-filter: url("#glass-refract")) {
55
- .glass-material.glass-refract,
56
- .glass-refract {
107
+ .glass-material.glass-lens,
108
+ .glass-lens {
57
109
  backdrop-filter: var(--glass-blur-resting) var(--glass-refract-filter);
58
110
  }
59
111
  }
@@ -43,6 +43,13 @@
43
43
  .glass-specular-track::before {
44
44
  --specular-x: 50%;
45
45
  --specular-y: 50%;
46
+ /* BB.W-LENSING — pin the EDGE-glint angle static too (the conic seats at its
47
+ `0deg` top-edge rest). The `useSpecularPointer` leaf already skips the angle
48
+ write under PRM; this is the CSS belt-and-braces pin so the rim glint never
49
+ drifts under reduce. The lens-swell drive also snaps (Button.vue / .tap-squish
50
+ PRM carve), so the whole motion-reactive lens reaches rest with no in-between
51
+ frames — the gesture functions, the physics off. */
52
+ --specular-angle: 0deg;
46
53
  transition: none;
47
54
  }
48
55
  }
@@ -46,8 +46,11 @@
46
46
  squircle + a11y @supports overrides, which must stay last): */
47
47
  @import "./glass/material.css";
48
48
  @import "./glass/ladder.css";
49
+ @import "./glass/rim.css";
49
50
  @import "./glass/surfaces.css";
50
51
  @import "./glass/surface-axis.css";
52
+ @import "./glass/reveal.css";
53
+ @import "./glass/deep.css";
51
54
  @import "./glass/progress-rail.css";
52
55
  @import "./glass/squircle.css";
53
56
  @import "./glass/a11y-fallback.css";
@@ -35,10 +35,11 @@
35
35
  }
36
36
  }
37
37
 
38
- /* The data-state animation grammar canonicalises onto `.popover-animate`
39
- (V.W3.T9 / A5 §5.8). Authors compose `class="hover-popover-panel popover-animate"`
40
- on the panel root so the canonical fade + zoom-95 entry/exit grammar
41
- replaces the bespoke `hover-popover-in/out` keyframes that lived here.
42
- The `prefers-reduced-motion` carve is handled at the canonical site
43
- (`utilities.css`'s reduced-motion block) so it cascades to all four
38
+ /* The data-state animation grammar canonicalises onto `.glass-reveal`
39
+ (BB.W-LIQUID-REVEAL — off the retired `popover-animate` bezier zoom-95, clean
40
+ break). Authors compose `class="hover-popover-panel glass-reveal"` on the panel
41
+ root so the spring-clocked LIQUID-ENTER grammar (the coupled scale+fade+filter
42
+ blur-settle, glass/reveal.css) replaces the bespoke `hover-popover-in/out`
43
+ keyframes that lived here. The `prefers-reduced-motion` carve is handled at the
44
+ canonical site (`glass/reveal.css`'s reduced-motion block) so it cascades to all
44
45
  popover-animation consumers automatically. */
@@ -9,15 +9,22 @@
9
9
  * lives ONCE and proof:suffuse asserts against one component, not N pastes.
10
10
  *
11
11
  * THE INTERPOLATION SPACE — `in srgb` (DELIBERATE, recorded). The backplate is
12
- * a foreground-over-transparent overlay at a hand-tuned fixed 25% α stop — the
13
- * SAME shape as the `--surface-tint-*` brand family, which CLAUDE.md fixes at
14
- * `in srgb` (the brand-calibrated mix; switching the space shifts the resting
15
- * α off its hand-set value). The chip is byte-faithful to the reference paste
16
- * register (the binding W7 π target: stop-0 bg `color(srgb 0.915 0.484 0.671 /
17
- * 0.25)`), so it preserves `in srgb` — the same brand-overlay path, NOT the
18
- * glass-tint `in oklab` perceptual-mix path. (The spec text says `in oklab`;
19
- * the resolution preserves the reference-faithful `in srgb` so the pop register
20
- * does not shift — recorded in PROGRESS / the DELTA.)
12
+ * a foreground-over-transparent overlay at a hand-tuned α stop — the SAME shape
13
+ * as the `--surface-tint-*` brand family, which CLAUDE.md fixes at `in srgb`
14
+ * (the brand-calibrated mix; switching the space shifts the resting α off its
15
+ * hand-set value). The chip is byte-faithful to the reference paste register
16
+ * (the binding W7 π target: stop-0 bg `color(srgb 0.915 0.484 0.671 / 0.25)`),
17
+ * so it preserves `in srgb` — the same brand-overlay path, NOT the glass-tint
18
+ * `in oklab` perceptual-mix path. (The spec text says `in oklab`; the resolution
19
+ * preserves the reference-faithful `in srgb` so the pop register does not shift
20
+ * — recorded in PROGRESS / the DELTA.)
21
+ *
22
+ * THE α STOP IS A TOKEN (BB.W-SUFFUSE3 c3). The hardcoded `25%` lifted onto
23
+ * `--icon-chip-plate-strength` (default `25%`, BYTE-IDENTICAL); the `:saturated`
24
+ * axis re-points it to ~40% for a louder focal pop — the STRENGTH varies, the
25
+ * `in srgb` space + the chip≤glyph ratio do NOT. The pop is ALIVE too: the
26
+ * reveal entrance + the hover-bloom GROW ride the per-spring CLOCK (the
27
+ * --spring-snappy/--spring-smooth registers), no longer the fixed bezier.
21
28
  */
22
29
 
23
30
  :root {
@@ -30,6 +37,16 @@
30
37
  /* The duotone fill α — a low-alpha fill of the same hue UNDER the
31
38
  full-chroma stroke (the iOS/Material filled-tonal move). Mono-hue. */
32
39
  --icon-chip-duotone-fill: 18%;
40
+ /* The backplate vibrancy stop (BB.W-SUFFUSE3 c3). The default reproduces
41
+ the reference 25% register BYTE-IDENTICALLY — the plate `color-mix`
42
+ reads this token instead of the hardcoded `25%`. The `:saturated` axis
43
+ re-points it to a louder focal stop (~40%); the STRENGTH changes, the
44
+ `in srgb` space + the chip≤glyph ratio do NOT (the recorded keep). Still
45
+ ONE color event per surface — a saturated chip is the same event,
46
+ louder, never a license for a second (proof:suffuse d3 counts the event
47
+ FAMILY, not the saturation). Token-first: a consumer retunes without a
48
+ component edit. */
49
+ --icon-chip-plate-strength: 25%;
33
50
  /* The hover-bloom backplate lift (25% → ~35%) + the glow-ring spread. */
34
51
  --icon-chip-bloom-mix: 35%;
35
52
  --icon-chip-bloom-glow: 28%;
@@ -49,18 +66,25 @@
49
66
  align-items: center;
50
67
  justify-content: center;
51
68
  border-radius: var(--radius-pill, 9999px);
52
- /* The backplate — the reference recipe (`in srgb`, 25% α stop). */
69
+ /* The backplate — the reference recipe (`in srgb`, the --icon-chip-plate-
70
+ strength α stop, default 25% — BB.W-SUFFUSE3 c3 lifts the hardcoded `25%`
71
+ onto the token, BYTE-IDENTICAL at default). */
53
72
  background-color: color-mix(
54
73
  in srgb,
55
- var(--icon-chip-plate-color, var(--muted)) 25%,
74
+ var(--icon-chip-plate-color, var(--muted))
75
+ var(--icon-chip-plate-strength),
56
76
  transparent
57
77
  );
58
78
  color: var(--icon-chip-event-color, var(--muted-foreground));
59
79
  /* The §6 easing doctrine — surface props (bg/box-shadow) on the bezier
60
- standard ease; the bloom is the smooth-glass register, NOT a sparkle. */
80
+ standard ease. The transform leg at REST (the leave direction, reverting
81
+ to base) is the NO-OVERSHOOT bezier (a bloom must never overshoot past
82
+ gone — §6 exit law, BB.W-SUFFUSE3 c2); the hover ENTER direction lifts
83
+ onto --spring-smooth on the .icon-chip--bloom:hover rule below. */
61
84
  transition:
62
85
  background-color var(--duration-fast, 150ms) var(--ease-standard),
63
- box-shadow var(--duration-fast, 150ms) var(--ease-standard);
86
+ box-shadow var(--duration-fast, 150ms) var(--ease-standard),
87
+ transform var(--duration-fast, 150ms) var(--ease-out);
64
88
  }
65
89
 
66
90
  .icon-chip__glyph {
@@ -76,6 +100,16 @@
76
100
  border-radius: 0;
77
101
  }
78
102
 
103
+ /* ── The :saturated vibrancy axis (BB.W-SUFFUSE3 c3) ───────────────────────── */
104
+ /* A louder, more-chromatic backplate for a genuine focal pop — the plate
105
+ `color-mix` re-points off the 25% reference stop to ~40%. STILL the ONE color
106
+ event (the same event, louder — proof:suffuse d3 counts the event FAMILY, not
107
+ the saturation). The interpolation STAYS `in srgb` (the recorded reference-
108
+ register keep) and the chip≤glyph ratio is untouched. */
109
+ .icon-chip--saturated {
110
+ --icon-chip-plate-strength: 40%;
111
+ }
112
+
79
113
  /* ── The duotone axis — a low-alpha fill of the same hue UNDER the stroke ──── */
80
114
  /* Lucide glyphs bake `fill: none` on the SVG root; CSS wins over the
81
115
  presentation attribute, so the `[data-duotone] svg` rule reaches the inner
@@ -108,6 +142,16 @@
108
142
  var(--icon-chip-bloom-glow),
109
143
  transparent
110
144
  );
145
+ /* The bloom GROW (BB.W-SUFFUSE3 c2) — the plate lifts a hair on the
146
+ §6 --spring-smooth transform register (enter smooth). The transition
147
+ is re-declared on :hover so the ENTER direction rides the spring; the
148
+ base rule's --ease-out transform leg governs the leave (no overshoot
149
+ past gone). The color legs stay on the bezier (base rule). */
150
+ transform: scale(var(--icon-chip-bloom-scale, 1.06));
151
+ transition:
152
+ background-color var(--duration-fast, 150ms) var(--ease-standard),
153
+ box-shadow var(--duration-fast, 150ms) var(--ease-standard),
154
+ transform var(--spring-smooth-duration) var(--spring-smooth);
111
155
  }
112
156
  /* The glyph stroke firms on the chip's own hover. */
113
157
  .icon-chip--bloom:hover .icon-chip__glyph {
@@ -120,9 +164,19 @@
120
164
  reacts ONLY on an opted-in chip (`.icon-chip--reveal`) so a non-reveal chip's
121
165
  inert `[data-reveal]` hook never animates. PRM-gated. */
122
166
  @media (prefers-reduced-motion: no-preference) {
167
+ /* BB.W-SUFFUSE3 c1 — the pop-ENTRANCE rides the per-spring CLOCK, NOT the
168
+ fixed --duration-medium bezier. The animation-timing-function is the
169
+ --spring-snappy linear() string (peaks ~1.068) and the duration is
170
+ --spring-snappy-duration (0.34s, the W-GLASS-CAL per-spring clock), so the
171
+ `scale(0.85)→1` keyframe carries the snappy spring's ~+7% overshoot then
172
+ settles (the springy pop, not a flat fade-up). The opacity 0→1 is COUPLED
173
+ on the SAME clock (the W-MOTION-CANON P3 coupled-fade — plate + glyph
174
+ bloom as ONE continuous layer). Compositor-only: transform/opacity only
175
+ (the proof:motion-compositor floor holds). The per-spring clock is the
176
+ W-GLASS-CAL/W-MOTION-CANON fence — CONSUMED here, never re-generated. */
123
177
  .icon-chip--reveal[data-reveal] {
124
- animation: icon-chip-reveal var(--duration-medium, 320ms)
125
- var(--ease-standard) both;
178
+ animation: icon-chip-reveal var(--spring-snappy-duration)
179
+ var(--spring-snappy) both;
126
180
  animation-delay: calc(var(--d, 0) * var(--icon-chip-reveal-step));
127
181
  }
128
182
  }
@@ -139,7 +193,15 @@
139
193
  }
140
194
 
141
195
  /* ── The deform axes collapse under reduced motion (the PRM guard) ─────────── */
196
+ /* BB.W-SUFFUSE3 c1/c2 — the spring deform drops under reduce: the bloom GROW
197
+ scale collapses to 1 (the color cross-fade may stay — the legibility cue is
198
+ not motion), and the reveal pop SNAPS to its endpoint (scale 1, opacity 1,
199
+ zero in-between frames) via `animation: none` (the chip still APPEARS — only
200
+ the spring/overshoot is off; the W-MOTION-CANON P6 keep-fade/drop-transform). */
142
201
  @media (prefers-reduced-motion: reduce) {
202
+ .icon-chip--bloom:hover {
203
+ transform: none;
204
+ }
143
205
  .icon-chip--bloom:hover .icon-chip__glyph {
144
206
  stroke-width: inherit;
145
207
  }
@@ -114,6 +114,12 @@
114
114
  * 10a. scroll-driven.css — native scroll-driven recipes (.scroll-progress
115
115
  * + [data-scroll-reveal]); the `@supports`-gated
116
116
  * primary over the JS-composable fallback (AQ.W5).
117
+ * 10a'. scroll-choreography.css — the SOTA scroll-CHOREOGRAPHY register
118
+ * (.scroll-build page-build / .scroll-cascade
119
+ * section-cascade / .scroll-pin scroll-pinned + the
120
+ * native .smooth-scroll opt-in) on the native
121
+ * scroll()/view()/timeline-scope substrate; NO
122
+ * Lenis/GSAP dep (BB.W-SCROLL-MOTION).
117
123
  * 10b. view-transition.css — the `.gl-list-item` View-Transitions group
118
124
  * recipe + `--vt-*` axes (AQ.W5; the
119
125
  * `useViewTransition` substrate's CSS half).
@@ -161,6 +167,7 @@
161
167
  @import "./transitions.css";
162
168
  @import "./animations.css";
163
169
  @import "./scroll-driven.css";
170
+ @import "./scroll-choreography.css";
164
171
  @import "./view-transition.css";
165
172
  @import "./utilities.css";
166
173
  /* BA.W-MENU-GLASS — the glass menu-row + menu-section register. @import-ed AFTER
@@ -180,6 +187,11 @@
180
187
  (duotone/bloom/reveal). A component partial; the token arms (--section-color-N
181
188
  / --muted) auto-flip under .dark so the chip is mode-robust by construction. */
182
189
  @import "./icon-chip.css";
190
+ /* BB.W-BORDER-PROGRESS — progress IS the element's border: the masked-conic ring
191
+ consumption (the @property reg lives in tokens/property-regs.css §18). A
192
+ component partial; the conic + the radius-following mask-composite + the coverage
193
+ masks + the PRM milestone-pulse bracket. */
194
+ @import "./border-progress.css";
183
195
 
184
196
  /* Ensure Tailwind scans glass-ui's compiled component templates for the utility
185
197
  classes they emit (CVA variant classes like text-destructive-foreground,
@@ -72,6 +72,28 @@
72
72
  --phase-color: var(--muted-foreground);
73
73
  --phase-color-label: var(--muted-foreground);
74
74
 
75
+ /* BB.W-PHASE-PALETTE (N18) — the `complete` phase ink is a CONSUMER
76
+ token, not a hardcoded brand metal. The four active phases
77
+ (ping/download/upload/jitter) already read a consumer-registerable
78
+ `--chart-{phase}` with a library `--viz-*` fallback (the bus carries
79
+ phase IDENTITY); `complete` was the one arm that pinned the gold
80
+ directly, so every completion gilded itself the moment the phase
81
+ flipped. `--phase-complete-color` (+ its WCAG-twin
82
+ `--phase-complete-color-label`) DEFAULT to the same gold the arm
83
+ hardcoded — an un-overriding consumer paints byte-identical gold (the
84
+ back-compat floor) — but a consumer (or any ancestor) overrides EITHER
85
+ on its host/preset to re-ink completion (its phase spectrum, an aurora
86
+ register, …), so gold is EARNED (the dock CTA + personal-best
87
+ garnish), never the chassis default leaking onto every completion.
88
+ The default lives at the chassis root (NOT :root/tokens.css) because
89
+ it is a chassis-phase register, scoped to the surface owning the bus —
90
+ the same home `--phase-color`'s idle default occupies above. It reads
91
+ `var(--color-gold)` / `var(--color-gold-dark)` (the existing mode-
92
+ resolved tokens, unedited), so it inherits the SAME .dark / light-dark
93
+ resolution the hardcoded form did. */
94
+ --phase-complete-color: var(--color-gold);
95
+ --phase-complete-color-label: var(--color-gold-dark, var(--color-gold));
96
+
75
97
  /* AV.W16 TW3 — inline-size container named `chassis` so the dial reflow
76
98
  below reads the chassis's OWN box, not the viewport (portable into a
77
99
  narrow host). */
@@ -153,7 +175,10 @@
153
175
  AND the structural twin-line grooves re-point from the warm-cream
154
176
  `--surface-tint-*` default onto the `--silver` quad (gold's cool mirror).
155
177
  The chassis reads as an INDUSTRIAL precision-instrument panel — the
156
- cool-metal twin of the warm-gold "complete"-phase affirmation.
178
+ cool-metal twin of the warm-gold "complete"-phase affirmation the chassis
179
+ ships BY DEFAULT (the `--phase-complete-color` consumer token's gold
180
+ default; BB.W-PHASE-PALETTE — a consumer may re-ink completion, but the
181
+ silver register's narration is of the warm-gold completion default).
157
182
 
158
183
  The phase cascade (`[data-phase="…"]`) stays ORTHOGONAL — a `structure`
159
184
  chassis still retints its phase fills on `data-phase`; only the
@@ -220,8 +245,15 @@
220
245
  --phase-tint-amount: var(--phase-tint-peak);
221
246
  }
222
247
  .instrument-chassis[data-phase="complete"] {
223
- --phase-color: var(--color-gold);
224
- --phase-color-label: var(--color-gold-dark, var(--color-gold));
248
+ /* BB.W-PHASE-PALETTE — demoted onto the `--phase-complete-color`
249
+ consumer seam (the exact `var(--chart-{phase}, …)` idiom the four
250
+ active arms above run). The arm reads ONLY the consumer token; the
251
+ gold lives in the token's DEFAULT at the chassis root, not as a
252
+ hardcoded ink here (a clean break with a back-compat default, NOT a
253
+ back-compat alias — no `--color-gold` dual-read survives). The warmth
254
+ ramp stays: `--phase-tint-amount` is orthogonal to the ink choice. */
255
+ --phase-color: var(--phase-complete-color);
256
+ --phase-color-label: var(--phase-complete-color-label);
225
257
  --phase-tint-amount: var(--phase-tint-peak);
226
258
  }
227
259
 
@@ -383,4 +415,35 @@
383
415
  height: 1px;
384
416
  }
385
417
  }
418
+
419
+ /* BB.W-DESKTOP-RESERVE (B3) — the WIDE-AXIS (desktop) dial reserve, the
420
+ EXACT DISJOINT COMPLEMENT of the mobile `@container chassis (max-width:
421
+ 44.9375rem)` reserve above: 44.9375rem ≈ 719px is the mobile ceiling, so
422
+ the desktop floor is 45rem ≈ 720px — the two container-query ranges share
423
+ no width, so a dial cell is reserved by exactly ONE branch at every box
424
+ width (no overlap, no gap, no competing `min-block-size`).
425
+
426
+ The mobile reflow reserves the dial box from frame 0; the wide box axis
427
+ had NO library reserve, so a `1fr` meter row collapsed to its pre-
428
+ hydration `<canvas>` intrinsic and grew on hydration, pushing the results
429
+ card + dock down (the desktop CLS the speedtest App.vue interim authored
430
+ a local `min-block-size: var(--chassis-max-block-size)` to cure — the
431
+ consumer interim this rung SUPERSEDES). The reserve is a STATIC
432
+ `min-block-size` — a frame-0 box reservation, NOT an animated height (no
433
+ per-frame layout, compositor-safe, `proof:no-layout-animation` holds: a
434
+ `min-block-size` reserve is never a `@keyframes`/`transition` target).
435
+
436
+ Token-first: `--instrument-dial-min-block-size-desktop` is the DESKTOP
437
+ DIAL a consumer overrides (default `var(--chassis-max-block-size)`, the
438
+ library's dock-adjusted dynamic-viewport guardrail, resolved at first
439
+ paint with no JS). The inline `var(--chassis-max-block-size)` fallback
440
+ carries the contract if the canonical token is unset. */
441
+ @container chassis (min-width: 45rem) {
442
+ .instrument-chassis .instrument-dial {
443
+ min-block-size: var(
444
+ --instrument-dial-min-block-size-desktop,
445
+ var(--chassis-max-block-size)
446
+ );
447
+ }
448
+ }
386
449
  }