@mkbabb/glass-ui 4.0.1 → 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 (606) hide show
  1. package/dist/{CardAction-CW7a0m8M.js → CardAction-DlVP2evz.js} +72 -53
  2. package/dist/{CommandShortcut-DvZNQ_HF.js → CommandShortcut-By-VQcLO.js} +25 -14
  3. package/dist/{ConfiguratorRow-BR4l-ixA.js → ConfiguratorRow-YMXdINHx.js} +14 -14
  4. package/dist/ContextMenuContent-CMWn6huB.js +90 -0
  5. package/dist/{ContextMenuSubContent-xol4sD2q.js → ContextMenuSubContent-DvwWCUc0.js} +16 -16
  6. package/dist/{DataTable-CuKwF7wr.js → DataTable-C4tG3eIJ.js} +4 -4
  7. package/dist/DialogContent-D8U9ZfWS.js +121 -0
  8. package/dist/DialogFooter-DoLy0ewI.js +80 -0
  9. package/dist/DialogScrollContent-BMekN7gq.js +93 -0
  10. package/dist/{FadingScroll-DI6hQhT9.js → FadingScroll-P8B30rAD.js} +1 -1
  11. package/dist/HoverCardContent-DAmGYglo.js +88 -0
  12. package/dist/{HoverPopover-CbqbNwgU.js → HoverPopover-DYpBOzzF.js} +1 -1
  13. package/dist/{IconChip-BTD-nay5.js → IconChip-CQa7XZYc.js} +7 -5
  14. package/dist/{IconTooltip-Bl8gFZ8d.js → IconTooltip-_df8M3xm.js} +1 -1
  15. package/dist/Input-CyU4_hIC.js +57 -0
  16. package/dist/{MetricBadge-RHdBP72w.js → MetricBadge-DQt_dGah.js} +1 -1
  17. package/dist/{Notification-VUwexFUf.js → Notification-BlSPJhtZ.js} +4 -4
  18. package/dist/NumberFieldContent-Z3VxGu_6.js +140 -0
  19. package/dist/PagerDots-CYlqVFd4.js +196 -0
  20. package/dist/PaperBackdrop-DYWgrnh8.js +42 -0
  21. package/dist/{PopoverContent-DL7E6vJP.js → PopoverContent-BuKyHZSz.js} +2 -2
  22. package/dist/{Progress-DctG61iZ.js → Progress-C9SsdwIZ.js} +1 -1
  23. package/dist/{ScrollingText-yOpBzFYq.js → ScrollingText-DY3W1Jfh.js} +2 -2
  24. package/dist/SelectScrollDownButton-3mFHX_R-.js +260 -0
  25. package/dist/{SelectSeparator-DXswVdRz.js → SelectSeparator-CNRGG7Ew.js} +1 -1
  26. package/dist/Separator-Cf9-JFgi.js +44 -0
  27. package/dist/Switch-uf-UKPA2.js +49 -0
  28. package/dist/{Toaster-Bw4xR8xV.js → Toaster-ozrsR4mP.js} +2 -2
  29. package/dist/{ToggleGroupItem-pEM9vIhs.js → ToggleGroupItem-BpzaVzNm.js} +6 -6
  30. package/dist/TooltipProvider-QQVM_80r.js +109 -0
  31. package/dist/animated-digit.js +2 -2
  32. package/dist/api/index.d.ts +16 -32
  33. package/dist/api/types-extra.d.ts +33 -0
  34. package/dist/api.js +2 -2
  35. package/dist/aurora.js +629 -269
  36. package/dist/badge-Bt14yURi.js +72 -0
  37. package/dist/badge.js +1 -1
  38. package/dist/border-progress.js +49 -57
  39. package/dist/button-D1W9PrzI.js +130 -0
  40. package/dist/button.js +1 -1
  41. package/dist/canvas.js +2 -3
  42. package/dist/card.js +1 -1
  43. package/dist/carousel.js +235 -106
  44. package/dist/chipVariants-BJQ0I2kB.js +18 -0
  45. package/dist/collapsible.js +1 -1
  46. package/dist/color-B9jZdhJX.js +116 -0
  47. package/dist/color.js +2 -2
  48. package/dist/command.js +1 -1
  49. package/dist/completion-seal.d.ts +1 -0
  50. package/dist/completion-seal.js +89 -0
  51. package/dist/components/custom/aurora/Aurora.vue.d.ts +10 -5
  52. package/dist/components/custom/aurora/composables/color.d.ts +13 -0
  53. package/dist/components/custom/aurora/composables/frameLoop.d.ts +9 -0
  54. package/dist/components/custom/aurora/composables/glSetup.d.ts +1 -1
  55. package/dist/components/custom/aurora/composables/runtime.d.ts +12 -0
  56. package/dist/components/custom/aurora/composables/uniformBridgeWGPU.d.ts +12 -3
  57. package/dist/components/custom/aurora/composables/wgpuSetup.d.ts +8 -0
  58. package/dist/components/custom/aurora/constants/presets.d.ts +47 -0
  59. package/dist/components/custom/aurora/constants/renderMode.d.ts +16 -8
  60. package/dist/components/custom/aurora/constants/shaders/aurora-mediums.wgsl.d.ts +1 -0
  61. package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +1 -1
  62. package/dist/components/custom/aurora/index.d.ts +1 -1
  63. package/dist/components/custom/border-progress/composables/spectrum-walk.d.ts +25 -0
  64. package/dist/components/custom/border-progress/composables/useBorderSpectrum.d.ts +14 -18
  65. package/dist/components/custom/border-progress/index.d.ts +1 -1
  66. package/dist/components/custom/completion-seal/CompletionSeal.vue.d.ts +21 -0
  67. package/dist/components/custom/completion-seal/composables/useCompletionSeal.d.ts +37 -0
  68. package/dist/components/custom/completion-seal/constants.d.ts +46 -0
  69. package/dist/components/custom/completion-seal/index.d.ts +4 -0
  70. package/dist/components/custom/concentric/Concentric.vue.d.ts +15 -12
  71. package/dist/components/custom/concentric/composables/concentricGLSetup.d.ts +12 -0
  72. package/dist/components/custom/concentric/composables/concentricWGPUSetup.d.ts +13 -0
  73. package/dist/components/custom/concentric/composables/levelField.d.ts +50 -0
  74. package/dist/components/custom/concentric/composables/uniformBridgeWGPU.d.ts +7 -3
  75. package/dist/components/custom/concentric/composables/useConcentric.d.ts +3 -3
  76. package/dist/components/custom/concentric/constants.d.ts +69 -24
  77. package/dist/components/custom/concentric/index.d.ts +2 -2
  78. package/dist/components/custom/concentric/shaders/concentric.glsl.d.ts +2 -2
  79. package/dist/components/custom/concentric/shaders/concentric.wgsl.d.ts +1 -1
  80. package/dist/components/custom/configurator/Configurator.vue.d.ts +23 -2
  81. package/dist/components/custom/configurator/index.d.ts +1 -1
  82. package/dist/components/custom/confirm-dialog/ConfirmDialog.vue.d.ts +3 -3
  83. package/dist/components/custom/constellation/Constellation.vue.d.ts +5 -4
  84. package/dist/components/custom/constellation/composables/constellationGLSetup.d.ts +10 -0
  85. package/dist/components/custom/constellation/composables/constellationWGPUSetup.d.ts +19 -0
  86. package/dist/components/custom/constellation/composables/uniformBridgeWGPU.d.ts +66 -0
  87. package/dist/components/custom/constellation/composables/useConstellation.d.ts +3 -10
  88. package/dist/components/custom/constellation/constants.d.ts +33 -0
  89. package/dist/components/custom/constellation/constellationField.d.ts +31 -1
  90. package/dist/components/custom/constellation/constellationInteraction.d.ts +23 -14
  91. package/dist/components/custom/constellation/constellationRender.d.ts +25 -0
  92. package/dist/components/custom/constellation/constellationTypes.d.ts +38 -0
  93. package/dist/components/custom/constellation/constellationWell.d.ts +15 -0
  94. package/dist/components/custom/constellation/index.d.ts +5 -5
  95. package/dist/components/custom/constellation/shaders/constellation-lines.glsl.d.ts +2 -0
  96. package/dist/components/custom/constellation/shaders/constellation-lines.wgsl.d.ts +1 -0
  97. package/dist/components/custom/constellation/shaders/constellation-points.glsl.d.ts +2 -0
  98. package/dist/components/custom/constellation/shaders/constellation-points.wgsl.d.ts +1 -0
  99. package/dist/components/custom/deck/DeckPager.vue.d.ts +29 -0
  100. package/dist/components/custom/deck/composables/useDeck.d.ts +27 -0
  101. package/dist/components/custom/deck/composables/useDeckKeyboard.d.ts +25 -0
  102. package/dist/components/custom/deck/composables/useDeckSpring.d.ts +22 -0
  103. package/dist/components/custom/deck/constants.d.ts +14 -0
  104. package/dist/components/custom/deck/index.d.ts +8 -0
  105. package/dist/components/custom/dock/DockDropdownTrigger.vue.d.ts +4 -3
  106. package/dist/components/custom/dock/DockIconButton.vue.d.ts +22 -0
  107. package/dist/components/custom/dock/DockPopoverTrigger.vue.d.ts +19 -0
  108. package/dist/components/custom/dock/DockStack.vue.d.ts +78 -0
  109. package/dist/components/custom/dock/GlassDock.vue.d.ts +21 -3
  110. package/dist/components/custom/dock/composables/dockMorphContext.d.ts +18 -32
  111. package/dist/components/custom/dock/composables/dockMorphMeasure.d.ts +78 -67
  112. package/dist/components/custom/dock/composables/index.d.ts +3 -0
  113. package/dist/components/custom/dock/composables/railProjection.d.ts +45 -0
  114. package/dist/components/custom/dock/composables/useDockContextSilhouette.d.ts +192 -0
  115. package/dist/components/custom/dock/composables/useDockFission.d.ts +158 -0
  116. package/dist/components/custom/dock/composables/useDockItemDrag.d.ts +18 -0
  117. package/dist/components/custom/dock/composables/useDockSearch.d.ts +85 -0
  118. package/dist/components/custom/dock/composables/useDockShellProps.d.ts +49 -0
  119. package/dist/components/custom/dock/constants.d.ts +32 -17
  120. package/dist/components/custom/dock/index.d.ts +8 -2
  121. package/dist/components/custom/dot-flow-field/DotFlowField.vue.d.ts +15 -11
  122. package/dist/components/custom/dot-flow-field/composables/flowField.d.ts +69 -6
  123. package/dist/components/custom/dot-flow-field/composables/flowGLProgram.d.ts +8 -0
  124. package/dist/components/custom/dot-flow-field/composables/flowSetupGL.d.ts +9 -0
  125. package/dist/components/custom/dot-flow-field/composables/flowSetupGLFlow.d.ts +12 -0
  126. package/dist/components/custom/dot-flow-field/composables/flowSetupWGPU.d.ts +7 -0
  127. package/dist/components/custom/dot-flow-field/composables/uniformBridgeWGPU.d.ts +50 -9
  128. package/dist/components/custom/dot-flow-field/composables/useDotFlowField.d.ts +6 -5
  129. package/dist/components/custom/dot-flow-field/composables/useFlowParticles.d.ts +23 -9
  130. package/dist/components/custom/dot-flow-field/constants.d.ts +92 -20
  131. package/dist/components/custom/dot-flow-field/index.d.ts +2 -2
  132. package/dist/components/custom/dot-flow-field/shaders/flow-field.compute.wgsl.d.ts +1 -1
  133. package/dist/components/custom/dot-flow-field/shaders/flow-field.glsl.d.ts +31 -18
  134. package/dist/components/custom/dot-flow-field/shaders/flow-field.render.wgsl.d.ts +2 -1
  135. package/dist/components/custom/dot-matrix/DotMatrix.vue.d.ts +43 -0
  136. package/dist/components/custom/dot-matrix/composables/dotMatrixField.d.ts +89 -0
  137. package/dist/components/custom/dot-matrix/composables/uniformBridgeWGPU.d.ts +61 -0
  138. package/dist/components/custom/dot-matrix/composables/useDotMatrix.d.ts +34 -0
  139. package/dist/components/custom/dot-matrix/composables/useDotSphere.d.ts +34 -0
  140. package/dist/components/custom/dot-matrix/constants.d.ts +72 -0
  141. package/dist/components/custom/dot-matrix/index.d.ts +5 -0
  142. package/dist/components/custom/dot-matrix/shaders/dot-matrix.glsl.d.ts +4 -0
  143. package/dist/components/custom/dot-matrix/shaders/dot-matrix.wgsl.d.ts +1 -0
  144. package/dist/components/custom/easing/EasingPicker.vue.d.ts +2 -2
  145. package/dist/components/custom/easing/composables/useEasingPicker.d.ts +5 -0
  146. package/dist/components/custom/expandable-container/ExpandableContainer.vue.d.ts +11 -0
  147. package/dist/components/custom/fourier-field/FourierField.vue.d.ts +44 -47
  148. package/dist/components/custom/fourier-field/composables/fourierFieldGLSetup.d.ts +24 -0
  149. package/dist/components/custom/fourier-field/composables/fourierFieldWGPUSetup.d.ts +31 -0
  150. package/dist/components/custom/fourier-field/composables/uniformBridgeWGPU.d.ts +56 -0
  151. package/dist/components/custom/fourier-field/composables/useFourierField.d.ts +61 -37
  152. package/dist/components/custom/fourier-field/constants.d.ts +114 -4
  153. package/dist/components/custom/fourier-field/index.d.ts +23 -18
  154. package/dist/components/custom/fourier-field/shaders/fourier-field.compute.wgsl.d.ts +1 -0
  155. package/dist/components/custom/fourier-field/shaders/fourier-field.glsl.d.ts +4 -0
  156. package/dist/components/custom/fourier-field/shaders/fourier-field.render.wgsl.d.ts +1 -0
  157. package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +9 -1
  158. package/dist/components/custom/goo-blob/composables/easing.d.ts +1 -0
  159. package/dist/components/custom/goo-blob/composables/useBlobSatellites.d.ts +1 -0
  160. package/dist/components/custom/goo-blob/constants.d.ts +26 -1
  161. package/dist/components/custom/goo-blob/index.d.ts +1 -1
  162. package/dist/components/custom/goo-blob/shaders/metaball-noise.wgsl.d.ts +1 -0
  163. package/dist/components/custom/goo-blob/shaders/metaball-palette.wgsl.d.ts +1 -0
  164. package/dist/components/custom/goo-blob/shaders/metaball-uniforms.glsl.d.ts +1 -1
  165. package/dist/components/custom/goo-blob/shaders/metaball.wgsl.d.ts +1 -1
  166. package/dist/components/custom/goo-blob/types.d.ts +86 -1
  167. package/dist/components/custom/goo-dot-matrix/GooDotMatrix.vue.d.ts +49 -0
  168. package/dist/components/custom/goo-dot-matrix/composables/gooDotLattice.d.ts +24 -0
  169. package/dist/components/custom/goo-dot-matrix/composables/gooDotSetup.d.ts +79 -0
  170. package/dist/components/custom/goo-dot-matrix/composables/uniformBridgeWGPU.d.ts +45 -0
  171. package/dist/components/custom/goo-dot-matrix/composables/useGooDotMatrix.d.ts +31 -0
  172. package/dist/components/custom/goo-dot-matrix/constants.d.ts +115 -0
  173. package/dist/components/custom/goo-dot-matrix/index.d.ts +5 -0
  174. package/dist/components/custom/goo-dot-matrix/shaders/goo-dot.frag.d.ts +13 -0
  175. package/dist/components/custom/goo-dot-matrix/shaders/goo-dot.wgsl.d.ts +4 -0
  176. package/dist/components/custom/goo-filter/GooFilter.vue.d.ts +22 -0
  177. package/dist/components/custom/goo-filter/index.d.ts +1 -0
  178. package/dist/components/custom/handmark/brush.d.ts +17 -17
  179. package/dist/components/custom/handmark/constants.d.ts +28 -8
  180. package/dist/components/custom/handmark/geometry.d.ts +34 -1
  181. package/dist/components/custom/handmark/index.d.ts +1 -1
  182. package/dist/components/custom/icon-chip/types.d.ts +10 -0
  183. package/dist/components/custom/labeled-field/LabeledField.vue.d.ts +21 -2
  184. package/dist/components/custom/metric-stack/MetricRow.vue.d.ts +15 -0
  185. package/dist/components/custom/pager-dots/PagerDots.vue.d.ts +9 -0
  186. package/dist/components/custom/pager-dots/index.d.ts +2 -0
  187. package/dist/components/custom/pager-dots/pagerWindow.d.ts +9 -0
  188. package/dist/components/custom/paper-backdrop/PaperBackdrop.vue.d.ts +18 -0
  189. package/dist/components/custom/paper-grid/PaperGrid.vue.d.ts +42 -0
  190. package/dist/components/custom/paper-grid/composables/paperGrid.d.ts +105 -0
  191. package/dist/components/custom/paper-grid/composables/paperGridGLSetup.d.ts +18 -0
  192. package/dist/components/custom/paper-grid/composables/paperGridWGPUSetup.d.ts +21 -0
  193. package/dist/components/custom/paper-grid/composables/uniformBridgeWGPU.d.ts +16 -0
  194. package/dist/components/custom/paper-grid/composables/usePaperGrid.d.ts +31 -0
  195. package/dist/components/custom/paper-grid/constants.d.ts +95 -0
  196. package/dist/components/custom/paper-grid/index.d.ts +5 -0
  197. package/dist/components/custom/paper-grid/shaders/paper-grid.glsl.d.ts +4 -0
  198. package/dist/components/custom/paper-grid/shaders/paper-grid.wgsl.d.ts +1 -0
  199. package/dist/components/custom/search/FuzzySearch.vue.d.ts +8 -2
  200. package/dist/components/custom/search/SearchBar.vue.d.ts +8 -0
  201. package/dist/components/custom/search/index.d.ts +2 -0
  202. package/dist/components/custom/search/searchVariants.d.ts +19 -0
  203. package/dist/components/custom/selectable-chip/SelectableChip.vue.d.ts +50 -0
  204. package/dist/components/custom/selectable-chip/chipVariants.d.ts +39 -0
  205. package/dist/components/custom/selectable-chip/index.d.ts +2 -0
  206. package/dist/components/custom/selectable-chip/selectableChipVariants.d.ts +15 -0
  207. package/dist/components/custom/split-chars/SplitChars.vue.d.ts +39 -0
  208. package/dist/components/custom/split-chars/index.d.ts +1 -0
  209. package/dist/components/custom/tabs/SegmentedTabs.vue.d.ts +8 -6
  210. package/dist/components/custom/tabs/constants.d.ts +28 -2
  211. package/dist/components/custom/timeline/ScrubberTimeline.vue.d.ts +16 -0
  212. package/dist/components/custom/timeline/geometry.d.ts +0 -8
  213. package/dist/components/custom/toggle-chip/index.d.ts +15 -4
  214. package/dist/components/custom/watercolor-dot/WatercolorDot.vue.d.ts +32 -17
  215. package/dist/components/custom/watercolor-dot/useWatercolorBlob.d.ts +10 -5
  216. package/dist/components/ui/_shared/index.d.ts +2 -0
  217. package/dist/components/ui/_shared/useControlSize.d.ts +46 -0
  218. package/dist/components/ui/_shared/useSurfaceAxis.d.ts +17 -3
  219. package/dist/components/ui/badge/Badge.vue.d.ts +14 -0
  220. package/dist/components/ui/badge/index.d.ts +1 -0
  221. package/dist/components/ui/button/Button.vue.d.ts +1 -0
  222. package/dist/components/ui/button/index.d.ts +1 -1
  223. package/dist/components/ui/card/Card.vue.d.ts +46 -1
  224. package/dist/components/ui/card/ScrollCard.vue.d.ts +1 -1
  225. package/dist/components/ui/card/index.d.ts +1 -1
  226. package/dist/components/ui/carousel/CarouselContent.vue.d.ts +2 -4
  227. package/dist/components/ui/carousel/CarouselNext.vue.d.ts +1 -1
  228. package/dist/components/ui/carousel/CarouselPrevious.vue.d.ts +1 -1
  229. package/dist/components/ui/command/CommandDialog.vue.d.ts +9 -3
  230. package/dist/components/ui/command/CommandList.vue.d.ts +3 -0
  231. package/dist/components/ui/context-menu/ContextMenuContent.vue.d.ts +5 -1
  232. package/dist/components/ui/dialog/DialogContent.vue.d.ts +9 -0
  233. package/dist/components/ui/drawer/Drawer.vue.d.ts +33 -14
  234. package/dist/components/ui/drawer/constants.d.ts +8 -6
  235. package/dist/components/ui/drawer/index.d.ts +12 -2
  236. package/dist/components/ui/dropdown-menu/DropdownMenuContent.vue.d.ts +4 -0
  237. package/dist/components/ui/hover-card/HoverCardContent.vue.d.ts +3 -0
  238. package/dist/components/ui/input/Input.vue.d.ts +3 -0
  239. package/dist/components/ui/number-field/NumberFieldInput.vue.d.ts +6 -1
  240. package/dist/components/ui/select/SelectContent.vue.d.ts +12 -0
  241. package/dist/components/ui/slider/Slider.vue.d.ts +9 -0
  242. package/dist/components/ui/switch/Switch.vue.d.ts +2 -0
  243. package/dist/components/ui/textarea/Textarea.vue.d.ts +3 -0
  244. package/dist/components/ui/tooltip/TooltipContent.vue.d.ts +3 -0
  245. package/dist/composables/color/index.d.ts +2 -0
  246. package/dist/composables/color/useAccentTone.d.ts +34 -0
  247. package/dist/composables/dom/index.d.ts +1 -0
  248. package/dist/composables/dom/useDragVelocity.d.ts +46 -0
  249. package/dist/composables/glass/useVizChoreography.d.ts +123 -0
  250. package/dist/composables/glass/wave/index.d.ts +4 -0
  251. package/dist/composables/glass/wave/waveField.d.ts +115 -0
  252. package/dist/composables/glass/wave/waveField.glsl.d.ts +1 -0
  253. package/dist/composables/glass/wave/waveField.wgsl.d.ts +1 -0
  254. package/dist/composables/glass/webgl/createCanvasLifecycle.d.ts +105 -2
  255. package/dist/composables/glass/webgl/shaders/flow.wgsl.d.ts +1 -0
  256. package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +40 -2
  257. package/dist/composables/glass/webgpu/index.d.ts +2 -1
  258. package/dist/composables/glass/webgpu/useGpuSubstrate.d.ts +65 -7
  259. package/dist/composables/glass/webgpu/useWebGPUCanvas.d.ts +50 -2
  260. package/dist/composables/glass/webgpu/webgpuDevice.d.ts +42 -0
  261. package/dist/composables/motion/core/index.d.ts +7 -0
  262. package/dist/composables/motion/core/useHaptic.d.ts +48 -0
  263. package/dist/composables/motion/core/writeVelocityWeight.d.ts +31 -0
  264. package/dist/composables/motion/index.d.ts +2 -0
  265. package/dist/composables/motion/scrollReader.d.ts +25 -0
  266. package/dist/composables/motion/springPresets.d.ts +19 -1
  267. package/dist/composables/motion/suite.d.ts +2 -2
  268. package/dist/composables/motion/useBloomUp.d.ts +97 -0
  269. package/dist/composables/motion/useCelebrationBurst.d.ts +50 -0
  270. package/dist/composables/motion/useCharStagger.d.ts +44 -0
  271. package/dist/composables/motion/useDockCtaReceive.d.ts +29 -22
  272. package/dist/composables/motion/useGooMorph.d.ts +72 -0
  273. package/dist/composables/motion/useLiquidFlex.d.ts +18 -0
  274. package/dist/composables/motion/useLiquidMorph.d.ts +108 -0
  275. package/dist/composables/motion/useLiquidPress.d.ts +12 -0
  276. package/dist/composables/motion/useLiquidReveal.d.ts +7 -4
  277. package/dist/composables/motion/useMorphField.d.ts +157 -0
  278. package/dist/composables/motion/useScrollChrome.d.ts +58 -0
  279. package/dist/composables/motion/useScrollPin.d.ts +49 -0
  280. package/dist/composables/motion/useScrollScene.d.ts +67 -0
  281. package/dist/composables/motion/useScrollTrigger.d.ts +67 -0
  282. package/dist/composables/motion/useSpringPress.d.ts +5 -5
  283. package/dist/composables/motion/useStaggerReveal.d.ts +24 -0
  284. package/dist/composables/sidebar/index.d.ts +4 -1
  285. package/dist/composables/sidebar/types.d.ts +68 -3
  286. package/dist/composables/sidebar/useClickDelegate.d.ts +4 -0
  287. package/dist/composables/sidebar/useLazyLoader.d.ts +5 -0
  288. package/dist/composables/sidebar/useScrollTo.d.ts +5 -0
  289. package/dist/composables/virtual/index.d.ts +4 -0
  290. package/dist/composables/virtual/useVirtualSectionWindow.d.ts +72 -0
  291. package/dist/composables/virtual/useWindowedStore.d.ts +43 -0
  292. package/dist/composables/virtual/virtualSectionLayout.d.ts +103 -0
  293. package/dist/concentric.js +552 -309
  294. package/dist/configurator.js +2 -2
  295. package/dist/confirm-dialog.js +62 -47
  296. package/dist/constellation.js +635 -235
  297. package/dist/context-menu.js +2 -2
  298. package/dist/controls.js +2 -2
  299. package/dist/createCanvasLifecycle-CuCrGRfq.js +173 -0
  300. package/dist/dark.js +1 -1
  301. package/dist/data-table.js +1 -1
  302. package/dist/deck.d.ts +1 -0
  303. package/dist/deck.js +105 -0
  304. package/dist/dialog.js +4 -3
  305. package/dist/dock.js +1320 -631
  306. package/dist/dockContext-gFVS2gMg.js +18 -0
  307. package/dist/dom.js +7 -6
  308. package/dist/dot-flow-field.js +1268 -387
  309. package/dist/dot-matrix.d.ts +1 -0
  310. package/dist/dot-matrix.js +774 -0
  311. package/dist/dotMatrixField-CRO0ZFk4.js +48 -0
  312. package/dist/drawer.js +106 -96
  313. package/dist/{dropdown-menu-CofSZuk8.js → dropdown-menu-CCfcCQ68.js} +83 -79
  314. package/dist/dropdown-menu.js +1 -1
  315. package/dist/easing.js +188 -176
  316. package/dist/expandable-container.js +43 -21
  317. package/dist/fading-scroll.js +1 -1
  318. package/dist/flow.glsl-DqEGRpl4.js +4 -0
  319. package/dist/forms.js +64 -62
  320. package/dist/fourier-field.js +1069 -178
  321. package/dist/fourier-math.js +1 -1
  322. package/dist/glass-panel.js +2 -2
  323. package/dist/glass-ui.css +1 -1
  324. package/dist/glass-ui.js +164 -119
  325. package/dist/goo-blob.js +175 -1230
  326. package/dist/goo-dot-matrix.d.ts +1 -0
  327. package/dist/goo-dot-matrix.js +811 -0
  328. package/dist/handmark.js +137 -94
  329. package/dist/header-ribbon.js +1 -1
  330. package/dist/hover-card.js +1 -1
  331. package/dist/hover-popover.js +1 -1
  332. package/dist/icon-chip.js +1 -1
  333. package/dist/icon-tooltip.js +1 -1
  334. package/dist/index.d.ts +5 -0
  335. package/dist/instrument-chassis.js +1 -1
  336. package/dist/keyboard.js +1 -1
  337. package/dist/label.js +1 -1
  338. package/dist/labeled-field.js +70 -60
  339. package/dist/metric-badge.js +1 -1
  340. package/dist/metric-cell.js +1 -1
  341. package/dist/metric-stack.js +12 -3
  342. package/dist/motion-core.js +59 -34
  343. package/dist/motion-curves.js +30 -14
  344. package/dist/motion.js +231 -96
  345. package/dist/notification.js +1 -1
  346. package/dist/number-field.js +1 -1
  347. package/dist/pager-dots.js +2 -91
  348. package/dist/paper-backdrop.js +1 -1
  349. package/dist/paper-grid.d.ts +1 -0
  350. package/dist/paper-grid.js +761 -0
  351. package/dist/paperGrid-CXCSMbZ1.js +191 -0
  352. package/dist/popover.js +1 -1
  353. package/dist/{presets-BW2b-fr1.js → presets-QvYgnFIZ.js} +14 -13
  354. package/dist/{procedural-color.glsl-CIFsJhwI.js → procedural-color.wgsl-C1Y5PkM6.js} +2 -2
  355. package/dist/progress.js +1 -1
  356. package/dist/pulse.js +2 -2
  357. package/dist/reactive.js +2 -2
  358. package/dist/{useCanvas2D-B8w_E3Rr.js → resolveCanvasColor-DsSJk06I.js} +16 -6
  359. package/dist/scrollReader-rc3Ns_NM.js +42 -0
  360. package/dist/scrolling-text.js +1 -1
  361. package/dist/search.js +162 -306
  362. package/dist/select.js +3 -3
  363. package/dist/selectable-chip.d.ts +1 -0
  364. package/dist/selectable-chip.js +48 -0
  365. package/dist/separator.js +1 -1
  366. package/dist/{sheet-tZMg0E0w.js → sheet-DUCIoOe0.js} +4 -4
  367. package/dist/sheet.js +1 -1
  368. package/dist/sidebar.js +216 -114
  369. package/dist/slider-CcICPe3u.js +149 -0
  370. package/dist/slider.js +1 -1
  371. package/dist/sortable-list.js +3 -3
  372. package/dist/spectrum-walk-cBNSx_zm.js +33 -0
  373. package/dist/springPresets-DfoQ6XRY.js +64 -0
  374. package/dist/stacked-icons.js +54 -39
  375. package/dist/styles/animations.css +13 -3
  376. package/dist/styles/cards.css +271 -2
  377. package/dist/styles/completion-seal.css +131 -0
  378. package/dist/styles/components.css +1 -4
  379. package/dist/styles/configurator.css +221 -1
  380. package/dist/styles/critical-partition.mjs +66 -11
  381. package/dist/styles/deferred.css +4 -0
  382. package/dist/styles/dock/adaptive-legibility.css +119 -0
  383. package/dist/styles/dock/cta-seat.css +87 -0
  384. package/dist/styles/dock/density.css +167 -6
  385. package/dist/styles/dock/fission-bridge.css +552 -0
  386. package/dist/styles/dock/layers.css +90 -78
  387. package/dist/styles/dock/morph-bridge.css +67 -18
  388. package/dist/styles/dock/morph.css +57 -118
  389. package/dist/styles/dock/overflow.css +12 -0
  390. package/dist/styles/dock/search.css +68 -0
  391. package/dist/styles/dock/shape.css +250 -0
  392. package/dist/styles/dock/shell.css +24 -8
  393. package/dist/styles/dock/stack-rail.css +352 -0
  394. package/dist/styles/dock-controls/dark-mode-toggle.css +17 -4
  395. package/dist/styles/dock-controls/icon-button.css +46 -0
  396. package/dist/styles/dock-controls/triggers.css +23 -1
  397. package/dist/styles/dock-controls.css +18 -0
  398. package/dist/styles/dock.css +27 -2
  399. package/dist/styles/drawer.css +166 -0
  400. package/dist/styles/glass/accent-tone.css +66 -0
  401. package/dist/styles/glass/control-surfaces.css +167 -0
  402. package/dist/styles/glass/glass-atom.css +244 -0
  403. package/dist/styles/glass/glass-capsule.css +143 -0
  404. package/dist/styles/glass/glass-chip.css +215 -0
  405. package/dist/styles/glass/ladder.css +67 -17
  406. package/dist/styles/glass/liquid-enter.css +252 -0
  407. package/dist/styles/glass/liquid-morph.css +850 -0
  408. package/dist/styles/glass/material.css +70 -1
  409. package/dist/styles/glass/reveal.css +22 -2
  410. package/dist/styles/glass/rim.css +31 -9
  411. package/dist/styles/glass/surfaces.css +81 -150
  412. package/dist/styles/glass.css +21 -0
  413. package/dist/styles/icon-chip.css +45 -0
  414. package/dist/styles/index.css +26 -0
  415. package/dist/styles/jubilance.css +65 -0
  416. package/dist/styles/motion/morph-field.css +229 -0
  417. package/dist/styles/paper.css +230 -14
  418. package/dist/styles/scroll-choreography.css +135 -78
  419. package/dist/styles/scroll-chrome.css +123 -0
  420. package/dist/styles/scroll-driven.css +38 -0
  421. package/dist/styles/segmented-tabs.css +110 -40
  422. package/dist/styles/select.css +151 -0
  423. package/dist/styles/theme/bridges.css +22 -0
  424. package/dist/styles/theme/radius.css +18 -1
  425. package/dist/styles/tokens/color-radius.css +14 -4
  426. package/dist/styles/tokens/dark-arm.css +94 -12
  427. package/dist/styles/tokens/glass-deep.css +33 -4
  428. package/dist/styles/tokens/glass-fx.css +122 -1
  429. package/dist/styles/tokens/glass.css +226 -34
  430. package/dist/styles/tokens/light-dark.css +3 -3
  431. package/dist/styles/tokens/offsets.css +27 -0
  432. package/dist/styles/tokens/property-regs.css +277 -0
  433. package/dist/styles/tokens/scale-paper.css +86 -30
  434. package/dist/styles/tokens/scheme-motion.css +106 -133
  435. package/dist/styles/tokens/scheme-spring.css +239 -0
  436. package/dist/styles/tokens/scroll-tokens.css +15 -15
  437. package/dist/styles/tokens/shadow.css +73 -13
  438. package/dist/styles/tokens/sizing-config.css +110 -0
  439. package/dist/styles/tokens/sizing.css +55 -104
  440. package/dist/styles/tokens.css +14 -2
  441. package/dist/styles/typography/semantic.css +18 -5
  442. package/dist/styles/utilities/a11y-overrides.css +20 -5
  443. package/dist/styles/utilities/base-misc.css +52 -0
  444. package/dist/styles/utilities/btn.css +84 -3
  445. package/dist/styles/utilities/components.css +31 -6
  446. package/dist/styles/utilities/metal.css +26 -0
  447. package/dist/switch.js +1 -1
  448. package/dist/tabs.js +199 -182
  449. package/dist/timeline.js +241 -206
  450. package/dist/toast.js +1 -1
  451. package/dist/toggle-chip.js +14 -41
  452. package/dist/toggle-group.js +1 -1
  453. package/dist/tooltip.js +1 -1
  454. package/dist/typewriter.js +2 -2
  455. package/dist/uniformBridgeWGPU-BCse1SHU.js +1268 -0
  456. package/dist/{useAnimatedNumber-BfUq2bUM.js → useAnimatedNumber-BntskVdQ.js} +1 -1
  457. package/dist/{useConfiguratorState-DNlOh6c8.js → useConfiguratorState-22BcULzF.js} +41 -38
  458. package/dist/useControlSize-DAZ062x7.js +9 -0
  459. package/dist/useDockCtaReceive-DX7RDb6_.js +88 -0
  460. package/dist/{useDragMorph-DgxnsVJz.js → useDragMorph-DGLSewwB.js} +4 -4
  461. package/dist/useDragVelocity-CjcfX3dA.js +57 -0
  462. package/dist/useFuzzySearch-0fTYOhS4.js +177 -0
  463. package/dist/useGooMorph-Cs13NgYL.js +104 -0
  464. package/dist/useGpuSubstrate-Ceet70xq.js +347 -0
  465. package/dist/useHaptic-CPz5BT9I.js +134 -0
  466. package/dist/{useLiquidFlex-mZPMiNXh.js → useLiquidFlex-Cc6PjVJD.js} +8 -3
  467. package/dist/useLiquidPress-CtOQ8Z0_.js +43 -0
  468. package/dist/useMorphField-ogBM7ubT.js +141 -0
  469. package/dist/usePointerVelocityField-BrkqZFhj.js +91 -0
  470. package/dist/useScrollChrome-JuImi1DM.js +258 -0
  471. package/dist/{useSpringMount-q1amq1SJ.js → useSpringMount-DFxtzmkR.js} +1 -1
  472. package/dist/useSpringPress-VM9RgVq3.js +36 -0
  473. package/dist/{useSurfaceAxis-g0NloYEF.js → useSurfaceAxis-Ci7Dnaw2.js} +1 -1
  474. package/dist/{useTouchGate-CBZTD4SD.js → useTouchGate-B1Lf9XqN.js} +1 -1
  475. package/dist/{vendor-CKmzio-i.js → vendor-B2qOlYY3.js} +24 -11
  476. package/dist/virtual.d.ts +1 -0
  477. package/dist/virtual.js +225 -0
  478. package/dist/watercolor-dot.js +107 -74
  479. package/dist/writeVelocityWeight-Bh83xZfs.js +19 -0
  480. package/package.json +140 -9
  481. package/src/styles/animations.css +13 -3
  482. package/src/styles/cards.css +271 -2
  483. package/src/styles/completion-seal.css +131 -0
  484. package/src/styles/configurator.css +221 -1
  485. package/src/styles/critical-partition.mjs +66 -11
  486. package/src/styles/dock/adaptive-legibility.css +119 -0
  487. package/src/styles/dock/cta-seat.css +87 -0
  488. package/src/styles/dock/density.css +167 -6
  489. package/src/styles/dock/fission-bridge.css +552 -0
  490. package/src/styles/dock/layers.css +90 -78
  491. package/src/styles/dock/morph-bridge.css +67 -18
  492. package/src/styles/dock/morph.css +57 -118
  493. package/src/styles/dock/overflow.css +12 -0
  494. package/src/styles/dock/search.css +68 -0
  495. package/src/styles/dock/shape.css +250 -0
  496. package/src/styles/dock/shell.css +24 -8
  497. package/src/styles/dock/stack-rail.css +352 -0
  498. package/src/styles/dock-controls/dark-mode-toggle.css +17 -4
  499. package/src/styles/dock-controls/icon-button.css +46 -0
  500. package/src/styles/dock-controls/triggers.css +23 -1
  501. package/src/styles/dock-controls.css +18 -0
  502. package/src/styles/dock.css +27 -2
  503. package/src/styles/drawer.css +164 -0
  504. package/src/styles/glass/accent-tone.css +66 -0
  505. package/src/styles/glass/control-surfaces.css +167 -0
  506. package/src/styles/glass/glass-atom.css +244 -0
  507. package/src/styles/glass/glass-capsule.css +143 -0
  508. package/src/styles/glass/glass-chip.css +215 -0
  509. package/src/styles/glass/ladder.css +67 -17
  510. package/src/styles/glass/liquid-enter.css +252 -0
  511. package/src/styles/glass/liquid-morph.css +850 -0
  512. package/src/styles/glass/material.css +70 -1
  513. package/src/styles/glass/reveal.css +22 -2
  514. package/src/styles/glass/rim.css +31 -9
  515. package/src/styles/glass/surfaces.css +81 -150
  516. package/src/styles/glass.css +21 -0
  517. package/src/styles/icon-chip.css +45 -0
  518. package/src/styles/index.css +26 -0
  519. package/src/styles/jubilance.css +65 -0
  520. package/src/styles/motion/morph-field.css +229 -0
  521. package/src/styles/paper.css +230 -14
  522. package/src/styles/scroll-choreography.css +135 -78
  523. package/src/styles/scroll-chrome.css +123 -0
  524. package/src/styles/scroll-driven.css +38 -0
  525. package/src/styles/segmented-tabs.css +110 -36
  526. package/src/styles/select.css +151 -0
  527. package/src/styles/theme/bridges.css +22 -0
  528. package/src/styles/theme/radius.css +18 -1
  529. package/src/styles/tokens/color-radius.css +14 -4
  530. package/src/styles/tokens/dark-arm.css +94 -12
  531. package/src/styles/tokens/glass-deep.css +33 -4
  532. package/src/styles/tokens/glass-fx.css +122 -1
  533. package/src/styles/tokens/glass.css +226 -34
  534. package/src/styles/tokens/light-dark.css +3 -3
  535. package/src/styles/tokens/offsets.css +27 -0
  536. package/src/styles/tokens/property-regs.css +277 -0
  537. package/src/styles/tokens/scale-paper.css +86 -30
  538. package/src/styles/tokens/scheme-motion.css +106 -133
  539. package/src/styles/tokens/scheme-spring.css +239 -0
  540. package/src/styles/tokens/scroll-tokens.css +15 -15
  541. package/src/styles/tokens/shadow.css +73 -13
  542. package/src/styles/tokens/sizing-config.css +110 -0
  543. package/src/styles/tokens/sizing.css +55 -104
  544. package/src/styles/tokens.css +14 -2
  545. package/src/styles/typography/semantic.css +18 -5
  546. package/src/styles/utilities/a11y-overrides.css +20 -5
  547. package/src/styles/utilities/base-misc.css +52 -0
  548. package/src/styles/utilities/btn.css +84 -3
  549. package/src/styles/utilities/components.css +31 -6
  550. package/src/styles/utilities/metal.css +26 -0
  551. package/dist/ContextMenuContent-uWnVxDab.js +0 -85
  552. package/dist/DialogContent-DcKK8k9i.js +0 -103
  553. package/dist/DialogFooter-BZNX5aVr.js +0 -165
  554. package/dist/HoverCardContent-b2uaAMRR.js +0 -83
  555. package/dist/Input-h9v5LeXf.js +0 -55
  556. package/dist/NumberFieldContent-Cq7EzX-U.js +0 -138
  557. package/dist/PaperBackdrop-Vf3tlpvd.js +0 -31
  558. package/dist/SelectScrollDownButton-CrA8F0iV.js +0 -252
  559. package/dist/Separator-pKF0oA4M.js +0 -37
  560. package/dist/Switch-CwYNf8bo.js +0 -47
  561. package/dist/TooltipProvider-rzvnXz60.js +0 -104
  562. package/dist/badge-D9XWW4GT.js +0 -53
  563. package/dist/button-DYCUa-tH.js +0 -126
  564. package/dist/color-DweYl7pE.js +0 -86
  565. package/dist/components/custom/concentric/composables/ringField.d.ts +0 -44
  566. package/dist/components/custom/constellation/composables/useConstellationPointer.d.ts +0 -35
  567. package/dist/components/custom/constellation/constellationDraw.d.ts +0 -30
  568. package/dist/components/custom/dock/DockRail.vue.d.ts +0 -89
  569. package/dist/createCanvasLifecycle-CHD5XrDW.js +0 -82
  570. package/dist/dockContext-BNfyPLe9.js +0 -17
  571. package/dist/procedural-color.wgsl-CToRHugY.js +0 -224
  572. package/dist/resolveCanvasColor-CUyHr5Uu.js +0 -11
  573. package/dist/slider-DVb4HXU-.js +0 -142
  574. package/dist/springPresets-CFQGQfdl.js +0 -40
  575. package/dist/styles/dock/rail-extend.css +0 -397
  576. package/dist/useLiquidPress-kfb4KX79.js +0 -39
  577. package/dist/usePointerVelocityField-JbRd5CrM.js +0 -137
  578. package/dist/useRAFLoop-UYa4zoiN.js +0 -109
  579. package/dist/useSpringPress-BsqPr7FJ.js +0 -34
  580. package/src/styles/dock/rail-extend.css +0 -397
  581. /package/dist/{CollapsibleContent-68dEXIAl.js → CollapsibleContent-D7UNsXQr.js} +0 -0
  582. /package/dist/{InstrumentChassis-Bx0F_q5g.js → InstrumentChassis-UUJX0-mW.js} +0 -0
  583. /package/dist/{Label-C2ejNWeC.js → Label-B_HPqi_q.js} +0 -0
  584. /package/dist/{ModalOverlay-D1VrWyoi.js → ModalOverlay-DfAf7o15.js} +0 -0
  585. /package/dist/{SelectGroup-DwwjicPY.js → SelectGroup-Dcczq44n.js} +0 -0
  586. /package/dist/{_plugin-vue_export-helper-C1je1s0u.js → _plugin-vue_export-helper-gLzyemvl.js} +0 -0
  587. /package/dist/{compile-CQEFRTmx.js → compile-INR_tPk_.js} +0 -0
  588. /package/dist/{constants-BPOqYJAm.js → constants-BWj7DkMn.js} +0 -0
  589. /package/dist/{createContext-CpBNTRMI.js → createContext-Cd23P9j0.js} +0 -0
  590. /package/dist/{math-BINYmg5z.js → math-5RcIgCB4.js} +0 -0
  591. /package/dist/{menuItemVariants-D8VNHq22.js → menuItemVariants-DAXquKja.js} +0 -0
  592. /package/dist/{prng-Za0Rmgag.js → prng-B5tIXTtj.js} +0 -0
  593. /package/dist/{useGlobalDark-C28t0VWJ.js → useGlobalDark-B4HO9LXG.js} +0 -0
  594. /package/dist/{useIntersectionPause-Bj4sPkMh.js → useIntersectionPause-DO8Vl4gs.js} +0 -0
  595. /package/dist/{useInterval-CvK1mL92.js → useInterval-BVUI-sez.js} +0 -0
  596. /package/dist/{useKeyboardShortcuts-BXWXOZ-9.js → useKeyboardShortcuts-BEut54Tk.js} +0 -0
  597. /package/dist/{useResizeObserver-Bpoi7tRE.js → useResizeObserver-DdEn3v2f.js} +0 -0
  598. /package/dist/{useResolveTokenColor-vAylyR0x.js → useResolveTokenColor-ChOnCckA.js} +0 -0
  599. /package/dist/{useScrollProgress-D7bYU2RK.js → useScrollProgress-A0M6qRl7.js} +0 -0
  600. /package/dist/{useSortable-DHjtZSEd.js → useSortable-DQV_UNDw.js} +0 -0
  601. /package/dist/{useTextHighlight-CWEi25hf.js → useTextHighlight-Bma3UlKA.js} +0 -0
  602. /package/dist/{useTimer-BHJOKr35.js → useTimer-BBLGPXR8.js} +0 -0
  603. /package/dist/{useUserInvalidAria-y5namzeE.js → useUserInvalidAria-EmmwWPOl.js} +0 -0
  604. /package/dist/{useViewportReady-anbac3m6.js → useViewportReady-C9pYnn7K.js} +0 -0
  605. /package/dist/{vReveal-Czsb7zQC.js → vReveal-CT1KtwZA.js} +0 -0
  606. /package/dist/{vSpecular-CQFmLNzA.js → vSpecular-EX7loENl.js} +0 -0
