@mkbabb/glass-ui 3.13.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 (507) hide show
  1. package/README.md +3 -1
  2. package/dist/CardAction-CW7a0m8M.js +253 -0
  3. package/dist/{CommandShortcut-RowNEO6i.js → CommandShortcut-DvZNQ_HF.js} +58 -53
  4. package/dist/ConfiguratorRow-BR4l-ixA.js +143 -0
  5. package/dist/{ContextMenuContent-CT3AS1WX.js → ContextMenuContent-uWnVxDab.js} +1 -1
  6. package/dist/{ContextMenuSubContent-BQmxTAdw.js → ContextMenuSubContent-xol4sD2q.js} +32 -37
  7. package/dist/{DataTable-BCddn3T3.js → DataTable-CuKwF7wr.js} +99 -97
  8. package/dist/DialogContent-DcKK8k9i.js +103 -0
  9. package/dist/{DialogFooter-Blu4t7tJ.js → DialogFooter-BZNX5aVr.js} +3 -3
  10. package/dist/FadingScroll-DI6hQhT9.js +76 -0
  11. package/dist/{HoverCardContent-Csywg3YF.js → HoverCardContent-b2uaAMRR.js} +1 -1
  12. package/dist/{HoverPopover-CISOJQuZ.js → HoverPopover-CbqbNwgU.js} +2 -2
  13. package/dist/IconChip-BTD-nay5.js +55 -0
  14. package/dist/{IconTooltip-DPzE09X9.js → IconTooltip-Bl8gFZ8d.js} +1 -1
  15. package/dist/{Input-DWQQIOC4.js → Input-h9v5LeXf.js} +1 -1
  16. package/dist/{MetricBadge-C9QMz1KT.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-DL7E6vJP.js +127 -0
  20. package/dist/{Progress-DwlUKGbr.js → Progress-DctG61iZ.js} +98 -78
  21. package/dist/{ScrollingText-DfFrwSph.js → ScrollingText-yOpBzFYq.js} +2 -2
  22. package/dist/{SelectScrollDownButton-CiDUxfEj.js → SelectScrollDownButton-CrA8F0iV.js} +35 -20
  23. package/dist/{Switch-CsIuYP_e.js → Switch-CwYNf8bo.js} +1 -1
  24. package/dist/Toaster-Bw4xR8xV.js +274 -0
  25. package/dist/{ToggleGroupItem-D_AHlRw9.js → ToggleGroupItem-pEM9vIhs.js} +50 -37
  26. package/dist/{TooltipProvider-B3MkB_8P.js → TooltipProvider-rzvnXz60.js} +1 -1
  27. package/dist/animated-digit.js +2 -2
  28. package/dist/api/index.d.ts +16 -8
  29. package/dist/api/types-extra.d.ts +6 -0
  30. package/dist/api.js +2 -2
  31. package/dist/aurora.js +888 -230
  32. package/dist/badge.js +1 -1
  33. package/dist/border-progress.d.ts +1 -0
  34. package/dist/border-progress.js +106 -0
  35. package/dist/button-DYCUa-tH.js +126 -0
  36. package/dist/button.js +1 -1
  37. package/dist/canvas.js +2 -2
  38. package/dist/card.js +2 -2
  39. package/dist/carousel.d.ts +1 -1
  40. package/dist/carousel.js +90 -151
  41. package/dist/collapsible.js +1 -1
  42. package/dist/color-swatch.d.ts +1 -0
  43. package/dist/color-swatch.js +47 -0
  44. package/dist/color.js +1 -1
  45. package/dist/command.js +1 -1
  46. package/dist/compile-CQEFRTmx.js +19 -0
  47. package/dist/components/custom/aurora/composables/atoms-fields.d.ts +39 -0
  48. package/dist/components/custom/aurora/composables/auroraFallbackGround.d.ts +108 -0
  49. package/dist/components/custom/aurora/composables/runtime.d.ts +19 -0
  50. package/dist/components/custom/aurora/composables/uniformBridge.d.ts +5 -1
  51. package/dist/components/custom/aurora/composables/uniformBridgeWGPU.d.ts +51 -0
  52. package/dist/components/custom/aurora/composables/wgpuSetup.d.ts +29 -0
  53. package/dist/components/custom/aurora/constants/budget.d.ts +21 -0
  54. package/dist/components/custom/aurora/constants/presets.d.ts +30 -2
  55. package/dist/components/custom/aurora/constants/renderMode.d.ts +63 -10
  56. package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +1 -0
  57. package/dist/components/custom/aurora/constants/shaders/oil-modes.glsl.d.ts +1 -0
  58. package/dist/components/custom/aurora/constants/shaders/procedural-color.wgsl.d.ts +4 -0
  59. package/dist/components/custom/aurora/index.d.ts +3 -2
  60. package/dist/components/custom/border-progress/BorderProgress.vue.d.ts +46 -0
  61. package/dist/components/custom/border-progress/composables/useBorderSpectrum.d.ts +22 -0
  62. package/dist/components/custom/border-progress/constants.d.ts +59 -0
  63. package/dist/components/custom/border-progress/index.d.ts +4 -0
  64. package/dist/components/custom/color-swatch/ColorSwatch.vue.d.ts +22 -0
  65. package/dist/components/custom/color-swatch/index.d.ts +1 -0
  66. package/dist/components/custom/concentric/Concentric.vue.d.ts +39 -0
  67. package/dist/components/custom/concentric/composables/concentricGLSetup.d.ts +11 -0
  68. package/dist/components/custom/concentric/composables/concentricWGPUSetup.d.ts +13 -0
  69. package/dist/components/custom/concentric/composables/ringField.d.ts +44 -0
  70. package/dist/components/custom/concentric/composables/uniformBridgeWGPU.d.ts +13 -0
  71. package/dist/components/custom/concentric/composables/useConcentric.d.ts +35 -0
  72. package/dist/components/custom/concentric/constants.d.ts +43 -0
  73. package/dist/components/custom/concentric/index.d.ts +5 -0
  74. package/dist/components/custom/concentric/shaders/concentric.glsl.d.ts +4 -0
  75. package/dist/components/custom/concentric/shaders/concentric.wgsl.d.ts +1 -0
  76. package/dist/components/custom/configurator/Configurator.vue.d.ts +19 -8
  77. package/dist/components/custom/constellation/Constellation.vue.d.ts +18 -206
  78. package/dist/components/custom/constellation/composables/useConstellation.d.ts +26 -0
  79. package/dist/components/custom/constellation/constellationField.d.ts +2 -369
  80. package/dist/components/custom/constellation/constellationTypes.d.ts +369 -0
  81. package/dist/components/custom/constellation/index.d.ts +1 -1
  82. package/dist/components/custom/dock/DockIconButton.vue.d.ts +13 -4
  83. package/dist/components/custom/dock/DockLayerGroup.vue.d.ts +10 -2
  84. package/dist/components/custom/dock/DockRail.vue.d.ts +17 -16
  85. package/dist/components/custom/dock/DockSection.vue.d.ts +69 -0
  86. package/dist/components/custom/dock/DockSeparator.vue.d.ts +49 -1
  87. package/dist/components/custom/dock/DockTabButton.vue.d.ts +5 -5
  88. package/dist/components/custom/dock/composables/dockMorphMeasure.d.ts +75 -0
  89. package/dist/components/custom/dock/composables/useLayerTransition.d.ts +13 -0
  90. package/dist/components/custom/dock/constants.d.ts +35 -0
  91. package/dist/components/custom/dock/index.d.ts +2 -0
  92. package/dist/components/custom/dot-flow-field/DotFlowField.vue.d.ts +38 -0
  93. package/dist/components/custom/dot-flow-field/composables/flowField.d.ts +41 -0
  94. package/dist/components/custom/dot-flow-field/composables/uniformBridgeWGPU.d.ts +24 -0
  95. package/dist/components/custom/dot-flow-field/composables/useDotFlowField.d.ts +34 -0
  96. package/dist/components/custom/dot-flow-field/composables/useFlowParticles.d.ts +18 -0
  97. package/dist/components/custom/dot-flow-field/constants.d.ts +48 -0
  98. package/dist/components/custom/dot-flow-field/index.d.ts +5 -0
  99. package/dist/components/custom/dot-flow-field/shaders/flow-field.compute.wgsl.d.ts +1 -0
  100. package/dist/components/custom/dot-flow-field/shaders/flow-field.glsl.d.ts +20 -0
  101. package/dist/components/custom/dot-flow-field/shaders/flow-field.render.wgsl.d.ts +1 -0
  102. package/dist/components/custom/easing/EasingConfigurator.vue.d.ts +33 -0
  103. package/dist/components/custom/easing/EasingPicker.vue.d.ts +49 -0
  104. package/dist/components/custom/easing/composables/useEasingPicker.d.ts +75 -0
  105. package/dist/components/custom/easing/constants.d.ts +28 -0
  106. package/dist/components/custom/easing/index.d.ts +3 -0
  107. package/dist/components/custom/expandable-container/ExpandableContainer.vue.d.ts +10 -0
  108. package/dist/components/custom/fading-scroll/FadingScroll.vue.d.ts +25 -0
  109. package/dist/components/custom/fading-scroll/composables/useFadingScroll.d.ts +31 -0
  110. package/dist/components/custom/fading-scroll/constants.d.ts +19 -0
  111. package/dist/components/custom/fading-scroll/index.d.ts +2 -0
  112. package/dist/components/custom/fourier-field/FourierField.vue.d.ts +19 -2
  113. package/dist/components/custom/fourier-field/composables/useFourierField.d.ts +39 -0
  114. package/dist/components/custom/fourier-field/constants.d.ts +7 -0
  115. package/dist/components/custom/fourier-field/index.d.ts +1 -1
  116. package/dist/components/custom/fourier-field/math.d.ts +17 -0
  117. package/dist/components/custom/glass-panel/GlassPanel.vue.d.ts +9 -1
  118. package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +4 -2
  119. package/dist/components/custom/goo-blob/composables/uniformBridgeWGPU.d.ts +24 -0
  120. package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +29 -12
  121. package/dist/components/custom/goo-blob/composables/wgpuSetup.d.ts +23 -0
  122. package/dist/components/custom/goo-blob/constants.d.ts +6 -1
  123. package/dist/components/custom/goo-blob/shaders/metaball.wgsl.d.ts +1 -0
  124. package/dist/components/custom/handmark/HandMark.vue.d.ts +29 -0
  125. package/dist/components/custom/handmark/brush.d.ts +269 -0
  126. package/dist/components/custom/handmark/composables/useHandMark.d.ts +89 -0
  127. package/dist/components/custom/handmark/constants.d.ts +39 -0
  128. package/dist/components/custom/handmark/freehand.d.ts +69 -0
  129. package/dist/components/custom/handmark/geometry.d.ts +52 -0
  130. package/dist/components/custom/handmark/index.d.ts +27 -0
  131. package/dist/components/custom/handmark/ink.d.ts +11 -0
  132. package/dist/components/custom/handmark/texture.d.ts +39 -0
  133. package/dist/components/custom/handmark/types.d.ts +62 -0
  134. package/dist/components/custom/icon-chip/IconChip.vue.d.ts +4 -0
  135. package/dist/components/custom/icon-chip/index.d.ts +2 -0
  136. package/dist/components/custom/icon-chip/types.d.ts +82 -0
  137. package/dist/components/custom/instrument-chassis/InstrumentChassis.vue.d.ts +17 -2
  138. package/dist/components/custom/metric-stack/MetricStack.vue.d.ts +1 -1
  139. package/dist/components/custom/pager-dots/PagerDots.vue.d.ts +39 -0
  140. package/dist/components/custom/pager-dots/index.d.ts +2 -0
  141. package/dist/components/custom/spa-view/SpaView.vue.d.ts +50 -0
  142. package/dist/components/custom/spa-view/index.d.ts +2 -0
  143. package/dist/components/custom/tabs/SegmentedTabs.vue.d.ts +29 -24
  144. package/dist/components/custom/tabs/composables/useTabDragMorph.d.ts +42 -0
  145. package/dist/components/custom/tabs/composables/useTabIndicator.d.ts +30 -21
  146. package/dist/components/custom/tabs/constants.d.ts +9 -3
  147. package/dist/components/custom/tabs/index.d.ts +1 -1
  148. package/dist/components/custom/watercolor-dot/WatercolorDot.vue.d.ts +15 -1
  149. package/dist/components/ui/_shared/index.d.ts +2 -0
  150. package/dist/components/ui/_shared/menuItemVariants.d.ts +19 -0
  151. package/dist/components/ui/_shared/useSurfaceAxis.d.ts +41 -0
  152. package/dist/components/ui/badge/index.d.ts +1 -1
  153. package/dist/components/ui/button/Button.vue.d.ts +5 -2
  154. package/dist/components/ui/button/index.d.ts +2 -2
  155. package/dist/components/ui/card/Card.vue.d.ts +34 -4
  156. package/dist/components/ui/card/CardHeader.vue.d.ts +42 -16
  157. package/dist/components/ui/card/ScrollCard.vue.d.ts +33 -0
  158. package/dist/components/ui/card/ScrollCardHeader.vue.d.ts +17 -0
  159. package/dist/components/ui/card/index.d.ts +2 -0
  160. package/dist/components/ui/carousel/CarouselNext.vue.d.ts +2 -2
  161. package/dist/components/ui/carousel/CarouselPrevious.vue.d.ts +2 -2
  162. package/dist/components/ui/carousel/GlassCarouselPager.vue.d.ts +2 -2
  163. package/dist/components/ui/carousel/index.d.ts +0 -1
  164. package/dist/components/ui/command/Command.vue.d.ts +4 -1
  165. package/dist/components/ui/dialog/DialogContent.vue.d.ts +8 -3
  166. package/dist/components/ui/drawer/Drawer.vue.d.ts +46 -33
  167. package/dist/components/ui/drawer/DrawerContent.vue.d.ts +12 -8
  168. package/dist/components/ui/drawer/DrawerDescription.vue.d.ts +2 -2
  169. package/dist/components/ui/drawer/DrawerOverlay.vue.d.ts +1 -1
  170. package/dist/components/ui/drawer/DrawerTitle.vue.d.ts +2 -2
  171. package/dist/components/ui/drawer/composables/drawerSnapContext.d.ts +26 -0
  172. package/dist/components/ui/drawer/composables/useDrawerSnap.d.ts +17 -0
  173. package/dist/components/ui/drawer/constants.d.ts +45 -0
  174. package/dist/components/ui/drawer/index.d.ts +23 -15
  175. package/dist/components/ui/focus-scope/FocusScope.vue.d.ts +20 -0
  176. package/dist/components/ui/focus-scope/index.d.ts +2 -0
  177. package/dist/components/ui/index.d.ts +1 -1
  178. package/dist/components/ui/popover/PopoverContent.vue.d.ts +3 -0
  179. package/dist/components/ui/progress/ProgressDefault.vue.d.ts +3 -2
  180. package/dist/components/ui/progress/ProgressSectioned.vue.d.ts +14 -3
  181. package/dist/components/ui/select/SelectContent.vue.d.ts +1 -1
  182. package/dist/components/ui/select/SelectTrigger.vue.d.ts +27 -4
  183. package/dist/components/ui/sheet/SheetContent.vue.d.ts +6 -0
  184. package/dist/components/ui/sheet/index.d.ts +1 -1
  185. package/dist/components/ui/skeleton/Skeleton.vue.d.ts +3 -0
  186. package/dist/components/ui/tags-input/TagsInput.vue.d.ts +2 -2
  187. package/dist/components/ui/toast/Toast.vue.d.ts +5 -2
  188. package/dist/components/ui/toast/use-toast.d.ts +14 -0
  189. package/dist/components/ui/toggle/Toggle.vue.d.ts +1 -1
  190. package/dist/composables/dark/index.d.ts +1 -1
  191. package/dist/composables/dark/useGlobalDark.d.ts +23 -1
  192. package/dist/composables/glass/canvas2d/useCanvas2D.d.ts +13 -6
  193. package/dist/composables/glass/index.d.ts +5 -2
  194. package/dist/composables/glass/useSpecularPointer.d.ts +33 -0
  195. package/dist/composables/glass/useSpecularTracking.d.ts +20 -0
  196. package/dist/composables/glass/vSpecular.d.ts +2 -0
  197. package/dist/composables/glass/webgl/shaders/flow.glsl.d.ts +1 -0
  198. package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +16 -0
  199. package/dist/composables/glass/webgpu/index.d.ts +2 -0
  200. package/dist/composables/glass/webgpu/useGpuSubstrate.d.ts +54 -0
  201. package/dist/composables/glass/webgpu/useWebGPUCanvas.d.ts +84 -0
  202. package/dist/composables/motion/core/index.d.ts +1 -0
  203. package/dist/composables/motion/index.d.ts +4 -0
  204. package/dist/composables/motion/useDockCtaReceive.d.ts +59 -0
  205. package/dist/composables/motion/useDragMorph.d.ts +77 -0
  206. package/dist/composables/motion/useLiquidFlex.d.ts +11 -0
  207. package/dist/composables/motion/useLiquidPress.d.ts +71 -0
  208. package/dist/composables/motion/useLiquidReveal.d.ts +51 -0
  209. package/dist/composables/motion/useNumericTransition.d.ts +3 -3
  210. package/dist/composables/motion/usePointerVelocityField.d.ts +98 -0
  211. package/dist/composables/motion/useViewTransition.d.ts +36 -1
  212. package/dist/concentric.d.ts +1 -0
  213. package/dist/concentric.js +562 -0
  214. package/dist/configurator.js +3 -2
  215. package/dist/confirm-dialog.js +22 -24
  216. package/dist/constellation.js +93 -95
  217. package/dist/context-menu.js +3 -3
  218. package/dist/controls.js +10 -4
  219. package/dist/createCanvasLifecycle-CHD5XrDW.js +82 -0
  220. package/dist/dark.d.ts +1 -1
  221. package/dist/dark.js +1 -1
  222. package/dist/data-table.js +1 -1
  223. package/dist/dialog.js +2 -2
  224. package/dist/dock.js +738 -442
  225. package/dist/{dockContext-BegmJVmx.js → dockContext-BNfyPLe9.js} +1 -1
  226. package/dist/dom.js +5 -5
  227. package/dist/dot-flow-field.d.ts +1 -0
  228. package/dist/dot-flow-field.js +604 -0
  229. package/dist/drawer.d.ts +1 -0
  230. package/dist/drawer.js +380 -0
  231. package/dist/{dropdown-menu-DzkkyBwX.js → dropdown-menu-CofSZuk8.js} +14 -15
  232. package/dist/dropdown-menu.js +1 -1
  233. package/dist/easing.d.ts +1 -0
  234. package/dist/easing.js +463 -0
  235. package/dist/expandable-container.js +45 -38
  236. package/dist/fading-scroll.d.ts +1 -0
  237. package/dist/fading-scroll.js +2 -0
  238. package/dist/focus-scope.d.ts +1 -0
  239. package/dist/focus-scope.js +23 -0
  240. package/dist/forms.js +7 -7
  241. package/dist/fourier-field.js +135 -122
  242. package/dist/fourier-math.js +2 -2
  243. package/dist/glass-panel.js +39 -36
  244. package/dist/glass-ui.css +1 -1
  245. package/dist/glass-ui.js +154 -362
  246. package/dist/goo-blob.js +838 -227
  247. package/dist/handmark.d.ts +1 -0
  248. package/dist/handmark.js +707 -0
  249. package/dist/header-ribbon.js +1 -1
  250. package/dist/hover-card.js +1 -1
  251. package/dist/hover-popover.js +1 -1
  252. package/dist/icon-chip.d.ts +1 -0
  253. package/dist/icon-chip.js +2 -0
  254. package/dist/icon-tooltip.js +1 -1
  255. package/dist/index.d.ts +3 -3
  256. package/dist/instrument-chassis.js +1 -1
  257. package/dist/keyboard.js +1 -1
  258. package/dist/label.js +1 -1
  259. package/dist/labeled-field.js +6 -6
  260. package/dist/{math-U6-RrLmV.js → math-BINYmg5z.js} +11 -3
  261. package/dist/{menuItemVariants-DPiEarb0.js → menuItemVariants-D8VNHq22.js} +10 -4
  262. package/dist/metric-badge.js +1 -1
  263. package/dist/metric-cell.js +25 -22
  264. package/dist/metric-stack.js +4 -8
  265. package/dist/motion-core.js +36 -35
  266. package/dist/motion-curves.js +1 -1
  267. package/dist/motion.js +157 -55
  268. package/dist/notification.js +1 -1
  269. package/dist/number-field.js +1 -1
  270. package/dist/pager-dots.d.ts +1 -0
  271. package/dist/pager-dots.js +91 -0
  272. package/dist/paper-backdrop.js +1 -1
  273. package/dist/popover.js +1 -1
  274. package/dist/{presets-BKVyQfbt.js → presets-BW2b-fr1.js} +14 -1
  275. package/dist/{compile-B7NGOBcP.js → procedural-color.glsl-CIFsJhwI.js} +1 -155
  276. package/dist/procedural-color.wgsl-CToRHugY.js +224 -0
  277. package/dist/progress.js +1 -1
  278. package/dist/pulse.js +1 -1
  279. package/dist/reactive.js +2 -2
  280. package/dist/scrolling-text.js +1 -1
  281. package/dist/search.js +10 -12
  282. package/dist/select.js +3 -3
  283. package/dist/separator.js +1 -1
  284. package/dist/sheet-tZMg0E0w.js +218 -0
  285. package/dist/sheet.js +1 -1
  286. package/dist/{slider-B-JP2JlI.js → slider-DVb4HXU-.js} +7 -7
  287. package/dist/slider.js +1 -1
  288. package/dist/sortable-list.js +3 -3
  289. package/dist/spa-view.d.ts +1 -0
  290. package/dist/spa-view.js +46 -0
  291. package/dist/styles/animations.css +40 -31
  292. package/dist/styles/border-progress.css +109 -0
  293. package/dist/styles/cards.css +76 -0
  294. package/dist/styles/components.css +1 -1
  295. package/dist/styles/configurator.css +35 -0
  296. package/dist/styles/critical-partition.mjs +140 -0
  297. package/dist/styles/critical.css +12 -0
  298. package/dist/styles/deferred.css +31 -0
  299. package/dist/styles/dock/density.css +64 -0
  300. package/dist/styles/dock/layers.css +54 -30
  301. package/dist/styles/dock/morph.css +124 -7
  302. package/dist/styles/dock/overflow.css +31 -2
  303. package/dist/styles/dock/rail-extend.css +168 -71
  304. package/dist/styles/dock/section.css +59 -0
  305. package/dist/styles/dock/shell.css +83 -16
  306. package/dist/styles/dock-controls/icon-button.css +11 -1
  307. package/dist/styles/dock-controls/tab-button.css +24 -83
  308. package/dist/styles/dock-controls/triggers.css +7 -0
  309. package/dist/styles/dock.css +38 -3
  310. package/dist/styles/drawer.css +127 -35
  311. package/dist/styles/feedback-tone.css +104 -0
  312. package/dist/styles/glass/deep.css +44 -0
  313. package/dist/styles/glass/ladder.css +154 -52
  314. package/dist/styles/glass/material.css +78 -15
  315. package/dist/styles/glass/reveal.css +136 -0
  316. package/dist/styles/glass/rim.css +100 -0
  317. package/dist/styles/glass/surface-axis.css +113 -0
  318. package/dist/styles/glass/surfaces.css +189 -15
  319. package/dist/styles/glass-refract.css +96 -44
  320. package/dist/styles/glass-specular-track.css +7 -0
  321. package/dist/styles/glass.css +8 -2
  322. package/dist/styles/hover-popover.css +7 -6
  323. package/dist/styles/icon-chip.css +211 -0
  324. package/dist/styles/index.css +78 -4
  325. package/dist/styles/instrument-chassis.css +107 -2
  326. package/dist/styles/menu.css +127 -0
  327. package/dist/styles/scroll-choreography.css +300 -0
  328. package/dist/styles/segmented-tabs.css +188 -86
  329. package/dist/styles/select.css +50 -0
  330. package/dist/styles/theme/bridges.css +22 -1
  331. package/dist/styles/theme/literals.css +11 -2
  332. package/dist/styles/theme/radius.css +6 -1
  333. package/dist/styles/tokens/color-radius.css +40 -13
  334. package/dist/styles/tokens/dark-arm.css +200 -20
  335. package/dist/styles/tokens/glass-deep.css +75 -0
  336. package/dist/styles/tokens/glass-fx.css +333 -0
  337. package/dist/styles/tokens/glass.css +95 -315
  338. package/dist/styles/tokens/light-dark.css +64 -22
  339. package/dist/styles/tokens/offsets.css +116 -0
  340. package/dist/styles/tokens/on-glass-fg.css +39 -0
  341. package/dist/styles/tokens/property-regs.css +130 -10
  342. package/dist/styles/tokens/scale-paper.css +155 -84
  343. package/dist/styles/tokens/scheme-motion.css +102 -46
  344. package/dist/styles/tokens/scroll-tokens.css +123 -0
  345. package/dist/styles/tokens/{offsets-sizing.css → sizing.css} +88 -89
  346. package/dist/styles/tokens.css +9 -3
  347. package/dist/styles/transitions.css +7 -7
  348. package/dist/styles/typography/scale.css +153 -0
  349. package/dist/styles/typography/semantic.css +220 -0
  350. package/dist/styles/typography/utilities.css +174 -0
  351. package/dist/styles/typography.css +23 -507
  352. package/dist/styles/utilities/a11y-overrides.css +33 -4
  353. package/dist/styles/utilities/animate.css +27 -24
  354. package/dist/styles/utilities/base-misc.css +255 -0
  355. package/dist/styles/utilities/base.css +100 -138
  356. package/dist/styles/utilities/btn.css +21 -202
  357. package/dist/styles/utilities/metal.css +189 -0
  358. package/dist/styles/utilities.css +14 -7
  359. package/dist/styles/view-transition.css +4 -1
  360. package/dist/switch.js +1 -1
  361. package/dist/tabs.js +275 -191
  362. package/dist/timeline.js +2 -2
  363. package/dist/toast.js +1 -1
  364. package/dist/toggle-chip.js +3 -1
  365. package/dist/toggle-group.js +1 -1
  366. package/dist/tooltip.js +1 -1
  367. package/dist/typewriter.js +1 -1
  368. package/dist/{useAnimatedNumber-C5I3wWd8.js → useAnimatedNumber-BfUq2bUM.js} +1 -1
  369. package/dist/useCanvas2D-B8w_E3Rr.js +83 -0
  370. package/dist/useConfiguratorState-DNlOh6c8.js +161 -0
  371. package/dist/useDragMorph-DgxnsVJz.js +102 -0
  372. package/dist/{useGlobalDark-yhL4Wp-s.js → useGlobalDark-C28t0VWJ.js} +22 -3
  373. package/dist/useLiquidPress-kfb4KX79.js +39 -0
  374. package/dist/usePointerVelocityField-JbRd5CrM.js +137 -0
  375. package/dist/{useRAFLoop-Bxv0o6L5.js → useRAFLoop-UYa4zoiN.js} +1 -1
  376. package/dist/useSpring-C0jyvEJB.js +40 -0
  377. package/dist/useSpringMount-q1amq1SJ.js +71 -0
  378. package/dist/useSpringPress-BsqPr7FJ.js +34 -0
  379. package/dist/useSurfaceAxis-g0NloYEF.js +7 -0
  380. package/dist/{useTouchGate-Dg7MQI1G.js → useTouchGate-CBZTD4SD.js} +1 -1
  381. package/dist/vReveal-Czsb7zQC.js +10 -0
  382. package/dist/vSpecular-CQFmLNzA.js +68 -0
  383. package/dist/vendor-CKmzio-i.js +226 -0
  384. package/dist/watercolor-dot.js +12 -5
  385. package/package.json +193 -25
  386. package/src/styles/animations.css +40 -31
  387. package/src/styles/border-progress.css +109 -0
  388. package/src/styles/cards.css +76 -0
  389. package/src/styles/configurator.css +35 -0
  390. package/src/styles/critical-partition.mjs +140 -0
  391. package/src/styles/dock/density.css +64 -0
  392. package/src/styles/dock/layers.css +54 -30
  393. package/src/styles/dock/morph.css +124 -7
  394. package/src/styles/dock/overflow.css +31 -2
  395. package/src/styles/dock/rail-extend.css +168 -71
  396. package/src/styles/dock/section.css +59 -0
  397. package/src/styles/dock/shell.css +83 -16
  398. package/src/styles/dock-controls/icon-button.css +11 -1
  399. package/src/styles/dock-controls/tab-button.css +24 -83
  400. package/src/styles/dock-controls/triggers.css +7 -0
  401. package/src/styles/dock.css +38 -3
  402. package/src/styles/drawer.css +123 -35
  403. package/src/styles/feedback-tone.css +104 -0
  404. package/src/styles/glass/deep.css +44 -0
  405. package/src/styles/glass/ladder.css +154 -52
  406. package/src/styles/glass/material.css +78 -15
  407. package/src/styles/glass/reveal.css +136 -0
  408. package/src/styles/glass/rim.css +100 -0
  409. package/src/styles/glass/surface-axis.css +113 -0
  410. package/src/styles/glass/surfaces.css +189 -15
  411. package/src/styles/glass-refract.css +96 -44
  412. package/src/styles/glass-specular-track.css +7 -0
  413. package/src/styles/glass.css +8 -2
  414. package/src/styles/hover-popover.css +7 -6
  415. package/src/styles/icon-chip.css +211 -0
  416. package/src/styles/index.css +78 -4
  417. package/src/styles/instrument-chassis.css +107 -2
  418. package/src/styles/menu.css +127 -0
  419. package/src/styles/scroll-choreography.css +300 -0
  420. package/src/styles/segmented-tabs.css +184 -84
  421. package/src/styles/select.css +50 -0
  422. package/src/styles/theme/bridges.css +22 -1
  423. package/src/styles/theme/literals.css +11 -2
  424. package/src/styles/theme/radius.css +6 -1
  425. package/src/styles/tokens/color-radius.css +40 -13
  426. package/src/styles/tokens/dark-arm.css +200 -20
  427. package/src/styles/tokens/glass-deep.css +75 -0
  428. package/src/styles/tokens/glass-fx.css +333 -0
  429. package/src/styles/tokens/glass.css +95 -315
  430. package/src/styles/tokens/light-dark.css +64 -22
  431. package/src/styles/tokens/offsets.css +116 -0
  432. package/src/styles/tokens/on-glass-fg.css +39 -0
  433. package/src/styles/tokens/property-regs.css +130 -10
  434. package/src/styles/tokens/scale-paper.css +155 -84
  435. package/src/styles/tokens/scheme-motion.css +102 -46
  436. package/src/styles/tokens/scroll-tokens.css +123 -0
  437. package/src/styles/tokens/{offsets-sizing.css → sizing.css} +88 -89
  438. package/src/styles/tokens.css +9 -3
  439. package/src/styles/transitions.css +7 -7
  440. package/src/styles/typography/scale.css +153 -0
  441. package/src/styles/typography/semantic.css +220 -0
  442. package/src/styles/typography/utilities.css +174 -0
  443. package/src/styles/typography.css +23 -507
  444. package/src/styles/utilities/a11y-overrides.css +33 -4
  445. package/src/styles/utilities/animate.css +27 -24
  446. package/src/styles/utilities/base-misc.css +255 -0
  447. package/src/styles/utilities/base.css +100 -138
  448. package/src/styles/utilities/btn.css +21 -202
  449. package/src/styles/utilities/metal.css +189 -0
  450. package/src/styles/utilities.css +14 -7
  451. package/src/styles/view-transition.css +4 -1
  452. package/dist/CardAction-Cj2eycQ2.js +0 -157
  453. package/dist/DialogContent-Dl9WkAoS.js +0 -100
  454. package/dist/Notification-DdwNxIrI.js +0 -100
  455. package/dist/NumberFieldContent-CqaN-SvN.js +0 -145
  456. package/dist/PopoverContent-BYwt2-4x.js +0 -121
  457. package/dist/TabsList-Dttss653.js +0 -105
  458. package/dist/Toaster-D6q4HtXu.js +0 -263
  459. package/dist/button-ChXMfsud.js +0 -81
  460. package/dist/check-njhk-vfu.js +0 -7
  461. package/dist/chevron-down-DKkxb4VV.js +0 -7
  462. package/dist/chevron-right-CPXbqQQz.js +0 -7
  463. package/dist/chevron-up-n_24SqI-.js +0 -7
  464. package/dist/components/custom/underline/GlassUnderline.vue.d.ts +0 -84
  465. package/dist/components/custom/underline/index.d.ts +0 -2
  466. package/dist/components/custom/underline/types.d.ts +0 -56
  467. package/dist/components/ui/carousel/CarouselDots.vue.d.ts +0 -4
  468. package/dist/createLucideIcon-DydS2qgk.js +0 -43
  469. package/dist/minimize-2-BV31Ob_h.js +0 -38
  470. package/dist/search-BSGrf2Sk.js +0 -12
  471. package/dist/sheet-1fChZjtw.js +0 -214
  472. package/dist/underline.d.ts +0 -1
  473. package/dist/underline.js +0 -85
  474. package/dist/useCanvas2D-ClrQuZtp.js +0 -96
  475. package/dist/useConfiguratorState-DAoeHVue.js +0 -287
  476. package/dist/useSpecularTracking-Bo5su68i.js +0 -32
  477. package/dist/useSpringMount-CI2jOstM.js +0 -108
  478. package/dist/vReveal-CqaCz_mC.js +0 -44
  479. package/dist/x-BUwTKe50.js +0 -10
  480. /package/dist/{CollapsibleContent-CP9qF1v4.js → CollapsibleContent-68dEXIAl.js} +0 -0
  481. /package/dist/{InstrumentChassis-UUJX0-mW.js → InstrumentChassis-Bx0F_q5g.js} +0 -0
  482. /package/dist/{Label-r3WzWrsj.js → Label-C2ejNWeC.js} +0 -0
  483. /package/dist/{ModalOverlay-DVLI2VRr.js → ModalOverlay-D1VrWyoi.js} +0 -0
  484. /package/dist/{PaperBackdrop-DIXTtVq6.js → PaperBackdrop-Vf3tlpvd.js} +0 -0
  485. /package/dist/{SelectGroup-aumMgWLs.js → SelectGroup-DwwjicPY.js} +0 -0
  486. /package/dist/{SelectSeparator-BQ_1Fcbp.js → SelectSeparator-DXswVdRz.js} +0 -0
  487. /package/dist/{Separator-0JE6LtNu.js → Separator-pKF0oA4M.js} +0 -0
  488. /package/dist/{_plugin-vue_export-helper-ok8pgSl5.js → _plugin-vue_export-helper-C1je1s0u.js} +0 -0
  489. /package/dist/{badge-UILT_3pZ.js → badge-D9XWW4GT.js} +0 -0
  490. /package/dist/{color-CUYeFbgd.js → color-DweYl7pE.js} +0 -0
  491. /package/dist/{constants-CS75AWHG.js → constants-BPOqYJAm.js} +0 -0
  492. /package/dist/{createContext-BM46COQ-.js → createContext-CpBNTRMI.js} +0 -0
  493. /package/dist/{prng-D27-B3tK.js → prng-Za0Rmgag.js} +0 -0
  494. /package/dist/{resolveCanvasColor-BBiYfp8g.js → resolveCanvasColor-CUyHr5Uu.js} +0 -0
  495. /package/dist/{springPresets--YdWTHtm.js → springPresets-CFQGQfdl.js} +0 -0
  496. /package/dist/{useIntersectionPause-Cc-H9ees.js → useIntersectionPause-Bj4sPkMh.js} +0 -0
  497. /package/dist/{useInterval-iHludrxk.js → useInterval-CvK1mL92.js} +0 -0
  498. /package/dist/{useKeyboardShortcuts-Be3w_Rwk.js → useKeyboardShortcuts-BXWXOZ-9.js} +0 -0
  499. /package/dist/{useLiquidFlex-BL0lLLN2.js → useLiquidFlex-mZPMiNXh.js} +0 -0
  500. /package/dist/{useResizeObserver-BhgdhOIj.js → useResizeObserver-Bpoi7tRE.js} +0 -0
  501. /package/dist/{useResolveTokenColor-Dvn2RZJW.js → useResolveTokenColor-vAylyR0x.js} +0 -0
  502. /package/dist/{useScrollProgress-Dlvx-L3v.js → useScrollProgress-D7bYU2RK.js} +0 -0
  503. /package/dist/{useSortable-muI29agz.js → useSortable-DHjtZSEd.js} +0 -0
  504. /package/dist/{useTextHighlight-DmRYkOBx.js → useTextHighlight-CWEi25hf.js} +0 -0
  505. /package/dist/{useTimer-Dzarvzuk.js → useTimer-BHJOKr35.js} +0 -0
  506. /package/dist/{useUserInvalidAria-B2h6jAM_.js → useUserInvalidAria-y5namzeE.js} +0 -0
  507. /package/dist/{useViewportReady-B40FK4Pa.js → useViewportReady-anbac3m6.js} +0 -0
@@ -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
+ }
@@ -0,0 +1,113 @@
1
+ /* glass/surface-axis.css — the ONE shared {glass·veil·opaque} surface-decoration
2
+ axis (BA.W-SURFACE-AXIS).
3
+
4
+ The house minted `--glass-level` (the opacity knob, AX.W54) and `--glass-tint-*`
5
+ (the legibility seam, AX.W55) as SHARED inheriting axes, but left the
6
+ {glass·veil·opaque} surface-DECORATION choice as a per-component one-off
7
+ (`<Card>` had the only true axis; `<Dialog>` a binary string; everyone else
8
+ none). This seam factors that choice ONCE — every enrolled surface composes a
9
+ base glass tier + the `[data-surface]` attribute, and these rules apply the
10
+ three-rung decoration UNIFORMLY:
11
+
12
+ glass — the resolved tier's plain glass rung (IDENTITY; no rule needed —
13
+ the bare tier paints).
14
+ veil — the borderless/rimless text-legibility plate: the `--glass-bg-quiet`
15
+ fill + blur with the box border AND rim STRIPPED (the boxed look
16
+ reads as a dividing line on a text plate). Reads `--glass-bg-quiet`
17
+ + the W55 `--glass-tint-*` seam through the SAME `--glass-*` ladder,
18
+ so `--glass-level` / the bright-bucket darken retune it in lockstep
19
+ with every glass surface — NO veil-local recipe fork.
20
+ opaque — the `--glass-level:0` solid-card escape (the `.glass-opaque` rung):
21
+ solid `--card` + `blur(0)` through the ONE level knob, the tint axis
22
+ zeroed (a solid plate has no translucent backdrop to darken-over).
23
+
24
+ NO second axis: `cartoon` stays a Card-local decoration (it is NOT a
25
+ {glass·veil·opaque} member — the shared axis is the three-rung MATERIAL
26
+ decoration; cartoon rides Card's own `surface` superset). The `Surface` union +
27
+ the `surfaceClass(surface, tier)` resolver are the TS half
28
+ (`src/components/ui/_shared/useSurfaceAxis.ts`); this file is the CSS half.
29
+
30
+ Cascade: `@layer components`, @import-ed AFTER ladder.css so the attr rules
31
+ (specificity 0-1-0, equal to the `.glass-*` classes) win by source order over
32
+ the base rung's border/box-shadow. */
33
+ @layer components {
34
+ /* ── veil — the borderless text-legibility plate ──────────────────────────
35
+ Composes the SAME deltas as the `veil-surface` @utility (cards.css), keyed
36
+ off the SAME `--glass-bg-quiet` + `--glass-tint-*` tokens (no recipe fork).
37
+ Each delta is an overridable `--veil-*` rung so a consumer re-points the
38
+ plate to any other ladder rung. */
39
+ [data-surface="veil"] {
40
+ --veil-bg: color-mix(
41
+ in oklab,
42
+ var(--glass-bg-quiet),
43
+ var(--glass-tint-source) var(--glass-tint-strength)
44
+ );
45
+ --veil-blur: var(--glass-blur-quiet);
46
+ /* The three veil deltas over a bare rung — each overridable. */
47
+ --veil-border: none;
48
+ --veil-shadow: none;
49
+ --veil-feather: none;
50
+
51
+ background: var(--veil-bg);
52
+ backdrop-filter: var(--veil-blur);
53
+ -webkit-backdrop-filter: var(--veil-blur);
54
+ border: var(--veil-border);
55
+ box-shadow: var(--veil-shadow);
56
+ /* The optional radial feather — a `mask-image` only painted when
57
+ `--veil-feather` is set to a gradient (default `none` = no mask = a
58
+ clean rectangle). `mask-image: none` is the identity. */
59
+ mask-image: var(--veil-feather);
60
+ }
61
+
62
+ /* ── opaque — the solid-card escape ───────────────────────────────────────
63
+ The level-0 endpoint of the SAME glass machinery — a solid `--card` plate
64
+ with `blur(0)`. A surface that ALSO carries a base tier keeps its glass
65
+ edge/rim/under-shadow (a solid plate with a glass edge, not a bare div).
66
+
67
+ THE SUBSTITUTION-VS-INHERITANCE TRAP (the recurring AX.W55 / dock-scale
68
+ class, live-found in the π readback): the `--glass-bg-*` tier tokens bake
69
+ `var(--glass-level)` at their `:root` DECLARATION (where level=1), so a
70
+ DESCENDANT element's `--glass-level: 0` does NOT re-resolve the `:root`-baked
71
+ `--glass-bg-floating` — the plate stayed translucent (α 0.8, NOT solid). The
72
+ `.glass-opaque` class works only when `--glass-level` is set at `:root` (the
73
+ cohesion fixture's pattern); a PER-ELEMENT opaque surface (the whole point of
74
+ `surface="opaque"`) needs the solid plate composed AT THE ELEMENT. So the
75
+ opaque rung sets the SOLID `--card` background + `blur(0)` DIRECTLY (the
76
+ level-0 endpoint resolved here, not via the baked token) — AND still flips the
77
+ `--glass-level: 0` / `--glass-tint-strength: 0%` knobs so a NESTED glass
78
+ descendant + any consumer reading the level scalar see the opaque register
79
+ coherently. The adaptive TINT axis is zeroed (a solid plate has no
80
+ translucent backdrop to darken-over — the bucket-INVARIANT contract). */
81
+ [data-surface="opaque"] {
82
+ --glass-level: 0;
83
+ --glass-tint-strength: 0%;
84
+ /* The SOLID --card plate composed at the element via the house color-mix
85
+ idiom (`--card` over transparent at 0% transparent = fully solid --card)
86
+ — functionally `var(--card)`, expressed as the cohesion-sanctioned mix
87
+ the token ladder already speaks. */
88
+ background: color-mix(in srgb, var(--card), transparent 0%);
89
+ backdrop-filter: none;
90
+ -webkit-backdrop-filter: none;
91
+ }
92
+
93
+ /* ── .paper-ink-mark — the PAPER ink-hairline MARK register ────────────────
94
+ (BA.W-SURFACE-AXIS scope 8). The 2px `--foreground` ink mark on a paper
95
+ surface — NO plate, NO blur, NO glass. This is a MARK register, NOT a
96
+ `[data-surface]` plate rung: a `[data-surface]` value DECORATES a glass
97
+ plate (fill + edge + rim); `.paper-ink-mark` is the opposite — a bare ink
98
+ hairline drawn directly on paper, the math-paper section-rail / underline-
99
+ tab vocabulary. Recorded here (the surface-decoration seam) co-located with
100
+ the plate axis but DISTINCT from it — the canon note is in CLAUDE.md.
101
+
102
+ ≥2 consumers at birth: (1) the math-paper section rail (the `border-l-[3px]`
103
+ family composes it for a VERTICAL left-edge ink rail); (2) W-TABS's re-cut
104
+ underline indicator (a HORIZONTAL 2px ink mark — W-TABS CONSUMES this seam,
105
+ a shape gap there triumvirates HERE per the DAG §5 seam rule). The register
106
+ exposes ONE knob (`--paper-ink-mark-weight`, default 2px) + the ink color;
107
+ the consumer applies the weight on whichever edge/axis it draws (a left
108
+ `border-inline-start-width` rail, a bottom `block-size` underline). */
109
+ .paper-ink-mark {
110
+ --paper-ink-mark-weight: 2px;
111
+ --paper-ink-mark-color: var(--foreground);
112
+ }
113
+ }
@@ -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
@@ -43,6 +48,17 @@
43
48
 
