@mkbabb/glass-ui 3.2.0 → 3.3.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 (305) 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/vReveal.d.ts +2 -0
  151. package/dist/composables/sidebar/useSidebarState.d.ts +2 -2
  152. package/dist/composables/sortable/dragController.d.ts +44 -0
  153. package/dist/composables/sortable/dropResolver.d.ts +34 -0
  154. package/dist/composables/sortable/ghostRenderer.d.ts +44 -0
  155. package/dist/composables/sortable/index.d.ts +1 -1
  156. package/dist/composables/sortable/touchGate.d.ts +26 -0
  157. package/dist/composables/sortable/transitionTiming.d.ts +50 -0
  158. package/dist/composables/sortable/types.d.ts +133 -0
  159. package/dist/composables/sortable/useSortable.d.ts +25 -153
  160. package/dist/configurator.js +1 -1
  161. package/dist/confirm-dialog.js +1 -1
  162. package/dist/controls.js +4 -4
  163. package/dist/createContext-DBMGRlx4.js +25 -0
  164. package/dist/dark.d.ts +2 -1
  165. package/dist/dark.js +9 -2
  166. package/dist/data-table.js +1 -1
  167. package/dist/dialog.js +1 -1
  168. package/dist/disco-glyph.js +1 -1
  169. package/dist/dock.js +400 -261
  170. package/dist/dockContext-spUj_-E5.js +9 -0
  171. package/dist/dom.js +6 -6
  172. package/dist/{dropdown-menu-naE0skDg.js → dropdown-menu-EFjl5iKo.js} +1 -1
  173. package/dist/dropdown-menu.js +1 -1
  174. package/dist/expandable-container.js +26 -20
  175. package/dist/fonts/README.md +21 -0
  176. package/dist/fonts/fraunces/fraunces-latin.woff2 +0 -0
  177. package/dist/forms.js +68 -59
  178. package/dist/glass-panel.js +1 -1
  179. package/dist/glass-ui.css +1 -1
  180. package/dist/glass-ui.js +226 -328
  181. package/dist/glyph-face.js +2 -2
  182. package/dist/goo-blob.d.ts +1 -0
  183. package/dist/goo-blob.js +538 -0
  184. package/dist/header-ribbon.js +2 -2
  185. package/dist/hover-card.js +1 -1
  186. package/dist/hover-popover.js +1 -1
  187. package/dist/icon-tooltip.js +1 -1
  188. package/dist/index.d.ts +1 -0
  189. package/dist/instrument-chassis.js +1 -1
  190. package/dist/instrument-rail.js +1 -1
  191. package/dist/keys-BFoma9vm.js +9 -0
  192. package/dist/label.js +1 -1
  193. package/dist/labeled-field.js +57 -39
  194. package/dist/metric-badge.js +1 -1
  195. package/dist/motion-core.js +82 -123
  196. package/dist/motion.js +62 -14
  197. package/dist/number-field.js +1 -1
  198. package/dist/paper-backdrop.js +1 -1
  199. package/dist/popover.js +1 -1
  200. package/dist/{presets-BpTf63Hp.js → presets-1OhFpaIC.js} +1 -1
  201. package/dist/prng-Bz_1Tydc.js +15 -0
  202. package/dist/progress.js +2 -2
  203. package/dist/reactive.js +2 -2
  204. package/dist/responsive-tabs.js +38 -32
  205. package/dist/scrolling-text.js +1 -1
  206. package/dist/search.js +8 -8
  207. package/dist/select.js +3 -3
  208. package/dist/separator.js +1 -1
  209. package/dist/sheet.js +1 -1
  210. package/dist/{slider-wx8ifVFB.js → slider-BOh8ycfZ.js} +7 -11
  211. package/dist/slider.js +1 -1
  212. package/dist/sortable-list.js +36 -38
  213. package/dist/stacked-icons.js +2 -2
  214. package/dist/styles/animations.css +1 -1
  215. package/dist/styles/cards.css +1 -1
  216. package/dist/styles/components.css +1 -1
  217. package/dist/styles/dock-controls.css +486 -0
  218. package/dist/styles/dock.css +275 -450
  219. package/dist/styles/fonts.css +25 -0
  220. package/dist/styles/glass-specular-track.css +154 -0
  221. package/dist/styles/glass.css +74 -2
  222. package/dist/styles/index.css +21 -2
  223. package/dist/styles/instrument-chassis.css +11 -4
  224. package/dist/styles/theme.css +73 -21
  225. package/dist/styles/tokens.css +271 -140
  226. package/dist/styles/typography.css +14 -8
  227. package/dist/styles/utilities.css +36 -8
  228. package/dist/styles/view-transition.css +10 -4
  229. package/dist/switch.js +1 -1
  230. package/dist/tabs.js +139 -112
  231. package/dist/timeline.js +219 -158
  232. package/dist/toast.js +1 -1
  233. package/dist/toggle-group.js +1 -1
  234. package/dist/tokens.d.ts +1 -1
  235. package/dist/tooltip.js +1 -1
  236. package/dist/{useAnimatedNumber-BOxrS3a6.js → useAnimatedNumber-BF6r64lA.js} +1 -1
  237. package/dist/useClipboard-D8vFyRCa.js +97 -0
  238. package/dist/{useConfiguratorState-Dq2gNv4A.js → useConfiguratorState-DUtC1jxr.js} +82 -86
  239. package/dist/useGlobalDark-CWiaCoEw.js +34 -0
  240. package/dist/useIntersectionPause-DAdVPVp4.js +53 -0
  241. package/dist/useSortable-DnyGXKKY.js +246 -0
  242. package/dist/{useTouchGate-XX8gHfay.js → useTouchGate-CS5Csc2h.js} +1 -1
  243. package/dist/utils/prng.d.ts +4 -0
  244. package/dist/vReveal-u2wSG2El.js +35 -0
  245. package/dist/watercolor-dot.d.ts +1 -0
  246. package/dist/watercolor-dot.js +129 -0
  247. package/package.json +98 -14
  248. package/src/fonts/README.md +21 -0
  249. package/src/fonts/fraunces/fraunces-latin.woff2 +0 -0
  250. package/src/styles/animations.css +1 -1
  251. package/src/styles/cards.css +1 -1
  252. package/src/styles/dock-controls.css +486 -0
  253. package/src/styles/dock.css +275 -450
  254. package/src/styles/fonts.css +25 -0
  255. package/src/styles/glass-specular-track.css +154 -0
  256. package/src/styles/glass.css +74 -2
  257. package/src/styles/index.css +21 -2
  258. package/src/styles/instrument-chassis.css +11 -4
  259. package/src/styles/theme.css +73 -21
  260. package/src/styles/tokens.css +271 -140
  261. package/src/styles/typography.css +14 -8
  262. package/src/styles/utilities.css +36 -8
  263. package/src/styles/view-transition.css +10 -4
  264. package/dist/DataTable-BsrDYdoE.js +0 -460
  265. package/dist/DialogContent-B61rP8lj.js +0 -93
  266. package/dist/HoverPopover-BlEwqG7S.js +0 -96
  267. package/dist/Input-IFsIzId2.js +0 -30
  268. package/dist/Progress-Bs44qWEM.js +0 -126
  269. package/dist/UnderlineTabs-B4FV2zi_.js +0 -37
  270. package/dist/components/custom/aurora/shaders/aurora.frag.d.ts +0 -1
  271. package/dist/composables/dom/useBreakpoint.d.ts +0 -38
  272. package/dist/composables/dom/useIdleReady.d.ts +0 -63
  273. package/dist/composables/dom/useViewportReady.d.ts +0 -87
  274. package/dist/composables/glass/webgl/frostShader.d.ts +0 -27
  275. package/dist/composables/motion/useAnimatedNumberMap.d.ts +0 -29
  276. package/dist/composables/motion/useStagger.d.ts +0 -50
  277. package/dist/dockContext-DM58L1Jt.js +0 -16
  278. package/dist/keys-SIKQYNx1.js +0 -11
  279. package/dist/supportsCssTimeline-IQY3gfKD.js +0 -12
  280. package/dist/useGlobalDark-BUUTZvkU.js +0 -24
  281. package/dist/useIdleReady-sLhGo6CL.js +0 -162
  282. package/dist/useIntersectionPause-CUmANkoc.js +0 -39
  283. package/dist/useSortable-DLK9kwZp.js +0 -189
  284. /package/dist/{HoverCardContent-DGUhpRVt.js → HoverCardContent-ICfIMZX1.js} +0 -0
  285. /package/dist/{InstrumentChassis-CqKPBNqp.js → InstrumentChassis-DaHIZCqy.js} +0 -0
  286. /package/dist/{InstrumentRail-CCjvKkpB.js → InstrumentRail-B0qqLFN0.js} +0 -0
  287. /package/dist/{Label-D53EOwLE.js → Label-CZk-3nTc.js} +0 -0
  288. /package/dist/{PaperBackdrop-Ds-wDsKf.js → PaperBackdrop-D_YZW47j.js} +0 -0
  289. /package/dist/{SelectGroup-DAgcsfFw.js → SelectGroup-CMdoCjRE.js} +0 -0
  290. /package/dist/{SelectSeparator-DN1jzLaI.js → SelectSeparator-CaJnPF3_.js} +0 -0
  291. /package/dist/{Separator-DXxac0j8.js → Separator-C2XtAXRp.js} +0 -0
  292. /package/dist/{Switch-imA0Hdjs.js → Switch-x8n6husW.js} +0 -0
  293. /package/dist/{Toaster-Brs6QjBU.js → Toaster-DdhMKfus.js} +0 -0
  294. /package/dist/{TooltipProvider-MZFRxOvT.js → TooltipProvider-D-JrSqDu.js} +0 -0
  295. /package/dist/components/custom/aurora/{renderMode.d.ts → constants/renderMode.d.ts} +0 -0
  296. /package/dist/components/custom/aurora/{shaders → constants/shaders}/aurora.vert.d.ts +0 -0
  297. /package/dist/{constants-DfWPi8kh.js → constants-DsCdlK9I.js} +0 -0
  298. /package/dist/{sheet-BnvZRXPq.js → sheet-CQYYrkr9.js} +0 -0
  299. /package/dist/{useGlassRenderer-C98tZnJ7.js → useGlassRenderer-Dn3WpfG-.js} +0 -0
  300. /package/dist/{useInterval-B58LmYth.js → useInterval-CHVYFpXV.js} +0 -0
  301. /package/dist/{useResizeObserver-C_7GjpRn.js → useResizeObserver-DX-STszm.js} +0 -0
  302. /package/dist/{useTextHighlight-CLST6an0.js → useTextHighlight-Dmtofpk2.js} +0 -0
  303. /package/dist/{useTimer-6FoosoDY.js → useTimer-DGgoxTXL.js} +0 -0
  304. /package/dist/{useUserInvalidAria-BW5iyqWR.js → useUserInvalidAria-DmvZ_6Dx.js} +0 -0
  305. /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,15 @@