@@ -0,0 +1,65 @@
1
+ /* jubilance.css — BE.W-CELEBRATE-BURST — the earned glass-petal radial-bloom recipe.
2
+ *
3
+ * THE PETAL IS THE SURFACE'S OWN GLASS (CB4 / warm-cream identity). `.glass-celebration-
4
+ * petal` paints the warm-cream frosted glass material via the EXACT element-level oklab
5
+ * tint seam `glass/ladder.css` composes — `color-mix(in oklab, var(--glass-bg-floating),
6
+ * var(--glass-tint-source) var(--glass-tint-strength))` — so the petal reads as the
7
+ * surface's OWN glass, NOT a saturated confetti color. There is NO disco-grain, NO `✦`
8
+ * glyph, NO sparkle-sweep (the §6 calm register, the disco-fenced floor).
9
+ *
10
+ * THE :tone OPT-IN (the hue-keyed burst). `useCelebrationBurst({ tone })` writes
11
+ * `--glass-accent` onto each petal (the W-GLASS-ACCENT rim-tint seam); the catch-light
12
+ * core reads `--glass-specular-core` which ALREADY OKLab-mixes toward `--glass-accent ×
13
+ * --glass-accent-strength` (material.css) — so a download-complete petal blooms
14
+ * `--viz-download` through the SHARED specular cohort, never a second fork. At the default
15
+ * (no tone) `--glass-accent` is transparent → the warm-cream identity (the no-op floor).
16
+ *
17
+ * COMPOSITOR-ONLY (CB3 / proof:no-layout-animation). The recipe paints a static frosted
18
+ * pill; the per-frame motion (translate/scale/opacity/filter) is the JS rAF step's inline
19
+ * writes (compositor channels ONLY — never a layout property). The recipe carries NO
20
+ * layout-animating transition.
21
+ *
22
+ * PRM-STATIC (the vestibular floor). Under reduce the JS `burst()` spawns NO drifting
23
+ * petals (the prefersReducedMotion() branch fires only the destination chip-bloom-in
24
+ * cascade) — so there are no petals to carve here; the destination cascade is PRM-carved
25
+ * by the EXISTING icon-chip-reveal `animation: none` rule (icon-chip.css), re-used not
26
+ * re-authored. */
27
+
28
+ @layer components {
29
+ /* The short-lived overlay container the JS appends to the origin's offsetParent (one
30
+ DOM write, removed on settle). It is a zero-size anchor at the origin center; the
31
+ petals position-absolute off it. */
32
+ .glass-celebration-overlay {
33
+ position: absolute;
34
+ pointer-events: none;
35
+ }
36
+
37
+ /* The earned glass petal — the surface's OWN warm-cream frosted glass material. */
38
+ .glass-celebration-petal {
39
+ /* The petal footprint — a small pill, tokenized for the one-knob retune. */
40
+ --celebration-petal-size: 10px;
41
+ position: absolute;
42
+ inline-size: var(--celebration-petal-size);
43
+ block-size: var(--celebration-petal-size);
44
+ border-radius: var(--radius-pill, 9999px);
45
+ pointer-events: none;
46
+ /* THE WARM-CREAM GLASS (CB4) — the EXACT element-level oklab tint seam ladder.css
47
+ composes for every glass rung. NOT a saturated bg-<hue>/raw-Tailwind confetti
48
+ color: the petal reads as the surface's own frosted glass. */
49
+ background: color-mix(
50
+ in oklab,
51
+ var(--glass-bg-floating, color-mix(in oklab, var(--card), white 8%)),
52
+ var(--glass-tint-source, transparent) var(--glass-tint-strength, 0%)
53
+ );
54
+ /* A sub-perceptual warm-cream catch-light — reads the SHARED --glass-specular-core
55
+ (which carries the --glass-accent :tone opt-in via material.css's oklab mix), a
56
+ soft inner gleam so the petal reads as lit glass, never a flat slab. NO second
57
+ specular fork, NO disco. */
58
+ box-shadow:
59
+ inset 0 0 0 0.5px
60
+ color-mix(in oklab, var(--glass-specular-core, hsl(40 35% 92%)) 40%, transparent),
61
+ 0 1px 3px color-mix(in oklab, var(--foreground), transparent 86%);
62
+ /* will-change promotes ONLY the compositor channels the JS step writes. */
63
+ will-change: transform, opacity, filter;
64
+ }
65
+ }
@@ -0,0 +1,229 @@
1
+ /* motion/morph-field.css — BD.W-MORPH-FIELD-WELD — the ONE morph-field RECIPE.
2
+ *
3
+ * The body / neck / waist recipe + the DEDICATED squish channel every `useMorphField`
4
+ * consumer paints over. The weld JS (useMorphField.ts) writes the drive-derived custom
5
+ * properties once per frame (`--morph-squish`, `--morph-neck-girth`, `--morph-neck-gap`,
6
+ * `--morph-k`, `--morph-waist`, `--morph-specular-angle`); this sheet projects them onto
7
+ * the body + neck silhouettes. The MORPH_SIGNATURES rows live in the JS (motion-named
8
+ * DATA); this sheet is signature-agnostic — it paints whatever the masses carry.
9
+ *
10
+ * THE DEDICATED SQUISH CHANNEL (the dock-core hardening fence). The volume-preserving
11
+ * squish writes `--morph-squish`, NEVER `--stretch` (the 6-JS-owner + the
12
+ * `--dock-morph-max-stretch:1.14` clobber). A morph that ALSO rides --stretch (the dock
13
+ * collapse) keeps its own channel; the weld owns this one. Registered @property so a bare
14
+ * var() INTERPOLATES the ramp (the --dock-morph-t precedent).
15
+ *
16
+ * DETERMINISM (motion-canon P5 / the M5 scalar-binding). Every axis below is
17
+ * `f(var(--morph-*))` (the weld's drive-derived writes) — NEVER a CSS animation/transition
18
+ * with its own clock. A frame at a given drive value is byte-reproducible. Compositor-only
19
+ * (transform / scale / clip-path / opacity / --* — ZERO animated layout property).
20
+ *
21
+ * THE CARTOON PUNCH (welded IN, gated on the SHIPPED Band-0 tokens). The body squash rides
22
+ * `--morph-squish × --motion-weight`; the ink cast rides the `--shadow-cartoon-*` rung
23
+ * (never a hex literal, never an animated box-shadow); the neck specular-sweep lags the
24
+ * geometry (follow-through). `--motion-weight` and `--ease-cartoon-punch` are SHIPPED (P1,
25
+ * scheme-motion.css), so the punch is LIVE (not skipped); PRM zeroes --motion-weight → the
26
+ * squash/arc/cast collapse in ONE assignment.
27
+ *
28
+ * CROSS-ENGINE (§L7). The goo `<filter>` is the ONE `<GooFilter>` mount's REGULAR
29
+ * `filter:url(#…)` (NEVER backdrop-filter — bug 245510), applied on a SIBLING goo LAYER,
30
+ * never an ANCESTOR of glass (an ancestor filter kills backdrop-filter on descendants in
31
+ * both engines). The clip-path hourglass waist is the Tier-C cross-engine FLOOR under the
32
+ * filter — a concave waist on BOTH engines before any blur fuses it. The filter is gated to
33
+ * `[data-morphing]` (never a steady-state re-blur — the Safari budget fence). */
34
+
35
+ /* The dedicated squish channel + the neck-drive channels — typed INHERITING @property so a
36
+ bare var() INTERPOLATES (the --dock-morph-t/--neck-t precedent). The weld writes them on
37
+ the host; descendant bodies + neck read the inheriting values. */
38
+ @property --morph-squish {
39
+ syntax: "<number>";
40
+ inherits: true;
41
+ initial-value: 1;
42
+ }
43
+ @property --morph-neck-girth {
44
+ syntax: "<number>";
45
+ inherits: true;
46
+ initial-value: 0;
47
+ }
48
+ @property --morph-k {
49
+ syntax: "<number>";
50
+ inherits: true;
51
+ initial-value: 1;
52
+ }
53
+ @property --morph-waist {
54
+ syntax: "<number>";
55
+ inherits: true;
56
+ initial-value: 1;
57
+ }
58
+ @property --morph-specular-angle {
59
+ syntax: "<angle>";
60
+ inherits: true;
61
+ initial-value: 0deg;
62
+ }
63
+
64
+ @layer components {
65
+ /* The morph FIELD host — the sibling goo LAYER the filter applies to (never an
66
+ ancestor of glass). The weld writes the drive-derived channels here; the bodies +
67
+ neck live under it and read the inheriting values. The filter engages ONLY while the
68
+ morph is in-flight (`[data-morphing]`) — crisp at rest, gooey during the merge. */
69
+ .morph-field {
70
+ position: relative;
71
+ pointer-events: none;
72
+ /* isolation keeps the blur/threshold scoped to the masses, not the page behind. */
73
+ isolation: isolate;
74
+ filter: none;
75
+ }
76
+ /* Gate the goo filter to the in-flight window — the §L7 Safari budget fence (no
77
+ steady-state re-blur). The weld sets `[data-morphing]` on the host (or the consumer
78
+ does). The filter id is the consumer's tuned instance off the ONE <GooFilter> mount
79
+ (`url(#glass-goo)` / `url(#pager-goo)` / `url(#dock-morph-goo)` / `url(#morph-goo)`),
80
+ passed via `--morph-goo-filter`. The REGULAR filter property (Safari-correct). */
81
+ [data-morphing].morph-field,
82
+ [data-morphing] .morph-field {
83
+ filter: var(--morph-goo-filter, url(#morph-goo));
84
+ }
85
+
86
+ /* A morph BODY — a warm-cream domed-droplet mass the weld translates/squashes. The fill
87
+ is the SAME six-layer warm-glass register the whole library reads (NEVER gray — the
88
+ transparent-plate bug the showcase had is exactly this fill being absent). The
89
+ transform is written INLINE by the weld (translate + scale); this sheet supplies the
90
+ resting silhouette + fill + the cast. */
91
+ .morph-body {
92
+ position: absolute;
93
+ border-radius: 999px;
94
+ /* the warm-cream domed droplet — a soft radial so the goo threshold reads a domed
95
+ mass, not a flat slab; transmissive (~0.55-0.80 α) so the colorful field reads
96
+ THROUGH it. Reads the shared --glass-* cohort (warm-cream identity, both modes). */
97
+ background: radial-gradient(
98
+ 120% 120% at 50% 38%,
99
+ var(--glass-bg-floating, color-mix(in oklab, var(--card), white 8%)) 0%,
100
+ var(--glass-bg-resting, var(--card)) 62%,
101
+ color-mix(in oklab, var(--card), var(--foreground) 6%) 100%
102
+ );
103
+ /* a 1px inner catch-light rim (the §3 defined edge) — the crisp metaball rim. */
104
+ box-shadow: inset 0 1px 0 0 color-mix(in oklab, white 22%, transparent);
105
+ overflow: clip;
106
+ transform-origin: center;
107
+ will-change: transform;
108
+ }
109
+
110
+ /* The welling NECK — the concave-throat filament between the two outermost bodies. Its
111
+ girth WELLS on `--morph-neck-girth` (peak mid, ~0 at the ends → no ghost throat at
112
+ rest) and its clip-path carves the structural hourglass waist (the Tier-C floor, both
113
+ engines, BEFORE the filter fuses it). The weld writes its transform inline (translate
114
+ + scaleX span + scaleY girth); this sheet supplies the fill + the waist clip + the
115
+ specular sweep. */
116
+ .morph-neck {
117
+ position: absolute;
118
+ border-radius: 999px;
119
+ background: radial-gradient(
120
+ 130% 130% at 50% 40%,
121
+ var(--glass-bg-floating, color-mix(in oklab, var(--card), white 8%)) 0%,
122
+ var(--glass-bg-resting, var(--card)) 70%,
123
+ color-mix(in oklab, var(--card), var(--foreground) 6%) 100%
124
+ );
125
+ /* THE CONCAVE WAIST — the clip-path hourglass pinches the throat toward the
126
+ centerline as the gap-fraction k narrows (the structural local-minimum waist read
127
+ on BOTH engines before the blur). The inset GROWS from the rim as the waist
128
+ tightens (`1 - --morph-waist`), `round 999px` so the throat is a gel capsule. */
129
+ --neck-pinch: calc((1 - clamp(0, var(--morph-waist, 1), 1)) * 42%);
130
+ clip-path: inset(var(--neck-pinch) 0 var(--neck-pinch) 0 round 999px);
131
+ /* the neck is visible EXACTLY while it wells (the opacity is the girth). */
132
+ opacity: var(--morph-neck-girth, 0);
133
+ transform-origin: center;
134
+ overflow: clip;
135
+ will-change: transform, clip-path, opacity;
136
+ }
137
+
138
+ /* THE NECK SPECULAR-SWEEP (follow-through) — a moving catch-light bending along the
139
+ throat as it stretches, reading the SHARED --glass-specular-core cohort (NO fork).
140
+ The conic angle LAGS the geometry (`--morph-specular-angle` carries the 60° trail the
141
+ weld writes). plus-lighter additive; a non-supporting engine degrades to a plain warm
142
+ overlay. */
143
+ .morph-neck::after {
144
+ content: "";
145
+ position: absolute;
146
+ inset: 0;
147
+ border-radius: 999px;
148
+ pointer-events: none;
149
+ background: conic-gradient(
150
+ from var(--morph-specular-angle, 0deg) at 50% 50%,
151
+ transparent 0deg,
152
+ color-mix(
153
+ in srgb,
154
+ var(--glass-specular-core, hsl(40 35% 92%)) 55%,
155
+ transparent
156
+ ) 18deg,
157
+ transparent 60deg,
158
+ transparent 360deg
159
+ );
160
+ opacity: calc(
161
+ var(--glass-specular-intensity-rest, 0.12) +
162
+ clamp(0, var(--morph-neck-girth, 0), 1) * 0.18
163
+ );
164
+ mix-blend-mode: plus-lighter;
165
+ will-change: opacity;
166
+ }
167
+
168
+ /* THE 1940s INK CAST (solid drawing — the most ALIVE detail). A `::after` caster on the
169
+ FIELD that slides OPPOSITE the morph motion and DEEPENS mid-merge, pooling darkest at
170
+ the thinnest waist (the mass is heaviest where the neck is thinnest). On the REAL
171
+ `--shadow-cartoon-*` rung (never a hex, never an animated box-shadow — a compositor
172
+ translate of a soft radial). Gated on `--motion-weight` so PRM zeroes it. */
173
+ .morph-field::after {
174
+ content: "";
175
+ position: absolute;
176
+ inset: 0;
177
+ z-index: -1;
178
+ pointer-events: none;
179
+ border-radius: inherit;
180
+ /* the cast plane reads the cartoon shadow rung (the cards.css cohort) — a soft warm
181
+ ink pool that deepens as the waist thins. No hex; reads --shadow-color. */
182
+ background: radial-gradient(
183
+ 60% 40% at 50% 60%,
184
+ color-mix(
185
+ in srgb,
186
+ var(--shadow-color, var(--foreground))
187
+ calc(
188
+ (18% + (1 - clamp(0, var(--morph-waist, 1), 1)) * 22%) *
189
+ var(--motion-weight, 0)
190
+ ),
191
+ transparent
192
+ )
193
+ 0%,
194
+ transparent 72%
195
+ );
196
+ /* slide OPPOSITE the morph — the cast trails the mass. The offset is the neck girth
197
+ × weight (deepest at mid-merge), on the cross axis. Compositor translate only. */
198
+ translate: 0
199
+ calc(var(--morph-neck-girth, 0) * 6px * var(--motion-weight, 0));
200
+ will-change: transform, background;
201
+ }
202
+
203
+ /* PRM (motion-canon P6 / §L5) — the goo layer drops, the neck never paints, the cast +
204
+ sweep are static-off; --motion-weight 0 (the :root PRM carve in scheme-motion.css)
205
+ already zeroes the squash/arc/cast amplitude. The morph still CONFIRMS (the weld's
206
+ seat() places one resting mass at the endpoint). */
207
+ @media (prefers-reduced-motion: reduce) {
208
+ [data-morphing].morph-field,
209
+ [data-morphing] .morph-field {
210
+ filter: none;
211
+ }
212
+ .morph-neck,
213
+ .morph-neck::after,
214
+ .morph-field::after {
215
+ display: none;
216
+ }
217
+ }
218
+
219
+ /* @supports floor — no `filter:url()` (the WebKit teardrop floor / a gap engine): the
220
+ clip-path hourglass waist on .morph-neck is the structural cross-engine FLOOR; the
221
+ bodies + the welling neck still read as a metaball via the clip-path waist alone (no
222
+ filter fuse). The morph degrades by SOFTENING, never to a non-morph crossfade. */
223
+ @supports not (filter: url("#morph-goo")) {
224
+ [data-morphing].morph-field,
225
+ [data-morphing] .morph-field {
226
+ filter: none;
227
+ }
228
+ }
229
+ }
@@ -1,29 +1,68 @@
1
1
  /*
2
- * paper.css — Paper-texture primitives
2
+ * paper.css — Paper-texture primitives (BD.W-PAPER-MORPHISM, the texture+blend
3
+ * redesign — the grain/grit must be PLAINLY VISIBLE; if you squint, it FAILS).
3
4
  *
4
5
  * Two composable Tailwind `@utility` declarations:
5
- * - paper-underpaint: fixed, app-root, fullscreen SVG turbulence at z-index -1
6
- * - paper-grain-overlay: ::after overlay for individual surfaces
6
+ * - paper-underpaint: fixed, app-root, fullscreen tooth texture at z-index -1
7
+ * - paper-grain-overlay: ::after tooth overlay for individual surfaces
7
8
  *
8
- * Texture: feTurbulence baseFrequency 0.65, 4 octaves, desaturated via
9
- * feColorMatrix, blended multiply (light) / soft-light (dark). Tiles ~60px.
9
+ * THE FIX (the headline): the prior `feTurbulence bf=0.65 4-oct` + `feBlend
10
+ * multiply in2=SourceGraphic` cloud was a self-cancelling no-op — a fine cloud
11
+ * averaged to grey on hiDPI, and `overlay`/`soft-light` collapse to IDENTITY
12
+ * against a near-white cream wash (L≈0.98) / near-black ink wash (the blends only
13
+ * bite mid-grey backdrops; the paper register lives on the poles). Measured std
14
+ * 0.02–0.86 — invisible by math.
15
+ *
16
+ * THE TEXTURE — `--paper-grain-tooth`: a COARSE anisotropic grey-RGB speckle
17
+ * (`baseFrequency='0.04 0.09'` = grain direction, 2 octaves), KEEP the RGB
18
+ * (`feColorMatrix saturate=0` → grey, never zero it), per-channel
19
+ * `feComponentTransfer` slope-1.8/intercept-(-0.4) CONTRAST-STRETCH (the
20
+ * letterpress bite) + `feFuncA slope=0 intercept=1` (FULL OPAQUE alpha — the
21
+ * grey speckle is painted straight, the blend carries the darken/lighten; NOT the
22
+ * lens-A luminance→alpha matrix that gives a near-empty texture). `<filter
23
+ * color-interpolation-filters='sRGB'>` pins sRGB (identical Chrome↔Safari,
24
+ * deterministic seed). NO `feBlend` mud op. Tile 140px (coarse tooth reads as
25
+ * STRUCTURE, survives hiDPI, divides cleanly DPR 1/2/3).
26
+ *
27
+ * THE BLEND LAW (the decisive, physically-true move): `multiply` (light — ink
28
+ * sinks into the paper's pits → darken) / `screen` (dark — fiber catches light →
29
+ * lighten). Baseline, sRGB-safe, identical both engines. Plain per-mode arms.
30
+ *
31
+ * THE ALPHA: `--paper-grain-opacity` re-calibrated to the JND floor (light 0.22 /
32
+ * dark 0.16 — glass-fx.css / dark-arm.css; the inversion the measurements force:
33
+ * multiply on cream is gentle → MORE, screen on ink bites hard → LESS).
34
+ *
35
+ * The LIBRARY FENCE: `--glass-grain-opacity` (0.025/0.045) is BYTE-UNTOUCHED — the
36
+ * calm glass identity stands; paper is loud, glass is a whisper. That separation
37
+ * IS the design.
10
38
  */
11
39
 
40
+ /* The ONE coarse-tooth texture — DRY single source, both utilities resolve it.
41
+ Painted onto a rect at full alpha (`feFuncA slope=0 intercept=1`); the
42
+ mix-blend-mode carries the visibility. sRGB-pinned, deterministic seed. */
43
+ :root {
44
+ --paper-grain-tooth: url("data:image/svg+xml,%3Csvg width='140' height='140' viewBox='0 0 140 140' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='t' x='0' y='0' width='100%25' height='100%25' color-interpolation-filters='sRGB'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.04 0.09' numOctaves='2' seed='7' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3CfeComponentTransfer%3E%3CfeFuncR type='linear' slope='1.8' intercept='-0.4'/%3E%3CfeFuncG type='linear' slope='1.8' intercept='-0.4'/%3E%3CfeFuncB type='linear' slope='1.8' intercept='-0.4'/%3E%3CfeFuncA type='linear' slope='0' intercept='1'/%3E%3C/feComponentTransfer%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23t)'/%3E%3C/svg%3E");
45
+ --paper-grain-tile: 140px;
46
+ }
47
+
12
48
  @utility paper-underpaint {
13
49
  position: fixed;
14
50
  inset: 0;
15
51
  z-index: -1;
16
52
  pointer-events: none;
17
- background-image: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='4' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3CfeBlend mode='multiply' in2='SourceGraphic'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='1'/%3E%3C/svg%3E");
53
+ background-image: var(--paper-grain-tooth);
18
54
  background-repeat: repeat;
19
- background-size: 60px 60px;
20
- opacity: var(--glass-grain-opacity);
55
+ background-size: var(--paper-grain-tile) var(--paper-grain-tile);
56
+ opacity: var(--paper-grain-opacity, var(--glass-grain-opacity));
57
+ /* LIGHT: ink sinks into the cream → multiply darkens the valleys. */
21
58
  mix-blend-mode: multiply;
22
59
  }
23
60
 
24
61
  :where(.dark) .paper-underpaint,
25
62
  .dark .paper-underpaint {
26
- mix-blend-mode: soft-light;
63
+ /* DARK: fiber catches light off the ink → screen lifts (NOT soft-light, which
64
+ collapses to identity on the near-black pole — the self-cancelling defect). */
65
+ mix-blend-mode: screen;
27
66
  }
28
67
 
29
68
  @utility paper-grain-overlay {
@@ -36,23 +75,200 @@
36
75
  inset: 0;
37
76
  border-radius: inherit;
38
77
  pointer-events: none;
39
- background-image: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='4' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3CfeBlend mode='multiply' in2='SourceGraphic'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='1'/%3E%3C/svg%3E");
78
+ background-image: var(--paper-grain-tooth);
40
79
  background-repeat: repeat;
41
- background-size: 60px 60px;
42
- opacity: var(--glass-grain-opacity);
43
- mix-blend-mode: overlay;
80
+ background-size: var(--paper-grain-tile) var(--paper-grain-tile);
81
+ opacity: var(--paper-grain-opacity, var(--glass-grain-opacity));
82
+ /* LIGHT tooth: multiply — the physically-true ink-into-pits darken (NOT
83
+ overlay, which is identity on the L≈0.98 cream pole). */
84
+ mix-blend-mode: multiply;
44
85
  }
45
86
  }
46
87
 
47
88
  :where(.dark) .paper-grain-overlay::after,
48
89
  .dark .paper-grain-overlay::after {
49
- mix-blend-mode: soft-light;
90
+ /* DARK tooth: screen — fiber catches light off the ink (NOT soft-light). */
91
+ mix-blend-mode: screen;
92
+ }
93
+
94
+ /* ═══════════════════════════════════════════════════════════════════════
95
+ BD.W-PAGE-FIELD / BD.W-GLASS-FIELD — the WARM COLORFUL FIELD register
96
+ ───────────────────────────────────────────────────────────────────────
97
+ The single highest-leverage piece: it turns the gray storybook WARM. A
98
+ per-route four-layer technicolor CEL (amber key → terracotta mid → sand
99
+ bounce + a warm over-glaze toward the --glass-key corner) PLUS a wide
100
+ low-chroma BASE WASH that raises the floor everywhere, painted at FIELD
101
+ lightness (L 0.90-0.93 light / 0.28-0.34 dark — where the gamut admits
102
+ REAL chroma, NOT the gamut-bound L0.98 plate) OVER the decoupled
103
+ --neutral-0 floor (KEEP-NEUTRAL, untouched, never deleted).
104
+
105
+ ONE primitive, TWO acceptance floors (glass-floor ~0.012 composite-behind-
106
+ glass + field-floor 0.045 ground). The library glass material is BYTE-
107
+ UNTOUCHED — it finally has a backdrop worthy of it.
108
+
109
+ THE WARM-BOUND IS A PAINT INVARIANT: --field-h clamps the route's
110
+ --field-h-raw to [25,95] IN THE CSS calc, so an inline raw:210 CANNOT
111
+ paint teal/navy. The teal/navy purge is enforced at the paint layer.
112
+
113
+ OPT-IN: the warm stops only render under `[data-paper-field]` (the demo
114
+ chassis sets it per glass route) — the calm neutral underpaint stays the
115
+ default for solid-chrome routes; --neutral-0 stays decoupled + calm.
116
+
117
+ CROSS-ENGINE: pure compositor CSS — radial/conic-gradient + oklch() +
118
+ transform only. NO backdrop-filter:url, NO SVG goo, NO trig. oklch ≥ Safari
119
+ 15.4, @property ≥ 16.4, gradients/transform forever. The WebKit premultiply-
120
+ toward-black desaturation hole is dodged: every warm 0-alpha stop is an
121
+ explicit `oklch(L C H / 0)` warm color, NEVER bare `transparent`.
122
+ ═══════════════════════════════════════════════════════════════════════ */
123
+
124
+ /* The warm-bound: clamp the route's raw hue request to [25,95]. A DISTINCT
125
+ var (NOT self-referential `--field-h: max(var(--field-h),…)` which is a
126
+ no-op) — the route writes --field-h-raw, the field resolves --field-h.
127
+ Set on the field element itself so the clamp resolves even when the chassis
128
+ writes --field-h-raw on an ancestor. */
129
+ .paper-field {
130
+ --field-h: clamp(25, var(--field-h-raw, 62), 95);
131
+ }
132
+
133
+ /* The warm-cel GROUND — a dedicated fixed plane the chassis mounts UNDER the
134
+ grain (the grain `.paper-underpaint` rides on top at its 0.22 multiply
135
+ opacity; the field paints true at full opacity / normal blend, so the grain
136
+ does NOT crush the pigment). ONE <PaperBackdrop field> component emits both,
137
+ stacked — one backdrop mount, grain on top, warm field below. */
138
+ .paper-field {
139
+ position: fixed;
140
+ inset: 0;
141
+ /* one step BELOW the grain underpaint (the chassis mounts the grain at
142
+ -z-10) so the grain rides ON TOP of the warm field — one backdrop, two
143
+ stacked planes. Still above the page floor (content is z 0+). */
144
+ z-index: -11;
145
+ pointer-events: none;
146
+ /* L4 warm over-glaze — a faint cel sheen brightest toward the upper-right
147
+ --glass-key corner (cel coherence: field + glass rim/cast share ONE key).
148
+ --glass-key is a KEYWORD (upper-right), so the glaze is positioned by a
149
+ fixed `at`/`from` matching it — NEVER a `-58deg`/keyword-as-angle bug. */
150
+ background:
151
+ conic-gradient(
152
+ from -45deg at 78% 22%,
153
+ oklch(0.96 0.05 calc(var(--field-h) + 6) / calc(0.30 * var(--field-intensity))),
154
+ oklch(0.96 0.05 calc(var(--field-h) + 6) / 0) 28%,
155
+ oklch(0.96 0.05 calc(var(--field-h) + 6) / 0) 72%,
156
+ oklch(0.96 0.05 calc(var(--field-h) + 6) / calc(0.18 * var(--field-intensity)))
157
+ ),
158
+ /* the wide warm BASE WASH — raises the floor EVERYWHERE (no flat gap). */
159
+ radial-gradient(
160
+ 120% 100% at 50% 50%,
161
+ oklch(0.91 0.075 calc(var(--field-h) + 8) / calc(0.50 * var(--field-intensity))),
162
+ oklch(0.91 0.075 calc(var(--field-h) + 8) / 0) 100%
163
+ ),
164
+ /* L3 sand fill-light bounce (bottom-right). */
165
+ radial-gradient(
166
+ 95% 80% at 80% 88%,
167
+ oklch(0.88 0.115 calc(var(--field-h) + 30) / calc(0.90 * var(--field-intensity))),
168
+ oklch(0.88 0.115 calc(var(--field-h) + 30) / 0) 70%
169
+ ),
170
+ /* L2 terracotta saturated mid (right band, where the cards sit). */
171
+ radial-gradient(
172
+ 95% 78% at 78% 30%,
173
+ oklch(0.85 0.145 calc(var(--field-h) - 24) / calc(0.90 * var(--field-intensity))),
174
+ oklch(0.85 0.145 calc(var(--field-h) - 24) / 0) 72%
175
+ ),
176
+ /* L1 amber key mass (densest pigment, top-left toward the key-light). */
177
+ radial-gradient(
178
+ 100% 84% at 24% 20%,
179
+ oklch(0.87 0.155 calc(var(--field-h)) / calc(0.95 * var(--field-intensity))),
180
+ oklch(0.87 0.155 calc(var(--field-h)) / 0) 75%
181
+ ),
182
+ var(--neutral-0); /* L0 the KEEP-NEUTRAL solid floor — decoupled. */
183
+ }
184
+
185
+ /* DARK: warm-LUMINOUS — lower L, KEEP chroma; NEVER gray-charcoal. Plain
186
+ ancestor `.dark .x` (a scoped :global(.dark) silently drops; this is a
187
+ non-scoped global stylesheet so a plain `.dark` ancestor is correct). */
188
+ .dark .paper-field {
189
+ background:
190
+ conic-gradient(
191
+ from -45deg at 78% 22%,
192
+ oklch(0.42 0.05 calc(var(--field-h) + 6) / calc(0.30 * var(--field-intensity))),
193
+ oklch(0.42 0.05 calc(var(--field-h) + 6) / 0) 28%,
194
+ oklch(0.42 0.05 calc(var(--field-h) + 6) / 0) 72%,
195
+ oklch(0.42 0.05 calc(var(--field-h) + 6) / calc(0.18 * var(--field-intensity)))
196
+ ),
197
+ radial-gradient(
198
+ 120% 100% at 50% 50%,
199
+ oklch(0.30 0.055 calc(var(--field-h) + 8) / calc(0.50 * var(--field-intensity))),
200
+ oklch(0.30 0.055 calc(var(--field-h) + 8) / 0) 100%
201
+ ),
202
+ radial-gradient(
203
+ 95% 80% at 80% 88%,
204
+ oklch(0.34 0.085 calc(var(--field-h) + 30) / calc(0.90 * var(--field-intensity))),
205
+ oklch(0.34 0.085 calc(var(--field-h) + 30) / 0) 70%
206
+ ),
207
+ radial-gradient(
208
+ 95% 78% at 78% 30%,
209
+ oklch(0.33 0.10 calc(var(--field-h) - 24) / calc(0.90 * var(--field-intensity))),
210
+ oklch(0.33 0.10 calc(var(--field-h) - 24) / 0) 72%
211
+ ),
212
+ radial-gradient(
213
+ 100% 84% at 24% 20%,
214
+ oklch(0.36 0.11 calc(var(--field-h)) / calc(0.95 * var(--field-intensity))),
215
+ oklch(0.36 0.11 calc(var(--field-h)) / 0) 75%
216
+ ),
217
+ var(--neutral-0);
218
+ }
219
+
220
+ /* The CARTOON DRIFT — liquid-weight on the ground: anticipation (pull-back) →
221
+ arc sweep (translate + rotate on ONE curve) → follow-through overshoot, baked
222
+ by --ease-cartoon-punch (DEPEND on BD.W-CARTOON-PUNCH, no literal-cubic dup).
223
+ Rides a `::before` copy of the bg (the field plane has a FREE ::before, no
224
+ collision with the grain). The warm stops survive PRM; only the drift
225
+ freezes. */
226
+ .paper-field::before {
227
+ content: "";
228
+ position: absolute;
229
+ inset: -28%;
230
+ background: inherit;
231
+ opacity: 0.72;
232
+ pointer-events: none;
233
+ animation: field-cel-drift 42s
234
+ var(--ease-cartoon-punch, cubic-bezier(0.5, -0.2, 0.4, 1.2)) infinite
235
+ alternate;
236
+ will-change: transform;
237
+ content-visibility: auto;
238
+ }
239
+
240
+ @keyframes field-cel-drift {
241
+ /* independent translate:/scale:/rotate: LONGHANDS — a `transform: scale()`
242
+ shorthand would clobber the translate centering (build-trap e). */
243
+ from {
244
+ translate: -1.5% 1%;
245
+ scale: 1;
246
+ rotate: -1.2deg;
247
+ }
248
+ to {
249
+ translate: 2.5% -2.5%;
250
+ scale: 1.07;
251
+ rotate: 2.4deg;
252
+ }
50
253
  }
51
254
 
52
255
  /* ═══════════════════════════════════════════════
53
256
  A11y — respect user motion + transparency preferences
54
257
  ═══════════════════════════════════════════════ */
258
+ @media (prefers-reduced-motion: reduce) {
259
+ /* the drift freezes — the warm field STAYS (it is content, not motion). */
260
+ .paper-field::before {
261
+ animation: none;
262
+ }
263
+ }
264
+
55
265
  @media (prefers-reduced-transparency: reduce) {
266
+ /* the warm stops drop to 0-alpha; the decoupled --neutral-0 floor shows
267
+ (the calm opaque legibility floor). The field is a transmissive
268
+ enhancement, NEVER a legibility dependency. */
269
+ .paper-field {
270
+ --field-intensity: 0;
271
+ }
56
272
  .paper-underpaint,
57
273
  .paper-grain-overlay::after {
58
274
  opacity: 0;