@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
@@ -0,0 +1,850 @@
1
+ /*
2
+ * liquid-morph.css — the LIQUID DOCK surfaces (BE.W-LIQUID-MORPH, WF-2 integration).
3
+ *
4
+ * RE-ARCHITECTED onto the SHIPPED BE library primitives. The throwaway box-scale /
5
+ * goo-blob / data-mode spike is GONE (no dual path):
6
+ *
7
+ * • EXPAND / PLAYER — the dock is a small PILL (.liquid-pill) that STAYS PILL-SIZED.
8
+ * The Places sheet (.liquid-sheet) / player card (.liquid-player) is a SEPARATE
9
+ * overlay laid out at its FULL settled rect; `useBloomUp` FLIPs it FROM the pill's
10
+ * rect (writing transform/opacity/filter INLINE — never a box-scale that crushes
11
+ * content, never a layout-property animation). This CSS supplies only the STATIC
12
+ * resting plates + content layout; the motion is the JS leaf's compositor transform.
13
+ * • ISLAND — ONE crisp .glass-floating pill (.liquid-island-host, the
14
+ * `.dock-fission-bridge` host) that FISSIONS. The two halves are `.dock-fission-piece`
15
+ * pieces; the library `fission-bridge.css` owns the translate/squish/neck (the goo
16
+ * stretch-thin-snap, the specular sweep, the goo-OR-glass swap). This CSS supplies
17
+ * only each half's resting glass plate + content. NO blob layer, NO data-mode switch.
18
+ *
19
+ * COMPOSITOR-ONLY (proof:no-layout-animation). This sheet animates ZERO layout property
20
+ * — the bloom transform is written inline by `useBloomUp`; the fission translate/scale
21
+ * lives in `fission-bridge.css`; the only @keyframes here is the eq bars (compositor
22
+ * `scaleY`). The plates read warm-cream glass (the --glass-* ladder, both modes).
23
+ */
24
+ @layer components {
25
+ /* ── The stage IS the [data-glass-field] the bloom's 4th color channel warms.
26
+ `useBloomUp` writes `--glass-ambient-hue` + ramps `--glass-ambient-strength` HERE;
27
+ this rule re-points the EXISTING `--glass-tint-source`/`--glass-tint-strength`
28
+ self-engage seam toward the ambient hue so every glass plate inside the stage
29
+ (the bloomed sheet/player) WARMS toward the source's color as it blooms — the iOS
30
+ "the whole world takes on the album's color." Neutral by default (transparent hue,
31
+ 0% strength = the no-op floor; the warm-cream identity holds). The bias is keyed
32
+ off the registered @property customs (so the strength ramp INTERPOLATES). ── */
33
+ .liquid-stage {
34
+ --glass-tint-source: var(--glass-ambient-hue, transparent);
35
+ --glass-tint-strength: var(--glass-ambient-strength, 0%);
36
+ }
37
+
38
+ /* ── BD.W-AMBIENT-TINT (AUGMENT 2 — widen the bias past the dock) ───────────────
39
+ The ambient-hue bias is GENERALIZED from the dock-only `.liquid-stage` seam to
40
+ EVERY glass tier rendered OVER the warm field: any `[data-paper-field]` host
41
+ re-points the SAME EXISTING `--glass-tint-source`/`--glass-tint-strength`
42
+ self-engage seam toward the sampled `--glass-ambient-hue`, so a plate over the
43
+ warm field WARMS toward the field/section-accent hue (the transmissive read —
44
+ the Maps-card transmission becomes real, not latent). This is a RE-POINT of the
45
+ extant seam onto a `[data-paper-field]` scope, NOT a new tint mechanism (the
46
+ `useGlassBackdropLuminance` histogram is already general).
47
+
48
+ The strength is BOUNDED ≤ 8% (the `--glass-ambient-strength` cascade bound,
49
+ sub-perceptual under the W55 `--glass-tint-strength-aa` ceiling); the field
50
+ itself is built in the NEXT stage — here we WIRE the bias to read
51
+ `[data-paper-field]` so the seam is live the instant the field mounts.
52
+
53
+ THE COMBINED-HUE CLAMP (C #1 R4): the field warmth is counted into the plate up
54
+ to three times (intrinsic warm fill + field-through-blur + ambient-of-that-field).
55
+ To keep the combined plate-over-field-plus-ambient hue inside the warm band
56
+ [45,88] for ALL section-accents (a violet/teal accent + warm ambient must not
57
+ over-rotate past WARM_HUE_HI), the ambient strength is GATED: it engages only
58
+ while the host has NOT already cleared the warm bar — a host that resolves a
59
+ warm-enough field sets `--paper-field-warm: 1` to SKIP the ambient mix (the
60
+ no-double-count guard). `--glass-ambient-strength-field` is the bounded ceiling
61
+ (≤8%); `--paper-field-warm` (default 0 = engage) is the skip flag the field
62
+ writes when it already clears the bar. */
63
+ [data-paper-field] {
64
+ --glass-ambient-strength-field: min(var(--glass-ambient-strength, 8%), 8%);
65
+ --glass-tint-source: var(--glass-ambient-hue, transparent);
66
+ /* engage the bounded bias UNLESS the field already clears the warm bar
67
+ (`--paper-field-warm: 1` → 0% = skip the ambient mix, no over-rotation). */
68
+ --glass-tint-strength: calc(
69
+ var(--glass-ambient-strength-field) * (1 - var(--paper-field-warm, 0))
70
+ );
71
+ }
72
+
73
+ /* ── The bloom SOURCE — a small glass pill. STAYS PILL-SIZED in every state (the
74
+ bloom FLIPs the SHEET, not the pill). At rest it shows the search field / the
75
+ now-playing row; while the sheet is open it fades out (the sheet IS its bloomed
76
+ self — they share the visual identity). ── */
77
+ .liquid-pill {
78
+ /* the de-shadcn'd real <button> — reset the UA chrome (border/appearance/font)
79
+ so the glass plate is the only surface; the layout/plate below is unchanged. */
80
+ appearance: none;
81
+ border: none;
82
+ font: inherit;
83
+ text-align: start;
84
+ position: relative;
85
+ z-index: 2;
86
+ box-sizing: border-box;
87
+ display: flex;
88
+ align-items: center;
89
+ gap: 0.625rem;
90
+ block-size: 4rem;
91
+ min-inline-size: 18rem;
92
+ padding-inline: 1.25rem;
93
+ padding-block: 0;
94
+ border-radius: 2rem;
95
+ cursor: pointer;
96
+ color: var(--foreground);
97
+ /* the glass plate — the warm-cream floating tier (real backdrop-filter + rim).
98
+ BOTH legs route through `--glass-level`: the fill reads the COMPOSED
99
+ `--glass-bg-floating` (the `1 - (1-α)*--glass-level` recipe) and the blur reads
100
+ the COMPOSED `--glass-blur-floating` (`blur(radius * --glass-level) saturate()`),
101
+ so `prefers-reduced-transparency: reduce` (`--glass-level: 0` → solid `--card` +
102
+ `blur(0)`) and `prefers-contrast: more` (`0.3`) reach the plate for FREE — no
103
+ hardcoded `blur(...px)` that bypasses the a11y bracket. */
104
+ background: var(--glass-bg-floating);
105
+ -webkit-backdrop-filter: var(--glass-blur-floating);
106
+ backdrop-filter: var(--glass-blur-floating);
107
+ box-shadow:
108
+ inset 0 0 0 0.5px var(--glass-edge-light),
109
+ var(--shadow-floating);
110
+ /* the resting transition is the surface cross-fade only (color/bg/box-shadow —
111
+ NOT a layout property; compositor-safe). */
112
+ transition:
113
+ opacity var(--duration-fast, 150ms) var(--ease-out),
114
+ background var(--duration-fast, 150ms) var(--ease-out);
115
+ }
116
+ /* the focus ring is the token-first `.focus-ring` utility (composed in the SFC on the
117
+ un-filtered host layer — box-shadow survives the rounded clip); this rule only
118
+ PRESERVES the resting rim/shadow beneath the utility ring so the plate edge stays
119
+ lit while focused (the utility's box-shadow would otherwise replace it). */
120
+ .liquid-pill.focus-ring:focus-visible {
121
+ box-shadow:
122
+ var(--focus-ring-shadow),
123
+ inset 0 0 0 0.5px var(--glass-edge-light),
124
+ var(--shadow-floating);
125
+ }
126
+ /* while the sheet/player is open, the pill is the bloom ORIGIN — hide it (the bloomed
127
+ sheet carries the identity forward; restoring it would double the surface). */
128
+ .liquid-pill--hidden {
129
+ opacity: 0;
130
+ pointer-events: none;
131
+ }
132
+
133
+ /* ── BE.W-ALIVE-IDLE — the sub-perceptual REST breath. A barely-there scale(1↔1.012)
134
+ breath so the resting pill reads ALIVE (the §6 calm register — tasteful, sub-
135
+ perceptual, NEVER disco). Compositor-only (transform: scale), STATIC under reduce
136
+ (the @keyframes only attaches inside the no-preference bracket; at rest the pill
137
+ paints its identity scale). The breath is OFF while the bloom origin is hidden
138
+ (an invisible pill should not animate) — and the island variant is gated to the
139
+ MERGED (non-fissioning) state below so it never fights the carve transforms. ── */
140
+ @media (prefers-reduced-motion: no-preference) {
141
+ .liquid-pill:not(.liquid-pill--hidden) {
142
+ animation: liquid-idle-breath var(--liquid-idle-breath-duration, 6s)
143
+ ease-in-out infinite;
144
+ }
145
+ /* the island's crisp resting pill breathes ONLY while merged (goo OFF). The breath
146
+ rides the resting ::before PLATE (the crisp pill at rest), NOT the host element
147
+ — so it NEVER competes with the carve translate/squish the host's blob+content
148
+ layers carry, and it cross-fades out cleanly as the plate dissolves at t>0.
149
+ Gated to :not([data-fissioning]) so a split removes it at the merged endpoint
150
+ (the plate is already fading; the breath resumes from scale(1) on full merge). */
151
+ .liquid-island-host:not([data-fissioning])::before {
152
+ animation: liquid-idle-breath var(--liquid-idle-breath-duration, 6s)
153
+ ease-in-out infinite;
154
+ }
155
+ }
156
+ @keyframes liquid-idle-breath {
157
+ 0%,
158
+ 100% {
159
+ transform: scale(1);
160
+ }
161
+ 50% {
162
+ transform: scale(1.012);
163
+ }
164
+ }
165
+ .liquid-pill-icon {
166
+ inline-size: 1.2rem;
167
+ block-size: 1.2rem;
168
+ flex: 0 0 auto;
169
+ color: var(--foreground);
170
+ }
171
+ .liquid-pill-hint {
172
+ flex: 1 1 auto;
173
+ font-size: var(--type-body, 1rem);
174
+ color: var(--muted-foreground);
175
+ white-space: nowrap;
176
+ }
177
+ .liquid-pill-trail {
178
+ inline-size: 1.15rem;
179
+ block-size: 1.15rem;
180
+ flex: 0 0 auto;
181
+ color: var(--muted-foreground);
182
+ }
183
+ /* the player pill's album thumb + meta + play */
184
+ .liquid-pill-album {
185
+ flex: 0 0 auto;
186
+ inline-size: 3rem;
187
+ block-size: 3rem;
188
+ border-radius: 0.5rem;
189
+ background: linear-gradient(
190
+ 135deg,
191
+ var(--section-color-8),
192
+ var(--section-color-7) 55%,
193
+ var(--section-color-10)
194
+ );
195
+ box-shadow: 0 2px 8px -2px color-mix(in srgb, var(--foreground) 40%, transparent);
196
+ }
197
+ .liquid-pill-meta {
198
+ display: flex;
199
+ flex: 1 1 auto;
200
+ flex-direction: column;
201
+ line-height: 1.2;
202
+ min-inline-size: 0;
203
+ }
204
+ .liquid-pill-title {
205
+ font-size: var(--type-small, 0.875rem);
206
+ color: var(--foreground);
207
+ white-space: nowrap;
208
+ overflow: hidden;
209
+ text-overflow: ellipsis;
210
+ }
211
+ .liquid-pill-artist {
212
+ font-size: var(--type-caption, 0.75rem);
213
+ color: var(--muted-foreground);
214
+ white-space: nowrap;
215
+ }
216
+ .liquid-pill-play {
217
+ display: grid;
218
+ place-items: center;
219
+ inline-size: 2.25rem;
220
+ block-size: 2.25rem;
221
+ border-radius: 999px;
222
+ background: var(--glass-bg-resting);
223
+ color: var(--foreground);
224
+ flex: 0 0 auto;
225
+ }
226
+
227
+ /* ── VERTICAL pill — a CONTENT REFLOW (a column), NOT a display:none amputation.
228
+ album/icon → title → trailing control stack down the column. ── */
229
+ .liquid-pill[data-orientation="vertical"] {
230
+ flex-direction: column;
231
+ align-items: center;
232
+ justify-content: center;
233
+ gap: 0.5rem;
234
+ block-size: auto;
235
+ min-inline-size: 0;
236
+ inline-size: 5rem;
237
+ min-block-size: 14rem;
238
+ padding-block: 1.25rem;
239
+ padding-inline: 0.5rem;
240
+ }
241
+ .liquid-pill[data-orientation="vertical"] .liquid-pill-hint,
242
+ .liquid-pill[data-orientation="vertical"] .liquid-pill-artist {
243
+ font-size: var(--type-caption, 0.75rem);
244
+ text-align: center;
245
+ white-space: normal;
246
+ }
247
+ .liquid-pill[data-orientation="vertical"] .liquid-pill-meta {
248
+ align-items: center;
249
+ flex: 0 0 auto;
250
+ text-align: center;
251
+ }
252
+ .liquid-pill[data-orientation="vertical"] .liquid-pill-title {
253
+ white-space: normal;
254
+ text-align: center;
255
+ }
256
+
257
+ /* ════════════════════════════════════════════════════════════════════════════
258
+ THE BLOOM DESTINATIONS — the sheet + the player. Laid out at their FULL settled
259
+ rect (one layout solve). `useBloomUp` FLIPs them FROM the pill's rect inline
260
+ (transform/opacity/filter) — this CSS never animates a layout property. They are
261
+ absolutely-positioned over the stage, anchored to the bottom (the iOS sheet-from-
262
+ dock origin). The content lays out ONCE at the full size and the bloom composites.
263
+ ════════════════════════════════════════════════════════════════════════════ */
264
+ .liquid-sheet,
265
+ .liquid-player {
266
+ position: absolute;
267
+ inset-block-end: 2rem;
268
+ inset-inline: 50%;
269
+ translate: -50% 0;
270
+ z-index: 3;
271
+ box-sizing: border-box;
272
+ inline-size: 22rem;
273
+ max-inline-size: 88vw;
274
+ border-radius: var(--radius-card, 1.5rem);
275
+ /* the glass plate — the floating sheet tier (real backdrop-filter + rim). The fill
276
+ COMPOSES the element-level oklab tint (the ladder.css seam) so the stage's
277
+ ambient-hue bias reaches it (the substitution-vs-inheritance fix — a raw
278
+ `var(--glass-bg-floating)` reads the pre-substituted :root value and would NOT
279
+ warm; composing the tint AT the element is the documented retune path). At the
280
+ 0%/transparent default this is byte-identical to the raw rung. */
281
+ background: color-mix(
282
+ in oklab,
283
+ var(--glass-bg-floating),
284
+ var(--glass-tint-source, transparent) var(--glass-tint-strength, 0%)
285
+ );
286
+ /* the blur routes through the COMPOSED `--glass-blur-floating` (radius *
287
+ --glass-level), so the a11y brackets (`prefers-reduced-transparency` → blur(0))
288
+ reach the bloomed sheet/player plate (no hardcoded blur bypass). */
289
+ -webkit-backdrop-filter: var(--glass-blur-floating);
290
+ backdrop-filter: var(--glass-blur-floating);
291
+ box-shadow:
292
+ inset 0 0 0 0.5px var(--glass-edge-light),
293
+ var(--shadow-floating);
294
+ overflow: hidden;
295
+ /* the base origin so the inline FLIP scales FROM the pill (the JS overrides
296
+ transform-origin per-bloom; this is the resting fallback). */
297
+ transform-origin: bottom center;
298
+ }
299
+
300
+ /* the iOS sheet GRABBER */
301
+ .liquid-sheet-grabber {
302
+ position: absolute;
303
+ inset-block-start: 0.6rem;
304
+ inset-inline-start: 50%;
305
+ translate: -50% 0;
306
+ inline-size: 2.25rem;
307
+ block-size: 0.3125rem;
308
+ border-radius: 999px;
309
+ background: color-mix(in oklab, var(--foreground) 20%, transparent);
310
+ z-index: 3;
311
+ }
312
+
313
+ /* ── the Places sheet body ── */
314
+ .liquid-sheet {
315
+ display: flex;
316
+ flex-direction: column;
317
+ block-size: 23rem;
318
+ }
319
+ .liquid-sheet-body {
320
+ flex: 1 1 auto;
321
+ display: flex;
322
+ flex-direction: column;
323
+ gap: 1rem;
324
+ padding: 1.75rem 1.5rem 1rem;
325
+ overflow: hidden;
326
+ }
327
+ .liquid-sheet-places {
328
+ display: flex;
329
+ gap: 0.5rem;
330
+ justify-content: space-between;
331
+ }
332
+ .liquid-sheet-place {
333
+ display: flex;
334
+ flex-direction: column;
335
+ align-items: center;
336
+ gap: 0.375rem;
337
+ flex: 1 1 0;
338
+ }
339
+ .liquid-sheet-place-label {
340
+ font-size: var(--type-caption, 0.75rem);
341
+ color: var(--foreground);
342
+ white-space: nowrap;
343
+ }
344
+ .liquid-sheet-recents {
345
+ display: flex;
346
+ flex-direction: column;
347
+ gap: 0.5rem;
348
+ margin-block-start: 0.25rem;
349
+ }
350
+ .liquid-sheet-recents-label {
351
+ font-family: var(--font-mono);
352
+ font-size: var(--type-caption, 0.75rem);
353
+ text-transform: uppercase;
354
+ letter-spacing: 0.1em;
355
+ color: var(--muted-foreground);
356
+ }
357
+ .liquid-sheet-recent {
358
+ display: flex;
359
+ align-items: center;
360
+ gap: 0.625rem;
361
+ text-align: start;
362
+ background: none;
363
+ border: none;
364
+ padding: 0;
365
+ cursor: pointer;
366
+ color: inherit;
367
+ font: inherit;
368
+ }
369
+ .liquid-sheet-recent-icon {
370
+ display: grid;
371
+ place-items: center;
372
+ inline-size: 2rem;
373
+ block-size: 2rem;
374
+ border-radius: 999px;
375
+ background: var(--glass-bg-resting);
376
+ color: var(--muted-foreground);
377
+ flex: 0 0 auto;
378
+ }
379
+ .liquid-sheet-recent-text {
380
+ display: flex;
381
+ flex-direction: column;
382
+ line-height: 1.2;
383
+ min-inline-size: 0;
384
+ }
385
+ .liquid-sheet-recent-name {
386
+ font-size: var(--type-small, 0.875rem);
387
+ color: var(--foreground);
388
+ }
389
+ .liquid-sheet-recent-sub {
390
+ font-size: var(--type-caption, 0.75rem);
391
+ color: var(--muted-foreground);
392
+ white-space: nowrap;
393
+ overflow: hidden;
394
+ text-overflow: ellipsis;
395
+ }
396
+ /* the persistent search field at the sheet bottom — the pill's magnifier FLIPs
397
+ into THIS (one coherent search element, the orphan-magnifier fix). */
398
+ .liquid-sheet-search {
399
+ flex: 0 0 auto;
400
+ display: flex;
401
+ align-items: center;
402
+ gap: 0.625rem;
403
+ block-size: 4rem;
404
+ padding-inline: 1.25rem;
405
+ border-block-start: 1px solid color-mix(in oklab, var(--foreground) 9%, transparent);
406
+ background: color-mix(in oklab, var(--card), transparent 35%);
407
+ cursor: pointer;
408
+ color: inherit;
409
+ font: inherit;
410
+ text-align: start;
411
+ }
412
+ /* VERTICAL sheet — a narrower, taller column (the content already reflows: the
413
+ Places row + Recents stack down the column naturally). */
414
+ .liquid-sheet[data-orientation="vertical"] {
415
+ inline-size: 17rem;
416
+ block-size: 25rem;
417
+ }
418
+
419
+ /* ── the player card — the full Apple Music player ── */
420
+ .liquid-player {
421
+ display: flex;
422
+ flex-direction: column;
423
+ align-items: center;
424
+ justify-content: center;
425
+ gap: 0.625rem;
426
+ padding: 2rem 1.5rem 1.75rem;
427
+ block-size: 24rem;
428
+ }
429
+ /* the Apple Music AMBIENT background — the album's own colours, blurred (the iconic
430
+ now-playing ambience). The FIELD ambient-hue warm (the bloom 4th channel) sits on
431
+ the STAGE; this is the card's own bloom-art. */
432
+ .liquid-player::before {
433
+ content: "";
434
+ position: absolute;
435
+ inset: -20%;
436
+ z-index: -1;
437
+ background:
438
+ radial-gradient(
439
+ ellipse 70% 60% at 28% 22%,
440
+ color-mix(in oklab, var(--section-color-8), transparent 50%),
441
+ transparent 72%
442
+ ),
443
+ radial-gradient(
444
+ ellipse 65% 55% at 78% 82%,
445
+ color-mix(in oklab, var(--section-color-10), transparent 55%),
446
+ transparent 68%
447
+ ),
448
+ radial-gradient(
449
+ ellipse 60% 70% at 60% 55%,
450
+ color-mix(in oklab, var(--section-color-7), transparent 60%),
451
+ transparent 64%
452
+ );
453
+ filter: blur(14px);
454
+ opacity: 0.55;
455
+ pointer-events: none;
456
+ }
457
+ .liquid-player-album {
458
+ flex: 0 0 auto;
459
+ inline-size: 8.5rem;
460
+ block-size: 8.5rem;
461
+ border-radius: 1rem;
462
+ background: linear-gradient(
463
+ 135deg,
464
+ var(--section-color-8),
465
+ var(--section-color-7) 55%,
466
+ var(--section-color-10)
467
+ );
468
+ box-shadow: 0 12px 32px -8px color-mix(in srgb, var(--foreground) 50%, transparent);
469
+ }
470
+ .liquid-player-title {
471
+ font-size: var(--type-subheading);
472
+ font-weight: 600;
473
+ color: var(--foreground);
474
+ text-align: center;
475
+ }
476
+ .liquid-player-artist {
477
+ font-size: var(--type-small, 0.875rem);
478
+ color: var(--muted-foreground);
479
+ margin-block-start: -0.375rem;
480
+ }
481
+ .liquid-player-scrubber {
482
+ inline-size: 100%;
483
+ block-size: 4px;
484
+ border-radius: 999px;
485
+ background: var(--glass-bg-resting);
486
+ overflow: hidden;
487
+ margin-block-start: 0.25rem;
488
+ }
489
+ .liquid-player-scrubber-fill {
490
+ display: block;
491
+ inline-size: 38%;
492
+ block-size: 100%;
493
+ border-radius: 999px;
494
+ background: var(--foreground);
495
+ }
496
+ .liquid-player-times {
497
+ display: flex;
498
+ justify-content: space-between;
499
+ inline-size: 100%;
500
+ margin-block-start: 0.3rem;
501
+ font-size: 0.6875rem;
502
+ font-variant-numeric: tabular-nums;
503
+ color: var(--muted-foreground);
504
+ }
505
+ .liquid-player-transport {
506
+ display: flex;
507
+ align-items: center;
508
+ gap: 1.5rem;
509
+ color: var(--foreground);
510
+ margin-block-start: 0.25rem;
511
+ }
512
+ .liquid-player-transport button {
513
+ background: none;
514
+ border: none;
515
+ padding: 0;
516
+ cursor: pointer;
517
+ color: inherit;
518
+ display: grid;
519
+ place-items: center;
520
+ }
521
+ .liquid-player-transport-play {
522
+ inline-size: 3rem;
523
+ block-size: 3rem;
524
+ border-radius: 999px;
525
+ background: var(--glass-bg-floating) !important;
526
+ }
527
+ /* VERTICAL player — the column is the player's natural layout (album → title →
528
+ transport already stack); just narrow it for the vertical stage. */
529
+ .liquid-player[data-orientation="vertical"] {
530
+ inline-size: 17rem;
531
+ block-size: 25rem;
532
+ }
533
+
534
+ /* ════════════════════════════════════════════════════════════════════════════
535
+ THE ISLAND — ONE crisp glass pill that FISSIONS. The host IS the
536
+ `.dock-fission-bridge` (the library recipe owns the goo-OR-glass swap + the
537
+ --dock-split-t/--neck-t scalars). The two halves are `.dock-fission-piece`s (the
538
+ library owns their translate/squish/neck). This CSS supplies ONLY:
539
+ • the host's resting ONE-pill glass plate (the crisp pill at rest), and
540
+ • each half's content layout + a resting glass face.
541
+ NO blob layer, NO data-mode CSS switch, NO box-scale.
542
+ ════════════════════════════════════════════════════════════════════════════ */
543
+ .liquid-island-host {
544
+ /* the de-shadcn'd real <button> — reset the UA chrome (the host has no plate of
545
+ its own; the ::before is the resting glass, the bridge holds the goo). */
546
+ appearance: none;
547
+ border: none;
548
+ padding: 0;
549
+ font: inherit;
550
+ text-align: start;
551
+ background: none;
552
+ color: var(--foreground);
553
+ position: relative;
554
+ z-index: 2;
555
+ box-sizing: border-box;
556
+ inline-size: 19rem;
557
+ block-size: 3.75rem;
558
+ cursor: pointer;
559
+ border-radius: 1.875rem;
560
+ }
561
+ /* the ONE crisp glass pill at REST is the host's ::before PLATE (NOT the host's own
562
+ opacity — fading the host element would hide its children: the blob + content
563
+ layers). Real backdrop-filter + rim. The plate DISSOLVES as the split rises (the
564
+ goo-OR-glass swap — the solid blob layer fades IN over the bridge goo while THIS
565
+ plate fades out). Compositor-safe: an opacity cross-fade on the ::before keyed off
566
+ the inheriting --dock-split-t (gone by t≈0.3), never a layout animation. */
567
+ .liquid-island-host::before {
568
+ content: "";
569
+ position: absolute;
570
+ inset: 0;
571
+ z-index: 0;
572
+ border-radius: inherit;
573
+ background: var(--glass-bg-floating);
574
+ /* the blur routes through the COMPOSED `--glass-blur-floating` (radius *
575
+ --glass-level), so the a11y brackets reach the island plate too. */
576
+ -webkit-backdrop-filter: var(--glass-blur-floating);
577
+ backdrop-filter: var(--glass-blur-floating);
578
+ box-shadow:
579
+ inset 0 0 0 0.5px var(--glass-edge-light),
580
+ var(--shadow-floating);
581
+ opacity: clamp(0, calc(1 - var(--dock-split-t, 0) * 3.2), 1);
582
+ pointer-events: none;
583
+ }
584
+ /* the focus ring is the token-first `.focus-ring` utility (composed in the SFC on the
585
+ host button — the un-filtered layer). The host has NO overflow:clip, so the
586
+ utility's box-shadow ring is fully visible; the goo filter lives on the descendant
587
+ `.liquid-island-bridge`, never on the host, so the ring is never swallowed. We do
588
+ NOT re-author a ::after ring here (ONE token-first ring, the no-fork discipline). */
589
+
590
+ /* WIRE the library goo mount into the bridge's `var(--dock-fission-goo-filter)`
591
+ swap. The .dock-fission-bridge base recipe is `position:absolute; inset:0;
592
+ pointer-events:none`. Here it is the FLEX layer holding the two pieces (the demo
593
+ lays them out; the library owns the goo + the neck + the translate/squish). The
594
+ goo `filter: url()` engages ONLY while the host carries [data-fissioning] (the
595
+ descendant `[data-fissioning] .dock-fission-bridge` rule), fusing the two piece
596
+ faces + their necks into ONE metaball body that carves apart. */
597
+ /* the goo BLOB layer — the `.dock-fission-bridge` flex host. The two SOLID blob
598
+ plates (the registered fission pieces) fuse + neck under the library goo. It holds
599
+ NO text (the goo feColorMatrix threshold would mangle it) — the content rides the
600
+ un-filtered .liquid-island-content layer. The base .dock-fission-bridge is
601
+ `inset:0` so it fills the host. */
602
+ .liquid-island-bridge {
603
+ --dock-fission-goo-filter: url(#dock-fission-goo);
604
+ display: flex;
605
+ align-items: stretch;
606
+ justify-content: center;
607
+ z-index: 1;
608
+ }
609
+ /* each blob — a SOLID metaball plate (the registered `.dock-fission-piece`, which
610
+ owns the translate/squish/neck). SOLID warm fill so the goo threshold passes (a
611
+ translucent fill gets thresholded away). At rest the two abut to form ONE pill mass
612
+ (the goo at rest is OFF — the crisp host plate IS the pill); fissioning, they neck
613
+ apart. The fill matches the warm-cream glass register at full opacity (the goo
614
+ needs solid alpha; the host backdrop-filter at rest carries the real translucency). */
615
+ .liquid-island-blob {
616
+ flex: 1 1 0;
617
+ border-radius: 1.875rem;
618
+ background: color-mix(in oklab, var(--card), oklch(0.75 0.066 64) 16%);
619
+ /* the blob layer fades IN as the carve rises (so at rest the crisp host plate is
620
+ the one pill; from t>0 the solid blobs are the carved + necked mass). An
621
+ opacity cross-fade keyed off the inheriting --dock-split-t (compositor-safe). */
622
+ opacity: clamp(0, calc(var(--dock-split-t, 0) * 4), 1);
623
+ }
624
+
625
+ /* the crisp CONTENT layer — un-filtered, ON TOP of the blob layer. It overlays the
626
+ host (inset:0) and tracks the blobs via the SAME inheriting --dock-split-t scalar +
627
+ per-half vectors. Compositor-only (translate, never a layout property). */
628
+ .liquid-island-content {
629
+ position: absolute;
630
+ inset: 0;
631
+ z-index: 2;
632
+ display: flex;
633
+ align-items: stretch;
634
+ justify-content: center;
635
+ pointer-events: none;
636
+ /* the resist-aware progress mirroring the library piece (the spring scalar pulled
637
+ back by the pointer --seam-tension so the content tracks the blob exactly). */
638
+ --piece-progress: clamp(
639
+ 0,
640
+ calc(var(--dock-split-t, 0) - var(--seam-tension, 0)),
641
+ 1
642
+ );
643
+ --piece-reach: var(--dock-fission-reach, 4.5rem);
644
+ }
645
+
646
+ /* each half — a content island. A half fills its share of the content layer (flex 1)
647
+ and TRANSLATES by the same (vector · reach · progress) the library blob piece uses,
648
+ so the crisp content tracks the goo blob exactly. NO own plate (the blob below is
649
+ the surface); just the readable content + a faint top rim catch-light. */
650
+ .liquid-island {
651
+ flex: 1 1 0;
652
+ display: flex;
653
+ align-items: center;
654
+ gap: 0.5rem;
655
+ /* the OUTER inline edge clears the pill's 1.875rem rounded corner so the ring/eq
656
+ content sits WITHIN the goo-blob pill at rest (no overhang past the rounded
657
+ edge) — the rounded end needs more clearance than the straight middle. The INNER
658
+ (seam) edge stays tight so the two halves read as ONE pill. The per-half rules
659
+ below set the inner edge to the tight 0.85rem; this is the outer default. */
660
+ padding-inline: 1.15rem;
661
+ color: var(--foreground);
662
+ border-radius: 1.875rem;
663
+ }
664
+ .liquid-island-content .liquid-island {
665
+ translate:
666
+ calc(var(--half-dx, 0) * var(--piece-reach) * var(--piece-progress))
667
+ calc(var(--half-dy, 0) * var(--piece-reach) * var(--piece-progress));
668
+ will-change: transform;
669
+ }
670
+ .liquid-island--timer {
671
+ justify-content: flex-end;
672
+ text-align: end;
673
+ /* the seam (inner) edge is the RIGHT edge — keep it tight so the two halves abut
674
+ as ONE pill; the LEFT (outer, rounded) edge keeps the 1.15rem clearance. */
675
+ padding-inline-end: 0.7rem;
676
+ --half-dx: -1; /* peel LEFT (matches the timer blob's --split-dx) */
677
+ --half-dy: 0;
678
+ }
679
+ .liquid-island--music {
680
+ justify-content: flex-start;
681
+ /* the seam (inner) edge is the LEFT edge — keep it tight. */
682
+ padding-inline-start: 0.7rem;
683
+ --half-dx: 1; /* peel RIGHT (matches the music blob's --split-dx) */
684
+ --half-dy: 0;
685
+ }
686
+ .liquid-island-meta {
687
+ display: flex;
688
+ flex: 1 1 auto;
689
+ min-inline-size: 0;
690
+ flex-direction: column;
691
+ justify-content: center;
692
+ gap: 0.05rem;
693
+ overflow: hidden;
694
+ white-space: nowrap;
695
+ }
696
+ .liquid-island--timer .liquid-island-meta {
697
+ align-items: flex-end;
698
+ text-align: right;
699
+ }
700
+ .liquid-island-title {
701
+ max-inline-size: 100%;
702
+ overflow: hidden;
703
+ font-size: 0.76rem;
704
+ font-weight: 650;
705
+ line-height: 1.15;
706
+ text-overflow: ellipsis;
707
+ }
708
+ .liquid-island-sub {
709
+ max-inline-size: 100%;
710
+ overflow: hidden;
711
+ color: var(--muted-foreground);
712
+ font-size: 0.64rem;
713
+ line-height: 1.1;
714
+ text-overflow: ellipsis;
715
+ }
716
+ /* the timer glyph chip */
717
+ .liquid-island-ring {
718
+ flex: 0 0 auto;
719
+ display: grid;
720
+ place-items: center;
721
+ inline-size: 2.35rem;
722
+ block-size: 2.35rem;
723
+ border-radius: 999px;
724
+ color: var(--section-color-8);
725
+ background: color-mix(in oklab, var(--section-color-8), transparent 82%);
726
+ }
727
+ /* the album thumbnail */
728
+ .liquid-island-album {
729
+ flex: 0 0 auto;
730
+ inline-size: 2.35rem;
731
+ block-size: 2.35rem;
732
+ border-radius: 0.5rem;
733
+ background: linear-gradient(
734
+ 135deg,
735
+ var(--section-color-2),
736
+ var(--section-color-7) 72%
737
+ );
738
+ box-shadow: inset 0 0 0 0.5px color-mix(in oklab, white, transparent 60%);
739
+ }
740
+ /* the equalizer — compositor-safe scaleY bars (PRM gates the motion) */
741
+ .liquid-island-eq {
742
+ display: flex;
743
+ flex: 0 0 auto;
744
+ align-items: flex-end;
745
+ gap: 0.13rem;
746
+ block-size: 1.15rem;
747
+ }
748
+ .liquid-island-eq i {
749
+ inline-size: 0.17rem;
750
+ block-size: 1.15rem;
751
+ border-radius: 1px;
752
+ background: var(--section-color-7);
753
+ transform: scaleY(0.4);
754
+ transform-origin: bottom;
755
+ }
756
+ @media (prefers-reduced-motion: no-preference) {
757
+ .liquid-island-eq i {
758
+ animation: liquid-island-eq 0.9s ease-in-out infinite;
759
+ }
760
+ .liquid-island-eq i:nth-child(2) {
761
+ animation-delay: 0.2s;
762
+ }
763
+ .liquid-island-eq i:nth-child(3) {
764
+ animation-delay: 0.38s;
765
+ }
766
+ .liquid-island-eq i:nth-child(4) {
767
+ animation-delay: 0.1s;
768
+ }
769
+ }
770
+ @keyframes liquid-island-eq {
771
+ 0%,
772
+ 100% {
773
+ transform: scaleY(0.32);
774
+ }
775
+ 50% {
776
+ transform: scaleY(1);
777
+ }
778
+ }
779
+
780
+ /* ── VERTICAL island — a CONTENT REFLOW (a column of two stacked halves), NOT a
781
+ display:none. Both the blob layer + the content layer stack vertically; each half
782
+ reflows to a column (glyph → meta) so nothing clips. The carve runs along the
783
+ COLUMN axis — the blob fission vectors are re-pointed to dy in the SFC, and the
784
+ content half-vectors are re-pointed here. ── */
785
+ .liquid-island-host[data-orientation="vertical"] {
786
+ block-size: auto;
787
+ inline-size: 9rem;
788
+ min-block-size: 12rem;
789
+ }
790
+ .liquid-island-host[data-orientation="vertical"] .liquid-island-bridge,
791
+ .liquid-island-host[data-orientation="vertical"] .liquid-island-content {
792
+ flex-direction: column;
793
+ }
794
+ .liquid-island-host[data-orientation="vertical"] .liquid-island {
795
+ flex-direction: column;
796
+ justify-content: center;
797
+ text-align: center;
798
+ gap: 0.35rem;
799
+ /* the vertical content is CENTRED inline (the inline edges are not the carve axis),
800
+ so reset to a symmetric inline padding that sits within the narrow pill; the
801
+ block (carve) axis carries the outer/seam clearance below. */
802
+ padding-inline: 0.6rem;
803
+ padding-block: 1rem;
804
+ }
805
+ /* the carve axis swaps to the column (dy) so the content tracks the column-peeling
806
+ blobs (the SFC re-points the blob fission vectors to dy in lockstep). The OUTER
807
+ block edge clears the rounded pill end; the SEAM (inner) block edge stays tight. */
808
+ .liquid-island-host[data-orientation="vertical"] .liquid-island--timer {
809
+ justify-content: center;
810
+ padding-inline-end: 0.6rem; /* reset the horizontal seam override */
811
+ padding-block-end: 0.6rem; /* the seam is the BOTTOM edge — tight */
812
+ --half-dx: 0;
813
+ --half-dy: -1; /* peel UP */
814
+ }
815
+ .liquid-island-host[data-orientation="vertical"] .liquid-island--music {
816
+ justify-content: center;
817
+ padding-inline-start: 0.6rem; /* reset the horizontal seam override */
818
+ padding-block-start: 0.6rem; /* the seam is the TOP edge — tight */
819
+ --half-dx: 0;
820
+ --half-dy: 1; /* peel DOWN */
821
+ }
822
+ .liquid-island-host[data-orientation="vertical"] .liquid-island-meta,
823
+ .liquid-island-host[data-orientation="vertical"] .liquid-island--timer .liquid-island-meta {
824
+ align-items: center;
825
+ text-align: center;
826
+ }
827
+ .liquid-island-host[data-orientation="vertical"] .liquid-island-title,
828
+ .liquid-island-host[data-orientation="vertical"] .liquid-island-sub {
829
+ white-space: normal;
830
+ }
831
+
832
+ @media (prefers-reduced-motion: reduce) {
833
+ .liquid-pill,
834
+ .liquid-sheet,
835
+ .liquid-player {
836
+ transition: none !important;
837
+ }
838
+ /* the library fission-bridge PRM block zeroes `--dock-bridge-opacity` to hide the
839
+ goo NECK layer — but in this composition the bridge HOLDS the island pieces, so
840
+ keep the bridge (and thus the seated-apart pieces) visible. The library still
841
+ drops the neck/specular ::before/::after (display:none) under PRM; the pieces
842
+ are sync-seated at their endpoint by the orchestrator (an instant cut). */
843
+ .liquid-island-bridge {
844
+ --dock-bridge-opacity: 1;
845
+ }
846
+ /* the resting host plate stays at its split-keyed opacity (the orchestrator seats
847
+ --dock-split-t at the endpoint, so a seated-split host plate is correctly faded
848
+ and a merged one is the crisp pill — no animation, the seat is instant). */
849
+ }
850
+ }