64
68
  position: relative;
65
69
  display: inline-flex;
66
70
  align-items: center;
71
+ /* AV.W16 TW3 — the dock establishes an inline-size container named
72
+ `dock` so its descendants (the label glyph, the density rules)
73
+ read the dock's OWN box, not the viewport. This makes the dock
74
+ portable into a 320px sidebar: the label compresses off the
75
+ dock's box width, not `@media`. A consumer that sets the
76
+ `containerName` prop overrides the name via inline style (the
77
+ explicit container-query opt-in); the default `dock` name backs
78
+ the built-in label/density container reads below. */
79
+ container: dock / inline-size;
67
80
  border-radius: var(--radius-dock);
68
81
  white-space: nowrap;
69
82
  max-inline-size: var(--dock-max-inline-size);
@@ -71,18 +84,19 @@
71
84
  background: var(--glass-bg-dock, var(--glass-bg-resting));
72
85
  backdrop-filter: var(--dock-surface-blur);
73
86
  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]) {
87
+ /* AV.W15 M3 — the full-perimeter `--glass-edge-light` rim rides as the
88
+ leading inset layer of the dock shadow stack (the navigation-band
89
+ silhouette catch-light, distinct from the top-only highlight). */
90
+ box-shadow: var(--glass-edge-light), var(--shadow-dock-override, var(--shadow-dock));
91
+ }
92
+
93
+ /* `overflow: hidden` is the clip shell for every dock. AT.W7-dock-a
94
+ folded out the prior `containerName` clip-lift (the container-query
95
+ opt-in is orthogonal it no longer silently changes the clip), so the
96
+ clip applies universally and the `.expanded` / `.always-expanded` /
97
+ `.dock-overflow-wrap` states lift it back to `visible` where they need to
98
+ grow. A consumer wanting multi-line content opts into `overflow="wrap"`. */
99
+ .glass-dock {
86
100
  overflow: hidden;
87
101
  }
