@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
@@ -19,7 +19,11 @@
19
19
  ) {
20
20
  --dock-motion-fast: var(--duration-fast) var(--ease-standard);
21
21
  --dock-motion-standard: var(--duration-normal) var(--ease-standard);
22
- --dock-motion-resize: var(--duration-normal) var(--spring-snappy);
22
+ /* AT.W6-dock-c — the FLIP-fallback timing. `--dock-resize-spring` (the
23
+ `--spring-snappy` linear()) is the single source curve the native
24
+ View-Transition path ALSO consumes, so the morph is timing-identical
25
+ across engines. */
26
+ --dock-motion-resize: var(--duration-normal) var(--dock-resize-spring);
23
27
  }
24
28
 
25
29
  /* Shared four-state contract — the focus-visible ring + disabled paint are
@@ -64,6 +68,20 @@
64
68
  position: relative;
65
69
  display: inline-flex;
66
70
  align-items: center;
71
+ /* AW.W1 — the dock does NOT establish a default inline-size container.
72
+ `container-type: inline-size` applies `contain: inline-size`, which
73
+ makes an element's inline size INDEPENDENT of its contents — fatally
74
+ incompatible with a shrink-to-fit pill: under it `.glass-dock` cannot
75
+ size to its content and collapses to its padding floor (~19px) with the
76
+ active layer overflowing (the 3.3.0 regression — every horizontal dock,
77
+ collapsed AND always-expanded, rendered as a sliver). The `dock`-named
78
+ container is now OPT-IN via the `containerName` prop: a consumer
79
+ embedding the dock in a width-CONSTRAINED host (a 320px sidebar) sets
80
+ `containerName="dock"` to get the descendant container-query reads (the
81
+ audacious-label compression below), trading shrink-to-fit for the
82
+ host-constrained width it already has there. The default free-floating
83
+ dock shrink-wraps to its content (AV.W16 TW3 made this a default and
84
+ silently broke dock sizing for the common case). */
67
85
  border-radius: var(--radius-dock);
68
86
  white-space: nowrap;
69
87
  max-inline-size: var(--dock-max-inline-size);
@@ -71,18 +89,19 @@
71
89
  background: var(--glass-bg-dock, var(--glass-bg-resting));
72
90
  backdrop-filter: var(--dock-surface-blur);
73
91
  border: 1.5px solid var(--glass-border-dock, var(--glass-border-resting));
74
- box-shadow: var(--shadow-dock-override, var(--shadow-dock));
75
- }
76
-
77
- /* T.W2.T1 — `overflow: hidden` is the default shell, but the
78
- container-query host path (`<GlassDock containerName="…">`) must
79
- allow descendants to wrap and report intrinsic widths past the
80
- padding box. Inline-style on the SFC sets `overflow: visible` for
81
- that path; this rule grants the default clip to every dock that
82
- is NOT a container-query host. The `data-container-name` attribute
83
- is the structural marker (set by the SFC when `containerName` is
84
- passed). */
85
- .glass-dock:not([data-container-name]) {
92
+ /* AV.W15 M3 — the full-perimeter `--glass-edge-light` rim rides as the
93
+ leading inset layer of the dock shadow stack (the navigation-band
94
+ silhouette catch-light, distinct from the top-only highlight). */
95
+ box-shadow: var(--glass-edge-light), var(--shadow-dock-override, var(--shadow-dock));
96
+ }
97
+
98
+ /* `overflow: hidden` is the clip shell for every dock. AT.W7-dock-a
99
+ folded out the prior `containerName` clip-lift (the container-query
100
+ opt-in is orthogonal it no longer silently changes the clip), so the
101
+ clip applies universally and the `.expanded` / `.always-expanded` /
102
+ `.dock-overflow-wrap` states lift it back to `visible` where they need to
103
+ grow. A consumer wanting multi-line content opts into `overflow="wrap"`. */
104
+ .glass-dock {
86
105
  overflow: hidden;
87
106
  }
88
107
 
@@ -92,10 +111,22 @@
92
111
  --dock-control-size: var(--dock-density-compact-control-size, 2rem);
93
112
  --dock-layer-height: var(--dock-density-compact-layer-height, 2rem);
94
113
  --dock-layer-gap: var(--dock-density-compact-gap, 0.25rem);
95
- --dock-trigger-padding-block: var(--dock-density-compact-trigger-padding-block, 0.1875rem);
96
- --dock-trigger-padding-inline: var(--dock-density-compact-trigger-padding-inline, 0.4375rem);
97
- --dock-tab-padding-block: var(--dock-density-compact-tab-padding-block, 0.3125rem);
98
- --dock-tab-padding-inline: var(--dock-density-compact-tab-padding-inline, 0.625rem);
114
+ --dock-trigger-padding-block: var(
115
+ --dock-density-compact-trigger-padding-block,
116
+ 0.1875rem
117
+ );
118
+ --dock-trigger-padding-inline: var(
119
+ --dock-density-compact-trigger-padding-inline,
120
+ 0.4375rem
121
+ );
122
+ --dock-tab-padding-block: var(
123
+ --dock-density-compact-tab-padding-block,
124
+ 0.3125rem
125
+ );
126
+ --dock-tab-padding-inline: var(
127
+ --dock-density-compact-tab-padding-inline,
128
+ 0.625rem
129
+ );
99
130
  --dock-tab-h: 32px;
100
131
  }
101
132
 
@@ -107,10 +138,22 @@
107
138
  --dock-control-size: var(--dock-density-comfortable-control-size, 2.5rem);
108
139
  --dock-layer-height: var(--dock-density-comfortable-layer-height, 2.5rem);
109
140
  --dock-layer-gap: var(--dock-density-comfortable-gap, 0.375rem);