44
49
  /* ── Glassmorphic circular icon button ── */
45
50
 
51
+ /* BA.W-DEMO-AFFORDANCES (IG-A4) — the two size registers below are
52
+ MUTUALLY EXCLUSIVE; never stack `.glass-btn` and `.btn-pill` on one
53
+ element. `.glass-btn` is the FIXED-square icon primitive (width/height:
54
+ var(--size-icon-btn) + contain:paint) — `.btn-pill` is the CONTENT-WIDTH
55
+ text pill. Stacked, the fixed square wins and contain:paint clips the
56
+ wrapped label into a ~40px blob (the R8-17 "play button" defect). A
57
+ text-bearing `.glass-btn` collapses the same way even without `.btn-pill`.
58
+ For a play/replay affordance reach for <StoryPlayButton> (demo) or a real
59
+ <Button> with a leading Lucide glyph, never an icon-button carrying text.
60
+ Machine-locked by proof:demo-affordances (W1 — no class co-occurrence,
61
+ no text-bearing icon button). */
46
62
  .glass-btn {
47
63
  @apply flex items-center justify-center cursor-pointer;
48
64
 
@@ -72,7 +88,7 @@
72
88
  background var(--duration-fast) var(--ease-standard),
73
89
  border-color var(--duration-fast) var(--ease-standard),
74
90
  color var(--duration-fast) var(--ease-standard),
75
- scale var(--duration-normal) var(--spring-smooth);
91
+ scale var(--spring-smooth-duration) var(--spring-smooth);
76
92
  }