88
102
 
@@ -92,10 +106,22 @@
92
106
  --dock-control-size: var(--dock-density-compact-control-size, 2rem);
93
107
  --dock-layer-height: var(--dock-density-compact-layer-height, 2rem);
94
108
  --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);
109
+ --dock-trigger-padding-block: var(
110
+ --dock-density-compact-trigger-padding-block,
111
+ 0.1875rem
112
+ );
113
+ --dock-trigger-padding-inline: var(
114
+ --dock-density-compact-trigger-padding-inline,
115
+ 0.4375rem
116
+ );
117
+ --dock-tab-padding-block: var(
118
+ --dock-density-compact-tab-padding-block,
119
+ 0.3125rem
120
+ );
121
+ --dock-tab-padding-inline: var(
122
+ --dock-density-compact-tab-padding-inline,
123
+ 0.625rem
124
+ );
99
125
  --dock-tab-h: 32px;
100
126
  }
101
127
 
@@ -107,10 +133,22 @@
107
133
  --dock-control-size: var(--dock-density-comfortable-control-size, 2.5rem);
108
134
  --dock-layer-height: var(--dock-density-comfortable-layer-height, 2.5rem);
109
135
  --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);
136
+ --dock-trigger-padding-block: var(
137
+ --dock-density-comfortable-trigger-padding-block,
138
+ 0.25rem
139
+ );
140
+ --dock-trigger-padding-inline: var(
141
+ --dock-density-comfortable-trigger-padding-inline,
142
+ 0.5rem
143
+ );
144
+ --dock-tab-padding-block: var(
145
+ --dock-density-comfortable-tab-padding-block,
146
+ 0.4375rem
147
+ );
148
+ --dock-tab-padding-inline: var(
149
+ --dock-density-comfortable-tab-padding-inline,
150
+ 0.75rem
151
+ );
114
152
  --dock-tab-h: 38px;
