@mkbabb/glass-ui 3.2.0 → 3.4.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 (306) hide show
  1. package/dist/{CardFooter-3-VGho1J.js → CardFooter-C390imy7.js} +2 -2
  2. package/dist/{CollapsibleContent-wlmlDujU.js → CollapsibleContent-cauTbZEM.js} +1 -1
  3. package/dist/{CommandShortcut-C6lsz3pG.js → CommandShortcut-BiVyqipe.js} +5 -4
  4. package/dist/DataTable-FfkaAg2z.js +465 -0
  5. package/dist/DialogContent-IQ8_BRrC.js +100 -0
  6. package/dist/{DiscoGlyph-B7YooI2-.js → DiscoGlyph-BaZ8OawK.js} +1 -1
  7. package/dist/{GlyphFace-Bvk6OIas.js → GlyphFace-B_7vOmYn.js} +1 -1
  8. package/dist/HoverPopover-DTSYkJtw.js +96 -0
  9. package/dist/{IconTooltip-DXveGjx7.js → IconTooltip-BTyYn4mr.js} +1 -1
  10. package/dist/Input-CU9CNKmo.js +52 -0
  11. package/dist/{MetricBadge-J_GBCb8e.js → MetricBadge-BlrdbOGN.js} +1 -1
  12. package/dist/{NumberFieldContent-B6L6YrQz.js → NumberFieldContent-iOTQ5rGO.js} +8 -4
  13. package/dist/{PopoverContent-CxEEUL7Y.js → PopoverContent-B8WtJECb.js} +1 -1
  14. package/dist/Progress-DjM86vfb.js +254 -0
  15. package/dist/{ScrollingText-1Qjnwz6H.js → ScrollingText-P9o_DuMn.js} +1 -1
  16. package/dist/{SelectScrollDownButton-BvvvAbuh.js → SelectScrollDownButton-BGn3rjs9.js} +9 -8
  17. package/dist/TabsIndicator-DA0x9gPr.js +97 -0
  18. package/dist/{ToggleGroupItem-Cy7xHFEo.js → ToggleGroupItem-gyXj998A.js} +37 -40
  19. package/dist/UnderlineTabs-Cq_AD03t.js +39 -0
  20. package/dist/animated-digit.js +2 -2
  21. package/dist/api/index.d.ts +2 -0
  22. package/dist/api.js +1 -1
  23. package/dist/aurora.js +454 -271
  24. package/dist/{button-DS3ULf5i.js → button-Ckn3eDfB.js} +27 -22
  25. package/dist/button.js +1 -1
  26. package/dist/card.js +1 -1
  27. package/dist/carousel.js +2 -2
  28. package/dist/collapsible.js +1 -1
  29. package/dist/color-rkK4RMx2.js +33 -0
  30. package/dist/color.d.ts +1 -0
  31. package/dist/color.js +2 -0
  32. package/dist/command.js +1 -1
  33. package/dist/compile-DVgAxagk.js +106 -0
  34. package/dist/components/custom/animated-digit/AnimatedDigit.vue.d.ts +7 -7
  35. package/dist/components/custom/aurora/Aurora.vue.d.ts +3 -3
  36. package/dist/components/custom/aurora/composables/color.d.ts +3 -25
  37. package/dist/components/custom/aurora/composables/cursorModel.d.ts +45 -0
  38. package/dist/components/custom/aurora/composables/frameLoop.d.ts +30 -0
  39. package/dist/components/custom/aurora/composables/glSetup.d.ts +29 -0
  40. package/dist/components/custom/aurora/composables/runtime.d.ts +45 -35
  41. package/dist/components/custom/aurora/composables/uniformBridge.d.ts +67 -0
  42. package/dist/components/custom/aurora/composables/useAurora.d.ts +14 -1
  43. package/dist/components/custom/aurora/composables/useCursorInteraction.d.ts +1 -1
  44. package/dist/components/custom/aurora/constants/budget.d.ts +50 -0
  45. package/dist/components/custom/aurora/{presets.d.ts → constants/presets.d.ts} +2 -5
  46. package/dist/components/custom/aurora/constants/shaders/aurora.frag.d.ts +1 -0
  47. package/dist/components/custom/aurora/constants/shaders/brush.glsl.d.ts +1 -0
  48. package/dist/components/custom/aurora/constants/shaders/composition.glsl.d.ts +1 -0
  49. package/dist/components/custom/aurora/constants/shaders/flow.glsl.d.ts +1 -0
  50. package/dist/components/custom/aurora/constants/shaders/mediums.glsl.d.ts +2 -0
  51. package/dist/components/custom/aurora/constants/shaders/tonemap.glsl.d.ts +1 -0
  52. package/dist/components/custom/aurora/index.d.ts +2 -2
  53. package/dist/components/custom/configurator/ConfiguratorLayer.vue.d.ts +14 -7
  54. package/dist/components/custom/configurator/density.d.ts +3 -8
  55. package/dist/components/custom/dock/DockBackgroundToggle.vue.d.ts +46 -0
  56. package/dist/components/custom/dock/DockIconButton.vue.d.ts +3 -3
  57. package/dist/components/custom/dock/DockLayerGroup.vue.d.ts +2 -2
  58. package/dist/components/custom/dock/GlassDock.vue.d.ts +22 -18
  59. package/dist/components/custom/dock/composables/dockContext.d.ts +4 -4
  60. package/dist/components/custom/dock/composables/dockLayerContext.d.ts +13 -6
  61. package/dist/components/custom/dock/composables/useLayerTransition.d.ts +32 -8
  62. package/dist/components/custom/dock/index.d.ts +1 -0
  63. package/dist/components/custom/expandable-container/ExpandableContainer.vue.d.ts +10 -0
  64. package/dist/components/custom/glass-panel/GlassPanel.vue.d.ts +1 -1
  65. package/dist/components/custom/glyph-face/keys.d.ts +3 -29
  66. package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +48 -0
  67. package/dist/components/custom/goo-blob/composables/easing.d.ts +6 -0
  68. package/dist/components/custom/goo-blob/composables/useBlobMood.d.ts +14 -0
  69. package/dist/components/custom/goo-blob/composables/useBlobPointer.d.ts +18 -0
  70. package/dist/components/custom/goo-blob/composables/useBlobSatellites.d.ts +13 -0
  71. package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +42 -0
  72. package/dist/components/custom/goo-blob/index.d.ts +7 -0
  73. package/dist/components/custom/goo-blob/shaders/metaball.frag.d.ts +1 -0
  74. package/dist/components/custom/goo-blob/shaders/metaball.vert.d.ts +1 -0
  75. package/dist/components/custom/goo-blob/shaders/oklch-perturb.glsl.d.ts +1 -0
  76. package/dist/components/custom/goo-blob/shaders/sdf-body.glsl.d.ts +1 -0
  77. package/dist/components/custom/goo-blob/shaders/watercolor-edges.glsl.d.ts +2 -0
  78. package/dist/components/custom/goo-blob/types.d.ts +77 -0
  79. package/dist/components/custom/hover-popover/HoverPopover.vue.d.ts +48 -9
  80. package/dist/components/custom/labeled-field/LabeledField.vue.d.ts +2 -0
  81. package/dist/components/custom/labeled-field/LabeledSelect.vue.d.ts +2 -2
  82. package/dist/components/custom/metric-stack/MetricRow.vue.d.ts +2 -2
  83. package/dist/components/custom/responsive-tabs/ResponsiveTabs.vue.d.ts +13 -7
  84. package/dist/components/custom/search/FuzzySearch.vue.d.ts +1 -1
  85. package/dist/components/custom/search/SearchBar.vue.d.ts +1 -1
  86. package/dist/components/custom/sortable-list/SortableHandle.vue.d.ts +7 -1
  87. package/dist/components/custom/sortable-list/context.d.ts +2 -3
  88. package/dist/components/custom/tabs/BouncyTabs.vue.d.ts +6 -3
  89. package/dist/components/custom/tabs/BouncyToggle.vue.d.ts +7 -3
  90. package/dist/components/custom/tabs/UnderlineTabs.vue.d.ts +6 -3
  91. package/dist/components/custom/tabs/composables/useBouncySlider.d.ts +39 -0
  92. package/dist/components/custom/timeline/ContinuousMarkers.vue.d.ts +49 -0
  93. package/dist/components/custom/timeline/ContinuousRail.vue.d.ts +26 -0
  94. package/dist/components/custom/timeline/ContinuousTimeline.vue.d.ts +4 -4
  95. package/dist/components/custom/typewriter/TypewriterText.vue.d.ts +2 -2
  96. package/dist/components/custom/watercolor-dot/WatercolorDot.vue.d.ts +45 -0
  97. package/dist/components/custom/watercolor-dot/index.d.ts +3 -0
  98. package/dist/components/custom/watercolor-dot/prng.d.ts +5 -0
  99. package/dist/components/custom/watercolor-dot/useWatercolorBlob.d.ts +24 -0
  100. package/dist/components/ui/_shared/menuItemVariants.d.ts +1 -1
  101. package/dist/components/ui/avatar/Avatar.vue.d.ts +1 -1
  102. package/dist/components/ui/avatar/AvatarImage.vue.d.ts +5 -1
  103. package/dist/components/ui/avatar/index.d.ts +1 -1
  104. package/dist/components/ui/badge/index.d.ts +2 -2
  105. package/dist/components/ui/button/Button.vue.d.ts +3 -1
  106. package/dist/components/ui/button/index.d.ts +2 -2
  107. package/dist/components/ui/carousel/CarouselNext.vue.d.ts +2 -2
  108. package/dist/components/ui/carousel/CarouselPrevious.vue.d.ts +2 -2
  109. package/dist/components/ui/combobox/Combobox.vue.d.ts +2 -2
  110. package/dist/components/ui/combobox/ComboboxInput.vue.d.ts +2 -1
  111. package/dist/components/ui/command/Command.vue.d.ts +3 -3
  112. package/dist/components/ui/command/CommandInput.vue.d.ts +2 -1
  113. package/dist/components/ui/data-table/DataTable.vue.d.ts +5 -4
  114. package/dist/components/ui/dialog/DialogContent.vue.d.ts +8 -0
  115. package/dist/components/ui/drawer/Drawer.vue.d.ts +4 -4
  116. package/dist/components/ui/input/Input.vue.d.ts +19 -1
  117. package/dist/components/ui/multi-select/MultiSelect.vue.d.ts +8 -4
  118. package/dist/components/ui/progress/Progress.vue.d.ts +26 -88
  119. package/dist/components/ui/progress/ProgressDefault.vue.d.ts +14 -0
  120. package/dist/components/ui/progress/ProgressGradient.vue.d.ts +25 -0
  121. package/dist/components/ui/progress/ProgressSectioned.vue.d.ts +36 -0
  122. package/dist/components/ui/progress/index.d.ts +5 -2
  123. package/dist/components/ui/progress/useProgressGeometry.d.ts +60 -0
  124. package/dist/components/ui/select/Select.vue.d.ts +2 -2
  125. package/dist/components/ui/select/SelectContent.vue.d.ts +1 -1
  126. package/dist/components/ui/select/SelectTrigger.vue.d.ts +3 -0
  127. package/dist/components/ui/sheet/index.d.ts +1 -1
  128. package/dist/components/ui/slider/index.d.ts +12 -11
  129. package/dist/components/ui/tags-input/TagsInput.vue.d.ts +2 -2
  130. package/dist/components/ui/textarea/Textarea.vue.d.ts +5 -1
  131. package/dist/components/ui/toast/Toast.vue.d.ts +4 -4
  132. package/dist/components/ui/toggle/Toggle.vue.d.ts +1 -1
  133. package/dist/components/ui/toggle/index.d.ts +1 -1
  134. package/dist/components/ui/toggle-group/toggleGroupContext.d.ts +2 -3
  135. package/dist/composables/color/index.d.ts +49 -0
  136. package/dist/composables/context/createContext.d.ts +56 -0
  137. package/dist/composables/context/index.d.ts +1 -0
  138. package/dist/composables/dark/darkModeSyncScript.d.ts +23 -0
  139. package/dist/composables/dark/index.d.ts +3 -0
  140. package/dist/composables/dark/useGlobalDark.d.ts +19 -2
  141. package/dist/composables/dom/index.d.ts +0 -3
  142. package/dist/composables/dom/useClipboard.d.ts +35 -12
  143. package/dist/composables/dom/useDocumentVisibility.d.ts +20 -0
  144. package/dist/composables/glass/webgl/compile.d.ts +15 -0
  145. package/dist/composables/glass/webgl/shaders/procedural-color.glsl.d.ts +3 -0
  146. package/dist/composables/glass/webgl/useWebGLCanvas.d.ts +55 -0
  147. package/dist/composables/motion/core/index.d.ts +1 -1
  148. package/dist/composables/motion/index.d.ts +1 -1
  149. package/dist/composables/motion/useCountup.d.ts +29 -0
  150. package/dist/composables/motion/useNumericTransition.d.ts +14 -3
  151. package/dist/composables/motion/vReveal.d.ts +2 -0
  152. package/dist/composables/sidebar/useSidebarState.d.ts +2 -2
  153. package/dist/composables/sortable/dragController.d.ts +44 -0
  154. package/dist/composables/sortable/dropResolver.d.ts +34 -0
  155. package/dist/composables/sortable/ghostRenderer.d.ts +44 -0
  156. package/dist/composables/sortable/index.d.ts +1 -1
  157. package/dist/composables/sortable/touchGate.d.ts +26 -0
  158. package/dist/composables/sortable/transitionTiming.d.ts +50 -0
  159. package/dist/composables/sortable/types.d.ts +133 -0
  160. package/dist/composables/sortable/useSortable.d.ts +25 -153
  161. package/dist/configurator.js +1 -1
  162. package/dist/confirm-dialog.js +1 -1
  163. package/dist/controls.js +4 -4
  164. package/dist/createContext-DBMGRlx4.js +25 -0
  165. package/dist/dark.d.ts +2 -1
  166. package/dist/dark.js +9 -2
  167. package/dist/data-table.js +1 -1
  168. package/dist/dialog.js +1 -1
  169. package/dist/disco-glyph.js +1 -1
  170. package/dist/dock.js +400 -261
  171. package/dist/dockContext-spUj_-E5.js +9 -0
  172. package/dist/dom.js +6 -6
  173. package/dist/{dropdown-menu-naE0skDg.js → dropdown-menu-EFjl5iKo.js} +1 -1
  174. package/dist/dropdown-menu.js +1 -1
  175. package/dist/expandable-container.js +26 -20
  176. package/dist/fonts/README.md +21 -0
  177. package/dist/fonts/fraunces/fraunces-latin.woff2 +0 -0
  178. package/dist/forms.js +68 -59
  179. package/dist/glass-panel.js +1 -1
  180. package/dist/glass-ui.css +1 -1
  181. package/dist/glass-ui.js +226 -328
  182. package/dist/glyph-face.js +2 -2
  183. package/dist/goo-blob.d.ts +1 -0
  184. package/dist/goo-blob.js +538 -0
  185. package/dist/header-ribbon.js +2 -2
  186. package/dist/hover-card.js +1 -1
  187. package/dist/hover-popover.js +1 -1
  188. package/dist/icon-tooltip.js +1 -1
  189. package/dist/index.d.ts +1 -0
  190. package/dist/instrument-chassis.js +1 -1
  191. package/dist/instrument-rail.js +1 -1
  192. package/dist/keys-BFoma9vm.js +9 -0
  193. package/dist/label.js +1 -1
  194. package/dist/labeled-field.js +57 -39
  195. package/dist/metric-badge.js +1 -1
  196. package/dist/motion-core.js +82 -123
  197. package/dist/motion.js +62 -14
  198. package/dist/number-field.js +1 -1
  199. package/dist/paper-backdrop.js +1 -1
  200. package/dist/popover.js +1 -1
  201. package/dist/{presets-BpTf63Hp.js → presets-1OhFpaIC.js} +1 -1
  202. package/dist/prng-Bz_1Tydc.js +15 -0
  203. package/dist/progress.js +2 -2
  204. package/dist/reactive.js +2 -2
  205. package/dist/responsive-tabs.js +38 -32
  206. package/dist/scrolling-text.js +1 -1
  207. package/dist/search.js +8 -8
  208. package/dist/select.js +3 -3
  209. package/dist/separator.js +1 -1
  210. package/dist/sheet.js +1 -1
  211. package/dist/{slider-wx8ifVFB.js → slider-BOh8ycfZ.js} +7 -11
  212. package/dist/slider.js +1 -1
  213. package/dist/sortable-list.js +36 -38
  214. package/dist/stacked-icons.js +2 -2
  215. package/dist/styles/animations.css +1 -1
  216. package/dist/styles/cards.css +1 -1
  217. package/dist/styles/components.css +1 -1
  218. package/dist/styles/dock-controls.css +486 -0
  219. package/dist/styles/dock.css +284 -450
  220. package/dist/styles/fonts.css +25 -0
  221. package/dist/styles/glass-specular-track.css +154 -0
  222. package/dist/styles/glass.css +74 -2
  223. package/dist/styles/index.css +21 -2
  224. package/dist/styles/instrument-chassis.css +11 -4
  225. package/dist/styles/theme.css +73 -21
  226. package/dist/styles/tokens.css +271 -140
  227. package/dist/styles/typography.css +14 -8
  228. package/dist/styles/utilities.css +36 -8
  229. package/dist/styles/view-transition.css +10 -4
  230. package/dist/switch.js +1 -1
  231. package/dist/tabs.js +139 -112
  232. package/dist/timeline.js +219 -158
  233. package/dist/toast.js +1 -1
  234. package/dist/toggle-group.js +1 -1
  235. package/dist/tokens.d.ts +1 -1
  236. package/dist/tooltip.js +1 -1
  237. package/dist/{useAnimatedNumber-BOxrS3a6.js → useAnimatedNumber-BF6r64lA.js} +1 -1
  238. package/dist/useClipboard-D8vFyRCa.js +97 -0
  239. package/dist/{useConfiguratorState-Dq2gNv4A.js → useConfiguratorState-DUtC1jxr.js} +82 -86
  240. package/dist/useGlobalDark-CWiaCoEw.js +34 -0
  241. package/dist/useIntersectionPause-DAdVPVp4.js +53 -0
  242. package/dist/useSortable-DnyGXKKY.js +246 -0
  243. package/dist/{useTouchGate-XX8gHfay.js → useTouchGate-CS5Csc2h.js} +1 -1
  244. package/dist/utils/prng.d.ts +4 -0
  245. package/dist/vReveal-u2wSG2El.js +35 -0
  246. package/dist/watercolor-dot.d.ts +1 -0
  247. package/dist/watercolor-dot.js +129 -0
  248. package/package.json +101 -16
  249. package/src/fonts/README.md +21 -0
  250. package/src/fonts/fraunces/fraunces-latin.woff2 +0 -0
  251. package/src/styles/animations.css +1 -1
  252. package/src/styles/cards.css +1 -1
  253. package/src/styles/dock-controls.css +486 -0
  254. package/src/styles/dock.css +284 -450
  255. package/src/styles/fonts.css +25 -0
  256. package/src/styles/glass-specular-track.css +154 -0
  257. package/src/styles/glass.css +74 -2
  258. package/src/styles/index.css +21 -2
  259. package/src/styles/instrument-chassis.css +11 -4
  260. package/src/styles/theme.css +73 -21
  261. package/src/styles/tokens.css +271 -140
  262. package/src/styles/typography.css +14 -8
  263. package/src/styles/utilities.css +36 -8
  264. package/src/styles/view-transition.css +10 -4
  265. package/dist/DataTable-BsrDYdoE.js +0 -460
  266. package/dist/DialogContent-B61rP8lj.js +0 -93
  267. package/dist/HoverPopover-BlEwqG7S.js +0 -96
  268. package/dist/Input-IFsIzId2.js +0 -30
  269. package/dist/Progress-Bs44qWEM.js +0 -126
  270. package/dist/UnderlineTabs-B4FV2zi_.js +0 -37
  271. package/dist/components/custom/aurora/shaders/aurora.frag.d.ts +0 -1
  272. package/dist/composables/dom/useBreakpoint.d.ts +0 -38
  273. package/dist/composables/dom/useIdleReady.d.ts +0 -63
  274. package/dist/composables/dom/useViewportReady.d.ts +0 -87
  275. package/dist/composables/glass/webgl/frostShader.d.ts +0 -27
  276. package/dist/composables/motion/useAnimatedNumberMap.d.ts +0 -29
  277. package/dist/composables/motion/useStagger.d.ts +0 -50
  278. package/dist/dockContext-DM58L1Jt.js +0 -16
  279. package/dist/keys-SIKQYNx1.js +0 -11
  280. package/dist/supportsCssTimeline-IQY3gfKD.js +0 -12
  281. package/dist/useGlobalDark-BUUTZvkU.js +0 -24
  282. package/dist/useIdleReady-sLhGo6CL.js +0 -162
  283. package/dist/useIntersectionPause-CUmANkoc.js +0 -39
  284. package/dist/useSortable-DLK9kwZp.js +0 -189
  285. /package/dist/{HoverCardContent-DGUhpRVt.js → HoverCardContent-ICfIMZX1.js} +0 -0
  286. /package/dist/{InstrumentChassis-CqKPBNqp.js → InstrumentChassis-DaHIZCqy.js} +0 -0
  287. /package/dist/{InstrumentRail-CCjvKkpB.js → InstrumentRail-B0qqLFN0.js} +0 -0
  288. /package/dist/{Label-D53EOwLE.js → Label-CZk-3nTc.js} +0 -0
  289. /package/dist/{PaperBackdrop-Ds-wDsKf.js → PaperBackdrop-D_YZW47j.js} +0 -0
  290. /package/dist/{SelectGroup-DAgcsfFw.js → SelectGroup-CMdoCjRE.js} +0 -0
  291. /package/dist/{SelectSeparator-DN1jzLaI.js → SelectSeparator-CaJnPF3_.js} +0 -0
  292. /package/dist/{Separator-DXxac0j8.js → Separator-C2XtAXRp.js} +0 -0
  293. /package/dist/{Switch-imA0Hdjs.js → Switch-x8n6husW.js} +0 -0
  294. /package/dist/{Toaster-Brs6QjBU.js → Toaster-DdhMKfus.js} +0 -0
  295. /package/dist/{TooltipProvider-MZFRxOvT.js → TooltipProvider-D-JrSqDu.js} +0 -0
  296. /package/dist/components/custom/aurora/{renderMode.d.ts → constants/renderMode.d.ts} +0 -0
  297. /package/dist/components/custom/aurora/{shaders → constants/shaders}/aurora.vert.d.ts +0 -0
  298. /package/dist/{constants-DfWPi8kh.js → constants-DsCdlK9I.js} +0 -0
  299. /package/dist/{sheet-BnvZRXPq.js → sheet-CQYYrkr9.js} +0 -0
  300. /package/dist/{useGlassRenderer-C98tZnJ7.js → useGlassRenderer-Dn3WpfG-.js} +0 -0
  301. /package/dist/{useInterval-B58LmYth.js → useInterval-CHVYFpXV.js} +0 -0
  302. /package/dist/{useResizeObserver-C_7GjpRn.js → useResizeObserver-DX-STszm.js} +0 -0
  303. /package/dist/{useTextHighlight-CLST6an0.js → useTextHighlight-Dmtofpk2.js} +0 -0
  304. /package/dist/{useTimer-6FoosoDY.js → useTimer-DGgoxTXL.js} +0 -0
  305. /package/dist/{useUserInvalidAria-BW5iyqWR.js → useUserInvalidAria-DmvZ_6Dx.js} +0 -0
  306. /package/dist/{useViewTransition-CUJM7fXT.js → useViewTransition-D4ssvnXZ.js} +0 -0
