@mkbabb/glass-ui 3.8.0 → 3.10.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 (228) hide show
  1. package/README.md +1 -6
  2. package/dist/{CardAction-q2qHCJFG.js → CardAction-DuArVky-.js} +4 -4
  3. package/dist/{CommandShortcut-SzWRhROC.js → CommandShortcut-CefCj5mt.js} +7 -7
  4. package/dist/{ContextMenuSubContent-Do977Cbf.js → ContextMenuSubContent-Bhg4f5jX.js} +3 -3
  5. package/dist/{DataTable-CvlWXz65.js → DataTable-CUHMukiQ.js} +1 -1
  6. package/dist/{DialogContent-DjZWT3lK.js → DialogContent-BRkT1cjP.js} +1 -1
  7. package/dist/{MetricBadge-lTc002u2.js → MetricBadge-BZVWIxNy.js} +6 -4
  8. package/dist/{Notification-BxK8LZMw.js → Notification-DLMhblXR.js} +2 -2
  9. package/dist/{NumberFieldContent-CLNVR1iY.js → NumberFieldContent-BbLOh8RU.js} +2 -2
  10. package/dist/{SelectScrollDownButton-C7TRe-ep.js → SelectScrollDownButton-T32cVFeM.js} +3 -3
  11. package/dist/{SelectSeparator-L8pPEn4L.js → SelectSeparator-C4Ql0gzV.js} +1 -1
  12. package/dist/{Switch-LDKLmmgx.js → Switch-Ch-k3Rv-.js} +1 -1
  13. package/dist/{TabsList-qyHZ2lKY.js → TabsList-B8CVOQPC.js} +2 -2
  14. package/dist/{Toaster-CabYEEF_.js → Toaster-1rYWrmAm.js} +1 -1
  15. package/dist/{ToggleGroupItem-CkXUcBlt.js → ToggleGroupItem-Cev4pOVK.js} +4 -4
  16. package/dist/animated-digit.js +1 -1
  17. package/dist/api/index.d.ts +2 -1
  18. package/dist/api.js +1 -1
  19. package/dist/aurora.js +236 -545
  20. package/dist/{badge-DHQrc_GQ.js → badge-CaoFJzRb.js} +5 -5
  21. package/dist/badge.js +1 -1
  22. package/dist/{button-CAywcrhO.js → button-DN39cGqL.js} +13 -12
  23. package/dist/button.js +1 -1
  24. package/dist/card.js +1 -1
  25. package/dist/carousel.js +1 -1
  26. package/dist/color.js +1 -1
  27. package/dist/command.js +1 -1
  28. package/dist/{compile-BBTRjvQS.js → compile-BOXjLUxu.js} +24 -24
  29. package/dist/components/custom/aurora/composables/atoms.d.ts +21 -4
  30. package/dist/components/custom/aurora/composables/runtime.d.ts +0 -9
  31. package/dist/components/custom/aurora/composables/uniformBridge.d.ts +0 -11
  32. package/dist/components/custom/aurora/constants/renderMode.d.ts +0 -32
  33. package/dist/components/custom/aurora/constants/shaders/brush.glsl.d.ts +1 -1
  34. package/dist/components/custom/aurora/constants/shaders/mediums.glsl.d.ts +2 -2
  35. package/dist/components/custom/aurora/constants/shaders/tonemap.glsl.d.ts +1 -1
  36. package/dist/components/custom/aurora/index.d.ts +1 -1
  37. package/dist/components/custom/configurator/ConfiguratorLayer.vue.d.ts +1 -1
  38. package/dist/components/custom/constellation/Constellation.vue.d.ts +73 -1
  39. package/dist/components/custom/constellation/constellationField.d.ts +255 -3
  40. package/dist/components/custom/constellation/index.d.ts +2 -2
  41. package/dist/components/custom/dock/DockSeparator.vue.d.ts +3 -0
  42. package/dist/components/custom/dock/DockTabButton.vue.d.ts +4 -3
  43. package/dist/components/custom/dock/GlassDock.vue.d.ts +45 -63
  44. package/dist/components/custom/dock/composables/dockContext.d.ts +7 -0
  45. package/dist/components/custom/dock/index.d.ts +2 -1
  46. package/dist/components/custom/expandable-container/ExpandableContainer.vue.d.ts +29 -0
  47. package/dist/components/custom/fourier-field/FourierField.vue.d.ts +6 -0
  48. package/dist/components/custom/fourier-field/index.d.ts +25 -1
  49. package/dist/components/custom/fourier-field/math.d.ts +3 -8
  50. package/dist/components/custom/goo-blob/GooBlob.vue.d.ts +8 -10
  51. package/dist/components/custom/goo-blob/composables/useBlobMood.d.ts +19 -5
  52. package/dist/components/custom/goo-blob/composables/useMetaballRenderer.d.ts +6 -14
  53. package/dist/components/custom/goo-blob/index.d.ts +1 -1
  54. package/dist/components/custom/goo-blob/types.d.ts +59 -25
  55. package/dist/components/custom/handmark/HandMark.vue.d.ts +29 -0
  56. package/dist/components/custom/handmark/brush.d.ts +219 -0
  57. package/dist/components/custom/handmark/freehand.d.ts +69 -0
  58. package/dist/components/custom/handmark/geometry.d.ts +32 -0
  59. package/dist/components/custom/handmark/index.d.ts +21 -0
  60. package/dist/components/custom/handmark/ink.d.ts +11 -0
  61. package/dist/components/custom/handmark/texture.d.ts +39 -0
  62. package/dist/components/custom/handmark/types.d.ts +53 -0
  63. package/dist/components/custom/handmark/useHandMark.d.ts +66 -0
  64. package/dist/components/custom/metric-badge/MetricBadge.vue.d.ts +8 -0
  65. package/dist/components/custom/tabs/SegmentedTabs.vue.d.ts +92 -0
  66. package/dist/components/custom/tabs/composables/useTabIndicator.d.ts +49 -0
  67. package/dist/components/custom/tabs/index.d.ts +2 -5
  68. package/dist/components/ui/button/index.d.ts +1 -1
  69. package/dist/components/ui/card/Card.vue.d.ts +5 -3
  70. package/dist/components/ui/carousel/CarouselNext.vue.d.ts +1 -1
  71. package/dist/components/ui/carousel/CarouselPrevious.vue.d.ts +1 -1
  72. package/dist/components/ui/carousel/GlassCarouselPager.vue.d.ts +3 -4
  73. package/dist/components/ui/slider/index.d.ts +22 -11
  74. package/dist/components/ui/tabs/TabsList.vue.d.ts +1 -1
  75. package/dist/composables/color/index.d.ts +12 -7
  76. package/dist/composables/context/createContext.d.ts +1 -1
  77. package/dist/composables/glass/webgl/shaders/procedural-color.glsl.d.ts +1 -6
  78. package/dist/composables/motion/core/index.d.ts +1 -0
  79. package/dist/composables/motion/useRouteTransition.d.ts +42 -0
  80. package/dist/configurator.js +1 -1
  81. package/dist/confirm-dialog.js +1 -1
  82. package/dist/constellation.js +212 -72
  83. package/dist/context-menu.js +1 -1
  84. package/dist/controls.js +1 -1
  85. package/dist/dark.js +1 -1
  86. package/dist/data-table.js +1 -1
  87. package/dist/deck-progress.js +1 -1
  88. package/dist/dialog.js +1 -1
  89. package/dist/dock.js +257 -243
  90. package/dist/{dropdown-menu-B_4bWyyG.js → dropdown-menu-D77jX6Df.js} +3 -3
  91. package/dist/dropdown-menu.js +1 -1
  92. package/dist/expandable-container.js +61 -38
  93. package/dist/forms.js +5 -5
  94. package/dist/fourier-field.js +89 -97
  95. package/dist/fourier-math.d.ts +1 -0
  96. package/dist/fourier-math.js +2 -0
  97. package/dist/glass-panel.js +1 -1
  98. package/dist/glass-ui.css +1 -1
  99. package/dist/glass-ui.js +107 -109
  100. package/dist/goo-blob.js +316 -297
  101. package/dist/handmark.d.ts +1 -0
  102. package/dist/handmark.js +609 -0
  103. package/dist/hover-popover.js +1 -1
  104. package/dist/icon-tooltip.js +1 -1
  105. package/dist/index.d.ts +1 -2
  106. package/dist/keyboard.js +1 -1
  107. package/dist/labeled-field.js +5 -5
  108. package/dist/math-DTpRVC0e.js +27 -0
  109. package/dist/{menuItemVariants-DKM85SNE.js → menuItemVariants-CCoBNkU5.js} +1 -1
  110. package/dist/metric-badge.js +1 -1
  111. package/dist/metric-stack.js +1 -1
  112. package/dist/motion-core.js +70 -69
  113. package/dist/motion.js +2 -2
  114. package/dist/notification.js +1 -1
  115. package/dist/number-field.js +1 -1
  116. package/dist/pulse.js +1 -1
  117. package/dist/reactive.js +1 -1
  118. package/dist/scrolling-text.js +1 -1
  119. package/dist/search.js +4 -4
  120. package/dist/select.js +2 -2
  121. package/dist/{slider-D9puf-Ko.js → slider-CyzcxBoh.js} +6 -6
  122. package/dist/slider.js +1 -1
  123. package/dist/sortable-list.js +1 -1
  124. package/dist/status-dot.js +17 -16
  125. package/dist/styles/animations.css +80 -20
  126. package/dist/styles/cards.css +2 -2
  127. package/dist/styles/components.css +1 -1
  128. package/dist/styles/dock/density.css +230 -0
  129. package/dist/styles/dock/layer-group.css +275 -0
  130. package/dist/styles/dock/layers.css +355 -0
  131. package/dist/styles/dock/morph.css +244 -0
  132. package/dist/styles/dock/overflow.css +201 -0
  133. package/dist/styles/dock/shell.css +457 -0
  134. package/dist/styles/dock-controls.css +205 -55
  135. package/dist/styles/dock.css +42 -1349
  136. package/dist/styles/drawer.css +12 -4
  137. package/dist/styles/glass.css +535 -78
  138. package/dist/styles/index.css +12 -11
  139. package/dist/styles/paper.css +68 -2
  140. package/dist/styles/theme.css +58 -0
  141. package/dist/styles/tokens.css +601 -69
  142. package/dist/styles/transitions.css +20 -2
  143. package/dist/styles/utilities.css +218 -78
  144. package/dist/styles/view-transition.css +51 -0
  145. package/dist/switch.js +1 -1
  146. package/dist/tabs.js +182 -151
  147. package/dist/timeline.js +1 -1
  148. package/dist/toast.js +1 -1
  149. package/dist/toggle-group.js +1 -1
  150. package/dist/{useAnimatedNumber-C_3wZLx4.js → useAnimatedNumber-Bcpy5Etf.js} +1 -1
  151. package/dist/{useConfiguratorState-CMff4GzH.js → useConfiguratorState-DxAqksK6.js} +21 -10
  152. package/dist/{useGlassRenderer-5I0YkI4t.js → useGlassRenderer-D7YGOYiM.js} +1 -1
  153. package/dist/useViewTransition-DaN5Zrox.js +21 -0
  154. package/dist/vReveal-zUIQk-rJ.js +53 -0
  155. package/dist/watercolor-dot.js +1 -1
  156. package/package.json +80 -39
  157. package/src/styles/animations.css +80 -20
  158. package/src/styles/cards.css +2 -2
  159. package/src/styles/dock/density.css +230 -0
  160. package/src/styles/dock/layer-group.css +275 -0
  161. package/src/styles/dock/layers.css +355 -0
  162. package/src/styles/dock/morph.css +244 -0
  163. package/src/styles/dock/overflow.css +201 -0
  164. package/src/styles/dock/shell.css +457 -0
  165. package/src/styles/dock-controls.css +205 -55
  166. package/src/styles/dock.css +42 -1349
  167. package/src/styles/drawer.css +12 -4
  168. package/src/styles/glass.css +535 -78
  169. package/src/styles/index.css +12 -11
  170. package/src/styles/paper.css +68 -2
  171. package/src/styles/theme.css +58 -0
  172. package/src/styles/tokens.css +601 -69
  173. package/src/styles/transitions.css +20 -2
  174. package/src/styles/utilities.css +218 -78
  175. package/src/styles/view-transition.css +51 -0
  176. package/dist/DiscoGlyph-CG0F410s.js +0 -132
  177. package/dist/GlyphFace-DRjDkB0s.js +0 -51
  178. package/dist/UnderlineTabs-Uxn-R3MT.js +0 -39
  179. package/dist/components/custom/aurora/composables/gpuRuntime.d.ts +0 -16
  180. package/dist/components/custom/aurora/constants/shaders/aurora.wgsl.d.ts +0 -7
  181. package/dist/components/custom/aurora/constants/shaders/painterly.wgsl.d.ts +0 -7
  182. package/dist/components/custom/aurora/constants/shaders/wake.wgsl.d.ts +0 -4
  183. package/dist/components/custom/disco-glyph/DiscoGlyph.vue.d.ts +0 -58
  184. package/dist/components/custom/disco-glyph/index.d.ts +0 -1
  185. package/dist/components/custom/glass-carousel/GlassCarousel.vue.d.ts +0 -36
  186. package/dist/components/custom/glass-carousel/GlassCarouselItem.vue.d.ts +0 -28
  187. package/dist/components/custom/glass-carousel/index.d.ts +0 -4
  188. package/dist/components/custom/glass-carousel/useGlassCarousel.d.ts +0 -30
  189. package/dist/components/custom/glyph-face/GlyphFace.vue.d.ts +0 -64
  190. package/dist/components/custom/glyph-face/index.d.ts +0 -2
  191. package/dist/components/custom/glyph-face/keys.d.ts +0 -9
  192. package/dist/components/custom/responsive-tabs/ResponsiveTabs.vue.d.ts +0 -73
  193. package/dist/components/custom/responsive-tabs/index.d.ts +0 -2
  194. package/dist/components/custom/tabs/BouncyTabs.vue.d.ts +0 -27
  195. package/dist/components/custom/tabs/BouncyToggle.vue.d.ts +0 -60
  196. package/dist/components/custom/tabs/UnderlineTabs.vue.d.ts +0 -20
  197. package/dist/components/custom/tabs/composables/useBouncySlider.d.ts +0 -39
  198. package/dist/composables/glass/createGPUCanvas.d.ts +0 -40
  199. package/dist/disco-glyph.d.ts +0 -1
  200. package/dist/disco-glyph.js +0 -2
  201. package/dist/glass-carousel.d.ts +0 -1
  202. package/dist/glass-carousel.js +0 -219
  203. package/dist/glyph-face.d.ts +0 -1
  204. package/dist/glyph-face.js +0 -3
  205. package/dist/keys-BsYjEFOW.js +0 -9
  206. package/dist/responsive-tabs.d.ts +0 -1
  207. package/dist/responsive-tabs.js +0 -95
  208. package/dist/styles/disco-glyph.css +0 -26
  209. package/dist/styles/glyph-face.css +0 -92
  210. package/dist/vReveal-CqaCz_mC.js +0 -44
  211. package/src/styles/disco-glyph.css +0 -26
  212. package/src/styles/glyph-face.css +0 -92
  213. /package/dist/{DeckProgress-AVgbIULY.js → DeckProgress-Dmk4_AKN.js} +0 -0
  214. /package/dist/{HoverPopover-D56O6Ylp.js → HoverPopover-2LOIW34a.js} +0 -0
  215. /package/dist/{IconTooltip-D2T5nYOM.js → IconTooltip-Cus0fvK0.js} +0 -0
  216. /package/dist/{Input-DVG_J0ne.js → Input-xuDwALQR.js} +0 -0
  217. /package/dist/{ScrollingText-CVyqxvfv.js → ScrollingText-BPP84wKo.js} +0 -0
  218. /package/dist/{color-DMLTunJK.js → color-C5ls_QF7.js} +0 -0
  219. /package/dist/{constants-BPOqYJAm.js → constants-yKeKnE84.js} +0 -0
  220. /package/dist/{presets-D1XPuTj-.js → presets-Dkdv55Gt.js} +0 -0
  221. /package/dist/{prng-COGhh02-.js → prng-D27-B3tK.js} +0 -0
  222. /package/dist/{useGlobalDark-D3EBWzXK.js → useGlobalDark-d6waty-X.js} +0 -0
  223. /package/dist/{useIntersectionPause-Bj4sPkMh.js → useIntersectionPause-Cck5Uxk8.js} +0 -0
  224. /package/dist/{useInterval-CcLfq2WU.js → useInterval-Dsmqwi03.js} +0 -0
  225. /package/dist/{useKeyboardShortcuts-BXWXOZ-9.js → useKeyboardShortcuts-CyIYrndH.js} +0 -0
  226. /package/dist/{useScrollProgress-C9ysDic5.js → useScrollProgress-CffFGLa5.js} +0 -0
  227. /package/dist/{useSortable-MGAbCGVJ.js → useSortable-C8ReQ50P.js} +0 -0
  228. /package/dist/{useTextHighlight-9nMW23Qb.js → useTextHighlight-CWEi25hf.js} +0 -0