110
- --dock-trigger-padding-block: var(--dock-density-comfortable-trigger-padding-block, 0.25rem);
111
- --dock-trigger-padding-inline: var(--dock-density-comfortable-trigger-padding-inline, 0.5rem);
112
- --dock-tab-padding-block: var(--dock-density-comfortable-tab-padding-block, 0.4375rem);
113
- --dock-tab-padding-inline: var(--dock-density-comfortable-tab-padding-inline, 0.75rem);
141
+ --dock-trigger-padding-block: var(
142
+ --dock-density-comfortable-trigger-padding-block,
143
+ 0.25rem
144
+ );
145
+ --dock-trigger-padding-inline: var(
146
+ --dock-density-comfortable-trigger-padding-inline,
147
+ 0.5rem
148
+ );
149
+ --dock-tab-padding-block: var(
150
+ --dock-density-comfortable-tab-padding-block,
151
+ 0.4375rem
152
+ );
153
+ --dock-tab-padding-inline: var(
154
+ --dock-density-comfortable-tab-padding-inline,
155
+ 0.75rem
156
+ );
114
157
  --dock-tab-h: 38px;
115
158
  }
116
159
 
@@ -120,10 +163,22 @@
120
163
  --dock-control-size: var(--dock-density-spacious-control-size, 2.75rem);
121
164
  --dock-layer-height: var(--dock-density-spacious-layer-height, 2.75rem);
122
165
  --dock-layer-gap: var(--dock-density-spacious-gap, 0.5rem);
123
- --dock-trigger-padding-block: var(--dock-density-spacious-trigger-padding-block, 0.375rem);
124
- --dock-trigger-padding-inline: var(--dock-density-spacious-trigger-padding-inline, 0.625rem);
125
- --dock-tab-padding-block: var(--dock-density-spacious-tab-padding-block, 0.5rem);
126
- --dock-tab-padding-inline: var(--dock-density-spacious-tab-padding-inline, 0.875rem);
166
+ --dock-trigger-padding-block: var(
167
+ --dock-density-spacious-trigger-padding-block,
168
+ 0.375rem
169
+ );
170
+ --dock-trigger-padding-inline: var(
171
+ --dock-density-spacious-trigger-padding-inline,
172
+ 0.625rem
173
+ );
174
+ --dock-tab-padding-block: var(
175
+ --dock-density-spacious-tab-padding-block,
176
+ 0.5rem
177
+ );
178
+ --dock-tab-padding-inline: var(
179
+ --dock-density-spacious-tab-padding-inline,
180
+ 0.875rem
181
+ );
127
182
  --dock-tab-h: 44px;
128
183
  }
129
184
 
@@ -137,25 +192,47 @@
137
192
  --dock-control-size: var(--dock-density-audacious-control-size, 4rem);
138
193
  --dock-layer-height: var(--dock-density-audacious-layer-height, 4rem);
139
194
  --dock-layer-gap: var(--dock-density-audacious-gap, 0.875rem);
140
- --dock-trigger-padding-block: var(--dock-density-audacious-trigger-padding-block, 0.625rem);
141
- --dock-trigger-padding-inline: var(--dock-density-audacious-trigger-padding-inline, 1rem);
142
- --dock-tab-padding-block: var(--dock-density-audacious-tab-padding-block, 0.5rem);
143
- --dock-tab-padding-inline: var(--dock-density-audacious-tab-padding-inline, 1.5rem);
195
+ --dock-trigger-padding-block: var(
196
+ --dock-density-audacious-trigger-padding-block,
197
+ 0.625rem
198
+ );
199
+ --dock-trigger-padding-inline: var(
200
+ --dock-density-audacious-trigger-padding-inline,
201
+ 1rem
202
+ );
203
+ --dock-tab-padding-block: var(
204
+ --dock-density-audacious-tab-padding-block,
205
+ 0.5rem
206
+ );
207
+ --dock-tab-padding-inline: var(
208
+ --dock-density-audacious-tab-padding-inline,
209
+ 1.5rem
210
+ );
144
211
  --dock-tab-min-height: var(--dock-density-audacious-tab-min-height, 3.5rem);
145
212
  --dock-tab-h: var(--dock-density-audacious-tab-min-height, 3.5rem);
146
213
  }
147
214
 