@@ -141,3 +141,28 @@
141
141
  U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
142
142
  U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
143
143
  }
144
+
145
+ /* ═══════════════════════════════════════════════
146
+ OFL FACE FILES — Fraunces (ornamental display)
147
+ ═══════════════════════════════════════════════ */
148
+
149
+ /* Fraunces — Latin subset (basic Latin + ASCII punctuation + common
150
+ diacritics). The FULL variable font: a single woff2 carries wght 100..900
151
+ AND the opsz / SOFT / WONK axes typography.css drives
152
+ (`--font-display-variation-settings: "WONK" 1, "SOFT" 0`). Before AU.W4 the
153
+ `--font-stack-display: "Fraunces"` token (tokens.css:43) had NO shipped face,
154
+ so those axes were SILENTLY INERT (the slipped ship of the grand-audit/AS.W0b
155
+ lineage); this face resolves the dangling display token. `font-display: swap`
156
+ — the display register is a deliberate ornament, post-LCP, with the body
157
+ carried by the calibrated sans/mono fallbacks. */
158
+ @font-face {
159
+ font-family: "Fraunces";
160
+ font-style: normal;
161
+ font-weight: 100 900;
162
+ font-display: swap;
163
+ src: url("@mkbabb/glass-ui/fonts/fraunces/fraunces-latin.woff2") format("woff2");
164
+ unicode-range:
165
+ U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
166
+ U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122,
167
+ U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
168
+ }
@@ -0,0 +1,154 @@
1
+ /* Pointer-anchored moving specular — the iOS-26 Liquid Glass illuminate-from-
2
+ * within behaviour (AV.W15 M2, the HEADLINE fold).
3
+ *
4
+ * A masked radial-gradient catch-light rides the material surface at the
5
+ * pointer position. The consumer writes the pointer location onto the element
6
+ * as `--mouse-x` / `--mouse-y` (percentages) via a thin pointer-listener; this
7
+ * rung maps those onto the typed `--specular-x` / `--specular-y` properties
8
+ * (registered in tokens.css §11b) and paints a `radial-gradient(circle at …)`
9
+ * over a `mask-image` so the glow stays clipped to the glass plate and travels
10
+ * with the cursor — "the light travels around the material / illuminate under
11
+ * your fingertip".
12
+ *
13
+ * Baseline floors: `@property` 2024-07-09 (the smooth position interpolation),
14
+ * CSS `mask-image` 2023-12-07 (the surface-clip). Both carry a `var()` fallback
15
+ * so an engine without typed-property animation still paints a centred catch-
16
+ * light, and an engine without `mask` still paints the radial (unmasked but
17
+ * surface-bounded by the `::before` `inset: 0` + `border-radius: inherit`).
18
+ *
19
+ * The pointer-position WRITE (`--mouse-x` / `--mouse-y`) is the consumer's seam
20
+ * (DockIconButton wires it; Button glass + Card hover opt in). The CSS half —
21
+ * the masked radial, the reduced-motion static bracket, the var() fallback, the
22
+ * @supports-gated refraction garnish — is the deliverable here.
23
+ */
24
+
25
+ @layer components {
26
+ /* The opt-in class. A `::before` pseudo carries the moving catch-light so it
27
+ composes over the host's own glass background/blur without a second
28
+ backdrop-filter (no glass-on-glass — the specular is a LIGHT layer, not a
29
+ second plate). The host need not be positioned-relative by us; the five
30
+ glass tiers + the dock + Button already mint `position: relative`. */
31
+ .glass-specular-track::before {
32
+ content: "";
33
+ position: absolute;
34
+ inset: 0;
35
+ border-radius: inherit;
36
+ pointer-events: none;
37
+ z-index: 1;
38
+ /* Map the consumer's pointer write onto the typed properties, ON THE
39
+ PSEUDO. The `--mouse-x/--mouse-y` write lands on the HOST (inline
40
+ style); those are UNREGISTERED custom properties, so they inherit
41
+ down to this `::before` naturally. The registered `--specular-*`
42
+ props are `inherits: false` (per-surface ownership), which means a
43
+ `::before` does NOT see a value set on its originating element — so
44
+ the mapping must be declared HERE, on the pseudo, where it owns its
45
+ own typed value. The `var(--mouse-x, 50%)` floor is the centred
46
+ fallback: an engine that never receives a pointer write paints a
47
+ centred catch-light, never a broken/absent one. */
48
+ --specular-x: var(--mouse-x, 50%);
49
+ --specular-y: var(--mouse-y, 50%);
50
+ /* The catch-light intensity floor at rest; hover/active lift it (the
51
+ pseudo-targeting rules below). Registered `<number>`, so the layer
52
+ opacity it drives interpolates smoothly. */
53
+ --specular-intensity: 0.35;
54
+ /* The travelling catch-light. A soft circular glow centred on the
55
+ tracked pointer position; the warm-white tint keeps the warm-cream
56
+ identity (NOT iOS blue). The gradient carries FIXED stop alphas — the
57
+ `--specular-intensity` multiplier drives the layer `opacity` below
58
+ (NOT a `calc()` in the stop alpha: a registered-`@property` `var()`
59
+ nested in `calc()` inside an `hsl()` alpha inside a gradient does not
60
+ substitute in Chromium — it computes to 0. Driving the whole layer's
61
+ `opacity` is both correct AND the cleaner model — intensity IS a
62
+ layer brightness, not a per-stop axis). */
63
+ background: radial-gradient(
64
+ circle at var(--specular-x, 50%) var(--specular-y, 50%),
65
+ hsl(40 30% 100% / 0.55) 0%,
66
+ hsl(40 30% 100% / 0.22) 22%,
67
+ transparent 55%
68
+ );
69
+ opacity: var(--specular-intensity, 0.35);
70
+ /* Clip the glow to the plate so it rides the surface (the "light travels
71
+ AROUND the material" read). `mask-image` Baseline 2023-12-07; a
72
+ non-supporting engine ignores it and the `inset: 0` + radius-inherit
73
+ already bound the glow to the host rectangle. */
74
+ mask-image: radial-gradient(
75
+ circle at var(--specular-x, 50%) var(--specular-y, 50%),
76
+ black 0%,
77
+ black 55%,
78
+ transparent 75%
79
+ );
80
+ mix-blend-mode: screen;
81
+ /* Smooth the position + intensity between pointer samples. The typed
82
+ `@property` registrations make the percentage stops interpolable, so
83
+ the catch-light position SETTLES rather than snapping frame-to-frame;
84
+ the intensity rides the layer `opacity` transition. */
85
+ transition:
86
+ --specular-x var(--duration-fast, 150ms) var(--ease-standard, ease-out),
87
+ --specular-y var(--duration-fast, 150ms) var(--ease-standard, ease-out),
88
+ opacity var(--duration-normal, 240ms) var(--ease-standard, ease-out);
89
+ }
90
+
91
+ .dark .glass-specular-track::before {
92
+ /* Softer over the deep canvas — the screen blend lifts harder on dark. */
93
+ --specular-intensity: 0.22;
94
+ }
95
+
96
+ /* Hover/active lift the intensity — the "illuminate under your fingertip"
97
+ brighten on engagement; settles back on leave via the opacity transition
98
+ above. The rules target the `::before` (the intensity lives on the pseudo
99
+ — see the mapping note above). */
100
+ .glass-specular-track:hover::before {
101
+ --specular-intensity: 0.6;
102
+ }
103
+ .glass-specular-track:active::before {
104
+ --specular-intensity: 0.85;
105
+ }
106
+ }
107
+
108
+ /* ── Reduced-motion: pin the specular STATIC ───────────────────────────────
109
+ The MANDATORY guard. Under `prefers-reduced-motion: reduce` the catch-light
110
+ paints static at rest position — no pointer-tracking (the position pins to
111
+ centre, ignoring the consumer's `--mouse-x/--mouse-y` write), no transition
112
+ animation. The centred catch-light + the warm-cream tint survive; only the
113
+ MOTION is removed. The pin + the `transition: none` live on the `::before`
114
+ (where the typed `--specular-*` props are owned), overriding the pointer-map
115
+ above by order — the `var(--mouse-x)` write is ignored, the catch-light pins
116
+ centred. */
117
+ @media (prefers-reduced-motion: reduce) {
118
+ .glass-specular-track::before {
119
+ --specular-x: 50%;
120
+ --specular-y: 50%;
121
+ transition: none;
122
+ }
123
+ }
124
+
125
+ /* ── Reduced-transparency: drop the specular ───────────────────────────────
126
+ When the user requests reduced transparency the surface goes opaque (the
127
+ glass.css bracket maps the blurs to `none`); a travelling catch-light on a
128
+ flat opaque surface is decoration without substrate, so it drops too. */
129
+ @media (prefers-reduced-transparency: reduce) {
130
+ .glass-specular-track::before {
131
+ display: none;
132
+ }
133
+ }
134
+
135
+ /* ── feDisplacementMap refraction garnish — PE-only, @supports-gated ────────
136
+ True SVG `feDisplacementMap` lensing (`backdrop-filter: url(#…)`) is
137
+ Chromium-only (WebKit bug #245510, Firefox not shipping) and resize-
138
+ expensive. It lands ONLY as a progressive-enhancement garnish layered OVER
139
+ the blur base, NEVER the substrate — gated `@supports (backdrop-filter:
140
+ url(#…))` so a non-supporting engine paints the blur base alone (no broken
141
+ `url(#…)` reference). A consumer opts a glass surface into the refraction by
142
+ adding `.glass-refract` AND mounting the named SVG filter; the gate asserts
143
+ the garnish never reaches the substrate. The blur base paints WITHOUT it. */
144
+ @supports (backdrop-filter: url("#glass-refract")) {
145
+ @layer components {
146
+ .glass-specular-track.glass-refract {
147
+ /* The garnish composes the consumer-mounted `#glass-refract` SVG
148
+ filter OVER the host's existing blur. It is additive — the host's
149
+ `backdrop-filter` blur already painted; this only sharpens the
150
+ refraction edge where the engine supports it. */
151
+ backdrop-filter: var(--glass-blur-resting) url("#glass-refract");
152
+ }
153
+ }
154
+ }
@@ -1,4 +1,32 @@
1
- /* Glass utilities — glassmorphism surface classes referencing --glass-* tokens */
1
+ /* Glass utilities — glassmorphism surface classes referencing --glass-* tokens
2
+ *
3
+ * ── No-glass-on-glass discipline (AV.W15 D5) ───────────────────────────────
4
+ * Apple's Liquid Glass guidance: "glass is best reserved for the navigation
5
+ * layer that floats above the content" — there is no glass-on-glass. glass-ui
6
+ * adopts the same RUNG-PAIRING rule across three layer bands (the existing
7
+ * z-index registry already encodes them, tokens.css §3 `--z-*`):
8
+ *
9
+ * content (--z-background … --z-content) — the page substrate; NOT glass.
10
+ * navigation (--z-controls … --z-dock/panel) — the glass band (dock, panels,
11
+ * floating chrome).
12
+ * overlay (--z-overlay … --z-modal) — the glass band (dialog/sheet
13
+ * over content).
14
+ *
15
+ * A glass surface nested INSIDE another glass surface is a discipline violation
16
+ * — the inner surface should read as a FLAT tier (a `--card` / `--muted` fill),
17
+ * not a second `.glass-*` plate (the blur stacks muddy, the rim doubles, the
18
+ * read collapses). Reach for glass in the navigation/overlay bands only; inside
19
+ * a glass panel, compose flat tiers.
20
+ *
21
+ * ── iOS-spring-on-controls cross-ref (AV.W15 C/M cross-ref) ────────────────
22
+ * The momentum-gated press squish (the control's "lift up on touch, quiet at
23
+ * rest" register — scale toward `--scale-press-dock` / `--scale-press-btn`) is
24
+ * the SPRING half of one Liquid Glass behaviour the rim/specular folds here are
25
+ * the MATERIAL half of. The spring wiring is OWNED by the dock-motion arm
26
+ * (AV.W9, velocity continuity) and the slider arm (AV.W11); it is cross-
27
+ * referenced here and authored there, not re-derived. See
28
+ * `src/components/custom/dock/README.md` for the canonical discipline.
29
+ */
2
30
 