77
93
 
78
94
  .glass-btn:hover:not(:disabled) {
@@ -141,7 +157,7 @@
141
157
  box-shadow var(--duration-fast) var(--ease-standard),
142
158
  color var(--duration-fast) var(--ease-standard),
143
159
  opacity var(--duration-fast) var(--ease-standard),
144
- scale var(--duration-fast) var(--spring-smooth);
160
+ scale var(--spring-smooth-duration) var(--spring-smooth);
145
161
  }
146
162
 
147
163
  .btn-pill > * {
@@ -170,6 +186,96 @@
170
186
  dedup-and-keep-prefixed, which modern Chromium then drops). */
171
187
  .btn-glass {
172
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;
173
279
  }
174
280
 
175
281
  /* ── Pill input ───────────────────────────────── */
@@ -189,16 +295,21 @@
189
295
  `:focus-visible` accent ring + the `:user-invalid`/`[aria-invalid]`
190
296
  destructive ring below still win by order + specificity.
191
297
  AX.W54 — moved off the srgb `--surface-tint-15` fork onto the glass
192
- border seam (`--glass-border-floating`, the matching 15%α rung) so the
193
- pill is ONE glass model with the rest of the ladder, not a divergent
194
- tint axis. */
195
- border: 1.5px solid var(--glass-border-floating);
196
- background: var(--glass-bg-quiet);
197
- /* AX.W54 — the pill reads as REAL glass: the quiet-tier 10px blur (the
198
- same `--glass-blur-quiet` its `--glass-bg-quiet` background pairs with),
199
- not the sub-perceptual `blur(1px)` wash it carried — and the
200
- `--glass-level` knob now clarifies it in lockstep with every surface. */
201
- backdrop-filter: var(--glass-blur-quiet);
298
+ border seam so the pill is ONE glass model with the rest of the ladder.
299
+ BA.W-SURFACE-AXIS scope 7 — re-pointed onto the SHARED `--control-surface-*`
300
+ REST register so Input/Textarea/NumberField/Select/Combobox/TagsInput are
301
+ ONE material at rest (the input rung was the warmer of the two; Select rode
302
+ the `glass-wash` gray — the no-gray control-family seam). The register reads
303
+ the same `--glass-*` ladder, so `--glass-level`/the W55 bright bucket retune
304
+ the whole form family in lockstep (--control-surface-border defaults to the
305
+ `--glass-border-floating` 15%α rung, --control-surface-bg to `--glass-bg-quiet`,
306
+ --control-surface-blur to `--glass-blur-quiet`). */
307
+ border: 1.5px solid var(--control-surface-border);
308
+ background: var(--control-surface-bg);
309
+ /* The control's REAL glass blur — the shared register's quiet-tier radius
310
+ (the same `--control-surface-blur` pairs with `--control-surface-bg`); the
311
+ `--glass-level` knob clarifies it in lockstep with every surface. */
312
+ backdrop-filter: var(--control-surface-blur);
202
313
  padding: 0 calc(1rem * var(--ui-scale));