115
153
  }
116
154
 
@@ -120,10 +158,22 @@
120
158
  --dock-control-size: var(--dock-density-spacious-control-size, 2.75rem);
121
159
  --dock-layer-height: var(--dock-density-spacious-layer-height, 2.75rem);
122
160
  --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);
161
+ --dock-trigger-padding-block: var(
162
+ --dock-density-spacious-trigger-padding-block,
163
+ 0.375rem
164
+ );
165
+ --dock-trigger-padding-inline: var(
166
+ --dock-density-spacious-trigger-padding-inline,
167
+ 0.625rem
168
+ );
169
+ --dock-tab-padding-block: var(
170
+ --dock-density-spacious-tab-padding-block,
171
+ 0.5rem
172
+ );
173
+ --dock-tab-padding-inline: var(
174
+ --dock-density-spacious-tab-padding-inline,
175
+ 0.875rem
176
+ );
127
177
  --dock-tab-h: 44px;
128
178
  }
129
179
 
@@ -137,25 +187,43 @@
137
187
  --dock-control-size: var(--dock-density-audacious-control-size, 4rem);
138
188
  --dock-layer-height: var(--dock-density-audacious-layer-height, 4rem);
139
189
  --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);
190
+ --dock-trigger-padding-block: var(
191
+ --dock-density-audacious-trigger-padding-block,
192
+ 0.625rem
193
+ );
194
+ --dock-trigger-padding-inline: var(
195
+ --dock-density-audacious-trigger-padding-inline,
196
+ 1rem
197
+ );
198
+ --dock-tab-padding-block: var(
199
+ --dock-density-audacious-tab-padding-block,
200
+ 0.5rem
201
+ );
202
+ --dock-tab-padding-inline: var(
203
+ --dock-density-audacious-tab-padding-inline,
204
+ 1.5rem
205
+ );
144
206
  --dock-tab-min-height: var(--dock-density-audacious-tab-min-height, 3.5rem);
145
207
  --dock-tab-h: var(--dock-density-audacious-tab-min-height, 3.5rem);
146
208
  }
147
209
 
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"] {
210
+ /* Density-audacious narrow-box carve (AV.W16 TW3) when the dock's OWN
211
+ box is narrow the audacious-dock label glyphs compress so the chrome
212
+ doesn't overflow its host (≤14px below 30rem, 15px 3045rem). Keyed off
213
+ the dock's `dock` inline-size container (established on `.glass-dock`
214
+ above) rather than the viewport — so a dock dropped into a 320px
215
+ sidebar compresses its label off ITS box, not the page width. The var
216
+ is set on the `.dock-label` descendant (which reads it via
217
+ `font-size: var(--dock-label-size)`, typography.css). Thresholds keep
218
+ the prior 479/719px viewport cadence as box widths (30rem ≈ 480px,
219
+ 45rem ≈ 720px at the 16px root). */
220
+ @container dock (max-width: 29.9375rem) {
221
+ .glass-dock[data-density="audacious"] .dock-label {
154
222
  --dock-label-size: 14px;
155
223
  }
156
224
  }