3
31
  @layer components {
4
32
  /* ── Five-tier surface ladder (v0.8.0; visual only, no geometry) ──
@@ -53,12 +81,20 @@
53
81
  box-shadow: var(--glass-under-shadow-default), var(--glass-shadow-resting);
54
82
  }
55
83
 
84
+ /* AV.W15 M3 — the floating tier wires the full-perimeter `--glass-edge-light`
85
+ rim as an inset layer alongside the under-shadow + lift stack. The rim is
86
+ the catch-light that "defines the silhouette" (WWDC25 sess. 219), distinct
87
+ from the top-only `--glass-highlight`. It rides INSIDE the box-shadow stack
88
+ so it composes with the under-shadow floor and the elevation lift. */
56
89
  .glass-floating {
57
90
  position: relative;
58
91
  background: var(--glass-bg-floating);
59
92
  backdrop-filter: var(--glass-blur-floating);
60
93
  border: 1px solid var(--glass-border-floating);
61
- box-shadow: var(--glass-under-shadow-vivid), var(--glass-shadow-floating);
94
+ box-shadow:
95
+ var(--glass-edge-light),
96
+ var(--glass-under-shadow-vivid),
97
+ var(--glass-shadow-floating);
62
98
  }
63
99
 
64
100
  .glass-overlay {
@@ -69,6 +105,42 @@
69
105
  box-shadow: var(--glass-shadow-overlay);
70
106
  }
71
107
 
108
+ /* ── Content-aware under-shadow modifier (AV.W15 M4) ──────────────
109
+ Apple raises the under-shadow over text (so the glass reads as
110
+ lifting OFF the text) and drops it over solid light. The modifier
111
+ is ATTRIBUTE-DRIVEN, no JS: a consumer adds `.glass-over-text`
112
+ (or `[data-over-content="text"]`) to a text-bearing glass surface to
113
+ swap it ONE under-shadow rung heavier, or `[data-over-content="solid"]`
114
+ to lighten it one rung over a solid-light backdrop. It reuses the
115
+ existing `--glass-under-shadow-{quiet,default,vivid}` rungs (no new
116
+ shadow value — `vivid` is sufficient over text), redefining only the
117
+ leading under-shadow layer per tier; the lift stack is untouched.
118
+
119
+ The selectors are per-tier so the swap is rung-correct
120
+ (quiet→default, resting→vivid). `.glass-floating` already sits at the
121
+ `vivid` ceiling over text, so the heavier variant is a no-op there
122
+ (the rung saturates) — documented, not an error. */
123
+ .glass-quiet.glass-over-text,
124
+ .glass-quiet[data-over-content="text"] {
125
+ box-shadow: var(--glass-under-shadow-default), var(--glass-shadow-quiet);
126
+ }
127
+ .glass-resting.glass-over-text,
128
+ .glass-resting[data-over-content="text"] {
129
+ box-shadow: var(--glass-under-shadow-vivid), var(--glass-shadow-resting);
130
+ }
131
+
132
+ /* The inverse — over a solid-light backdrop the under-shadow lightens
133
+ one rung (the glass need not lift as hard off a flat bright field). */
134
+ .glass-resting[data-over-content="solid"] {
135
+ box-shadow: var(--glass-under-shadow-quiet), var(--glass-shadow-resting);
136
+ }
137
+ .glass-floating[data-over-content="solid"] {
138
+ box-shadow:
139
+ var(--glass-edge-light),
140
+ var(--glass-under-shadow-default),
141
+ var(--glass-shadow-floating);
142
+ }
143
+
72
144
  /* Grain noise overlay — reuses paper texture SVG, no extra assets */
73
145
  .glass-wash::after,
74
146
  .glass-quiet::after,
@@ -51,10 +51,27 @@
51
51
  * 4. glass.css — .glass-{wash,quiet,resting,floating,overlay}
52
52
  * 5-rung ladder + .glass-card / -pill / -btn.
53
53
  * Consumes tokens (1) + theme aliases (3).
54
+ * 4a. glass-specular-track.css — the pointer-anchored MOVING specular rung
55
+ * (AV.W15). A `.glass-specular-track` opt-in paints
56
+ * a masked radial catch-light tracking the pointer
57
+ * (@property-animated, reduced-motion-static, var()
58
+ * fallback) + the @supports-gated refraction
59
+ * garnish. Loads after glass.css so it composes
60
+ * over the glass tiers.
54
61
  * 5. paper.css — paper underpaint + grain overlay utilities.
55
62
  * Pairs with (4) for paper-on-glass compositions.
56
- * 6. dock.css — .dock-icon-button, .dock-select-trigger, etc.
57
- * Component utility layer; consumes (1) + (3).
63
+ * 6. dock.css — dock shell / density / grain / layer-crossfade
64
+ * contract + the shared cross-control four-state
65
+ * comma-groups. Component utility layer; consumes
66
+ * (1) + (3).
67
+ * 6b. dock-controls.css — the five dock CONTROL families carved out of
68
+ * dock.css (AU.W8b.3): .dock-icon-button,
69
+ * .dark-mode-toggle-button, .dock-tab-button + tiers,
70
+ * .dock-select-trigger / .dock-dropdown-trigger, and
71
+ * the coarse-pointer touch floor. Same @layer
72
+ * components; MUST load directly after dock.css so
73
+ * the shared :where()/comma-group contract in (6)
74
+ * cascades into these control rules.
58
75
  * 7. cards.css — .cartoon-surface, .paper-texture.
59
76
  * Component utility layer.
60
77
  * 8. floating-panel.css — .floating-panel + .floating-panel-item.
@@ -96,8 +113,10 @@
96
113
  @import "./typography.css";
97
114
  @import "./theme.css";
98
115
  @import "./glass.css";
116
+ @import "./glass-specular-track.css";
99
117
  @import "./paper.css";
100
118
  @import "./dock.css";
119
+ @import "./dock-controls.css";
101
120
  @import "./cards.css";
102
121
  @import "./floating-panel.css";
103
122
  @import "./transitions.css";
@@ -71,6 +71,11 @@
71
71
  paints something readable. */
72
72
  --phase-color: var(--muted-foreground);
73
73
  --phase-color-label: var(--muted-foreground);
74
+
75
+ /* AV.W16 TW3 — inline-size container named `chassis` so the dial reflow
76
+ below reads the chassis's OWN box, not the viewport (portable into a
77
+ narrow host). */
78
+ container: chassis / inline-size;
74
79
  }