203
314
  font-size: var(--control-text);
204
315
  color: var(--foreground);
@@ -214,6 +325,24 @@
214
325
  color: var(--surface-tint-35);
215
326
  }
216
327
 
328
+ /* BA.W-SURFACE-AXIS scope 7 — the shared control REST surface class. The
329
+ NON-pill control families (the Select trigger, the TagsInput root) that do
330
+ NOT compose `.input-pill` but want the SAME resting material read this — so
331
+ the whole form band is ONE register at rest (the Select default rode the
332
+ lighter `glass-wash` gray before; this is the no-gray control-family seam).
333
+ It carries the bg/border/blur ONLY (each control owns its own height/radius/
334
+ padding/font), so a non-pill control composes `.control-surface` + its own
335
+ geometry. The hover lift brightens the fill one step toward the resting rung. */
336
+ .control-surface {
337
+ background: var(--control-surface-bg);
338
+ border: 1px solid var(--control-surface-border);
339
+ backdrop-filter: var(--control-surface-blur);
340
+ -webkit-backdrop-filter: var(--control-surface-blur);
341
+ }
342
+ .control-surface:hover:not(:disabled, [data-disabled]) {
343
+ background: var(--control-surface-bg-hover);
344
+ }
345
+
217
346
  /* AQ.W4 §W4.6 — keyboard-focus ring only. Was bare `:focus` (showed the
218
347
  accent ring on a mouse click); `:focus-visible` matches the
219
348
  `.focus-ring` / `.glass-btn` / dock-control discipline. Ordered BEFORE
@@ -255,8 +384,11 @@
255
384
  invalid field shows the destructive ring on focus too. */