@@ -24,23 +24,31 @@
24
24
  toward `--scale-press-dock` settles on a NO-OVERSHOOT spring (Apple,
25
25
  "Designing Fluid Interfaces": default 100% damping — no bounce — for a tap;
26
26
  reserve bounce for surfaces driven by gesture MOMENTUM). The dock controls
27
- are tap surfaces (no momentum), so the press re-binds `--dock-press-spring`
28
- from the bouncy preset (`--spring-bouncy`, ~+20% overshoot, defined in
29
- tokens.css §-2) to `--spring-smooth` — the critically-damped (ζ≈1, ~0.4%
30
- peak) iOS tap curve. Token-routed (an existing spring preset, never a raw
31
- cubic-bezier); the `--duration-fast` prefix is kept so the squish-back stays
32
- quick. Every dock-control `scale var(--dock-press-spring)` press transition
33
- (and the select chevron's `rotate`) inherits this one binding. A future
34
- momentum-gated surface (none today) would override this back to a bouncy
35
- preset on its own scope. The `:where()` group keeps zero specificity so a
36
- consumer override of `--dock-press-spring` still wins. */
27
+ are tap surfaces (no momentum).
28
+
29
+ AY.W-DOCK2 (D6) — the per-surface re-point of `--dock-press-spring` to
30
+ `--spring-smooth` is DELETED here: the ROOT token (`tokens.css`) IS the §6
31
+ doctrine register now (`--spring-smooth`), so the re-point was a dead
32
+ byte-identical redeclaration — the exact per-surface fork the §6 doctrine
33
+ claims to have killed. The dock controls inherit the correct smooth
34
+ transform-press register straight from the ROOT token; this `:where()` group
35
+ keeps ONLY the small-tile specular sizing below. */
37
36
  :where(
38
37
  .dock-icon-button,
39
38
  .dock-tab-button,
40
39
  .dock-select-trigger,
41
40
  .dock-dropdown-trigger
42
41
  ) {
43
- --dock-press-spring: var(--duration-fast) var(--spring-smooth);
42
+ /* AX.W45-TUNE C4/C5 — the small-tile specular sizing. The dock controls are
43
+ ~40px tiles, a fraction of a card's plate, so the global 36% specular
44
+ radius blooms a tile-filling disc (the I.W6 finding). The family re-points
45
+ `--glass-specular-size` to the tighter `--dock-control-specular-size` (22%,
46
+ tokens.css), so the SHARED `.glass-material::before` catch-light recipe
47
+ (glass.css) paints a restrained EDGE-catch on the small tile WITHOUT
48
+ forking the recipe — the gleam wakes on hover/active (the cohort's 0.1/0.16
49
+ rungs), sized for the tile. The rest intensity stays 0 (the default-off
50
+ discipline) so the resting tile carries NO bloom. */
51
+ --glass-specular-size: var(--dock-control-specular-size, 22%);
44
52
  }
45
53
 
46
54
  .dock-icon-button {
@@ -95,10 +103,14 @@
95
103
  hover fill carries the affordance without a second catch-light, and
96
104
  dropping it also removes the `:not(:focus-visible)` specular-vs-ring
97
105
  juggle. */
106
+ /* AX.W45 DK2 — the hover reads the FAMILY token `--dock-control-hover-bg`
107
+ (the per-control `--dock-icon-hover-bg` still wins if a consumer set it),
108
+ so the whole dock-control family shares ONE glass-translucent hover fill.
109
+ One source per state across icon/tab/picker (no four-vocabulary drift). */
98
110
  &:hover:not(:disabled) {
99
111
  background: var(
100
112
  --dock-icon-hover-bg,
101
- color-mix(in srgb, var(--card) 55%, transparent)
113
+ var(--dock-control-hover-bg)
102
114
  );
103
115
  color: var(--btn-hover-color, var(--foreground));
104
116
  scale: var(--scale-hover-dock);
@@ -134,6 +146,19 @@
134
146
  since AX.W09 retired the hover `--glass-highlight` specular), so no
135
147
  per-state transition override is needed. */
136
148
 
149
+ /* AX.W45 D15 — LIBRARY GLYPH OWNERSHIP. The dock icon-button now sizes its glyph
150
+ (mirroring `.dark-mode-toggle-button > svg`), so the glyph scales WITH the box
151
+ on the `--dock-scale` multiplier instead of swimming at a fixed consumer size.
152
+ `--dock-icon-glyph: calc(1.25rem * var(--dock-scale))` (tokens.css) rides the
153
+ multiplier — at 1.5× the glyph is 30px in a 60px box, the desktop proportion.
154
+ A consumer passing an explicit lucide size class still WINS (utility layer >
155
+ component layer) — a DEFAULT, not a ceiling, matching the `.dock-tab-button`
156
+ font-size precedent. */
157
+ .dock-icon-button > svg {
158
+ width: var(--dock-icon-glyph, 1.25rem);
159
+ height: var(--dock-icon-glyph, 1.25rem);
160
+ }
161
+
137
162
  .dock-icon-button--compact {
138
163
  width: var(--dock-compact-control-size, auto);
139
164
  height: var(--dock-compact-control-size, auto);
@@ -203,6 +228,29 @@
203
228
  --dark-mode-toggle-padding: var(--dock-icon-padding, 0);
204
229
  }
205
230
 
231
+ /* AX.W06 USF-2 — the dock-control optical-size contract. The
232
+ DarkModeToggle renders its OWN internal SVG `h-full w-full` (it bypasses
233
+ the `--dock-icon-glyph`-sized `> svg` slot the `.dock-icon-button` family
234
+ uses), so IN-DOCK it filled the whole control box edge-to-edge (~2.5× the
235
+ nav glyphs) — `--dock-icon-padding` is NEVER DEFINED, so the
236
+ `--dark-mode-toggle-padding: var(--dock-icon-padding, 0)` above fell to the
237
+ `0` fallback and zero padding let the SVG fill the box. Route the in-dock
238
+ toggle glyph through `--dock-control-glyph-size` (the ONE size the whole
239
+ dock-control family reads, default = `--dock-icon-glyph`, the same
240
+ `--dock-scale`-keyed glyph the nav icons paint), so the toggle is optically
241
+ UNIFORM with the nav glyphs WHEN DOCKED. The `h-full w-full` SVG stays
242
+ correct for the STANDALONE DarkModeToggle sizes (no `.glass-dock`
243
+ ancestor); this rule is scoped to the in-dock path only. Machine-checked by
244
+ the dock-control optical-parity gate, not eyeballed. */
245
+ .glass-dock
246
+ .dark-mode-toggle-button:not([data-size="sm"]):not([data-size="lg"]):not(
247
+ [data-size="control"]
248
+ )
249
+ > svg {
250
+ width: var(--dock-control-glyph-size, var(--dock-icon-glyph, 1.25rem));
251
+ height: var(--dock-control-glyph-size, var(--dock-icon-glyph, 1.25rem));
252
+ }
253
+
206
254
  .dock-tab-button {
207
255
  display: inline-flex;
208
256
  align-items: center;
@@ -244,9 +292,19 @@
244
292
  /* AT.W7-dock-b — press micro-feedback spring (transform-scoped). */ scale
245
293
  var(--dock-press-spring);
246
294
 
295
+ /* AX.W45 DK2 — converged onto the FAMILY hover/active token pair (the
296
+ surface-tint-8/10 ladder it spoke is ≈ the same intent — glass-translucent
297
+ foreground-over-transparent). ONE grammar across icon/tab/picker.
298
+ AX.W45-TUNE Q3/C3 — the hover MOTION channel is now UNIFIED: the
299
+ `--scale-hover-dock` lift fires here (it used to fire on only icon +
300
+ dropdown), so all four control members lift on hover as ONE register —
301
+ the bg cross-fade (glass-tier), the scale, and the specular gleam read
302
+ together BEFORE click. The transform rides `--dock-press-spring`
303
+ (`--spring-smooth`) per the W52 easing doctrine. */
247
304
  &:hover:not(:disabled) {
248
- background: var(--surface-tint-8);
305
+ background: var(--dock-control-hover-bg);
249
306
  color: var(--foreground);
307
+ scale: var(--scale-hover-dock);
250
308
  }
251
309
 
252
310
  &:active:not(:disabled) {
@@ -261,7 +319,7 @@
261
319
  group in dock.css. */
262
320
 
263
321
  &:is(.is-active, .active, [aria-current="page"], [aria-pressed="true"]) {
264
- background: var(--surface-tint-10);
322
+ background: var(--dock-control-active-bg);
265
323
  color: var(--foreground);
266
324
  }
267
325
  }
@@ -269,21 +327,28 @@
269
327
  /* Tier — primary ────────────────────────────────────────────
270
328
  *
271
329
  * Per W2.7 §9, §12, §13, §17. The primary tier composes three at-rest
272
- * marks (top-highlight, bottom under-shadow, baseline glass) with three
273
- * disco accents on hover (specular swap, sparkle sweep, disco-grain).
330
+ * marks (top-highlight, bottom under-shadow, baseline glass) with two
331
+ * disco accents on hover (specular swap, disco-grain).
332
+ *
333
+ * D6.b — the disco-STAR is GONE (the sparkle-sweep sweep is excised from the
334
+ * underlying `btn-audacious`, utilities.css). The primary dock button's gold
335
+ * identity — the "golden dock button" the user likes — is RE-EXPRESSED sans
336
+ * star: a tooled `--gold-rim` gilt edge (the brushed-brass-under-glass read)
337
+ * plus the surviving specular catch-light + disco-grain on hover. Three quiet
338
+ * golds replacing one loud star.
274
339
  *
275
340
  * Reservation: disco fires on hover only. At rest the button reads as
276
- * a Vignelli-restrained composed glass surface. The `--phase-color`
277
- * cascade (provided by `<InstrumentChassis>` via `data-phase`) tints
278
- * the disco-grain radial only on hover; idle is neutral.
341
+ * a Vignelli-restrained composed glass surface with a hairline gilt edge.
342
+ * The `--phase-color` cascade (provided by `<InstrumentChassis>` via
343
+ * `data-phase`) tints the disco-grain radial only on hover; idle is neutral.
279
344
  *
280
- * K.W6 Lane B — the canonical disco-grain + sparkle-sweep + specular
281
- * recipe lifted to `@utility btn-audacious` (utilities.css). The Vue
282
- * <DockTabButton> attaches `btn-audacious` automatically when the
283
- * consumer passes `data-tier="primary"`. The dock-local rules below
284
- * are STRICTLY the dock extension: structural shell (padding, base
285
- * surface tint, min-height) + phase-tint extensions (hover radial
286
- * uses `--phase-color`, plus the `[data-phase]` `::before` halo).
345
+ * K.W6 Lane B — the canonical disco-grain + specular recipe lifted to
346
+ * `@utility btn-audacious` (utilities.css). The Vue <DockTabButton> attaches
347
+ * `btn-audacious` automatically when the consumer passes `data-tier="primary"`.
348
+ * The dock-local rules below are STRICTLY the dock extension: structural shell
349
+ * (padding, base surface tint, min-height) + the gilt-edge gold identity +
350
+ * phase-tint extensions (hover radial uses `--phase-color`, plus the
351
+ * `[data-phase]` `::before` halo).
287
352
  */
288
353
  .dock-tab-button[data-tier="primary"] {
289
354
  --dock-tab-min-height: 4rem;
@@ -291,23 +356,40 @@
291
356
  background: color-mix(in srgb, var(--card) 60%, transparent);
292
357
  color: var(--foreground);
293
358
 
359
+ /* D6.b — the gilt edge: a 1px inner `--gold-rim` ring + a faint gold
360
+ top-catch, the tooled-brass identity that replaces the excised star.
361
+ A box-shadow (no layout, no paint cost), composing UNDER the hover
362
+ specular/grain. The gold reads as a bevel light at the edge, never a
363
+ fill — the surface still reads as composed glass. Idiom mirrors the
364
+ `.glass-gilt` modifier (glass.css region) at the dock-button scale. */
365
+ box-shadow:
366
+ inset 0 0 0 1px var(--gold-rim),
367
+ inset 0 0.5px 0 0
368
+ color-mix(in oklab, var(--gold-light) 30%, transparent);
369
+
294
370
  /* Phase-tint hover override — same disco-grain composition as
295
371
  * `btn-audacious`, but the radial uses `--phase-color` (instrument-
296
372
  * cluster axis) instead of the canonical `--primary`. The `--paper-
297
373
  * clean-texture` overlay and `--glass-specular` shadow stack are
298
374
  * inherited from the underlying `btn-audacious` utility. */
375
+ /* AX.W52 D19 — the phase-tint hover radial DEMOTED: the prior
376
+ * `ellipse at 30% 30%` at 18% was a loud top-LEFT corner hotspot. Toned to
377
+ * 8% and the anchor shifted off the hard corner toward a softer top-biased
378
+ * ellipse (`40% 25%`) with a tighter `transparent 55%` falloff, so it reads
379
+ * as a surface lift rather than a corner glow — the disco hover identity
380
+ * survives, the egregious corner bloom does not. */
299
381
  &:hover:not(:disabled) {
300
382
  --glass-grain-opacity: var(--glass-grain-opacity-disco, 0.08);
301
383
  background-image:
302
384
  var(--paper-clean-texture),
303
385
  radial-gradient(
304
- ellipse at 30% 30%,
386
+ ellipse at 40% 25%,
305
387
  color-mix(
306
388
  in srgb,
307
- var(--phase-color, var(--foreground)) 18%,
389
+ var(--phase-color, var(--foreground)) 8%,
308
390
  transparent
309
391
  ),
310
- transparent 70%
392
+ transparent 55%
311
393
  );
312
394
  background-blend-mode: overlay, normal;
313
395
  background-size: var(--paper-texture-size), auto;
@@ -315,30 +397,36 @@
315
397
 
316
398
  /* Q.W3.A.4 — phase-tint backplate halo at the pill wrapper.
317
399
  *
318
- * The inner `<GlyphFace>` halo (`.glyph-face-backplate { inset: -25% }`)
319
- * gets clipped by the pill's `overflow: hidden`; the halo never escapes
320
- * the inner glyph wrapper. This `::before` lifts the phase-tint to the
321
- * pill itself so the glow composes with the whole CTA. Scoped to
322
- * active phases — at idle / ready the pill stays neutral and inherits
323
- * the W2.7 reservation ("disco fires on hover only"). */
400
+ * An inner glyph wrapper's own halo would be clipped by the pill's
401
+ * `overflow: hidden` and never escape the glyph box. This `::before`
402
+ * lifts the phase-tint to the pill itself so the glow composes with the
403
+ * whole CTA. Scoped to active phases — at idle / ready the pill stays
404
+ * neutral and inherits the W2.7 reservation ("disco fires on hover
405
+ * only"). */
406
+ /* AX.W52 D19 — the REST phase-halo `::before` (fires during a speedtest run
407
+ * on the most prominent dock control) DEMOTED on the same axis as the hover
408
+ * radial: 18%→8%, the hard `30% 30%` corner shifted to a softer `40% 25%`
409
+ * top-biased ellipse with a tighter `transparent 55%` falloff, and the
410
+ * `opacity: 1` dropped to 0.5 so the persistent run-time halo is a subtle
411
+ * surface lift, not a corner bloom that washes the pill for the whole run. */
324
412
  &[data-phase]:not([data-phase="ready"]):not([data-phase="idle"])::before {
325
413
  content: "";
326
414
  position: absolute;
327
415
  inset: 0;
328
416
  border-radius: inherit;
329
417
  background: radial-gradient(
330
- ellipse at 30% 30%,
418
+ ellipse at 40% 25%,
331
419
  color-mix(
332
420
  in srgb,
333
- var(--phase-color, var(--foreground)) 18%,
421
+ var(--phase-color, var(--foreground)) 8%,
334
422
  transparent
335
423
  )
336
424
  0%,
337
- transparent 70%
425
+ transparent 55%
338
426
  );
339
427
  pointer-events: none;
340
428
  z-index: -1;
341
- opacity: 1;
429
+ opacity: 0.5;
342
430
  transition: opacity var(--duration-fast) var(--ease-standard);
343
431
  }
344
432
  }
@@ -403,13 +491,23 @@
403
491
  opacity var(--dock-motion-fast);
404
492
  }
405
493
 
494
+ /* AX.W45 DK2 — the pickers move OFF the opaque `--muted` flat plate onto the
495
+ glass-translucent FAMILY hover token (the dock substrate shows through, not a
496
+ solid cream rectangle over the glass — the loudest "not right" tell). hover ≠
497
+ open now: the active/open rule below reads `--dock-control-active-bg` (a tint
498
+ LADDER step above hover), so an OPEN dropdown reads distinctly from a merely-
499
+ hovered one (paired with the chevron flip). ONE source per state, glass-aware
500
+ across the whole dock-control family. */
501
+ /* AX.W45-TUNE Q3/C3 — the picker hover lift is now in the SHARED group: the
502
+ `--scale-hover-dock` scale fires on BOTH select + dropdown (it used to fire on
503
+ the dropdown ONLY — the split-brain hover the DK2 fix left). All four dock
504
+ control members (icon/tab/select/dropdown) now lift on hover as one register,
505
+ mirroring the unified glass-tier `--dock-control-hover-bg` cross-fade. The
506
+ lone `.dock-dropdown-trigger:hover` scale rule is RETIRED into this group. */
406
507
  .dock-select-trigger:hover:not(:disabled),
407
508
  .dock-dropdown-trigger:hover:not(:disabled) {
408
- background: var(--muted);
509
+ background: var(--dock-control-hover-bg);
409
510
  color: var(--btn-hover-color, var(--foreground));
410
- }
411
-
412
- .dock-dropdown-trigger:hover:not(:disabled) {
413
511
  scale: var(--scale-hover-dock);
414
512
  }
415
513
 
@@ -449,7 +547,11 @@
449
547
  [aria-expanded="true"],
450
548
  [aria-pressed="true"]
451
549
  ) {
452
- background: var(--muted);
550
+ /* AX.W45 DK2 — the OPEN affordance: a translucent active fill a ladder step
551
+ above hover (NOT the opaque `--muted`, NOT byte-identical to hover). OPEN =
552
+ (chevron up + this active fill); HOVER = (the lighter hover fill, chevron
553
+ down) — the smooth glass-aware four-state read the picker lacked. */
554
+ background: var(--dock-control-active-bg);
453
555
  color: var(--foreground);
454
556
  }
455
557
 
@@ -470,20 +572,68 @@
470
572
  rotate: 180deg;
471
573
  }
472
574
 
473
- /* O.W6 Lane D — Touch-target floor (speedtest AC.W6 F2.AA-03 / WCAG
474
- 2.5.5), button-level half. The dock-width-math half (the
475
- `.glass-dock[data-density]` `--dock-control-size` lift) STAYS in dock.css
476
- (shell / width-math). This per-button floor reaches a STANDALONE
477
- DockIconButton (a routed settings gear, no dock wrapper) that reads the
478
- bare `--size-icon-btn` and would otherwise fall below the 44px WCAG
479
- target. It holds the touch box regardless of ancestry; the in-dock
480
- `.glass-dock[data-density]` rule is more specific and also reserves the
481
- slot in the dock's width-math. Compact buttons opt out — they are
482
- auto-sized affordances, not primary targets. */
575
+ /* AX.W45 D15 — coarse-pointer touch floor, button-level half. The IN-DOCK floor
576
+ is subsumed into the `--dock-scale` multiplier + the `max(…, 44px)` clamp in
577
+ the dock.css density cascade (the in-dock control-size grows ~1.5× past the
578
+ 44px target, the clamp guarantees the floor even below 1.0× scale). This
579
+ per-button rule is the STANDALONE half: a DockIconButton with NO `.glass-dock`
580
+ ancestor (a routed gear) has no density cascade lifting its size, so it keeps
581
+ the explicit `min-{block,inline}-size` floor. Scoped `:not(:where(.glass-dock
582
+ *))` so it does NOT double-stamp on an in-dock button (the cascade owns that —
583
+ one path per surface, no two-floor). Compact buttons opt out. */
483
584
  @media (pointer: coarse) {
484
- .dock-icon-button:not(.dock-icon-button--compact) {
585
+ .dock-icon-button:not(.dock-icon-button--compact):not(:where(.glass-dock *)) {
485
586
  min-block-size: var(--dock-touch-target, 2.75rem);
486
587
  min-inline-size: var(--dock-touch-target, 2.75rem);
487
588
  }
488
589
  }
590
+
591
+ /* AX.W06 F2/F3 — the HOISTED refined rail nav-item polish. The demo's
592
+ `SidebarDock` dogfooded the active-category affordance (accent glyph tint +
593
+ a left-edge accent rule) as DEMO-PRIVATE chrome (`demo/layout/dock-nav.css`
594
+ `.demo-sidebar-item.is-active`), so a consumer reaching for `variant="rail"`
595
+ got the UN-refined bare `.is-active` colour shift. This hoists the refined
596
+ treatment into the shipped variant CSS so the demo == the shipped contract
597
+ (the demo no longer re-derives a worse rail by hand). The tap-squish press
598
+ feedback (the `:active` `--scale-press-dock` squish) + the right-anchored
599
+ tooltips are already the dock-control family + the consumer's `<Tooltip
600
+ side="right">` — this carries the active-item ACCENT, the half the variant
601
+ CSS did not own.
602
+
603
+ The accent is TOKENIZED, not baked: `--dock-rail-active-accent` defaults to
604
+ the library `--primary` brand ink; a consumer retints it per-instance (the
605
+ demo overrides it to `--viz-fourier` NCSU-red on the cascade). The active
606
+ state reads the SHIPPED four-state hooks the dock-control family already
607
+ activates (`.is-active`, `aria-current="page"`, `[aria-pressed="true"]`).
608
+ Scoped to a `.glass-dock.variant-rail` descendant icon-button — a horizontal
609
+ dock or the layer-switcher rail are untouched. */
610
+ .glass-dock.variant-rail .dock-icon-button {
611
+ position: relative;
612
+ }
613
+
614
+ .glass-dock.variant-rail
615
+ .dock-icon-button:is(.is-active, [aria-current="page"], [aria-pressed="true"]) {
616
+ --dock-active-color: var(--dock-rail-active-accent, var(--primary));
617
+ color: var(--dock-rail-active-accent, var(--primary));
618
+ }
619
+
620
+ /* The leading-edge accent rule — a short rounded bar pinned to the rail-leading
621
+ edge of the active nav item (the iOS / Figma side-rail selected-affordance).
622
+ `inset-inline-start` keys it off the writing-direction leading edge, so the
623
+ bar sits OUTSIDE the button on the rail's plate; `inset-block: <inset>` keeps
624
+ it short + centred. The width/inset/colour all read `--dock-rail-active-*`
625
+ tokens so the whole accent is tunable from one place. */
626
+ .glass-dock.variant-rail
627
+ .dock-icon-button:is(.is-active, [aria-current="page"], [aria-pressed="true"])::before {
628
+ content: "";
629
+ position: absolute;
630
+ inset-block: var(--dock-rail-accent-inset, 18%);
631
+ inset-inline-start: calc(
632
+ -1 * var(--dock-rail-accent-width, 3px) - var(--dock-rail-accent-gap, 2px)
633
+ );
634
+ width: var(--dock-rail-accent-width, 3px);
635
+ border-radius: var(--radius-pill);
636
+ background: var(--dock-rail-active-accent, var(--primary));
637
+ pointer-events: none;
638
+ }
489
639
  }