@mkbabb/glass-ui 4.1.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/dist/{CardAction-8whJrLWt.js → CardAction-DlVP2evz.js} +58 -54
  2. package/dist/{CommandShortcut-D3yxgHNn.js → CommandShortcut-By-VQcLO.js} +3 -3
  3. package/dist/{ConfiguratorRow-CaP7U3ZA.js → ConfiguratorRow-YMXdINHx.js} +3 -3
  4. package/dist/{ContextMenuContent-B3ZsheLV.js → ContextMenuContent-CMWn6huB.js} +1 -1
  5. package/dist/{ContextMenuSubContent-DDRID3qC.js → ContextMenuSubContent-DvwWCUc0.js} +1 -1
  6. package/dist/{DataTable-Bc9kUtu_.js → DataTable-C4tG3eIJ.js} +4 -4
  7. package/dist/DialogContent-D8U9ZfWS.js +121 -0
  8. package/dist/{DialogScrollContent-TTuovQst.js → DialogScrollContent-BMekN7gq.js} +1 -1
  9. package/dist/{FadingScroll-DLRbH5Xr.js → FadingScroll-P8B30rAD.js} +1 -1
  10. package/dist/{HoverCardContent-Bel1gdLZ.js → HoverCardContent-DAmGYglo.js} +1 -1
  11. package/dist/{HoverPopover-BcIxvyqZ.js → HoverPopover-DYpBOzzF.js} +1 -1
  12. package/dist/{IconChip-DhbdGdFQ.js → IconChip-CQa7XZYc.js} +7 -5
  13. package/dist/{IconTooltip-B0zimd2H.js → IconTooltip-_df8M3xm.js} +1 -1
  14. package/dist/{Input-Cg9DF62r.js → Input-CyU4_hIC.js} +2 -2
  15. package/dist/{MetricBadge-RHdBP72w.js → MetricBadge-DQt_dGah.js} +1 -1
  16. package/dist/{Notification-CphK7AAm.js → Notification-BlSPJhtZ.js} +1 -1
  17. package/dist/{NumberFieldContent-D8cXeyO4.js → NumberFieldContent-Z3VxGu_6.js} +3 -3
  18. package/dist/PagerDots-CYlqVFd4.js +196 -0
  19. package/dist/PaperBackdrop-DYWgrnh8.js +42 -0
  20. package/dist/{PopoverContent-DL7E6vJP.js → PopoverContent-BuKyHZSz.js} +2 -2
  21. package/dist/{Progress-CnqB7gLm.js → Progress-C9SsdwIZ.js} +1 -1
  22. package/dist/{ScrollingText-CTZbA_cG.js → ScrollingText-DY3W1Jfh.js} +2 -2
  23. package/dist/{SelectScrollDownButton-DAKCBEdW.js → SelectScrollDownButton-3mFHX_R-.js} +15 -12
  24. package/dist/{Switch-B8RscmRu.js → Switch-uf-UKPA2.js} +1 -1
  25. package/dist/{Toaster-D9qIHjBI.js → Toaster-ozrsR4mP.js} +1 -1
  26. package/dist/{ToggleGroupItem-BLtr3TJq.js → ToggleGroupItem-BpzaVzNm.js} +4 -4
  27. package/dist/{TooltipProvider-BJ_Y5EGX.js → TooltipProvider-QQVM_80r.js} +1 -1
  28. package/dist/animated-digit.js +2 -2
  29. package/dist/api/index.d.ts +1 -0
  30. package/dist/api/types-extra.d.ts +3 -1
  31. package/dist/api.js +2 -2
  32. package/dist/aurora.js +163 -131
  33. package/dist/badge-Bt14yURi.js +72 -0
  34. package/dist/badge.js +1 -1
  35. package/dist/border-progress.js +1 -1
  36. package/dist/button-D1W9PrzI.js +130 -0
  37. package/dist/button.js +1 -1
  38. package/dist/canvas.js +1 -1
  39. package/dist/card.js +1 -1
  40. package/dist/carousel.js +227 -98
  41. package/dist/chipVariants-BJQ0I2kB.js +18 -0
  42. package/dist/collapsible.js +1 -1
  43. package/dist/color.js +1 -1
  44. package/dist/command.js +1 -1
  45. package/dist/components/custom/aurora/composables/glSetup.d.ts +1 -1
  46. package/dist/components/custom/aurora/composables/uniformBridgeWGPU.d.ts +1 -1
  47. package/dist/components/custom/aurora/constants/presets.d.ts +29 -0
  48. package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +1 -1
  49. package/dist/components/custom/aurora/index.d.ts +1 -1
  50. package/dist/components/custom/concentric/Concentric.vue.d.ts +15 -12
  51. package/dist/components/custom/concentric/composables/concentricGLSetup.d.ts +8 -3
  52. package/dist/components/custom/concentric/composables/concentricWGPUSetup.d.ts +8 -4
  53. package/dist/components/custom/concentric/composables/levelField.d.ts +50 -0
  54. package/dist/components/custom/concentric/composables/uniformBridgeWGPU.d.ts +7 -4
  55. package/dist/components/custom/concentric/composables/useConcentric.d.ts +3 -3
  56. package/dist/components/custom/concentric/constants.d.ts +62 -41
  57. package/dist/components/custom/concentric/index.d.ts +2 -2
  58. package/dist/components/custom/concentric/shaders/concentric.glsl.d.ts +2 -2
  59. package/dist/components/custom/concentric/shaders/concentric.wgsl.d.ts +1 -1
  60. package/dist/components/custom/configurator/Configurator.vue.d.ts +23 -2
  61. package/dist/components/custom/configurator/index.d.ts +1 -1
  62. package/dist/components/custom/dock/DockDropdownTrigger.vue.d.ts +4 -3
  63. package/dist/components/custom/dock/DockIconButton.vue.d.ts +10 -0
  64. package/dist/components/custom/dock/DockPopoverTrigger.vue.d.ts +19 -0
  65. package/dist/components/custom/dock/DockStack.vue.d.ts +35 -22
  66. package/dist/components/custom/dock/GlassDock.vue.d.ts +19 -3
  67. package/dist/components/custom/dock/composables/dockMorphContext.d.ts +18 -32
  68. package/dist/components/custom/dock/composables/dockMorphMeasure.d.ts +76 -145
  69. package/dist/components/custom/dock/composables/index.d.ts +1 -0
  70. package/dist/components/custom/dock/composables/railProjection.d.ts +45 -0
  71. package/dist/components/custom/dock/composables/useDockContextSilhouette.d.ts +192 -0
  72. package/dist/components/custom/dock/composables/useDockFission.d.ts +158 -0
  73. package/dist/components/custom/dock/composables/useDockItemDrag.d.ts +18 -0
  74. package/dist/components/custom/dock/composables/useDockShellProps.d.ts +38 -0
  75. package/dist/components/custom/dock/constants.d.ts +14 -3
  76. package/dist/components/custom/dock/index.d.ts +3 -0
  77. package/dist/components/custom/dot-flow-field/composables/flowField.d.ts +21 -0
  78. package/dist/components/custom/dot-flow-field/composables/flowGLProgram.d.ts +8 -0
  79. package/dist/components/custom/dot-flow-field/composables/flowSetupGL.d.ts +9 -0
  80. package/dist/components/custom/dot-flow-field/composables/flowSetupGLFlow.d.ts +12 -0
  81. package/dist/components/custom/dot-flow-field/composables/flowSetupWGPU.d.ts +7 -0
  82. package/dist/components/custom/dot-flow-field/composables/uniformBridgeWGPU.d.ts +28 -2
  83. package/dist/components/custom/dot-flow-field/composables/useFlowParticles.d.ts +18 -17
  84. package/dist/components/custom/dot-flow-field/constants.d.ts +51 -0
  85. package/dist/components/custom/dot-flow-field/index.d.ts +1 -1
  86. package/dist/components/custom/dot-flow-field/shaders/flow-field.compute.wgsl.d.ts +1 -1
  87. package/dist/components/custom/dot-flow-field/shaders/flow-field.glsl.d.ts +29 -0
  88. package/dist/components/custom/dot-flow-field/shaders/flow-field.render.wgsl.d.ts +2 -1
  89. package/dist/components/custom/dot-matrix/composables/uniformBridgeWGPU.d.ts +10 -1
  90. package/dist/components/custom/dot-matrix/composables/useDotSphere.d.ts +7 -0
  91. package/dist/components/custom/dot-matrix/constants.d.ts +14 -0
  92. package/dist/components/custom/dot-matrix/index.d.ts +1 -1
  93. package/dist/components/custom/dot-matrix/shaders/dot-matrix.glsl.d.ts +2 -2
  94. package/dist/components/custom/dot-matrix/shaders/dot-matrix.wgsl.d.ts +1 -1
  95. package/dist/components/custom/fourier-field/FourierField.vue.d.ts +4 -0
  96. package/dist/components/custom/fourier-field/composables/fourierFieldGLSetup.d.ts +9 -0
  97. package/dist/components/custom/fourier-field/composables/fourierFieldWGPUSetup.d.ts +11 -0
  98. package/dist/components/custom/fourier-field/composables/uniformBridgeWGPU.d.ts +16 -1
  99. package/dist/components/custom/fourier-field/composables/useFourierField.d.ts +22 -1
  100. package/dist/components/custom/fourier-field/constants.d.ts +53 -0
  101. package/dist/components/custom/fourier-field/shaders/fourier-field.glsl.d.ts +1 -1
  102. package/dist/components/custom/fourier-field/shaders/fourier-field.render.wgsl.d.ts +1 -1
  103. package/dist/components/custom/goo-blob/composables/easing.d.ts +1 -0
  104. package/dist/components/custom/goo-blob/composables/useBlobSatellites.d.ts +1 -0
  105. package/dist/components/custom/goo-blob/constants.d.ts +26 -1
  106. package/dist/components/custom/goo-blob/shaders/metaball-uniforms.glsl.d.ts +1 -1
  107. package/dist/components/custom/goo-blob/shaders/metaball.wgsl.d.ts +1 -1
  108. package/dist/components/custom/goo-blob/types.d.ts +50 -1
  109. package/dist/components/custom/goo-dot-matrix/composables/gooDotSetup.d.ts +32 -3
  110. package/dist/components/custom/goo-dot-matrix/composables/uniformBridgeWGPU.d.ts +14 -4
  111. package/dist/components/custom/goo-dot-matrix/constants.d.ts +55 -16
  112. package/dist/components/custom/goo-dot-matrix/index.d.ts +1 -1
  113. package/dist/components/custom/goo-dot-matrix/shaders/goo-dot.frag.d.ts +2 -0
  114. package/dist/components/custom/goo-dot-matrix/shaders/goo-dot.wgsl.d.ts +1 -0
  115. package/dist/components/custom/goo-filter/GooFilter.vue.d.ts +22 -0
  116. package/dist/components/custom/goo-filter/index.d.ts +1 -0
  117. package/dist/components/custom/handmark/brush.d.ts +17 -17
  118. package/dist/components/custom/handmark/constants.d.ts +28 -8
  119. package/dist/components/custom/handmark/geometry.d.ts +34 -1
  120. package/dist/components/custom/handmark/index.d.ts +1 -1
  121. package/dist/components/custom/icon-chip/types.d.ts +10 -0
  122. package/dist/components/custom/paper-backdrop/PaperBackdrop.vue.d.ts +18 -0
  123. package/dist/components/custom/paper-grid/composables/paperGrid.d.ts +44 -29
  124. package/dist/components/custom/paper-grid/composables/paperGridGLSetup.d.ts +2 -0
  125. package/dist/components/custom/paper-grid/composables/paperGridWGPUSetup.d.ts +3 -1
  126. package/dist/components/custom/paper-grid/composables/uniformBridgeWGPU.d.ts +2 -2
  127. package/dist/components/custom/paper-grid/constants.d.ts +44 -6
  128. package/dist/components/custom/paper-grid/index.d.ts +2 -2
  129. package/dist/components/custom/paper-grid/shaders/paper-grid.glsl.d.ts +1 -1
  130. package/dist/components/custom/paper-grid/shaders/paper-grid.wgsl.d.ts +1 -1
  131. package/dist/components/custom/selectable-chip/chipVariants.d.ts +39 -0
  132. package/dist/components/custom/selectable-chip/selectableChipVariants.d.ts +12 -20
  133. package/dist/components/custom/tabs/constants.d.ts +16 -8
  134. package/dist/components/custom/timeline/ScrubberTimeline.vue.d.ts +16 -0
  135. package/dist/components/custom/timeline/geometry.d.ts +0 -8
  136. package/dist/components/custom/toggle-chip/index.d.ts +15 -4
  137. package/dist/components/custom/watercolor-dot/WatercolorDot.vue.d.ts +12 -10
  138. package/dist/components/ui/_shared/useSurfaceAxis.d.ts +17 -3
  139. package/dist/components/ui/badge/Badge.vue.d.ts +14 -0
  140. package/dist/components/ui/badge/index.d.ts +1 -0
  141. package/dist/components/ui/button/Button.vue.d.ts +1 -0
  142. package/dist/components/ui/card/Card.vue.d.ts +1 -1
  143. package/dist/components/ui/card/ScrollCard.vue.d.ts +1 -1
  144. package/dist/components/ui/carousel/CarouselContent.vue.d.ts +2 -4
  145. package/dist/components/ui/dialog/DialogContent.vue.d.ts +9 -0
  146. package/dist/components/ui/drawer/Drawer.vue.d.ts +33 -14
  147. package/dist/components/ui/drawer/constants.d.ts +8 -6
  148. package/dist/components/ui/drawer/index.d.ts +12 -2
  149. package/dist/components/ui/select/SelectContent.vue.d.ts +9 -0
  150. package/dist/components/ui/slider/Slider.vue.d.ts +9 -0
  151. package/dist/composables/dom/index.d.ts +1 -0
  152. package/dist/composables/dom/useDragVelocity.d.ts +46 -0
  153. package/dist/composables/glass/wave/index.d.ts +4 -0
  154. package/dist/composables/glass/wave/waveField.d.ts +115 -0
  155. package/dist/composables/glass/wave/waveField.glsl.d.ts +1 -0
  156. package/dist/composables/glass/wave/waveField.wgsl.d.ts +1 -0
  157. package/dist/composables/glass/webgl/createCanvasLifecycle.d.ts +95 -2
  158. package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +40 -2
  159. package/dist/composables/glass/webgpu/index.d.ts +1 -0
  160. package/dist/composables/glass/webgpu/useGpuSubstrate.d.ts +37 -0
  161. package/dist/composables/glass/webgpu/useWebGPUCanvas.d.ts +49 -2
  162. package/dist/composables/glass/webgpu/webgpuDevice.d.ts +1 -1
  163. package/dist/composables/motion/core/index.d.ts +4 -0
  164. package/dist/composables/motion/core/useHaptic.d.ts +48 -0
  165. package/dist/composables/motion/core/writeVelocityWeight.d.ts +31 -0
  166. package/dist/composables/motion/index.d.ts +2 -0
  167. package/dist/composables/motion/springPresets.d.ts +16 -17
  168. package/dist/composables/motion/suite.d.ts +2 -2
  169. package/dist/composables/motion/useBloomUp.d.ts +97 -0
  170. package/dist/composables/motion/useCelebrationBurst.d.ts +50 -0
  171. package/dist/composables/motion/useDockCtaReceive.d.ts +10 -28
  172. package/dist/composables/motion/useGooMorph.d.ts +72 -0
  173. package/dist/composables/motion/useLiquidFlex.d.ts +18 -0
  174. package/dist/composables/motion/useLiquidMorph.d.ts +108 -0
  175. package/dist/composables/motion/useLiquidPress.d.ts +12 -0
  176. package/dist/composables/motion/useLiquidReveal.d.ts +7 -4
  177. package/dist/composables/motion/useMorphField.d.ts +157 -0
  178. package/dist/composables/motion/useScrollPin.d.ts +49 -0
  179. package/dist/composables/motion/useScrollScene.d.ts +67 -0
  180. package/dist/concentric.js +532 -563
  181. package/dist/configurator.js +2 -2
  182. package/dist/confirm-dialog.js +3 -3
  183. package/dist/constellation.js +4 -4
  184. package/dist/context-menu.js +2 -2
  185. package/dist/controls.js +2 -2
  186. package/dist/createCanvasLifecycle-CuCrGRfq.js +173 -0
  187. package/dist/dark.js +1 -1
  188. package/dist/data-table.js +1 -1
  189. package/dist/deck.js +1 -1
  190. package/dist/dialog.js +3 -3
  191. package/dist/dock.js +1163 -618
  192. package/dist/dockContext-gFVS2gMg.js +18 -0
  193. package/dist/dom.js +7 -6
  194. package/dist/dot-flow-field.js +1114 -523
  195. package/dist/dot-matrix.js +348 -204
  196. package/dist/drawer.js +106 -96
  197. package/dist/{dropdown-menu-aJmV5SqE.js → dropdown-menu-CCfcCQ68.js} +3 -3
  198. package/dist/dropdown-menu.js +1 -1
  199. package/dist/easing.js +3 -3
  200. package/dist/expandable-container.js +2 -2
  201. package/dist/fading-scroll.js +1 -1
  202. package/dist/forms.js +6 -6
  203. package/dist/fourier-field.js +441 -197
  204. package/dist/fourier-math.js +1 -1
  205. package/dist/glass-panel.js +2 -2
  206. package/dist/glass-ui.css +1 -1
  207. package/dist/glass-ui.js +139 -135
  208. package/dist/goo-blob.js +11 -9
  209. package/dist/goo-dot-matrix.js +418 -198
  210. package/dist/handmark.js +137 -94
  211. package/dist/header-ribbon.js +1 -1
  212. package/dist/hover-card.js +1 -1
  213. package/dist/hover-popover.js +1 -1
  214. package/dist/icon-chip.js +1 -1
  215. package/dist/icon-tooltip.js +1 -1
  216. package/dist/index.d.ts +3 -0
  217. package/dist/instrument-chassis.js +1 -1
  218. package/dist/keyboard.js +1 -1
  219. package/dist/label.js +1 -1
  220. package/dist/labeled-field.js +7 -7
  221. package/dist/metric-badge.js +1 -1
  222. package/dist/metric-cell.js +1 -1
  223. package/dist/metric-stack.js +1 -1
  224. package/dist/motion-core.js +42 -39
  225. package/dist/motion-curves.js +20 -14
  226. package/dist/motion.js +226 -26
  227. package/dist/notification.js +1 -1
  228. package/dist/number-field.js +1 -1
  229. package/dist/pager-dots.js +1 -1
  230. package/dist/paper-backdrop.js +1 -1
  231. package/dist/paper-grid.js +315 -342
  232. package/dist/paperGrid-CXCSMbZ1.js +191 -0
  233. package/dist/popover.js +1 -1
  234. package/dist/{presets-CvOUqtdY.js → presets-QvYgnFIZ.js} +13 -12
  235. package/dist/progress.js +1 -1
  236. package/dist/pulse.js +1 -1
  237. package/dist/reactive.js +2 -2
  238. package/dist/{resolveCanvasColor-yPyIpJt9.js → resolveCanvasColor-DsSJk06I.js} +5 -5
  239. package/dist/scrolling-text.js +1 -1
  240. package/dist/search.js +7 -7
  241. package/dist/select.js +3 -3
  242. package/dist/selectable-chip.js +18 -35
  243. package/dist/separator.js +1 -1
  244. package/dist/{sheet-B2flBfLH.js → sheet-DUCIoOe0.js} +3 -3
  245. package/dist/sheet.js +1 -1
  246. package/dist/sidebar.js +1 -1
  247. package/dist/slider-CcICPe3u.js +149 -0
  248. package/dist/slider.js +1 -1
  249. package/dist/sortable-list.js +3 -3
  250. package/dist/{spectrum-walk-BVzA7Biz.js → spectrum-walk-cBNSx_zm.js} +1 -1
  251. package/dist/springPresets-DfoQ6XRY.js +64 -0
  252. package/dist/stacked-icons.js +54 -39
  253. package/dist/styles/cards.css +202 -2
  254. package/dist/styles/components.css +1 -3
  255. package/dist/styles/configurator.css +172 -7
  256. package/dist/styles/critical-partition.mjs +35 -2
  257. package/dist/styles/deferred.css +2 -0
  258. package/dist/styles/dock/adaptive-legibility.css +119 -0
  259. package/dist/styles/dock/density.css +18 -10
  260. package/dist/styles/dock/fission-bridge.css +552 -0
  261. package/dist/styles/dock/layers.css +88 -124
  262. package/dist/styles/dock/morph-bridge.css +15 -2
  263. package/dist/styles/dock/morph.css +45 -114
  264. package/dist/styles/dock/shape.css +137 -11
  265. package/dist/styles/dock/shell.css +1 -3
  266. package/dist/styles/dock/stack-rail.css +95 -7
  267. package/dist/styles/dock-controls/icon-button.css +34 -2
  268. package/dist/styles/dock-controls/triggers.css +23 -1
  269. package/dist/styles/dock-controls.css +18 -0
  270. package/dist/styles/dock.css +16 -1
  271. package/dist/styles/drawer.css +166 -0
  272. package/dist/styles/glass/glass-atom.css +244 -0
  273. package/dist/styles/glass/glass-capsule.css +143 -0
  274. package/dist/styles/glass/glass-chip.css +215 -0
  275. package/dist/styles/glass/liquid-enter.css +252 -0
  276. package/dist/styles/glass/liquid-morph.css +850 -0
  277. package/dist/styles/glass/material.css +70 -1
  278. package/dist/styles/glass/reveal.css +22 -2
  279. package/dist/styles/glass/rim.css +13 -1
  280. package/dist/styles/glass/surfaces.css +18 -8
  281. package/dist/styles/glass.css +11 -0
  282. package/dist/styles/icon-chip.css +45 -0
  283. package/dist/styles/index.css +11 -0
  284. package/dist/styles/jubilance.css +65 -0
  285. package/dist/styles/motion/morph-field.css +229 -0
  286. package/dist/styles/paper.css +230 -14
  287. package/dist/styles/scroll-choreography.css +135 -78
  288. package/dist/styles/segmented-tabs.css +85 -51
  289. package/dist/styles/select.css +151 -0
  290. package/dist/styles/tokens/color-radius.css +1 -1
  291. package/dist/styles/tokens/dark-arm.css +57 -8
  292. package/dist/styles/tokens/glass-deep.css +8 -4
  293. package/dist/styles/tokens/glass-fx.css +80 -2
  294. package/dist/styles/tokens/glass.css +140 -8
  295. package/dist/styles/tokens/light-dark.css +2 -2
  296. package/dist/styles/tokens/property-regs.css +144 -0
  297. package/dist/styles/tokens/scale-paper.css +20 -8
  298. package/dist/styles/tokens/scheme-motion.css +92 -157
  299. package/dist/styles/tokens/scheme-spring.css +239 -0
  300. package/dist/styles/tokens/scroll-tokens.css +15 -15
  301. package/dist/styles/tokens/shadow.css +73 -13
  302. package/dist/styles/tokens.css +9 -2
  303. package/dist/styles/utilities/btn.css +70 -0
  304. package/dist/switch.js +1 -1
  305. package/dist/tabs.js +198 -181
  306. package/dist/timeline.js +241 -206
  307. package/dist/toast.js +1 -1
  308. package/dist/toggle-chip.js +14 -41
  309. package/dist/toggle-group.js +1 -1
  310. package/dist/tooltip.js +1 -1
  311. package/dist/typewriter.js +1 -1
  312. package/dist/{uniformBridgeWGPU-CtAKl45L.js → uniformBridgeWGPU-BCse1SHU.js} +191 -127
  313. package/dist/{useAnimatedNumber-CLrxicG9.js → useAnimatedNumber-BntskVdQ.js} +1 -1
  314. package/dist/{useConfiguratorState-4xblKfwd.js → useConfiguratorState-22BcULzF.js} +37 -35
  315. package/dist/useDockCtaReceive-DX7RDb6_.js +88 -0
  316. package/dist/{useDragMorph-BUgAC-zK.js → useDragMorph-DGLSewwB.js} +2 -2
  317. package/dist/useDragVelocity-CjcfX3dA.js +57 -0
  318. package/dist/useGooMorph-Cs13NgYL.js +104 -0
  319. package/dist/useGpuSubstrate-Ceet70xq.js +347 -0
  320. package/dist/{useViewTransition-CUI1nAgn.js → useHaptic-CPz5BT9I.js} +40 -1
  321. package/dist/{useLiquidFlex-UmA6LMZu.js → useLiquidFlex-Cc6PjVJD.js} +8 -3
  322. package/dist/useLiquidPress-CtOQ8Z0_.js +43 -0
  323. package/dist/useMorphField-ogBM7ubT.js +141 -0
  324. package/dist/{useScrollChrome-D66AVP7C.js → useScrollChrome-JuImi1DM.js} +2 -2
  325. package/dist/{useSpringMount-BWDnKIwh.js → useSpringMount-DFxtzmkR.js} +1 -1
  326. package/dist/{useSpringPress-B1-Czp-V.js → useSpringPress-VM9RgVq3.js} +1 -1
  327. package/dist/{useSurfaceAxis-g0NloYEF.js → useSurfaceAxis-Ci7Dnaw2.js} +1 -1
  328. package/dist/{useTouchGate-CBZTD4SD.js → useTouchGate-B1Lf9XqN.js} +1 -1
  329. package/dist/virtual.js +1 -1
  330. package/dist/watercolor-dot.js +16 -26
  331. package/dist/writeVelocityWeight-Bh83xZfs.js +19 -0
  332. package/package.json +14 -3
  333. package/src/styles/cards.css +202 -2
  334. package/src/styles/configurator.css +172 -7
  335. package/src/styles/critical-partition.mjs +35 -2
  336. package/src/styles/dock/adaptive-legibility.css +119 -0
  337. package/src/styles/dock/density.css +18 -10
  338. package/src/styles/dock/fission-bridge.css +552 -0
  339. package/src/styles/dock/layers.css +88 -124
  340. package/src/styles/dock/morph-bridge.css +15 -2
  341. package/src/styles/dock/morph.css +45 -114
  342. package/src/styles/dock/shape.css +137 -11
  343. package/src/styles/dock/shell.css +1 -3
  344. package/src/styles/dock/stack-rail.css +95 -7
  345. package/src/styles/dock-controls/icon-button.css +34 -2
  346. package/src/styles/dock-controls/triggers.css +23 -1
  347. package/src/styles/dock-controls.css +18 -0
  348. package/src/styles/dock.css +16 -1
  349. package/src/styles/drawer.css +164 -0
  350. package/src/styles/glass/glass-atom.css +244 -0
  351. package/src/styles/glass/glass-capsule.css +143 -0
  352. package/src/styles/glass/glass-chip.css +215 -0
  353. package/src/styles/glass/liquid-enter.css +252 -0
  354. package/src/styles/glass/liquid-morph.css +850 -0
  355. package/src/styles/glass/material.css +70 -1
  356. package/src/styles/glass/reveal.css +22 -2
  357. package/src/styles/glass/rim.css +13 -1
  358. package/src/styles/glass/surfaces.css +18 -8
  359. package/src/styles/glass.css +11 -0
  360. package/src/styles/icon-chip.css +45 -0
  361. package/src/styles/index.css +11 -0
  362. package/src/styles/jubilance.css +65 -0
  363. package/src/styles/motion/morph-field.css +229 -0
  364. package/src/styles/paper.css +230 -14
  365. package/src/styles/scroll-choreography.css +135 -78
  366. package/src/styles/segmented-tabs.css +85 -47
  367. package/src/styles/select.css +151 -0
  368. package/src/styles/tokens/color-radius.css +1 -1
  369. package/src/styles/tokens/dark-arm.css +57 -8
  370. package/src/styles/tokens/glass-deep.css +8 -4
  371. package/src/styles/tokens/glass-fx.css +80 -2
  372. package/src/styles/tokens/glass.css +140 -8
  373. package/src/styles/tokens/light-dark.css +2 -2
  374. package/src/styles/tokens/property-regs.css +144 -0
  375. package/src/styles/tokens/scale-paper.css +20 -8
  376. package/src/styles/tokens/scheme-motion.css +92 -157
  377. package/src/styles/tokens/scheme-spring.css +239 -0
  378. package/src/styles/tokens/scroll-tokens.css +15 -15
  379. package/src/styles/tokens/shadow.css +73 -13
  380. package/src/styles/tokens.css +9 -2
  381. package/src/styles/utilities/btn.css +70 -0
  382. package/dist/DialogContent-6JtTB5x2.js +0 -106
  383. package/dist/PagerDots-Cjx96la-.js +0 -98
  384. package/dist/PaperBackdrop-CqwjnfLv.js +0 -31
  385. package/dist/badge-D9XWW4GT.js +0 -53
  386. package/dist/button-5dY1Dvhd.js +0 -125
  387. package/dist/components/custom/concentric/composables/ringField.d.ts +0 -85
  388. package/dist/createCanvasLifecycle-Gh45Ce-p.js +0 -93
  389. package/dist/dockContext-BNfyPLe9.js +0 -17
  390. package/dist/slider-2A0rPn79.js +0 -142
  391. package/dist/springPresets-Ce7OYCm9.js +0 -46
  392. package/dist/useDockCtaReceive-DfFkmgL1.js +0 -82
  393. package/dist/useGpuSubstrate-4pTcp6mX.js +0 -294
  394. package/dist/useLiquidPress-BooG97RY.js +0 -39
  395. /package/dist/{CollapsibleContent-68dEXIAl.js → CollapsibleContent-D7UNsXQr.js} +0 -0
  396. /package/dist/{DialogFooter-9phqcRIS.js → DialogFooter-DoLy0ewI.js} +0 -0
  397. /package/dist/{InstrumentChassis-CxsHSyMj.js → InstrumentChassis-UUJX0-mW.js} +0 -0
  398. /package/dist/{Label-C2ejNWeC.js → Label-B_HPqi_q.js} +0 -0
  399. /package/dist/{ModalOverlay-D1VrWyoi.js → ModalOverlay-DfAf7o15.js} +0 -0
  400. /package/dist/{SelectGroup-BFiod7X2.js → SelectGroup-Dcczq44n.js} +0 -0
  401. /package/dist/{SelectSeparator-C2UGOkXF.js → SelectSeparator-CNRGG7Ew.js} +0 -0
  402. /package/dist/{Separator-DQcwC2TR.js → Separator-Cf9-JFgi.js} +0 -0
  403. /package/dist/{_plugin-vue_export-helper-C1je1s0u.js → _plugin-vue_export-helper-gLzyemvl.js} +0 -0
  404. /package/dist/{color-Cs0-oxYL.js → color-B9jZdhJX.js} +0 -0
  405. /package/dist/{compile-nZ1xVYTp.js → compile-INR_tPk_.js} +0 -0
  406. /package/dist/{constants--C2DkLW8.js → constants-BWj7DkMn.js} +0 -0
  407. /package/dist/{createContext-CpBNTRMI.js → createContext-Cd23P9j0.js} +0 -0
  408. /package/dist/{dotMatrixField-D_x9_1qq.js → dotMatrixField-CRO0ZFk4.js} +0 -0
  409. /package/dist/{flow.glsl-B2P7e0MT.js → flow.glsl-DqEGRpl4.js} +0 -0
  410. /package/dist/{math-Eb0w3LqU.js → math-5RcIgCB4.js} +0 -0
  411. /package/dist/{menuItemVariants-D8VNHq22.js → menuItemVariants-DAXquKja.js} +0 -0
  412. /package/dist/{prng-B-d9eYX8.js → prng-B5tIXTtj.js} +0 -0
  413. /package/dist/{procedural-color.wgsl-m7Zgv35j.js → procedural-color.wgsl-C1Y5PkM6.js} +0 -0
  414. /package/dist/{scrollReader-DI1NWxUw.js → scrollReader-rc3Ns_NM.js} +0 -0
  415. /package/dist/{useControlSize-SH1UmJCi.js → useControlSize-DAZ062x7.js} +0 -0
  416. /package/dist/{useFuzzySearch-DIhcYtcw.js → useFuzzySearch-0fTYOhS4.js} +0 -0
  417. /package/dist/{useGlobalDark-CmjB9E32.js → useGlobalDark-B4HO9LXG.js} +0 -0
  418. /package/dist/{useIntersectionPause-Dbozzjgm.js → useIntersectionPause-DO8Vl4gs.js} +0 -0
  419. /package/dist/{useInterval-CNdua40W.js → useInterval-BVUI-sez.js} +0 -0
  420. /package/dist/{useKeyboardShortcuts-BPRp33Im.js → useKeyboardShortcuts-BEut54Tk.js} +0 -0
  421. /package/dist/{usePointerVelocityField-QLsy3_kv.js → usePointerVelocityField-BrkqZFhj.js} +0 -0
  422. /package/dist/{useResizeObserver-Bpoi7tRE.js → useResizeObserver-DdEn3v2f.js} +0 -0
  423. /package/dist/{useResolveTokenColor-vAylyR0x.js → useResolveTokenColor-ChOnCckA.js} +0 -0
  424. /package/dist/{useScrollProgress-c3yxmH6a.js → useScrollProgress-A0M6qRl7.js} +0 -0
  425. /package/dist/{useSortable-BVqlJRBR.js → useSortable-DQV_UNDw.js} +0 -0
  426. /package/dist/{useTextHighlight-NmBM5V_4.js → useTextHighlight-Bma3UlKA.js} +0 -0
  427. /package/dist/{useTimer-BHJOKr35.js → useTimer-BBLGPXR8.js} +0 -0
  428. /package/dist/{useUserInvalidAria-y5namzeE.js → useUserInvalidAria-EmmwWPOl.js} +0 -0
  429. /package/dist/{useViewportReady-anbac3m6.js → useViewportReady-C9pYnn7K.js} +0 -0
  430. /package/dist/{vReveal-D9k0jADx.js → vReveal-CT1KtwZA.js} +0 -0