157
- @media (min-width: 480px) and (max-width: 719px) {
158
- .glass-dock[data-density="audacious"] {
225
+ @container dock (min-width: 30rem) and (max-width: 44.9375rem) {
226
+ .glass-dock[data-density="audacious"] .dock-label {
159
227
  --dock-label-size: 15px;
160
228
  }
161
229
  }
@@ -192,7 +260,7 @@
192
260
  }
193
261
 
194
262
  /* Vertical rails grow-to-fit + clamp, no scroll: descendants wrap to
195
- multiple rows (opt-in via `dock-wrap`) or clamp via
263
+ multiple rows (opt-in via `overflow="wrap"`) or clamp via
196
264
  `--dock-max-block-size`; the cap fails visibly rather than masking
197
265
  overflow as a scroll affordance. No edge-fade mask — a rail that never
198
266
  scrolls has nothing to feather. */
@@ -262,7 +330,10 @@
262
330
  * `.variant-instrument-strip` — chassis-strip carries ONE canonical
263
331
  * border-radius (`--radius-card`), per the chassis family. */
264
332
  .glass-dock.variant-instrument-strip {
265
- padding: var(--dock-instrument-strip-padding, var(--dock-padding-inline, 0.75rem));
333
+ padding: var(
334
+ --dock-instrument-strip-padding,
335
+ var(--dock-padding-inline, 0.75rem)
336
+ );
266
337
  background: var(--glass-bg-chassis, var(--glass-bg-wash));
267
338
  border: 1px solid var(--glass-border-quiet, var(--glass-border-resting));
268
339
  border-radius: var(--radius-card);
@@ -305,7 +376,10 @@
305
376
  }
306
377
 
307
378
  .glass-dock.collapsed .dock-layer--summary {
308
- min-width: var(--dock-collapsed-summary-min-size, var(--dock-layer-height, 2.5rem));
379
+ min-width: var(
380
+ --dock-collapsed-summary-min-size,
381
+ var(--dock-layer-height, 2.5rem)
382
+ );
309
383
  justify-content: center;
310
384
  }
311
385
 
@@ -383,15 +457,43 @@
383
457
  transition: width var(--dock-motion-resize);
384
458
  }
385
459
 
460
+ /* AV.W9.0 — the AU.W8b native container-morph arm (the `@supports` block that
461
+ opted the subtree into auto-to-length width interpolation and declared the
462
+ active layer's destination width as intrinsic) is RETIRED. It was never made
463
+ mutually exclusive with the `SpringProgress` FLIP driver in
464
+ `useLayerTransition.ts`: on Chrome 129+ the native arm interpolated
465
+ `.dock-layers` width on the browser's own clock WHILE the spring wrote inline
466
+ `width` per frame — a dual-driver race over the SAME property that cancelled
467
+ the morph and froze the dock at runtime (born-RED under
468
+ `proof:dock-animation-live`). One authority per concern: the size morph now
469
+ has exactly ONE driver on every engine — the `SpringProgress` FLIP path above
470
+ (`:382`), or the orthogonal View-Transitions path inside
471
+ `startViewTransition` (which owns size + crossfade as a single browser-side
472
+ mutation and never touches inline width). Neither coexists with a CSS-native
473
+ intrinsic-width destination, so the race is gone. This re-expresses the
474
+ `e8380d7` "one driver owns the morph" invariant on the modern
475
+ FLIP+spring(+VT) architecture. */
476
+
386
477
  /* Horizontal dock content grows visibly when the active layer's natural
387
478
  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,
479
+ into `overflow="wrap"`). No edge-fade mask — content never clips or scrolls,
389
480
  so a feather has nothing to feather and only bleeds a stray ramp onto
390
481
  the edge controls. */
391
- .glass-dock.expanded:not(.dock-wrap) > .dock-layers {
482
+ .glass-dock.expanded:not(.dock-overflow-wrap) > .dock-layers {
392
483
  overflow-x: visible;
393
484
  }
394
485
 
486
+ /* AU.W8b-visibility-fork — the 3-state active/inactive/leaving visibility
487
+ contract below is LOAD-BEARING (the a11y-006 bite-anchor). A later refactor
488
+ greps for this marker so the semantics are not collapsed: the inactive layer
489
+ leaves the hit-test tree (`visibility:hidden`), the leaving layer stays
490
+ painted-but-untouchable through its fade (`visibility:visible` +
491
+ `pointer-events:none`), and the active layer shows IMMEDIATELY (`visibility
492
+ 0s`, no fade-in delay). The hand-rolled 3-state fork below is now the SOLE
493
+ visibility authority on every engine — AV.W9.1 retired the native
494
+ discrete-visibility arm that used to second-drive it, so one owner governs
495
+ visibility (one owner governs size, one owns opacity). */
496
+
395
497
  /* ── Layer crossfade + hit-test contract (shared) ──────────────────
396
498
  Two dock-layer surfaces stack on a 1/1 CSS grid and crossfade:
397
499
  `.dock-layer` (GlassDock's built-in collapsed↔expanded pair) and
@@ -409,12 +511,21 @@
409
511
  flow, so the FLIP width measurement in `useLayerTransition` still
410
512
  reads its geometry (`display:none` would zero it). The delayed
411
513
  `visibility` transition holds a leaving layer `visible` for the
412
- length of the opacity crossfade, then flips it `hidden`. */
514
+ length of the opacity crossfade, then flips it `hidden`.
515
+
516
+ AU.W2 — the opacity-lockstep fold (slides-F P0, the "not iOS-smooth"
517
+ report). The layer fade rides `--dock-motion-resize` (the SAME duration +
518
+ spring the container morph runs at, `:189`/`:216`/`:385`) — NOT the faster
519
+ `--dock-motion-fast` (0.2s). Before, the host faded in 0.2s while the
520
+ container morphed in 0.3s: a 100ms-apart settle (the items appeared to lag
521
+ the pill). Now the fade and the morph settle in lockstep. The matched
522
+ `visibility` hold extends to `--duration-normal` so the leaving layer stays
523
+ paintable for the FULL (now longer) crossfade. */
413
524
  .dock-layer,
414
525
  .dock-layer-item-host {
415
526
  transition:
416
- opacity var(--dock-motion-fast),
417
- visibility 0s linear var(--duration-fast);
527
+ opacity var(--dock-motion-resize),
528
+ visibility 0s linear var(--duration-normal);
418
529
  }
419
530
 
420
531
  .dock-layer:not(.layer-active),
@@ -429,9 +540,12 @@
429
540
  opacity: 1;
430
541
  visibility: visible;
431
542
  pointer-events: auto;
432
- /* The active layer shows immediately — no deferred `visibility`. */
543
+ /* The active layer shows immediately — no deferred `visibility`. AU.W2:
544
+ the opacity rides `--dock-motion-resize` (lockstep with the container
545
+ morph), but the `visibility 0s` stays immediate (the `:434` rule
546
+ governs — the active layer must paint at once, no fade-in delay). */
433
547
  transition:
434
- opacity var(--dock-motion-fast),
548
+ opacity var(--dock-motion-resize),
435
549
  visibility 0s;
436
550
  }