148
- /* Density-audacious mobile carve at narrow viewports the audacious-dock
149
- label glyphs compress so the chrome doesn't overflow its host
150
- (≤14px at <480, 15px at 480719). Consumer dock label spans bind
151
- `font-size: var(--dock-label-size)` (typography.css `.dock-label`). */
152
- @media (max-width: 479px) {
153
- .glass-dock[data-density="audacious"] {
215
+ /* Density-audacious narrow-box carve (AV.W16 TW3) when the dock's OWN
216
+ box is narrow the audacious-dock label glyphs compress so the chrome
217
+ doesn't overflow its host (≤14px below 30rem, 15px 3045rem). Keyed off
218
+ the dock's `dock` inline-size container — now OPT-IN via the
219
+ `containerName="dock"` prop (AW.W1 removed the always-on default that
220
+ broke shrink-to-fit), so it fires only for a dock the consumer has
221
+ width-CONSTRAINED into a host (the 320px sidebar case) where the
222
+ compression is meaningful and the containment does not collapse the box.
223
+ A free-floating dock shrink-wraps (box == content) so there is nothing to
224
+ compress. The var
225
+ is set on the `.dock-label` descendant (which reads it via
226
+ `font-size: var(--dock-label-size)`, typography.css). Thresholds keep
227
+ the prior 479/719px viewport cadence as box widths (30rem ≈ 480px,
228
+ 45rem ≈ 720px at the 16px root). */
229
+ @container dock (max-width: 29.9375rem) {
230
+ .glass-dock[data-density="audacious"] .dock-label {
154
231
  --dock-label-size: 14px;
155
232
  }
156
233
  }
157
- @media (min-width: 480px) and (max-width: 719px) {
158
- .glass-dock[data-density="audacious"] {
234
+ @container dock (min-width: 30rem) and (max-width: 44.9375rem) {
235
+ .glass-dock[data-density="audacious"] .dock-label {
159
236
  --dock-label-size: 15px;
160
237
  }
161
238
  }
@@ -192,7 +269,7 @@
192
269
  }
193
270
 
194
271
  /* Vertical rails grow-to-fit + clamp, no scroll: descendants wrap to
195
- multiple rows (opt-in via `dock-wrap`) or clamp via
272
+ multiple rows (opt-in via `overflow="wrap"`) or clamp via
196
273
  `--dock-max-block-size`; the cap fails visibly rather than masking
197
274
  overflow as a scroll affordance. No edge-fade mask — a rail that never
198
275
  scrolls has nothing to feather. */
@@ -262,7 +339,10 @@
262
339
  * `.variant-instrument-strip` — chassis-strip carries ONE canonical
263
340
  * border-radius (`--radius-card`), per the chassis family. */
264
341
  .glass-dock.variant-instrument-strip {
265
- padding: var(--dock-instrument-strip-padding, var(--dock-padding-inline, 0.75rem));
342
+ padding: var(
343
+ --dock-instrument-strip-padding,
344
+ var(--dock-padding-inline, 0.75rem)
345
+ );
266
346
  background: var(--glass-bg-chassis, var(--glass-bg-wash));
267
347
  border: 1px solid var(--glass-border-quiet, var(--glass-border-resting));
268
348
  border-radius: var(--radius-card);
@@ -305,7 +385,10 @@
305
385
  }
306
386
 
307
387
  .glass-dock.collapsed .dock-layer--summary {
308
- min-width: var(--dock-collapsed-summary-min-size, var(--dock-layer-height, 2.5rem));
388
+ min-width: var(
389
+ --dock-collapsed-summary-min-size,
390
+ var(--dock-layer-height, 2.5rem)
391
+ );
309
392
  justify-content: center;
310
393
  }
311
394
 
@@ -383,15 +466,43 @@
383
466
  transition: width var(--dock-motion-resize);
384
467
  }
385
468
 
469
+ /* AV.W9.0 — the AU.W8b native container-morph arm (the `@supports` block that
470
+ opted the subtree into auto-to-length width interpolation and declared the
471
+ active layer's destination width as intrinsic) is RETIRED. It was never made
472
+ mutually exclusive with the `SpringProgress` FLIP driver in
473
+ `useLayerTransition.ts`: on Chrome 129+ the native arm interpolated
474
+ `.dock-layers` width on the browser's own clock WHILE the spring wrote inline
475
+ `width` per frame — a dual-driver race over the SAME property that cancelled
476
+ the morph and froze the dock at runtime (born-RED under
477
+ `proof:dock-animation-live`). One authority per concern: the size morph now
478
+ has exactly ONE driver on every engine — the `SpringProgress` FLIP path above
479
+ (`:382`), or the orthogonal View-Transitions path inside
480
+ `startViewTransition` (which owns size + crossfade as a single browser-side
481
+ mutation and never touches inline width). Neither coexists with a CSS-native
482
+ intrinsic-width destination, so the race is gone. This re-expresses the
483
+ `e8380d7` "one driver owns the morph" invariant on the modern
484
+ FLIP+spring(+VT) architecture. */
485
+
386
486
  /* Horizontal dock content grows visibly when the active layer's natural
387
487
  width exceeds the content area (grow-to-fit; consumers needing wrap opt
388
- into `dock-wrap`). No edge-fade mask — content never clips or scrolls,
488
+ into `overflow="wrap"`). No edge-fade mask — content never clips or scrolls,
389
489
  so a feather has nothing to feather and only bleeds a stray ramp onto
390
490
  the edge controls. */
391
- .glass-dock.expanded:not(.dock-wrap) > .dock-layers {
491
+ .glass-dock.expanded:not(.dock-overflow-wrap) > .dock-layers {
392
492
  overflow-x: visible;
393
493
  }
394
494
 
495
+ /* AU.W8b-visibility-fork — the 3-state active/inactive/leaving visibility
496
+ contract below is LOAD-BEARING (the a11y-006 bite-anchor). A later refactor
497
+ greps for this marker so the semantics are not collapsed: the inactive layer
498
+ leaves the hit-test tree (`visibility:hidden`), the leaving layer stays
499
+ painted-but-untouchable through its fade (`visibility:visible` +
500
+ `pointer-events:none`), and the active layer shows IMMEDIATELY (`visibility
501
+ 0s`, no fade-in delay). The hand-rolled 3-state fork below is now the SOLE
502
+ visibility authority on every engine — AV.W9.1 retired the native
503
+ discrete-visibility arm that used to second-drive it, so one owner governs
504
+ visibility (one owner governs size, one owns opacity). */
505
+
395
506
  /* ── Layer crossfade + hit-test contract (shared) ──────────────────
396
507
  Two dock-layer surfaces stack on a 1/1 CSS grid and crossfade:
397
508
  `.dock-layer` (GlassDock's built-in collapsed↔expanded pair) and
@@ -409,12 +520,21 @@
409
520
  flow, so the FLIP width measurement in `useLayerTransition` still
410
521
  reads its geometry (`display:none` would zero it). The delayed
411
522
  `visibility` transition holds a leaving layer `visible` for the
412
- length of the opacity crossfade, then flips it `hidden`. */
523
+ length of the opacity crossfade, then flips it `hidden`.
524
+
525
+ AU.W2 — the opacity-lockstep fold (slides-F P0, the "not iOS-smooth"
526
+ report). The layer fade rides `--dock-motion-resize` (the SAME duration +
527
+ spring the container morph runs at, `:189`/`:216`/`:385`) — NOT the faster
528
+ `--dock-motion-fast` (0.2s). Before, the host faded in 0.2s while the
529
+ container morphed in 0.3s: a 100ms-apart settle (the items appeared to lag
530
+ the pill). Now the fade and the morph settle in lockstep. The matched
531
+ `visibility` hold extends to `--duration-normal` so the leaving layer stays
532
+ paintable for the FULL (now longer) crossfade. */
413
533
  .dock-layer,
414
534
  .dock-layer-item-host {
415
535
  transition:
416
- opacity var(--dock-motion-fast),
417
- visibility 0s linear var(--duration-fast);
536
+ opacity var(--dock-motion-resize),
537
+ visibility 0s linear var(--duration-normal);
418
538
  }
419
539
 
420
540
  .dock-layer:not(.layer-active),
@@ -429,9 +549,12 @@
429
549
  opacity: 1;
430
550
  visibility: visible;
431
551
  pointer-events: auto;
432
- /* The active layer shows immediately — no deferred `visibility`. */
552
+ /* The active layer shows immediately — no deferred `visibility`. AU.W2:
553
+ the opacity rides `--dock-motion-resize` (lockstep with the container
554
+ morph), but the `visibility 0s` stays immediate (the `:434` rule
555
+ governs — the active layer must paint at once, no fade-in delay). */
433
556
  transition:
434
- opacity var(--dock-motion-fast),
557
+ opacity var(--dock-motion-resize),
435
558
  visibility 0s;
436
559
  }
437
560
 
@@ -445,6 +568,19 @@
445
568
  pointer-events: none;
446
569
  }
447
570
 
571
+ /* AV.W9.1 — the AU.W8b native discrete-visibility arm (the second `@supports`
572
+ block that expressed the 3-state contract as one discrete transition over
573
+ opacity + visibility with a `@starting-style` entry anchor) is RETIRED. It
574
+ was a THIRD opacity/visibility authority overlapping the hand-rolled 3-state
575
+ fork above and the spring's settle — three owners for one concern. With the
576
+ native size arm gone (W9.0), opacity now has ONE owner everywhere: the
577
+ `opacity var(--dock-motion-resize)` crossfade on `.dock-layer{,-item-host}`
578
+ (the AU.W2 lockstep token — kept), and visibility has ONE owner: the delayed
579
+ `visibility 0s linear var(--duration-normal)` hold of the
580
+ `AU.W8b-visibility-fork` 3-state fallback above (the a11y-006 bite-anchor,
581
+ LOAD-BEARING). One authority per concern: size = spring/VT, opacity = the
582
+ CSS crossfade, visibility = the delayed-hold fork. */
583
+
448
584
  /* ── Base layout — distinct per surface ─────────────────────────── */
449
585
  .dock-layer {
450
586
  display: flex;
@@ -503,7 +639,7 @@
503
639
  so the pill's rounded edge masks the scroll boundary — hence the
504
640
  grow-mode `overflow-x: visible` (`.dock-layers`, above) is overridden
505
641
  back to `hidden` here. */
506
- .glass-dock.dock-scroll-x.expanded:not(.dock-wrap) > .dock-layers {
642
+ .glass-dock.dock-scroll-x.expanded:not(.dock-overflow-wrap) > .dock-layers {
507
643
  overflow-x: hidden;
508
644
  }
509
645
 
@@ -539,33 +675,40 @@
539
675
  display: none;
540
676
  }
541
677
 
542
- .glass-dock.dock-wrap {
678
+ /* ── `overflow="wrap"` recipe (the `.dock-overflow-wrap` hook) ────────
679
+ Parallel to the `.dock-scroll-{x,y}` hooks the `overflow="scroll"`
680
+ member emits: the `overflow="wrap"` enum member emits this class. (The
681
+ prior `wrap` boolean's hook is retired — clean break, no alias.)
682
+ Expanded content wraps to multiple rows; the pill narrows to the
683
+ viewport gutter and snaps back to a single nowrap row past
684
+ `--dock-overflow-bp` (the `@media` at the tail). */
685
+ .glass-dock.dock-overflow-wrap {
543
686
  white-space: normal;
544
687
  border-radius: var(--radius-2xl);
545
688
  max-width: var(--dock-wrap-max-width);
546
- padding:
547
- var(--dock-wrap-padding-block, var(--dock-padding-block, 0.375rem))
689
+ padding: var(--dock-wrap-padding-block, var(--dock-padding-block, 0.375rem))
548
690
  var(--dock-wrap-padding-inline, 0.625rem);
549
691
  }
550
692
 
551
- .glass-dock.dock-wrap .dock-layer--full {
693
+ .glass-dock.dock-overflow-wrap .dock-layer--full {
552
694
  flex-wrap: wrap;
553
695
  justify-content: center;
554
696
  height: auto;
555
697
  min-height: var(--dock-wrap-layer-min-height, var(--dock-layer-height, 2rem));
556
- gap: var(--dock-wrap-row-gap, 0.25rem) var(--dock-wrap-column-gap, var(--dock-layer-gap, 0.375rem));
698
+ gap: var(--dock-wrap-row-gap, 0.25rem)
699
+ var(--dock-wrap-column-gap, var(--dock-layer-gap, 0.375rem));
557
700
  }
558
701
 
559
- .glass-dock.dock-wrap .dock-layer--summary {
702
+ .glass-dock.dock-overflow-wrap .dock-layer--summary {
560
703
  height: auto;
561
704
  min-height: var(--dock-wrap-layer-min-height, var(--dock-layer-height, 2rem));
562
705
  }
563
706
 
564
- .glass-dock.dock-wrap .dock-separator {
707
+ .glass-dock.dock-overflow-wrap .dock-separator {
565
708
  display: none;
566
709
  }
567
710
 
568
- .glass-dock.dock-wrap.collapsed {
711
+ .glass-dock.dock-overflow-wrap.collapsed {
569
712
  border-radius: var(--radius-pill);
570
713
  white-space: nowrap;
571
714
  max-width: none;
@@ -633,7 +776,16 @@
633
776
  border-top: 1px solid color-mix(in srgb, var(--border) 30%, transparent);
634
777
  }
635
778
 
779
+ /* AU.W8.4 — the rail is a reka-ui Tabs contract. The travelling
780
+ `.dock-layer-tab-indicator` (the reka TabsIndicator) now carries the
781
+ active affordance; the rail is `position: relative` so the indicator's
782
+ absolute placement is rail-local. */
783
+ .dock-layer-rail {
784
+ position: relative;
785
+ }
786
+
636
787
  .dock-layer-rail .dock-layer-tab {
788
+ position: relative;
637
789
  display: inline-flex;
638
790
  align-items: center;
639
791
  justify-content: center;
@@ -646,6 +798,8 @@
646
798
  cursor: pointer;
647
799
  font: inherit;
648
800
  font-size: 0.75rem;
801
+ /* The tab glyph rides above the travelling indicator backplate. */
802
+ z-index: 1;
649
803
  transition:
650
804
  background var(--dock-motion-fast),
651
805
  color var(--dock-motion-fast);
@@ -656,11 +810,47 @@
656
810
  color: var(--foreground);
657
811
  }
658
812
 
659
- .dock-layer-rail .dock-layer-tab.is-active {
660
- background: color-mix(in srgb, var(--primary) 15%, transparent);
813
+ /* AU.W8.4 — KEEP the active glyph tint on the selected tab (reka emits
814
+ `data-state="active"` + `aria-selected="true"`); the per-button active
815
+ BACKGROUND is RETIRED — the travelling indicator carries that affordance. */
816
+ .dock-layer-rail .dock-layer-tab[data-state="active"] {
661
817
  color: var(--primary);
662
818
  }
663
819
 
820
+ /* AU.W8.4 — the dock control focus-ring contract does not cover
821
+ `.dock-layer-tab` (the rail tab is not in the `.dock-icon-button` family).
822
+ The roving tabindex means only the active tab is in the tab order; a
823
+ focus-visible tab paints the shared dock ring. */
824
+ .dock-layer-rail [role="tab"]:focus-visible {
825
+ box-shadow: var(--focus-ring-shadow);
826
+ outline: none;
827
+ }
828
+
829
+ /* AU.W8.4 — the travelling indicator (reka TabsIndicator). reka computes
830
+ `--reka-tabs-indicator-position` + `--reka-tabs-indicator-size` from the
831
+ active tab's geometry; the indicator morphs between tabs riding
832
+ `--dock-motion-resize` (= `--spring-dock` after AU.W8.2) — NOT a hardcoded
833
+ `--spring-snappy`. It paints the active-tab backplate the per-button
834
+ `.is-active` background used to. */
835
+ .dock-layer-rail .dock-layer-tab-indicator {
836
+ position: absolute;
837
+ left: 0;
838
+ top: 0;
839
+ height: var(--dock-layer-tab-size, var(--dock-control-size, 1.75rem));
840
+ width: var(--reka-tabs-indicator-size);
841
+ transform: translateX(var(--reka-tabs-indicator-position));
842
+ border-radius: var(--dock-layer-tab-radius, var(--radius-sm));
843
+ background: color-mix(in srgb, var(--primary) 15%, transparent);
844
+ transition:
845
+ width var(--dock-motion-resize),
846
+ transform var(--dock-motion-resize);
847
+ pointer-events: none;
848
+ }
849
+
850
+ /* For a vertical rail the indicator travels along the inline axis still
851
+ (the horizontal-always keyboard decision keeps the indicator inline);
852
+ reka's position var resolves to the active tab offset regardless. */
853
+
664
854
  .dock-layer-stack {
665
855
  position: relative;
666
856
  display: grid;
@@ -706,79 +896,14 @@
706
896
  height: max-content;
707
897
  }
708
898
 
709
- .dock-icon-button {
710
- display: inline-flex;
711
- align-items: center;
712
- justify-content: center;
713
- flex-shrink: 0;
714
- /* AQ.W3 §W3.2 identity base */
715
- scale: 1;
716
- width: var(--dock-control-size, var(--size-icon-btn));
717
- height: var(--dock-control-size, var(--size-icon-btn));
718
- padding: var(--dock-icon-padding, 0);
719
- cursor: pointer;
720
- border: none;
721
- background: transparent;
722
- border-radius: var(--dock-control-radius, var(--radius-pill));
723
- /* Foreground base routes through `--dock-fg-on-aurora` (defaults to
724
- `--foreground`, byte-identical to before) so a consumer floating the
725
- dock over an aurora can lift contrast per-backdrop. The muted icon
726
- weight mixes that base down with `--opacity-icon-muted`. */
727
- color: color-mix(in srgb, var(--dock-fg-on-aurora, var(--foreground)) calc(var(--opacity-icon-muted) * 100%), transparent);
728
- outline: none;
729
- transition:
730
- background-color var(--dock-motion-fast),
731
- color var(--dock-motion-fast),
732
- scale var(--dock-motion-fast),
733
- opacity var(--dock-motion-fast);
734
- }
735
-
736
- .dock-icon-button--compact {
737
- width: var(--dock-compact-control-size, auto);
738
- height: var(--dock-compact-control-size, auto);
739
- min-width: var(--dock-compact-control-min-width, 0);
740
- padding: var(--dock-compact-control-padding, 0.25rem);
741
- }
742
-
743
- .dock-icon-button:hover:not(:disabled) {
744
- background: var(--muted);
745
- color: var(--btn-hover-color, var(--foreground));
746
- scale: var(--scale-hover-dock);
747
- }
748
-
749
- .dock-icon-button:active:not(:disabled) {
750
- scale: var(--scale-press-dock);
751
- }
752
-
753
- .dock-icon-button:focus:not(:focus-visible) {
754
- box-shadow: none;
755
- outline: none;
756
- }
757
-
758
- /* focus-visible ring + disabled paint hoisted to the shared `:where()`
759
- group at the top; this rule adds only the box-shadow fade transition. */
760
- .dock-icon-button:focus-visible {
761
- transition:
762
- background-color var(--dock-motion-fast),
763
- color var(--dock-motion-fast),
764
- scale var(--dock-motion-fast),
765
- opacity var(--dock-motion-fast),
766
- box-shadow var(--dock-motion-fast);
767
- }
768
-
769
- /* O.W6 Lane B — token-ladder active paint. Defaults match the prior
770
- hardcoded recipe (--muted bg + --foreground color, no transform / border
771
- / shadow). Consumers override the active variant via the
772
- `--dock-active-{bg,color,scale,border,shadow}` cohort scoped to a parent
773
- (e.g. bbnf-buddy `ToolsLayer.vue` audacious active treatment) — no
774
- `:deep()` escapes required. See tokens.css §10 (dock geometry block). */
775
- .dock-icon-button:is(.is-active, .active, [aria-expanded="true"], [aria-pressed="true"]) {
776
- background: var(--dock-active-bg);
777
- color: var(--dock-active-color);
778
- scale: var(--dock-active-scale);
779
- border: var(--dock-active-border);
780
- box-shadow: var(--dock-active-shadow);
781
- }
899
+ /* AU.W8b.3 — the five dock CONTROL families (.dock-icon-button,
900
+ .dark-mode-toggle-button, .dock-tab-button + tiers, the
901
+ .dock-select-trigger / .dock-dropdown-trigger pair, and the coarse-pointer
902
+ per-button touch floor) carved out to dock-controls.css (imported directly
903
+ after this file in index.css, same @layer components). dock.css keeps the
904
+ shell / density / grain / layer-crossfade contract + the shared
905
+ cross-control four-state comma-groups (the :focus-visible / :disabled groups
906
+ + the motion-token :where() group above). */
782
907
 
783
908
  /* J.W3.B — `.dock-popover` substrate + `pop-up-*` / `pop-down-*`
784
909
  Vue Transition keyframes retired. Hover-driven dock popovers
@@ -787,326 +912,42 @@
787
912
  `popover-animate` motion vocabulary. Click-anchored popovers
788
913
  (no dock-keep semantics) compose `<Popover>` directly. */
789
914
 
790
- .dark-mode-toggle-button {
791
- width: var(--dark-mode-toggle-size, 2.25rem);
792
- height: var(--dark-mode-toggle-size, 2.25rem);
793
- min-width: var(--dark-mode-toggle-size, 2.25rem);
794
- min-height: var(--dark-mode-toggle-size, 2.25rem);
795
- max-width: var(--dark-mode-toggle-size, 2.25rem);
796
- max-height: var(--dark-mode-toggle-size, 2.25rem);
797
- aspect-ratio: 1;
798
- padding: var(--dark-mode-toggle-padding, 0.375rem);
799
- transition:
800
- opacity var(--dock-motion-standard),
801
- background-color var(--dock-motion-standard),
802
- box-shadow var(--dock-motion-fast);
803
- }
804
-
805
- .dark-mode-toggle-button > svg {
806
- width: 100%;
807
- height: 100%;
808
- max-width: 100%;
809
- max-height: 100%;
810
- }
811
-
812
- .dark-mode-toggle-button:hover,
813
- .dark-mode-toggle-button:focus {
814
- background: var(--surface-tint-10);
815
- opacity: 1;
816
- outline: none;
817
- }
818
-
819
- .dark-mode-toggle-button:focus-visible {
820
- box-shadow: var(--focus-ring-shadow);
821
- }
822
-
823
- .dark-mode-toggle-button[data-size="sm"] {
824
- --dark-mode-toggle-size: 1.75rem;
825
- --dark-mode-toggle-padding: 0.25rem;
826
- }
827
-
828
- .dark-mode-toggle-button[data-size="md"] {
829
- --dark-mode-toggle-size: 2.25rem;
830
- --dark-mode-toggle-padding: 0.375rem;
831
- }
832
-
833
- .dark-mode-toggle-button[data-size="lg"] {
834
- --dark-mode-toggle-size: 2.75rem;
835
- --dark-mode-toggle-padding: 0.5rem;
836
- }
837
-
838
- .dark-mode-toggle-button[data-size="control"] {
839
- --dark-mode-toggle-size: var(--control-size, 2.25rem);
840
- --dark-mode-toggle-padding: var(--control-icon-padding, 0.375rem);
841
- }
842
-
843
- .dark-mode-toggle-button[data-size="dock"],
844
- .glass-dock .dark-mode-toggle-button:not([data-size="sm"]):not([data-size="lg"]):not([data-size="control"]) {
845
- --dark-mode-toggle-size: var(--dock-control-size, var(--size-icon-btn));
846
- --dark-mode-toggle-padding: var(--dock-icon-padding, 0);
847
- }
848
-
849
- .dock-tab-button {
850
- display: inline-flex;
851
- align-items: center;
852
- flex-shrink: 0;
853
- /* P.W4 Lane B inline-absorb: the `--dock-tab-h` density-keyed height
854
- knob (parallel to DockIconButton's --dock-control-size) merged
855
- here from the prior DockTabButton.vue scoped style block. The
856
- density rungs that set `--dock-tab-h` per tier live in this same
857
- file (the `.glass-dock[data-density="…"]` blocks above) — Q.W3
858
- Lane A consolidated them out of utilities.css, closing the
859
- cascade-order split-brain. When a parent <GlassDock density="…">
860
- sets `--dock-tab-h`, the tab-button reserves that row even when
861
- the glyph + padding sum would ride lower. Falls through to
862
- `--dock-tab-min-height` (kept for audacious-tier callers) and
863
- finally to `auto`. R3-spec / audit-E P0-3. */
864
- min-height: var(--dock-tab-h, var(--dock-tab-min-height, auto));
865
- padding-inline: var(--dock-tab-padding-inline, 0.75rem);
866
- padding-block: var(--dock-tab-padding-block, 0.375rem);
867
- border: none;
868
- background: transparent;
869
- border-radius: var(--dock-control-radius, var(--radius-pill));
870
- /* Default font-size carries through to text-only tab content; consumers
871
- wrapping content in an explicit type utility (e.g. `text-hero`,
872
- `text-display`) on an inner <span> win because Tailwind v4 ships
873
- @utility blocks in @layer utilities, which ranks above @layer
874
- components — so this declaration is a fallback, not a ceiling. */
875
- font-size: var(--type-small);
876
- line-height: 1;
877
- color: var(--muted-foreground);
878
- text-decoration: none;
879
- cursor: pointer;
880
- white-space: nowrap;
881
- outline: none;
882
- /* AQ.W3 §W3.2 identity base */
883
- scale: 1;
884
- transition:
885
- background-color var(--dock-motion-fast),
886
- color var(--dock-motion-fast),
887
- scale var(--dock-motion-fast);
888
- }
889
-
890
- .dock-tab-button:hover:not(:disabled) {
891
- background: var(--surface-tint-8);
892
- color: var(--foreground);
893
- }
894
-
895
- .dock-tab-button:active:not(:disabled) {
896
- scale: var(--scale-press-dock);
897
- }
898
-
899
- .dock-tab-button:focus:not(:focus-visible) {
900
- box-shadow: none;
901
- }
902
-
903
- /* focus-visible ring + disabled paint hoisted to the shared `:where()`
904
- group at the top. */
905
-
906
- .dock-tab-button:is(.is-active, .active, [aria-current="page"], [aria-pressed="true"]) {
907
- background: var(--surface-tint-10);
908
- color: var(--foreground);
909
- }
910
-
911
- /* Tier — primary ────────────────────────────────────────────
912
- *
913
- * Per W2.7 §9, §12, §13, §17. The primary tier composes three at-rest
914
- * marks (top-highlight, bottom under-shadow, baseline glass) with three
915
- * disco accents on hover (specular swap, sparkle sweep, disco-grain).
916
- *
917
- * Reservation: disco fires on hover only. At rest the button reads as
918
- * a Vignelli-restrained composed glass surface. The `--phase-color`
919
- * cascade (provided by `<InstrumentChassis>` via `data-phase`) tints
920
- * the disco-grain radial only on hover; idle is neutral.
921
- *
922
- * K.W6 Lane B — the canonical disco-grain + sparkle-sweep + specular
923
- * recipe lifted to `@utility btn-audacious` (utilities.css). The Vue
924
- * <DockTabButton> attaches `btn-audacious` automatically when the
925
- * consumer passes `data-tier="primary"`. The dock-local rules below
926
- * are STRICTLY the dock extension: structural shell (padding, base
927
- * surface tint, min-height) + phase-tint extensions (hover radial
928
- * uses `--phase-color`, plus the `[data-phase]` `::before` halo).
929
- */
930
- .dock-tab-button[data-tier="primary"] {
931
- --dock-tab-min-height: 4rem;
932
- padding-inline: 1.5rem;
933
- background:
934
- color-mix(in srgb, var(--card) 60%, transparent);
935
- color: var(--foreground);
936
- }
937
-
938
- /* Phase-tint hover override — same disco-grain composition as
939
- * `btn-audacious`, but the radial uses `--phase-color` (instrument-
940
- * cluster axis) instead of the canonical `--primary`. The `--paper-
941
- * clean-texture` overlay and `--glass-specular` shadow stack are
942
- * inherited from the underlying `btn-audacious` utility. */
943
- .dock-tab-button[data-tier="primary"]:hover:not(:disabled) {
944
- --glass-grain-opacity: var(--glass-grain-opacity-disco, 0.08);
945
- background-image:
946
- var(--paper-clean-texture),
947
- radial-gradient(
948
- ellipse at 30% 30%,
949
- color-mix(in srgb, var(--phase-color, var(--foreground)) 18%, transparent),
950
- transparent 70%
951
- );
952
- background-blend-mode: overlay, normal;
953
- background-size: var(--paper-texture-size), auto;
954
- }
955
-
956
- /* Q.W3.A.4 — phase-tint backplate halo at the pill wrapper.
957
- *
958
- * The inner `<GlyphFace>` halo (`.glyph-face-backplate { inset: -25% }`)
959
- * gets clipped by the pill's `overflow: hidden`; the halo never escapes
960
- * the inner glyph wrapper. This `::before` lifts the phase-tint to the
961
- * pill itself so the glow composes with the whole CTA. Scoped to
962
- * active phases — at idle / ready the pill stays neutral and inherits
963
- * the W2.7 reservation ("disco fires on hover only"). */
964
- .dock-tab-button[data-tier="primary"][data-phase]:not([data-phase="ready"]):not([data-phase="idle"])::before {
965
- content: "";
966
- position: absolute;
967
- inset: 0;
968
- border-radius: inherit;
969
- background: radial-gradient(
970
- ellipse at 30% 30%,
971
- color-mix(in srgb, var(--phase-color, var(--foreground)) 18%, transparent) 0%,
972
- transparent 70%
973
- );
974
- pointer-events: none;
975
- z-index: -1;
976
- opacity: 1;
977
- transition: opacity var(--duration-fast) var(--ease-standard);
978
- }
979
-
980
- /* Tier — secondary ──────────────────────────────────────────
981
- *
982
- * Companion to `data-tier="primary"`. Carries the same edge-light +
983
- * edge-shadow skeu vocabulary at quieter weight: no disco accent, no
984
- * sparkle, no curvature radial. Composes for icon-button consumers
985
- * (chassis ActionCluster, SettingsCog) where the surface needs a
986
- * glass-tier read but not the audacious primary punch. Per P.W1.B
987
- * audit-C §3 — closes the four bare `<DockIconButton>` consumer sites
988
- * (cog + back + retake + stop) without redefining the family.
989
- */
990
- .dock-tab-button[data-tier="secondary"],
991
- .dock-icon-button[data-tier="secondary"] {
992
- background: color-mix(in srgb, var(--card) 50%, transparent);
993
- border: 1px solid var(--glass-border-quiet);
994
- box-shadow:
995
- var(--border-hairline),
996
- var(--glass-highlight);
997
- }
998
-
999
- .dock-tab-button[data-tier="secondary"]:hover:not(:disabled),
1000
- .dock-icon-button[data-tier="secondary"]:hover:not(:disabled) {
1001
- background: color-mix(in srgb, var(--card) 65%, transparent);
1002
- box-shadow:
1003
- var(--glass-specular),
1004
- 0 0.5px 0 0 rgb(0 0 0 / 0.06);
1005
- }
1006
-
1007
- .dock-select-trigger,
1008
- .dock-dropdown-trigger {
1009
- display: inline-flex;
1010
- align-items: center;
1011
- justify-content: center;
1012
- flex-shrink: 0;
1013
- /* AQ.W3 §W3.2 identity base */
1014
- scale: 1;
1015
- gap: var(--dock-trigger-gap, 0.25rem);
1016
- min-height: var(--dock-trigger-min-height, auto);
1017
- padding:
1018
- var(--dock-trigger-padding-block, 0.25rem)
1019
- var(--dock-trigger-padding-inline, 0.5rem);
1020
- white-space: nowrap;
1021
- cursor: pointer;
1022
- border: none;
1023
- background: transparent;
1024
- border-radius: var(--dock-control-radius, var(--radius-pill));
1025
- /* Shares the dock-icon-button legibility base (`--dock-fg-on-aurora`). */
1026
- color: color-mix(in srgb, var(--dock-fg-on-aurora, var(--foreground)) calc(var(--opacity-icon-muted) * 100%), transparent);
1027
- outline: none;
1028
- transition:
1029
- background-color var(--dock-motion-fast),
1030
- color var(--dock-motion-fast),
1031
- scale var(--dock-motion-fast),
1032
- opacity var(--dock-motion-fast);
1033
- }
1034
-
1035
- .dock-select-trigger:hover:not(:disabled),
1036
- .dock-dropdown-trigger:hover:not(:disabled) {
1037
- background: var(--muted);
1038
- color: var(--btn-hover-color, var(--foreground));
1039
- }
1040
-
1041
- .dock-dropdown-trigger:hover:not(:disabled) {
1042
- scale: var(--scale-hover-dock);
1043
- }
1044
-
1045
- .dock-select-trigger:active:not(:disabled),
1046
- .dock-dropdown-trigger:active:not(:disabled) {
1047
- scale: var(--scale-press-dock);
1048
- }
1049
-
1050
- .dock-select-trigger:focus:not(:focus-visible),
1051
- .dock-dropdown-trigger:focus:not(:focus-visible) {
1052
- box-shadow: none;
1053
- outline: none;
1054
- }
1055
-
1056
- /* focus-visible ring + disabled paint hoisted to the shared `:where()`
1057
- group at the top; this rule adds only the box-shadow fade transition. */
1058
- .dock-select-trigger:focus-visible,
1059
- .dock-dropdown-trigger:focus-visible {
1060
- transition:
1061
- background-color var(--dock-motion-fast),
1062
- color var(--dock-motion-fast),
1063
- scale var(--dock-motion-fast),
1064
- opacity var(--dock-motion-fast),
1065
- box-shadow var(--dock-motion-fast);
1066
- }
1067
-
1068
- .dock-select-trigger:is(.is-active, .active, [aria-expanded="true"], [aria-pressed="true"]),
1069
- .dock-dropdown-trigger:is(.is-active, .active, [aria-expanded="true"], [aria-pressed="true"]) {
1070
- background: var(--muted);
1071
- color: var(--foreground);
1072
- }
1073
-
1074
- .dock-select-trigger__chevron {
1075
- width: var(--dock-trigger-icon-size, 0.75rem);
1076
- height: var(--dock-trigger-icon-size, 0.75rem);
1077
- flex-shrink: 0;
1078
- opacity: 0.5;
1079
- /* Individual-transform identity base (AQ.W3 §W3.2) — `rotate:` longhand
1080
- for family consistency (not a stacking-context hazard: child glyph). */
1081
- rotate: 0deg;
1082
- transition: rotate var(--dock-motion-fast);
1083
- }
1084
-
1085
- .dock-select-trigger[data-state="open"] .dock-select-trigger__chevron {
1086
- rotate: 180deg;
1087
- }
1088
-
1089
- @media (min-width: 640px) {
1090
- .glass-dock.dock-wrap {
915
+ /* The `overflow="wrap"` desktop snap-back. Past the overflow breakpoint a
916
+ wrap-mode dock reverts from the narrow multi-row pill to a single nowrap
917
+ row. The breakpoint is the named token `--dock-overflow-bp` (tokens.css §9
918
+ Layout) — its single source-of-record. A `var()` cannot drive a
919
+ media-query feature in Baseline CSS, so this one `@media` realizes the
920
+ token's value; there is no longer a bare unexplained magic number — the
921
+ threshold lives under one name and is documented at its mint.
922
+ AV.W16 TW3 — KEPT as `@media` (not converted to `@container`): the wrap
923
+ dock is `max-width: calc(100vw - gutter)` — it spans the VIEWPORT by
924
+ contract, so the snap-back is genuinely viewport-semantic. The dock
925
+ establishes its own `dock` container and cannot self-query that
926
+ container for a rule on the dock root; the descendant-readable
927
+ label/density rules above are the container-query candidates. */
928
+ @media (min-width: 640px /* = var(--dock-overflow-bp) */) {
929
+ .glass-dock.dock-overflow-wrap {
1091
930
  white-space: nowrap;
1092
931
  border-radius: var(--radius-pill);
1093
932
  max-width: none;
1094
- padding:
1095
- var(--dock-wrap-desktop-padding-block, var(--dock-padding-block, 0.375rem))
933
+ padding: var(
934
+ --dock-wrap-desktop-padding-block,
935
+ var(--dock-padding-block, 0.375rem)
936
+ )
1096
937
  var(--dock-wrap-desktop-padding-inline, 0.75rem);
1097
938
  }
1098
939
 
1099
- .glass-dock.dock-wrap .dock-layer--full {
940
+ .glass-dock.dock-overflow-wrap .dock-layer--full {
1100
941
  flex-wrap: nowrap;
1101
942
  height: var(--dock-layer-height, 2.5rem);
1102
943
  gap: var(--dock-wrap-desktop-gap, var(--dock-layer-gap, 0.25rem));
1103
944
  }
1104
945
 
1105
- .glass-dock.dock-wrap .dock-layer--summary {
946
+ .glass-dock.dock-overflow-wrap .dock-layer--summary {
1106
947
  height: var(--dock-layer-height, 2.5rem);
1107
948
  }
1108
949
 
1109
- .glass-dock.dock-wrap .dock-separator {
950
+ .glass-dock.dock-overflow-wrap .dock-separator {
1110
951
  display: block;
1111
952
  }
1112
953
  }
@@ -1137,18 +978,11 @@
1137
978
  --size-icon-btn: var(--dock-touch-target, 2.75rem);
1138
979
  }
1139
980
 
1140
- /* S-2 — the in-dock floor above lifts the control-SIZE token, which
1141
- only reaches a DockIconButton that has a `.glass-dock` ancestor.
1142
- A STANDALONE DockIconButton (a routed settings gear, no dock
1143
- wrapper) reads the bare `--size-icon-btn` and would fall below the
1144
- 44px WCAG target. This button-level floor holds the touch box
1145
- regardless of ancestry; the in-dock rule above stays (more specific,
1146
- and it also reserves the slot in the dock's width-math). Compact
1147
- buttons opt out — they are auto-sized affordances, not primary
1148
- targets. */
1149
- .dock-icon-button:not(.dock-icon-button--compact) {
1150
- min-block-size: var(--dock-touch-target, 2.75rem);
1151
- min-inline-size: var(--dock-touch-target, 2.75rem);
1152
- }
981
+ /* S-2 — the in-dock floor above lifts the control-SIZE token (shell /
982
+ width-math), which only reaches a DockIconButton that has a
983
+ `.glass-dock` ancestor. The companion button-level floor (the
984
+ `.dock-icon-button:not(--compact)` `min-{block,inline}-size` that
985
+ reaches a STANDALONE DockIconButton with no dock wrapper) moved to
986
+ dock-controls.css with the rest of the control family (AU.W8b.3). */
1153
987
  }
1154
988
  }