@@ -26,6 +26,46 @@
26
26
  initial-value: 1;
27
27
  }
28
28
 
29
+ /* BD.W-OVERLAY-STAGE-COUPLE — `--stage-t`, the ONE registered STAGING scalar (0 =
30
+ * closed/un-staged → 1 = fully staged). The whole modal band rides this ONE knob:
31
+ * the drawer's surface FREEZE (A), the scrim DEEPEN (B), the page RECEDE+SCALE (C),
32
+ * the opt-in blur ENGAGE (D) are all pure `calc()` reads OF it. `inherits: true` so
33
+ * a single writer at `:root` reaches the portaled scrim AND the page-wrapper sibling
34
+ * AND the sheet descendants from ONE write (the scrim is NOT a descendant of the
35
+ * content, so a content-local mirror could never reach it — the `:root` write is the
36
+ * cross-subtree path).
37
+ *
38
+ * THE SINGLE WRITER (fold C1·R2 — no dual scalar desync). `useDrawerSnap.writeScalar`
39
+ * writes BOTH `--glass-drawer-t` (the sheet's per-element translate) AND `--stage-t`
40
+ * (the scene scalar at `:root`) in the SAME call — atomically, never separately, so
41
+ * the two can never desync on a drag-cancel / fling-overshoot / interrupted snap. A
42
+ * plain modal (Dialog/Command) flips `--stage-t` 0→1 on `--spring-snappy` at open;
43
+ * the close-write removes the inline value so the registered property reverts to its
44
+ * `initial-value: 0` (the stale-latch fix). `initial-value: 0` so an un-staged page never
45
+ * recedes. EVERY consumer `clamp(0, …, 1)`-bounds it (a `--ease-cartoon-punch` fling
46
+ * can overshoot >1 — the page-scale / radius / scrim must not run past their
47
+ * endpoints). */
48
+ @property --stage-t {
49
+ syntax: "<number>";
50
+ inherits: true;
51
+ initial-value: 0;
52
+ }
53
+
54
+ /* The stage-t transition + close-write reset (the registered-property stale-latch
55
+ * fix, fold C3·R7).
56
+ *
57
+ * The drawer's single writer (useDrawerSnap) drives `--stage-t` per frame and
58
+ * REMOVES the inline value on close → the registered property reverts to its
59
+ * `initial-value: 0`. The centered modal (DialogContent) flips it 0→1 on open via the
60
+ * `data-stage-flip` marker on `:root`; this rule owns the FLIP TRANSITION (a snappy
61
+ * spring) so the dialog's `:root --stage-t` value glides 0→1 rather than snapping — a
62
+ * CSS-owned transition, NOT an inline `transition` shorthand on `:root` (which would
63
+ * clobber unrelated root transitions). On close the marker is dropped and the inline
64
+ * value removed → the property reverts to 0 (no stale full-staged latch on re-open). */
65
+ :root[data-stage-flip] {
66
+ transition: --stage-t var(--spring-snappy-duration, 0.4s) var(--spring-snappy, ease);
67
+ }
68
+
29
69
  :root {
30
70
  /* Detent grammar knobs — overridable per-consumer */
31
71
  --drawer-handle-w: 2.25rem;
@@ -131,6 +171,80 @@
131
171
  margin-top: 0;
132
172
  }