75
80
 
76
81
  .dark .instrument-chassis {
@@ -286,10 +291,12 @@
286
291
  align-self: stretch;
287
292
  }
288
293
 
289
- /* Mobile reflow — dial stacks vertically; the inner divider rotates from
290
- a vertical groove (desktop) to a horizontal groove (mobile). Same
291
- twin-line idiom, different orientation. */
292
- @media (max-width: 720px) {
294
+ /* Narrow-box reflow — dial stacks vertically; the inner divider rotates
295
+ from a vertical groove (wide) to a horizontal groove (narrow). AV.W16 TW3
296
+ keyed off the `chassis` container (above), not the viewport, so a
297
+ narrow-host chassis stacks off ITS box. 45rem ≈ 720px at the 16px root
298
+ (the prior viewport cadence as a box width). */
299
+ @container chassis (max-width: 44.9375rem) {
293
300
  .instrument-chassis .instrument-dial {
294
301
  grid-template-columns: 1fr;
295
302
  /* R0G-2 (AO.W3) — reserve the dial's FINAL box from frame 0. The
@@ -4,9 +4,52 @@
4
4
  * Maps every CSS custom property from tokens.css + typography.css to a
5
5
  * Tailwind utility-generating token. References vars (not literals) so
6
6
  * consumers can override at :root / .dark without rebuilding Tailwind.
7
+ *
8
+ * Three blocks (AV.W16 TW1):
9
+ * - LEADING plain `@theme`: the radius primitives + the radius semantic
10
+ * aliases. Plain (not inline) on purpose — the radius scale has no
11
+ * tokens.css twin, so each `--radius-*` is the lone declaration + single
12
+ * override point. Inline is WRONG here: it substitutes the VALUE, so two
13
+ * aliases resolving to one primitive (`--radius-card`/`--radius-dialog`
14
+ * both → `--radius-2xl`) collapse to an identical value and v4 drops one
15
+ * `rounded-*` utility when both are scanned. Plain mints each alias's own
16
+ * var, so value-identical siblings never collide.
17
+ * - `@theme inline`: the tokens.css `var(--token)` BRIDGES (color/shadow/
18
+ * blur/duration/ease/typography). Inline substitutes the referenced value
19
+ * and mints no second var, so the tokens.css token stays the single
20
+ * override point (plain would emit `--color-primary` AND `--primary`).
21
+ * Guardrail: NEVER `@property`-register a color token — registration
22
+ * snapshots the value and breaks light-dark() (see below).
23
+ * - trailing plain `@theme`: the remaining literals (`--animate-*`, opacity).
7
24
  */
8
25
 
26
+ /* Radius primitives — leading plain @theme (declared before the inline aliases
27
+ reference them; see the order note above). */
9
28
  @theme {
29
+ --radius: 0.625rem;
30
+ --radius-xs: 4px;
31
+ --radius-sm: 4px;
32
+ --radius-md: 6px;
33
+ --radius-xl: 12px;
34
+ --radius-2xl: 1rem;
35
+ --radius-pill: 9999px;
36
+
37
+ /* Semantic radius aliases — plain @theme (not inline; see header note).
38
+ Value-identical siblings (e.g. --radius-card + --radius-dialog) would
39
+ collapse + drop a rounded-* utility under inline; plain mints each
40
+ alias's own var. */
41
+ --radius-lg: var(--radius);
42
+ --radius-card: var(--radius-2xl);
43
+ --radius-panel: var(--radius-xl);
44
+ --radius-dialog: var(--radius-2xl);
45
+ --radius-input: var(--radius);
46
+ --radius-button: var(--radius);
47
+ --radius-badge: var(--radius-pill);
48
+ --radius-dock: var(--radius-pill);
49
+ --radius-tooltip: var(--radius-lg);
50
+ }
51
+
52
+ @theme inline {
10
53
  /* ═══════════════════════════════════════════════
11
54
  Typography — size scale → text-* utilities
12
55
  ═══════════════════════════════════════════════ */
@@ -71,6 +114,12 @@
71
114
 
72
115
  --color-muted: var(--muted);
73
116
  --color-muted-foreground: var(--muted-foreground);
117
+ /* AU.W8b.4 — the muted-foreground-strong bridge (text-muted-foreground-strong
118
+ utility). The base token already exists (tokens.css:362); only the
119
+ --color-muted-foreground bridge was present. CardDescription consumes
120
+ text-muted-foreground-strong through this. NOT @property-registered (a
121
+ design-token color; registration would break light-dark() re-resolution). */
122
+ --color-muted-foreground-strong: var(--muted-foreground-strong);
74
123
 
75
124
  --color-accent: var(--accent);
76
125
  --color-accent-foreground: var(--accent-foreground);
@@ -100,6 +149,15 @@
100
149
  --color-muted-soft: var(--muted-soft);
101
150
  --color-muted-medium: var(--muted-medium);
102
151
 
152
+ /* AU.W8b.4 — glass-tier surface/border bridges (bg-glass-quiet /
153
+ border-glass-quiet). Companions to the existing --shadow-glass-quiet
154
+ bridge below; lets the Toggle `card` variant compose bg-glass-quiet /
155
+ border-glass-quiet / shadow-glass-quiet instead of bg-[var(--glass-…)]
156
+ arbitrary wraps. NOT @property-registered (design-token colors —
157
+ registration snapshots the resolved color + breaks light-dark()). */
158
+ --color-glass-quiet: var(--glass-bg-quiet);
159
+ --color-glass-border-quiet: var(--glass-border-quiet);
160
+
103
161
  /* Foreground-tint rungs — bg-surface-tint-{4,6,8,10,12,15,18,22,25}. */
104
162
  --color-surface-tint-4: var(--surface-tint-4);
105
163
  --color-surface-tint-6: var(--surface-tint-6);
@@ -206,27 +264,10 @@
206
264
  --z-index-toggle: var(--z-toggle);
207
265
  --z-index-max: var(--z-max);
208
266
 
209
- /* ═══════════════════════════════════════════════
210
- Border radius rounded-* utilities
211
- ═══════════════════════════════════════════════ */
212
- --radius: 0.625rem;
213
- --radius-xs: 4px;
214
- --radius-sm: 4px;
215
- --radius-md: 6px;
216
- --radius-lg: var(--radius);
217
- --radius-xl: 12px;
218
- --radius-2xl: 1rem;
219
- --radius-pill: 9999px;
220
-
221
- /* Semantic radius — point at primitives from tokens.css; no self-reference */
222
- --radius-card: var(--radius-2xl);
223
- --radius-panel: var(--radius-xl);
224
- --radius-dialog: var(--radius-2xl);
225
- --radius-input: var(--radius);
226
- --radius-button: var(--radius);
227
- --radius-badge: var(--radius-pill);
228
- --radius-dock: var(--radius-pill);
229
- --radius-tooltip: var(--radius-lg);
267
+ /* The radius PRIMITIVES + the semantic radius aliases (→ rounded-*
268
+ utilities) live in the LEADING plain @theme block above — plain, not
269
+ inline, so value-identical aliases never collide during candidate
270
+ resolution. See the order/collision note there. */
230
271
 
231
272
  /* ═══════════════════════════════════════════════
232
273
  Sizing → h-*, min-w-*, and spacing utilities
@@ -236,6 +277,8 @@
236
277
  --height-chart-large: var(--chart-height-large);
237
278
  --min-width-input-sm: var(--input-min-width-sm);
238
279
  --spacing-chart-margin: var(--chart-margin);
280
+ /* AU.W8b.4 — w-popover utility (Combobox list width). Lifts `w-[200px]`. */
281
+ --width-popover: var(--popover-width);
239
282
 
240
283
  /* Golden-ratio spacing — p-phi-5 / m-phi-6 etc. via Tailwind's spacing
241
284
  utilities. φ² and φ³ rungs for hero/chassis padding ladder. */
@@ -316,7 +359,16 @@
316
359
  --transition-duration-xl: var(--duration-xl);
317
360
  --transition-duration-xxl: var(--duration-xxl);
318
361
  --transition-duration-sparkle: var(--duration-sparkle);
362
+ }
319
363
 
364
+ /* ═══════════════════════════════════════════════════════════════════════
365
+ Directly-authored LITERALS — plain @theme (the override surface here is
366
+ the namespaced var itself, not a tokens.css bridge, so these mint their
367
+ global variable). Radius primitives, the --animate-* composites (literal
368
+ keyframe name + var() timing — no tokens.css twin to double), and the
369
+ opacity rungs.
370
+ ═══════════════════════════════════════════════════════════════════════ */
371
+ @theme {
320
372
  /* ═══════════════════════════════════════════════
321
373
  Animation → animate-* utilities
322
374
  ═══════════════════════════════════════════════ */