256
385
  .input-pill:where(:user-invalid, .user-invalid-fallback, [aria-invalid="true"]):focus-visible {
257
386
  border-color: var(--destructive);
258
- box-shadow: 0 0 0 var(--focus-ring-width)
259
- 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);
260
392
  }
261
393
 
262
394
  /* AQ.W4 §W4.3 — `field-sizing: content` autosize (opt-in via the Textarea
@@ -291,6 +423,48 @@
291
423
  border-color: var(--surface-tint-15);
292
424
  }
293
425
 
426
+ /* ── BA.W-PAGER — the glass pager pill chassis (.glass-pager-ring) ──────────
427
+ The ONE pager-CHASSIS ring register: a `--radius-pill` glass-floating pill
428
+ (the DockRail-chip recipe — `--glass-bg-floating` + `--glass-blur-floating`
429
+ + `--glass-edge-light`/`--glass-specular` + the soft drop + the `.dark`
430
+ box-shadow arm). It encapsulates BOTH the `<PagerDots ring>` dot rail AND
431
+ the `<CarouselPager>` counter (the counter re-registers OFF the opaque
432
+ `bg-card` slab onto this — the R9/R10-5 dark-slab class dies in the same
433
+ edit). NEVER an opaque `bg-card` plate: this is the house "controls in a
434
+ glass pill" idiom, translucent (reads the substrate through it), already
435
+ dark/light-safe, already specular-rimmed (≥2-consumer-proven on the dock
436
+ rail-extend chips + the dock collapsed pill). The legibility floor over the
437
+ carousel's image content rides the SAME rebuilt registers
438
+ (W-DARK-MATERIAL/W-NO-GRAY) — no local opaque fallback. */
439
+ .glass-pager-ring {
440
+ display: inline-flex;
441
+ align-items: center;
442
+ gap: 0.375rem;
443
+ padding-inline: 0.625rem;
444
+ padding-block: 0.3125rem;
445
+ border-radius: var(--radius-pill);
446
+ background: var(--glass-bg-floating);
447
+ backdrop-filter: var(--glass-blur-floating);
448
+ -webkit-backdrop-filter: var(--glass-blur-floating);
449
+ box-shadow:
450
+ var(--glass-edge-light),
451
+ var(--glass-specular),
452
+ 0 2px 6px -2px color-mix(in srgb, var(--shadow-color) 22%, transparent);
453
+ /* §6 EASING DOCTRINE — the surface channel cross-fades on the bezier
454
+ `--ease-standard` (NEVER a spring; a surface prop on a spring is the
455
+ violation). */
456
+ transition:
457
+ background-color var(--duration-fast) var(--ease-standard),
458
+ box-shadow var(--duration-fast) var(--ease-standard),
459
+ border-color var(--duration-fast) var(--ease-standard);
460
+ }
461
+ .dark .glass-pager-ring {
462
+ box-shadow:
463
+ var(--glass-edge-light-dark),
464
+ var(--glass-specular-dark),
465
+ 0 2px 6px -2px color-mix(in srgb, var(--shadow-color) 30%, transparent);
466
+ }
467
+
294
468
  /* ── AW.W23 — chromatic edge dispersion (the polished-glass rim fringe) ──
295
469
  An opt-in `.glass-chromatic` composes the warm/cool oklab fringe OVER the
296
470
  W22 uniform rim (it does NOT replace it — the rim still rides each rung's