437
551
 
@@ -445,6 +559,19 @@
445
559
  pointer-events: none;
446
560
  }
447
561
 
562
+ /* AV.W9.1 — the AU.W8b native discrete-visibility arm (the second `@supports`
563
+ block that expressed the 3-state contract as one discrete transition over
564
+ opacity + visibility with a `@starting-style` entry anchor) is RETIRED. It
565
+ was a THIRD opacity/visibility authority overlapping the hand-rolled 3-state
566
+ fork above and the spring's settle — three owners for one concern. With the
567
+ native size arm gone (W9.0), opacity now has ONE owner everywhere: the
568
+ `opacity var(--dock-motion-resize)` crossfade on `.dock-layer{,-item-host}`
569
+ (the AU.W2 lockstep token — kept), and visibility has ONE owner: the delayed
570
+ `visibility 0s linear var(--duration-normal)` hold of the
571
+ `AU.W8b-visibility-fork` 3-state fallback above (the a11y-006 bite-anchor,
572
+ LOAD-BEARING). One authority per concern: size = spring/VT, opacity = the
573
+ CSS crossfade, visibility = the delayed-hold fork. */
574
+
448
575
  /* ── Base layout — distinct per surface ─────────────────────────── */
449
576
  .dock-layer {
450
577
  display: flex;
@@ -503,7 +630,7 @@
503
630
  so the pill's rounded edge masks the scroll boundary — hence the
504
631
  grow-mode `overflow-x: visible` (`.dock-layers`, above) is overridden
505
632
  back to `hidden` here. */
506
- .glass-dock.dock-scroll-x.expanded:not(.dock-wrap) > .dock-layers {
633
+ .glass-dock.dock-scroll-x.expanded:not(.dock-overflow-wrap) > .dock-layers {
507
634
  overflow-x: hidden;
508
635
  }
509
636
 
@@ -539,33 +666,40 @@
539
666
  display: none;
540
667
  }
541
668
 
542
- .glass-dock.dock-wrap {
669
+ /* ── `overflow="wrap"` recipe (the `.dock-overflow-wrap` hook) ────────
670
+ Parallel to the `.dock-scroll-{x,y}` hooks the `overflow="scroll"`
671
+ member emits: the `overflow="wrap"` enum member emits this class. (The
672
+ prior `wrap` boolean's hook is retired — clean break, no alias.)
673
+ Expanded content wraps to multiple rows; the pill narrows to the
674
+ viewport gutter and snaps back to a single nowrap row past
675
+ `--dock-overflow-bp` (the `@media` at the tail). */
676
+ .glass-dock.dock-overflow-wrap {
543
677
  white-space: normal;
544
678
  border-radius: var(--radius-2xl);
545
679
  max-width: var(--dock-wrap-max-width);
546
- padding:
547
- var(--dock-wrap-padding-block, var(--dock-padding-block, 0.375rem))
680
+ padding: var(--dock-wrap-padding-block, var(--dock-padding-block, 0.375rem))
548
681
  var(--dock-wrap-padding-inline, 0.625rem);
549
682
  }
550
683
 
551
- .glass-dock.dock-wrap .dock-layer--full {
684
+ .glass-dock.dock-overflow-wrap .dock-layer--full {
552
685
  flex-wrap: wrap;
553
686
  justify-content: center;
554
687
  height: auto;
555
688
  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));
689
+ gap: var(--dock-wrap-row-gap, 0.25rem)
690
+ var(--dock-wrap-column-gap, var(--dock-layer-gap, 0.375rem));
557
691
  }
558
692
 
559
- .glass-dock.dock-wrap .dock-layer--summary {
693
+ .glass-dock.dock-overflow-wrap .dock-layer--summary {
560
694
  height: auto;
561
695
  min-height: var(--dock-wrap-layer-min-height, var(--dock-layer-height, 2rem));
562
696
  }
563
697
 
564
- .glass-dock.dock-wrap .dock-separator {
698
+ .glass-dock.dock-overflow-wrap .dock-separator {
565
699
  display: none;
566
700
  }
567
701
 
568
- .glass-dock.dock-wrap.collapsed {
702
+ .glass-dock.dock-overflow-wrap.collapsed {
569
703
  border-radius: var(--radius-pill);
570
704
  white-space: nowrap;
571
705
  max-width: none;
@@ -633,7 +767,16 @@
633
767
  border-top: 1px solid color-mix(in srgb, var(--border) 30%, transparent);
634
768
  }
635
769
 
770
+ /* AU.W8.4 — the rail is a reka-ui Tabs contract. The travelling
771
+ `.dock-layer-tab-indicator` (the reka TabsIndicator) now carries the
772
+ active affordance; the rail is `position: relative` so the indicator's
773
+ absolute placement is rail-local. */
774
+ .dock-layer-rail {
775
+ position: relative;
776
+ }
777
+
636
778
  .dock-layer-rail .dock-layer-tab {
779
+ position: relative;
637
780
  display: inline-flex;
638
781
  align-items: center;
639
782
  justify-content: center;
@@ -646,6 +789,8 @@
646
789
  cursor: pointer;
647
790
  font: inherit;
648
791
  font-size: 0.75rem;
792
+ /* The tab glyph rides above the travelling indicator backplate. */
793
+ z-index: 1;
649
794
  transition:
650
795
  background var(--dock-motion-fast),
651
796
  color var(--dock-motion-fast);
@@ -656,11 +801,47 @@
656
801
  color: var(--foreground);
657
802
  }
658
803
 
659
- .dock-layer-rail .dock-layer-tab.is-active {
660
- background: color-mix(in srgb, var(--primary) 15%, transparent);
804
+ /* AU.W8.4 — KEEP the active glyph tint on the selected tab (reka emits
805
+ `data-state="active"` + `aria-selected="true"`); the per-button active
806
+ BACKGROUND is RETIRED — the travelling indicator carries that affordance. */
807
+ .dock-layer-rail .dock-layer-tab[data-state="active"] {
661
808
  color: var(--primary);
662
809
  }
663
810
 
811
+ /* AU.W8.4 — the dock control focus-ring contract does not cover
812
+ `.dock-layer-tab` (the rail tab is not in the `.dock-icon-button` family).
813
+ The roving tabindex means only the active tab is in the tab order; a
814
+ focus-visible tab paints the shared dock ring. */
815
+ .dock-layer-rail [role="tab"]:focus-visible {
816
+ box-shadow: var(--focus-ring-shadow);
817
+ outline: none;
818
+ }
819
+
820
+ /* AU.W8.4 — the travelling indicator (reka TabsIndicator). reka computes
821
+ `--reka-tabs-indicator-position` + `--reka-tabs-indicator-size` from the
822
+ active tab's geometry; the indicator morphs between tabs riding
823
+ `--dock-motion-resize` (= `--spring-dock` after AU.W8.2) — NOT a hardcoded
824
+ `--spring-snappy`. It paints the active-tab backplate the per-button
825
+ `.is-active` background used to. */
826
+ .dock-layer-rail .dock-layer-tab-indicator {
827
+ position: absolute;
828
+ left: 0;
829
+ top: 0;
830
+ height: var(--dock-layer-tab-size, var(--dock-control-size, 1.75rem));
831
+ width: var(--reka-tabs-indicator-size);
832
+ transform: translateX(var(--reka-tabs-indicator-position));
833
+ border-radius: var(--dock-layer-tab-radius, var(--radius-sm));
834
+ background: color-mix(in srgb, var(--primary) 15%, transparent);
835
+ transition:
836
+ width var(--dock-motion-resize),
837
+ transform var(--dock-motion-resize);
838
+ pointer-events: none;
839
+ }
840
+
841
+ /* For a vertical rail the indicator travels along the inline axis still
842
+ (the horizontal-always keyboard decision keeps the indicator inline);
843
+ reka's position var resolves to the active tab offset regardless. */
844
+
664
845
  .dock-layer-stack {
665
846
  position: relative;
666
847
  display: grid;
@@ -706,79 +887,14 @@
706
887
  height: max-content;
707
888
  }
708
889
 
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
- }
890
+ /* AU.W8b.3 — the five dock CONTROL families (.dock-icon-button,
891
+ .dark-mode-toggle-button, .dock-tab-button + tiers, the
892
+ .dock-select-trigger / .dock-dropdown-trigger pair, and the coarse-pointer
893
+ per-button touch floor) carved out to dock-controls.css (imported directly
894
+ after this file in index.css, same @layer components). dock.css keeps the
895
+ shell / density / grain / layer-crossfade contract + the shared
896
+ cross-control four-state comma-groups (the :focus-visible / :disabled groups
897
+ + the motion-token :where() group above). */
782
898
 
783
899
  /* J.W3.B — `.dock-popover` substrate + `pop-up-*` / `pop-down-*`
784
900
  Vue Transition keyframes retired. Hover-driven dock popovers
@@ -787,326 +903,42 @@
787
903
  `popover-animate` motion vocabulary. Click-anchored popovers
788
904
  (no dock-keep semantics) compose `<Popover>` directly. */
789
905
 
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 {
906
+ /* The `overflow="wrap"` desktop snap-back. Past the overflow breakpoint a
907
+ wrap-mode dock reverts from the narrow multi-row pill to a single nowrap
908
+ row. The breakpoint is the named token `--dock-overflow-bp` (tokens.css §9
909
+ Layout) — its single source-of-record. A `var()` cannot drive a
910
+ media-query feature in Baseline CSS, so this one `@media` realizes the
911
+ token's value; there is no longer a bare unexplained magic number — the
912
+ threshold lives under one name and is documented at its mint.
913
+ AV.W16 TW3 — KEPT as `@media` (not converted to `@container`): the wrap
914
+ dock is `max-width: calc(100vw - gutter)` — it spans the VIEWPORT by
915
+ contract, so the snap-back is genuinely viewport-semantic. The dock
916
+ establishes its own `dock` container and cannot self-query that
917
+ container for a rule on the dock root; the descendant-readable
918
+ label/density rules above are the container-query candidates. */
919
+ @media (min-width: 640px /* = var(--dock-overflow-bp) */) {
920
+ .glass-dock.dock-overflow-wrap {
1091
921
  white-space: nowrap;
1092
922
  border-radius: var(--radius-pill);
1093
923
  max-width: none;
1094
- padding:
1095
- var(--dock-wrap-desktop-padding-block, var(--dock-padding-block, 0.375rem))
924
+ padding: var(
925
+ --dock-wrap-desktop-padding-block,
926
+ var(--dock-padding-block, 0.375rem)
927
+ )
1096
928
  var(--dock-wrap-desktop-padding-inline, 0.75rem);
1097
929
  }
1098
930
 
1099
- .glass-dock.dock-wrap .dock-layer--full {
931
+ .glass-dock.dock-overflow-wrap .dock-layer--full {
1100
932
  flex-wrap: nowrap;
1101
933
  height: var(--dock-layer-height, 2.5rem);
1102
934
  gap: var(--dock-wrap-desktop-gap, var(--dock-layer-gap, 0.25rem));
1103
935
  }
1104
936
 
1105
- .glass-dock.dock-wrap .dock-layer--summary {
937
+ .glass-dock.dock-overflow-wrap .dock-layer--summary {
1106
938
  height: var(--dock-layer-height, 2.5rem);
1107
939
  }
1108
940
 
1109
- .glass-dock.dock-wrap .dock-separator {
941
+ .glass-dock.dock-overflow-wrap .dock-separator {
1110
942
  display: block;
1111
943
  }
1112
944
  }
@@ -1137,18 +969,11 @@
1137
969
  --size-icon-btn: var(--dock-touch-target, 2.75rem);
1138
970
  }
1139
971
 
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
- }
972
+ /* S-2 — the in-dock floor above lifts the control-SIZE token (shell /
973
+ width-math), which only reaches a DockIconButton that has a
974
+ `.glass-dock` ancestor. The companion button-level floor (the
975
+ `.dock-icon-button:not(--compact)` `min-{block,inline}-size` that
976
+ reaches a STANDALONE DockIconButton with no dock wrapper) moved to
977
+ dock-controls.css with the rest of the control family (AU.W8b.3). */
1153
978
  }
1154
979
  }