@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
@@ -31,13 +31,21 @@
31
31
  strength))`). With the default `--glass-tint-strength: 0%` the mix is a
32
32
  no-op = byte-identical to the un-tinted rung; a consumer biases the surface
33
33
  toward a sampled backdrop hue by setting `--glass-tint-source` + a
34
- strength ≤30%. oklab is the mwg-preferred tint space (NEVER an
35
- `oklch(from …)` lightness-shift — browsers don't gamut-map yet). */
34
+ strength ≤30%. oklab is the mwg-preferred tint space for the TINT mix here
35
+ (NEVER an `oklch(from …)` lightness-shift in the GLASS-TINT mix). The
36
+ `oklch(from var(--foreground) …)` relative-color recipe DID land its first
37
+ live consumer at BB.W-DARK-INK-WARM — the dark `--surface-tint-*` arm
38
+ (`tokens/dark-arm.css`), where the tolerant α-mix absorbs the small high-L
39
+ chroma (the gamut-map caveat documented + pinned under the gamut edge there).
40
+ That is the INK derivation, separate from THIS glass-tint mix space. */
36
41
  .glass-wash {
37
42
  position: relative;
38
43
  background: color-mix(in oklab, var(--glass-bg-wash), var(--glass-tint-source) var(--glass-tint-strength));
39
44
  backdrop-filter: var(--glass-blur-wash);
40
- border: 1px solid var(--glass-border-wash);
45
+ /* BB.W-GLASS-ACCENT — the rung border ink feeds the accent-composed
46
+ `--glass-border-accent` (rim group above); byte-identical at 0%. */
47
+ --glass-border-rung: var(--glass-border-wash);
48
+ border: 1px solid var(--glass-border-accent);
41
49
  box-shadow: var(--glass-material-rim), var(--glass-shadow-wash);
42
50
  }
43
51
 
@@ -57,7 +65,8 @@
57
65
  position: relative;
58
66
  background: color-mix(in oklab, var(--glass-bg-quiet), var(--glass-tint-source) var(--glass-tint-strength));
59
67
  backdrop-filter: var(--glass-blur-quiet);
60
- border: 1px solid var(--glass-border-quiet);
68
+ --glass-border-rung: var(--glass-border-quiet);
69
+ border: 1px solid var(--glass-border-accent);
61
70
  box-shadow:
62
71
  var(--glass-material-rim),
63
72
  var(--glass-under-shadow-quiet),
@@ -68,7 +77,8 @@
68
77
  position: relative;
69
78
  background: color-mix(in oklab, var(--glass-bg-resting), var(--glass-tint-source) var(--glass-tint-strength));
70
79
  backdrop-filter: var(--glass-blur-resting);
71
- border: 1px solid var(--glass-border-resting);
80
+ --glass-border-rung: var(--glass-border-resting);
81
+ border: 1px solid var(--glass-border-accent);
72
82
  box-shadow:
73
83
  var(--glass-material-rim),
74
84
  var(--glass-under-shadow-default),
@@ -94,7 +104,8 @@
94
104
  position: relative;
95
105
  background: color-mix(in oklab, var(--glass-bg-floating), var(--glass-tint-source) var(--glass-tint-strength));
96
106
  backdrop-filter: var(--glass-blur-floating);
97
- border: 1px solid var(--glass-border-floating);
107
+ --glass-border-rung: var(--glass-border-floating);
108
+ border: 1px solid var(--glass-border-accent);
98
109
  box-shadow:
99
110
  var(--glass-material-rim),
100
111
  var(--glass-under-shadow-vivid),
@@ -108,7 +119,8 @@
108
119
  position: relative;
109
120
  background: color-mix(in oklab, var(--glass-bg-overlay), var(--glass-tint-source) var(--glass-tint-strength));
110
121
  backdrop-filter: var(--glass-blur-overlay);
111
- border: 1px solid var(--glass-border-overlay);
122
+ --glass-border-rung: var(--glass-border-overlay);
123
+ border: 1px solid var(--glass-border-accent);
112
124
  box-shadow: var(--glass-material-rim), var(--glass-shadow-overlay);
113
125
  }
114
126
 
@@ -199,7 +211,13 @@
199
211
  `--glass-tint-strength: 0%`. */
200
212
  :where(.glass-floating, .glass-overlay) {
201
213
  --glass-tint-source: var(--glass-tint-ink);
202
- --glass-tint-strength: var(--glass-tint-strength-aa);
214
+ /* BC.W-AUDIT — the scope-7 completion: the overlay band JOINS the content-tier
215
+ sub-perceptual FLOOR by default (translucent warm glass), and the FULL AA
216
+ darken engages ONLY under the bright bucket (the @container --glass-backdrop:
217
+ light above). The prior unconditional AA (20% ink-ward) collapsed every
218
+ floating surface to grey over the common calm-light backdrop. The full glass
219
+ rebuild + the per-band muted/contrast reconciliation is BC. */
220
+ --glass-tint-strength: var(--glass-tint-strength-floor);
203
221
  --muted-foreground: var(--foreground);
204
222
  }
205
223
 
@@ -212,10 +230,31 @@
212
230
  under the declared/sampled BRIGHT signal (the @container --glass-backdrop:light bucket
213
231
  above — where the muted lift also lives now). NO unconditional --muted-foreground lift
214
232
  here: on the calm-light floor the caption keeps the muted register (the slides read).
215
- A consumer opts a light-page card out via `--glass-tint-strength: 0%` on an ancestor. */
233
+ A consumer opts a light-page card out via `--glass-tint-strength: 0%` on an ancestor.
234
+
235
+ BB.W-ON-GLASS-FG (N13) — the THIRD-STATE on-glass FOREGROUND re-point lands HERE,
236
+ BESIDE the BA seam (the SAME cascade context, the SAME content-tier set, NOT a new
237
+ competing layer). The calm-light floor keeps the page-muted --neutral-5 at HEAD —
238
+ but the muted ink is calibrated against the CANVAS, and on a TRANSLUCENT content
239
+ plate (the glass-first common case) it composites toward the lifted backdrop and
240
+ its contrast COLLAPSES (1.15-3.29:1 measured in dark). The re-point targets the
241
+ muted register at the COMPOSITED glass fill: --muted-foreground → --on-glass-muted
242
+ (+ the -strong twin), a register BETWEEN the page-muted and the bright-bucket full
243
+ ink (legible-AND-subordinate; the caption stays quieter than body --foreground).
244
+ This is NOT a fork of --glass-tint-* — it READS the seam context and expresses the
245
+ third state; it NEVER re-declares --glass-tint-ink/-strength-* (W-DARK-MATERIAL's
246
+ frozen bound). The BA bright-bucket lift (@container --glass-backdrop:light above,
247
+ --muted-foreground → --foreground) STILL WINS where the plate darkens — the
248
+ @container conditional overrides this unconditional :where() when it engages, so a
249
+ darkened plate goes full ink; this calm re-point is the calm-plate case ONLY. The
250
+ overlay band (:where(.glass-floating, .glass-overlay) above) is a DISJOINT selector
251
+ set (it keeps the full-ink lift), so neither path collides. The values auto-flip per
252
+ mode (the on-glass rungs carry their own light/dark per-mode arms in tokens). */
216
253
  :where(.glass-card, .glass-resting, .glass-quiet, .glass-wash) {
217
254
  --glass-tint-source: var(--glass-tint-ink);
218
255
  --glass-tint-strength: var(--glass-tint-strength-floor);
256
+ --muted-foreground: var(--on-glass-muted);
257
+ --muted-foreground-strong: var(--on-glass-muted-strong);
219
258
  }
220
259
 
221
260
  /* AX.W55 — the `contrast-color()` foreground-ink flip (Chrome 147+/Safari 26+).
@@ -332,7 +371,16 @@
332
371
  var(--glass-shadow-floating);
333
372
  }
334
373
 
335
- /* Grain noise overlay — reuses paper texture SVG, no extra assets */
374
+ /* Grain noise overlay — reuses paper texture SVG, no extra assets.
375
+ BB.W-LIQUIDHOVER — the disco-grain pop (T8-F6) killed at the COMPOSITION CLASS:
376
+ the `background-image` is ALWAYS PRESENT (decoded once at rest, NEVER toggled to
377
+ `none`), and any STATE-driven grain engagement cross-fades the `opacity` ONLY on
378
+ the thin `--glass-grain-engage-duration` (~120ms linear) clock. A `background-
379
+ image: none → var(--paper-clean-texture)` engage decodes-and-appears in one frame
380
+ (the pop); the opacity cross-fade is a compositor-cheap interpolation with the
381
+ image constant — the only sanctioned grain engage. The `transition` lives HERE so
382
+ a hover/active grain lift (wherever a glass surface raises grain on interaction)
383
+ reads as a smooth fade by construction, not a discrete swap. */
336
384
  .glass-wash::after,
337
385
  .glass-quiet::after,
338
386
  .glass-resting::after,
@@ -342,36 +390,44 @@
342
390
  position: absolute;
343
391
  inset: 0;
344
392
  border-radius: inherit;
345
- background: var(--paper-clean-texture);
393
+ /* The grain texture is the `background-image` longhand (NOT the `background`
394
+ shorthand) so the image stays a STABLE always-present layer the engage
395
+ never re-declares — the structural anti-pop: opacity is the only animated
396
+ channel, the image is never `none → image`. */
397
+ background-image: var(--paper-clean-texture);
346
398
  background-repeat: repeat;
347
399
  background-size: var(--paper-texture-size);
348
400
  opacity: var(--glass-grain-opacity);
401
+ /* The opacity cross-fade engage — plain ~120ms linear direct-write (no spring,
402
+ no overshoot — instant-but-smooth per the ask). Under the PRM / reduced-
403
+ transparency brackets the clock collapses to 0ms (the a11y bracket below). */
404
+ transition: opacity var(--glass-grain-engage-duration, 120ms) linear;
349
405
  pointer-events: none;
350
406
  mix-blend-mode: overlay;
351
407
  }
352
408
 
353
- /* (b) The unified rim — `--glass-edge-light` full-perimeter inset ring on
354
- EVERY material surface (AW.W22). Previously the rim was wired only into
355
- the floating/overlay tiers' box-shadow stack; promoting it to the material
356
- group makes wash/quiet/resting/card/dock-control all carry the same
357
- silhouette catch-light from ONE token. The rim is its OWN `box-shadow`
358
- declaration on the material group so it composes uniformly without
359
- perturbing each tier's elevation recipe (the floating/overlay tiers drop
360
- their now-redundant inline `--glass-edge-light` layer below). The alpha is
361
- deliberately low so the rim never eats AA legibility over a busy
362
- backdrop. */
363
- .glass-material,
364
- .glass-wash,
365
- .glass-quiet,
366
- .glass-resting,
367
- .glass-floating,
368
- .glass-overlay,
369
- .glass-card,
370
- .glass-specular-track,
371
- .dock-icon-button {
372
- --glass-material-rim: var(--glass-edge-light);
409
+ /* BB.W-LIQUIDHOVER — the grain engage collapses to INSTANT under reduced motion (a
410
+ grain that cross-fades on hover under reduce is still motion; accessibility is
411
+ absolute). The reduced-transparency / forced-colors brackets already zero
412
+ `--glass-grain-opacity` (a11y-fallback.css), so the grain is inert there; this
413
+ bracket covers the reduced-MOTION case where the grain still paints but must not
414
+ animate. */
415
+ @media (prefers-reduced-motion: reduce) {
416
+ .glass-wash::after,
417
+ .glass-quiet::after,
418
+ .glass-resting::after,
419
+ .glass-floating::after,
420
+ .glass-overlay::after {
421
+ transition: none;
422
+ }
373
423
  }
374
424
 
425
+ /* The unified rim (AW.W22) + the BB.W-GLASS-ACCENT per-INSTANCE chromatic-RIM
426
+ tint group (the rim-ink + --glass-material-rim ring + the per-rung
427
+ --glass-border-accent border, light + dark arms) lives in glass/rim.css
428
+ (carved at BB.W-CARVE4 — the next adjacent @layer components block, the SOLE
429
+ writer of --glass-material-rim/--glass-border-accent). */
430
+
375
431
  .dark .glass-wash::after,
376
432
  .dark .glass-quiet::after,
377
433
  .dark .glass-resting::after,
@@ -105,23 +105,72 @@
105
105
  registered-`@property` var() nested in an hsl() alpha computes to 0 in
106
106
  Chromium — the cross-engine-safe path); the per-stop alphas are literals so
107
107
  even the lifted hover/active states read as a lens, not a flash. */
108
- background: radial-gradient(
109
- circle var(--glass-specular-size, 36%) at var(--specular-x, 50%) var(--specular-y, 50%),
110
- hsl(40 35% 92% / 0.5) 0%,
111
- hsl(40 35% 92% / 0) 70%,
112
- transparent 100%
108
+ /* BB.W-LENSING (scope 3) — the motion-reactive EDGE glint UNIFIED with the
109
+ centered catch-light disc on ONE `::before`. TWO background layers compose:
110
+ (TOP) the angle-keyed EDGE-anchored conic sweep — a warm-cream arc that
111
+ brightens the RIM where the pointer's `--specular-angle` grazes (the
112
+ glass-THICKNESS read iOS-27 fuses with the catch-light); (BOTTOM) the
113
+ existing pointer-position centered disc. BOTH ride the SAME `--specular-
114
+ intensity` cohort (the `opacity` below) + `plus-lighter` blend + warm-cream
115
+ core `hsl(40 35% 92%)` — NEVER a second color/blend fork. The conic is masked
116
+ to the rim band only (the `--glass-edge-glint-band` radial mask, scope 3),
117
+ so the glint is a bounded RIM ring, NOT a whole-plate wash (the AX.W52 D19
118
+ bounded-gleam discipline). The `--specular-angle` floor `0deg` sits the glint
119
+ at the top edge when unwired (static rest — no ambient drift, no blowout). */
120
+ /* BB.W-GLASS-ACCENT — the catch-light CORE COLOR composes the per-instance
121
+ chromatic accent. The warm-cream `hsl(40 35% 92%)` core resolves through
122
+ the ONE `--glass-specular-core` var, OKLab-mixed toward `var(--glass-
123
+ accent)` at `var(--glass-accent-strength)`. This tints the CORE only — it
124
+ is the COLOR axis; W-LENSING owns the GEOMETRY (the conic angle-keyed
125
+ edge-glint + the radial disc + the masks + the `plus-lighter` blend, all
126
+ BELOW, untouched). Tinting the ONE core tints BOTH the centered disc AND
127
+ the rim glint (they share the core), so the data hue reads at the glint
128
+ where the pointer grazes — the data-keyed colored catch-light. At
129
+ `--glass-accent-strength: 0%` + `--glass-accent: transparent` (the
130
+ `@property` defaults) the mix === `hsl(40 35% 92%)` byte-identical (the W2
131
+ warm-cream floor). Each gradient stop reproduces its original alpha via
132
+ `color-mix(in srgb, <core> N%, transparent)` (=== the prior `<core> / 0.NN`),
133
+ so the geometry + falloff is byte-identical at rest. */
134
+ --glass-specular-core: color-mix(
135
+ in oklab,
136
+ hsl(40 35% 92%),
137
+ var(--glass-accent) var(--glass-accent-strength)
113
138
  );
139
+ background:
140
+ conic-gradient(
141
+ from var(--specular-angle, 0deg) at 50% 50%,
142
+ transparent 0deg,
143
+ color-mix(in srgb, var(--glass-specular-core) 55%, transparent) 18deg,
144
+ transparent 60deg,
145
+ transparent 360deg
146
+ ),
147
+ radial-gradient(
148
+ circle var(--glass-specular-size, 36%) at var(--specular-x, 50%) var(--specular-y, 50%),
149
+ color-mix(in srgb, var(--glass-specular-core) 50%, transparent) 0%,
150
+ transparent 70%,
151
+ transparent 100%
152
+ );
114
153
  opacity: var(--specular-intensity, 0);
115
- /* Clip the gleam to ITS OWN radius (not the whole plate) so it stays a
116
- bounded glint. `mask-image` Baseline 2023-12-07; a non-supporting engine
117
- ignores it and the `inset: 0` + radius-inherit + the in-paint falloff
118
- already bound the gleam to the surface. */
119
- mask-image: radial-gradient(
120
- circle var(--glass-specular-size, 36%) at var(--specular-x, 50%) var(--specular-y, 50%),
121
- black 0%,
122
- black 60%,
123
- transparent 100%
124
- );
154
+ /* Per-layer masks (the `,`-separated list pairs with the two backgrounds in
155
+ order): the EDGE conic is masked to the RIM BAND ONLY — transparent across
156
+ the interior, opaque in the outer `--glass-edge-glint-band` (default 22%) — so
157
+ the angle-keyed glint reads as a THICKNESS rim, not a center wash; the centered
158
+ disc keeps its own-radius clip (AX.W52 D19). `mask-image` Baseline 2023-12-07;
159
+ a non-supporting engine ignores it and the `inset: 0` + in-paint falloff still
160
+ bound the gleam. */
161
+ mask-image:
162
+ radial-gradient(
163
+ circle closest-side at 50% 50%,
164
+ transparent calc(100% - var(--glass-edge-glint-band, 22%)),
165
+ black calc(100% - calc(var(--glass-edge-glint-band, 22%) * 0.5)),
166
+ black 100%
167
+ ),
168
+ radial-gradient(
169
+ circle var(--glass-specular-size, 36%) at var(--specular-x, 50%) var(--specular-y, 50%),
170
+ black 0%,
171
+ black 60%,
172
+ transparent 100%
173
+ );
125
174
  /* AX.W52 D19 — `plus-lighter` (additive but HDR-clamped, Safari 16.4+) over
126
175
  the prior `screen` (a non-linear lightener that lifted the whole tile
127
176
  toward white — the muddy-card defect). A non-supporting engine degrades to
@@ -235,4 +284,18 @@
235
284
  --specular-intensity: var(--glass-specular-intensity-active, 0.16);
236
285
  }
237
286
 
287
+ /* BB.W-LENSING (scope 2) — the `:active` LENS-SWELL is RETIRED (DDR-LENS-BAKE,
288
+ glass-refract.css header). The swell drove the displacement `scale` by mutating
289
+ the `--glass-refract` axis on the `--glass-btn-press-t` press drive (28 rest → 44
290
+ pressed). That depended on the var()-spliced head/`scale`/tail filter — which never
291
+ PARSED as a `backdrop-filter` (three tokens: `url("…") <n> url("…")`), so the lens
292
+ rendered `none` and the swell animated a value that reached NO filter. A CSS url()
293
+ string token cannot carry a substituted `var()` (the engine does not re-tokenise
294
+ inside a string), so a dynamic per-instance `scale` is structurally impossible in a
295
+ single self-contained data-URI — and the single token is mandatory for both parse
296
+ validity and bundler url()-rewrite safety. The `scale` is now BAKED at the §10
297
+ default (28); the resting lens read is PRESERVED (and now actually renders), the
298
+ press-depth animation is the deliberate tradeoff. The press squish + gleam lift on
299
+ the SAME `--glass-btn-press-t` drive (material gleam, above) carry the press read. */
300
+
238
301
  }
@@ -0,0 +1,136 @@
1
+ /* glass/reveal.css
2
+ BB.W-LIQUID-REVEAL — the `.glass-reveal` LIQUID-ENTER recipe: the spring-clocked,
3
+ coupled-channel top-layer open that REPLACES `popover-animate`'s fixed-bezier
4
+ zoom-95 (clean break, no alias). The zero-JS floor the reka portaled overlays
5
+ compose (they are not native top-layer, so they cannot ride `@starting-style`;
6
+ `.glass-reveal` is the data-state form). The `useLiquidReveal` JS leaf is the
7
+ source-rect REFINEMENT (the dialog-from-button / dock-from-pill bloom); this CSS
8
+ recipe is the everywhere floor.
9
+ @import-ed by glass.css in cascade order, in its own @layer components
10
+ (isomorphic to the monolith). See docs/precepts/design-idioms.md §cohesion-aware
11
+ partials. */
12
+
13
+ /* ── THE LIQUID ENTER (the iOS-27 bloom-from-anchor) ──────────────────────────
14
+ *
15
+ * Three COUPLED channels, the SPATIAL/EFFECTS split (the Material-3 / §6 /
16
+ * W-MOTION-CANON doctrine):
17
+ *
18
+ * (a) SCALE (the bloom — SPATIAL) rides `--spring-snappy` + its OWN settle clock
19
+ * `--spring-snappy-duration` (the W-GLASS-CAL Unit 3 per-spring clock, NOT the
20
+ * generic `--duration-normal` that re-timed every spring to one wall clock).
21
+ * The overshoot interior of the spring `linear()` gives the canonical iOS
22
+ * arrival. `transform-origin` anchors at the popper edge (`--reka-popper-
23
+ * transform-origin`) so the surface blooms FROM its anchor, not center.
24
+ * (b) OPACITY (the fade — EFFECTS) rides `--ease-out` (NO overshoot — a fade must
25
+ * not bounce), coupled so scale+fade read as ONE continuous coalescing layer.
26
+ * (c) BLUR-SETTLE (the iOS "light-bending modulation" decongest — EFFECTS)
27
+ * `filter: blur(--glass-reveal-blur)` → `blur(0)`, on the SAME spring clock as
28
+ * the scale so the surface clarifies AS it blooms. The decongest rides the
29
+ * surface's OWN pixels (`filter`) NOT the backdrop (`backdrop-filter`), so it
30
+ * does NOT clobber the resting `glass-floating` tier plate blur the overlay
31
+ * carries at rest (a `backdrop-filter: blur(0)` open value would erase the
32
+ * glass). A `filter` radius interp is COMPOSITOR-safe (never a layout property
33
+ * — the proof:no-layout-animation floor).
34
+ *
35
+ * Uses the `scale:` / `translate:` LONGHANDS (not `transform:`), so it composes with
36
+ * any identity-base transform and mints no stacking context (the `.glass-top-layer`
37
+ * `scale:` discipline). NEVER animates a layout property (the zoom is `scale`, the
38
+ * side-slide is `translate` — the directional slide-in `popover-animate` +
39
+ * `slide-in-from-side` used to carry, now folded onto the compositor `translate` leg).
40
+ */
41
+
42
+ @layer components {
43
+ .glass-reveal {
44
+ /* The one public start knob (the decongest radius). The spatial/effects
45
+ clocks read the shared spring tokens (read-only — the W-GLASS-CAL fence). */
46
+ --glass-reveal-blur: 4px;
47
+ --glass-reveal-slide: 0.5rem;
48
+ transform-origin: var(--reka-popper-transform-origin, center);
49
+ /* The coupled transition list — the SPATIAL legs (scale/translate) on the
50
+ snappy spring's OWN settle clock, the EFFECTS legs (opacity/filter blur-
51
+ settle) on the no-overshoot ease-out. ONE coherent glide. The blur rides
52
+ `filter` (the surface's own pixels) NOT `backdrop-filter` (which would
53
+ clobber the resting glass-floating plate blur). */
54
+ transition-property: scale, translate, opacity, filter, display, overlay;
55
+ transition-duration: var(--spring-snappy-duration), var(--spring-snappy-duration),
56
+ var(--spring-snappy-duration), var(--spring-snappy-duration),
57
+ var(--spring-snappy-duration), var(--spring-snappy-duration);
58
+ transition-timing-function: var(--spring-snappy), var(--spring-snappy),
59
+ var(--ease-out), var(--ease-out), linear, linear;
60
+ transition-behavior: allow-discrete;
61
+ }
62
+
63
+ /* OPEN — the settled, bloomed-in state (the spring-clocked scale/fade/blur-settle
64
+ interpolates FROM the closed values). `filter: blur(0)` clarifies the surface;
65
+ the resting `glass-floating` backdrop-filter is untouched. The `translate` leg
66
+ is set ONLY by the `data-side` variants below (a side-anchored popover slides
67
+ from its edge) — the BASE never writes `translate`, so a center-anchored Dialog
68
+ keeping its `-translate-x-1/2 -translate-y-1/2` centering is NEVER clobbered. */
69
+ .glass-reveal[data-state="open"] {
70
+ scale: 1;
71
+ opacity: 1;
72
+ filter: blur(0);
73
+ }
74
+
75
+ /* CLOSED — both the resting CLOSED snapshot AND the EXIT leg. The exit reads
76
+ `--ease-out` (a bezier, NO overshoot — a closing surface must never overshoot
77
+ past gone, the §6/W-MOTION-CANON P2 doctrine); NO `--spring-*` token on the
78
+ exit. The exit is faster + un-sprung — the surface recedes cleanly. */
79
+ .glass-reveal[data-state="closed"] {
80
+ scale: var(--glass-reveal-enter-scale, 0.95);
81
+ opacity: 0;
82
+ filter: blur(var(--glass-reveal-blur));
83
+ transition-timing-function: var(--ease-out);
84
+ transition-duration: var(--duration-fast);
85
+ }
86
+
87
+ /* The directional slide-in — the compositor `translate` leg keyed off the
88
+ popper's `data-side` (folds the retired `slide-in-from-side` `@utility`'s
89
+ directional entry onto the compositor channel; the panel enters from outside
90
+ the anchor's edge). On the SAME snappy spring + clock as the scale. ONLY a
91
+ side-anchored popover (with `data-side`) sets `translate`; the open settled
92
+ value is `0 0` (per side, so it slides home from the edge). A center-anchored
93
+ Dialog has no `data-side` and is never reached here. */
94
+ .glass-reveal[data-side="top"][data-state="open"],
95
+ .glass-reveal[data-side="bottom"][data-state="open"],
96
+ .glass-reveal[data-side="left"][data-state="open"],
97
+ .glass-reveal[data-side="right"][data-state="open"] {
98
+ translate: 0 0;
99
+ }
100
+ .glass-reveal[data-state="closed"][data-side="top"] {
101
+ translate: 0 var(--glass-reveal-slide);
102
+ }
103
+ .glass-reveal[data-state="closed"][data-side="bottom"] {
104
+ translate: 0 calc(-1 * var(--glass-reveal-slide));
105
+ }
106
+ .glass-reveal[data-state="closed"][data-side="left"] {
107
+ translate: var(--glass-reveal-slide) 0;
108
+ }
109
+ .glass-reveal[data-state="closed"][data-side="right"] {
110
+ translate: calc(-1 * var(--glass-reveal-slide)) 0;
111
+ }
112
+ }
113
+
114
+ /* ── REDUCED-MOTION CARVE (the vestibular floor — WCAG 2.3.3) ──────────────────
115
+ * Under `prefers-reduced-motion: reduce` the reveal SNAPS the spatial channels to
116
+ * their endpoints (scale → none, translate → none) and the blur-settle to none —
117
+ * ZERO transform/blur frames. The OPACITY fade SURVIVES (opacity is not a vestibular
118
+ * trigger; the surface fades, never flies, never disappears). The fade rides the
119
+ * short `--duration-fast` clock (the `.glass-top-layer` PRM precedent). */
120
+ @media (prefers-reduced-motion: reduce) {
121
+ .glass-reveal {
122
+ scale: none;
123
+ translate: none;
124
+ /* The decongest snaps to clear (`filter: blur(0)`); the resting
125
+ `glass-floating` backdrop-filter plate blur is UNTOUCHED. */
126
+ filter: blur(0);
127
+ transition-property: opacity, display, overlay;
128
+ transition-duration: var(--duration-fast);
129
+ transition-timing-function: var(--ease-out);
130
+ }
131
+ .glass-reveal[data-state="closed"] {
132
+ scale: none;
133
+ translate: none;
134
+ filter: blur(0);
135
+ }
136
+ }
@@ -0,0 +1,100 @@
1
+ /* glass/rim.css
2
+ The BB.W-GLASS-ACCENT per-INSTANCE chromatic rim/accent group (the rim-ink +
3
+ --glass-material-rim ring + the per-rung --glass-border-accent border, light +
4
+ dark arms).
5
+ Carved from glass/ladder.css at BB.W-CARVE4 to hold the no-god-module bound (the
6
+ five-rung surface ladder + the W55 bright-bucket @container + the calm-tier re-point
7
+ + the contrast-color ink-flip + the opaque escape + the under-shadow modifier + the
8
+ grain ::after stay in ladder.css). @import-ed by glass.css in cascade order
9
+ IMMEDIATELY AFTER ladder.css — the SAME @layer components; the rim/accent group is
10
+ the SOLE writer of --glass-material-rim/--glass-border-accent (the rungs read those
11
+ + --glass-rim-ink as custom properties resolved at use-time on the SAME elements, so
12
+ the relocation is cascade-order-invariant), and the W55 bright-bucket is DELIBERATELY
13
+ kept in ladder.css (relocating it past the contrast-color @supports block would invert
14
+ their same-specificity source-order tie on supporting engines — a behaviour change the
15
+ byte-isomorphism bound forbids). The dist is byte-isomorphic. */
16
+ @layer components {
17
+ /* (b) The unified rim — `--glass-edge-light` full-perimeter inset ring on
18
+ EVERY material surface (AW.W22). Previously the rim was wired only into
19
+ the floating/overlay tiers' box-shadow stack; promoting it to the material
20
+ group makes wash/quiet/resting/card/dock-control all carry the same
21
+ silhouette catch-light from ONE token. The rim is its OWN `box-shadow`
22
+ declaration on the material group so it composes uniformly without
23
+ perturbing each tier's elevation recipe (the floating/overlay tiers drop
24
+ their now-redundant inline `--glass-edge-light` layer below). The alpha is
25
+ deliberately low so the rim never eats AA legibility over a busy
26
+ backdrop. */
27
+ /* ── BB.W-GLASS-ACCENT — the per-INSTANCE chromatic-RIM tint ───────────────
28
+ The THIRD disjoint glass axis (LEVEL · TINT · ACCENT). The rim is TWO
29
+ resolved things — the `--glass-material-rim` inset RING (= `--glass-edge-
30
+ light`, an inset box-shadow) and the per-rung `--glass-border-*` BORDER —
31
+ and BOTH must carry the accent hue so the rim reads as ONE accent silhouette,
32
+ not a half-tinted edge.
33
+
34
+ The composition is `color-mix(in oklab, <current rim color>, var(--glass-
35
+ accent) var(--glass-accent-strength))` — the PERCEPTUAL oklab mix the W55
36
+ glass-tint seam + the `<IconChip>` chip already speak (NOT in-srgb — the
37
+ in-srgb fence is the `--surface-tint-*` brand-overlay family, a SEPARATE
38
+ axis this never touches). At the resting `--glass-accent-strength: 0%` (the
39
+ `@property` default) + `--glass-accent: transparent` (the neutral identity)
40
+ the mix resolves byte-identical to today's rim (the W2 no-op floor).
41
+
42
+ The RING: a box-shadow value cannot be `color-mix`-ed whole, so the rim ring
43
+ is REBUILT here as `inset 0 0 0 0.75px <mixed-color>` — the SAME 0.75px inset
44
+ geometry the `--glass-edge-light` token paints (AV.W15 M3), only its COLOR
45
+ stop composing the accent. At 0% strength the color resolves to the
46
+ `--glass-edge-light` base ink (`hsl(0 0% 100% / 0.18)` light / 0.22 dark —
47
+ read via `--glass-rim-ink`) so the ring is byte-identical to
48
+ `var(--glass-edge-light)`. The `.dark` arm re-points `--glass-rim-ink` to the
49
+ dark base so the dark rim composes off `--glass-edge-light-dark`.
50
+
51
+ The BORDER: each rung's `border-color` reads `--glass-border-accent`, which
52
+ composes the accent onto the rung's own `--glass-border-*` ink. The rung
53
+ borders are re-pointed at their declarations (the `border: 1px solid
54
+ var(--glass-border-accent)`) so ONE derived token carries the accent across
55
+ the band; `--glass-border-accent` reads the per-rung `--glass-border-rung`
56
+ the rung sets locally, mixed with the accent.
57
+
58
+ This axis NEVER touches the plate BACKGROUND (the W55 `--glass-tint-source`
59
+ cohort) — the accent is the rim+glint chromatic DECORATION, not the
60
+ whole-plate legibility darken (the distinct-axis-not-fork fence). */
61
+ .glass-material,
62
+ .glass-wash,
63
+ .glass-quiet,
64
+ .glass-resting,
65
+ .glass-floating,
66
+ .glass-overlay,
67
+ .glass-card,
68
+ .glass-specular-track,
69
+ .dock-icon-button {
70
+ /* the resolved rim ring INK (white-α light / lifted-white-α dark — the
71
+ SAME stop the `--glass-edge-light` token carries; the `.dark` arm below
72
+ re-points it). The accent mixes ONTO this ink. */
73
+ --glass-rim-ink: hsl(0 0% 100% / 0.18);
74
+ --glass-material-rim: inset 0 0 0 0.75px
75
+ color-mix(in oklab, var(--glass-rim-ink), var(--glass-accent) var(--glass-accent-strength));
76
+ /* the per-rung border ink, accent-composed. `--glass-border-rung` is set by
77
+ each rung at its own declaration (it reads the rung's `--glass-border-*`
78
+ token); the accent mixes onto it so the BORDER half of the rim carries the
79
+ same hue as the RING. At 0% strength === the un-mixed rung ink. */
80
+ --glass-border-accent: color-mix(
81
+ in oklab,
82
+ var(--glass-border-rung, var(--glass-border)),
83
+ var(--glass-accent) var(--glass-accent-strength)
84
+ );
85
+ }
86
+ .dark .glass-material,
87
+ .dark .glass-wash,
88
+ .dark .glass-quiet,
89
+ .dark .glass-resting,
90
+ .dark .glass-floating,
91
+ .dark .glass-overlay,
92
+ .dark .glass-card,
93
+ .dark .glass-specular-track,
94
+ .dark .dock-icon-button {
95
+ /* the dark rim ink is the lifted-α base (`--glass-edge-light-dark` stop) so
96
+ the accent composes off the dark silhouette device (W-DARK-MATERIAL). */
97
+ --glass-rim-ink: hsl(0 0% 100% / 0.22);
98
+ }
99
+
100
+ }