133
173
 
174
+ /*
175
+ * BD.W-OVERLAY-STAGE-COUPLE — coupling (A): the surface FREEZE, composed AT THE
176
+ * ELEMENT. A detented sheet is SEE-THROUGH at peek/half (the page bleeds) and
177
+ * SOLIDIFIES toward a warm-tinted card at full (page does not bleed, blur → 0). This
178
+ * is the iOS-27 bottom-sheet crown the live α-0.95-at-every-detent flattened.
179
+ *
180
+ * A TWO-SEGMENT lerp on the ONE `--stage-t` knob (the self-standing crown — the wave
181
+ * owns BOTH endpoints so it does not block on BE.W-SHEET-TRANSLUCENT, fold C3·R1):
182
+ * • DESCENT t ∈ [0, 0.85] — the transmissive crown sinks `--glass-bg-overlay` α
183
+ * toward the shipped see-through `--glass-bg-sheet` floor (`--glass-opacity-sheet:
184
+ * 0.74`). At peek/half the page bleeds through.
185
+ * • SOLIDIFY t ∈ [0.85, 1] — `--sheet-freeze` lerps the descended plate toward a
186
+ * WARM-TINTED card-mix (NOT bare `--card` — the gray-at-full carve hole, fold
187
+ * C1·R4); `backdrop-filter` blur decays to 0 (a solid plate has no backdrop to
188
+ * bend — a Safari win, no wasted sample behind an opaque plate).
189
+ *
190
+ * Composed AT THE ELEMENT (the `[data-surface=opaque]` substitution-safe path) via
191
+ * element-level `color-mix` — NEVER an ancestor `filter` (which would clobber the
192
+ * sheet's own backdrop-filter, the dock-hub goo-tear lesson, §7). `--stage-t` reads
193
+ * the `:root` scalar the single writer drives (mirrored from `--glass-drawer-t`).
194
+ */
195
+ .glass-drawer[data-glass-drawer-snap-points="true"] {
196
+ /* the DESCENT fraction — 0 at closed → 1 at the commit floor (t=0.85). */
197
+ --sheet-descent: clamp(0, calc(var(--stage-t) / 0.85), 1);
198
+ /* the SOLIDIFY fraction — 0 below the commit floor → 1 at full (t=1). */
199
+ --sheet-freeze: clamp(0, calc((var(--stage-t) - 0.85) / 0.15), 1);
200
+ /* the transmissive crown plate: the warm overlay fill sunk toward the shipped
201
+ see-through `--glass-bg-sheet` floor across the descent. */
202
+ --sheet-crown: color-mix(
203
+ in oklab,
204
+ color-mix(
205
+ in oklab,
206
+ var(--glass-bg-overlay),
207
+ var(--glass-tint-source) var(--glass-tint-strength)
208
+ ),
209
+ var(--glass-bg-sheet) calc(var(--sheet-descent) * 100%)
210
+ );
211
+ /* the warm-tinted SOLID escape (fold C1·R4 — a warm card-mix toward the EXPLICIT
212
+ warm `--glass-capsule-warm` amber, NEVER bare `--card` and NEVER the
213
+ `--glass-tint-source` alias which resolves back to `--card` and would be a
214
+ no-op warm; build-trap-(d) safe — a warm oklch color, never bare `transparent`).
215
+ At the shared 16% warm floor a dark full sheet stays C ≥ 0.02 warm — no
216
+ charcoal holiday at full. */
217
+ --sheet-solid: color-mix(
218
+ in oklab,
219
+ var(--card),
220
+ var(--glass-capsule-warm) var(--glass-capsule-warm-floor, 16%)
221
+ );
222
+ background: color-mix(
223
+ in oklab,
224
+ var(--sheet-crown),
225
+ var(--sheet-solid) calc(var(--sheet-freeze) * 100%)
226
+ );
227
+ backdrop-filter: blur(
228
+ calc(var(--glass-blur-overlay-radius, 20px) * (1 - var(--sheet-freeze)))
229
+ )
230
+ saturate(1.6);
231
+ -webkit-backdrop-filter: blur(
232
+ calc(var(--glass-blur-overlay-radius, 20px) * (1 - var(--sheet-freeze)))
233
+ )
234
+ saturate(1.6);
235
+ }
236
+
237
+ /* The `surface=opaque` explicit escape still wins (it sets the solid plate
238
+ unconditionally regardless of detent) — the freeze is the DEFAULT glass crown; the
239
+ opt-out plate is the consumer's hard override. Source order keeps the opaque rule
240
+ (declared above) — re-assert it here so it beats the snap-points freeze at equal
241
+ specificity for a detented opaque sheet. */
242
+ .glass-drawer[data-glass-drawer-snap-points="true"][data-surface="opaque"] {
243
+ background: color-mix(in srgb, var(--card), transparent 0%);
244
+ backdrop-filter: none;
245
+ -webkit-backdrop-filter: none;
246
+ }
247
+
134
248
  /* Direction variants — the content root tags itself with the drag axis
135
249
  (`data-glass-drawer-direction`). Bottom is the default; the others ride the same
136
250
  surface so a top/side sheet inherits the grammar. The side-lens (left/right) is
@@ -222,6 +336,56 @@
222
336
  background-color: var(--drawer-snap-rule-color);
223
337
  }
224
338
 
339
+ /*
340
+ * BD.W-OVERLAY-STAGE-COUPLE — coupling (B): the scrim DEEPEN. The scrim α tracks
341
+ * `--stage-t` so a peek drawer barely dims and a full drawer commits hard (the live
342
+ * fixed-α-0.8 at every detent is the born-RED). Reuses the SHIPPED warm
343
+ * `--overlay-scrim-ink` (the F7 warm near-black, never flat black), now t-coupled.
344
+ * `clamp(0,…,1)` bounds the fling overshoot. The scrim element gains
345
+ * `[data-stage-scrim]` (DrawerOverlay.vue) and reads the inherited `:root` scalar.
346
+ */
347
+ [data-stage-scrim] {
348
+ background: color-mix(
349
+ in srgb,
350
+ var(--overlay-scrim-ink)
351
+ calc((0.28 + clamp(0, var(--stage-t), 1) * 0.44) * 100%),
352
+ transparent
353
+ );
354
+ }
355
+
356
+ /*
357
+ * BD.W-OVERLAY-STAGE-COUPLE — coupling (C): the page RECEDE + SCALE. The page wrapper
358
+ * scales `1 → 0.95` + corner-radius blooms as `--stage-t → 1` (the iOS "card recedes"
359
+ * depth cue), retiring the dead `shouldScaleBackground` boolean. `scale` +
360
+ * `border-radius` ONLY — NO `filter` (the ancestor-filter trap: `filter` on the app
361
+ * root establishes a containing block for `position:fixed` and force-rasterizes the
362
+ * page subtree every frame — fold C2·R1; §7). The wrapper is the consumer's app-root
363
+ * marker (`demo/App.vue` mounts `[data-stage-wrapper]`); when the honest
364
+ * `stage="none|dim"` enum is set the marker carries no `--stage-t` drive (or the
365
+ * `data-stage-scale` gate is absent) so (C) is a real no-op, never a lie. Under PRM
366
+ * `stage="scale"` degrades to `dim` at the SFC (no `data-stage-scale` attr) so the
367
+ * page never transforms (fold C1·R6) — this rule only fires when the scale gate is on.
368
+ */
369
+ [data-stage-wrapper][data-stage-scale] {
370
+ scale: calc(1 - 0.05 * clamp(0, var(--stage-t), 1));
371
+ border-radius: calc(var(--radius-panel) * clamp(0, var(--stage-t), 1));
372
+ transform-origin: 50% 0; /* recede toward the top, iOS */
373
+ overflow: clip;
374
+ }
375
+
376
+ /*
377
+ * BD.W-OVERLAY-STAGE-COUPLE — coupling (D): the blur ENGAGE (opt-in `immersive`, the
378
+ * Command spotlight). The scrim's `backdrop-filter` radius ramps `0 → deep` on
379
+ * `--stage-t`. ONE-SHOT over the open window (gated to the modal-flip 0→1 via
380
+ * `[data-stage-immersive]`, NEVER the drawer's per-frame scalar — the §L7 Safari
381
+ * fence: a per-frame full-viewport re-blur is the cardinal sin, fold C2·R). WebKit
382
+ * pays the sample once as the flip lands. Default OFF.
383
+ */
384
+ [data-stage-scrim][data-stage-immersive] {
385
+ backdrop-filter: blur(calc(clamp(0, var(--stage-t), 1) * 16px));
386
+ -webkit-backdrop-filter: blur(calc(clamp(0, var(--stage-t), 1) * 16px));
387
+ }
388
+
225
389
  /* Reduced-motion — the house `SpringProgress` snaps the detent deterministically
226
390
  under `prefers-reduced-motion: reduce` (its `respectReducedMotion` jumps the
227
391
  `--glass-drawer-t` scalar to target in one frame, zero motion frames); here we
@@ -0,0 +1,244 @@
1
+ /* ════════════════════════════════════════════════════════════════════════
2
+ .glass-atom — BD.W-GLASS-ATOM-REGISTER: the ONE shared warm-glass register
3
+ the four small atoms (Badge-glass · metric-badge · slider fill · the `+N`
4
+ chip) consume in two registers (loud opaque identity vs quiet transmissive
5
+ glass).
6
+
7
+ CONSUME-ONLY — declares ZERO own glass tokens (the no-fork fence, Fence 1).
8
+ It COMPOSES:
9
+ · `.glass-capsule` — the warm-transmissive lozenge BODY (warm floor +
10
+ rim + lift). `.glass-atom` is a PEER of any
11
+ sized chip, NEVER `.glass-chip` itself (Fence 2):
12
+ both compose `.glass-capsule`. A consumer applies
13
+ BOTH classes (`class="glass-capsule glass-atom"`)
14
+ or composes the capsule body via the glass tier
15
+ the host already wears.
16
+ · `--glass-fill-tint` / `--glass-fill-strength` (BE.W-TINTED-CHIP, glass.css)
17
+ — the per-instance plate-fill data hue. The atom
18
+ is its ≥Nth consumer; it APPLIES the axis on the
19
+ quiet register, never re-mints a tint.
20
+ · `--glass-material-rim` — the keyed directional rim (the defined edge), the
21
+ SHIPPED two-stop rim re-pointed by `--glass-key`.
22
+ · the inert `.cartoon-cast` child + `--cartoon-ink` / `--shadow-cartoon-*`
23
+ (BD.W-CARTOON-CASTER / -CEL-INK) — the warm cel
24
+ stamp; the loud register intensifies on `data-cast`.
25
+ · `--motion-weight` × `--ease-cartoon-punch` (BD.W-MOTION-WEIGHT /
26
+ -CARTOON-PUNCH) — the non-uniform press squash +
27
+ the weight-coupled smear/settle.
28
+
29
+ @layer components, @import-ed by icon-chip.css (in-lane) AFTER glass.css (so
30
+ `.glass-capsule` + the `--glass-*` axes resolve) and BEFORE the consuming
31
+ recipes. Every channel is compositor-only + Safari-native (no
32
+ `backdrop-filter: url()`, no goo — Fence 8). The warm 0-alpha sources are
33
+ explicit `oklch(L C H / 0)` (NEVER bare `transparent` — the WebKit
34
+ black-premultiply hole, build-trap-(d)).
35
+ ════════════════════════════════════════════════════════════════════════ */
36
+
37
+ @layer components {
38
+ /* ── The warm idle floor (the #2 dormant-tint cure) ──
39
+ The atom carries chroma BEFORE any field paints + on a dead ground. The
40
+ floor is NON-self-referential (build-trap-(b): a property reading ITSELF in
41
+ its own `max()` resolves to guaranteed-invalid and the term drops). A
42
+ SEPARATE input var is the source: a consumer (the accent ramp) writes
43
+ `--accent-fill-strength-in`, and the resolved fill strength floors at
44
+ `--atom-tint-floor` — PLAIN per-mode (12% light / 15% dark), NEVER
45
+ `light-dark()` (the inset-shadow trap). */
46
+ .glass-atom {
47
+ --atom-tint-floor: 12%;
48
+ --accent-fill-strength: max(
49
+ var(--accent-fill-strength-in, 0%),
50
+ var(--atom-tint-floor)
51
+ );
52
+ /* The quiet register's tint application — the plate body mixes toward the
53
+ per-instance data hue ON TOP of the capsule's warm composite. At the
54
+ `@property` defaults (`--glass-fill-tint: transparent` / strength 0%)
55
+ this is the byte-identical no-op floor; the warm floor above keeps the
56
+ idle body warm even at a transparent tint. The mix is `in oklab` (the
57
+ perceptual glass-tint family — NOT the in-srgb brand fence). */
58
+ --glass-atom-tinted: color-mix(
59
+ in oklab,
60
+ var(--glass-capsule-warm) calc(var(--atom-tint-floor) + var(--glass-fill-strength)),
61
+ oklch(0.9 0.05 75 / 0)
62
+ );
63
+ /* The motion register — the press/hover deform rides
64
+ `--motion-weight × --ease-cartoon-punch`. The atom inherits the rest
65
+ `--motion-weight: 0.618`; the loud register (`data-cast`, below) pushes
66
+ it to 1 so the punch is never muted (the loud-register coupling). The
67
+ SPATIAL legs (scale/translate) settle on the punch clock; the EFFECTS
68
+ legs (background/box-shadow) stay on the bezier (motion-canon P1). */
69
+ transition:
70
+ background var(--duration-fast) var(--ease-standard),
71
+ box-shadow var(--duration-fast) var(--ease-standard),
72
+ scale var(--duration-normal) var(--ease-cartoon-punch),
73
+ translate var(--duration-normal) var(--ease-cartoon-punch);
74
+ }
75
+ .dark .glass-atom {
76
+ --atom-tint-floor: 15%;
77
+ }
78
+
79
+ /* ── The non-uniform PRESS squash (the punch, NOT a shrink) ──
80
+ Widen X, compress Y (`scale: 1.04 0.94`) — real squash & stretch. The
81
+ `:active` is the no-JS floor; a consumer's `useLiquidPress` may drive a
82
+ continuous ramp via `--cartoon-press-t` (the caster reads it). The
83
+ `border-radius` is the pill, so under non-uniform scale the end-caps track
84
+ the scaled box (challenge #2 R4 — the capsule radius stays circle-tolerant). */
85
+ .glass-atom:active:not([data-disabled]):not(:disabled) {
86
+ scale: 1.04 0.94;
87
+ }
88
+
89
+ /* ── The cel cast — UNIVERSAL-but-GRADED (challenge #1 R5 / #3 R5) ──
90
+ Every atom carries a hairline warm rim-cast at rest (the family floor); the
91
+ loud flagships (`data-cast`) INTENSIFY to the loud layered-offset stamp.
92
+ The cast rides the inert `.cartoon-cast` child (BD.W-CARTOON-CASTER) — the
93
+ child carries `--shadow-cartoon-md` at rest and moves on `translate`/`scale`
94
+ only; here the atom only RE-POINTS the loud register's resting/hover rung
95
+ (it does not re-author the caster). The loud register pushes
96
+ `--motion-weight: 1` so the punch reads at full amplitude. */
97
+ .glass-atom[data-cast] {
98
+ --motion-weight: 1;
99
+ }
100
+ .glass-atom[data-cast] .cartoon-cast {
101
+ box-shadow: var(--shadow-cartoon-sm);
102
+ }
103
+ @media (hover: hover) {
104
+ .glass-atom[data-cast]:hover:not(:active) .cartoon-cast {
105
+ box-shadow: var(--shadow-cartoon-md);
106
+ }
107
+ }
108
+
109
+ /* ── The QUIET register (`[data-surface="glass"]`) — the transmissive tint ──
110
+ The quiet capsule applies the per-instance fill tint over the warm floor.
111
+ This is where the warm-not-gray read is won (badge-glass, the `+N` chip).
112
+ The body composes `.glass-capsule` (the consumer applies both classes); the
113
+ atom only LAYERS the tinted fill on top of the capsule's warm composite via
114
+ `background-image` (a later layer over the capsule's `background:` shorthand
115
+ — the proven `.paper-grid` coexistence seam, paints OVER the translucent
116
+ fill, UNDER content). The 0-alpha stop is warm `oklch(… / 0)`, never bare
117
+ `transparent` (challenge #1 R4 / #2 R4 — the WebKit desaturation fix). */
118
+ .glass-atom[data-surface="glass"] {
119
+ background-image: linear-gradient(
120
+ var(--glass-atom-tinted),
121
+ var(--glass-atom-tinted)
122
+ );
123
+ }
124
+
125
+ /* ── PRM/PRT carve ──
126
+ Under reduced-motion `--motion-weight: 0` zeroes the squash + the cast
127
+ travel/lag in ONE assignment (every `calc(… * --motion-weight)` in the
128
+ caster collapses to rest); the press scale collapses to 1. The warm tint +
129
+ the rim + the STATIC cel STAMP persist (a still frame, never a frozen
130
+ mid-animation — the legibility floor). */
131
+ @media (prefers-reduced-motion: reduce) {
132
+ .glass-atom {
133
+ --motion-weight: 0;
134
+ }
135
+ .glass-atom:active:not([data-disabled]):not(:disabled) {
136
+ scale: 1;
137
+ }
138
+ }
139
+
140
+ /* ── prefers-contrast: more — the rim α floors UP (WCAG 1.4.11 non-text) ──
141
+ The keyed rim is the legibility CONTRACT (the cast is a supplement,
142
+ challenge #2 R6). Under more-contrast the atom floors its border ink so the
143
+ lit edge clears ≥3:1 vs the OPAQUE body, not only the glass body. */
144
+ @media (prefers-contrast: more) {
145
+ .glass-atom {
146
+ border-color: color-mix(in srgb, var(--foreground) 24%, transparent);
147
+ }
148
+ }
149
+
150
+ /* ════════════════════════════════════════════════════════════════════════
151
+ .badge-atom — the Badge consumer of the register (loud + quiet).
152
+
153
+ The LOUD register (the default opaque identity pill): the family signature
154
+ WITHOUT the glass body — the keyed warm rim (the defined edge, the
155
+ `border-transparent` melt fix), the non-uniform press-squish, the
156
+ universal-but-graded cel. The badge applies `.badge-atom` on EVERY variant
157
+ (the CVA base); `surface="glass"` ALSO applies `.glass-capsule .glass-atom`
158
+ for the quiet transmissive body.
159
+ ════════════════════════════════════════════════════════════════════════ */
160
+ .badge-atom {
161
+ position: relative;
162
+ /* AQ.W3 identity base — `scale`/`translate` longhands mint the stacking
163
+ context once so the press squash + the cast child compose cleanly. */
164
+ scale: 1;
165
+ translate: 0;
166
+ /* The DEFINED EDGE — the SHIPPED keyed two-stop rim (re-pointed by
167
+ `--glass-key`) as the pill's silhouette, so a sand `secondary` no longer
168
+ melts into a cream panel (the live `border-transparent` melt). It is a
169
+ box-shadow rim, NOT a `border` (the base CVA retired the `border`
170
+ keyword), so it adds zero layout box + reads warm. The press/lift scale
171
+ rides the punch register `× --motion-weight`. */
172
+ box-shadow: var(--glass-material-rim);
173
+ transition:
174
+ background var(--duration-fast) var(--ease-standard),
175
+ box-shadow var(--duration-fast) var(--ease-standard),
176
+ scale var(--duration-normal) var(--ease-cartoon-punch),
177
+ translate var(--duration-normal) var(--ease-cartoon-punch);
178
+ }
179
+
180
+ /* The non-uniform PRESS squash (widen X, compress Y — NOT a uniform shrink). */
181
+ .badge-atom:active:not([data-disabled]):not([aria-disabled='true']) {
182
+ scale: 1.04 0.94;
183
+ }
184
+
185
+ /* `outline` variant — the rim reads a louder warm-ink edge (it IS the edge). */
186
+ .badge-atom--outline {
187
+ box-shadow: var(--glass-material-rim);
188
+ border: 1px solid color-mix(in srgb, var(--foreground) 14%, transparent);
189
+ }
190
+
191
+ /* The LOUD cel stamp (opt-in, `data-cast`) — pushes the weight to 1 so the
192
+ punch reads at full amplitude + intensifies the inert child's cast. The
193
+ hairline rim-cast family floor is the rim above; this is the LOUD layered
194
+ offset (the flagship sticker stamp). */
195
+ .badge-atom[data-cast] {
196
+ --motion-weight: 1;
197
+ }
198
+ .badge-atom[data-cast] .cartoon-cast {
199
+ box-shadow: var(--shadow-cartoon-sm);
200
+ }
201
+ @media (hover: hover) {
202
+ .badge-atom[data-cast]:hover:not(:active) .cartoon-cast {
203
+ box-shadow: var(--shadow-cartoon-md);
204
+ }
205
+ }
206
+
207
+ /* The QUIET glass register — retire the opaque `bg-*` plate so the warm-glass
208
+ `.glass-capsule` body + the `.glass-atom` tinted `background-image` paint the
209
+ surface (no double-fill). The variant `bg-*` utility sets `background-color`;
210
+ this resets it to transparent so the capsule fill + the data-hue tint win.
211
+ The text color (the variant's `text-*`) is kept — the label still reads. */
212
+ .badge-atom--glass {
213
+ background-color: transparent !important;
214
+ /* The quiet capsule tints toward the variant's SEMANTIC hue via the shared
215
+ `--glass-fill-tint` axis (BE.W-TINTED-CHIP) — colored glass, never a
216
+ forked tint. The strength is a calm stop (the body ink stays legible).
217
+ A consumer overrides `--glass-fill-tint` per-instance for a bespoke hue. */
218
+ --glass-fill-strength: var(--badge-glass-strength, 16%);
219
+ }
220
+ /* Per-variant glass tint — the data hue the quiet body mixes toward. The
221
+ semantic plate token becomes the tint source (the loud fill demoted to a
222
+ transmissive hue). `secondary`/`outline` are the calm/neutral routes. */
223
+ .badge-atom--glass[data-variant='default'] { --glass-fill-tint: var(--primary); }
224
+ .badge-atom--glass[data-variant='secondary'] { --glass-fill-tint: var(--glass-capsule-warm); }
225
+ .badge-atom--glass[data-variant='outline'] { --glass-fill-tint: var(--glass-capsule-warm); }
226
+ .badge-atom--glass[data-variant='destructive'] { --glass-fill-tint: var(--destructive); }
227
+ .badge-atom--glass[data-variant='success'] { --glass-fill-tint: var(--success); }
228
+ .badge-atom--glass[data-variant='warning'] { --glass-fill-tint: var(--warning); }
229
+ .badge-atom--glass[data-variant='info'] { --glass-fill-tint: var(--info); }
230
+
231
+ @media (prefers-reduced-motion: reduce) {
232
+ .badge-atom {
233
+ --motion-weight: 0;
234
+ }
235
+ .badge-atom:active:not([data-disabled]) {
236
+ scale: 1;
237
+ }
238
+ }
239
+ @media (prefers-contrast: more) {
240
+ .badge-atom {
241
+ border: 1px solid color-mix(in srgb, var(--foreground) 28%, transparent);
242
+ }
243
+ }
244
+ }
@@ -0,0 +1,143 @@
1
+ /* ════════════════════════════════════════════════════════════════════════
2
+ .glass-capsule — the ONE shared glassy register (BD.W-TAB-IOS-CAPSULE).
3
+
4
+ The warm-transmissive lifted lozenge + the recessed warm channel it rides in
5
+ + the glass hover/press register, factored ONCE so EVERY consumer (segmented
6
+ pill · dock-tab selected · Button glass · chips · cards) COMPOSES it instead
7
+ of re-forking the lifted-plate composite. ≥3 consumers by construction — the
8
+ overfitting bar cleared by extraction. The tabs facility is the reference
9
+ implementation; "make buttons glassy like the tabs" is a one-recipe substitution.
10
+
11
+ Clean break — the prior inline `.segmented-indicator` composite (fill + rim +
12
+ lift) moves here VERBATIM and the pill COMPOSES the class. No alias, no legacy.
13
+
14
+ @layer components, @import-ed in index.css AFTER the glass ladder (so the
15
+ `--glass-bg-*`/`--glass-rim-*`/`--glass-shadow-*` tokens resolve) and BEFORE
16
+ the consuming tabs/dock/button recipes.
17
+
18
+ THREE states:
19
+ · REST = .glass-capsule — the warm-glass lifted plate.
20
+ · TRACK = .glass-capsule-track — the recessed warm channel.
21
+ · HOVER = .glass-capsule-hover — specular catch-light lift + press-snap.
22
+
23
+ Every channel is compositor-only + Safari-native by construction (the §7 floor):
24
+ no `backdrop-filter: url()`, no SVG goo, no WebGL. The recess is a STATIC inset
25
+ shadow built off a PLAIN per-mode token pair (NEVER a `light-dark()` fragment —
26
+ an inset-shadow leg inside light-dark() computes the WHOLE box-shadow to `none`,
27
+ the binding MEMORY lesson). The hover lift is a `scale` + `--glass-specular`
28
+ step (the SHARED specular-lift primitive `.glass-drag-lift` also composes).
29
+ ════════════════════════════════════════════════════════════════════════ */
30
+
31
+ @layer components {
32
+ /* ── .glass-capsule — the raised lit warm-glass lozenge ──
33
+ The fill reads the SHARED element-level oklab-tinted floating pair (the W55
34
+ adaptive seam, `surfaces.css` `:where(.btn-glass, .segmented-indicator,
35
+ .glass-capsule)`) — over a bright field it darkens-to-legible, over a calm
36
+ field it stays warm-cream/near-white. The FORWARD-ness comes from the rim +
37
+ lift, NOT from cranking the same-hue alpha. */
38
+ .glass-capsule {
39
+ /* The WARM-FLOOR re-invent (BD.W-TAB-IOS-CAPSULE C6). The bare
40
+ `--glass-bg-floating-tinted` desaturates to near-gray over a vibrant
41
+ aurora (live-measured oklab(0.793 0.005 0.012), chroma 0.0128 < 0.02).
42
+ Compose a SMALL floor toward an explicitly WARM oklch source so the
43
+ CAPSULE's own resolved fill carries chroma — independent of the
44
+ `--glass-tint-strength: 0%` adaptive default (which is zero-delta at rest
45
+ and only lifts under the bright bucket). This exercises the REAL
46
+ `color-mix(in oklab)` seam over the live light-dark() fill (NOT a
47
+ hardcoded hsl look-alike — the amendment's fake-gate ban). The source is
48
+ a warm oklch (build-trap-(d) safe form — warm color, never bare
49
+ `transparent`); at `--glass-capsule-warm-floor: 16%` the painted capsule
50
+ clears meanChroma ≥ 0.02 BOTH modes with negligible L lift (stays near-
51
+ white). `--glass-capsule-warm` is a warm cream amber both modes. */
52
+ /* The fill is INDIRECTED through `--glass-capsule-fill` so a consumer can
53
+ re-point the rung (quiet/loud/selected — buttons' quiet triplet, the dock
54
+ selected pill) WITHOUT forking the register; the default keeps the warm
55
+ floor compose. */
56
+ background: var(
57
+ --glass-capsule-fill,
58
+ color-mix(
59
+ in oklab,
60
+ var(--glass-bg-floating-tinted),
61
+ var(--glass-capsule-warm) var(--glass-capsule-warm-floor)
62
+ )
63
+ );
64
+ backdrop-filter: var(--glass-blur-floating);
65
+ -webkit-backdrop-filter: var(--glass-blur-floating);
66
+ /* The lifted-plate composite: the directional rim (bright top catch-light +
67
+ warm bottom under-shadow — the iOS-27 top-light/bottom-shadow thickness)
68
+ PLUS a layered glass under-shadow lifting the plate ~2-3px off the quiet
69
+ track. */
70
+ box-shadow:
71
+ var(--glass-rim-top),
72
+ var(--glass-rim-bottom),
73
+ var(--glass-shadow-floating);
74
+ border-radius: var(--radius-pill);
75
+ }
76
+
77
+ /* ── .glass-capsule-track — the recessed warm channel (the iOS-27 sunken well) ──
78
+ The track SINKS: rim + a STATIC inset recess leg. The recess ink is a PLAIN
79
+ per-mode token pair (`tokens/glass-fx.css` light arm, `tokens/dark-arm.css`
80
+ dark arm) — NEVER a `light-dark()` fragment (the inset-shadow trap). The
81
+ recess is static (a sunken channel does not pulse — never a @keyframes
82
+ target; `proof:no-layout-animation` holds). */
83
+ .glass-capsule-track {
84
+ background: var(--glass-bg-quiet);
85
+ backdrop-filter: var(--glass-blur-quiet);
86
+ -webkit-backdrop-filter: var(--glass-blur-quiet);
87
+ box-shadow:
88
+ var(--glass-rim-top),
89
+ var(--glass-rim-bottom),
90
+ inset 0 1px 2px var(--tab-track-recess-ink);
91
+ }
92
+
93
+ /* ── .glass-capsule-hover — the SHARED specular-lift primitive ──
94
+ The two-channel glass hover (specular catch-light lift + a hair of scale) +
95
+ the press-snap, on the FAST bezier clock (hover is a bezier ease, not a
96
+ spring), volume-preserving, compositor-only. This is the SAME specular-lift
97
+ idiom `.glass-drag-lift` carries — factored here ONCE; `.glass-drag-lift`
98
+ re-composes `--glass-specular`-step + `will-change` rather than forking a
99
+ parallel block. The non-selected pill + the buttons greenfield compose this
100
+ wholesale: glass at rest + specular-lift on hover + press-snap on active. */
101
+ .glass-capsule-hover {
102
+ /* The SPATIAL leg (scale) rides the weighty cartoon-punch curve (the
103
+ liquid-weight-universal mandate — a hover lift carries inertia/overshoot,
104
+ never an abrupt bezier jerk; the SAME spatial currency `.glass-chip`/
105
+ `.glass-atom` ride, PRM-zeroed via the `--ease-cartoon-punch` fallback). The
106
+ EFFECTS leg (the `--specular-intensity` gleam channel) stays on the fast
107
+ bezier (motion-canon P1 — an effects cross-fade is not a spatial motion). */
108
+ transition:
109
+ scale var(--duration-fast) var(--ease-cartoon-punch),
110
+ --specular-intensity var(--duration-fast) var(--ease-standard);
111
+ }
112
+ /* The SHARED specular-lift step — declared ONCE here, COMPOSED by both the hover
113
+ register AND the drag-lift (BD.W-TAB-IOS-CAPSULE C7: one declaration of the
114
+ `--glass-specular` catch-light step, never a parallel fork). `.glass-drag-lift`
115
+ (segmented-tabs.css) re-points its grabbed-state catch-light onto THIS step
116
+ rather than re-declaring `--glass-specular`; it adds only its distinct grabbing
117
+ bits (the grab cursor + the `will-change` compositor hint). The W-GLASS-CAL
118
+ sub-perceptual catch — a hair brighter at the specular edge, disco-FREE. */
119
+ .glass-capsule-hover:hover,
120
+ .glass-drag-lift {
121
+ /* Drive the REAL gleam-opacity channel (`--specular-intensity`, read by the
122
+ moving-specular `::before` at material.css opacity) — not the dead
123
+ `--glass-specular` name. Composes with the material hover system; fires for
124
+ both the :hover register AND the grabbed `.glass-drag-lift` class. */
125
+ --specular-intensity: 0.14;
126
+ }
127
+ .glass-capsule-hover:hover {
128
+ /* the 1.5% press-ready lift (the lift is hover-only; the drag-lift carries no
129
+ scale of its own — the translate/squish are the morph primitive's writes) */
130
+ scale: 1.015;
131
+ }
132
+ .glass-capsule-hover:active {
133
+ /* the --scale-press snap */
134
+ scale: var(--scale-press-sm, 0.97);
135
+ }
136
+ @media (prefers-reduced-motion: reduce) {
137
+ /* the lift is motion; the specular catch (a static legibility cue) stays. */
138
+ .glass-capsule-hover:hover,
139
+ .glass-capsule-hover:active {
140
+ scale: 1;
141
+ }
142
+ }
143
+ }