@mkbabb/glass-ui 10.1.4 → 11.0.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 (214) hide show
  1. package/MIGRATION.md +1024 -1461
  2. package/README.md +2 -2
  3. package/dist/DialogContent-DG5kseRQ.js +159 -0
  4. package/dist/DropdownMenuTrigger-uhSXgEfK.js +76 -0
  5. package/dist/{Surface-1nPoabc3.js → Surface-C7wq2j0A.js} +3 -0
  6. package/dist/aurora.css +1 -0
  7. package/dist/aurora.js +246 -2472
  8. package/dist/auroraImageSource-xNLDUjcy.js +30 -0
  9. package/dist/axes.js +8 -8
  10. package/dist/blob.css +1 -0
  11. package/dist/blob.js +57 -54
  12. package/dist/budget-CJfhLIIV.js +13 -0
  13. package/dist/button-CAKhiOZy.js +113 -0
  14. package/dist/button.js +1 -1
  15. package/dist/{card-ByyqRBvK.js → card-D_uXphvL.js} +4 -1
  16. package/dist/card.js +1 -1
  17. package/dist/carousel.js +3 -2
  18. package/dist/{checkbox-B1qn65se.js → checkbox-COLnvULu.js} +1 -0
  19. package/dist/checkbox.css +1 -0
  20. package/dist/checkbox.js +1 -1
  21. package/dist/{collapsible-DFzK29Oh.js → collapsible-Bd4Et730.js} +1 -0
  22. package/dist/collapsible.css +1 -0
  23. package/dist/collapsible.js +1 -1
  24. package/dist/color-HkUaTAJj.js +270 -0
  25. package/dist/{color.glsl-DTJhdekG.js → color.glsl-bFJm8k5R.js} +4 -16
  26. package/dist/color.wgsl-B-qDJ_OM.js +4 -0
  27. package/dist/{command-CatrAsrl.js → command-BsFOGZwB.js} +3 -2
  28. package/dist/command.css +1 -0
  29. package/dist/command.js +1 -1
  30. package/dist/component-styles.css +0 -1
  31. package/dist/components/_shared/axes.d.ts +7 -0
  32. package/dist/components/_shared/feedback/dot-ring.css +1 -1
  33. package/dist/components/_shared/overlay/focus-return.d.ts +9 -0
  34. package/dist/components/_shared/overlay/index.d.ts +3 -0
  35. package/dist/components/_shared/overlay/root-scroll-lock.d.ts +4 -0
  36. package/dist/components/_shared/overlay/sheet-width.d.ts +2 -0
  37. package/dist/components/_shared/shape/useBarShape.d.ts +4 -0
  38. package/dist/components/aurora/composables/auroraFallbackGround.d.ts +12 -0
  39. package/dist/components/aurora/constants/presets.d.ts +21 -0
  40. package/dist/components/aurora/index.d.ts +2 -2
  41. package/dist/components/button/styles.css +1 -1
  42. package/dist/components/dark-mode-toggle/dark-mode-toggle.css +1 -1
  43. package/dist/components/dialog/DialogContent.vue.d.ts +2 -2
  44. package/dist/components/dialog/ModalOverlay.vue.d.ts +2 -2
  45. package/dist/components/dialog/ModalScrim.vue.d.ts +26 -0
  46. package/dist/components/dialog/styles.css +1 -1
  47. package/dist/components/dock/GlassDock.vue.d.ts +4 -1
  48. package/dist/components/dock/composables/useDockClickIntegrity.d.ts +4 -0
  49. package/dist/components/dock/composables/useDockShellProps.d.ts +34 -2
  50. package/dist/components/dock/composables/useDockState.d.ts +5 -0
  51. package/dist/components/dock/index.d.ts +1 -2
  52. package/dist/components/dock/styles/controls/icon-button.css +1 -1
  53. package/dist/components/dock/styles/controls/tab-button.css +1 -1
  54. package/dist/components/dock/styles/morph.css +1 -1
  55. package/dist/components/dock/styles/run.css +1 -1
  56. package/dist/components/dock/trigger.d.ts +1 -0
  57. package/dist/components/expandable-container/ExpandableContainer.vue.d.ts +30 -29
  58. package/dist/components/menu/ContextMenu.vue.d.ts +27 -0
  59. package/dist/components/menu/DropdownMenu.vue.d.ts +5 -23
  60. package/dist/components/menu/context.d.ts +18 -5
  61. package/dist/components/menu/family-click.d.ts +2 -0
  62. package/dist/components/menu/family-context.d.ts +2 -0
  63. package/dist/components/menu/index.d.ts +1 -1
  64. package/dist/components/sheet/SheetContent.vue.d.ts +2 -2
  65. package/dist/components/sortable-list/styles.css +1 -0
  66. package/dist/components/surface/Surface.vue.d.ts +4 -1
  67. package/dist/components/tabs/composables/useTabDragMorph.d.ts +4 -7
  68. package/dist/components/tabs/styles/segmented.css +1 -1
  69. package/dist/components/tabs/types.d.ts +7 -8
  70. package/dist/composables/glass/fieldPaint.d.ts +4 -0
  71. package/dist/composables/glass/useGlassBackdropLuminance.d.ts +7 -6
  72. package/dist/composables/glass/webgpu/useGpuSubstrate.d.ts +8 -0
  73. package/dist/composables/motion/core/motionTempo.d.ts +2 -1
  74. package/dist/composables/motion/morph/useDragMorph.d.ts +2 -2
  75. package/dist/composables/motion/morph/useSelectionGroup.d.ts +6 -25
  76. package/dist/composables/motion/morph/useSelectionIndicator.d.ts +8 -54
  77. package/dist/composables/motion/spring/useLiquidFlex.d.ts +3 -5
  78. package/dist/composables/motion/spring/useSpringMount.d.ts +0 -9
  79. package/dist/{configurator-Dl10mc3L.js → configurator-C1ZKEf1b.js} +7 -5
  80. package/dist/configurator.css +1 -0
  81. package/dist/configurator.js +1 -1
  82. package/dist/constants-DfrO-IaH.js +8 -0
  83. package/dist/constellation.css +1 -0
  84. package/dist/constellation.js +2 -1
  85. package/dist/control.css +1 -0
  86. package/dist/{control.css_vue_type_style_index_0_src_true_lang-BIdufaDG.js → control.css_vue_type_style_index_0_src_true_lang-D2hdtjs4.js} +1 -0
  87. package/dist/{createCanvasLifecycle-hJHobVTn.js → createCanvasLifecycle-DS0vEs_G.js} +76 -75
  88. package/dist/dark-mode-toggle.js +1 -1
  89. package/dist/{data-table-DQuWkiwL.js → data-table-lDykVYuo.js} +1 -0
  90. package/dist/data-table.css +1 -0
  91. package/dist/data-table.js +1 -1
  92. package/dist/{deck-Cm_VmyNL.js → deck-Bc-2mEKE.js} +1 -0
  93. package/dist/deck.js +1 -1
  94. package/dist/dialog.js +1 -1
  95. package/dist/dock-trigger.d.ts +1 -0
  96. package/dist/dock-trigger.js +88 -0
  97. package/dist/dock.js +677 -689
  98. package/dist/easing.js +4 -4
  99. package/dist/expandable-container-wS1awXGd.js +135 -0
  100. package/dist/expandable-container.css +1 -0
  101. package/dist/expandable-container.js +1 -1
  102. package/dist/{fading-scroll-ClCPooXb.js → fading-scroll-D3Y20ibL.js} +1 -1
  103. package/dist/fading-scroll.js +1 -1
  104. package/dist/fieldPaint-Ci77oajZ.js +7 -0
  105. package/dist/fourier-field.css +1 -0
  106. package/dist/fourier-field.js +15 -13
  107. package/dist/glSetup-DMaDgrEj.js +577 -0
  108. package/dist/glass-ui.js +66 -65
  109. package/dist/handmark.css +1 -0
  110. package/dist/handmark.js +82 -71
  111. package/dist/index.css +1 -0
  112. package/dist/index.d.ts +1 -1
  113. package/dist/{input-eLZ_AU7l.js → input-BLF2pMHE.js} +1 -1
  114. package/dist/input.js +1 -1
  115. package/dist/{label-CE03H1KL.js → label-ryNPL7e6.js} +1 -0
  116. package/dist/label.css +1 -0
  117. package/dist/label.js +1 -1
  118. package/dist/labeled-field.css +1 -0
  119. package/dist/labeled-field.js +5 -4
  120. package/dist/{menu-DaYAZiVW.js → menu-C_l2Sslf.js} +162 -112
  121. package/dist/menu.js +3 -3
  122. package/dist/metric.js +1 -0
  123. package/dist/motion-core.js +138 -44
  124. package/dist/motion-lHDAQHEE.js +91 -0
  125. package/dist/motion.js +5 -5
  126. package/dist/motionTempo-DXdVbCWr.js +13 -0
  127. package/dist/music-staff.js +1 -0
  128. package/dist/{number-field-RP89046a.js → number-field-BXFUP49Z.js} +3 -2
  129. package/dist/number-field.css +1 -0
  130. package/dist/number-field.js +1 -1
  131. package/dist/pager-dots.css +1 -0
  132. package/dist/pager-dots.js +3 -2
  133. package/dist/participation-C5y5VZTN.js +52 -0
  134. package/dist/{popover-BdpoE4Ar.js → popover-DQUmwuAa.js} +3 -2
  135. package/dist/popover.js +1 -1
  136. package/dist/{progress-eVa-mc7J.js → progress-BUn0Bw7Z.js} +1 -0
  137. package/dist/progress.css +1 -0
  138. package/dist/progress.js +1 -1
  139. package/dist/{radio-group-B58Bz16F.js → radio-group-xdEy2tdi.js} +1 -0
  140. package/dist/radio-group.css +1 -0
  141. package/dist/radio-group.js +1 -1
  142. package/dist/root-scroll-lock-DJFrQhMa.js +22 -0
  143. package/dist/select-Dt5dXm87.js +309 -0
  144. package/dist/select.js +1 -1
  145. package/dist/{separator-D4EZM10u.js → separator-C4y9p_ky.js} +1 -0
  146. package/dist/separator.css +1 -0
  147. package/dist/separator.js +1 -1
  148. package/dist/sheet-DLqNUIZl.js +347 -0
  149. package/dist/sheet-width-DgXgJNa5.js +18 -0
  150. package/dist/sheet.js +2 -2
  151. package/dist/{slider-5uoY-cLG.js → slider-CZiKrWGg.js} +8 -8
  152. package/dist/slider.js +1 -1
  153. package/dist/sortable-list.js +2 -1
  154. package/dist/{status-dot-W4LFiJps.js → status-dot-BDZKcRxy.js} +2 -1
  155. package/dist/status-dot.css +1 -0
  156. package/dist/status-dot.js +1 -1
  157. package/dist/styles/components.css +1 -1
  158. package/dist/styles/glass/glass-capsule.css +1 -1
  159. package/dist/styles/glass/glass-chip.css +1 -1
  160. package/dist/styles/glass/mark.css +1 -1
  161. package/dist/styles/glass/overlay-plate.css +1 -1
  162. package/dist/styles/glass/surface-axis.css +1 -1
  163. package/dist/styles/index.css +1 -1
  164. package/dist/styles/theme/radius.css +1 -1
  165. package/dist/styles/tokens/color-radius.css +1 -1
  166. package/dist/styles/tokens/manifest.d.ts +1 -1
  167. package/dist/styles/tokens/scale-paper.css +1 -1
  168. package/dist/styles/utilities/base-misc.css +1 -1
  169. package/dist/surface.js +1 -1
  170. package/dist/{switch-BYUZ6g9G.js → switch-DLfGYU35.js} +1 -0
  171. package/dist/switch.css +1 -0
  172. package/dist/switch.js +1 -1
  173. package/dist/tabs-NgTRPGZx.js +229 -0
  174. package/dist/tabs.js +1 -1
  175. package/dist/textarea.js +1 -1
  176. package/dist/timeline.css +1 -0
  177. package/dist/timeline.js +4 -3
  178. package/dist/toggle-group-DgXcJGD6.js +129 -0
  179. package/dist/toggle-group.css +1 -0
  180. package/dist/toggle-group.js +1 -1
  181. package/dist/tokens.js +2 -0
  182. package/dist/{tooltip-CZVubnJf.js → tooltip-Do3qCw0r.js} +1 -1
  183. package/dist/tooltip.js +1 -1
  184. package/dist/typewriter.css +1 -0
  185. package/dist/typewriter.js +1 -0
  186. package/dist/uniformBridge-CJyy7NOn.js +150 -0
  187. package/dist/useBarShape-CmP35Z8o.js +24 -0
  188. package/dist/{useCanvas2D-CQRElMyE.js → useCanvas2D-Bhpwua98.js} +1 -1
  189. package/dist/{useDockCtaReceive-BSSgD6mu.js → useDockCtaReceive-Dn_-paqP.js} +1 -1
  190. package/dist/{useDragMorph-B363RUbF.js → useDragMorph-BEI74U0t.js} +51 -40
  191. package/dist/{color.wgsl-BTszLY39.js → useGpuSubstrate-Y5XAdU8d.js} +7 -7
  192. package/dist/{useLiquidPress-h1scrPtP.js → useLiquidPress-D5mjZC6U.js} +2 -2
  193. package/dist/useScrollChrome-DMP6kDI9.js +67 -0
  194. package/dist/useSelectionGroup-DAQv5Lb5.js +186 -0
  195. package/dist/{useSpring-9u2_shxV.js → useSpring-Aof0nTRt.js} +1 -1
  196. package/dist/useSpringMount-jgNkymRl.js +73 -0
  197. package/dist/wgpuSetup-CFuqd_RP.js +1278 -0
  198. package/package.json +8 -1
  199. package/dist/DialogContent-CwIBvou_.js +0 -157
  200. package/dist/DropdownMenuTrigger-CKRnhDSQ.js +0 -93
  201. package/dist/button-BOFTUPyU.js +0 -110
  202. package/dist/composables/motion/morph/eyeglass.d.ts +0 -141
  203. package/dist/expandable-container-CZUj9BzY.js +0 -142
  204. package/dist/glass-ui.css +0 -2
  205. package/dist/motion-BvV1_24p.js +0 -61
  206. package/dist/motionTempo-tscp92Nm.js +0 -7
  207. package/dist/participation-B7UFdgXB.js +0 -55
  208. package/dist/select-BiF0FCZf.js +0 -292
  209. package/dist/sheet-DmJxgAHc.js +0 -345
  210. package/dist/tabs-C5sC0fBE.js +0 -269
  211. package/dist/toggle-group-CC5b3o1R.js +0 -125
  212. package/dist/useScrollChrome-BJbWV32F.js +0 -162
  213. package/dist/useSelectionGroup-zsEwitF6.js +0 -291
  214. package/dist/useSpringMount-OA-0mTNv.js +0 -73
package/MIGRATION.md CHANGED
@@ -2,15 +2,225 @@
2
2
 
3
3
  The per-version migration guide for `@mkbabb/glass-ui`. Each `## <version>` section
4
4
  records the breaking changes that landed in that cut, newest first. Clean breaks only
5
- — no legacy aliases, no back-compat shims (L invariant 4); every break is a one-line
5
+ — no legacy aliases, no back-compat shims; every break is a one-line
6
6
  rename or import re-point per call site.
7
7
 
8
+ ## 11.0.0
9
+
10
+ The CHANGELOG's 11.0.0 entry lists every breaking change with its migration step. The
11
+ sections below give the detail.
12
+
13
+ ### The dock's hover and its closed corner
14
+
15
+ - **No dock control grows on hover any more.** `.dock-icon-button` and `.dock-tab-button`
16
+ used to answer a hover with `scale: 1.1`, so a small control such as a figure dock's
17
+ view toggle swelled under the pointer. A hover now changes the fill and the highlight
18
+ only, and a press keeps its spring. We deleted the `--scale-hover-dock` token along
19
+ with its last readers, so a stylesheet that sets or reads it should delete that
20
+ declaration. Nothing replaces it.
21
+ - **A closed dock with a persistent control keeps a rounded-rectangle corner.** A closed
22
+ horizontal dock always took `--radius-circle` (50%). When a `#persistent` control sits
23
+ beside the summary, the box is two cells wide, so 50% drew an oval. That dock now takes
24
+ `--radius-dock` (16 px), the same corner it wears when open. A dock of one cell is
25
+ still a circle.
26
+
27
+ ### Backdrops, the still aurora and the dock trigger
28
+
29
+ - **`DockBackdropMode` is removed, and the type is now `BackdropMode` in `./axes`.** The
30
+ same `"live" | "static"` union also types the new `backdropMode` prop on `Surface` and
31
+ `Card`. If you imported the type by name, import `BackdropMode` from
32
+ `@mkbabb/glass-ui/axes` instead. There is no alias.
33
+ - **`Surface` and `Card` take `backdropMode`.** With `"static"`, the plate keeps its
34
+ fill, edge and rim but skips the backdrop filter, and it carries
35
+ `data-backdrop-mode="static"`. Use it for plates that sit in the page flow over a
36
+ field that does not move. The default, `"live"`, behaves as before.
37
+ - **`./aurora` exports `STILL_FIELD`.** It is a partial config that zeroes the four drift
38
+ axes and the animated film grain (`paperGrain`), while the canvas texture stays. Spread
39
+ it last over a field config, and the render loop parks after the first frame. This is
40
+ additive.
41
+ - **`DockTrigger` moves from `./dock` to `./dock-trigger`.** Import it with
42
+ `import { DockTrigger } from "@mkbabb/glass-ui/dock-trigger"`. Since `dist/dock.js` no
43
+ longer imports reka's `SelectTrigger`, `SelectIcon` or `PopoverTrigger`, or the
44
+ `DropdownMenuTrigger` chunk, a page that shows a `GlassDock` at first paint and opens
45
+ menus only later keeps that code out of its entry bundle. There is no alias.
46
+
47
+ ### Menus and modals
48
+
49
+ - **`<DropdownMenu trigger="context">` becomes `<ContextMenu>`.** The right-click menu is
50
+ its own root now, so a page that renders only `DropdownMenu` no longer bundles reka's
51
+ context-menu code. The parts (`DropdownMenuTrigger`, `DropdownMenuContent`,
52
+ `DropdownMenuItem` and the rest) are unchanged and work under both roots.
53
+ `DropdownMenu` loses its `trigger` prop, `DropdownMenuProps` now describes the click
54
+ menu alone, and `ContextMenuProps` has only `dir` and `modal`. We removed the public
55
+ `MenuTrigger` type, so code that imported it should drop that import.
56
+
57
+ ```diff
58
+ - <DropdownMenu trigger="context">
59
+ + <ContextMenu>
60
+ <DropdownMenuTrigger as-child>…</DropdownMenuTrigger>
61
+ <DropdownMenuContent>…</DropdownMenuContent>
62
+ - </DropdownMenu>
63
+ + </ContextMenu>
64
+ ```
65
+ - **A modal `Dialog`, `SheetContent` or `CommandDialog` no longer locks `body`.** While
66
+ its scrim is showing, the root element (`html`) carries `overflow: hidden`, and `body`
67
+ keeps its own overflow and padding. reka's `--scrollbar-width` property on the root and
68
+ its `padding-right` compensation on `body` are gone, because the root's
69
+ `scrollbar-gutter: stable` already keeps the layout still. If your code read
70
+ `--scrollbar-width`, or checked `body.style.overflow` to detect an open modal, read
71
+ `document.documentElement.style.overflow` instead. reka's `ConfigProvider`
72
+ `scrollBody` option no longer affects glass modals. The `pointer-events: none` guard
73
+ that reka puts on `body` while a modal is open is unchanged, and when the modal closes,
74
+ `body` gets back whatever inline `pointer-events` you had set.
75
+ - **A dock samples its live backdrop when the field draws.** The dock reads the
76
+ backdrop each time the field canvas announces a frame, which every glass canvas
77
+ (Aurora, Blob, and any field built on `useWebGLCanvas`, `useWebGPUCanvas` or
78
+ `useCanvas2D`) does on each draw. A `backgroundCanvas` you draw yourself, outside
79
+ those helpers, is sampled on mount, resize, scroll, theme change and at the end of a
80
+ transition on it, but not on each of its own frames.
81
+
82
+ ### Shape, glide and the dropdown system
83
+
84
+ Each change below is a clean break with no alias.
85
+
86
+ - **SegmentedTabs glides, and the eyeglass, the press squish and the capsule hover are
87
+ gone.** The indicator moves by `translate`, `width` and `height` on `--spring-dock` and
88
+ keeps its size, so neither material deforms. These are removed with no replacement:
89
+ the `--eyeglass-span-max` token, the `data-eyeglass-wake` and `data-eyeglass-clamped`
90
+ attributes, the `--stretch` channel on the tabs indicator, the label
91
+ `transition-delay`, the press animation, and `.glass-capsule-hover` on inactive tabs.
92
+ If you declared `--eyeglass-span-max`, delete the declaration. A drag (`motion="full"`)
93
+ still follows the pointer and snaps, but it no longer squishes.
94
+ - **There is a new token, `--hover-ink-mix: 45%`.** It sets how far an inactive label's
95
+ colour moves from `--muted-foreground` toward `--foreground` on hover. This is
96
+ additive.
97
+ - **The selection engine no longer deforms.** With SegmentedTabs gliding, the dock's
98
+ layer switcher was the last indicator that stretched, and it now glides the same way.
99
+ We removed these from `@mkbabb/glass-ui/motion-core` with no replacement: the `deform`
100
+ parameter and the `SelectionDeform` type, `squishOnTravel` (from both
101
+ `useSelectionIndicator` and `useSelectionGroup`), the `activeValues` parameter of
102
+ `useSelectionIndicator`, the `onSelect` parameter of `useSelectionGroup`, and the
103
+ constants `DEFAULT_INDICATOR_MAX_STRETCH` and `INDICATOR_RELEASE_AT_ARRIVAL`. The
104
+ `--tab-indicator-max-stretch` token is deleted too. If you pass any of these, delete
105
+ the argument.
106
+ - **`.glass-capsule-hover` no longer moves, and `ToggleGroupItem` no longer squishes.** A
107
+ hover no longer scales a capsule (it used to grow by 1.015 on
108
+ `--ease-cartoon-punch`), and the capsule's `:active` press snap is gone, while the
109
+ catch-light stays. `ToggleGroupItem` drops `.tap-squish` and its `--scale-press`
110
+ adjustment. This changes paint and motion only, not the API. `.tap-squish` and
111
+ `useLiquidPress` on Button, Switch, Checkbox, Radio and the dock controls are
112
+ unchanged.
113
+ - **`--radius-pill` is now `1rem`, and there is a new `--radius-circle: 50%`.** A box up
114
+ to 32 px tall still shows a full pill, since the browser clamps a radius to half the
115
+ shorter side, but a taller box shows 16 px corners. Glass's own circles now use
116
+ `--radius-circle`: the avatar, status dot, dot ring, pager dot, switch thumb, radio dot,
117
+ dark-mode toggle, dock icon button, dialog close button, icon chip and chip remove
118
+ button, menu radio dot, expandable trigger and the collapsed dock at rest.
119
+ `--mark-stadium` is set for `.badge-atom` only. The dock's cut cap rests on
120
+ `--radius-dock` and cuts to `--radius-xs`. This is a visual break. A box of yours taller
121
+ than 32 px that read `--radius-pill`, `--radius-control`, `--radius-tab`,
122
+ `--radius-badge` or `--radius-dock` now shows corners, and a circle of yours that used
123
+ the pill radius on a box taller than 32 px should switch to `--radius-circle`.
124
+ - **`GlassDock` gains `expandOn`, `anchor` and `collapsedLabel`.** These are additive, and
125
+ each one defaults to the old behaviour (`"hover"`, `"center"` and `"Expand dock"`).
126
+ The new types `DockExpandOn` and `DockAnchor` are exported. With
127
+ `anchor="start"` or `anchor="end"` the root carries `data-anchor`, which your own CSS
128
+ can key on, and that is all `anchor` does. It does not move the dock or change its
129
+ morph. The morph grows from whichever edge your layout places the dock at, because its
130
+ origin is measured when the morph starts, so the dock, its `#persistent` group and its
131
+ panes all hold that edge. A dock your layout centres grows on both sides whatever
132
+ `anchor` says, so to hold an edge, place the dock in a wrapper sized to its content.
133
+ - **There is one dropdown system.**
134
+ - `DropdownMenu` now defaults to `modal: false`. Pass `modal` for a menu that must
135
+ make the rest of the page inert, and a modal menu still takes reka's body scroll
136
+ lock.
137
+ - `SelectContent` passes `bodyLock: false`, and its 4 px gap to the trigger is now
138
+ `sideOffset: 4`. The old default was `0` plus a `translate-*-1` nudge, which is gone.
139
+ - `ExpandableContainer` locks scrolling on `<html>` instead of `<body>`.
140
+ - The root element carries `scrollbar-gutter: stable` (through `:where(html)`, so it
141
+ has no specificity).
142
+ - `DropdownMenuContent`, `PopoverContent` and `SelectContent` pass
143
+ `collisionPadding: 16`.
144
+ - The menu, panel and listbox plates take
145
+ `max-inline-size: min(22rem, 100vw - 2rem)`. Their `max-block-size` is the available
146
+ height reka measures, with no `--overlay-max-block` clamp, and the element that
147
+ scrolls has `overflow-y: auto` and `overscroll-behavior: contain`. The command list
148
+ and the hint still use `--overlay-max-block`. The select viewport loses
149
+ `max-h-[inherit]`.
150
+ - Below 30rem, `SelectContent` opens as a bottom sheet and carries
151
+ `data-form="sheet"`.
152
+
153
+ If you relied on a dropdown making the page inert, pass `modal`. If you styled
154
+ `[data-slot="select-content"]` by its `data-side` translate, drop that rule.
155
+ - **There is a new `--radius-bar` token and a `data-shape="bar"` attribute.**
156
+ `--radius-bar` is `var(--radius-panel)` (12 px). `Button`, `ToggleGroupItem` and
157
+ `SegmentedTabs` carry `data-shape="bar"` and take `--radius-bar` when the label wraps,
158
+ when the box is taller than its rung (`min-block-size`), or when it is wider than
159
+ 20rem. A single-line control on its rung keeps the pill, and `ToggleGroupItem` now
160
+ caps its pill radius at half its rung, as `Button` does. If your own CSS keyed on the
161
+ round corner of a wide or wrapping button, select `[data-shape="bar"]` instead.
162
+
163
+ ### Styles, the aurora and the dock's hit box
164
+
165
+ - **Per-component sheets are no longer part of `@mkbabb/glass-ui/styles`.** The rules for
166
+ the Configurator, MusicStaff, Metric, Deck (stage, turn, capture and reveal), Carousel
167
+ and SortableList now load with their component's module. If you import the component
168
+ from its subpath or from the root, nothing changes for you. If you write these class
169
+ names on your own markup without importing the component, those rules no longer
170
+ reach it. The sheets are not package exports, so render the component or copy the
171
+ rules you need. The sheets still sit in `@layer components`, so they rank against the
172
+ entry exactly as before.
173
+ - **The aurora's static ground no longer follows nucleus positions.** If you moved nuclei
174
+ to shift the static ground (on the `"css"` substrate, or before the canvas starts),
175
+ you now see the ground the preset mounted with, while the live canvas still moves. To
176
+ change the ground, change the palette or the field shape. `.aurora-placeholder` is now
177
+ two elements, so a selector that assumed one element should select
178
+ `[data-aurora-ground-active]`.
179
+ - **A dock its owner opens takes taps while it morphs.** If you delayed your own scrim or
180
+ row handlers to wait out the dock's click-integrity window, you can arm them as soon
181
+ as the dock opens. The delay still applies when the dock opens from a hover.
182
+ - **A wheel over an expanded dock run that has reached its end no longer scrolls the
183
+ page** in Firefox, which now matches Chromium.
184
+ - **There are two new exports**, `auroraGroundKey(config)` and
185
+ `GpuSubstrateOptions.prepare`.
186
+
187
+ ### Package layout, the shadow and a lighter entry
188
+
189
+ - **`dist/glass-ui.css` is removed, and `@mkbabb/glass-ui/styles` no longer carries any
190
+ component's own rules.** Each component chunk imports its own sheet
191
+ (`dist/<chunk>.css`), so a bundler consumer needs no change, since the sheet loads with
192
+ the component. A test suite that runs in Node and imports a glass component now meets
193
+ a `.css` import in many more chunks. Let the test runner's bundler transform
194
+ glass-ui, for example with vitest's `server.deps.inline: [/@mkbabb\/glass-ui/]`. If you
195
+ styled glass markup through those rules without rendering the component (copied
196
+ markup or server-rendered HTML), the rules no longer reach it, so render the component
197
+ or import its chunk.
198
+ - **A component subpath, and the root entry, can no longer be imported in plain Node
199
+ without a CSS loader**, because their chunks import stylesheets. This now holds for
200
+ every subpath whose components carry styles (`/aurora`, `/status-dot`,
201
+ `/toggle-group`, `/timeline` and others), as it already did for the root entry,
202
+ `/carousel`, `/configurator`, `/deck`, `/metric`, `/music-staff` and
203
+ `/sortable-list`. Composable and utility subpaths are unchanged. A Node script or test
204
+ that imports them should register a loader that maps `.css` to an empty module, or run
205
+ through a bundler (vitest with glass-ui inlined).
206
+ - **Component rules now load after the `/styles` entry, not inside it.** They stay in
207
+ `@layer components`, so your `utilities` layer still wins. Within `components`, a
208
+ component's rule now follows `components.css` and `accessibility.css` in document
209
+ order. We checked every element that carries one of the accessibility classes and
210
+ found none that also gets a component rule setting the same property.
211
+ - **`./styles.css` (`dist/component-styles.css`) now holds only the three shared
212
+ registers** (`track-well`, `track-flow` and `value-marks`). The component rules it used
213
+ to pull in through `glass-ui.css` now load with their chunks.
214
+ - **`dist/components/_shared/field/control.css` is no longer published.** Nothing ever
215
+ loaded it, because its rules ship through the field components' own styles, which are
216
+ now in `dist/control.css`.
217
+
8
218
  ## 10.1.2
9
219
 
10
220
  Two behaviour changes, no type change. **A custom dock seat must now carry
11
221
  `data-glass-dock-seat` to rove.**
12
222
 
13
- - **O-101: a morph reserves the size it settles at.** The dock no longer reserves an
223
+ - **A morph reserves the size it settles at.** The dock no longer reserves an
14
224
  old width on an expand or for the rest of a morph when its full pane changes (a
15
225
  breakpoint that swaps its controls) or its host changes (a viewport or container that
16
226
  resizes) while it is collapsed or morphing. So the page no longer scrolls sideways
@@ -75,28 +285,24 @@ One type-level change, below; no runtime break. Behaviour a consumer may notice:
75
285
  open at their edge. A consumer override that positioned the sheet itself can be deleted.
76
286
  - **New:** `<Skeleton shimmer>`.
77
287
 
78
- ## 10.0.0 — ~~UNRELEASED~~ [2026-09-22 · LIVE: tag `v10.0.0` at `dcb0f711`, published with provenance by `release.yml` run 35804200390 attempt 1, `latest` on the registry, unpacked 2,915,902 B = the ratchet datum]
288
+ ## 10.0.0
79
289
 
80
- **Status.** `package.json` declares ~~`9.0.0`~~ `10.0.0` [2026-09-22 · at the cut, `58f0d243`]
81
- (detector: `node -p "require('./package.json').version"`); the bump to `10.0.0` was the cut's
82
- own act, ~~and nothing below is on the registry~~ [2026-09-22 · LIVE since `v10.0.0`; the cut is on the registry]. The breaking changes are the cascade layer, the three
290
+ The breaking changes are the cascade layer, the three
83
291
  published names that leave, the `AuroraAtoms` narrowing and `text-caption`'s upright
84
- paint — so the cut is a major, and the rest rides it. Two blocks written after 9.0.0 are
85
- also unreleased and ship in this cut: _Amended after 9.0.0_ under §9.0.0 (the keyboard
292
+ paint, so the release is a major, and the rest rides it. Two blocks written after 9.0.0
293
+ also ship in this release: _Amended after 9.0.0_ under §9.0.0 (the keyboard
86
294
  registry) and _Amended after 9.0.0_ under §8.1.0 (`darkModeSyncScript`'s `defaultDark`
87
295
  object form and write order). They are not repeated here. The non-breaking paint and
88
- default changes carried from the O-20 and O-26 cure waves are listed under
89
- `CHANGELOG.md` 10.0.0; the one paint row below is the ruled one.
90
- [2026-09-22 · O-23/O-32 R2 — the O-23/O-32 cure wave adds four more breaks, each marked
91
- below: `cm-serif` leaves for `font-serif-math`, `useSidebarFollow` exempts by attribute,
296
+ default changes are listed under `CHANGELOG.md` 10.0.0; the one paint row below is here
297
+ because it changes what a reader sees enough to count as a break.
298
+
299
+ Four more breaks are marked below: `cm-serif` leaves for `font-serif-math`, `useSidebarFollow` exempts by attribute,
92
300
  `parentId` names the direct parent, and `SegmentedTabs` goes generic (type-level:
93
- `InstanceType<typeof SegmentedTabs>` no longer compiles; runtime unchanged). The wave's
301
+ `InstanceType<typeof SegmentedTabs>` no longer compiles; runtime unchanged). Those
94
302
  rows run from _The token-root contract_ to the end of this section, and three of them are
95
303
  paint or rendered-text rows (_`Metric`'s delta paints the one ink_, _Paint: three label
96
304
  sites clear 4.5:1_, _The tooltip chip pairs its size with the caption leading_) beside the
97
- one ruled paint row above.]
98
- [2026-09-22 · the cut: `package.json` declares `10.0.0` (`npm version 10.0.0`, the release
99
- commit); the heading's LIVE bracket follows the registry publish, as §9.0.0's did.]
305
+ paint row above.
100
306
 
101
307
  _This file ships in the package_
102
308
 
@@ -246,7 +452,7 @@ A `localStorage` accessor or `getItem` that throws (privacy mode, a sandboxed or
246
452
  longer leaves `<html>` unstamped: the script treats an unreadable store as ABSENT, so a
247
453
  scalar `defaultDark` falls to its one arm (by default, `prefers-color-scheme`) and the
248
454
  object form to its `absent` arm. Every emission grows 13 bytes, so every hash moves. The
249
- old column is the source after the O-20 cure (the table under _Amended after 9.0.0_
455
+ old column is the source as amended after 9.0.0 (the table under _Amended after 9.0.0_
250
456
  under §8.1.0); the published 9.0.0 `{ normalize: true }` hash,
251
457
  `sha256-Xtel8uEYWeIEsJMO4TZWEump78fncLVrH4/fe166vIw=`, moves to the same new value.
252
458
 
@@ -277,11 +483,10 @@ arm is untouched.
277
483
 
278
484
  Everything that reads them goes darker in light mode: `Badge`'s success/warning plates,
279
485
  `StatusDot` and its inner marks, the `Toast` and `Alert` tone wash, rim and glyph,
280
- ~~`Metric`'s up delta,~~ the `.input-pill:user-valid` border, and every
486
+ the `.input-pill:user-valid` border, and every
281
487
  `text-success`/`text-warning`. As text ink, `--success` is 3.30 on the card, under
282
- 1.4.3's 4.5:1 — keep it off body copy.
283
- [2026-09-22 · O-32 §2.1 — `Metric`'s delta paints `--foreground` from 10.0.0 and reads
284
- neither token; see _`Metric`'s delta paints the one ink_ below.]
488
+ 1.4.3's 4.5:1 — keep it off body copy. `Metric`'s delta paints `--foreground` from
489
+ 10.0.0 and reads neither token; see _`Metric`'s delta paints the one ink_ below.
285
490
 
286
491
  _The token-root contract_
287
492
 
@@ -443,13 +648,12 @@ Paint only. The tooltip chip reads `--tooltip-text` with `--type-leading-caption
443
648
  it inherited body's 1.5 before, so a one-line hint is about 2.4 px shorter at the 12 px
444
649
  caption floor.
445
650
 
446
- ## 9.0.0 — ~~UNRELEASED (in flight; not on the registry)~~ [2026-09-17 · LIVE: tag `v9.0.0` at `d4f7b24f`, published with provenance by `release.yml` run 33273556530 attempt 3, `latest` on the registry]
651
+ ## 9.0.0
447
652
 
448
- **Status.** ~~`package.json` declares `8.0.0`.~~ [2026-09-17 · declares `9.0.0` since `d4f7b24f`; the cut is on the registry.] This section exists because a BREAKING row
449
- landed after the `8.1.0` section below was written, and a removal cannot ride a minor —
450
- so the next cut is a MAJOR and `8.1.0`'s purely-additive content rides it. That section
451
- keeps its heading and its text rather than being silently renumbered; the version it
452
- names is superseded here, not overwritten.
653
+ This section exists because a breaking change
654
+ landed after the `8.1.0` section below was written, and a removal cannot ride a minor,
655
+ so the release became a major and `8.1.0`'s purely additive content rides it. 8.1.0 was
656
+ never published; its section keeps its heading so the notes stay where they were written.
453
657
 
454
658
  _The `./canvas` subpath is removed_
455
659
 
@@ -460,65 +664,45 @@ _The `./canvas` subpath is removed_
460
664
  The subpath published six names and the root barrel already published all six, so this
461
665
  removes a door and no room. `canvas2d` remains the internal substrate it always was; no
462
666
  file moved, no symbol was renamed, and nothing was deprecated first — a clean break, per
463
- this document's own rule. **Zero consumers were found at the cut**: a whole-repo walk over
464
- the fifteen generated sibling roots returned no importer of the specifier, in code or in
465
- CSS.
667
+ this document's own rule.
466
668
 
467
669
  _The `./search` subpath is removed, and this one takes the room with the door_
468
- [2026-08-29 · BK #42 W-SEARCH, landed `76b594c8`]
469
670
 
470
671
  | removed | migration |
471
672
  | --- | --- |
472
- | `@mkbabb/glass-ui/search` | The subpath is gone and nothing republishes its names. The fuzzy engine is ENGINE-INTERNAL (`src/composables/search/`, ruled ⊕⁵ SE-4) — it serves the library's own dock search and is not a public surface. |
473
- | `SearchBar` | DELETED with its ~~`searchVariants` CVA~~ [2026-09-17 · O-20 CLOSE-DOCS · the export was `searchFieldVariants` — `searchVariants.ts` was the module and `SearchVariants` its options type; the published 8.0.0 `dist/components/search/index.d.ts` carries no `searchVariants` export] CVA. No replacement component ships: the `.input-bar` recipe (on `./styles`, which SURVIVES untouched) composes with your own input element — that recipe was always the paint; the chrome was 79 lines over it. |
673
+ | `@mkbabb/glass-ui/search` | The subpath is gone and nothing republishes its names. The fuzzy engine is internal (`src/composables/search/`): it serves the library's own dock search and is not a public surface. |
674
+ | `SearchBar` | Deleted with its `searchFieldVariants` CVA. No replacement component ships: the `.input-bar` recipe (on `./styles`, which SURVIVES untouched) composes with your own input element — that recipe was always the paint; the chrome was 79 lines over it. |
474
675
  | `FuzzySearchState` · `SearchableItem` · `SearchIndex` · `SearchResult` · `SearchVariant` · `SearchVariants` · `UseFuzzySearchOptions` and every other `/search` type | Die with the door. Type your own items; the engine's shapes are internal. |
475
676
 
476
677
  The root barrel never carried `SearchBar` or any fuzzy name, so `./search` was the only
477
- door — the cut is TOTAL, not a narrowing. **Four consumer edges existed at the cut**, all
478
- in value.js's own demo tree (none in anything it ships), and all four carry a marked
479
- relay addendum in the BK coordination channel rather than a silent break: each is one
480
- import statement whose component no longer exists. [2026-08-29 · the batch-close
481
- overfitting audit found the census one edge short: a FIFTH edge lives outside value.js —
482
- `bbnf-lang/playground/src/components/docs/DocsSidebar.vue:4-5` imports `FuzzySearch` /
483
- `useFuzzySearch` / `SearchableItem` from `./search` at playground pin `^3.0.0`. The
484
- four-edge claim was value.js-true and constellation-short; the edge routes to the #76
485
- band for its own relay addendum.] The known `.input-bar` selector sites
486
- read the RECIPE, not the component, and are unaffected.
678
+ door, so the removal is total, not a narrowing. A file that imports from it needs one
679
+ import statement deleted per component it used. Selectors that read `.input-bar` read the
680
+ recipe, not the component, and are unaffected.
487
681
 
488
682
  _The `<FourierField>` `colorResolver` prop is removed_
489
- [2026-09-17 · O-20 CUT-4/5 — the row was owed at the cut and is written now]
490
683
 
491
684
  | removed | migration |
492
685
  | --- | --- |
493
- | `<FourierField :color-resolver>` | Drop the binding and keep the `color` you already pass — the component resolves that value itself. Drop the `import { defaultBlobColorResolver } from "@mkbabb/glass-ui/color"` above it too, ~~unless the file uses it for something else~~ [2026-09-22 · register wave 10-3 — unconditionally at 10.0.0: the name is deleted from `./color`, so the import has nothing to bind; see _Two names leave `./color`_ under 10.0.0]. |
686
+ | `<FourierField :color-resolver>` | Drop the binding and keep the `color` you already pass — the component resolves that value itself. Drop the `import { defaultBlobColorResolver } from "@mkbabb/glass-ui/color"` above it too, unless the file uses it for something else; at 10.0.0 the name leaves `./color`, so drop it then in any case (see _Two names leave `./color`_ under 10.0.0). |
494
687
 
495
- Landed at `4a86570b` (BK #53 GF-FOURIER, 2026-08-12), and 9.0.0 is its first carrier:
496
- `git tag --contains 4a86570b` prints `v9.0.0` and nothing else. The published
688
+ 9.0.0 is the first release without it. The published
497
689
  `FourierField.vue.d.ts` at 9.0.0 declares seven props — `config?`, `spectrum?`,
498
690
  `getPalette?`, `color?`, `seed?`, `freeze?`, `interactive?` — no
499
691
  `colorResolver`, and `colorResolver` survives in the package only as two sentences of
500
- prose in `dist/composables/color/index.d.ts` that this wave corrects.
692
+ prose in `dist/composables/color/index.d.ts`, corrected in 10.0.0.
501
693
 
502
- **There is a live consumer, and it predates the removal by ten weeks.** slides binds the
503
- prop in two files — `src/decks/feedback-coder/slides/Slide01.vue:11,35` and
504
- `Slide05.vue:24,43`, both since `89c5d66` (2026-06-07) — at pin `3.13.0`, where
505
- `colorResolver: ColorResolver` was **required**, not optional. It relaxed to optional at
506
- 7.0.0 and 8.0.0 and is gone at 9.0.0; the repair is one deleted attribute per site.
507
- Those same two lines also carry `variant="hero"` / `variant="final"`, which have been
508
- dead since **4.1.0** (`cb1e09fd`, 2026-06-19) and are inert attributes today — delete
509
- them in the same edit.
694
+ At 3.13.0 `colorResolver: ColorResolver` was **required**, not optional. It relaxed to
695
+ optional at 7.0.0 and 8.0.0 and is gone at 9.0.0; the repair is one deleted attribute per
696
+ site. A `variant="hero"` or `variant="final"` on the same element has been inert since
697
+ **4.1.0**; delete it in the same edit.
510
698
 
511
699
  `ColorResolver` and `defaultBlobColorResolver` both still ship on `./color` and are
512
- **unchanged by this cut**. The O-20 disposition ruled them CURE-NEXT-MAJOR — a ruling,
513
- not an execution — so a consumer may keep importing `defaultBlobColorResolver` for its
514
- own use; what no longer exists is the prop that consumed it.
515
- [2026-09-22 · register wave 10-3 — true of 9.0.0 and no further: both are deleted from
516
- `./color` at 10.0.0, the next major, so the "keep importing" allowance ends there. See
517
- _Two names leave `./color`_ under 10.0.0 for the one-line replacement.]
700
+ **unchanged by this release**, so a consumer may keep importing `defaultBlobColorResolver`
701
+ for its own use at 9.0.0; what no longer exists is the prop that consumed it. Both names
702
+ leave `./color` at 10.0.0; see _Two names leave `./color`_ under 10.0.0 for the one-line
703
+ replacement.
518
704
 
519
705
  _The `<FourierField>` instance API loses `renderAt` and gains `headT` + `flick`_
520
- [2026-09-18 · O-20 CURSOR — the expose delta had no row; measured off the two published
521
- `FourierField.vue.d.ts`]
522
706
 
523
707
  | removed | migration |
524
708
  | --- | --- |
@@ -543,10 +727,8 @@ injects one impulse into the clock, capped and floored like any other. Neither r
543
727
  API.
544
728
 
545
729
  _Two earlier majors' removals get their rows here_
546
- [2026-09-17 · O-20 A-4-RIDER + B-3 — the rows were missing entirely; they are written
547
- under the major that actually shipped without each name, not under this one]
548
730
 
549
- Thirteen `@theme` tokens and three `@utility` classes left the published CSS at
731
+ These rows are written under the major that actually shipped without each name. Thirteen `@theme` tokens and three `@utility` classes left the published CSS at
550
732
  **8.0.0** and one class left at **7.0.0**, none with a MIGRATION row. The rows are now
551
733
  in §8.0.0 (_Theme tokens removed_ · _Classes and utilities removed_) and §7.0.0
552
734
  (_`.paper-texture` is removed_). **9.0.0 removed no token and no utility**: the
@@ -554,9 +736,6 @@ in §8.0.0 (_Theme tokens removed_ · _Classes and utilities removed_) and §7.0
554
736
  byte-identical between 8.0.0 and 9.0.0 (242 and 47 on both).
555
737
 
556
738
  _`GlassDock`'s props fold onto `collapse`_
557
- [2026-09-22 · O-32 §1.1 — landed at `ac471032` (BK #47 W1, 2026-08-24); `git tag
558
- --contains ac471032` prints `v9.0.0` first. The cut shipped with no row; it is written
559
- now, measured off `useDockShellProps.ts` and `dock/index.ts` at `v8.0.0` and `v9.0.0`]
560
739
 
561
740
  | removed | migration |
562
741
  | --- | --- |
@@ -575,26 +754,23 @@ now, measured off `useDockShellProps.ts` and `dock/index.ts` at `v8.0.0` and `v9
575
754
  (`false | "closed" | "open"`) and `DockProps`.
576
755
 
577
756
  _`--dock-max-inline-size` is removed_
578
- [2026-09-22 · O-32 AC-D-1 — the reader left at 9.0.0 and the declaration at 10.0.0; the
579
- removal is recorded here, under the cut that stopped reading it. The sentence above counts
580
- the published `@theme` and `@utility` name sets; this is an unlayered `:root` token, on
581
- neither, and 9.0.0 still declared it.]
757
+
758
+ Its reader left at 9.0.0 and its declaration at 10.0.0, so the row sits under the release
759
+ that stopped reading it. It is an unlayered `:root` token, outside the `@theme` and
760
+ `@utility` name sets counted above.
582
761
 
583
762
  | removed | migration |
584
763
  | --- | --- |
585
- | `--dock-max-inline-size` | Nothing reads it. 9.0.0 deleted its last reader with the per-instance inline cap (`964535cb`, BK #47 W2-W9, the W3 LATTICE, 2026-08-25; `git tag --contains` prints `v9.0.0` first), so setting it did nothing at 9.0.0. The declaration in `tokens/offsets.css` is deleted at 10.0.0 (`9d8cd728`). To bound a dock's inline size, write `max-inline-size` on the dock's class. |
764
+ | `--dock-max-inline-size` | Nothing reads it. 9.0.0 deleted its last reader with the per-instance inline cap, so setting it did nothing at 9.0.0. The declaration in `tokens/offsets.css` is deleted at 10.0.0. To bound a dock's inline size, write `max-inline-size` on the dock's class. |
586
765
 
587
766
  _Eight `./handmark` types leave with the barrel's reshape_
588
- [2026-09-22 · O-23 L-5 — removed at `5a69ed9f` (BK #51 γ4, GF-HANDMARK, 2026-08-25);
589
- `git tag --contains` prints `v9.0.0` first. The cut shipped with no row; it is written
590
- now, measured off `handmark/index.ts` at `v8.0.0` and `v9.0.0`]
591
767
 
592
768
  | removed | migration |
593
769
  | --- | --- |
594
770
  | `Brush` · `BrushName` · `BlendMode` · `TaperSpec` · `InkPath` | No successor. The brush continuum is gone: `<HandMark>` inks one pen and takes no `brush` prop. |
595
771
  | `HandMarkProps` · `HandAnimation` · `MarkBox` | No successor type. `<HandMark>` declares five props at 9.0.0 (`shape` · `color` · `weight` · `seed` · `draw`); `draw` is the draw-on switch. `HandShape` stays. |
596
772
 
597
- The same commit took 25 more names off the barrel: `BRUSHES`, `resolveBrush`,
773
+ The same change took 25 more names off the barrel: `BRUSHES`, `resolveBrush`,
598
774
  `lerpBrush`, `StampFn`, `shapeGeom`, `ShapeGeom`, `boilLines`, `naturalUnderlinePoints`,
599
775
  `VB_W`, `VB_H`, `UNDERLINE_GAP`, `ink`, `SVGFragment`, `grainFilter`, `hasGrain`,
600
776
  `getStroke`, `getStrokePoints`, `getSvgPathFromStroke`, `StrokeOptions`, `InputPoint`,
@@ -605,9 +781,9 @@ polyline with the component's own pen). `HandMark`, `HandShape` and `serialize`
605
781
  unchanged.
606
782
 
607
783
  _Amended after 9.0.0_
608
- [2026-09-18 · O-26 R-8, UNRELEASED on the registry: everything from here to the end of
609
- this section describes the cured source, not the 9.0.0 bytes. The keyboard registry has
610
- had no row since 5.0.0 and both changes are behavioural, not renames.]
784
+
785
+ Everything from here to the end of this section shipped in 10.0.0, not in 9.0.0. Both
786
+ changes are behavioural, not renames.
611
787
 
612
788
  **The keyboard registry honours `defaultPrevented`, and modal overlays quiet the app's
613
789
  bindings.** Nothing is renamed and nothing is removed. Two behaviours change, and a
@@ -647,14 +823,10 @@ the page operable and keeps its keyboard with it.
647
823
  of what the app answers to, not a live capability probe, and a help overlay is itself a
648
824
  modal that filtering would hand an empty list.
649
825
 
650
- ## 8.1.0 — ~~UNRELEASED (in flight; not on the registry)~~ [2026-08-10 · BK #21: superseded
651
- as a version number by the `9.0.0` section above — the content below stands, the cut it
652
- lands in is now the major] [2026-09-17 · that major is on the registry: 9.0.0]
826
+ ## 8.1.0
653
827
 
654
- **Status, stated so nothing here reads as shipped.** ~~`package.json` declares `8.0.0`
655
- (detector: `node -p "require('./package.json').version"` → `8.0.0`), and `8.1.0` is the
656
- next minor this additive change cuts at.~~ [2026-09-17 · SHIPPED inside 9.0.0 — the detector prints `9.0.0`; everything below is live on the registry.] Nothing below is breaking; a caller who does
657
- not opt in has nothing to do.
828
+ 8.1.0 was never published: everything below shipped inside 9.0.0. Nothing below is
829
+ breaking; a caller who does not opt in has nothing to do.
658
830
 
659
831
  _`darkModeSyncScript()` gains three options — `defaultDark` · `queryOverride` · `normalize`_
660
832
 
@@ -673,9 +845,9 @@ and nothing else from this module).
673
845
  Precedence is **query > storage > default**, in that order and no other.
674
846
 
675
847
  _The default emission is BYTE-IDENTICAL — deliberately, and it nearly was not_
676
- [2026-09-22 · register wave N-3 — true through 9.0.0. At 10.0.0 every emission moves, the
677
- default to 313 bytes; see _`darkModeSyncScript()` hardens its read, and every CSP hash
678
- moves_ under 10.0.0.]
848
+
849
+ This holds through 9.0.0. At 10.0.0 every emission moves, the default to 313 bytes; see
850
+ _`darkModeSyncScript()` hardens its read, and every CSP hash moves_ under 10.0.0.
679
851
 
680
852
  The emitted `<head>` script is exactly what a `script-src 'sha256-…'` CSP pins, and a
681
853
  re-hashed default would be **blocked at first paint, silently** — no type error, no
@@ -710,14 +882,14 @@ _Two behaviours are RATIFIED rather than left to be discovered_
710
882
  says. If you build these URLs from a boolean, emit the flag or omit it; do not emit
711
883
  it with a value.
712
884
 
713
- Both are held by named arms under the seated `G-NO-FLASH` gate in
885
+ Both are held by named tests in
714
886
  `tests/composables/dark/darkModeSyncScript.test.ts`, so a silent reorder or a swap to a
715
887
  value grammar turns the suite RED rather than surprising a consumer.
716
888
 
717
889
  _Amended after 9.0.0_
718
- [2026-09-17 · O-20 cure wave, UNRELEASED on the registry: everything from here to the
719
- end of this section describes the cured source, not the 9.0.0 bytes. The three rows
720
- above are a true record of what 9.0.0 shipped and are left standing.]
890
+
891
+ Everything from here to the end of this section shipped in 10.0.0, not in 9.0.0. The
892
+ three rows above are what 9.0.0 shipped.
721
893
 
722
894
  **`defaultDark` widens to answer the absent case and the `"auto"` case separately.**
723
895
 
@@ -737,9 +909,8 @@ paint in private browsing now knows what that was.
737
909
 
738
910
  **One CSP hash moves, and only one.** The four opt-in byte counts are unmoved and three
739
911
  of the four hashes are unmoved; `{normalize: true}` reorders its bytes, so its hash
740
- moves. Every figure below is derived from the function, not typed — recomputed on this
741
- HEAD with `npx tsx` against `src/composables/dark/darkModeSyncScript.ts`, and the 9.0.0
742
- column read out of the published `dist/dark.js`:
912
+ moves. Every figure below is derived from the function, and the 9.0.0 row is read out of
913
+ the published `dist/dark.js`:
743
914
 
744
915
  ```
745
916
  darkModeSyncScript() 300 B sha256-VTba/T+6rX/y5+Gk2oyLaaYBdLf4xSZtXnc7kMYziI8= unmoved
@@ -753,9 +924,9 @@ darkModeSyncScript() 300 B sha256-VTba/T+6rX/y5+Gk2oyLaaYBd
753
924
  ```
754
925
 
755
926
  If you pin the normalize emission under `script-src 'sha256-…'`, re-pin it at the bump
756
- or first paint is blocked. The DEFAULT emission is byte-identical and needs nothing.
757
- [2026-09-22 · register wave N-3 — through this amendment. The 10.0.0 read hardening
758
- moves the default too, and every form re-pins at that bump.]
927
+ or first paint is blocked. Through this amendment the default emission is
928
+ byte-identical and needs nothing; the 10.0.0 read hardening moves the default too, and
929
+ every form re-pins at that bump.
759
930
 
760
931
  _Wire it with a build plugin; do not transcribe the bytes_
761
932
 
@@ -800,13 +971,11 @@ than pinning a literal you maintain by hand — it is the same string on both si
800
971
 
801
972
  ## 8.0.0
802
973
 
803
- **THE EXPORT SURFACE IS RE-CUT — one batched change, six subpath movements, and the
804
- `R-PUBLIC-8-LEDGER` this section is.** `exports` goes **66 → 70 keys** (`jsSubpaths` 64,
805
- regenerated exactly from `scripts/lib/subpath-policy.mjs`, `EXACT REPRODUCTION: YES`).
806
- Clean breaks throughout: no aliases, no deprecation window. Two keys retire, six mint,
807
- one component is deleted [2026-09-18 · O-26 R-11-RIDER — in THIS re-cut. The major's
808
- deletion roll is wider: `HeaderRibbon` went at `4bf53962`, outside the batch, and its
809
- `./header-ribbon` key is not one of the two counted here. Its entry is below TagsInput's.].
974
+ **The export surface is re-cut: one batched change and six subpath movements.**
975
+ `exports` goes **66 → 70 keys**. Clean breaks throughout: no aliases, no deprecation
976
+ window. Two keys retire, six are added, and one component is deleted in that batch. The
977
+ major deletes more than that: `HeaderRibbon` and several other components left in the
978
+ same release, each with its own entry below TagsInput's.
810
979
 
811
980
  _Package subpaths_
812
981
 
@@ -814,7 +983,7 @@ _Package subpaths_
814
983
  | --- | --- | --- |
815
984
  | `@mkbabb/glass-ui/dropdown-menu` | `@mkbabb/glass-ui/menu` | Re-point the specifier. **The fourteen `DropdownMenu*` SFC names are UNCHANGED** — the family's directory and door moved, not its symbols, so a one-line import edit is the whole migration. The old name was wrong in both directions: the same 28 reka imports serve both the click and the context arm, and `./context-menu` was never exported at all. |
816
985
  | `@mkbabb/glass-ui/forms` | `@mkbabb/glass-ui/input` · `/textarea` · `/checkbox` · `/radio-group` | Split the import by component. `./forms` was a hand-curated union of four components — a second door onto the same source — and the rule is now stateable: **one subpath per public component, no exceptions in either direction.** |
817
- | ~~—~~ `@mkbabb/glass-ui/drawer` | `@mkbabb/glass-ui/sheet` | ~~NEW. `SheetContent` and the detent surface were reachable only through the root barrel while the `./sheet` specifier resolved to nothing. If you were importing it, it works now.~~ [2026-09-22 · register wave N-6 — the row read as a new door; it is the door `Drawer` folded into. `Drawer` folded WHOLE into `Sheet` at `336dacf9` ("the detent is a size, the drawer folds in whole"), so `./drawer` retired with the fold and this row is its record — a fold, not a deletion.] `<Drawer>` + `<DrawerContent>` → `<Dialog>` + `<SheetContent side="bottom" :detents="[…]">` — a detent is a size, so `left`/`right` ladders are as legal as `bottom`/`top`. `mode="live-behind"` → `<Dialog :modal="false">`. `DrawerHeader` · `DrawerTitle` · `DrawerDescription` · `DrawerFooter` → the `Dialog*` parts on `./dialog`. `direction` (`DrawerDirection`) → `side`; `snapPoints` → `detents`, ascending fractions of the anchored axis (a string snap point converts to its fraction); `activeSnapPoint` → `v-model:detent`. Two defaults flip: `direction` defaulted to `bottom`, `side` defaults to `right`, so write `side="bottom"` for a bottom sheet; the live-behind ladder `[0.12, 0.5, 1]` was implicit, so write `:detents="[0.12, 0.5, 1]"` to keep it. `DrawerStage` has no successor: the stage was deleted at `b155ca4c`, inside this major (see **The immersive stage scrim is a private stage-effect role, reconnected to `--glass-level`** under §8.0.0). |
986
+ | `@mkbabb/glass-ui/drawer` | `@mkbabb/glass-ui/sheet` | `Drawer` folded whole into `Sheet` (the detent is a size), so `./drawer` retired with the fold; this is a fold, not a deletion. `<Drawer>` + `<DrawerContent>` → `<Dialog>` + `<SheetContent side="bottom" :detents="[…]">` — a detent is a size, so `left`/`right` ladders are as legal as `bottom`/`top`. `mode="live-behind"` → `<Dialog :modal="false">`. `DrawerHeader` · `DrawerTitle` · `DrawerDescription` · `DrawerFooter` → the `Dialog*` parts on `./dialog`. `direction` (`DrawerDirection`) → `side`; `snapPoints` → `detents`, ascending fractions of the anchored axis (a string snap point converts to its fraction); `activeSnapPoint` → `v-model:detent`. Two defaults flip: `direction` defaulted to `bottom`, `side` defaults to `right`, so write `side="bottom"` for a bottom sheet; the live-behind ladder `[0.12, 0.5, 1]` was implicit, so write `:detents="[0.12, 0.5, 1]"` to keep it. `DrawerStage` has no successor: the stage was deleted in this major (see **The immersive stage scrim is a private stage-effect role, reconnected to `--glass-level`** under §8.0.0). |
818
987
  | `ControlSize` (from `/forms`) | `@mkbabb/glass-ui/input` | The shared `sm \| md \| lg` union the control register threads as `size?`. Input is the canonical member, so `./input` is its one published door. |
819
988
  | `useUserInvalidAria` (from `/forms`) | `@mkbabb/glass-ui` (root) | No move — it was **already** on the root barrel, which is now its only door. |
820
989
 
@@ -823,14 +992,9 @@ _Deleted — `TagsInput`_
823
992
  `TagsInput`, `TagsInputInput`, `TagsInputItem`, `TagsInputItemDelete`,
824
993
  `TagsInputItemText` and their five prop types are **deleted from the root barrel**, with
825
994
  the component directory, its story and its contract test. It was never published on a
826
- subpath, and the consumer walk (19 roots: 15 closed-universe + 3 operational mirrors + 1
827
- negative control) found **zero specifier edges and zero symbol edges**. There is no
828
- replacement: compose `<Chip>` inside a `<LabeledField>` if you need the shape.
995
+ subpath. There is no replacement: compose `<Chip>` inside a `<LabeledField>` if you need the shape.
829
996
 
830
997
  _Deleted — `HeaderRibbon`_
831
- [2026-09-18 · O-26 R-11-RIDER — the component went at this cut (`4bf53962`, part of the Φ5
832
- deletion spine) and had no entry until now, outside the export re-cut the count sentence
833
- above tallies.]
834
998
 
835
999
  `HeaderRibbon` is deleted with the `@mkbabb/glass-ui/header-ribbon` subpath and both of its
836
1000
  types, `HeaderRibbonProps` and `HeaderRibbonPlacement`. Delete the import and the specifier
@@ -845,7 +1009,7 @@ on a glass surface, and you compose that yourself under your own wrapper:
845
1009
  </div>
846
1010
  ```
847
1011
 
848
- On 7.0.0 the same plate was `material="functional"`; that prop is deleted at this cut and
1012
+ On 7.0.0 the same plate was `material="functional"`; that prop is deleted in this release and
849
1013
  `functional` was the `floating` tier under a second name — see the Surface row below.
850
1014
 
851
1015
  The `role` and the label belong to the consumer's wrapper because the landmark is the
@@ -855,9 +1019,6 @@ already removed AT 7.0.0; see `## 7.0.0` below. The published 7.0.0 component is
855
1019
  persistent-only, and renders expanded from first paint.
856
1020
 
857
1021
  _Deleted — `AnimatedDigit`_
858
- [2026-09-18 · O-26 R-11-RIDER-2 — retired at this cut (`4bf53962`, the Φ5 deletion spine)
859
- with no entry until now. Measured, not recalled: the `exports` key set goes **74 → 70**
860
- from 7.0.0 to 8.0.0, and this subpath is one of the eleven that retire.]
861
1022
 
862
1023
  `AnimatedDigit` is deleted with the `@mkbabb/glass-ui/animated-digit` subpath and its two
863
1024
  types, `AnimatedDigitProps` and `AnimatedDigitMode`. There is no successor: nothing in the
@@ -865,8 +1026,6 @@ library rolls a digit, and a counter that animates its own glyphs is the caller'
865
1026
  surface's. Delete the import and the specifier together.
866
1027
 
867
1028
  _Deleted — `CompletionSeal`_
868
- [2026-09-18 · O-26 R-11-RIDER-2 — retired at this cut (`4bf53962`, the Φ5 deletion spine)
869
- with no entry until now.]
870
1029
 
871
1030
  `CompletionSeal` is deleted with the `@mkbabb/glass-ui/completion-seal` subpath, its types
872
1031
  `CompletionSealProps` and `CompletionSealShape`, and the composable door beside it —
@@ -874,8 +1033,6 @@ with no entry until now.]
874
1033
  successor, composable included: the whole seal went at once.
875
1034
 
876
1035
  _Deleted — `InstrumentChassis`_
877
- [2026-09-18 · O-26 R-11-RIDER-2 — retired at this cut (`4bf53962`, the Φ5 deletion spine)
878
- with no entry until now.]
879
1036
 
880
1037
  `InstrumentChassis` is deleted with the `@mkbabb/glass-ui/instrument-chassis` subpath and
881
1038
  all five of its types: `InstrumentChassisProps`, `InstrumentChassisBoundary`,
@@ -884,8 +1041,6 @@ There is no successor component. The proportion and reserve it framed are layout
884
1041
  caller now owns outright.
885
1042
 
886
1043
  _Deleted — `LiquidGrid`_
887
- [2026-09-18 · O-26 R-11-RIDER-2 — retired at `bda718ac` ("W3 clean deletes"), inside this
888
- major, with no entry until now.]
889
1044
 
890
1045
  `LiquidGrid` is deleted with the `@mkbabb/glass-ui/liquid-grid` subpath and everything that
891
1046
  door published: the `useLiquidGrid` composable with `LiquidGridHandle` and
@@ -897,18 +1052,15 @@ door published: the `useLiquidGrid` composable with `LiquidGridHandle` and
897
1052
  that type has its own door on `@mkbabb/glass-ui/color`. There is no successor.
898
1053
 
899
1054
  _Deleted — `PaperBackdrop`_
900
- [2026-09-18 · O-26 R-11-RIDER-2 — retired at this cut (`4bf53962`, the Φ5 deletion spine)
901
- with no entry until now.]
902
1055
 
903
1056
  `PaperBackdrop` is deleted with the `@mkbabb/glass-ui/paper-backdrop` subpath and its type
904
1057
  `PaperBackdropProps`. There is no successor component; a page-level ground is a background
905
1058
  you own.
906
1059
 
907
1060
  _Deleted — `Pulse`_
908
- [2026-09-18 · O-26 R-11-RIDER-2 — retired at `bda718ac` ("the P-CLOSE-ruled pulse →
909
- StatusDot merge"), inside this major, with no entry until now. The `StatusDot` prop table
910
- below retires the `pulse` PROP; that is a different object and never recorded this
911
- component's own retirement.]
1061
+
1062
+ The `StatusDot` prop table below retires the `pulse` prop; this entry is the `Pulse`
1063
+ component itself.
912
1064
 
913
1065
  `Pulse` is deleted with the `@mkbabb/glass-ui/pulse` subpath and its exported `PulseState`.
914
1066
  This one is a merge rather than a drop, so it has a successor: liveness is an axis of
@@ -933,8 +1085,6 @@ it. Any call site that leant on Pulse's default must name the state. Import from
933
1085
  below for the rest.
934
1086
 
935
1087
  _Deleted — `WatercolorDot`_
936
- [2026-09-18 · O-26 R-11-RIDER-2 — retired at `62305f4a` ("the hero ornament dies, the ramp
937
- is the library's own hand"), inside this major, with no entry until now.]
938
1088
 
939
1089
  `WatercolorDot` is deleted with the `@mkbabb/glass-ui/watercolor-dot` subpath and every
940
1090
  symbol that door published: `useWatercolorBlob` with `UseWatercolorBlobOptions` and
@@ -947,9 +1097,6 @@ library (`src/composables/glass/procedural/prng.ts`) behind no published door, a
947
1097
  pinned 7.0.0 package and into your own tree.
948
1098
 
949
1099
  _Six composables leave `./motion`, `./motion-core` and the root barrel_
950
- [2026-09-22 · O-23 L-5 — retired at `bda718ac` ("W3 clean deletes", 2026-07-20; `git tag
951
- --contains` prints `v8.0.0` first), inside this major, with no entry until now; written
952
- because the census rows below point at them]
953
1100
 
954
1101
  | removed | migration |
955
1102
  | --- | --- |
@@ -970,10 +1117,6 @@ If you style the menu family from outside, the selectors renamed with the family
970
1117
  namespace.
971
1118
 
972
1119
  _Theme tokens removed — thirteen `@theme` names_
973
- [2026-09-17 · O-20 A-4-RIDER — these left the published CSS at this cut and had no row
974
- until now. Measured, not recalled: the `@theme` custom-property name set of the
975
- published `./styles` closure goes **246 → 242** from 7.0.0 to 8.0.0 and is unchanged
976
- from 8.0.0 to 9.0.0, so every one of the thirteen belongs here.]
977
1120
 
978
1121
  If you read one of these by name, it resolves to nothing today. Each row names what
979
1122
  carries the value now, or says there is nothing.
@@ -1018,51 +1161,43 @@ are very much alive: the register re-cut onto SIX role rungs — `--spring-dock`
1018
1161
  `--spring-present` · `--spring-press` · `--spring-panel` · `--spring-world` ·
1019
1162
  `--spring-bloom`, each with its own `-duration`, `-exit-duration` and `-settle` clock. A
1020
1163
  recipe that wants one by utility name reaches the token directly:
1021
- `ease-(--spring-press)`. A consumer that earns the utilities re-mints them in its own
1022
- tranche. The old spellings map by intent, not by name: `--ease-spring` and
1164
+ `ease-(--spring-press)`. A consumer that wants the utilities back declares them in its
1165
+ own CSS. The old spellings map by intent, not by name: `--ease-spring` and
1023
1166
  `--ease-spring-snappy` were `--spring-snappy`, which is now `--spring-present` (or
1024
1167
  `--spring-dock` for dock motion); `--ease-spring-smooth` and `--ease-spring-bouncy` also
1025
1168
  land on `--spring-present`; `--ease-spring-gentle` was `--spring-gentle`, now
1026
1169
  `--spring-world`; `--ease-spring-press` is the one that kept its name, `--spring-press`.
1027
1170
 
1028
1171
  _Classes and utilities removed_
1029
- [2026-09-17 · O-20 B-3 — the `@utility` name set of the published `./styles` closure
1030
- goes **49 → 47** at this cut (three out, one in) and is unchanged at 9.0.0.]
1031
1172
 
1032
1173
  | removed | what to write instead |
1033
1174
  | --- | --- |
1034
1175
  | `glass-fill` | `glass-plate`, which landed in the very commit that removed this one (`4b1a9733`): `.glass-card` moved from `@apply glass-fill` to `@apply glass-plate` there. It paints `background: var(--glass-veil)`, and you pick the rung by declaring `--glass-veil-tier: var(--glass-veil-quiet)` — or `--glass-veil-wash`, `--glass-veil-resting`, `--glass-veil-floating`, `--glass-veil-overlay` — in the place `--glass-fill-rung` used to go. The old TINT mix has no hand-composed equivalent: `--glass-bg-resting`, `--glass-tint-source` and `--glass-tint-strength` all have 0 declarations at 9.0.0. `--glass-fill-tinted` is **not** the successor — it has shipped beside `glass-fill` since 5.0.0 (`216e1d54`), and still beside it in the 7.0.0 package, as a tint OVERLAY. It is itself an ordinary custom property, a `color-mix` that READS the two registered knobs: `@property --glass-fill-tint` (`<color>`, initial `transparent`) and `@property --glass-fill-strength` (`<percentage>`, initial `0%`), both registered at the foot of `styles/tokens/glass.css`. With both at their initials the mix resolves to a fully transparent stop, so reading `--glass-fill-tinted` as a `background` paints nothing until you set both knobs yourself. |
1035
1176
  | `text-admin-label` | `text-mono-micro`, plus `uppercase font-medium` wherever the caps or the 500 weight carried meaning — the successor does not include them. The old recipe was `font-mono` · `--type-admin-label` (10px) · `line-height: 1` · `uppercase` · `tracking-caps` · `font-weight: 500`; the new one is `font-mono` · `--type-micro` (11px) · `line-height: 1.25` · `letter-spacing: 0.025em`. Landed `6b450f22`. |
1036
- | `touch-hit-area` | Removed, no drop-in utility. ~~Compose it yourself — a `position: relative` host and, inside `@media (pointer: coarse)`, a centred `::before` with `min-width`/`min-height` of `var(--touch-target, 2.75rem)` and `pointer-events: none`.~~ [2026-09-18 · O-26 R-7-RIDER — that recipe was the utility's own body and it never expanded a tap target: `pointer-events: none` makes the halo inert, so the hit box stays the host's. Written now: the two doors that do work.] `--touch-target` (`2.75rem`) still ships and is still what the components read, and there are two ways to reach it. **The host as the seat, the paint on a child** — the host wears `.control-bit`, which sizes it to `max(var(--touch-target), face)` on both axes, in flow, margin box == border box, while the smaller `.control-bit__face` child carries the paint; checkbox and the radio item ship this way (`styles/glass/control-bit.css`). The absolutely-positioned `.checkbox__seat` span it replaced bled past the box and made the hit rect lie — do not reach for that form. **Or the attribute floor** — `[data-control-target]` on the host, read by the shared rule in `styles/utilities/responsive.css`: `@media (pointer: coarse){[data-control-target]{min-block-size: var(--touch-target, 2.75rem); min-inline-size: var(--touch-target, 2.75rem)}}`. That rule ships from 7.0.0; what changes at THIS cut is that Button wears the attribute unconditionally rather than icon-only (`70dc0f06`). It is a floor, not a halo: it grows the host's own box, and the paint stays small by sitting on a child — the Timeline marks are `<button data-control-target>` whose disc does not inflate. Either door; never the inert `::before`. Landed `bd93c22b`. |
1177
+ | `touch-hit-area` | Removed, no drop-in utility. Do not rebuild it from its old body (a centred `::before` with `pointer-events: none`): that halo is inert and never expanded a tap target. `--touch-target` (`2.75rem`) still ships and is still what the components read, and there are two ways to reach it. **The host as the seat, the paint on a child** — the host wears `.control-bit`, which sizes it to `max(var(--touch-target), face)` on both axes, in flow, margin box == border box, while the smaller `.control-bit__face` child carries the paint; checkbox and the radio item ship this way (`styles/glass/control-bit.css`). The absolutely-positioned `.checkbox__seat` span it replaced bled past the box and made the hit rect lie — do not reach for that form. **Or the attribute floor** — `[data-control-target]` on the host, read by the shared rule in `styles/utilities/responsive.css`: `@media (pointer: coarse){[data-control-target]{min-block-size: var(--touch-target, 2.75rem); min-inline-size: var(--touch-target, 2.75rem)}}`. That rule ships from 7.0.0; what changes in this release is that Button wears the attribute unconditionally rather than icon-only. It is a floor, not a halo: it grows the host's own box, and the paint stays small by sitting on a child — the Timeline marks are `<button data-control-target>` whose disc does not inflate. Either door; never the inert `::before`. |
1037
1178
 
1038
1179
  The roster also GAINED one utility at this cut: the `@utility` diff 7.0.0 → 8.0.0 is
1039
1180
  three out, one in, and that gain is the successor named above.
1040
1181
 
1041
1182
  _The blanket blur opt-out is gone — `--glass-cell-backdrop-filter`_
1042
- [2026-09-18 · O-26 R-10-RIDER — the strike landed at BK.W-FROST (`4b1a9733`) with no row
1043
- of any kind. Measured from the published dists: 39 occurrences at 7.0.0, 0 at 8.0.0, 0 at
1044
- 9.0.0. No roster impact — it was a plain custom property, never a `@theme` or `@utility`
1045
- name — which is why it is its own block and not a fourteenth row in the table above.]
1183
+
1184
+ It was a plain custom property, never a `@theme` or `@utility` name, which is why it is
1185
+ its own block and not a fourteenth row in the table above.
1046
1186
 
1047
1187
  | removed | what to write instead |
1048
1188
  | --- | --- |
1049
1189
  | `--glass-cell-backdrop-filter` | `surface="opaque"` on the component, or `data-surface="opaque"` on a plain element. The token was the blur channel's blanket override: every glass rung read `backdrop-filter: var(--glass-cell-backdrop-filter, var(--glass-blur-<rung>))`, so declaring it anywhere in the tree replaced the blur of every rung under it. Sixteen read-arms collapsed in the same commit, and the rule that set it went with them — `:where(.glass-wash, .glass-quiet, .glass-resting, .glass-floating, .glass-overlay, .glass-card, .glass-dock) > * { --glass-cell-backdrop-filter: none; }`, the content-tier suppression that kept a glass child from blurring inside a glass parent. Both halves are gone together. Build on the SURFACE axis instead, never on the token: a surface declares what it is, and the blur follows from it. Landed `4b1a9733`. |
1050
1190
 
1051
1191
  _A registered `@property` name is gone — `--specular-angle`_
1052
- [2026-09-18 · O-26 R-15-RIDER — a registered `@property` name is a published name, and
1053
- this one left with no row. The major was MEASURED, not recalled: `grep -c specular-angle`
1054
- on `dist/styles/tokens/property-regs.css` is 1 at 7.0.0 and 0 at 8.0.0 and 9.0.0, and the
1055
- dist-wide file count goes 5 → 0 → 0, so the row belongs at THIS cut. No roster impact: the
1056
- roster pins `@theme` and `@utility` names.]
1057
1192
 
1058
1193
  | removed | what to write instead |
1059
1194
  | --- | --- |
1060
1195
  | `--specular-angle` | Removed, no successor. It was the angular channel of the specular register, `@property`-registered in `styles/tokens/property-regs.css` and read by the conic-gradient leg of the `::before` sweep. The positional family is THREE names from this cut, not four: `--specular-x`, `--specular-y` and `--specular-intensity` all survive and stay registered. A stylesheet that writes the angle declares an unregistered custom property that nothing reads. |
1061
1196
 
1062
1197
  _Focus moves off `box-shadow` and stops restating the shape_
1063
- [2026-09-18 · O-26 R-16-RIDER — both reshapes landed at this cut (`70dc0f06`) and neither
1064
- had a row. Both are visible breaks for a consumer that relied on the pill geometry or read
1065
- `--focus-ring-shadow` as the control's paint.]
1198
+
1199
+ Both are visible breaks for a consumer that relied on the pill geometry or read
1200
+ `--focus-ring-shadow` as the control's paint.
1066
1201
 
1067
1202
  | was | now | what to do |
1068
1203
  | --- | --- | --- |
@@ -1073,8 +1208,6 @@ had a row. Both are visible breaks for a consumer that relied on the pill geomet
1073
1208
  what changed is that `.field-control` is no longer one of them.
1074
1209
 
1075
1210
  _Alert loses its tone wash_
1076
- [2026-09-17 · O-20 C-1 (the ask is value.js's AF-7) — W-ALERT (#33, `76bfae26`) landed
1077
- at this cut with no MIGRATION paragraph; this is it.]
1078
1211
 
1079
1212
  All five Alert tones now ride ONE `.glass-quiet` rung. There is no per-tone tinted
1080
1213
  plate, and there is no per-tone ink rung (`--success-ink` and its siblings are not
@@ -1086,15 +1219,13 @@ What to do: adopt the component and delete any local fork. A `class="bg-success/
1086
1219
  text-success"` wrapper reproduces exactly the thing this cut removed; drop it whole. Set
1087
1220
  `announce` explicitly if you want the live region — it defaults to `off`.
1088
1221
 
1089
- **The toned glyph channel was dead from 8.0.0 through 9.0.0, and paints from the O-20
1090
- cure wave on — that wave is not on the registry yet, so at 9.0.0 the glyph is still
1091
- neutral.** The TONED arms carry `[&>svg]:text-(--tone)`, but BASE ended
1222
+ **The toned glyph channel was dead from 8.0.0 through 9.0.0, and paints from 10.0.0
1223
+ on, so at 9.0.0 the glyph is still neutral.** The TONED arms carry `[&>svg]:text-(--tone)`, but BASE ended
1092
1224
  `[&>svg]:text-current`; `cn()` is a bucketed deduper rather than twMerge, so both
1093
1225
  survived the join, and Tailwind emits the `--tone` rule BEFORE the `currentcolor` rule
1094
1226
  at equal specificity — currentcolor won, and a toned Alert was pixel-identical to a
1095
1227
  neutral one. Chrome measured the toned glyph at `rgb(28, 25, 23)`, the plate ink. The
1096
- cure deletes `text-current` from BASE, and the same probe then reads the tone. The
1097
- evidence pair is in `docs/tranches/BK/execution/2026-09-17-o20-cure/C2/RECORD.md`. If
1228
+ fix deletes `text-current` from BASE, and the glyph then reads the tone. If
1098
1229
  you relied on the neutral-looking glyph, note that your toned Alerts will now paint
1099
1230
  their tone.
1100
1231
 
@@ -1122,18 +1253,6 @@ glass-ui declares it as a peer so the type closure is part of the published cont
1122
1253
  rather than an accident of hoisting. The range matches reka-ui's own usage. When reka-ui
1123
1254
  ships the dependency correctly, this peer can be dropped in one line.
1124
1255
 
1125
- _Release-path note (U-08's substitution, recorded rather than done silently)_
1126
-
1127
- This cut's close battery reads `npm run typecheck` + `npm test` +
1128
- ~~`node scripts/verify-governed-invariants.mjs`~~ **`node scripts/gate-register.mjs`** +
1129
- `npm run verify:package` + the wired visual suite. The third command **does not exist**
1130
- and cannot be run — detector, verbatim: `ls scripts/verify-governed-invariants.mjs` →
1131
- `No such file or directory`; `git ls-files scripts/` → 15 files, absent. It was lost with
1132
- the governance stash and `scripts/gate-register.mjs` is its committed successor: it
1133
- re-derives the code-side register, parses the seat budget from its own authority, and
1134
- exits non-zero on any violation.
1135
-
1136
-
1137
1256
  **`StatusDot`'s 7.0.0 cut is written down — two majors late.** The 7.0.0 rewrite
1138
1257
  replaced this component's entire API and shipped no migration rows at all, while
1139
1258
  `v-bind="$attrs"` made every retired prop a silent no-op: the call sites kept
@@ -1203,16 +1322,15 @@ _Metric — one atom, two composers_
1203
1322
  - **`<Metric orientation>` is `<Metric posture>`** — `inline | stacked | cell | row`.
1204
1323
  - **New**: `delta` + `polarity` (status ink on the neutral material, never a coloured
1205
1324
  plate), `compact` (locale-aware compact numbers through `coalesceMetric`), and
1206
- `coalesceMetric` / `metricPolarity` are exported from `./metric`.
1207
- [2026-09-22 · O-32 §2.1 — the status ink ends at 10.0.0: the delta paints
1208
- `--foreground` and its number and sign carry the polarity; see _`Metric`'s delta
1209
- paints the one ink_ under 10.0.0.]
1325
+ `coalesceMetric` / `metricPolarity` are exported from `./metric`. The status ink ends
1326
+ at 10.0.0: the delta paints `--foreground` and its number and sign carry the polarity;
1327
+ see _`Metric`'s delta paints the one ink_ under 10.0.0.
1210
1328
 
1211
1329
  **The dock's "rail" vocabulary is struck; the layer-switcher renames and the
1212
1330
  hairline is built.** `rail` meant a VERTICALLY-ORIENTED DOCK in the dock band's own
1213
1331
  identifiers (`--dock-rail-padding` was the vertical dock's padding, `--dock-rail-extend-length`
1214
- its reach, `--dock-rail-accent-*` its selected bar) while the owner's standing
1215
- correction is that a rail is a *hairline inside* a horizontal or vertical dock. Three
1332
+ its reach, `--dock-rail-accent-*` its selected bar), but a rail is a *hairline inside* a
1333
+ horizontal or vertical dock. Three
1216
1334
  things now carry three names: a vertical dock is `<GlassDock orientation="vertical">`,
1217
1335
  the in-dock tab strip is the **layer switcher**, and the line across the dock is the
1218
1336
  **hairline**. Clean break, no aliases.
@@ -1271,10 +1389,8 @@ horizontal OR a vertical dock. The plain `<DockSeparator>` is unchanged.
1271
1389
  knob and `.value-mark(s)` selectors are removed.** The Slider `.slider-track` and
1272
1390
  the Progress `.progress-rail` now COMPOSE two shared registers — the recessed
1273
1391
  `.track-well` groove and the `.glass-value-marks`/`.glass-value-mark`
1274
- checkpoint-dot layer [CORRECTION 2026-08-08: previously read `.glass-track-well`.
1275
- The register left `styles/glass/` for `styles/` and dropped the `glass-` prefix at
1276
- BK #86+#88 — it declares no material (0 `backdrop-filter`, 0 blur, 0 saturate), so
1277
- the prefix promised one it never had. The emitted class is `.track-well`.] — and each drives its OWN typed public property. There is no
1392
+ checkpoint-dot layer (the groove carries no `glass-` prefix because it declares no
1393
+ material) — and each drives its OWN typed public property. There is no
1278
1394
  shared inheriting background axis (a Slider `background` and a Progress `<color>`
1279
1395
  are different grammars and must not collide on one knob).
1280
1396
 
@@ -1284,21 +1400,17 @@ _CSS custom properties_
1284
1400
  | --- | --- |
1285
1401
  | removed at 8.0 | `--slider-track-bg`, `--progress-track` |
1286
1402
  | never published (candidate-only) | `--track-bg` |
1287
- | added at 8.0 | `--glass-slider-track-background` (CSS `background` grammar; falls back `--muted-medium`, spectrum `--secondary`), `--glass-progress-track-background` (CSS `background` grammar; falls back to the host-relative groove ground `--track-well-recess`) [CORRECTION 2026-08-08: the second entry previously read `--glass-progress-track-color` (CSS `<color>` only; falls back `--progress-track-on-glass`). That property DIED AT BIRTH at BK #88 — a `<color>`-only grammar enforced by a source grep that cannot see a consumer, shipped with 0 writers across 7 repos — and is replaced with NO alias by `--glass-progress-track-background`. `--progress-track-on-glass` retired with it.] |
1403
+ | added at 8.0 | `--glass-slider-track-background` (CSS `background` grammar; falls back `--muted-medium`, spectrum `--secondary`), `--glass-progress-track-background` (CSS `background` grammar; falls back to the host-relative groove ground `--track-well-recess`) |
1288
1404
  | retained | `--value-mark-position`, `--value-mark-size`, `--value-mark-color` |
1289
- [CORRECTION 2026-08-08: `--progress-track-on-glass` was listed as retained here; it
1290
- is REMOVED at 8.0 with the `<color>` grammar it backed. The groove ground is now the
1291
- one host-relative derivation `--track-well-recess`, declared on `.track-well` /
1292
- `.track-ground`.]
1405
+
1406
+ `--progress-track-on-glass` is removed at 8.0. The groove ground is the one
1407
+ host-relative derivation `--track-well-recess`, declared on `.track-well` /
1408
+ `.track-ground`.
1293
1409
 
1294
1410
  Old Slider writers (`--slider-track-bg: <background>`) move to
1295
1411
  `--glass-slider-track-background`. Old Progress writers (`--progress-track:
1296
1412
  <color>`) move to `--glass-progress-track-background`; any `background` value is
1297
- valid there. [CORRECTION 2026-08-08: previously named `--glass-progress-track-color`
1298
- and said "a gradient into the Progress property is invalid (color grammar only)".
1299
- Both are void — the `<color>`-only property never shipped a writer and was struck at
1300
- BK #88; its replacement takes the full `background` grammar, like its Slider
1301
- sibling.] Both properties inherit, so an ancestor
1413
+ valid there, gradients included, like its Slider sibling. Both properties inherit, so an ancestor
1302
1414
  may style a component population; Progress reads the property (it is never
1303
1415
  assigned on `.progress-rail`), so an inherited override reaches the rail.
1304
1416
 
@@ -1309,9 +1421,8 @@ _DOM classes (unsupported implementation hooks, listed for completeness)_
1309
1421
  | removed | `.slider-marks`, `.slider-mark`, `.progress-value-marks`, `.progress-value-mark` |
1310
1422
  | never emitted (candidate-only) | `.value-marks`, `.value-mark` |
1311
1423
  | added | `.track-well`, `.track-flow`, `.glass-value-marks`, `.glass-value-mark` |
1312
- [CORRECTION 2026-08-08: previously read `.glass-track-well`; the groove register
1313
- renamed to `.track-well` at BK #86+#88. `.track-flow` — the one indeterminate flow
1314
- band, composed by Progress and Timeline — is added at the same cut.]
1424
+
1425
+ `.track-flow` is the one indeterminate flow band, composed by Progress and Timeline.
1315
1426
 
1316
1427
  _Package export_
1317
1428
 
@@ -1319,10 +1430,7 @@ _Package export_
1319
1430
  generated `dist/component-styles.css` manifest, which folds the shared
1320
1431
  `track-well.css` + `track-flow.css` + `value-marks.css` structure before the raw
1321
1432
  SFC bundle so the emitted `.track-well`/`.track-flow`/`.glass-value-mark(s)`
1322
- classes have their rules on this entry. [CORRECTION 2026-08-08: previously named
1323
- the emitted classes `.glass-track-well`/`.glass-value-mark(s)` and folded two
1324
- partials; the groove renamed and `track-flow.css` joined the manifest at BK
1325
- #86+#88.] The canonical `@mkbabb/glass-ui/styles` (`dist/styles/index.css`) is
1433
+ classes have their rules on this entry. The canonical `@mkbabb/glass-ui/styles` (`dist/styles/index.css`) is
1326
1434
  unchanged and reaches the same partials through its own cascade — import exactly
1327
1435
  ONE style entry, never both.
1328
1436
 
@@ -1341,21 +1449,18 @@ no token-name change, only the removal of the device-conditional value.
1341
1449
  backdrop sample (the last published value) **multiplied by `--glass-level`**, so it
1342
1450
  flattens in lockstep with every other glass surface: `14px` at level 1, `4.2px` at level
1343
1451
  0.3 (`prefers-contrast: more`), `0px` at level 0 (`prefers-reduced-transparency` /
1344
- `forced-colors`). [2026-09-22 · register wave N-6 — `Drawer` folded WHOLE into `Sheet`
1345
- at `336dacf9` ("the detent is a size"), and the stage itself was deleted at `b155ca4c`
1346
- ("the stage deleted"), both inside this major: no component accepts `stage` at 8.0.0, so
1347
- this paragraph and the next record a scrim 8.0.0 does not ship.] The radius never reads
1452
+ `forced-colors`). Within this major `Drawer` folded whole into `Sheet` and the stage
1453
+ itself was deleted, so no component accepts `stage` at 8.0.0; this paragraph and the next
1454
+ describe a scrim 8.0.0 does not ship. The radius never reads
1348
1455
  the per-frame `--stage-t`, and it carries no saturation term — it is a scene-separation
1349
1456
  effect, not a glass surface recipe, and not the deep endpoint. (Interim development had
1350
1457
  repointed it onto the `16px` deep radius, bypassing the clarity axis; this restores the
1351
1458
  `14px × level` behavior.)
1352
1459
 
1353
1460
  **`CommandDialog` is not an immersive receiver.** It forwards `DialogProps`, never
1354
- `DialogContentProps`, so it cannot request the stage. ~~Only `Dialog` and `Drawer`
1355
- accept `stage="immersive"`.~~ [2026-09-22 · register wave N-6 — `Drawer` folded WHOLE
1356
- into `Sheet` at `336dacf9` (see the `./sheet` row under _Package subpaths_ under
1357
- §8.0.0), and neither `Dialog` nor `SheetContent` accepts `stage` at 8.0.0: the stage
1358
- went at `b155ca4c`.]
1461
+ `DialogContentProps`, so it cannot request the stage. Neither `Dialog` nor
1462
+ `SheetContent` accepts `stage` at 8.0.0 (see the `./sheet` row under _Package
1463
+ subpaths_ under §8.0.0).
1359
1464
 
1360
1465
  **Blur ontology, restated.** The glass material is three separate concepts: FIVE calm
1361
1466
  role recipes (`wash`/`quiet`/`resting`/`floating`/`overlay`) across THREE distinct
@@ -1515,7 +1620,7 @@ _Runtime + type exports on `./card`_
1515
1620
  | removed at 8.0 | `CardTier` (type), `CardVariant` (type), `CardMetal` (type), `CardAction` (component) |
1516
1621
  | retained | `Card`, `CardHeader`, `CardTitle`, `CardDescription`, `CardContent`, `CardFooter`, `CardProps`, `CardSize` |
1517
1622
 
1518
- `CardTier` was already folded onto the shared `surface` axis at 5.0.0 (§`BI.W-SURFACE-EXTRACT`
1623
+ `CardTier` was already folded onto the shared `surface` axis at 5.0.0 (_`CardTier` folds onto the `surface` axis_
1519
1624
  below) and survives as `SurfaceProps["tier"]` / `SurfaceTier` (`@mkbabb/glass-ui/axes`) — the
1520
1625
  `/card` re-export is what 8.0 drops. `CardVariant` dies with the `variant` prop: the trio it
1521
1626
  enumerated is the one `selected` boolean. `CardMetal` dies with `metal`: the three
@@ -1596,8 +1701,8 @@ replacements, without aliases or compatibility shims.
1596
1701
  `/instrument-chassis` subpath. It is no longer exported from the root.
1597
1702
 
1598
1703
  _`.paper-texture` is removed_
1599
- [2026-09-17 · O-20 B-3 — back-filled. The class left at `490cc46e`, which this cut
1600
- carries, and 6.0.0 is its last shipping version. It had no row until now.]
1704
+
1705
+ 6.0.0 is its last shipping version.
1601
1706
 
1602
1707
  There is no successor class: the two surviving `@utility paper-*` recipes are not
1603
1708
  drop-ins (`paper-grain-overlay` and `paper-underpaint` paint relief and tooth on an
@@ -1672,14 +1777,12 @@ subpath, with a successor or `none`:
1672
1777
  (`yieldToMain` / `useYieldToMain` take no options and expose no priority enum).
1673
1778
  - `/surface`: `surfaceClass` / `decorationClass` → none (the resolver is now the private
1674
1779
  `resolveSurfaceClass`; compose `<Surface>` and let it own the class).
1675
- - `/card`: `CardSurface` → `CardVariant` + the shared `Surface` axis (`/axes`) [2026-08-09 ·
1676
- 8.0.0 — **THE SUCCESSOR IS DEAD**: `CardVariant` is removed at 8.0 with the `variant` prop
1677
- it enumerated (§8.0.0 `./card` table). Coming from 6.x, go straight to the `surface` axis
1678
- and `selected`]; ~~`CardSpecular` → `SurfaceSpecular` (`/surface`; `<Card>` forwards
1679
- `specular` to `<Surface>`)~~ [2026-08-09 · 8.0.0 — **THE SUCCESSOR IS DEAD**:
1680
- `SurfaceSpecular` and the `specular` prop are both removed at 8.0, so this row's migration
1681
- target no longer exists. `CardSpecular` has no successor — write
1682
- `--glass-specular-intensity-rest` / `-hover` / `-active` on the element];
1780
+ - `/card`: `CardSurface` → `CardVariant` + the shared `Surface` axis (`/axes`).
1781
+ `CardVariant` is itself removed at 8.0 with the `variant` prop it enumerated (§8.0.0
1782
+ `./card` table), so coming from 6.x, go straight to the `surface` axis and `selected`.
1783
+ `CardSpecular` has no successor (`SurfaceSpecular` and the `specular` prop are both
1784
+ removed at 8.0): write `--glass-specular-intensity-rest` / `-hover` / `-active` on the
1785
+ element;
1683
1786
  `ScrollCardProps` / `ScrollCardHeaderProps` (+ the `ScrollCard` / `ScrollCardHeader`
1684
1787
  components) → the `ScrollCard` family is retired; compose `Card` inside a scroll container.
1685
1788
  - `/command`: `MenuItemVariants` → none (the menu-row treatment is applied internally).
@@ -1707,7 +1810,7 @@ dedicated per-prop row in the §7.0.0 table above — `avatarVariants` / `Avatar
1707
1810
  goo/metaball facilities (`useGooMorph`, `GooBarbellRefs`, `UseGooMorphParams`, `UseGooMorphReturn`,
1708
1811
  `MORPH_SIGNATURES`, `MorphSignature`, `MorphSignatureName`, `MorphVector`, `GooFilter`,
1709
1812
  `useMetaballRenderer`, `UseMetaballRendererOptions` — all shipping through v6.0.0, removed at 7.0.0);
1710
- (b) the `## 5.0.0` `/api` per-symbol census, which marks each `/api` member with its removal version;
1813
+ (b) the `## 5.0.0` `/api` per-symbol table, which marks each `/api` member with its removal version;
1711
1814
  and (c) one family excluded here because its own mechanism section documents it — the ~67
1712
1815
  `/motion` keyframes re-exports (`Easing`, `TimingFunction`, …; see the Motion-ownership paragraph
1713
1816
  above). Whole-key drops are the export-map delta, not member removals.
@@ -1729,8 +1832,7 @@ pole is force-pinned). Additive — not a break; no alias, no shim. `alwaysExpan
1729
1832
  contract introduced in 5.0. It is persistent-only: the action row renders expanded and operable
1730
1833
  from first paint, with no disclosure mode, anchor button, or reveal gesture. DOM/action order is
1731
1834
  stable across placements; only visual direction changes, and the action row flows in RTL while
1732
- the band keeps its physical corner. (See `docs/consumer-evidence/header-ribbon.md` for the
1733
- collapsible-cut census.)
1835
+ the band keeps its physical corner.
1734
1836
 
1735
1837
  Wide stage/inspector composition uses `proportion="golden|preview-dominant"`; an
1736
1838
  absent inspector leaves stage at 100%. Boundaries and reserve default to none.
@@ -1761,20 +1863,11 @@ pointer, keyboard, disabled, and re-entry lifecycle.
1761
1863
  The 7.0 package line declares `@mkbabb/value.js@^4.0.0` as an OPTIONAL peer — required
1762
1864
  for the `/color` and `/css` consumers, absent otherwise — alongside optional
1763
1865
  `@mkbabb/pencil-boil@^0.9.2`; its Keyframes range is finalized from the immutable
1764
- packed compatibility check. [2026-09-17 · O-20 CLOSE-DOCS · true of the 7.0 package line
1765
- (`git show v7.0.0:package.json` carries `@mkbabb/pencil-boil: ^0.9.2`, optional) and left
1766
- standing as that cut's record — but it is NOT an install instruction at 9.0.0:
1767
- `@mkbabb/pencil-boil` is not a peer of any kind there (retired at BK #51),
1768
- `peerDependencies` declares nine names — `@lucide/vue` · `@mkbabb/keyframes.js` ·
1769
- `@mkbabb/value.js` · `@vueuse/core` · `reka-ui` · `tailwindcss` · `tw-animate-css` ·
1770
- `vue` · `vue-component-type-helpers` — and none of them is it. HandMark needs no
1771
- install.] Glass imports only Value's `/color`, `/css`, and
1866
+ packed compatibility check. That describes 7.0 only: from 9.0.0 `@mkbabb/pencil-boil` is
1867
+ not a peer of any kind, and HandMark needs no install. Glass imports only Value's `/color`, `/css`, and
1772
1868
  `/easing` capabilities; the removed Value root has no compatibility external.
1773
- `perfect-freehand` is no longer a peer because its stroke core is vendored in
1774
- HandMark. [2026-09-17 · O-20 CLOSE-DOCS · the not-a-peer half still holds; the vendored
1775
- core does not — `src/components/handmark/freehand.ts` was deleted at `5a69ed9f`
1776
- (2026-08-25) and is absent from the 9.0.0 tree. HandMark inks its own ribbon from
1777
- `handmark/stroke.ts`; `src/` and `demo/` import `perfect-freehand` zero times.] The
1869
+ `perfect-freehand` is no longer a peer; from 9.0.0 HandMark inks its own ribbon and
1870
+ carries no copy of it either. The
1778
1871
  obsolete shadcn generator metadata is removed.
1779
1872
 
1780
1873
  `EasingPicker` now uses the canonical CSS jump terms `jump-start`, `jump-end`,
@@ -1790,7 +1883,7 @@ Import `@mkbabb/glass-ui/styles/theme` to register the package's Tailwind v4
1790
1883
  entry is a registration bridge over the owning token variables, not a standalone
1791
1884
  resolved base-token stylesheet.
1792
1885
 
1793
- The glass blur ladder is recalibrated ~15% subtler across the complete census:
1886
+ The glass blur ladder is recalibrated ~15% subtler on every rung:
1794
1887
  quiet/resting `8→7`, floating/overlay `13→11`, the high-DPI (2dppx) overlay
1795
1888
  restore `20→17`, the native `::backdrop` scrim `8→7`, the immersive stage scrim
1796
1889
  `16→14`, and the side-sheet graded field `40→34`. No API or token-name change —
@@ -1807,7 +1900,7 @@ in every shipped config and repaints nothing; a consumer that re-pins
1807
1900
 
1808
1901
  ## 6.0.0
1809
1902
 
1810
- The BI cut removes public wrappers and aliases whose lifecycle belongs to their parent,
1903
+ 6.0.0 removes public wrappers and aliases whose lifecycle belongs to their parent,
1811
1904
  and adds explicit interaction and renderer-status seams. `CompletionSeal`, `Deck`, `Dock`,
1812
1905
  and `HandMark` remain public. The package export-map delta is exactly the removal of
1813
1906
  `./stacked-icons`; all other 5.0.0 export keys, including `./scroll-progress-rim`, remain.
@@ -1823,17 +1916,17 @@ and `HandMark` remain public. The package export-map delta is exactly the remova
1823
1916
  | `DataTablePagination` | Use `DataTable`'s controlled `page`, `pageSize`, `total`, and `pagination` surface. |
1824
1917
  | `DrawerOverlay`, `DrawerPortal` | Use `DrawerContent`; it owns one overlay and portal boundary. |
1825
1918
  | `DropdownMenuPortal` | Use `DropdownMenuContent`; it owns the portal boundary. |
1826
- | `ProgressDefault`, `ProgressGradient`, `ProgressLiquid` | Use `<Progress variant="default\|liquid">`. [CORRECTION 2026-08-08: previously offered `variant="default|gradient|liquid"`. The `gradient` variant is DELETED at 8.0 with its three `--motion-duration-progress-*` tokens and its `@property --progress-crescendo` — its crescendo reached 95-100% white. Completion is now variant-independent and capped at the 0.12 specular ceiling.] |
1919
+ | `ProgressDefault`, `ProgressGradient`, `ProgressLiquid` | Use `<Progress variant="default\|liquid">`. The `gradient` variant is deleted at 8.0 with its three `--motion-duration-progress-*` tokens and its `@property --progress-crescendo`. |
1827
1920
  | `ProgressSectioned`, `useProgressGeometry`, `ProgressSegment`, `SectionedCell`, or `<Progress variant="sectioned">` | Use numeric `marks` on continuous Progress for reference checkpoints; own colored lifecycle phases in the product composition. |
1828
1921
  | `SelectScrollUpButton`, `SelectScrollDownButton` | Use `SelectContent`; overflow controls are internal. |
1829
1922
  | `ConstellationExpose.backend()` | Read the exposed `rendererStatus` ref or `@renderer-status`; Constellation now reports `engine: "canvas2d"`. |
1830
1923
  | `parseColorRGBA` from `/constellation` | Resolve paint in the consumer or use the component's palette input; the renderer-local parser is no longer public. |
1831
1924
  | `<Blob @click>` relying on the implicit hit layer | Add `press-label="…"` to opt into the SDF-shaped native button. Omit it for a decorative, listener-free Blob; use `disabled` to disable the button. |
1832
1925
  | `installDeckSpring`, `deckEase`, `DECK_SPRING` | Keep `useDeck` for deck state/navigation and own presentation motion at the presentation boundary. |
1833
- | `useGooMorph`, `MORPH_SIGNATURES`, `GooFilter` | At 6.0.0 these goo/metaball facilities still ship and still work — no change is required at this cut. They fold out of the public surface at 7.0.0; keep application motion at its owning presentation boundary and migrate then, see `## 7.0.0`. [CORRECTION 2026-07-17: previously read "These showcase-only goo facilities are private to the Deck story; keep application motion at its owning presentation boundary." asserting a 6.0.0 break — `useGooMorph` (+ `GooBarbellRefs` / `UseGooMorphParams` / `UseGooMorphReturn`) and `MORPH_SIGNATURES` (+ `MorphSignature` / `MorphSignatureName` / `MorphVector`) ship through v6.0.0 on the root barrel and `@mkbabb/glass-ui/motion-core`, `GooFilter` on `@mkbabb/glass-ui/dock`, and `useMetaballRenderer` / `UseMetaballRendererOptions` on `@mkbabb/glass-ui/blob` (verified at the `v6.0.0` tag); all are removed only at 7.0.0. The v5→v6 export diff is exactly one key removal (`./stacked-icons`). The per-symbol removal now lives in the §7.0.0 table.] |
1926
+ | `useGooMorph`, `MORPH_SIGNATURES`, `GooFilter` | At 6.0.0 these goo/metaball facilities still ship and still work — no change is required at this cut. They fold out of the public surface at 7.0.0; keep application motion at its owning presentation boundary and migrate then, see `## 7.0.0`. |
1834
1927
  | `<TypewriterText interactive>` / `backspaceToPosition()` | Remove the hidden per-glyph action; render a named native button for an editing command. |
1835
- | `IconChip` / `@mkbabb/glass-ui/icon-chip` | At 6.0.0 `./icon-chip` still ships and still works — no change is required at this cut. `IconChip` folds onto `<Chip shape="icon">` (or a bare glyph) at 7.0.0 — migrate then, see `## 7.0.0`. [CORRECTION 2026-07-17: previously read "Use `<Chip shape="icon">` with a slotted glyph … The old icon, section, glyph-size, stroke, bare, duotone, bloom, saturated, glass, and reveal axes are deleted" asserting a 6.0.0 break — `./icon-chip` ships through v6.0.0 (verified: the `v6.0.0` tag `exports` carries `./icon-chip`) and is removed only at 7.0.0; the 6→7 diff drops `./icon-chip` and adds `./metric`. The per-component guidance now lives in the §7.0.0 table.] |
1836
- | `MetricBadge`, `/metric-badge`, `/metric-cell`, `/metric-stack` | At 6.0.0 these three subpaths still ship and still work — no change is required at this cut. The consolidation into one `/metric` subpath (`Metric`, `MetricCell`, `MetricRow`, `MetricStack`; keep phase, aura, protagonist, result animation, and fixed-row layout in the product composition) happens at 7.0.0 — migrate then, see `## 7.0.0`. [CORRECTION 2026-07-17: previously read "Import `Metric`, `MetricCell`, `MetricRow`, and `MetricStack` from `/metric`" — `./metric` does not exist until 7.0.0.] |
1928
+ | `IconChip` / `@mkbabb/glass-ui/icon-chip` | At 6.0.0 `./icon-chip` still ships and still works — no change is required at this cut. `IconChip` folds onto `<Chip shape="icon">` (or a bare glyph) at 7.0.0 — migrate then, see `## 7.0.0`. |
1929
+ | `MetricBadge`, `/metric-badge`, `/metric-cell`, `/metric-stack` | At 6.0.0 these three subpaths still ship and still work — no change is required at this cut. The consolidation into one `/metric` subpath (`Metric`, `MetricCell`, `MetricRow`, `MetricStack`; keep phase, aura, protagonist, result animation, and fixed-row layout in the product composition) happens at 7.0.0 — migrate then, see `## 7.0.0`. |
1837
1930
  | `InkMark` | Rename to `HandMark` from `@mkbabb/glass-ui/handmark`. |
1838
1931
  | `StackedIconGroup` / `@mkbabb/glass-ui/stacked-icons` | Render ordinary owner-local DOM with explicit names, overflow, and detail controls. |
1839
1932
 
@@ -1866,38 +1959,32 @@ and `HandMark` remain public. The package export-map delta is exactly the remova
1866
1959
  release build pin `0.9.2`; `catmullRomToBezier`, `ellipsePoints`, `perturbPoints`,
1867
1960
  `perturbPointsClosed`, `pointsToLinear`, `wobbleLinePoints`, and `useLineBoil` are the
1868
1961
  exercised producer surface. Pencil 0.9.2 declares Node 24/npm 11; the optional peer may
1869
- be omitted by Glass consumers that do not use HandMark.~~ [2026-09-17 · O-20 HK-vite ·
1870
- `@mkbabb/pencil-boil` is no longer a peer of any kind — it was retired at BK #51 and
1871
- `peerDependencies` at 9.0.0 declares nine names, none of them it. `src/` and `demo/`
1872
- import it zero times. **HandMark needs no install**: `/handmark` is self-contained.]
1962
+ be omitted by Glass consumers that do not use HandMark.~~ From 9.0.0
1963
+ `@mkbabb/pencil-boil` is no longer a peer of any kind. **HandMark needs no install**:
1964
+ `/handmark` is self-contained.
1873
1965
 
1874
1966
  ## 5.0.0
1875
1967
 
1876
- The 5.0.0 cut is the joint BG/BH release: the BG visual-convergence band (the warm /
1877
- weighty / liquid iOS-27 redesign) lands alongside the BH structural reshape. **The 5.0.0
1878
- cut dropped 20 export keys** — the `./api` discovery-subpath fold plus 19 component and
1968
+ 5.0.0 joins a visual redesign (the warm, weighty, liquid look) with a structural
1969
+ reshape of the package. **5.0.0 dropped 20 export keys** — the `./api` discovery-subpath fold plus 19 component and
1879
1970
  style subpaths. The authoritative enumeration is the 20-key removed-key table in
1880
1971
  `CHANGELOG.md` `## 5.0.0` (`### Breaking`); the per-key migration for each dropped subpath
1881
1972
  lives in this section's own subsections below. The `./api` fold is the largest single piece:
1882
1973
  its 203 canonical symbols re-home onto their owning published subpath or retire with their
1883
- subpath (the per-symbol census below is authoritative and complete).
1884
- [CORRECTION 2026-07-17: previously read "the whole consumer break is ONE dropped export key
1885
- — `./api` — plus its 199-symbol re-home ... every other published key is preserved".]
1974
+ subpath (the per-symbol table below is complete).
1886
1975
  Beyond the dropped keys, the remaining rows are a token rename (`--ring` →
1887
1976
  `--focus-ring-color`), one component/subpath rename (`goo-blob` → `blob`), and the
1888
1977
  source-only `src/subpaths/` deletion + curated flat-barrel relocations (no export break).
1889
- The BG visual band is a paint upgrade — no public-prop break beyond the rows below.
1978
+ The visual redesign is a paint upgrade — no public-prop break beyond the rows below.
1890
1979
 
1891
- ### The `/api` discovery-subpath fold — the 203-symbol census
1980
+ ### The `/api` discovery-subpath fold — all 203 symbols
1892
1981
 
1893
1982
  `@mkbabb/glass-ui/api` (the pure types + constants discovery layer) is FOLD-DELETED — one
1894
- of the 20 keys the 5.0.0 cut dropped (the removed-key table in `CHANGELOG.md` `## 5.0.0`).
1895
- [CORRECTION 2026-07-17: previously read "The `./api` key is the ONLY dropped key. 185 of its
1896
- symbols re-home".] Its 203 canonical symbols (the v4.2.0 `/api` export set) resolve as
1897
- follows: 141 re-home onto their OWNING published subpath and are still exported there on the
1898
- current branch — a consumer swaps the import PATH with zero symbol loss; the other 62 were
1983
+ of the 20 keys 5.0.0 dropped (the removed-key table in `CHANGELOG.md` `## 5.0.0`). Its 203 canonical symbols (the v4.2.0 `/api` export set) resolve as
1984
+ follows: 141 re-home onto their OWNING published subpath and were still exported there at
1985
+ 7.0.0 — a consumer swaps the import PATH with zero symbol loss; the other 62 were
1899
1986
  retired or renamed across 5.0.0, 6.0.0, and 7.0.0 and have no surviving import under their
1900
- old name (the census table below gives each one's branch home or removal version):
1987
+ old name (the table below gives each one's home or removal version):
1901
1988
 
1902
1989
  ```ts
1903
1990
  // 5.0.0 — the /api discovery layer is gone; import each symbol from its owning subpath
@@ -1906,7 +1993,7 @@ old name (the census table below gives each one's branch home or removal version
1906
1993
  + import type { BadgeVariants } from "@mkbabb/glass-ui/badge";
1907
1994
  ```
1908
1995
 
1909
- Of the 203 symbols, 141 remain exported on a current-branch public subpath (the fold is a
1996
+ Of the 203 symbols, 141 remained exported on a public subpath at 7.0.0 (the fold is a
1910
1997
  pure import-path swap — the owning subpath needs no new export for a surviving symbol) and 62
1911
1998
  were retired or renamed since: 31 at 5.0.0 (the deleted viz types, the `/virtual` and
1912
1999
  `/border-progress` types with no owning subpath, the `glass-panel` / `sheet` / `toggle-chip`
@@ -1917,51 +2004,28 @@ and the `Countup` return-alias), and 29 at 7.0.0 (the metric-badge / icon-chip /
1917
2004
  spa-view / motion-curves consolidations, `PagerWindow`, plus the member-level CVA removals —
1918
2005
  `AvatarVariants`, `ToggleVariants`, `SliderVariants`, `ButtonVariants`, and `MenuItemVariants`;
1919
2006
  see `## 7.0.0`).
1920
- [CORRECTION 2026-07-17: previously read "3 at 6.0.0 (`StackedIconGroupProps`, the `Countup`
1921
- return-alias, `PagerWindow`), and 28 at 7.0.0" — `PagerWindow` (and its `pagerWindow` value)
1922
- is exported by the `v6.0.0` `/pager-dots` and `/deck` barrels and dropped only on the branch,
1923
- so it is a 7.0.0 removal; the 5.0.0/6.0.0/7.0.0 split is 31 / 2 / 29.]
1924
2007
  The retired viz, `/virtual`, and `/border-progress` families are detailed in their own
1925
2008
  subsections below.
1926
2009
 
1927
2010
  The surface-axis grammar types (`Surface` / `SurfaceTier`) publish via the dedicated `/axes`
1928
- grammar subpath (BH.W-AXIS-GRAMMAR — the honest `/api` successor), and both are still exported
1929
- there on the branch. The `components/_shared` `ControlSize` convenience union re-homes to
1930
- `/forms` and is still exported there. [2026-09-22 · O-23 L-5 — `./forms` split at
1931
- `a8a6f66b` (8.0.0); `ControlSize` is exported from `/input`, and the census row says so.]
2011
+ grammar subpath (the `/api` successor for those types), and both are still exported
2012
+ there. The `components/_shared` `ControlSize` convenience union re-homed to `/forms` at
2013
+ 5.0.0; `./forms` split at 8.0.0, and `ControlSize` is exported from `/input`.
1932
2014
  Of the three root-barrel `*Variants` types, only
1933
2015
  `AlertVariants` still resolves off the root `@mkbabb/glass-ui` barrel — `AvatarVariants` and
1934
- `ToggleVariants` were removed at 7.0.0 (the census marks each). value.js's consumed specifiers
2016
+ `ToggleVariants` were removed at 7.0.0 (the table marks each). value.js's consumed specifiers
1935
2017
  ride the per-family subpaths named in the table below, so the compound-import unbuildable class
1936
2018
  cannot recur.
1937
- [CORRECTION 2026-07-17: previously read "183 of the 185 re-homed symbols were ALREADY
1938
- exported ... The `/api` layer carried 199 symbols at the fold ... Of those, 185 re-home"; the
1939
- scripted v4.2.0→branch census computes 203 total, 141 live, 62 retired/renamed.]
1940
-
1941
- The full 203-symbol `/api` census (grouped alphabetically by symbol; `kind` is the TS export
1942
- kind; the last column is the symbol's verified home on the current branch, or its removal
1943
- version):
1944
- [CORRECTION 2026-07-17: previously labeled "The full 199-symbol map ... `new import (owning
1945
- subpath)` is the 5.0.0 target".]
1946
- [2026-09-22 · O-23 L-5 — "current branch" is the branch at 2026-07-17. A sweep of every
1947
- subpath-homed row against the 8.0.0, 9.0.0 and 10.0.0 export maps, and of each live
1948
- subpath's declared exports, found twenty rows whose name had since left — twelve at
1949
- 8.0.0 (`4bf53962` retired four subpaths, `bda718ac` deleted the composables behind these
1950
- rows (see _Six composables leave `./motion`, `./motion-core` and the root barrel_ under
1951
- 8.0.0)) and eight at 9.0.0 (`5a69ed9f`, the handmark barrel) — and `ControlSize`, which
1952
- changed door at 8.0.0. Those 21 rows carry their removal version and commit now; the
1953
- root-homed rows were not re-swept. A second sweep of every removal row's named successor
1954
- against the 10.0.0 export map and the `dist/` types found nine rows pointing at a
1955
- successor that has itself left (`CardSurface`, `Countup`, `GlassPanelVariant`,
1956
- `HeaderRibbonPosition`, `InstrumentChassisPhase`, `PagerWindow`, `PaperGridConfig`,
1957
- `PaperGridHandle`, `UsePaperGridOptions`); each now names the successor's own removal,
1958
- measured.]
1959
-
1960
- | symbol | kind | branch home (verified) — or removal version |
2019
+
2020
+ The full 203-symbol `/api` table (grouped alphabetically by symbol; `kind` is the TS export
2021
+ kind; the last column is the symbol's home at 7.0.0, or its removal version). Rows whose
2022
+ name or named successor has left since carry that removal too:
2023
+
2024
+ | symbol | kind | home — or removal version |
1961
2025
  |---|---|---|
1962
2026
  | `AlertVariants` | type | `@mkbabb/glass-ui` (root) |
1963
- | `AnimatedDigitMode` | type | ~~`/animated-digit`~~ removed 8.0.0 — `./animated-digit` retired at `4bf53962`; no successor (see _Deleted — `AnimatedDigit`_ under 8.0.0) [2026-09-22 · O-23 L-5] |
1964
- | `AnimatedDigitProps` | type | ~~`/animated-digit`~~ removed 8.0.0 — `./animated-digit` retired at `4bf53962`; no successor (see _Deleted — `AnimatedDigit`_ under 8.0.0) [2026-09-22 · O-23 L-5] |
2027
+ | `AnimatedDigitMode` | type | ~~`/animated-digit`~~ removed 8.0.0 — `./animated-digit` retired; no successor (see _Deleted — `AnimatedDigit`_ under 8.0.0) |
2028
+ | `AnimatedDigitProps` | type | ~~`/animated-digit`~~ removed 8.0.0 — `./animated-digit` retired; no successor (see _Deleted — `AnimatedDigit`_ under 8.0.0) |
1965
2029
  | `AuroraAtoms` | type | `/aurora` |
1966
2030
  | `AuroraConfig` | type | `/aurora` |
1967
2031
  | `AuroraCursorApi` | type | `/aurora` |
@@ -1982,29 +2046,29 @@ measured.]
1982
2046
  | `AvatarVariants` | type | removed 7.0.0 — use `Avatar` typed `size`/`shape` props + `AvatarSize`/`AvatarShape` (root) |
1983
2047
  | `BadgeVariants` | type | `/badge` |
1984
2048
  | `BezierPoints` | type | `/easing` |
1985
- | `BlendMode` | type | ~~`/handmark`~~ removed 9.0.0 — `5a69ed9f`; no successor (see _Eight `./handmark` types leave with the barrel's reshape_ under 9.0.0) [2026-09-22 · O-23 L-5] |
1986
- | `BloomUpPreset` | type | ~~`/motion`~~ removed 8.0.0 — `useBloomUp` deleted at `bda718ac`; no successor [2026-09-22 · O-23 L-5] |
2049
+ | `BlendMode` | type | ~~`/handmark`~~ removed 9.0.0 — no successor (see _Eight `./handmark` types leave with the barrel's reshape_ under 9.0.0) |
2050
+ | `BloomUpPreset` | type | ~~`/motion`~~ removed 8.0.0 — `useBloomUp` deleted; no successor |
1987
2051
  | `BorderProgressCoverage` | type | removed 5.0.0 — /border-progress retired; the masked band is `ScrollProgressRim` (/scroll-progress-rim) |
1988
2052
  | `BorderProgressMilestone` | type | removed 5.0.0 — /border-progress retired; see `ScrollProgressRim` (/scroll-progress-rim) |
1989
2053
  | `BorderProgressMilestoneEvent` | type | removed 5.0.0 — /border-progress retired; see `ScrollProgressRim` (/scroll-progress-rim) |
1990
2054
  | `BorderProgressProps` | type | removed 5.0.0 — /border-progress retired; see `ScrollProgressRim` (/scroll-progress-rim) |
1991
- | `Brush` | type | ~~`/handmark`~~ removed 9.0.0 — `5a69ed9f`; no successor (see _Eight `./handmark` types leave with the barrel's reshape_ under 9.0.0) [2026-09-22 · O-23 L-5] |
1992
- | `BrushName` | type | ~~`/handmark`~~ removed 9.0.0 — `5a69ed9f`; no successor (see _Eight `./handmark` types leave with the barrel's reshape_ under 9.0.0) [2026-09-22 · O-23 L-5] |
2055
+ | `Brush` | type | ~~`/handmark`~~ removed 9.0.0 — no successor (see _Eight `./handmark` types leave with the barrel's reshape_ under 9.0.0) |
2056
+ | `BrushName` | type | ~~`/handmark`~~ removed 9.0.0 — no successor (see _Eight `./handmark` types leave with the barrel's reshape_ under 9.0.0) |
1993
2057
  | `ButtonVariants` | type | removed 7.0.0 — use `ButtonProps` / `ButtonEmphasis` / `ButtonSize` (/button) |
1994
- | `Canvas2DFrame` | type | ~~`/canvas`~~ root barrel [2026-08-10 · BK #21 — `./canvas` cut; the name never moved] |
1995
- | `Canvas2DHandle` | type | ~~`/canvas`~~ root barrel [2026-08-10 · BK #21] |
1996
- | `Canvas2DOptions` | type | ~~`/canvas`~~ root barrel [2026-08-10 · BK #21] |
1997
- | `Canvas2DSuspendReason` | type | ~~`/canvas`~~ root barrel [2026-08-10 · BK #21] |
2058
+ | `Canvas2DFrame` | type | ~~`/canvas`~~ root barrel (`./canvas` removed at 9.0.0; the name never moved) |
2059
+ | `Canvas2DHandle` | type | ~~`/canvas`~~ root barrel |
2060
+ | `Canvas2DOptions` | type | ~~`/canvas`~~ root barrel |
2061
+ | `Canvas2DSuspendReason` | type | ~~`/canvas`~~ root barrel |
1998
2062
  | `CardMetal` | type | removed 8.0.0 — the `metal` prop dies; the three `metal-{gold,silver,bronze}-border` utilities survive class-borne and a class name needs no union |
1999
- | `CardSurface` | type | removed 7.0.0 — Card decoration folds onto `CardVariant` (/card) + the `Surface` axis (/axes) [2026-09-22 · O-23 L-5 — `CardVariant` itself left at 8.0.0 (`4a04b43c`; see _Props — `<Card>`_ under 8.0.0); the `Surface` axis (/axes) stands] |
2063
+ | `CardSurface` | type | removed 7.0.0 — Card decoration folds onto `CardVariant` (/card) + the `Surface` axis (/axes) (`CardVariant` itself left at 8.0.0 (see _Props — `<Card>`_ under 8.0.0); the `Surface` axis (/axes) stands) |
2000
2064
  | `CardTier` | type | removed 8.0.0 from `/card` — already folded onto the shared `surface` axis at 5.0.0; use `SurfaceProps["tier"]` / `SurfaceTier` (/axes) |
2001
2065
  | `CardVariant` | type | removed 8.0.0 — the `variant` trio is the one `selected` boolean (presence, not truth) |
2002
2066
  | `CelebrationBurstPreset` | type | removed 5.0.0 — dead-composable sweep; `useCelebrationBurst` retired (0 consumers) |
2003
2067
  | `ClickDelegateOptions` | type | `/sidebar` |
2004
- | `ColorHarmony` | type | `/color` [2026-09-17 · O-20 CUT-4/5 — the census never listed it. It ships on `./color` at 9.0.0 (`deriveHue`'s second argument, and `DeriveBlobPaletteOptions.harmony`) and nothing is ruled against it.] |
2005
- | `ColorResolver` | type | `/color` [2026-09-17 · O-20 CUT-4/5 — the census never listed it. Ships on `./color` at 9.0.0 and is live; the O-20 disposition ruled it and `defaultBlobColorResolver` CURE-NEXT-MAJOR, which is a ruling and not an execution, so nothing has moved yet.] [2026-09-22 · register wave 10-3 — it moved: deleted at 10.0.0 with `defaultBlobColorResolver`; see _Two names leave `./color`_ under 10.0.0.] |
2006
- | `CompletionSealProps` | type | ~~`/completion-seal`~~ removed 8.0.0 — `./completion-seal` retired at `4bf53962`; no successor (see _Deleted — `CompletionSeal`_ under 8.0.0) [2026-09-22 · O-23 L-5] |
2007
- | `CompletionSealShape` | type | ~~`/completion-seal`~~ removed 8.0.0 — `./completion-seal` retired at `4bf53962`; no successor (see _Deleted — `CompletionSeal`_ under 8.0.0) [2026-09-22 · O-23 L-5] |
2068
+ | `ColorHarmony` | type | `/color` (`deriveHue`'s second argument, and `DeriveBlobPaletteOptions.harmony`) |
2069
+ | `ColorResolver` | type | ~~`/color`~~ removed 10.0.0 with `defaultBlobColorResolver` (see _Two names leave `./color`_ under 10.0.0) |
2070
+ | `CompletionSealProps` | type | ~~`/completion-seal`~~ removed 8.0.0 — `./completion-seal` retired; no successor (see _Deleted — `CompletionSeal`_ under 8.0.0) |
2071
+ | `CompletionSealShape` | type | ~~`/completion-seal`~~ removed 8.0.0 — `./completion-seal` retired; no successor (see _Deleted — `CompletionSeal`_ under 8.0.0) |
2008
2072
  | `ConcentricConfig` | type | removed 5.0.0 — /concentric viz DELETED (viz-family prune) |
2009
2073
  | `ConcentricHandle` | type | removed 5.0.0 — /concentric viz DELETED |
2010
2074
  | `ConfiguratorCloneMode` | type | `/configurator` |
@@ -2015,8 +2079,8 @@ measured.]
2015
2079
  | `ConstellationField` | type | `/constellation` |
2016
2080
  | `ConstellationProps` | type | `/constellation` |
2017
2081
  | `ConstellationWarp` | type | `/constellation` |
2018
- | `ControlSize` | type | ~~`/forms`~~ `/input` [2026-09-22 · O-23 L-5 — `./forms` split at `a8a6f66b` (8.0.0); see _Package subpaths_ under 8.0.0] |
2019
- | `Countup` | type | removed 6.0.0 — the return-type alias dropped; use `UseCountupReturn` (/motion) [2026-09-22 · O-23 L-5 — `UseCountupReturn` itself left at 8.0.0 (`bda718ac`; see _Six composables leave `./motion`, `./motion-core` and the root barrel_ under 8.0.0); the number tween is `useAnimatedNumber` (/motion)] |
2082
+ | `ControlSize` | type | ~~`/forms`~~ `/input` (`./forms` split at 8.0.0; see _Package subpaths_ under 8.0.0) |
2083
+ | `Countup` | type | removed 6.0.0 — the return-type alias dropped; use `UseCountupReturn` (/motion) (`UseCountupReturn` itself left at 8.0.0 (see _Six composables leave `./motion`, `./motion-core` and the root barrel_ under 8.0.0); the number tween is `useAnimatedNumber` (/motion)) |
2020
2084
  | `CurveFn` | type | removed 7.0.0 — /motion-curves retired; import easing math from `@mkbabb/value.js/easing` |
2021
2085
  | `DarkFlipSettledCallback` | type | `/dark` |
2022
2086
  | `DarkModeSyncScriptOptions` | type | `/dark` |
@@ -2024,7 +2088,7 @@ measured.]
2024
2088
  | `DeckMoves` | type | `/deck` |
2025
2089
  | `DEFAULT_AURORA_CONFIG` | const | `/aurora` |
2026
2090
  | `DeriveAuroraOptions` | type | `/aurora` |
2027
- | `DeriveBlobPaletteOptions` | type | `/color` [2026-09-17 · O-20 CUT-4/5 — the census never listed it. Ships on `./color` at 9.0.0 and is NOT ruled for removal; it is the options bag of `deriveBlobPalette`, which stays.] |
2091
+ | `DeriveBlobPaletteOptions` | type | `/color` (the options bag of `deriveBlobPalette`) |
2028
2092
  | `DeriveEasing` | type | `/aurora` |
2029
2093
  | `DockCtaReceivePreset` | type | `/motion` |
2030
2094
  | `DotFlowFieldHandle` | type | removed 5.0.0 — /dot-flow-field viz DELETED |
@@ -2039,35 +2103,35 @@ measured.]
2039
2103
  | `FlowPattern` | type | `/aurora` |
2040
2104
  | `ForcedSectionWindowRange` | type | removed 5.0.0 — /virtual subpath retired; no owning subpath |
2041
2105
  | `FourierFieldConfig` | type | `/fourier-field` |
2042
- | `FourierFieldProps` | type | ~~`/fourier-field`~~ [2026-09-17 · O-20 CUT-4/5 — 0 hits in the 9.0.0 dist; the name was never exported from anywhere. The row was wrong when it was written, not overtaken.] |
2043
- | `FuzzySearchState` | type | ~~`/search`~~ removed 9.0.0 [2026-08-29 · BK #42 — `./search` cut whole; the engine interned, nothing republished] |
2106
+ | `FourierFieldProps` | type | ~~`/fourier-field`~~ never exported from anywhere; this row was wrong when it was written |
2107
+ | `FuzzySearchState` | type | ~~`/search`~~ removed 9.0.0 (the whole `./search` subpath left; nothing replaced it) |
2044
2108
  | `GlassPanelProps` | type | removed 5.0.0 — /glass-panel retired; compose `Card` / `Surface` / `.glass-resting` |
2045
- | `GlassPanelVariant` | type | removed 5.0.0 — /glass-panel retired; the tier-homonym; use `CardTier` (/card) or `SurfaceTier` (/axes) [2026-09-22 · O-23 L-5 — `CardTier` itself left at 8.0.0 (`4a04b43c`; see _Props — `<Card>`_ under 8.0.0); `SurfaceTier` (/axes) stands] |
2046
- | `HandAnimation` | type | ~~`/handmark`~~ removed 9.0.0 — `5a69ed9f`; no successor (see _Eight `./handmark` types leave with the barrel's reshape_ under 9.0.0) [2026-09-22 · O-23 L-5] |
2047
- | `HandMarkProps` | type | ~~`/handmark`~~ removed 9.0.0 — `5a69ed9f`; no successor (see _Eight `./handmark` types leave with the barrel's reshape_ under 9.0.0) [2026-09-22 · O-23 L-5] |
2109
+ | `GlassPanelVariant` | type | removed 5.0.0 — /glass-panel retired; the tier-homonym; use `CardTier` (/card) or `SurfaceTier` (/axes) (`CardTier` itself left at 8.0.0 (see _Props — `<Card>`_ under 8.0.0); `SurfaceTier` (/axes) stands) |
2110
+ | `HandAnimation` | type | ~~`/handmark`~~ removed 9.0.0 — no successor (see _Eight `./handmark` types leave with the barrel's reshape_ under 9.0.0) |
2111
+ | `HandMarkProps` | type | ~~`/handmark`~~ removed 9.0.0 — no successor (see _Eight `./handmark` types leave with the barrel's reshape_ under 9.0.0) |
2048
2112
  | `HandShape` | type | `/handmark` |
2049
2113
  | `HapticPattern` | type | removed 5.0.0 — dead-composable sweep; `useHaptic` retired |
2050
- | `HeaderRibbonPosition` | type | removed 5.0.0 — renamed → `HeaderRibbonPlacement` (/header-ribbon) [2026-09-22 · O-23 L-5 — `HeaderRibbonPlacement` left with `./header-ribbon` at 8.0.0 (`4bf53962`; see _Deleted — `HeaderRibbon`_ under 8.0.0); no successor] |
2051
- | `HeaderRibbonProps` | type | ~~`/header-ribbon`~~ removed 8.0.0 — `./header-ribbon` retired at `4bf53962`; no successor (see _Deleted — `HeaderRibbon`_ under 8.0.0) [2026-09-22 · O-23 L-5] |
2052
- | `HighlightMatcher` | type | ~~`/motion-core`~~ removed 8.0.0 — `useTextHighlight` deleted at `bda718ac`; no successor [2026-09-22 · O-23 L-5] |
2114
+ | `HeaderRibbonPosition` | type | removed 5.0.0 — renamed → `HeaderRibbonPlacement` (/header-ribbon) (`HeaderRibbonPlacement` left with `./header-ribbon` at 8.0.0 (see _Deleted — `HeaderRibbon`_ under 8.0.0); no successor) |
2115
+ | `HeaderRibbonProps` | type | ~~`/header-ribbon`~~ removed 8.0.0 — `./header-ribbon` retired; no successor (see _Deleted — `HeaderRibbon`_ under 8.0.0) |
2116
+ | `HighlightMatcher` | type | ~~`/motion-core`~~ removed 8.0.0 — `useTextHighlight` deleted; no successor |
2053
2117
  | `IconChipIcon` | type | removed 7.0.0 — /icon-chip retired; use `<Chip shape="icon">` (/chip) |
2054
2118
  | `IconChipProps` | type | removed 7.0.0 — /icon-chip retired; use `<Chip shape="icon">` (/chip) |
2055
2119
  | `IconChipSection` | type | removed 7.0.0 — /icon-chip retired; use `<Chip shape="icon">` (/chip) |
2056
2120
  | `IconChipTone` | type | removed 7.0.0 — /icon-chip retired; use `<Chip shape="icon">` (/chip) |
2057
- | `InkPath` | type | ~~`/handmark`~~ removed 9.0.0 — `5a69ed9f`; no successor (see _Eight `./handmark` types leave with the barrel's reshape_ under 9.0.0) [2026-09-22 · O-23 L-5] |
2058
- | `InstrumentChassisPhase` | type | removed 7.0.0 — phase → state; use `InstrumentChassisState` (/instrument-chassis) [2026-09-22 · O-23 L-5 — `InstrumentChassisState` left with `./instrument-chassis` at 8.0.0 (`4bf53962`; see _Deleted — `InstrumentChassis`_ under 8.0.0); no successor] |
2121
+ | `InkPath` | type | ~~`/handmark`~~ removed 9.0.0 — no successor (see _Eight `./handmark` types leave with the barrel's reshape_ under 9.0.0) |
2122
+ | `InstrumentChassisPhase` | type | removed 7.0.0 — phase → state; use `InstrumentChassisState` (/instrument-chassis) (`InstrumentChassisState` left with `./instrument-chassis` at 8.0.0 (see _Deleted — `InstrumentChassis`_ under 8.0.0); no successor) |
2059
2123
  | `JumpTerm` | type | `/easing` |
2060
2124
  | `LazyLoaderOptions` | type | `/sidebar` |
2061
2125
  | `LiquidRevealPreset` | type | `/motion` |
2062
- | `MarkBox` | type | ~~`/handmark`~~ removed 9.0.0 — `5a69ed9f`; no successor (see _Eight `./handmark` types leave with the barrel's reshape_ under 9.0.0) [2026-09-22 · O-23 L-5] |
2126
+ | `MarkBox` | type | ~~`/handmark`~~ removed 9.0.0 — no successor (see _Eight `./handmark` types leave with the barrel's reshape_ under 9.0.0) |
2063
2127
  | `MAX_NUCLEI` | const | `/aurora` |
2064
2128
  | `MAX_STOPS` | const | `/aurora` |
2065
2129
  | `MenuItemVariants` | type | removed 7.0.0 — no public replacement; the menu-row treatment is applied internally by the menu components (was /command) |
2066
2130
  | `MetricBadgeLabelPosition` | type | removed 7.0.0 — /metric-badge folded into /metric |
2067
2131
  | `MetricBadgeProps` | type | removed 7.0.0 — /metric-badge folded into /metric; compose `Metric` in `./badge` |
2068
2132
  | `MetricBadgeSize` | type | removed 7.0.0 — /metric-badge folded into /metric; use `MetricSize` (/metric) |
2069
- | `MetricCellAppearance` | type | removed 7.0.0 — /metric-cell consolidated into /metric [CORRECTION 2026-08-08: the trailing "(`MetricCell`)" pointer is STRUCK — it named the symbol that absorbed the subpath, and `MetricCell` is itself removed at 8.0.0; the surviving destination is `Metric` (/metric)] |
2070
- | `MetricCellProps` | type | removed 8.0.0 — `MetricCell` folds into the one `Metric` atom; use `MetricProps` (/metric) and set `posture="cell"` [CORRECTION 2026-08-08: previously read "`/metric`", asserting the type LIVE on that subpath — `src/components/metric/types.ts` declares no such type] |
2133
+ | `MetricCellAppearance` | type | removed 7.0.0 — /metric-cell consolidated into /metric; `MetricCell` itself is removed at 8.0.0, so the destination is `Metric` (/metric) |
2134
+ | `MetricCellProps` | type | removed 8.0.0 — `MetricCell` folds into the one `Metric` atom; use `MetricProps` (/metric) and set `posture="cell"` |
2071
2135
  | `MetricRowProps` | type | `/metric` |
2072
2136
  | `MetricStackProps` | type | `/metric` |
2073
2137
  | `MotionCurve` | type | removed 7.0.0 — /motion-curves retired; import easing math from `@mkbabb/value.js/easing` |
@@ -2075,22 +2139,22 @@ measured.]
2075
2139
  | `NavigateOptions` | type | removed 7.0.0 — use `ViewTransitionOptions` (/motion-core) |
2076
2140
  | `OklchStop` | type | `/aurora` |
2077
2141
  | `PagerDotsProps` | type | `/pager-dots` |
2078
- | `PagerWindow` | type | removed 7.0.0 — windowing math internalized; use `PagerDots` / `DeckPager` [2026-09-22 · O-23 L-5 — `DeckPager` itself left at 8.0.0 (`85c322dd`, BK #40 W-PAGER, no §8.0.0 row); `PagerDots` (/pager-dots) stands] |
2142
+ | `PagerWindow` | type | removed 7.0.0 — windowing math internalized; use `PagerDots` / `DeckPager` (`DeckPager` itself left at 8.0.0; `PagerDots` (/pager-dots) stands) |
2079
2143
  | `PAPER_WASH_GROUND` | const | `/aurora` |
2080
2144
  | `PaperBackdropFrequency` | type | removed 7.0.0 — scope the shared paper variables at the owning route |
2081
- | `PaperBackdropProps` | type | ~~`/paper-backdrop`~~ removed 8.0.0 — `./paper-backdrop` retired at `4bf53962`; no successor (see _Deleted — `PaperBackdrop`_ under 8.0.0) [2026-09-22 · O-23 L-5] |
2082
- | `PaperGridConfig` | type | removed 5.0.0 — renamed → `LiquidGridConfig` (/liquid-grid) [2026-09-22 · O-23 L-5 — `LiquidGridConfig` left with `./liquid-grid` at 8.0.0 (`bda718ac`; see _Deleted — `LiquidGrid`_ under 8.0.0); no successor] |
2083
- | `PaperGridHandle` | type | removed 5.0.0 — renamed → `LiquidGridHandle` (/liquid-grid) [2026-09-22 · O-23 L-5 — `LiquidGridHandle` left with `./liquid-grid` at 8.0.0 (`bda718ac`; see _Deleted — `LiquidGrid`_ under 8.0.0); no successor] |
2145
+ | `PaperBackdropProps` | type | ~~`/paper-backdrop`~~ removed 8.0.0 — `./paper-backdrop` retired; no successor (see _Deleted — `PaperBackdrop`_ under 8.0.0) |
2146
+ | `PaperGridConfig` | type | removed 5.0.0 — renamed → `LiquidGridConfig` (/liquid-grid) (`LiquidGridConfig` left with `./liquid-grid` at 8.0.0 (see _Deleted — `LiquidGrid`_ under 8.0.0); no successor) |
2147
+ | `PaperGridHandle` | type | removed 5.0.0 — renamed → `LiquidGridHandle` (/liquid-grid) (`LiquidGridHandle` left with `./liquid-grid` at 8.0.0 (see _Deleted — `LiquidGrid`_ under 8.0.0); no successor) |
2084
2148
  | `PointerVec2` | type | `/motion-core` |
2085
2149
  | `ScrollCardHeaderProps` | type | removed 7.0.0 — ScrollCard family retired; compose `Card` within a scroll container |
2086
2150
  | `ScrollCardProps` | type | removed 7.0.0 — ScrollCard family retired; compose `Card` within a scroll container |
2087
2151
  | `ScrollToOptions` | type | `/sidebar` |
2088
2152
  | `ScrollTrackerOptions` | type | `/sidebar` |
2089
- | `SearchableItem` | type | ~~`/search`~~ removed 9.0.0 [2026-08-29 · BK #42 — `./search` cut whole; the engine interned, nothing republished] |
2090
- | `SearchIndex` | type | ~~`/search`~~ removed 9.0.0 [2026-08-29 · BK #42 — `./search` cut whole; the engine interned, nothing republished] |
2091
- | `SearchResult` | type | ~~`/search`~~ removed 9.0.0 [2026-08-29 · BK #42 — `./search` cut whole; the engine interned, nothing republished] |
2092
- | `SearchVariant` | type | ~~`/search`~~ removed 9.0.0 [2026-08-29 · BK #42 — `./search` cut whole; the engine interned, nothing republished] |
2093
- | `SearchVariants` | type | ~~`/search`~~ removed 9.0.0 [2026-08-29 · BK #42 — `./search` cut whole; the engine interned, nothing republished] |
2153
+ | `SearchableItem` | type | ~~`/search`~~ removed 9.0.0 (the whole `./search` subpath left; nothing replaced it) |
2154
+ | `SearchIndex` | type | ~~`/search`~~ removed 9.0.0 (the whole `./search` subpath left; nothing replaced it) |
2155
+ | `SearchResult` | type | ~~`/search`~~ removed 9.0.0 (the whole `./search` subpath left; nothing replaced it) |
2156
+ | `SearchVariant` | type | ~~`/search`~~ removed 9.0.0 (the whole `./search` subpath left; nothing replaced it) |
2157
+ | `SearchVariants` | type | ~~`/search`~~ removed 9.0.0 (the whole `./search` subpath left; nothing replaced it) |
2094
2158
  | `SectionLayout` | type | removed 5.0.0 — /virtual subpath retired; no owning subpath |
2095
2159
  | `SectionWindowRange` | type | removed 5.0.0 — /virtual subpath retired; no owning subpath |
2096
2160
  | `SegmentedTabOption` | type | `/tabs` |
@@ -2110,7 +2174,7 @@ measured.]
2110
2174
  | `StrokeMode` | type | `/aurora` |
2111
2175
  | `StrokeOrient` | type | `/aurora` |
2112
2176
  | `Surface` | type | `/axes` |
2113
- | `TaperSpec` | type | ~~`/handmark`~~ removed 9.0.0 — `5a69ed9f`; no successor (see _Eight `./handmark` types leave with the barrel's reshape_ under 9.0.0) [2026-09-22 · O-23 L-5] |
2177
+ | `TaperSpec` | type | ~~`/handmark`~~ removed 9.0.0 — no successor (see _Eight `./handmark` types leave with the barrel's reshape_ under 9.0.0) |
2114
2178
  | `TimelineSegment` | type | `/timeline` |
2115
2179
  | `TimelineSegmentGradient` | type | removed 8.0.0 — the per-segment gradient dialect died with the segmented variant; a span's paint is its `accent` (/timeline) |
2116
2180
  | `TimelineSegmentState` | type | `/timeline` |
@@ -2124,8 +2188,8 @@ measured.]
2124
2188
  | `TriggerPoint` | type | `/motion-core` |
2125
2189
  | `UseAccentToneOptions` | type | `/color` |
2126
2190
  | `UseAccentToneReturn` | type | `/color` |
2127
- | `UseBloomUpOptions` | type | ~~`/motion`~~ removed 8.0.0 — `useBloomUp` deleted at `bda718ac`; no successor [2026-09-22 · O-23 L-5] |
2128
- | `UseBloomUpReturn` | type | ~~`/motion`~~ removed 8.0.0 — `useBloomUp` deleted at `bda718ac`; no successor [2026-09-22 · O-23 L-5] |
2191
+ | `UseBloomUpOptions` | type | ~~`/motion`~~ removed 8.0.0 — `useBloomUp` deleted; no successor |
2192
+ | `UseBloomUpReturn` | type | ~~`/motion`~~ removed 8.0.0 — `useBloomUp` deleted; no successor |
2129
2193
  | `UseCelebrationBurstOptions` | type | removed 5.0.0 — dead-composable sweep; `useCelebrationBurst` retired |
2130
2194
  | `UseCelebrationBurstReturn` | type | removed 5.0.0 — dead-composable sweep; `useCelebrationBurst` retired |
2131
2195
  | `UseCharStaggerOptions` | type | removed 7.0.0 — `useCharStagger` / `SplitChars` retired; render ordinary accessible text |
@@ -2133,7 +2197,7 @@ measured.]
2133
2197
  | `UseClipboardOptions` | type | `/dom` |
2134
2198
  | `UseClipboardReturn` | type | `/dom` |
2135
2199
  | `UseConcentricOptions` | type | removed 5.0.0 — /concentric viz DELETED |
2136
- | `UseCountupOptions` | type | ~~`/motion`~~ removed 8.0.0 — `useCountup` deleted at `bda718ac`; the number tween is `useAnimatedNumber` (/motion) [2026-09-22 · O-23 L-5] |
2200
+ | `UseCountupOptions` | type | ~~`/motion`~~ removed 8.0.0 — `useCountup` deleted; the number tween is `useAnimatedNumber` (/motion) |
2137
2201
  | `UseDockCtaReceiveOptions` | type | `/motion` |
2138
2202
  | `UseDockCtaReceiveReturn` | type | `/motion` |
2139
2203
  | `UseDockSearchOptions` | type | `/dock` |
@@ -2144,21 +2208,21 @@ measured.]
2144
2208
  | `UseDragMorphReturn` | type | `/motion` |
2145
2209
  | `UseEasingPickerOptions` | type | `/easing` |
2146
2210
  | `UseEasingPickerReturn` | type | `/easing` |
2147
- | `UseFuzzySearchOptions` | type | ~~`/search`~~ removed 9.0.0 [2026-08-29 · BK #42 — `./search` cut whole; the engine interned, nothing republished] |
2211
+ | `UseFuzzySearchOptions` | type | ~~`/search`~~ removed 9.0.0 (the whole `./search` subpath left; nothing replaced it) |
2148
2212
  | `UseGlobalDarkOptions` | type | `/dark` |
2149
2213
  | `UseGlobalDarkReturn` | type | `/dark` |
2150
2214
  | `UseHapticOptions` | type | removed 5.0.0 — dead-composable sweep; `useHaptic` retired |
2151
2215
  | `UseHapticReturn` | type | removed 5.0.0 — dead-composable sweep; `useHaptic` retired |
2152
2216
  | `UseLiquidRevealOptions` | type | `/motion` |
2153
2217
  | `UseLiquidRevealReturn` | type | `/motion` |
2154
- | `UsePaperGridOptions` | type | removed 5.0.0 — renamed → `UseLiquidGridOptions` (/liquid-grid) [2026-09-22 · O-23 L-5 — `UseLiquidGridOptions` left with `./liquid-grid` at 8.0.0 (`bda718ac`; see _Deleted — `LiquidGrid`_ under 8.0.0); no successor] |
2218
+ | `UsePaperGridOptions` | type | removed 5.0.0 — renamed → `UseLiquidGridOptions` (/liquid-grid) (`UseLiquidGridOptions` left with `./liquid-grid` at 8.0.0 (see _Deleted — `LiquidGrid`_ under 8.0.0); no successor) |
2155
2219
  | `UsePointerVelocityField` | type | `/motion-core` |
2156
2220
  | `UsePointerVelocityFieldOptions` | type | `/motion-core` |
2157
2221
  | `UseScrollChromeOptions` | type | `/motion-core` |
2158
2222
  | `UseScrollChromeReturn` | type | `/motion-core` |
2159
2223
  | `UseScrollTriggerOptions` | type | `/motion-core` |
2160
2224
  | `UseScrollTriggerReturn` | type | `/motion-core` |
2161
- | `UseTextHighlightControls` | type | ~~`/motion-core`~~ removed 8.0.0 — `useTextHighlight` deleted at `bda718ac`; no successor [2026-09-22 · O-23 L-5] |
2225
+ | `UseTextHighlightControls` | type | ~~`/motion-core`~~ removed 8.0.0 — `useTextHighlight` deleted; no successor |
2162
2226
  | `UseUserInvalidAriaOptions` | type | `/dom` |
2163
2227
  | `UseUserInvalidAriaReturn` | type | `/dom` |
2164
2228
  | `ViewTransitionOptions` | type | `/motion-core` |
@@ -2174,14 +2238,12 @@ token-first focus axis). MIGRATE: rename every `--ring` reference to `--focus-ri
2174
2238
  at each declaration/read site. A consumer that cannot re-point in one pass reads it
2175
2239
  fallback-first for the transition window — `var(--focus-ring-color, var(--ring))` — then
2176
2240
  drops the `var(--ring)` fallback once its own tree is renamed (the fallback is a consumer
2177
- convenience, NOT a library alias: glass-ui ships only `--focus-ring-color`). Landed on
2178
- the 5.0.0 cut commit; the atlas consumer (12 bare `--ring` reads across 11 files)
2179
- re-points on its own `^5.0.0` bump.
2241
+ convenience, NOT a library alias: glass-ui ships only `--focus-ring-color`).
2180
2242
 
2181
2243
  ### `goo-blob` → `blob` (component + subpath rename)
2182
2244
 
2183
2245
  `<GooBlob>` renames to `<Blob>` and the `@mkbabb/glass-ui/goo-blob` subpath renames to
2184
- `@mkbabb/glass-ui/blob` (clean break, no alias — the owner-ratified full rename). The
2246
+ `@mkbabb/glass-ui/blob` (clean break, no alias; a full rename). The
2185
2247
  types + scoped CSS seams rename in lockstep; the config registry keys
2186
2248
  `BLOB_CONFIG_KEY` / `BLOB_CONFIG_DEFAULTS` already carried the `BLOB` prefix (stable, no
2187
2249
  change). MIGRATE (one-line rename per call site):
@@ -2206,27 +2268,16 @@ deleted; `src/tokens.ts` moves to `src/styles/tokens.ts`, while `src/index.ts` a
2206
2268
  `src/forms.ts` remain. These are SOURCE-ONLY, KEY-PRESERVING changes: published
2207
2269
  subpaths and chunk names are unchanged, so consumers take no action.
2208
2270
 
2209
- ### The BG/BH visual-convergence & structural retirements
2210
-
2211
- **BG.W-GOODOT-PRUNE — `GooDotMatrix` + the `/goo-dot-matrix` subpath RETIRED with
2212
- rationale (0 external consumers). Clean break, no alias ("No legacy code").** The
2213
- `goo-dot-matrix` goo+dot HYBRID viz (`<GooDotMatrix>`, `GooDotConfig`, `useGooDotMatrix`,
2214
- `DEFAULT_GOO_DOT_CONFIG`) + its `@mkbabb/glass-ui/goo-dot-matrix` subpath are
2215
- DEFINITION-ABSENT at the 5.0.0 cut. It was a demonstration hybrid that earned no external
2216
- consumer since BC (the ≥2-consumer / visual-load-bearing bar; J-inv-10 / L-inv-8). At BG its
2217
- FIELD donor (blob) AND its dot-matrix RENDER register both survived it; **`dot-matrix` was
2218
- subsequently DELETED at BI.W-VIZ-DELETIONS** (the user-ordered clean-break prune of the
2219
- 30+-attempt viz family), so the surviving re-home target is the blob FIELD donor
2220
- (`@mkbabb/glass-ui/blob`, byte-untouched render). MIGRATE: none for the library's own tree;
2221
- any external consumer of `/goo-dot-matrix` re-homes onto `<Blob>` (the merged-metaball FIELD
2222
- look). The inv-11 registry-consumer probe (`npm view @mkbabb/glass-ui` + the constellation
2223
- census) read ZERO consumers; recorded in the cut notes.
2224
-
2225
- **BI.W-VIZ-DELETIONS — `DotFlowField` / `Concentric` / `DotMatrix` + their subpaths DELETED
2226
- (the user-ordered clean-break prune). Clean break, no alias ("No legacy code").** The three
2227
- condemned procedural-viz members are DEFINITION-ABSENT at the 5.0.0 cut — the user edict
2228
- verbatim: *"Dot flow field, concentric, dot matrix — all to be deleted. You've failed 30+
2229
- attempts to implement these."* The deleted surface:
2271
+ ### The 5.0.0 visual and structural retirements
2272
+
2273
+ **`GooDotMatrix` and the `/goo-dot-matrix` subpath are removed. Clean break, no alias.**
2274
+ The goo-and-dot hybrid viz (`<GooDotMatrix>`, `GooDotConfig`, `useGooDotMatrix`,
2275
+ `DEFAULT_GOO_DOT_CONFIG`) and its `@mkbabb/glass-ui/goo-dot-matrix` subpath are gone at
2276
+ 5.0.0. It was a demonstration hybrid with no external consumer. If you used it, move to
2277
+ `<Blob>` from `@mkbabb/glass-ui/blob`, which paints the same merged-metaball field.
2278
+
2279
+ **`DotFlowField`, `Concentric` and `DotMatrix` and their subpaths are deleted. Clean
2280
+ break, no alias.** The three procedural vizzes are gone at 5.0.0, with no successor:
2230
2281
 
2231
2282
  | dropped subpath | dropped exports (component + composable + config/handle types) |
2232
2283
  |---|---|
@@ -2234,111 +2285,65 @@ attempts to implement these."* The deleted surface:
2234
2285
  | `@mkbabb/glass-ui/concentric` | `<Concentric>`, `useConcentric`, `ConcentricConfig`, `ConcentricHandle`, `UseConcentricOptions`, `DEFAULT_CONCENTRIC_CONFIG`, `sampleHeight`/`toneFromHeight`/… |
2235
2286
  | `@mkbabb/glass-ui/dot-matrix` | `<DotMatrix>`, `useDotMatrix`, `DotMatrixConfig`, `DotMatrixHandle`, `UseDotMatrixOptions`, `DEFAULT_DOT_MATRIX_CONFIG`, `fibonacciDot`/`facingFade`/… |
2236
2287
 
2237
- This is a BREAKING export change — routed into the 5.0.0 MAJOR cut (STRUCT-2), NOT the
2238
- zero-churn 5.1.0 flatten. It REVERSES BG.W-DOTFLOW-REBUILD (STRUCT-14): the 30+-attempt viz
2239
- family is RETIRED, not re-attempted — a future streamline/topographic/dot-sphere need
2240
- re-enters through a NEW honest trigger, never a re-open of the deleted registers. **MIGRATE:
2241
- none for consumers — the sibling census (`npm view` + the constellation import-graph) read
2242
- ZERO binary consumers of the three subpaths, so this is a no-op-for-consumers record (per
2243
- invariant-11), not a silent prune.** The surviving procedural-viz suite is aurora · blob ·
2244
- fourier-field · constellation · **liquid-grid** (the KEEPER born-WebGPU grid viz — NOT in the
2245
- delete set); the shared `curlFBM` chunk (`flow.glsl.ts`/`flow.wgsl.ts`) KEEPS (liquid-grid +
2246
- aurora-curl-warp consume it, the ≥2 shared-chunk bar).
2288
+ The procedural vizzes that remain are aurora, blob, fourier-field, constellation and
2289
+ liquid-grid.
2247
2290
 
2248
2291
  #### The `/virtual` subpath retirement
2249
2292
 
2250
- **BI.W-VIRTUAL-TRUTH — the `/virtual` PUBLISHED SUBPATH RETIRED (the consumer-truth
2251
- adjudication, DOC-4). Clean break, no alias ("No legacy code").** The section-windowing
2252
- engine was un-retired at BC on a two-binary-consumer justification that a fresh
2253
- registry+sibling probe at execution found FABRICATED: (1) the named external consumer, words
2254
- `DefinitionContentView`, imports a byte-DIVERGENT words-LOCAL fork (`@/composables/virtual`,
2255
- md5 ≠ the glass-ui copy), never `@mkbabb/glass-ui/virtual` — 0 external binary consumers; (2)
2256
- the "internal live consumer" (the dock-search results list) does NOT compose the windower —
2257
- the library dock only accepts an optional `ensureTargetWindow` callback. There are 0 src/
2258
- production consumers; the mechanism is DEMO-ONLY (3 demo sites). Under the mechanism-distinctness
2259
-
2260
- - ≥2-binary-consumer law the PUBLISHED SUBPATH does not earn its keep, so it retires:
2293
+ **The `/virtual` subpath is removed. Clean break, no alias.** The section-windowing engine
2294
+ had no production consumer inside the library and no external importer of the published
2295
+ subpath, so the subpath goes:
2261
2296
 
2262
2297
  | dropped surface | disposition |
2263
2298
  |---|---|
2264
- | `@mkbabb/glass-ui/virtual` subpath export + `typesVersions` | RETIRED — no external target |
2265
- | `src/subpaths/virtual.ts` mirror | DELETED |
2266
- | `/api` re-export of `FlatSection` / `ForcedSectionWindowRange` / `SectionLayout` / `SectionWindowRange` | REMOVED — the 4 types have no owning subpath (see the `/api` fold note above) |
2267
- | `demo/composables/virtual/` facility (`useVirtualSectionWindow` / `virtualSectionLayout` / narrow index) | KEEPS — demo-owned, imported only by the two windowed stories |
2268
-
2269
- **MIGRATE: none — the fresh probe read ZERO external binary consumers (words maintains its own
2270
- fork; the atlas O-E9 document-native `/virtual` core is a long-pole future ask that "needs
2271
- nothing from this row" today, DECLINED-TERMINAL). A no-op-for-consumers record (per
2272
- invariant-11), not a silent prune.** Re-entry trigger: the published subpath re-mints only on
2273
- a real ≥2 cross-repo binary consume (a words re-adopt ask, or the vft V4 → V6.g consume) — a
2274
- production or external importer of the glass-ui surface, never a demo page and never a local
2275
- fork. The final demo-owned coordinate is recorded in
2276
- `docs/consumer-evidence/use-virtual-section-window.md`; no permanent proof script
2277
- or compatibility coordinate remains.
2299
+ | `@mkbabb/glass-ui/virtual` subpath export + `typesVersions` | removed |
2300
+ | `src/subpaths/virtual.ts` mirror | deleted |
2301
+ | `/api` re-export of `FlatSection` / `ForcedSectionWindowRange` / `SectionLayout` / `SectionWindowRange` | removed — the 4 types have no owning subpath (see the `/api` fold note above) |
2302
+ | `demo/composables/virtual/` facility (`useVirtualSectionWindow` / `virtualSectionLayout` / narrow index) | kept as a demo-only facility, imported only by the two windowed stories |
2303
+
2304
+ If you imported `@mkbabb/glass-ui/virtual`, keep a local copy of the windower in your own
2305
+ tree.
2278
2306
 
2279
2307
  #### The `/border-progress` subpath retirement
2280
2308
 
2281
- **BI.W-BORDER-PROGRESS-RETIRE — `/border-progress` and the broad `BorderProgress` component are
2282
- deleted. Clean break, no alias.** The old surface mixed a content wrapper, three coverage modes,
2283
- milestone events, spectrum expansion, and progress paint despite having no external binary
2284
- consumer. Its one earned mechanism—the radius-following masked band—now belongs to the smaller
2285
- public `ScrollProgressRim` successor.
2309
+ **`/border-progress` and the broad `BorderProgress` component are deleted. Clean break,
2310
+ no alias.** The old surface mixed a content wrapper, three coverage modes, milestone
2311
+ events, spectrum expansion, and progress paint. Its one lasting mechanism, the
2312
+ radius-following masked band, now belongs to the smaller public `ScrollProgressRim`.
2286
2313
 
2287
2314
  | surface | disposition |
2288
2315
  |---|---|
2289
- | `@mkbabb/glass-ui/border-progress` subpath export + `typesVersions` | RETIRED — 0 binary consumers |
2290
- | `BorderProgress`, milestone APIs, content-wrapper behavior, and old CSS properties | DELETED |
2291
- | `@mkbabb/glass-ui/scroll-progress-rim` | ADDED — exports `ScrollProgressRim` |
2316
+ | `@mkbabb/glass-ui/border-progress` subpath export + `typesVersions` | removed |
2317
+ | `BorderProgress`, milestone APIs, content-wrapper behavior, and old CSS properties | deleted |
2318
+ | `@mkbabb/glass-ui/scroll-progress-rim` | added — exports `ScrollProgressRim` |
2292
2319
 
2293
2320
  `ScrollProgressRim` accepts aggregate `value` / `max`, optional per-item `segments` whose values
2294
2321
  are clamped to `[0,1]`, an edge `coverage`, and optional rainbow `stops`. It paints one 4px masked
2295
- band that follows the host radius and exposes native progressbar semantics. SidebarDock and the
2296
- feedback progress demo consume this successor directly. `completion-seal` remains published and
2297
- unchanged.
2322
+ band that follows the host radius and exposes native progressbar semantics. `completion-seal`
2323
+ remains published and unchanged at 5.0.0.
2298
2324
 
2299
- #### The `/scrolling-text` subpath retire-relocation
2325
+ #### The `/scrolling-text` subpath removal
2300
2326
 
2301
- **BI.W-SPEEDTEST-ONLY-PAIR — the `/scrolling-text` PUBLISHED SUBPATH + its component RETIRE-RELOCATED
2302
- to speedtest (the consumer-truth adjudication; XR-3 / UF-K1). Clean break, no alias ("No legacy
2303
- code").** `ScrollingText` is an overflow-detection marquee lifted from the speedtest fleet at W.W2;
2304
- at the 5.0.0 cut the fresh registry+sibling probe (`npm view @mkbabb/glass-ui` + a read-only grep of
2305
- the constellation) reads its ONLY binary consumers as **speedtest, 2 sites** — `ResultDetailSheet.vue:6`
2306
-
2307
- - `AppSettingsButton.vue:97`, both `import { ScrollingText } from "@mkbabb/glass-ui/scrolling-text"`;
2308
- **0** across muster · sci-report · atlas · slides · value.js · keyframes.js · words · bbnf-buddy. The
2309
- ≥2-**repo**-binary-consumer bar is UNMET (one consuming repo), and the mechanism is a distinct
2310
- overflow-marquee no survivor expresses — so the law does NOT fold it onto a sibling, it RELOCATES to the
2311
- sole consumer's own repo (UF-P6 no-standing-overfit — the honest home is speedtest's tree, NOT a
2312
- keep-with-evidence-doc). Unlike border-progress (banked dormant, demo-only own-render), scrolling-text
2313
- has NO glass-ui demo consumer once its story folds, so the retire is a full DELETE:
2327
+ **The `/scrolling-text` subpath and the `ScrollingText` component are removed. Clean
2328
+ break, no alias.** `ScrollingText` was an overflow-detection marquee with a single
2329
+ consuming app, so it moved into that app rather than staying in the library:
2314
2330
 
2315
2331
  | dropped surface | disposition |
2316
2332
  |---|---|
2317
- | `@mkbabb/glass-ui/scrolling-text` subpath export + `typesVersions` | RETIRED — speedtest-only, ≥2-repo bar unmet (derived regen: subpath-policy drop → `regen-exports --write`) |
2318
- | `src/subpaths/scrolling-text.ts` mirror | DELETED |
2319
- | `src/components/scrolling-text/` component (`ScrollingText.vue` + barrel + README) | DELETED — relocated to speedtest's repo |
2320
- | root barrel re-export (`src/index.ts` `export * from "./components/scrolling-text"`) | DROPPED — no `ScrollingText` off the root barrel |
2321
- | the `data/scrolling-text` demo story + its manifest row + metrics-family member | DELETED — the metrics family keeps its four metric primitives |
2322
-
2323
- **MIGRATE: none — the fresh probe read ZERO external binary consumers beyond speedtest; a
2324
- no-op-for-registry-consumers record (per invariant-11), not a silent prune.** Relocation home: speedtest
2325
- ADOPTS a local copy (or its own overflow primitive) on its `^5.x` consume and DROPS the `/scrolling-text`
2326
- import — the by-name ASK (with the paired kf `^5.2.0` / value `^3.1.0` peer bump) is rostered on the
2327
- `crossrepo-asks:bi` book (`docs/tranches/BI/coordination/asks-and-consumes.md`). Re-entry trigger: a real
2328
- ≥2-repo cross-repo binary consume re-mints the published subpath (never a demo page, never one repo).
2329
- Recorded in `proof:consumer-evidence-true` (the SP1 arm — source-anchored: component + mirror + root-barrel
2330
- re-export + demo story DEFINITION-ABSENT).
2333
+ | `@mkbabb/glass-ui/scrolling-text` subpath export + `typesVersions` | removed |
2334
+ | `src/components/scrolling-text/` component (`ScrollingText.vue` + barrel + README) | deleted |
2335
+ | root barrel re-export | dropped — no `ScrollingText` off the root barrel |
2331
2336
 
2332
- #### The `icon-tooltip` clean break (a 7.0.0 removal)
2337
+ If you imported it, copy the component into your own tree (or use your own overflow
2338
+ primitive) and drop the `/scrolling-text` import.
2333
2339
 
2334
- `IconTooltip` and the `@mkbabb/glass-ui/icon-tooltip` subpath are deleted at 7.0.0 (verified:
2335
- the `v6.0.0` tag `exports` still carries `./icon-tooltip`; the 6→7 diff drops it — see the
2336
- `IconTooltip` row in the §7.0.0 table). This subsection sits under `## 5.0.0` only for
2337
- proximity to the other Tooltip-composition guidance. Compose the canonical Tooltip family
2338
- directly, placing one provider around the nearest real control group:
2339
- [CORRECTION 2026-07-17: this subsection previously opened by asserting a 5.0.0 removal;
2340
- `./icon-tooltip` ships through v6.0.0 and is removed only at 7.0.0.]
2340
+ #### The `icon-tooltip` clean break (a 7.0.0 removal)
2341
2341
 
2342
+ `IconTooltip` and the `@mkbabb/glass-ui/icon-tooltip` subpath are deleted at 7.0.0 (the
2343
+ `v6.0.0` `exports` still carries `./icon-tooltip`; see the `IconTooltip` row in the
2344
+ §7.0.0 table). This subsection sits under `## 5.0.0` only for proximity to the other
2345
+ Tooltip-composition guidance. Compose the canonical Tooltip family directly, placing one
2346
+ provider around the nearest real control group:
2342
2347
  ```vue
2343
2348
  <TooltipProvider :delay-duration="250">
2344
2349
  <Tooltip>
@@ -2355,73 +2360,55 @@ Required instructions must remain visible because touch does not synthesize hove
2355
2360
  its real `<label for>` and renders supporting copy beside the control, linked through the slotted
2356
2361
  `describedBy` value. It does not add a help trigger or conceal required field guidance.
2357
2362
 
2358
- **BG.W-GRID-AFFINE — `PaperGrid` (the viz) RENAMED to `LiquidGrid`; `/paper-grid` →
2359
- `/liquid-grid`. Clean break, no alias ("No legacy code").** The WebGPU-first liquid AA-grid
2360
- viz + its subpath are renamed to kill the live homonym with the STATIC `.paper-grid` /
2361
- `--paper-grid-texture` geometric-paper CARD register (`cards.css` / `scale-paper.css`), which
2362
- is BYTE-UNTOUCHED — the homonym dies on the VIZ side only. MIGRATE (one-line rename per call
2363
- site):
2363
+ **`PaperGrid` (the viz) is renamed `LiquidGrid`, and `/paper-grid` becomes
2364
+ `/liquid-grid`. Clean break, no alias.** The rename separates the WebGPU liquid grid viz
2365
+ from the static `.paper-grid` / `--paper-grid-texture` paper card register
2366
+ (`cards.css` / `scale-paper.css`), which is unchanged. Migrate with one rename per call
2367
+ site:
2364
2368
  - `import { PaperGrid, DEFAULT_PAPER_GRID_CONFIG } from "@mkbabb/glass-ui/paper-grid"`
2365
2369
  → `import { LiquidGrid, DEFAULT_LIQUID_GRID_CONFIG } from "@mkbabb/glass-ui/liquid-grid"`.
2366
2370
  - `<PaperGrid …>` → `<LiquidGrid …>`; `PaperGridConfig` → `LiquidGridConfig` (the `/api`
2367
- discovery type); `usePaperGrid` → `useLiquidGrid`; `samplePaperGrid` → `sampleLiquidGrid`;
2368
- the demo route `/substrates/paper-grid` → `/substrates/liquid-grid`.
2371
+ discovery type); `usePaperGrid` → `useLiquidGrid`; `samplePaperGrid` → `sampleLiquidGrid`.
2369
2372
  - The `.paper-grid-wrapper`/`.paper-grid-canvas` scoped SFC classes → `.liquid-grid-*`
2370
- (internal — no consumer surface). Zero external consumers verified — no by-name cross-repo
2371
- ask owed. The prop schema is otherwise unchanged, EXCEPT the retired per-cell `shearMax`
2372
- config field (the affine sheet-warp is shear-free — a `shearMax` set on a config object is a
2373
- dead field; drop it).
2374
- - **The mechanism changed too (paint, not API):** the ripple is now a SMOOTH continuous
2375
- AFFINE sheet-warp (`waveFlow`, the SAME warp Concentric reads) — major gridlines bow/shear as
2376
- ONE coherent curve, cells near-parallelogram — instead of the retired per-cell `cellTwist`
2377
- (which kinked each box about its own center). No consumer action; the surface reads better.
2378
-
2379
- **BH.W-MOTION-AXIS — the four-boolean motion scatter → the ONE `motion` axis. Clean
2380
- break, no alias ("No legacy code").** The `draggable` / `pressable` / `spring` /
2381
- `liquidDrag` booleans (7 prop instances across 6 SFCs — `Card` · `Slider` ·
2382
- `DialogContent` · `SheetContent` · `SegmentedTabs` · `DockLayerGroup`) are COLLAPSED onto
2383
- a single `motion?: "full" | "reduced" | "off"` axis (default `full` — physics is the
2384
- DEFAULT, the axis is an opt-DOWN per the liquid-weight-universal law). `motion="reduced"`
2385
- degrades the JS gesture physics to their CSS floor (the same state `prefers-reduced-motion`
2386
- produces); `motion="off"` unbinds the enrichment AND writes `--motion-weight: 0` (the
2387
- functional interaction — click/keyboard/drag-handle — stays). PRM forces `full → reduced`
2388
- regardless (a11y absolute).
2373
+ (internal — no consumer surface). The prop schema is otherwise unchanged, except the
2374
+ per-cell `shearMax` config field, which is gone (the sheet warp is shear-free, so a
2375
+ `shearMax` on a config object is a dead field; drop it).
2376
+ - **The paint changed too, not the API:** the ripple is now one smooth continuous sheet
2377
+ warp, so major gridlines bow as one coherent curve, instead of each cell kinking about
2378
+ its own centre. No consumer action.
2379
+
2380
+ **The four motion booleans collapse onto one `motion` axis. Clean break, no alias.** The
2381
+ `draggable` / `pressable` / `spring` / `liquidDrag` booleans (on `Card`, `Slider`,
2382
+ `DialogContent`, `SheetContent`, `SegmentedTabs` and `DockLayerGroup`) become a single
2383
+ `motion?: "full" | "reduced" | "off"` axis. The default is `full`, so physics is on unless
2384
+ you opt down. `motion="reduced"` degrades the gesture physics to their CSS floor (the same
2385
+ state `prefers-reduced-motion` produces); `motion="off"` unbinds the enrichment and writes
2386
+ `--motion-weight: 0`, while click, keyboard and drag-handle interaction stay.
2387
+ `prefers-reduced-motion` always turns `full` into `reduced`.
2389
2388
  - **`<SegmentedTabs draggable>` / `<DockLayerGroup draggable>` → the `motion="full"`
2390
- DEFAULT.** The drag is now the DEFAULT (a click-only strip opts DOWN with
2391
- `motion="reduced"`). DockLayerGroup's drag flips default-ON (the boolean defaulted
2392
- `false`) — the pull is an enrichment over the always-present click/keyboard model write.
2389
+ default.** The drag is now on by default, and a click-only strip opts down with
2390
+ `motion="reduced"`. DockLayerGroup's drag was off by default before.
2393
2391
  - **`<Card pressable>` → explicit command composition.** Card no longer infers
2394
2392
  interaction or mounts a press engine. Put a `Button` or `Link` inside the Card so
2395
2393
  native focus, keyboard, disabled, naming, and activation semantics stay together.
2396
2394
  - **`<Slider liquidDrag>` → `motion`.** `liquidDrag="false"` → `motion="reduced"` (or
2397
- `"off"`); the default `full` is byte-identical to the prior `liquidDrag: true`.
2395
+ `"off"`); the default `full` behaves as `liquidDrag: true` did.
2398
2396
  - **`<DialogContent spring>` / `<SheetContent spring>` → `springPreset` + `motion`.** The
2399
- `spring` boolean carried BOTH the on/off AND the preset; it splits: `springPreset?:
2400
- "smooth" | "snappy" | "bouncy" | "gentle"` is the curve choice (a distinct concern from
2401
- motion intensity), and `motion` gates the engine. `spring={true}` → `springPreset="smooth"`;
2402
- `spring="bouncy"` → `springPreset="bouncy"`; unset `spring` → unset `springPreset` (the
2403
- `.glass-reveal` centered-dialog CSS floor, byte-identical; a side sheet always rides the
2404
- interruptible spring). Sheet's `dragDismiss` now
2405
- engages the spring engine on its own (it needs it) — it no longer requires `spring`.
2406
- - **The kept gesture CONTRACTS are UNTOUCHED** (`keepDockOpen` · `dragDismiss` ·
2407
- `responsive`) — a gesture contract is a role/behavior, not motion intensity.
2408
- Machine-locked by `proof:encapsulation` · `motion-axis` arm (M1-M6).
2409
-
2410
- **BI.W-TABS-FACTOR / P092 — `pill` remains the default and the former two-rest-state
2411
- eyeglass path is removed. Clean break, no alias.** A bare `<SegmentedTabs>` paints one
2412
- measured ~~`.glass-lens`~~ indicator inside the pill track; `underline` remains the only other
2413
- material. [`.glass-lens` was DELETED at 8.0.0 — see the §8.0.0 delete banner; the indicator
2414
- rides the `.glass-{rung}` blur+tint base.]
2397
+ `spring` boolean carried both the on/off and the preset, so it splits: `springPreset?:
2398
+ "smooth" | "snappy" | "bouncy" | "gentle"` picks the curve, and `motion` gates the
2399
+ engine. `spring={true}` → `springPreset="smooth"`; `spring="bouncy"` →
2400
+ `springPreset="bouncy"`; unset `spring` → unset `springPreset` (the centred dialog keeps
2401
+ its CSS reveal; a side sheet always rides the interruptible spring). Sheet's
2402
+ `dragDismiss` now engages the spring engine on its own and no longer requires `spring`.
2403
+ - **`keepDockOpen`, `dragDismiss` and `responsive` are unchanged**, since they describe a
2404
+ behaviour, not motion intensity.
2405
+
2406
+ **`pill` remains the `SegmentedTabs` default, and the two-rest-state eyeglass path is
2407
+ removed. Clean break, no alias.** A bare `<SegmentedTabs>` paints one measured indicator
2408
+ inside the pill track; `underline` remains the only other material.
2415
2409
 
2416
2410
  - **`<SegmentedTabs eyeglass>` remains deleted.** Drop the old attribute; there is no
2417
- named eyeglass variant. [2026-08-08 · BK #71 W-EYEGLASS: still no variant, and that is
2418
- the point — the eyeglass came back as what `pill` IS, on the owner's ruling that we do
2419
- not need a million variants that are essentially the same thing. It is a different
2420
- construct wearing the same name: the pill track arms it by declaring
2421
- `--eyeglass-span-max`, and the writer answers with `--eyeglass-span` /
2422
- `--eyeglass-swell` / `--eyeglass-origin`. **None of the three tokens struck below comes
2423
- back** — proud/settled was a second REST state, this is a transient deform that returns
2424
- to 1 — so a consumer who removed them has nothing to restore and nothing to re-read.]
2411
+ named eyeglass variant.
2425
2412
  - **The old proud/settled sizing and release controls are deleted.** Remove
2426
2413
  `--eyeglass-proud`, `--eyeglass-settled`, and `--eyeglass-live-t` overrides. The active
2427
2414
  fill matches the selected control instead of reserving or magnifying a second rest state.
@@ -2429,66 +2416,39 @@ rides the `.glass-{rung}` blur+tint base.]
2429
2416
  `--spring-eyeglass-settle`, and `--spring-eyeglass-duration` overrides. Selection uses
2430
2417
  the shared `snappy` register; no replacement preset or compatibility token exists.
2431
2418
 
2432
- **BG.W-DEAD-SWEEP — the `selectableChipVariants` alias + the `--corner-shape-card`/
2433
- `-pill` dead tokens SWEPT. Clean break, no alias ("No legacy code").** Two net-negative
2434
- cuts:
2419
+ **The `selectableChipVariants` alias and the `--corner-shape-card` / `-pill` tokens are
2420
+ removed. Clean break, no alias.**
2435
2421
  - **`selectableChipVariants` → `chipVariants`, `SelectableChipVariants` → `ChipVariants`.**
2436
- The `selectableChipVariants.ts` re-point shim (a self-admitted back-compat rename over
2437
- the ONE congruent `chipVariants` recipe — BD.W-CHIP-CONGRUENT-GLASS) is DELETED. The recipe
2438
- now publishes from `@mkbabb/glass-ui/chip` — `chipVariants` (value) + `ChipVariants` (type)
2439
- on the chip barrel — because the same 5.0.0 cut removed both the `./selectable-chip` subpath
2440
- (folded onto the one `<Chip>` family) and the `./api` discovery subpath (fold-deleted); neither
2441
- key survives to re-export anything. MIGRATE: rename `selectableChipVariants` → `chipVariants`
2442
- and `SelectableChipVariants` → `ChipVariants` and re-point the import to `@mkbabb/glass-ui/chip`
2443
- (the recipe body is byte-identical — it always WAS `chipVariants` under the alias). The old
2444
- `<SelectableChip>` component folds onto `<Chip>` in the same cut.
2445
- [CORRECTION 2026-07-17: previously read "The `@mkbabb/glass-ui/selectable-chip` subpath now
2446
- exports `chipVariants` … `@mkbabb/glass-ui/api` exports the `ChipVariants` type" and
2447
- "`<SelectableChip>` itself is unchanged" — both `./selectable-chip` and `./api` are dropped at
2448
- 5.0.0, so the recipe's surviving home is `./chip`, verified on the branch chip barrel.]
2449
- - **`--corner-shape-card` / `--corner-shape-pill` DELETED.** They were dead `round`
2450
- no-op knobs (zero `var()` readers; the CSS `corner-shape` INITIAL VALUE is `round`, so
2451
- a card/pill with no declaration is already round). The "cards/pills stay round" policy
2452
- is UNCHANGED — glass.css writes no `corner-shape` on `.glass-card`/`.glass-btn`/
2453
- `.btn-pill`, so they inherit the round default (the CARD-REHOMED policy). The SQUIRCLE
2454
- members `--corner-shape-{bigdock,dialog,sheet,panel,hero}` are LIVE and untouched.
2455
- MIGRATE: a consumer who was re-pointing `--corner-shape-card`/`-pill` mints the alias
2456
- itself and adds the surface to `glass/squircle.css`'s `@supports` block (presets-in-
2457
- consumers). `proof:squircle-language`'s policy clause is re-pointed onto the NEGATIVE
2458
- GUARD — a re-mint of either token reds (the net-negative cannot silently reverse).
2459
-
2460
- **BG.W-DOCK-CAP-SCROLL-FADE — the `<GlassDock overflow="scroll">` opt-in RETIRED.
2461
- Clean break, no alias ("No legacy code").** The `overflow` prop is now
2462
- `"grow" | "wrap"` (the `"scroll"` member is GONE). A capped dock axis is
2463
- INTRINSICALLY a scroll axis, no opt-in: a HORIZONTAL dock scrolls its over-cap
2464
- inline content whenever the row exceeds `--dock-max-inline-size` (the intrinsic
2465
- `.dock-scroll-x` port; under the cap nothing scrolls), and a VERTICAL rail scrolls
2466
- its over-cap block content whenever it exceeds `--dock-max-block-size` (the
2467
- unconditional cap-derived shell rule; the `.dock-scroll-y` opt-in class is
2468
- retired). The scroll port's CROSS axis is now `overflow-*: clip` +
2469
- `overflow-clip-margin: var(--dock-control-safe-inset)` (the mechanically-honest
2470
- un-clip — the prior `overflow-*: visible` pin was a latent no-op that CSS Overflow
2471
- §3 computed to `auto`), and the over-cap edge feathers via the `<FadingScroll>`
2472
- `--fade-scroll-width` mask seam (the liquid-weight soft edge). MIGRATE: drop any
2473
- `overflow="scroll"` prop — a capped dock scrolls by construction; set
2474
- `--dock-max-block-size` / `--dock-max-inline-size` per-instance to anchor the cap.
2475
- Machine-locked by `proof:dock-plate-clearance` (W2 re-pointed onto the `clip` +
2476
- `overflow-clip-margin` un-clip + the `.dock-scroll-y`-retired assert + a self-test
2477
- bite).
2478
- [2026-09-22 · O-32 AC-D-1 — true from 5.0.0 through 8.0.0 only. 9.0.0 deleted the inline
2479
- cap's last reader and the edge mask with it (`964535cb`, the W3 LATTICE): a horizontal
2422
+ The alias over the one `chipVariants` recipe is deleted. The recipe publishes from
2423
+ `@mkbabb/glass-ui/chip` — `chipVariants` (value) + `ChipVariants` (type) — because 5.0.0
2424
+ also removed the `./selectable-chip` subpath (folded onto the one `<Chip>` family) and
2425
+ the `./api` subpath. Migrate by renaming both names and re-pointing the import to
2426
+ `@mkbabb/glass-ui/chip`; the recipe body is unchanged. The old `<SelectableChip>`
2427
+ component folds onto `<Chip>` in the same release.
2428
+ - **`--corner-shape-card` / `--corner-shape-pill` are deleted.** They were dead `round`
2429
+ knobs with no reader, and the CSS `corner-shape` initial value is already `round`, so
2430
+ cards and pills stay round with no declaration. The squircle members
2431
+ `--corner-shape-{bigdock,dialog,sheet,panel,hero}` are live and untouched. If you
2432
+ re-pointed either token, declare it yourself and add your surface to your own
2433
+ `@supports (corner-shape: …)` block.
2434
+
2435
+ **The `<GlassDock overflow="scroll">` opt-in is removed. Clean break, no alias.** The
2436
+ `overflow` prop became `"grow" | "wrap"`. From 5.0.0 through 8.0.0 a capped dock axis
2437
+ scrolled by construction: a horizontal dock scrolled its over-cap inline content past
2438
+ `--dock-max-inline-size`, a vertical rail scrolled past `--dock-max-block-size`, and the
2439
+ over-cap edge feathered through the `<FadingScroll>` `--fade-scroll-width` mask. Drop any
2440
+ `overflow="scroll"` prop. 9.0.0 removed the inline cap and the edge mask: a horizontal
2480
2441
  dock's run scrolls natively when it outgrows its stage, with no edge fade, and
2481
- `--dock-max-inline-size` does nothing. 10.0.0 deletes the declaration. See
2482
- _`--dock-max-inline-size` is removed_ under 9.0.0; `--dock-max-block-size` remains the
2483
- vertical cap.]
2442
+ `--dock-max-inline-size` does nothing (10.0.0 deletes it; see _`--dock-max-inline-size`
2443
+ is removed_ under 9.0.0). `--dock-max-block-size` remains the vertical cap.
2484
2444
 
2485
- ### BI.W-DOCK-FOLD — the dock control/trigger fold + the reka `ui/tabs` retire
2445
+ ### The dock control and trigger fold, and the reka `ui/tabs` retirement
2486
2446
 
2487
- The dock greenfield collapses the five legacy control/trigger SFCs onto TWO folded
2488
- survivors (`<DockControl>` with a `shape` axis + `<DockTrigger>` with a `for` axis),
2489
- retires the reka `ui/tabs` substrate (its sole internal consumer `<DockLayerGroup>`
2490
- re-points onto the headless `useSelectionGroup` engine), and retires the demo-only
2491
- dock-ITEM drag-reorder axis. Clean break, no alias — every consumer re-points by name.
2447
+ The five dock control and trigger components collapse onto two: `<DockControl>` with a
2448
+ `shape` axis and `<DockTrigger>` with a `for` axis. The internal reka `ui/tabs`
2449
+ substrate retires (`<DockLayerGroup>` now runs on the headless `useSelectionGroup`
2450
+ engine), and the dock-item drag-reorder axis goes. Clean break, no alias; every call site
2451
+ re-points by name.
2492
2452
 
2493
2453
  | Retired (5.0.0) | Survivor | Rename |
2494
2454
  |---|---|---|
@@ -2498,184 +2458,90 @@ dock-ITEM drag-reorder axis. Clean break, no alias — every consumer re-points
2498
2458
  | `DockDropdownTrigger` | `DockTrigger` | `<DockDropdownTrigger …>` → `<DockTrigger for="dropdown" …>` |
2499
2459
  | `DockPopoverTrigger` | `DockTrigger` | `<DockPopoverTrigger …>` → `<DockTrigger for="popover" …>` |
2500
2460
 
2501
- **`<GlassDock draggable-items>` + the `update:order` emit RETIRED** (the demo-only
2502
- `useDockItemDrag` dock-item drag-reorder — zero binary consumer, G10 census). A dock
2503
- reorder is a consumer concern: compose `useSortable` (`@mkbabb/glass-ui/sortable`).
2504
- Drop `draggable-items` + `@update:order` + any `data-dock-draggable` markers.
2505
-
2506
- **The reka `ui/tabs` substrate is DEFINITION-ABSENT** — it was never on a public barrel
2507
- (internal-only), so there is no consumer-facing import to migrate. Consumers building tab
2508
- UIs already use `<SegmentedTabs>` (`@mkbabb/glass-ui/tabs`).
2509
-
2510
- The blast radius: `DockIconButton` dominated ~24 import sites across ~9 consuming repos —
2511
- each is a mechanical by-name rename on the `^5.0.0` bump (the cross-repo ask
2512
- `docs/tranches/BI/coordination/W-DOCK-FOLD-asks.md`). `useDockCtaReceive` + `cta-seat.css`
2513
- are PRESERVED (the /motion + /dock + /api triple export stays — the pass-2 /dock-only
2514
- charge was reversed). Machine-locked by `proof:dock-fold` (F1 components-folded · F2
2515
- reka-ui-tabs-retired · F3 cta-seat-preserved · F4 migration-table-complete · F5
2516
- useDockItemDrag-retired + 3 self-test bites).
2517
-
2518
- ### BI.W-OVERLAY-UNION — HoverPopover + HoverCard fold onto ONE sealed `<Popover>`
2519
-
2520
- The Kronecker fold (UF-P7/UF-J6): the three overlays with the SAME positioned-glass
2521
- mechanism collapse onto ONE sealed `<Popover>` with a `trigger` axis (`click` default
2522
- · `hover`) that switches the reka ROOT internally (fine-hover → reka
2523
- `HoverCardRoot`; click/coarse-hover → `PopoverRoot`) and therefore owns the content
2524
- semantics: hover previews are named non-modal groups; click surfaces are non-modal
2525
- dialogs. `<PopoverContent>` retains the shared `surface` axis. `keepDockOpen` is ONE `watch(open)`
2526
- serving both roots. Coarse-pointer hover auto-promotes to tap-toggle (reka's
2527
- `excludeTouch` leaves the hover root structurally dead on touch). **Tooltip SURVIVES**
2528
- the fold as a genuinely distinct mechanism (`aria-describedby` naming, `role="tooltip"`,
2529
- the SR mirror, non-focusable content). Clean
2530
- break, no alias — every consumer re-points by name.
2461
+ **`<GlassDock draggable-items>` and the `update:order` emit are removed.** A dock reorder
2462
+ is the consumer's concern: compose `useSortable` (`@mkbabb/glass-ui/sortable`). Drop
2463
+ `draggable-items`, `@update:order` and any `data-dock-draggable` markers.
2464
+
2465
+ **The reka `ui/tabs` substrate is gone.** It was never on a public barrel, so there is no
2466
+ import to migrate. Tab UIs use `<SegmentedTabs>` (`@mkbabb/glass-ui/tabs`).
2467
+ `useDockCtaReceive` and `cta-seat.css` stay.
2468
+
2469
+ ### HoverPopover and HoverCard fold onto one `<Popover>`
2470
+
2471
+ The three overlays that share the positioned-glass mechanism collapse onto one
2472
+ `<Popover>` with a `trigger` axis (`click` default, or `hover`). It switches the reka
2473
+ root internally (a fine-pointer hover uses `HoverCardRoot`; a click or a coarse-pointer
2474
+ hover uses `PopoverRoot`), so it owns the content semantics: hover previews are named
2475
+ non-modal groups, and click surfaces are non-modal dialogs. `<PopoverContent>` keeps the
2476
+ shared `surface` axis, and `keepDockOpen` serves both roots. On a coarse pointer a hover
2477
+ popover becomes tap-to-toggle. **Tooltip stays its own component**, since its naming
2478
+ (`aria-describedby`, `role="tooltip"`, non-focusable content) is a different mechanism.
2479
+ Clean break, no alias.
2531
2480
 
2532
2481
  | Retired (5.0.0) | Survivor | Rename |
2533
2482
  |---|---|---|
2534
2483
  | `HoverPopover` (`@mkbabb/glass-ui/hover-popover`) | `Popover` (`@mkbabb/glass-ui/popover`) | `<HoverPopover content side align>…</HoverPopover>` → `<Popover trigger="hover"><PopoverTrigger as-child>…</PopoverTrigger><PopoverContent :side>…</PopoverContent></Popover>` |
2535
- | `HoverCard` / `HoverCardTrigger` / `HoverCardContent` (`@mkbabb/glass-ui/hover-card`) | `Popover` / `PopoverTrigger` / `PopoverContent` | `<HoverCard>…</HoverCard>` → `<Popover trigger="hover">…</Popover>`; `<HoverCardContent>` → `<PopoverContent aria-label="…">` (the reka `HoverCardRoot` substrate is PRESERVED — imported by the union's fine-hover branch) |
2484
+ | `HoverCard` / `HoverCardTrigger` / `HoverCardContent` (`@mkbabb/glass-ui/hover-card`) | `Popover` / `PopoverTrigger` / `PopoverContent` | `<HoverCard>…</HoverCard>` → `<Popover trigger="hover">…</Popover>`; `<HoverCardContent>` → `<PopoverContent aria-label="…">` |
2536
2485
  | `hoverOpenDelay` prop | `openDelay` prop | `:hover-open-delay="80"` → `:open-delay="80"` |
2537
2486
  | `./hover-popover` subpath export | `./popover` | delete the import spec; import `Popover`/`PopoverTrigger`/`PopoverContent` from `@mkbabb/glass-ui/popover` |
2538
2487
  | `./hover-card` subpath export | `./popover` | as above |
2539
- | `hover-popover.css` substrate sheet (`.hover-popover-panel` / `.hover-popover-label`) | none | the union content rides the shared `glass-floating` + `glass-reveal` recipe; the bespoke panel substrate is deleted |
2540
-
2541
- The trigger chooses the role; callers cannot create a hover dialog or a click-triggered
2542
- group whose `aria-haspopup` promises the wrong target. Cross-repo: the `words` hover-card
2543
- ×12-13 migration + the `atlas` `EasterEgg.vue` hover-popover fold ride the `^5.0.0`
2544
- peer-bump asks (`docs/tranches/BI/coordination/asks-and-consumes.md`, filed by
2545
- W-FACTOR-ASKS). Machine-locked by `proof:fold-delete` (overlay clause: retired
2546
- dir/subpath/export absent ×2, no consumer import, survivor `Popover` present) + the
2547
- WCAG 1.4.13 / coarse-pointer / focus-return π (rides the B-close gestalt ceremony).
2548
-
2549
- ### BI.W-COMPOSITIONS-PRUNE — the demo storybook prunes 5 misfiled single-component demos out of the `compositions` band
2550
-
2551
- No consumer API change (demo-only IA). The storybook `compositions` band is for REAL SCENES —
2552
- components composed into a surface they were built for (auth-shell, settings, empty-states,
2553
- form-validation, gate-pattern, the story chassis). Five registrations were SINGLE-library-family
2554
- demos misfiled there; each carries an `@mkbabb/glass-ui/*` subpath (one library family owns it), so it
2555
- belongs on that family's band. `proof:demo`'s compositions-census (CP1) enforces this: a surviving
2556
- `compositions/*` story must carry a `/compositions/*` ROUTE-path subpath, never a library subpath.
2557
-
2558
- | demo | was | now |
2559
- |---|---|---|
2560
- | Configurator | `/compositions/configurator` | `/containers/configurator` |
2561
- | Instrument Chassis | `/compositions/instrument-chassis` | `/data/instrument-chassis` |
2562
- | Labeled Field | `/compositions/labeled-field` | `/forms/labeled-field` |
2563
- | Drawer Live-Behind | `/compositions/drawer-live-behind` | folded into `/containers/drawer` (a Live-behind mode section — one comprehensive Drawer page: snap · fixed · live-behind) |
2564
-
2565
- The listed surviving subpaths (`@mkbabb/glass-ui/{configurator,instrument-chassis,labeled-field,drawer}`)
2566
- are unchanged by this demo-only relocation. Retired demo paths resolve to the semantic 404; use the current
2567
- routes in the table above. The Tooltip-family break is documented separately above.
2568
-
2569
- ### BI.W-HERO-DEMOTE — the standalone `/compositions/hero` demo is demoted to the `/compositions` section landing
2570
-
2571
- No consumer API change (demo-only IA). The standalone `compositions/hero` storybook page (UF-K2 — "what even
2572
- is /compositions/hero — this likely needs to be removed or made not a full category item, a sub-page instead")
2573
- DUPLICATED the `/compositions` D1 section landing: the chassis already renders the real-scene bento (the composed
2574
- scenes as tiles) over the section hero, and the landing subtitle carries the "Real scenes" identity. So the
2575
- standalone story is RETIRED — no `compositions/hero` manifest row/route and `demo/stories/compositions/hero.vue`
2576
- is deleted; `/compositions` renders the bento landing directly. The audacious flourishes (the `heroScale:"mega"`
2577
- rung + the ℱ ornament) were page-specific decoration and die with the page — the section landing keeps the uniform
2578
- D1 `hero` rung across all 11 categories (no per-category special-casing). `proof:demo`'s HD arm enforces the
2579
- demotion (no standalone row/route + `hero.vue` DEFINITION-ABSENT); `proof:compositions-hero` witnesses the SFC
2580
- stays retired.
2581
-
2582
- | demo | was | now |
2583
- |---|---|---|
2584
- | Hero (Real scenes) | `/compositions/hero` (standalone `heroScale:"mega"` story) | the `/compositions` section landing (the real-scene bento hero) |
2488
+ | `hover-popover.css` substrate sheet (`.hover-popover-panel` / `.hover-popover-label`) | none | the popover content rides the shared `glass-floating` + `glass-reveal` recipe |
2585
2489
 
2586
- The retired `/compositions/hero` path resolves to the semantic 404; `/compositions` is the canonical landing.
2490
+ The trigger chooses the role, so a caller cannot create a hover dialog or a
2491
+ click-triggered group whose `aria-haspopup` promises the wrong target.
2587
2492
 
2588
- ### BI.W-MENU-TRIGGER — ContextMenu folds onto the Menu family as `trigger="context"`
2493
+ ### ContextMenu folds onto the Menu family as `trigger="context"`
2589
2494
 
2590
- The Kronecker fold (UF-P7 / FAM-10): ContextMenu owns NO distinct mechanism vs
2591
- DropdownMenu — identical reka roving-focus + typeahead and the same row treatment. So the
2592
- whole `ContextMenu*` family collapses onto the Menu
2593
- (`DropdownMenu*`) family with a `trigger` axis (`click` default · `context`) that switches
2594
- the reka anchoring family internally (`context` → the reka `ContextMenu*` substrate at the
2595
- pointer; `click` → the reka `DropdownMenu*` substrate at the button). ONE menu engine, one
2596
- set of items — the trigger is paint/anchoring, not mechanism. `v-model:open` round-trips in
2597
- both modes. **Select (listbox) and Combobox (combobox) SURVIVE** the census (distinct ARIA
2598
- roles + keyboard models); **Command SURVIVES** as its own command-palette root. Clean break,
2599
- no alias — every consumer re-points by name.
2495
+ ContextMenu shared DropdownMenu's mechanism (the same roving focus, typeahead and rows),
2496
+ so the `ContextMenu*` family collapses onto the `DropdownMenu*` family with a `trigger`
2497
+ axis (`click` default, or `context`). `context` anchors the menu at the pointer through
2498
+ reka's `ContextMenu*` substrate; `click` anchors it at the button. `v-model:open` works in
2499
+ both modes. Select, Combobox and Command stay separate. Clean break, no alias.
2600
2500
 
2601
2501
  | Retired (5.0.0) | Survivor | Rename |
2602
2502
  |---|---|---|
2603
2503
  | `ContextMenu` / `ContextMenuTrigger` / `ContextMenuContent` / …Item / …CheckboxItem / …RadioItem / …RadioGroup / …Label / …Separator / …Shortcut / …Sub* (`@mkbabb/glass-ui/context-menu`) | `DropdownMenu` / `DropdownMenuTrigger` / `DropdownMenuContent` / … (`@mkbabb/glass-ui/dropdown-menu`) | `<ContextMenu><ContextMenuTrigger>…</ContextMenuTrigger><ContextMenuContent>…</ContextMenuContent></ContextMenu>` → `<DropdownMenu trigger="context"><DropdownMenuTrigger>…</DropdownMenuTrigger><DropdownMenuContent>…</DropdownMenuContent></DropdownMenu>` (rename `ContextMenu*` → `DropdownMenu*` at every node; add `trigger="context"` on the root) |
2604
2504
  | `./context-menu` subpath export | `./dropdown-menu` | delete the import spec; import the `DropdownMenu*` family from `@mkbabb/glass-ui/dropdown-menu` |
2605
2505
 
2606
- The `--dropdown-menu-{bg,border,shadow}` consumer-retunable tokens (value.js L11) join the
2607
- existing `--dropdown-menu-font` on `.dropdown-menu-content` (menu.css) — ONE menu-plate
2608
- token surface a consumer retunes via a `:root` override, no-op at its default. Machine-locked
2609
- by `proof:fold-delete` (menu clause: retired dir/subpath/export absent, no consumer import,
2610
- survivor `DropdownMenu` present) + the roving-focus/typeahead-parity π (`trigger=context`
2611
- right-click reads identically to `trigger=click`, Chrome + WebKit, both modes; rides the
2612
- B-close gestalt ceremony). No cross-repo ContextMenu consumer in the round-2b roster
2613
- (invariant-11 probe confirmed at execution).
2614
-
2615
- ### BI.W-MULTISELECT-FOLD — MultiSelect folds onto `<Combobox multiple>`
2616
-
2617
- > [BK #81 W-PICKER, 2026-08-08 — **STRUCK IN PLACE, survivor column false.** This
2618
- > section, `src/index.ts` and `src/components/index.ts` all named `<Combobox>` (and
2619
- > `<ComboboxAnchor>` / `<ComboboxList>` / `<ComboboxItem>`) as the survivor. **No
2620
- > such component has ever existed in this library**, at any version — detector:
2621
- > `rg -n "export .*\bCombobox\b" src/index.ts src/forms.ts` → 0 matches; the only
2622
- > `Combobox*` symbols on disk are reka-ui imports inside `components/command/` and
2623
- > the prop TYPES in `_shared/selection.ts`. The honest retirement is: **`ui/multi-
2624
- > select` retired, no replacement.** The mechanism does ship — reka's `ComboboxRoot`
2625
- > is `<Command>`'s substrate, and `multiple` now genuinely reaches it through
2626
- > `<Command>`'s attribute forward (landed this row) — so a multi-select is a
2627
- > composition a consumer builds, not a component the library hands over. The
2628
- > "machine-locked by `proof:fold-delete` (survivor Combobox `multiple` capability
2629
- > present)" clause could never have held; the surviving pin is
2630
- > `tests/components/select.contract.test.ts`'s `"multiple" extends keyof
2631
- > SelectProps → false`, which is real and stays.]
2632
-
2633
- The Kronecker fold (D-FACTOR PASS-1 §B): `MultiSelect` was a `Popover` + `Command`
2634
- composition over the SAME Combobox-family mechanism (a filtered listbox with a
2635
- selection model) — no distinct mechanism, so it folds onto `<Combobox multiple>`. reka's
2636
- `ComboboxRoot` carries `multiple` natively (an array `v-model` + `by` comparison); the
2637
- selected values render as **chips-in-trigger** via the shared glass-chip capsule register
2638
- (the TagsInput chip register — `.glass-chip .glass-capsule`), read from the forwarded
2639
- root `modelValue` slot state. `MultiSelect` was a root-barrel-only export (NO subpath at
2640
- HEAD), so there is no `./multi-select` package export to retire. Clean break, no alias.
2506
+ The `--dropdown-menu-{bg,border,shadow}` tokens join `--dropdown-menu-font` on
2507
+ `.dropdown-menu-content`, so a consumer retunes the menu plate with one `:root`
2508
+ override. (8.0.0 later renamed the family's subpath to `./menu`, and 11.0.0 gives the
2509
+ context menu its own `ContextMenu` root again; see those sections.)
2641
2510
 
2642
- | Retired (5.0.0) | Survivor | Rename |
2643
- |---|---|---|
2644
- | `MultiSelect` / `MultiSelectOption` (root barrel `@mkbabb/glass-ui`) | `Combobox` (+ `multiple`) (`@mkbabb/glass-ui/forms`) | `<MultiSelect v-model="arr" :options="opts" placeholder="…" :max-display="3" />` → `<Combobox v-model="arr" multiple>`, composing `<ComboboxAnchor>` (render selected chips-in-trigger from the `modelValue` slot on the glass-chip capsule register) + `<ComboboxList>` / `<ComboboxInput>` / `<ComboboxItem :value>` (the same filtered items). The prior `:options` array becomes explicit `<ComboboxItem>`s; `:max-display` has no analogue (the chips-in-trigger wrap, they do not collapse to `(+N)`). |
2511
+ ### MultiSelect is removed
2645
2512
 
2646
- The single-select `<Combobox>` (multiple unset) is byte-identical — the `multiple` prop is
2647
- additive on the shared root. No cross-repo consumer: `MultiSelect` was demo-only at HEAD
2648
- (the invariant-11 registry + foreign-tree probe found 0 external consumers). Machine-locked
2649
- by `proof:fold-delete` (multiselect clause: retired `ui/multi-select` dir absent, survivor
2650
- Combobox `multiple` capability present) + the a11y-axe multiple-arm (selected-option
2651
- announcements) + the story-fold π (the chips-in-trigger read, both modes; rides the B-close
2652
- gestalt ceremony).
2513
+ `MultiSelect` and `MultiSelectOption` (root barrel only, no subpath) are removed with no
2514
+ replacement component. Earlier text here named a `<Combobox multiple>` survivor, but the
2515
+ library has never exported a `Combobox` component. A multi-select is a composition you
2516
+ build: reka's `ComboboxRoot` is `<Command>`'s substrate, and `multiple` reaches it through
2517
+ `<Command>`'s attribute forward, so `<Command multiple>` with your own chips in the
2518
+ trigger is the shape. `Select` does not take `multiple`.
2653
2519
 
2654
- ### BI.W-CHIP-FOLD — one explicit `<Chip>` family
2520
+ ### One explicit `<Chip>` family
2655
2521
 
2656
- `<Chip>` is the single compact plate/control family. Its independent axes are
2522
+ `<Chip>` is the single compact plate and control family. Its independent axes are
2657
2523
  `mode: static | selectable | action | removable`, `shape: pill | cell | icon`, `size`,
2658
2524
  `tone`, and `surface`. Static is the default and renders an inert `<span>` with no role,
2659
2525
  focus, pressed state, pointer cursor, or forwarded listeners. Selectable uses toggle
2660
2526
  semantics, action is a native button, and removable keeps an inert root with one named
2661
2527
  remove button. Shape controls geometry only; `shape="icon"` accepts a slotted glyph rather
2662
- than owning icon rendering. `Badge` remains a distinct static label. Clean
2663
- break, no alias.
2528
+ than owning icon rendering. `Badge` remains a distinct static label. Clean break, no
2529
+ alias.
2664
2530
 
2665
2531
  | Retired (5.0.0) | Survivor | Rename |
2666
2532
  |---|---|---|
2667
2533
  | `ToggleChip` (`@mkbabb/glass-ui/toggle-chip`) | `Chip` (`@mkbabb/glass-ui/chip`) | `<ToggleChip v-model="on" variant="chip">…</ToggleChip>` → `<Chip v-model="on" mode="selectable" shape="pill">…</Chip>`; `variant="cell"` → `shape="cell"`. |
2668
2534
  | `SelectableChip` (`@mkbabb/glass-ui/selectable-chip`) | `Chip` (`@mkbabb/glass-ui/chip`) | `<SelectableChip v-model="on" :tone="t">…</SelectableChip>` → `<Chip v-model="on" mode="selectable" :tone="t">…</Chip>`. |
2669
2535
  | `toggleChipVariants` / `ToggleChipVariants` (`/toggle-chip`) | `chipVariants` / `ChipVariants` (`/chip`) | Rename the recipe and type; the recipe axes are now `interactive × size × shape`. |
2670
- | `./toggle-chip` + `./selectable-chip` subpath exports | `./chip` | delete the import specs; import `Chip` / `chipVariants` from `@mkbabb/glass-ui/chip` (a value.js-bearing subpath — NOT re-added to the root barrel) |
2536
+ | `./toggle-chip` + `./selectable-chip` subpath exports | `./chip` | delete the import specs; import `Chip` / `chipVariants` from `@mkbabb/glass-ui/chip` (not on the root barrel) |
2671
2537
 
2672
- The `/chip` subpath remains value.js-light: concrete colors resolve through the existing
2673
- lazy accent-tone solver while CSS variables stay on the synchronous path.
2538
+ The `/chip` subpath stays light: concrete colours resolve through the lazy accent-tone
2539
+ solver while CSS variables stay on the synchronous path.
2674
2540
 
2675
- ### BI.W-SURFACE-EXTRACT — `CardTier` folds onto the `surface` axis
2541
+ ### `CardTier` folds onto the `surface` axis
2676
2542
 
2677
- The bare (tier × decoration) glass plate is extracted as `<Surface>` (published at
2678
- `@mkbabb/glass-ui/surface`); `Card`'s legacy tier spellings fold onto the same axis.
2543
+ The bare tier-and-decoration glass plate is extracted as `<Surface>` (published at
2544
+ `@mkbabb/glass-ui/surface`), and `Card`'s old tier spellings fold onto the same axis.
2679
2545
  Clean break, no alias.
2680
2546
 
2681
2547
  | Retired (5.0.0) | Replacement |
@@ -2684,589 +2550,362 @@ Clean break, no alias.
2684
2550
  | `CardTier` `"deep"` (tier prop spelling) | `deep` on `Card`/`Surface` |
2685
2551
 
2686
2552
  Card's former `surface="cartoon"` superset is now the explicit `cartoon` boolean;
2687
- `surface` accepts only the shared `glass | veil | opaque` material axis. The demo-only
2688
- `ScrollCard` and `ScrollCardHeader` wrappers are removed; compose `Card` with
2553
+ `surface` accepts only the shared `glass | veil | opaque` material axis. The `ScrollCard`
2554
+ and `ScrollCardHeader` wrappers are removed; compose `Card` with
2689
2555
  `class="card-scroll-host"` and `CardHeader shrink` where the live timeline is needed.
2690
2556
 
2691
- Machine-locked by `proof:surface-axis` W7/W8 (the wart census is zero + `<Surface>`
2692
- publishes; the private-union floor holds).
2557
+ ### The `surface="clear"` member is removed
2693
2558
 
2694
- ### BI.W-CLEAR-FOLD — the dead `surface="clear"` member retired
2695
-
2696
- The `surface="clear"` decoration member (BE.W-CLEAR-VARIANT — the Apple-Clear
2697
- maximally-translucent plate + its mandatory `::before` legibility scrim) is RETIRED as
2698
- dead substrate: a full mechanism with ZERO binding consumers (0 in-repo + 0 across
2699
- atlas / speedtest / slides / value.js / keyframes.js at npm 4.2.0 — the substrate-
2700
- without-consumer invariant J-inv-10). Clean break, no alias.
2559
+ The `surface="clear"` member (a maximally translucent plate with a mandatory legibility
2560
+ scrim) had no consumer, so it is removed. Clean break, no alias.
2701
2561
 
2702
2562
  | Retired (5.0.0) | Replacement |
2703
2563
  |---|---|
2704
- | `surface="clear"` (Surface union member) | none — the member is gone; use `surface="glass"` (the maximal translucent default) or `surface="veil"` (the borderless text plate) |
2705
- | `--glass-bg-clear` / `--glass-opacity-clear` tokens | none (rung census 11→10; the `.glass-clear` decoration + the `[data-surface="clear"]` scrim rule die with the member) |
2706
-
2707
- No paint changes for any surviving surface (a dead member painted nowhere). No consumer
2708
- migration is owed — the 0-consumer state was verified at the retire (the inv-11 registry +
2709
- foreign-tree probe). Machine-locked by `proof:surface-axis` **W9** (member-consumption:
2710
- every `Surface` union member resolves ≥1 real non-demo/non-self consumer in `src/` OR is
2711
- DEFINITION-ABSENT — the vacuous-green a dead member used to ride is closed) + the coupled
2712
- retirement of `proof:glass-foundation`'s A3 clear arm (the gate that verified the member
2713
- dies WITH it) + the `proof:encapsulation` G2 3-member re-green.
2714
-
2715
- ### BI.W-DIALOG-PLACEMENT — Sheet folds onto `<Dialog placement>`; ConfirmDialog → a Dialog preset
2716
-
2717
- The Kronecker fold (D-FACTOR FACTOR-B): `Sheet` was the SAME reka `DialogRoot` + the
2718
- SAME FocusScope as Dialog — its side-slide is PAINT, not a distinct mechanism — so it
2719
- folds onto a `<DialogContent placement="center | top | right | bottom | left">` axis
2720
- (`center` default = the byte-identical centered modal; the four side values are the
2721
- retired Sheet sides). The per-side rounding/border are the retired `sheetVariants`
2722
- decoration arms verbatim; the slide GEOMETRY is byte-identical but the motion is now the
2723
- interruptible spring (not the `sheet-animate` keyframe); the structural positioning ships
2724
- PRECOMPILED off `[data-slot="dialog-content"][data-placement]` (`dialog-placement.css`,
2725
- the renamed `sheet.css`). **`ConfirmDialog` DEMOTES to a Dialog preset** — its
2726
- promise/`v-model:open` opener was thin (a glass `<DialogContent :show-close="false">` +
2727
- a title/description + a confirm/cancel footer + a loading dismiss-guard), a CONSUMER
2728
- composition now (presets live in consumers), not a shipped component. Clean break, no
2729
- alias.
2564
+ | `surface="clear"` (Surface union member) | none; use `surface="glass"` (the translucent default) or `surface="veil"` (the borderless text plate) |
2565
+ | `--glass-bg-clear` / `--glass-opacity-clear` tokens | none (the `.glass-clear` decoration and the `[data-surface="clear"]` scrim rule go with the member) |
2566
+
2567
+ No surviving surface changes paint.
2568
+
2569
+ ### Sheet folds onto `<Dialog placement>`, and ConfirmDialog becomes a Dialog preset
2730
2570
 
2731
- **THE N3 DISAMBIGUATION RULE:** `Dialog[placement]` is NOT `Drawer`. **Drawer SURVIVES** —
2732
- it owns the snap-detent spring physics + the live-behind non-modal focus model + a
2733
- keyframes-bearing chunk (a mechanism no survivor expresses). A side sheet with no detents
2734
- is `<Dialog placement="right">`; a detented bottom sheet over a live surface is `<Drawer>`.
2735
- Placement is a Dialog paint axis; snap-physics is Drawer's mechanism — disjoint, never a
2736
- third fork. Sheet's `dragDismiss` gesture does NOT carry into the fold (it was the JS
2737
- slide-spring — Drawer's mechanism).
2571
+ `Sheet` was the same reka `DialogRoot` and focus scope as Dialog, with a side slide on
2572
+ top, so it folds onto `<DialogContent placement="center | top | right | bottom | left">`.
2573
+ `center` is the default centred modal; the four sides are the old Sheet sides, with the
2574
+ same rounding, border and slide geometry, now moved by the interruptible spring. The
2575
+ positioning ships precompiled in `dialog-placement.css` (the renamed `sheet.css`).
2576
+ **`ConfirmDialog` becomes a preset you compose**: a glass `<DialogContent
2577
+ :show-close="false">` with a title, a description, a confirm and cancel footer, and a
2578
+ loading guard on dismiss. Clean break, no alias.
2579
+
2580
+ At 5.0.0 `Drawer` stays: it owns the snap-detent physics and the live-behind non-modal
2581
+ focus model. A side sheet with no detents is `<Dialog placement="right">`; a detented
2582
+ bottom sheet over a live surface is `<Drawer>`. Sheet's `dragDismiss` does not carry into
2583
+ the fold. (8.0.0 later folds `Drawer` into `Sheet`; see _Package subpaths_ under 8.0.0.)
2738
2584
 
2739
2585
  | Retired (5.0.0) | Survivor | Rename |
2740
2586
  |---|---|---|
2741
2587
  | `Sheet` / `SheetTrigger` / `SheetContent` / `SheetHeader` / `SheetTitle` / `SheetDescription` / `SheetFooter` / `SheetClose` (`@mkbabb/glass-ui/sheet`) | `Dialog` / `DialogTrigger` / `DialogContent` / `DialogHeader` / `DialogTitle` / `DialogDescription` / `DialogFooter` / `DialogClose` (`@mkbabb/glass-ui/dialog`) | `<Sheet>…<SheetContent side="right">` → `<Dialog>…<DialogContent placement="right">`; every `Sheet*` sub-part → its `Dialog*` twin (same slot shape) |
2742
- | `<SheetContent side="top\|right\|bottom\|left">` | `<DialogContent placement="…">` | `side="right"` → `placement="right"` (the prop renames; `placement="center"` is the new default centered modal) |
2743
- | `<SheetContent dragDismiss dragThreshold>` | `<Drawer>` (snap physics) | a drag-dismissable bottom sheet is a `Drawer` (detents + live-behind), not a placement Dialog — re-point to the Drawer family |
2744
- | `SheetVariants` (type, `/sheet`) | `Placement` axis (`@mkbabb/glass-ui`) | `SheetVariants['side']` → `Placement` (`"center" \| "top" \| "right" \| "bottom" \| "left"`); no successor CVA type (placement is an axis restriction, not a `variant` map) |
2745
- | `ConfirmDialog` (`@mkbabb/glass-ui/confirm-dialog`) | `Dialog` preset (consumer composition) | `<ConfirmDialog v-model:open title description confirm-label destructive :loading @confirm>` → a `<Dialog v-model:open><DialogContent surface="glass" :show-close="false" @escape-key-down @interact-outside>` with a `<DialogHeader>` title/description + a `<DialogFooter>` cancel/confirm `<Button>` pair (the confirm reads `tone="destructive"` when destructive — the tone axis, see BI.W-BUTTON-TONE below; the loading guard `preventDefault`s the dismiss intents while in-flight) — the demo `feedback/confirm-dialog` story shows the full preset inline |
2588
+ | `<SheetContent side="top\|right\|bottom\|left">` | `<DialogContent placement="…">` | `side="right"` → `placement="right"` (`placement="center"` is the default centred modal) |
2589
+ | `<SheetContent dragDismiss dragThreshold>` | `<Drawer>` (snap physics) | a drag-dismissable bottom sheet is a `Drawer`, not a placement Dialog |
2590
+ | `SheetVariants` (type, `/sheet`) | `Placement` axis (`@mkbabb/glass-ui`) | `SheetVariants['side']` → `Placement` (`"center" \| "top" \| "right" \| "bottom" \| "left"`); no successor CVA type |
2591
+ | `ConfirmDialog` (`@mkbabb/glass-ui/confirm-dialog`) | `Dialog` preset (consumer composition) | `<ConfirmDialog v-model:open title description confirm-label destructive :loading @confirm>` → a `<Dialog v-model:open><DialogContent surface="glass" :show-close="false" @escape-key-down @interact-outside>` with a `<DialogHeader>` title/description and a `<DialogFooter>` cancel/confirm `<Button>` pair (the confirm reads `tone="destructive"` when destructive, see the next section; the loading guard calls `preventDefault` on the dismiss intents while in flight) |
2746
2592
  | `./sheet` subpath export | `./dialog` | delete the import spec; import from `@mkbabb/glass-ui/dialog` |
2747
- | `./confirm-dialog` subpath export | `./dialog` | as above — compose the confirm preset over `Dialog` |
2748
- | `sheet.css` (`[data-slot="sheet-content"][data-side]`) | `dialog-placement.css` (`[data-slot="dialog-content"][data-placement]`) | the precompiled overlay-positioning file renames; the `:where()` consumer-override specificity is unchanged |
2749
-
2750
- The folded side sheet reads the Dialog `--glass-bg-dialog` glass rung (the fold's whole
2751
- point — ONE dialog material; the retired Sheet read the floating rung — a plate-α shift,
2752
- NOT a slide-geometry change: the slide geometry is byte-identical, the motion the
2753
- interruptible spring). Dialog `variant`→`surface`
2754
- is the separate BA.W-SURFACE-AXIS clean break (documented above). Cross-repo: no external
2755
- `/sheet` or `/confirm-dialog` consumer found (the configurator gear-sheet is internal-demo,
2756
- ConfirmDialog was demo-only); the `^5.0.0` peer-bump ask covers any downstream importer
2757
- (`docs/tranches/BI/coordination/asks-and-consumes.md`, filed by W-FACTOR-ASKS). Machine-
2758
- locked by `proof:fold-delete` (dialog-sheet clause: retired `ui/sheet` +
2759
- `custom/confirm-dialog` dirs/subpaths/exports absent, no consumer import, survivor `Dialog`
2760
- present) + the edge-slide + focus-return π (Chrome + real WebKit, both modes; rides the
2761
- B-close gestalt ceremony).
2762
-
2763
- ### BI.W-BUTTON-TONE — `Button.destructive` migrates off `variant` onto the `tone` axis
2764
-
2765
- The Kronecker factorization reaches the library's oldest component (PASS-4B ruling 5 — "destructive
2766
- IS a tone"). `destructive` was a `variant` CVA member — but a destructive intent is a SEMANTIC TONE,
2767
- not a style/surface register, so it moves onto the ORTHOGONAL `tone` axis (`_shared/axes.ts`'s `TONES`
2768
- tuple, the ONE grammar home). `variant` is now STYLE-only (`default`/`primary-audacious`/`gold-audacious`/
2769
- `outline`/`secondary`/`accent`/`ghost`/`glass`/`glass-wash`/`ai`/`link`) — machine-locked by
2770
- `proof:variant-residual` (no tone/size/surface concept may hide in a `variant` map). The four-state
2771
- fill/hover/active/aria-pressed recipe moves VERBATIM onto the `tone.destructive` arm (the byte-identical
2772
- CVA rows); `tone="neutral"` is the tone-less default (the variant paints alone). Clean break, no alias.
2773
- `ButtonVariants['tone']` publishes on `/api` in lockstep (it re-derives off the CVA `tone` map — no
2774
- separate api edit).
2593
+ | `./confirm-dialog` subpath export | `./dialog` | as above; compose the confirm preset over `Dialog` |
2594
+ | `sheet.css` (`[data-slot="sheet-content"][data-side]`) | `dialog-placement.css` (`[data-slot="dialog-content"][data-placement]`) | the precompiled positioning file renames; its `:where()` override specificity is unchanged |
2595
+
2596
+ A side dialog reads the Dialog glass rung `--glass-bg-dialog` (the old Sheet read the
2597
+ floating rung), so its plate alpha shifts slightly; the slide geometry is unchanged.
2598
+
2599
+ ### `Button` `destructive` moves off `variant` onto the `tone` axis
2600
+
2601
+ A destructive intent is a semantic tone, not a style, so it moves onto the `tone` axis.
2602
+ `variant` is now style-only (`default`/`primary-audacious`/`gold-audacious`/`outline`/
2603
+ `secondary`/`accent`/`ghost`/`glass`/`glass-wash`/`ai`/`link`). The destructive fill,
2604
+ hover, active and pressed paint moves unchanged onto `tone="destructive"`, and
2605
+ `tone="neutral"` is the default. Clean break, no alias.
2775
2606
 
2776
2607
  | Retired (5.0.0) | Survivor | Rename |
2777
2608
  |---|---|---|
2778
- | `<Button variant="destructive">` | `<Button tone="destructive">` | the destructive register is a `tone`, not a `variant`; `variant` is reserved for STYLE members. `tone` composes ORTHOGONALLY (a destructive `outline`/`ghost` is now expressible: `<Button variant="outline" tone="destructive">`) |
2779
- | `ButtonVariants['variant']` member `"destructive"` | `ButtonVariants['tone']` member `"destructive"` | the CVA `variant` map DROPS `destructive`; the CVA `tone` map ADDS it (`"neutral" \| "destructive"`, default `neutral`) |
2780
-
2781
- Cross-repo: the consumer call-site migration (`<Button variant="destructive">` → `<Button tone="destructive">`
2782
- in words/atlas/muster/sci-report, paired with the kf `^5.2.0` + value `^3.1.0` peer bump) is filed by
2783
- `BI.W-FACTOR-ASKS` on the `docs/tranches/BI/coordination/asks-and-consumes.md` roster. Machine-locked by
2784
- `proof:variant-residual` (the `button:destructive` residual GREENs when `destructive` is a `tone` value +
2785
- DEFINITION-ABSENT from the `variant` map) — jointly with `BI.W-SYNONYM-RENAMES` (the alert/badge tone
2786
- residuals). The tone byte-diff rides `W-SYNONYM-RENAMES-DELTA.md` + the B-close gestalt ceremony.
2609
+ | `<Button variant="destructive">` | `<Button tone="destructive">` | `tone` composes with any style, so a destructive outline or ghost button is now expressible: `<Button variant="outline" tone="destructive">` |
2610
+ | `ButtonVariants['variant']` member `"destructive"` | `ButtonVariants['tone']` member `"destructive"` | the CVA `variant` map drops `destructive`; the CVA `tone` map adds it (`"neutral" \| "destructive"`, default `neutral`) |
2787
2611
 
2788
- ### BI.W-SYNONYM-RENAMES — the library-wide synonym-rename law (`type`/`variant` tone · `direction` · `position` · `ToastVariant`)
2612
+ ### Synonym renames: `type`/`variant` tone, `direction`, `position` and `ToastVariant`
2789
2613
 
2790
- The synonym-de-duplication law (UF-P7; FAM-10 mechanism-distinctness — a synonym is a name-duplicate, not a
2791
- distinct mechanism). Every rename is a NAME rename with ZERO value change (byte-identical paint); the `/api`
2792
- surface moves in lockstep (the old synonym name is DEFINITION-ABSENT, no alias, no dual path).
2614
+ Each of these is a name change with no paint change, and the old name has no alias.
2793
2615
 
2794
- **Tone axis** — the semantic status register (success/warning/info/destructive + neutral) moves off the
2795
- `type`/`variant` maps onto the ONE shared `tone` axis (`_shared/axes.ts`'s `TONES` tuple), machine-locked by
2796
- `proof:variant-residual` (no tone concept may hide in a `variant`/`type` map). Byte-identical paint: each tone
2797
- still resolves the SAME classes/`.feedback-tone-<name>` register.
2616
+ **The tone axis.** The status register (success, warning, info, destructive, and neutral)
2617
+ moves off the `type` and `variant` maps onto the one shared `tone` axis. Each tone still
2618
+ resolves the same `.feedback-tone-<name>` classes.
2798
2619
 
2799
2620
  | Retired (5.0.0) | Survivor | Rename |
2800
2621
  |---|---|---|
2801
- | `<Alert variant="destructive\|success\|warning\|info">` | `<Alert tone="…">` | the CVA `variant` map → a `tone` map; `variant:'default'` → `tone:'neutral'` (the un-toned glass-wash base). `Alert` now emits `:data-tone` |
2802
- | `<Badge variant="destructive\|success\|warning\|info">` | `<Badge tone="…">` | `variant` stays STYLE-only (`default`/`secondary`/`outline`); a new orthogonal `tone` map carries the semantics (`tone` declared AFTER `variant` so a set tone wins the `cn` merge — byte-identical). `Badge` emits `:data-tone`; the glass register keys off `.badge-atom--glass[data-tone='…']` (glass-atom.css re-keyed) |
2803
- | `Toast.variant?: ToastVariant` (`'default'\|'destructive'\|…`) | `Toast.tone?: Tone` | the private `ToastVariant` union RETIRED — the toast status reads the ONE shared `Tone` axis (`default` → `neutral`). `Toast` emits `:data-tone`. `ToastVariant` export DROPPED from `/api` (`src/api/index.ts`) + the toast barrel; the tone type publishes as `Tone` via `@mkbabb/glass-ui/axes` |
2804
- | `Notification` item `type: 'success'\|'error'\|'info'\|'warning'` | item `tone: 'success'\|'warning'\|'info'\|'destructive'` | the `type` synonym → `tone` (a TONES subset); `error` was `destructive`'s synonym → folded (clean break). Zero paint change (same `.feedback-tone-<name>`) |
2622
+ | `<Alert variant="destructive\|success\|warning\|info">` | `<Alert tone="…">` | the CVA `variant` map becomes a `tone` map; `variant:'default'` → `tone:'neutral'`. `Alert` now emits `:data-tone` |
2623
+ | `<Badge variant="destructive\|success\|warning\|info">` | `<Badge tone="…">` | `variant` stays style-only (`default`/`secondary`/`outline`); a new `tone` map carries the semantics. `Badge` emits `:data-tone`, and the glass register keys off `.badge-atom--glass[data-tone='…']` |
2624
+ | `Toast.variant?: ToastVariant` (`'default'\|'destructive'\|…`) | `Toast.tone?: Tone` | `ToastVariant` is removed; the toast reads the shared `Tone` axis (`default` → `neutral`), published from `@mkbabb/glass-ui/axes`. `Toast` emits `:data-tone` |
2625
+ | `Notification` item `type: 'success'\|'error'\|'info'\|'warning'` | item `tone: 'success'\|'warning'\|'info'\|'destructive'` | `type` → `tone`; `error` becomes `destructive` |
2805
2626
 
2806
- **Orientation / Placement axis** — the layout/side synonyms fold onto the shared axis vocabulary:
2627
+ **Orientation and placement.**
2807
2628
 
2808
2629
  | Retired (5.0.0) | Survivor | Rename |
2809
2630
  |---|---|---|
2810
- | `<StackedIconGroup direction="horizontal\|vertical">` | `<StackedIconGroup orientation="…">` | `direction` → the shared `orientation` vocabulary (`StackedIconGroupProps.direction` → `.orientation`; `:data-direction` → `:data-orientation`, the SFC CSS re-keyed). Zero value change |
2811
- | `HeaderRibbon.position?: HeaderRibbonPosition` (`'left'\|'right'`) | `HeaderRibbon.placement?: HeaderRibbonPlacement` | `position` → the shared `placement` vocabulary (a PLACEMENTS subset); the type `HeaderRibbonPosition` → `HeaderRibbonPlacement` (published on `/header-ribbon`). Zero value change |
2812
-
2813
- Cross-repo: the consumer call-site migration (words/atlas/muster/sci-report, paired with the `^5.0.0` peer
2814
- bump) is filed by `BI.W-FACTOR-ASKS` on `docs/tranches/BI/coordination/asks-and-consumes.md`. Machine-locked by
2815
- `proof:variant-residual` (the alert/badge tone residuals GREEN) — jointly with `BI.W-BUTTON-TONE`. The
2816
- `register`→`size` (SelectTrigger, already `size`) + `ToggleChip.variant`→`shape` (BI.W-CHIP-FOLD) rows of the
2817
- law are recorded in their own waves. Distinct-mechanism holdouts (NOT synonyms — flagged as riders, not
2818
- renamed): `SortableList.axis` (`x\|y` drag-axis, not orientation), `DockStack.position` (`start\|end`
2819
- alignment), `MetricStack.register` (`audacious\|result` display-mode, would break `size-grammar`),
2820
- `Toaster.position` (corner anchor), `Drawer.direction` (reka/vaul forward prop). The tone/orientation byte-diff
2821
- rides `W-SYNONYM-RENAMES-DELTA.md` + the B-close gestalt ceremony.
2822
-
2823
- ### BI.W-GLASS-DEDUP — `GlassPanel` retires onto `Card` / `<Surface>` / `.glass-resting`
2824
-
2825
- > **The refraction half of this entry is STRUCK.** `.glass-lens` / `#glass-refract` are
2826
- > themselves DELETED at 8.0.0 — see the §8.0.0 delete banner ("The `.glass-lens` refraction is
2827
- > DELETED — the class, the filter asset, and both root exports"). Every "re-point onto
2828
- > `.glass-lens`" below is struck; the surviving door is the `.glass-{wash,quiet,resting,floating,overlay}`
2829
- > blur+tint base, with NO refraction successor.
2830
-
2831
- The FAM-10 mechanism-distinctness ruling (UF-B2): `<GlassPanel>` owned NO distinct mechanism — its tier map
2832
- was Card's, its surface was the shared `surface` resolver, and its `useGlassRenderer`/`createGlassFilter`
2833
- JS-canvas `feDisplacementMap` was a SECOND refraction path. A slotless glass surface needs no component:
2834
- `<Surface tier surface>` (or the bare `class="glass-resting"` utility) serves the plate case. Clean
2835
- break, no alias — the component, its subpath, its `/api` type, its tier-proof gate, and the JS-canvas
2836
- refraction builder all retire together.
2631
+ | `<StackedIconGroup direction="horizontal\|vertical">` | `<StackedIconGroup orientation="…">` | `direction` → `orientation` (`:data-direction` → `:data-orientation`) |
2632
+ | `HeaderRibbon.position?: HeaderRibbonPosition` (`'left'\|'right'`) | `HeaderRibbon.placement?: HeaderRibbonPlacement` | `position` → `placement`; the type `HeaderRibbonPosition` → `HeaderRibbonPlacement` (published on `/header-ribbon`) |
2633
+
2634
+ These keep their names because they mean something different: `SortableList.axis` (the
2635
+ drag axis), `DockStack.position` (alignment), `MetricStack.register` (display mode),
2636
+ `Toaster.position` (corner anchor) and `Drawer.direction` (a forwarded reka prop).
2637
+
2638
+ ### `GlassPanel` retires onto `Card`, `<Surface>` and `.glass-resting`
2639
+
2640
+ `<GlassPanel>` shared Card's tier map and the shared surface resolver, and its JS-canvas
2641
+ `feDisplacementMap` was a second refraction path. A slotless glass surface needs no
2642
+ component: `<Surface tier surface>`, or the bare `class="glass-resting"`, serves the plate
2643
+ case. Clean break, no alias. (`.glass-lens`, which earlier text here named as the
2644
+ refraction successor, is itself deleted at 8.0.0, so there is no refraction path.)
2837
2645
 
2838
2646
  | Retired (5.0.0) | Survivor | Rename |
2839
2647
  |---|---|---|
2840
- | `GlassPanel` (`@mkbabb/glass-ui/glass-panel`) | `Card` / `<Surface>` / `class="glass-resting"` | `<GlassPanel tier="resting">…</GlassPanel>` → `<Surface tier="resting" surface="glass">…</Surface>` (or the bare `class="glass-resting"` on the plate); ~~a refraction case re-points onto `class="glass-lens"`~~ (struck — `.glass-lens` deleted at 8.0.0, see the §8.0.0 banner) |
2841
- | `GlassPanelProps` (type, `/api`) | none — retired outright | no successor type; `<Surface>` publishes `SurfaceProps` (the shared tier × surface axis) |
2648
+ | `GlassPanel` (`@mkbabb/glass-ui/glass-panel`) | `Card` / `<Surface>` / `class="glass-resting"` | `<GlassPanel tier="resting">…</GlassPanel>` → `<Surface tier="resting" surface="glass">…</Surface>` (or the bare `class="glass-resting"` on the plate) |
2649
+ | `GlassPanelProps` (type, `/api`) | none | `<Surface>` publishes `SurfaceProps` (the shared tier × surface axis) |
2842
2650
  | `./glass-panel` subpath export | `./card` / root `<Surface>` | delete the import spec; import `Card`/`Surface` from `@mkbabb/glass-ui` (root) or `@mkbabb/glass-ui/card` |
2843
- | `useGlassRenderer` / `createGlassFilter` / `destroyGlassFilter` (the JS-canvas refraction builder) | ~~`.glass-lens` / `#glass-refract` (the ONE declarative refraction door)~~ → none (struck — deleted at 8.0.0, see the §8.0.0 banner); the `.glass-{rung}` blur+tint base | ~~the refraction is the single `.glass-lens` opt-in on the SOTA-degrade ladder~~ — a bespoke JS `feDisplacementMap` builder is gone, and so is the declarative successor: there is NO refraction path |
2844
- | `.glass-card` (co-selector alias) | `.glass-resting` | fold the alias onto `.glass-resting` (pure co-selector; byte-identical) |
2845
-
2846
- Byte-diff: every GlassPanel-slot demo now mounting `<Surface>` / `class="glass-resting"` is 0-delta at the
2847
- shared tier rungs (GlassPanel's tier map ≡ Card's); ~~any refraction demo re-points `.glass-lens`~~ (struck —
2848
- `.glass-lens` deleted at 8.0.0, see the §8.0.0 banner; a refraction demo has no successor). Cross-repo:
2849
- the glass-panel usage (5 sites / 2 repos — **atlas ×3**, **sci-report ×2**) rides the `^5.0.0` peer-bump ask
2850
- (`docs/tranches/BI/coordination/asks-and-consumes.md` row 8, filed by `BI.W-FACTOR-ASKS`). The
2851
- `composables/glass/index.ts` keyframes.js-binds-`/glass-panel` claim was RE-PROBED read-only at HEAD — no live
2852
- sibling binds it, so the delete is silent-safe. Machine-locked by `proof:fold-delete` (glass-panel clause:
2853
- `custom/glass-panel/` dir + `/glass-panel` subpath + `GlassPanelProps` DEFINITION-ABSENT, no live `GlassPanel`
2854
- import in `src/`, survivor `.glass-resting`/`<Surface>` present — the residual package.json `./glass-panel`
2855
- export drop is the orchestrator regen) + `proof:no-dual-path` (single refraction door: builders=0) +
2856
- `proof:migration-truth` (the dead `GlassPanelProps→/glass-panel` re-home row removed).
2857
-
2858
- ### BI.W-XR-PRODUCER-REPAIRS — the dist `--default-transition-duration` routes through `--duration-fast` + the display/heading/title weight axis
2859
-
2860
- Two producer-red repairs surface a consumer-visible token behaviour (the rest — the
2861
- spectrum-thumb focus-ring pairing, the WatercolorDot solid-ring floor, the
2862
- `backdrop-filter: none` prefix policy — are internal fixes with no API change):
2863
-
2864
- - **PKT-1 (value.js P2)** — the emitted `dist/styles/components.css` R3 base block no
2865
- longer re-declares a **bare** `:root { --default-transition-duration: 150ms }` over a
2866
- consumer's own `@theme` alias. It now routes THROUGH the house token —
2867
- `--default-transition-duration: var(--duration-fast, 150ms)`. Consumer impact: a
2868
- bare `@import "@mkbabb/glass-ui/styles"` consumer's Tailwind `.transition-*`
2869
- utilities now read the house `--duration-fast` (0.2s) as their default duration
2870
- (was the frozen 150ms), and a consumer that retunes `--duration-fast` (or its own
2871
- `--default-transition-duration` `@theme` alias) now GOVERNS them instead of being
2872
- clobbered. No import or class rename — a felt-duration retune only.
2873
- - **X7 (value.js P10/T-40)** — new customization tokens `--type-weight-display` (600),
2874
- `--type-weight-heading` (700), `--type-weight-title` (700). The `text-display*` /
2875
- `text-heading` / `text-title` utilities read them instead of hardcoded weights, so a
2876
- consumer dials the bold-letterform character from ONE override. Purely additive
2877
- (defaults byte-identical); no break.
2878
-
2879
- Machine-locked by `proof:xr-producer-repairs` (X1 duration-through-token on the fresh
2880
- dist + X7 tokens-declared + `text-title` reads `var(--type-weight-title)`).
2881
-
2882
- **Deferred (NOT in this cut):** the T-45 glass-ladder backdrop edge-bleed (X2) — its
2883
- oversampled-pseudo cure is architecturally blocked at the rung (both pseudos claimed;
2884
- `.btn-glass`/`.glass-deep`/the dock re-declare `backdrop-filter` on the host, so moving
2885
- the plate to a pseudo double-blurs those consumers; the edge rim interferes with an
2886
- edge-oversampling blur). Routed to a wrapper-architecture follow-up + the #92 paint
2887
- batch (see `docs/tranches/BI/audit/visual/W-XR-PRODUCER-REPAIRS-DELTA.md`). Likewise the
2888
- X5 `color-mix`-@property-collapse on bare `.glass-wash` is booked to #92 (a live-paint
2889
- engine repro).
2651
+ | `useGlassRenderer` / `createGlassFilter` / `destroyGlassFilter` (the JS-canvas refraction builder) | none; the `.glass-{rung}` blur+tint base | there is no refraction path |
2652
+ | `.glass-card` (co-selector alias) | `.glass-resting` | fold the alias onto `.glass-resting` (same paint) |
2653
+
2654
+ A plate that moves from `GlassPanel` to `<Surface>` or `class="glass-resting"` paints the
2655
+ same at every tier.
2656
+
2657
+ ### `--default-transition-duration` follows `--duration-fast`, and three weight tokens arrive
2658
+
2659
+ - The emitted `dist/styles/components.css` no longer re-declares a bare
2660
+ `:root { --default-transition-duration: 150ms }` over your own `@theme` alias. It now
2661
+ reads `--default-transition-duration: var(--duration-fast, 150ms)`. So with a bare
2662
+ `@import "@mkbabb/glass-ui/styles"`, Tailwind's `.transition-*` utilities take the house
2663
+ `--duration-fast` (0.2s) as their default, and retuning `--duration-fast` (or your own
2664
+ `--default-transition-duration` alias) now governs them. No import or class rename.
2665
+ - New tokens `--type-weight-display` (600), `--type-weight-heading` (700) and
2666
+ `--type-weight-title` (700). The `text-display*` / `text-heading` / `text-title`
2667
+ utilities read them instead of fixed weights, so one override dials the letterform
2668
+ weight. Purely additive; the defaults are unchanged.
2890
2669
 
2891
2670
  ## 4.1.0
2892
2671
 
2893
- **BC.W-VIZ-FOURIER — the Canvas2D fourier renderer + the three-view split RETIRED
2894
- onto the WebGPU-first `useFourierField`. Clean break, no alias ("No legacy code").**
2895
- The fourier surface — three views (`fourier-field.vue` + the foreground
2896
- `fourier-studio.vue` over `FourierStudioStage.vue`) on a Canvas2D renderer the §E
2897
- "WebGPU everywhere, no canvas" mandate forbids — COLLAPSES to ONE GPU view and
2898
- MIGRATES off Canvas2D onto the WGSL-primary GPU substrate (`createGpuSubstrate`,
2899
- `setupWGPU` + `setupGL`). **The demo `fourier-studio.vue` + `FourierStudioStage.vue`
2900
- are DELETED** (the studio's controllable-clock/N-harmonics/epicycle/ℱ-trace axes fold
2901
- into the ONE merged `fourier-field.vue` view; no alias). The Canvas2D-era gates
2902
- `proof:fourier-field-intensity` / `proof:fourier-studio` /
2903
- `proof:fourier-field-visibility-live` retired with the Canvas2D render they asserted
2904
- (the flat-alpha/quadratic intensity model + the phosphor-comet canvas readback are
2905
- gone); the new `proof:fourier-field` (U1 ONE-merged-view + the deleted SFCs ABSENT, U2
2906
- WGSL-primary-no-Canvas2D, U3 the ONE math source round-trip) is their successor. No
2907
- public-prop break — `<FourierField>` keeps its `ConstellationProps`-shaped contract;
2908
- only the demo studio split + the Canvas2D substrate are retired. MIGRATE: none for a
2909
- library consumer (the public `<FourierField>` surface is unchanged); the demo studio
2910
- route folds into the merged view.
2911
-
2912
- **BC.W-VIZ-CONSTELLATION — the Canvas2D `drawOverlay` frozen-`now` handoff gate
2913
- `proof:constellation-freeze-live` RETIRED with the migration. Clean break, no alias.**
2914
- The constellation re-homes off the Canvas2D substrate (the low-res `ctx.arc()` discs +
2915
- the 2D `drawOverlay` skin seam) onto the WebGPU instanced-points+lines substrate
2916
- (`createGpuSubstrate`); the `drawOverlay` overlay-painter seam is INERT post-migration
2917
- (the lattice renders on the GPU, not a 2D context, so the render loop never invokes
2918
- `drawOverlay`). `proof:constellation-freeze-live` measured the `drawOverlay`
2919
- frozen-`now` handoff — a Canvas2D-era internal the GPU re-home deleted — so it retired;
2920
- the SURVIVING field-freeze determinism (under `prefers-reduced-motion` two frames are
2921
- IDENTICAL) is covered by the new `tests-visual/constellation.spec.ts` PRM-freeze π.
2922
- `drawOverlay` stays a public `ConstellationProps` prop (a consumer-skin seam) but is
2923
- no longer painted by the built-in GPU loop. The new `proof:viz-constellation` (C1 no
2924
- Canvas2D / `constellationDraw.ts` DELETED, C2 crisp SDF circle, C3 instanced quads, C4
2925
- the ONE math source) is the migration's source gate. MIGRATE: none for a library
2926
- consumer.
2927
-
2928
- **BC.W-RADIO-FIX / Band 6 — `<Button variant="solid">` RETIRED (clean break, no
2929
- alias, "No legacy code").** The `solid` variant was a back-compat escape hatch (the
2930
- previous default's opaque `bg-primary` fill, "so consumers can still get the solid
2931
- look") — unused in-repo and at odds with the glass-first identity. MIGRATE: the
2932
- default `<Button>` is the glass register; for a loud CTA use `variant="accent"` (the
2933
- gold-tint-on-glass). This flips `proof:no-shadcn-default` fully GREEN (the last
2934
- shadcn-neutral surface-fill residual removed). The `default`/`outline`/`secondary`/
2935
- `accent`/`ghost` variants are unchanged (`destructive` LATER migrates off `variant`
2936
- onto the `tone` axis at BI.W-BUTTON-TONE — see below).
2937
-
2938
- **BC.W-DOCK-STACK-RAIL — `<DockRail>` + `DockRailItem` RETIRED onto the macOS
2939
- hover-expand `<DockStack>` + `DockStackItem`. Clean break, no alias ("No legacy
2940
- code").** The AZ.W-RAIL3 divider-carousel rail (a floating strip of detached glass
2941
- chips on a connective hairline at a measured `<DockSeparator>` seam) CONTRADICTED the
2942
- verbatim macOS-stack ask, so it is rebuilt from scratch as the stack: a core anchor
2943
- item whose N members FAN OUT next to the rail on hover/focus (3 configurable + scrollable
2944
- n-stack via `<FadingScroll>`), extending beyond the dock edge into its own gutter so it
2945
- clears `<main>` BY TOPOLOGY. **`DockRail` + `DockRailItem` are GONE from
2946
- `@mkbabb/glass-ui/dock`** (the export names + the SFC `DockRail.vue` + the
2947
- `src/styles/dock/rail-extend.css` chip partial + the `measureSeam` /
2948
- `--dock-rail-seam-offset` seam-locator all DELETED, no alias). MIGRATE: `<DockRail
2949
- v-model:context :items>` → `<DockStack v-model:selected :items>` (`DockRailItem` →
2950
- `DockStackItem = { id, label, icon?, onSelect? }`); the in-dock-`<DockLayerGroup>`
2951
- contextual pattern stays the route-keyed seam — only its render target is the stack rail
2952
- (demo-only; no library API there). Machine-locked by `proof:dock-stack-rail` (S1 asserts
2953
- the divider-carousel DEFINITION-ABSENT; S2-S6 own the new `<DockStack>` seat / fan-out /
2954
- overflow / topology / one-registry). The `proof:rail3` gate retired with it; the
2955
- SECTION-GROUPING half of `proof:dock-sections` (S1 the `<DockSection>` zones + S4 the
2956
- shell adoption) stays GREEN.
2957
-
2958
- ADDITIVE (4.1.0): `@mkbabb/glass-ui/border-progress` — `<BorderProgress>`, the masked-conic
2959
- border-ring primitive (progress IS the element's border; BB.W-BORDER-PROGRESS). A net-new public
2960
- subpath (off the root barrel) shipped at 4.1.0. The 4.1.0 note that "the speedtest AW.W7 consumer
2961
- binds it on `^4.1.0`" did NOT hold — speedtest hand-rolls its own bar (0 binary consumers), so the
2962
- subpath is RETIRED at the 5.0.0 cut (banked dormant), see "The `/border-progress` subpath
2963
- retirement" below. Re-entry = the speedtest adopt ASK.
2964
-
2965
- ADDITIVE (4.1.0): `--instrument-dial-min-block-size-desktop` (BB.W-DESKTOP-RESERVE) — the wide-axis
2966
- (desktop) chassis dial reserve now ships in the library (`@container chassis (min-width: 45rem)` on
2967
- `.instrument-dial`, default `var(--chassis-max-block-size)`). A consumer that authored a local wide-axis
2968
- reserve interim (e.g. speedtest's `.instrument-dial { min-block-size: var(--chassis-max-block-size) }`,
2969
- AW.W4.1) DELETES it on consume — byte-equivalent at the default; retune via the token if the meter block-size differs.
2970
-
2971
- CANONICALIZED (4.1.0): `--glass-opacity-{tier}` per-tier alpha — documented + gated (BB.W-CARD-TIER-ALPHA); values byte-unchanged, a consumer that re-pinned the same tier alphas (e.g. speedtest register.css) deletes its override on consume.
2972
-
2973
- ADDITIVE (4.1.0): aurora `warpMode` gains `"curl"` — the Bridson curl-noise flow warp (opt-in; the default fbm/cellular/hybrid render byte-identical). The published `WarpMode` union widens additively; no break (BB.B1).
2974
-
2975
- ADDITIVE (4.1.0, BB.W-SURFACE-AXIS-COMPLETE): the shared `Surface = "glass" | "veil" | "opaque"`
2976
- axis reaches the last two surfaces R8-12 named verbatim — `<Toast>` and `<Button>` each gain a
2977
- `surface` prop (the Card-`surface`-gains-`veil` precedent). `<Toast surface="glass">` (the default,
2978
- byte-identical to today's `glass-floating` plate) composes WITH the `variant` tone arm — the
2979
- feedback-tone tint rides ON the resolved surface, orthogonal to the {glass·veil·opaque} decoration.
2980
- `<Button surface=…>` defaults UNSET (the `variant` axis owns Button's default); `surface="opaque"`
2981
- and the `solid` variant are the same `--glass-level:0` endpoint reached from two axes (NOT
2982
- duplicated recipes). No break for either.
2983
-
2984
- **ADDITIVE (4.1.0, BB.W-ON-GLASS-FG) — the surface-aware FOREGROUND register (the dark-theme
2985
- whisper collapse closed).** glass-ui mints a THREE-RUNG on-glass foreground family whose
2986
- contrast TARGET is the COMPOSITED content-tier glass FILL, not the canvas: `--on-glass-muted`
2987
- (+ `--on-glass-muted-strong`), `--input-on-glass`, and `--progress-track-on-glass`. The
2988
- glass-first MAXIMAL default (AX.W54) makes a caption/well/track over a TRANSLUCENT glass plate
2989
- the common case, where the canvas-calibrated `--muted-foreground` (= `--neutral-5`, "AA vs
2990
- page") COLLAPSED on its own surface (1.15-3.29:1 measured in dark theme). The calm-light content
2991
- tiers (`.glass-card`/`.glass-resting`/`.glass-quiet`/`.glass-wash`) now re-point
2992
- `--muted-foreground` → `--on-glass-muted` (+ the `-strong` twin) BESIDE the BA adaptive-glass
2993
- seam (the THIRD state — between page-muted and the bright-bucket full ink; legible-AND-subordinate),
2994
- so every `text-muted-foreground` caption + CardDescription inherits the on-glass rung with ZERO
2995
- per-site edit. Input/Textarea wells read `--input-on-glass`; the Progress default/gradient track
2996
- reads `--progress-track-on-glass`. No break, no rename — the page-muted register
2997
- (`--muted-foreground: var(--neutral-5)`) is UNTOUCHED for the opaque-canvas case.
2998
-
2999
- CONSUMER-INTERIM DELETION (the ≥2-consumer law closed): a consumer that hand-re-declared
3000
- `--muted-foreground` over glass — the slides `deck.css §1` `--muted-foreground`/`-strong`
3001
- override, the speedtest WG (secondary-text + value-plate) + WV1 (survey-seat) interims — DELETES
3002
- its override on the `^4.1.0` re-pin and INHERITS the library on-glass register. The override that
3003
- PROVED the fix retires onto the root.
3004
-
3005
- **BB.W-METAL-SHIMMER — the `@keyframes gold-shimmer-slide` RETIRED onto the
3006
- metal-PARAMETERIZED `@keyframes metal-shimmer-sweep`. Clean break, no alias ("No
3007
- legacy code").** The gold-only shimmer keyframe generalized into ONE metal-agnostic
3008
- position sweep (reading a `--metal-shimmer-color` channel + the `--metal-stop-*`
3009
- slots the recipe binds per-metal), so the bronze quad (the third brand metal) + the
3010
- gold + silver registers all share ONE keyframe. Two notes:
3011
-
3012
- 1. **`@keyframes gold-shimmer-slide` is GONE** — the keyframe NAME is removed (no
3013
- alias). The `.gold-shimmer` CLASS is PRESERVED (it re-points onto
3014
- `metal-shimmer-sweep` with `--metal-shimmer-color: gold`; the gold gradient stops +
3015
- `background-size`/`background-clip` + the PRM bracket are byte-identical — the gold
3016
- READ is UNCHANGED). The `--animate-gold-shimmer` token is PRESERVED (re-pointed onto
3017
- `metal-shimmer-sweep`). MIGRATE only if a consumer referenced `gold-shimmer-slide`
3018
- BY NAME in a hand-rolled `animation:` rule → `animation: metal-shimmer-sweep …`.
3019
- No consumer that composed the `.gold-shimmer` class or read `--animate-gold-shimmer`
3020
- changes.
3021
- 2. **NEW additive surface (no break).** The bronze quad (`--bronze`/`-light`/`-dark`/
3022
- `-deep` + `--color-bronze*`, the third brand metal on the W-NO-GRAY exception), the
3023
- `--duration-metal: 6s` slow clock, and the `.metal-{gold,silver,bronze}` /
3024
- `.metal-*-border` / `.metal-rainbow-rim` utilities are all ADDITIVE — a consumer
3025
- opts in by composing a `.metal-*` class. The `.metal-rainbow-rim` composes
3026
- W-GLASS-ACCENT's `--glass-accent` rim seam.
2672
+ **The Canvas2D fourier renderer and the three-view split retire onto the WebGPU
2673
+ `useFourierField`. No public-prop break.** The fourier surface moves off Canvas2D onto
2674
+ the WGSL-first GPU substrate (`createGpuSubstrate`, `setupWGPU` + `setupGL`), and the demo
2675
+ studio views fold into one view. `<FourierField>` keeps its `ConstellationProps`-shaped
2676
+ contract, so a library consumer has nothing to change.
2677
+
2678
+ **The constellation moves onto the WebGPU substrate, and `drawOverlay` is no longer
2679
+ painted.** The constellation re-homes off Canvas2D (the `ctx.arc()` discs and the 2D
2680
+ `drawOverlay` skin seam) onto WebGPU instanced points and lines. `drawOverlay` stays a
2681
+ public `ConstellationProps` prop, but the built-in GPU loop never calls it. Under
2682
+ `prefers-reduced-motion` the field still freezes, frame for frame. No consumer change
2683
+ beyond that.
2684
+
2685
+ **`<Button variant="solid">` is removed. Clean break, no alias.** The `solid` variant
2686
+ kept the old opaque `bg-primary` fill. The default `<Button>` is the glass register; for a
2687
+ loud call to action use `variant="accent"` (gold tint on glass). The
2688
+ `default`/`outline`/`secondary`/`accent`/`ghost` variants are unchanged (`destructive`
2689
+ moves onto the `tone` axis at 5.0.0).
2690
+
2691
+ **`<DockRail>` and `DockRailItem` retire onto the hover-expand `<DockStack>` and
2692
+ `DockStackItem`. Clean break, no alias.** The divider-carousel rail is rebuilt as a
2693
+ macOS-style stack: a core anchor item whose members fan out beside the rail on hover or
2694
+ focus (three configurable, with a scrollable overflow through `<FadingScroll>`), extending
2695
+ past the dock edge into its own gutter so it never covers `<main>`. `DockRail`,
2696
+ `DockRailItem`, `DockRail.vue`, `src/styles/dock/rail-extend.css` and the `measureSeam` /
2697
+ `--dock-rail-seam-offset` seam locator are gone from `@mkbabb/glass-ui/dock`. Migrate
2698
+ `<DockRail v-model:context :items>` → `<DockStack v-model:selected :items>`, and
2699
+ `DockRailItem` → `DockStackItem = { id, label, icon?, onSelect? }`.
2700
+
2701
+ Additive (4.1.0): `@mkbabb/glass-ui/border-progress` — `<BorderProgress>`, a masked-conic
2702
+ border-ring primitive whose progress is the element's border. It is removed again at 5.0.0;
2703
+ see _The `/border-progress` subpath retirement_ under 5.0.0.
2704
+
2705
+ Additive (4.1.0): `--instrument-dial-min-block-size-desktop`. The wide-axis chassis dial
2706
+ reserve now ships in the library (`@container chassis (min-width: 45rem)` on
2707
+ `.instrument-dial`, default `var(--chassis-max-block-size)`). If you wrote your own
2708
+ wide-axis reserve, such as `.instrument-dial { min-block-size: var(--chassis-max-block-size) }`,
2709
+ delete it; retune through the token if your meter's block size differs.
2710
+
2711
+ Documented (4.1.0): `--glass-opacity-{tier}`, the per-tier alpha. The values are
2712
+ unchanged, so an override that re-pinned the same tier alphas can be deleted.
2713
+
2714
+ Additive (4.1.0): aurora `warpMode` gains `"curl"`, a curl-noise flow warp (opt-in; the
2715
+ default fbm/cellular/hybrid render is unchanged). The published `WarpMode` union widens.
2716
+
2717
+ Additive (4.1.0): the shared `Surface = "glass" | "veil" | "opaque"` axis reaches `<Toast>`
2718
+ and `<Button>`, which each gain a `surface` prop. `<Toast surface="glass">` is the default
2719
+ and matches the old `glass-floating` plate; the feedback tone tint rides on the resolved
2720
+ surface. `<Button surface=…>` defaults unset (the `variant` axis owns Button's default);
2721
+ `surface="opaque"` and the `solid` variant reach the same `--glass-level:0` endpoint from
2722
+ two axes. No break for either.
2723
+
2724
+ **Additive (4.1.0): the surface-aware foreground register.** glass-ui adds an on-glass
2725
+ foreground family whose contrast target is the composited glass fill, not the page:
2726
+ `--on-glass-muted` (+ `--on-glass-muted-strong`), `--input-on-glass`, and
2727
+ `--progress-track-on-glass`. A caption, well or track over a translucent plate used to
2728
+ read `--muted-foreground`, which is tuned against the page and fell to 1.15–3.29:1 on its
2729
+ own surface in dark mode. The light content tiers (`.glass-card`/`.glass-resting`/
2730
+ `.glass-quiet`/`.glass-wash`) now point `--muted-foreground` at `--on-glass-muted`, so
2731
+ every `text-muted-foreground` caption and CardDescription picks up the on-glass rung with
2732
+ no per-site edit. Input and Textarea wells read `--input-on-glass`; the Progress track
2733
+ reads `--progress-track-on-glass`. The page register (`--muted-foreground:
2734
+ var(--neutral-5)`) is untouched for the opaque-canvas case. If you re-declared
2735
+ `--muted-foreground` over glass to fix that contrast yourself, delete the override.
2736
+
2737
+ **`@keyframes gold-shimmer-slide` retires onto the metal-parameterized
2738
+ `@keyframes metal-shimmer-sweep`. Clean break, no alias.** The gold-only keyframe becomes
2739
+ one metal-agnostic sweep (reading `--metal-shimmer-color` and the `--metal-stop-*` slots),
2740
+ so gold, silver and bronze share it.
2741
+
2742
+ 1. **`@keyframes gold-shimmer-slide` is gone** with no alias. The `.gold-shimmer` class
2743
+ stays and now runs `metal-shimmer-sweep` with `--metal-shimmer-color: gold`, painting
2744
+ exactly as before; `--animate-gold-shimmer` stays too. Migrate only if you named
2745
+ `gold-shimmer-slide` in your own `animation:` rule: write
2746
+ `animation: metal-shimmer-sweep …` instead.
2747
+ 2. **New, additive.** The bronze quad (`--bronze`/`-light`/`-dark`/`-deep` +
2748
+ `--color-bronze*`), the `--duration-metal: 6s` slow clock, and the
2749
+ `.metal-{gold,silver,bronze}` / `.metal-*-border` / `.metal-rainbow-rim` utilities.
2750
+ You opt in by composing a `.metal-*` class; `.metal-rainbow-rim` uses the
2751
+ `--glass-accent` rim seam.
3027
2752
 
3028
2753
  ## 4.0.0
3029
2754
 
3030
- **BA.W-TABS — the tab family standardized on ONE engine, TWO materials. Clean
3031
- break, no alias ("No legacy code").** `SegmentedTabs` is now ONE engine with TWO
3032
- MATERIALS (`variant: "pill" | "underline"`) and ONE orientation axis
3033
- (`orientation: "horizontal" | "vertical"`). Four retirements:
3034
-
3035
- 1. **`variant="segmented"` → `variant="pill"` (the DEFAULT now).** Segmented and
3036
- pill were one register; the user kept "pill" by name. `pill` is the glass
3037
- material — a glass-quiet track + the selected-reads-as-glass (`--glass-bg-floating`)
3038
- indicator, no gray. MIGRATE: drop the `variant="segmented"` prop (it re-defaults
3039
- to `pill`) or rename it to `variant="pill"`. A `<SegmentedTabs>` with no `variant`
3040
- now paints the glass pill.
3041
- 2. **`overflow="scroll" / "auto"` axis RETIRED.** Overflow is `<FadingScroll>`'s job
3042
- (`@mkbabb/glass-ui/fading-scroll`) at the consumer's own level, not an in-tabs
3043
- scroller. MIGRATE: wrap the strip in `<FadingScroll>` or apply `useFadingScroll`
3044
- where a genuinely-overflowing tab row needs an edge fade (the common ≤4-tab case
3045
- needs none).
3046
- 3. **`:multi-select` RE-HOMED to `<ToggleGroup>`.** A multi-pressed strip (N
3047
- independent toggles on one surface, `role="group"`) IS a ToggleGroup, not a tab
3048
- family member. MIGRATE: `<SegmentedTabs :multi-select>` →
3049
- `<ToggleGroup type="multiple">` (the IG-B2 glass-track register). The single-select
3050
- string model replaces the prior `string | string[]` union.
3051
- 4. **`ui/Tabs` (the reka wrapper family: `Tabs`/`TabsList`/`TabsTrigger`/`TabsContent`/`TabsIndicator`)
3052
- LEFT the public surface.** It is no longer re-exported from `@mkbabb/glass-ui` or
3053
- `@mkbabb/glass-ui/<ui-tabs>`. The standardized family is `SegmentedTabs`
3054
- (`@mkbabb/glass-ui/tabs`). MIGRATE a hand-rolled `ui/Tabs` recipe to the matching
3055
- `<SegmentedTabs variant="…">` material. (The reka substrate files remain INTERNAL
3056
- solely for the dock-rail consumer `DockLayerGroup` — they are not a consumer
3057
- surface.) The `indicator`/`surface` default-ON baked-plate that painted the R10-2
3058
- oval blob dies with the public surface.
3059
-
3060
- **External migration re-issue (the AY W-CONSUMER ledger, re-stamped at this SHA).**
3061
- The 5 DEFERRED external rows (fourier-analysis/web 3× `UnderlineTabs`, words/frontend
3062
- 2× `BouncyToggle`) re-target the standardized API: `UnderlineTabs` →
3063
- `<SegmentedTabs variant="underline">` (the paper material, panel-nav `role="tablist"`);
3064
- `BouncyToggle` → `<SegmentedTabs>` (the default pill material — the named-good glass
3065
- register). The receiver contract is PRESERVED — `:options` / `:model-value` /
3066
- `@update:model-value` + `variant` are unchanged across the standardization, so the
3067
- drop-in swap the ledger promises still holds; the `proof:consumer-staleness` allowlist
3068
- re-stamps (those rows carry their `{receiver-wave, close-gate}` terminals in the
3069
- consumer's own tranche). The `proof:tabs-unified` gate retired-with-re-point onto
3070
- `proof:tabs-std`.
3071
-
3072
- **CALLER HAZARD (next cut, BA.W-DEMO-AFFORDANCES) — never stack `.glass-btn` + `.btn-pill`.**
3073
- The two button size registers are MUTUALLY EXCLUSIVE: `.glass-btn` is the
3074
- FIXED-square icon primitive (`width/height: var(--size-icon-btn)` + `contain:paint`),
3075
- `.btn-pill` is the CONTENT-WIDTH text pill. Stacked on one element the fixed square
3076
- wins and `contain:paint` clips a wrapped text label into a ~40px blob (the R8-17
3077
- defect). A text-bearing `.glass-btn` (an icon button carrying a text child) collapses
3078
- the same way even without `.btn-pill`. MIGRATE: for a play/replay or text-bearing
3079
- affordance reach for a real `<Button>` with a leading Lucide glyph (the content-width
3080
- pill), never an icon-button primitive carrying text. No library recipe changes — the
3081
- `.glass-btn`/`.btn-pill` recipes are untouched; this is a caller-side hazard the new
3082
- `proof:demo-affordances` gate machine-locks (W1: no class co-occurrence, no text-bearing
3083
- icon button across `demo/**` + the `src/styles/**` recipes).
3084
-
3085
- **CLEAN BREAK (next cut, BA.W-SURFACE-AXIS) — Dialog `variant` → the shared `surface` axis.**
3086
- `<DialogContent variant="glass|opaque">` is RETIRED onto the ONE shared
3087
- `{glass·veil·opaque}` surface-decoration axis: `<DialogContent surface="glass|veil|opaque">`
3088
- (no alias — the prior `variant` was Dialog-local and never matched the Card grammar). Migrate
3089
- per call site: `variant="glass"` → `surface="glass"` (also the new default), `variant="opaque"`
3090
- → `surface="opaque"`; the `veil` rung is gained for free. The painted output for the `glass`
3091
- and `opaque` rungs is byte-identical (the same `glass-floating` / `.glass-opaque` material,
3092
- now reached through the shared resolver).
3093
-
3094
- ADDITIVE (next cut, BA.W-SURFACE-AXIS): the shared `Surface = "glass" | "veil" | "opaque"` axis
3095
- (published on `@mkbabb/glass-ui/api`) reaches the whole content/floating band — `GlassPanel`,
3096
- `Sheet`, `Popover`, `Command`, `Drawer`, and `ExpandableContainer` each gain a `surface` prop
3097
- (default `"glass"`, byte-compatible). `<Skeleton>` gains a `surface?: "glass" | "opaque"` prop
3098
- (default `"opaque"`, byte-identical to today's `bg-muted`); `surface="glass"` is the NEW
3099
- over-glass register (a translucent `--skeleton-glass-bg` block that lets a frosted plate read
3100
- through). The `ExpandableContainer` fullscreen overlay now un-walls onto the overlay glass tier
3101
- by default (`surface="opaque"` restores the prior solid wall). No break for any of these.
3102
-
3103
- **RENDERED-BEHAVIOUR (next cut, BA.W-EMISSION) — the Select bound + the Slider size axis
3104
- now actually PAINT in every consumer.** No API rename — these are EMISSION fixes (the
3105
- structural utilities ship as precompiled CSS instead of dead arbitrary-bracket classes a
3106
- consumer's content-scan never reached). Three rendered changes a consumer SEES on the bump:
3107
- (1) `<SelectContent>` now BOUNDS its content to `min(24rem, 60dvh)` tightened by
3108
- `--reka-popper-available-height` with inner `overflow-y: auto` — a tall (16-item-class)
3109
- dropdown that previously overflowed the viewport now bottoms INSIDE it and scrolls within
3110
- (override the cap via `--select-content-max-h` on any ancestor). (2) `<Slider size="md">`
3111
- (and `sm`/`lg`) now renders its REAL track geometry (`md` ≈ 20px / 1.25rem) — the `size`
3112
- prop was previously INERT in consumers (fell back to the 6px track); a consumer relying on
3113
- that broken 6px-regardless behaviour will now see the correct sized track. (3) glass-ui's
3114
- own `@source` directive (for a consumer re-importing the `/styles` cascade) re-points
3115
- `"../components"` → `"../*.js"` so it reaches the compiled `dist/*.js` chunks — a consumer
3116
- that copied glass-ui's `@source` line verbatim should ensure THEIR `@source` points at the
3117
- installed `dist` (per the consumer-wiring section), unchanged guidance.
3118
-
3119
- ADDITIVE (next cut, BA.W-EMISSION): `<WatercolorDot>` gains a `variant?: "solid" | "ghost"`
3120
- prop (default `"solid"`, byte-compatible). `variant="ghost"` renders the SAME seeded blob
3121
- silhouette as a STROKE (a `color` border over a low-alpha fill) — the empty-palette-slot
3122
- affordance, NOT a CSS dashed rectangle. No break.
3123
-
3124
- **BA.W-PAGER — `CarouselDots` RETIRED onto `<PagerDots>` + the counter re-registers
3125
- off `bg-card`. Clean break, no alias ("No legacy code").** The carousel dots and the
3126
- slides deck `DeckPager` were ALREADY one register; BA.W-PAGER harvests that into ONE
3127
- primitive — `<PagerDots>` (`@mkbabb/glass-ui/pager-dots`), encapsulated in a glass pager
3128
- pill. Two breaks:
3129
-
3130
- 1. **`CarouselDots` → `<PagerDots>` (clean break).** `CarouselDots` is GONE from the
3131
- `/carousel` barrel (it auto-wired the embla API via `useCarousel()` inject).
3132
- `<PagerDots>` is standalone — wire `:count`, `:active` (`v-model:active`), and
3133
- `@select`/`scrollTo` to the embla API explicitly. MIGRATE: `<CarouselDots />` →
3134
- `<PagerDots :count="api.scrollSnapList().length" :active="api.selectedScrollSnap()"
3135
- @select="(i) => api.scrollTo(i)" />`. The pip anatomy (24px hit-box, 6px pip,
3136
- elongate-on-active, the `--foreground` 52%/72%/full register) is IDENTICAL — the dots
3137
- look the same; they now read a `--pager-dot-*` token set (retint the active fill via
3138
- `--pager-dot-active`) and sit in the `.glass-pager-ring` chassis by default
3139
- (`ring="false"` for a flush-on-an-ambient-glass-host deck). `windowFit?` generalizes
3140
- the DeckPager dock-gutter windowing (off by default).
3141
- 2. **The `<CarouselPager>` counter is off the opaque `bg-card` ring.** The counter
3142
- `<span>` now composes `.glass-pager-ring` (the glass-floating pill) instead of
3143
- `rounded-pill border border-border bg-card` — the dark `rgb(28,25,23)` slab dies.
3144
- No consumer change (the counter is internal to `<CarouselPager>`); a consumer that
3145
- hand-overrode the counter's `bg-card` re-points to the glass ring.
3146
-
3147
- **BA.W-HANDMARK — `GlassUnderline` + the `/underline` subpath RETIRED onto
3148
- `<HandMark shape="underline">`. Clean break, no alias (DEC-8 outcome 1).** The d6
3149
- hand-voice family re-landed on `@mkbabb/glass-ui/handmark` (`<HandMark>` / `<InkMark>`
3150
-
3151
- - the flat `BRUSHES` continuum + the pure L1–L3 stages), and the editorial underline
3152
- is now ONE shape of that ONE hand voice — not a parallel component. Two breaks:
3153
-
3154
- 1. **`@mkbabb/glass-ui/underline` (`<GlassUnderline>`) is GONE.** The `/underline`
3155
- subpath + the `GlassUnderline*` types are removed from the surface (no alias, per
3156
- the no-backwards-compat invariant). MIGRATE: `import { GlassUnderline } from
3157
- "@mkbabb/glass-ui/underline"` → `import { HandMark } from
3158
- "@mkbabb/glass-ui/handmark"`; `<GlassUnderline>word</GlassUnderline>` →
3159
- `<HandMark shape="underline">word</HandMark>`. The editorial draw-on underline is
3160
- `<HandMark shape="underline" animation="draw-on">`; the natural pencil-boil
3161
- morphology (scale-relative amplitude, irregular seeded periods) is the `boil`
3162
- brush (`<HandMark brush="boil" shape="underline">`). The default `pen` brush is a
3163
- clean wobbled line, `grain:0`, no extra dep.
3164
- [2026-09-17 · O-20 CLOSE-DOCS · the 4.0.0 record of the brush axis, kept as that —
3165
- but do not write these attributes at 9.0.0. `<HandMark>` declares five props there
3166
- (`shape` · `color` · `weight` · `seed` · `draw`, `HandMark.vue:33-41`); `brush`,
3167
- `animation` and the `BRUSHES` continuum are gone, so `brush="boil"` and
3168
- `animation="draw-on"` are inert attributes. `draw` is the draw-on switch, and the
3169
- underline is `<HandMark shape="underline">`.]
3170
- 2. **New optional peers (vendored/peer split).** `<HandMark>` adds two OPTIONAL peers:
3171
- `@mkbabb/pencil-boil ^0.4.1` (the L1 wobble geometry — imported only when a wobble
3172
- paints) and `perfect-freehand ^1.2.3` (the variable-width hull body — VENDORED into
3173
- `freehand.ts`, declared as an optional peer for provenance, touched only by the
3174
- `ribbon:"hull"` highlighter). Both are tree-shaken when unused; a `pen`-only
3175
- consumer pulls neither. The `/handmark` chunk is ≈7.6 KiB-gzip (the `profile:budget`
3176
- rebaseline records it + the engaged pf hull body).
3177
- [2026-09-17 · O-20 CLOSE-DOCS · true at 4.0.0 (`git show v4.0.0:package.json` carries
3178
- both, both optional) and false as an install instruction today. `perfect-freehand`
3179
- stopped being a peer at 7.0.0 and `@mkbabb/pencil-boil` at 9.0.0; neither name is in
3180
- the nine that 9.0.0 declares. The file this row names is gone too —
3181
- `src/components/handmark/freehand.ts` was deleted at `5a69ed9f` (2026-08-25), and
3182
- with it the `ribbon:"hull"` axis. A 9.0.0 HandMark consumer installs nothing.]
3183
-
3184
- **This row is for any FUTURE external `/underline` consumer — NOT slides.** The
3185
- 2026-06-15 slides ground-truth (BINDING) confirms slides imports ZERO
3186
- `@mkbabb/glass-ui/underline` / `GlassUnderline`: its `SlideIntro`/`SlideCloser` red
3187
- pen-underlines are deck-LOCAL CSS/SVG `::after` glyphs, never the library component.
3188
- The phantom "slides adopt-book break" was the AZ-H6-fold assumption the slides session
3189
- disproved at HEAD `c943a49`; there is no slides edit on this fold.
2755
+ **The tab family standardizes on one engine with two materials. Clean break, no
2756
+ alias.** `SegmentedTabs` is now one engine with two materials (`variant: "pill" |
2757
+ "underline"`) and one orientation axis (`orientation: "horizontal" | "vertical"`). Four
2758
+ retirements:
2759
+
2760
+ 1. **`variant="segmented"` → `variant="pill"`, now the default.** Segmented and pill were
2761
+ one register. `pill` is the glass material: a glass-quiet track with a selected
2762
+ indicator that reads as glass (`--glass-bg-floating`). Drop `variant="segmented"` or
2763
+ rename it to `variant="pill"`; a `<SegmentedTabs>` with no `variant` now paints the
2764
+ glass pill.
2765
+ 2. **The `overflow="scroll" / "auto"` axis is removed.** Overflow is `<FadingScroll>`'s
2766
+ job (`@mkbabb/glass-ui/fading-scroll`). Wrap a genuinely overflowing tab row in
2767
+ `<FadingScroll>` or apply `useFadingScroll`; the usual short tab row needs neither.
2768
+ 3. **`:multi-select` moves to `<ToggleGroup>`.** A strip of independent toggles on one
2769
+ surface (`role="group"`) is a ToggleGroup, not a tab family member:
2770
+ `<SegmentedTabs :multi-select>` → `<ToggleGroup type="multiple">`. The tabs model is a
2771
+ single string now, not `string | string[]`.
2772
+ 4. **`ui/Tabs` (`Tabs`/`TabsList`/`TabsTrigger`/`TabsContent`/`TabsIndicator`) leaves the
2773
+ public surface.** The standard family is `SegmentedTabs` (`@mkbabb/glass-ui/tabs`);
2774
+ move a hand-rolled `ui/Tabs` recipe to the matching `<SegmentedTabs variant="…">`.
2775
+
2776
+ The `UnderlineTabs` → `<SegmentedTabs variant="underline">` and `BouncyToggle` →
2777
+ `<SegmentedTabs>` swaps are drop-in: `:options` / `:model-value` / `@update:model-value`
2778
+ and `variant` are unchanged.
2779
+
2780
+ **Never stack `.glass-btn` and `.btn-pill`.** The two button size registers exclude each
2781
+ other: `.glass-btn` is the fixed-square icon primitive (`width/height:
2782
+ var(--size-icon-btn)` + `contain:paint`), and `.btn-pill` is the content-width text pill.
2783
+ On one element the fixed square wins and `contain:paint` clips a wrapped text label into
2784
+ a ~40px blob, and a `.glass-btn` with a text child collapses the same way. For a
2785
+ text-bearing control use a real `<Button>` with a leading glyph. No library recipe
2786
+ changes.
2787
+
2788
+ **Dialog `variant` moves onto the shared `surface` axis. Clean break.**
2789
+ `<DialogContent variant="glass|opaque">` becomes `<DialogContent
2790
+ surface="glass|veil|opaque">`, with no alias. Migrate per call site: `variant="glass"` →
2791
+ `surface="glass"` (also the default), `variant="opaque"` → `surface="opaque"`; `veil` is
2792
+ new. `glass` and `opaque` paint as before.
2793
+
2794
+ Additive: the shared `Surface = "glass" | "veil" | "opaque"` axis reaches `GlassPanel`,
2795
+ `Sheet`, `Popover`, `Command`, `Drawer`, and `ExpandableContainer`, which each gain a
2796
+ `surface` prop (default `"glass"`). `<Skeleton>` gains `surface?: "glass" | "opaque"`
2797
+ (default `"opaque"`, as `bg-muted` painted before); `surface="glass"` is a translucent
2798
+ `--skeleton-glass-bg` block for use over a frosted plate. The `ExpandableContainer`
2799
+ fullscreen overlay now opens onto the overlay glass tier by default (`surface="opaque"`
2800
+ restores the solid wall). No break for any of these.
2801
+
2802
+ **The Select bound and the Slider size axis now paint in every consumer.** No API
2803
+ rename: the structural utilities now ship as precompiled CSS instead of arbitrary
2804
+ classes your content scan never saw. Three things you will see:
2805
+ (1) `<SelectContent>` bounds its content to `min(24rem, 60dvh)`, tightened by
2806
+ `--reka-popper-available-height`, and scrolls inside, so a tall dropdown no longer runs
2807
+ off the viewport (override the cap with `--select-content-max-h` on any ancestor).
2808
+ (2) `<Slider size="md">` (and `sm`/`lg`) renders its real track geometry (`md` ≈ 20px /
2809
+ 1.25rem); the `size` prop used to be inert in consumers, which fell back to a 6px track.
2810
+ (3) glass-ui's own `@source` directive re-points `"../components"` → `"../*.js"` so it
2811
+ reaches the compiled `dist/*.js` chunks. If you copied that `@source` line, make sure
2812
+ yours points at the installed `dist`.
2813
+
2814
+ Additive: `<WatercolorDot>` gains `variant?: "solid" | "ghost"` (default `"solid"`).
2815
+ `variant="ghost"` renders the same seeded blob as a stroke over a low-alpha fill, for an
2816
+ empty palette slot. No break.
2817
+
2818
+ **`CarouselDots` retires onto `<PagerDots>`, and the counter moves off `bg-card`. Clean
2819
+ break, no alias.** The carousel dots become one primitive, `<PagerDots>`
2820
+ (`@mkbabb/glass-ui/pager-dots`), in a glass pager pill. Two breaks:
2821
+
2822
+ 1. **`CarouselDots` → `<PagerDots>`.** `CarouselDots` is gone from the `/carousel`
2823
+ barrel (it wired the embla API through `useCarousel()`). `<PagerDots>` stands alone, so
2824
+ wire `:count`, `:active` (`v-model:active`) and `@select` yourself:
2825
+ `<CarouselDots />` → `<PagerDots :count="api.scrollSnapList().length"
2826
+ :active="api.selectedScrollSnap()" @select="(i) => api.scrollTo(i)" />`. The dots look
2827
+ the same; they now read a `--pager-dot-*` token set (retint the active fill with
2828
+ `--pager-dot-active`) and sit in the `.glass-pager-ring` by default (`ring="false"`
2829
+ for a flush deck). `windowFit?` windows the dots to the space available (off by
2830
+ default).
2831
+ 2. **The `<CarouselPager>` counter is off the opaque `bg-card` ring.** The counter now
2832
+ composes `.glass-pager-ring` instead of `rounded-pill border border-border bg-card`.
2833
+ An override of the counter's `bg-card` should target the glass ring instead.
2834
+
2835
+ **`GlassUnderline` and the `/underline` subpath retire onto `<HandMark shape="underline">`.
2836
+ Clean break, no alias.** The hand-drawn family lands on `@mkbabb/glass-ui/handmark`, and
2837
+ the editorial underline is one shape of it. Two breaks:
2838
+
2839
+ 1. **`@mkbabb/glass-ui/underline` (`<GlassUnderline>`) is gone**, with the
2840
+ `GlassUnderline*` types. Migrate `import { GlassUnderline } from
2841
+ "@mkbabb/glass-ui/underline"` → `import { HandMark } from "@mkbabb/glass-ui/handmark"`,
2842
+ and `<GlassUnderline>word</GlassUnderline>` → `<HandMark shape="underline">word</HandMark>`.
2843
+ At 4.0.0 the draw-on underline was `<HandMark shape="underline" animation="draw-on">`
2844
+ and the pencil-boil look was `brush="boil"`. From 9.0.0 `<HandMark>` takes five props
2845
+ (`shape` · `color` · `weight` · `seed` · `draw`): `brush` and `animation` are gone, and
2846
+ `draw` is the draw-on switch.
2847
+ 2. **Optional peers at 4.0.0.** `<HandMark>` added two optional peers,
2848
+ `@mkbabb/pencil-boil ^0.4.1` and `perfect-freehand ^1.2.3`, both tree-shaken when
2849
+ unused. `perfect-freehand` stopped being a peer at 7.0.0 and `@mkbabb/pencil-boil` at
2850
+ 9.0.0, so from 9.0.0 HandMark needs no install.
3190
2851
 
3191
2852
  ## 3.13.0
3192
2853
 
3193
- **AZ.W-REGISTER-IOS — the dock interactive register is DE-RED'd to the iOS
3194
- luminance-lift.** No consumer API rename — this is a TOKEN-knob + demo-preset
3195
- change. The dock SELECTED/hover/active/pressed register at the library ROOT is
3196
- now the iOS-26/27 glass luminance-lift, not a brand-red accent (R3-6). Two NEW
3197
- retint knobs for downstream retinters: `--dock-selected-accent` (the SINGLE knob
3198
- for the selected affordance — defaults to `color-mix(in oklab, var(--foreground)
3199
- 14%, transparent)`, a translucent foreground luminance-lift that auto-flips with
3200
- `--foreground`; consumed by the rail leading-edge accent BAR), and
3201
- `--dock-control-press-bg` (the iOS press-darken — `--glass-bg-resting` mixed ~7%
3202
- toward `--foreground`, read on every dock control `:active`). The rail active
3203
- GLYPH + BAR no longer fall back to `var(--dock-rail-active-accent, var(--primary))`;
3204
- the glyph stays warm-ink `--foreground`, the bar paints `--dock-selected-accent`.
3205
- A consumer that previously re-tinted the selected register to a brand hue via
3206
- `--dock-rail-active-accent` should instead set `--dock-selected-accent` (the
3207
- luminance-lift knob) — `--dock-rail-active-accent` is no longer read on the rail
3208
- glyph/bar default. The demo's `--demo-nav-accent: var(--viz-fourier)` NCSU-red
3209
- preset is RETIRED (the demo consumes the neutral root register; presets live in
3210
- the consumer, the library's default is the de-red'd iOS register). Brand red
3211
- survives only as static ink (the ℱ wordmark / data-viz strokes / gold-CTA family).
3212
- Guarded by `proof:register-ios` (a negative predicate that REDs a brand-red
3213
- re-introduction on any interactive selector).
3214
-
3215
- **The published cut is v3.13.0 — there is no 3.11/3.12 entry on the registry.** The
3216
- AZ tranche's breaks (the dock taxonomy + the metric `amount`→`value` rename + the
3217
- constellation generalization + the Card `veil` addition) ALL ship together in the
3218
- published **3.13.0**. The interim `3.11.0/.1/.2 + 3.12.0` registry publishes were
3219
- STALE-LINEAGE out-of-band publishes from a pre-prune tree (they carry the four
3220
- since-retired subpaths and lack `/underline`); the AZ cut SKIPPED them and published
3221
- 3.13.0 from master via release.yml provenance so `latest` resolves the true close (AZ
3222
- FINAL §5). A consumer pins **3.13.0** and reads every break below as landing on that one
3223
- release — the number-skip is intentional, the 3.11/3.12 lineage is not the close.
3224
-
3225
- **v3.13.0** — the dock taxonomy clean break (AZ.W-DOCK-TAXONOMY, H2 arm-a):
3226
- `<GlassDock variant="rail">` → `<GlassDock orientation="vertical">` (the `variant`
3227
- discriminant is removed; a vertical dock is now COLLAPSIBLE by default — it morphs its
3228
- `height`; a static nav column adds `always-expanded`). `<GlassDock variant="instrument-strip">`
3229
- is removed (zero live consumers) — compose `<InstrumentChassis>` directly; the speedtest
3230
- `SurveyResultDock` cockpit re-pins on the 3.13.0 adopt.
3231
-
3232
- BREAKING (3.13.0): `<MetricBadge>` / `<MetricPill>` — the primary prop `amount` is renamed
3233
- `value` (the Metric value-core convergence; a valid `0` now renders `0`, never the placeholder).
3234
- Clean break, no alias — speedtest re-points on the bump (`/metric-cell` + `/metric-stack`
3235
- surfaces unchanged).
3236
-
3237
- ADDITIVE (3.13.0): the `/constellation` subpath gains optional default-OFF generalization
3238
- props/exports (pinnedIndex/pinNode, accentEdges, the palette accent/edgeFloor/edgeAccentAlpha,
3239
- stepPinnedDrift, warpAutoRelease + warpSettled) — the protected quintet is byte-compatible.
3240
-
3241
- ADDITIVE (3.13.0): the Card `surface` union gains `"veil"` — the borderless/rimless
3242
- wash-fill text-legibility plate (`--veil-*` knobs, the optional `--veil-feather` mask). No break.
2854
+ **The dock's interactive register drops the brand red for a luminance lift.** No API
2855
+ rename; this is a token and default change. The dock's selected, hover, active and
2856
+ pressed paint at the library root is now a glass luminance lift, not a brand-red accent.
2857
+ Two new retint knobs: `--dock-selected-accent`, the one knob for the selected affordance
2858
+ (default `color-mix(in oklab, var(--foreground) 14%, transparent)`, which flips with
2859
+ `--foreground`, read by the rail's leading-edge accent bar), and `--dock-control-press-bg`,
2860
+ the press darken (`--glass-bg-resting` mixed about 7% toward `--foreground`, read on every
2861
+ dock control `:active`). The rail's active glyph and bar no longer fall back to
2862
+ `var(--dock-rail-active-accent, var(--primary))`: the glyph stays `--foreground`, and the
2863
+ bar paints `--dock-selected-accent`. If you tinted the selected register to a brand hue
2864
+ through `--dock-rail-active-accent`, set `--dock-selected-accent` instead.
2865
+
2866
+ **3.13.0 is the release; there is no 3.11 or 3.12 entry.** The dock taxonomy, the metric
2867
+ `amount`→`value` rename, the constellation generalization and the Card `veil` addition
2868
+ all ship in 3.13.0. Registry versions 3.11.0, 3.11.1, 3.11.2 and 3.12.0 were published
2869
+ from an older tree and are not part of this line, so pin **3.13.0** and read every break
2870
+ below as landing there.
2871
+
2872
+ **v3.13.0** — the dock taxonomy clean break: `<GlassDock variant="rail">` →
2873
+ `<GlassDock orientation="vertical">`. The `variant` discriminant is removed; a vertical
2874
+ dock is now collapsible by default (it morphs its `height`), and a static nav column adds
2875
+ `always-expanded`. `<GlassDock variant="instrument-strip">` is removed; compose
2876
+ `<InstrumentChassis>` directly.
2877
+
2878
+ Breaking (3.13.0): `<MetricBadge>` / `<MetricPill>` — the primary prop `amount` is
2879
+ renamed `value`, and a valid `0` now renders `0`, never the placeholder. Clean break, no
2880
+ alias (the `/metric-cell` and `/metric-stack` surfaces are unchanged).
2881
+
2882
+ Additive (3.13.0): the `/constellation` subpath gains optional, default-off props and
2883
+ exports (pinnedIndex/pinNode, accentEdges, the palette accent/edgeFloor/edgeAccentAlpha,
2884
+ stepPinnedDrift, warpAutoRelease + warpSettled). Existing props are unchanged.
2885
+
2886
+ Additive (3.13.0): the Card `surface` union gains `"veil"`, a borderless, rimless wash
2887
+ plate for text legibility (`--veil-*` knobs and the optional `--veil-feather` mask). No
2888
+ break.
3243
2889
 
3244
2890
  ## 3.10.0
3245
2891
 
3246
- **v3.10.0 (AY, NARROWED at AZ.W-PRUNE2)**—two zero-consumer subpaths RETIRED outright (no
3247
- aliases, per the no-backwards-compat invariant): `@mkbabb/glass-ui/deck-progress` +
3248
- `/instrument-rail` (0 production consumers at the census,
3249
- `docs/tranches/AY/audit/PRUNE-LEDGER.md`). `/header-ribbon` + `/glass-panel` were retired
3250
- by the same census and RESTORED at AZ.W-PRUNE2 — the census missed their live keyframes.js
3251
- binary consumer (`docs/consumer-evidence/{header-ribbon,glass-panel}.md`); both ship again.
3252
- A consumer that referenced one composes the equivalent from the surviving
3253
- primitives (`Progress`, `Section`, the `.glass-*` ladder, `InstrumentChassis`).
3254
- NEW subpath: `@mkbabb/glass-ui/underline` (`<GlassUnderline>`) — RETIRED at the BA cut
3255
- onto `<HandMark shape="underline">` (see the BA.W-HANDMARK row above; it never reached
3256
- a real consumer, the 3.11/3.12 publishes were stale-lineage).
3257
-
3258
- ## 2.0.0 (AI.W1 R3) — motion subpath surgery
3259
-
3260
- **v2.0.0 (AI.W1 R3)**—the motion composables move off the root barrel to
3261
- the new `@mkbabb/glass-ui/motion` flat subpath, closing the
3262
- AI-CARRY-GLASS-UI-KEYFRAMES-EDGE 4-tranche chronic. See the **v2.0.0**
3263
- section below for the full symbol list + codemod hints. Same SCC-trap
3264
- closure shape as L.W1 Lane C — different heavy peer
3265
- (`@mkbabb/keyframes.js` instead of `@vueuse/core`).
2892
+ **v3.10.0** — two subpaths with no production consumer are removed outright (no aliases):
2893
+ `@mkbabb/glass-ui/deck-progress` and `/instrument-rail`. Compose the equivalent from the
2894
+ surviving primitives (`Progress`, `Section`, the `.glass-*` ladder, `InstrumentChassis`).
2895
+ `/header-ribbon` and `/glass-panel` still ship at 3.10.0. New subpath:
2896
+ `@mkbabb/glass-ui/underline` (`<GlassUnderline>`), which retires onto
2897
+ `<HandMark shape="underline">` at 4.0.0 (see above).
2898
+
2899
+ ## 2.0.0 — motion subpath surgery
2900
+
2901
+ **v2.0.0**—the motion composables move off the root barrel to the new
2902
+ `@mkbabb/glass-ui/motion` flat subpath, so the root barrel no longer pulls in
2903
+ `@mkbabb/keyframes.js`. See the **v2.0.0** section below for the full symbol list +
2904
+ codemod hints. It is the same move v1.0 made for `@vueuse/core`.
3266
2905
 
3267
2906
  ---
3268
2907
 
3269
- v1.0 is the L-tranche cohort release. It freezes the public API and lands four
2908
+ v1.0 freezes the public API and lands four
3270
2909
  architectural transpositions that BREAK v0.9.x consumer shapes:
3271
2910
 
3272
2911
  1. **Root-barrel Phase 2**—vueuse-bearing symbols leave the root barrel; they
@@ -3276,9 +2915,9 @@ architectural transpositions that BREAK v0.9.x consumer shapes:
3276
2915
  3. **Subpath flatten**—`composables/dark` + `composables/keyboard` collapse
3277
2916
  to flat `/dark` + `/keyboard`; new `/carousel` subpath added.
3278
2917
  4. **Second-consumer fidelity**—substrate without ≥ 2 consumers either wires
3279
- a real second consumer or retires (per L invariant 8).
2918
+ a real second consumer or retires.
3280
2919
 
3281
- Per L invariant 4 (no backwards-compat shims), v1.0 ships no legacy aliases.
2920
+ v1.0 ships no legacy aliases and no backwards-compat shims.
3282
2921
  Every break is documented below. v0.9.4 remains available indefinitely as a
3283
2922
  patch-stream tag; v1.0 adoption is opt-in.
3284
2923
 
@@ -3312,7 +2951,7 @@ to the v1.0 subpath surface in ~30 minutes. Entry-chunk gz dropped 32.5 KB.
3312
2951
  ## Before you migrate
3313
2952
 
3314
2953
  1. **Pin to v0.9.4 first** if you are on v0.9.0–v0.9.3. v0.9.4 patches the
3315
- K.WS subpath-typing-publication gap and lets you adopt subpath imports
2954
+ subpath-typing publication gap and lets you adopt subpath imports
3316
2955
  incrementally BEFORE the breaking v1.0 cut.
3317
2956
  2. **Run your tests + typecheck** at v0.9.4. Establish a green baseline.
3318
2957
  3. **Inventory your imports**—`rg 'from "@mkbabb/glass-ui"' src/` lists
@@ -3331,8 +2970,8 @@ to the v1.0 subpath surface in ~30 minutes. Entry-chunk gz dropped 32.5 KB.
3331
2970
 
3332
2971
  The root barrel is now vueuse-free. Re-exporting these symbols from
3333
2972
  `@mkbabb/glass-ui` forced every consumer to walk the vueuse SCC at
3334
- tree-shake time, regressing entry-chunk gzip by ~2 KB (speedtest's X.W3.c
3335
- re-probe was the canonical evidence). Phase 2 carves them onto subpaths.
2973
+ tree-shake time, regressing entry-chunk gzip by ~2 KB. Phase 2 carves them onto
2974
+ subpaths.
3336
2975
 
3337
2976
  #### 1.1—Form primitives → `/forms`
3338
2977
 
@@ -3344,7 +2983,7 @@ import { Input, Textarea, Combobox, ComboboxInput } from "@mkbabb/glass-ui";
3344
2983
  import { Input, Textarea, Combobox, ComboboxInput } from "@mkbabb/glass-ui/forms";
3345
2984
  ```
3346
2985
 
3347
- The `/forms` subpath was added at v0.9.3 (K.WS Phase 1) and is preserved
2986
+ The `/forms` subpath was added at v0.9.3 and is preserved
3348
2987
  verbatim at v1.0. Affected symbols: `Input`, `Textarea`, `Combobox`,
3349
2988
  `ComboboxAnchor`, `ComboboxCancel`, `ComboboxEmpty`, `ComboboxGroup`,
3350
2989
  `ComboboxInput`, `ComboboxItem`, `ComboboxItemIndicator`, `ComboboxList`,
@@ -3460,7 +3099,7 @@ that an editor multi-cursor pass is the canonical workflow.
3460
3099
  ### 2. Subpath flatten (v0.9.4 transitional shapes retired)
3461
3100
 
3462
3101
  v0.9.4 introduced nested `composables/dark` + `composables/keyboard`
3463
- subpaths as a transitional shape for the K.WS dts-publication-gap fix.
3102
+ subpaths as a transitional shape for the dts-publication-gap fix.
3464
3103
  v1.0 flattens them to match every other public subpath
3465
3104
  (`/forms`, `/dock`, `/configurator`, ...).
3466
3105
 
@@ -3499,16 +3138,14 @@ $ node -e "import('@mkbabb/glass-ui/composables/dark')"
3499
3138
  Error: ERR_PACKAGE_PATH_NOT_EXPORTED
3500
3139
  ```
3501
3140
 
3502
- That hard fail is intentional. Per L invariant 4, no alias re-routes the
3503
- nested form to the flat one.
3141
+ That hard fail is intentional: no alias re-routes the nested form to the flat one.
3504
3142
 
3505
3143
  ---
3506
3144
 
3507
3145
  ### 3. Composable retirements (substrate-without-consumer binary)
3508
3146
 
3509
- L.W3 Lane A's audit ran the substrate-without-consumer check across six
3510
- composables. Three were WIRED via cross-repo speedtest consumption; three
3511
- retired with rationale.
3147
+ v1.0 checked six composables for a real consumer. Three had one and stay; three
3148
+ retired.
3512
3149
 
3513
3150
  #### 3.1—`useOffsetPagination`—REMOVED
3514
3151
 
@@ -3525,37 +3162,27 @@ retired with rationale.
3525
3162
  (`@tanstack/vue-query` if you need server-state coordination,
3526
3163
  `@vueuse/core`'s `useOffsetPagination` if you want a thin wrapper).
3527
3164
 
3528
- #### 3.2—`useVirtualSectionWindow`—REMOVED → REVERSED-at-BC → DEMO-OWNED-at-BI
3529
-
3530
- - **Status**: REMOVED in v1.0; briefly **REVERSED-at-BC**; the fabricated
3531
- consumer claim was corrected at BI and the reduced facility now lives at
3532
- `demo/composables/virtual/useVirtualSectionWindow.ts`.
3533
- - **Reason for the v1.0 removal**: 0 production consumers. Demo-only at
3534
- v0.9.x. The BC reversal relied on two claimed binary consumers; BI found
3535
- that words used a divergent local fork and Dock exposed only an optional
3536
- callback. The demo facility retains only the two actual stories' measured
3537
- height, bounded far-target, spacer, and active-id behavior; the former content
3538
- wrapper, tuning knobs, module cache, and unused readbacks are deleted.
3539
- - **Subpath retired**: `@mkbabb/glass-ui/virtual` — re-minted at BC, then
3540
- retired again at BI after the binary-consumer claim failed. `useVirtualGrid` (the
3541
- `@tanstack/vue-virtual`-bearing grid windower) STAYS words-local — one
3542
- consumer + a hard 3rd-party dep, the ≥2-consumer bar fails for glass-ui.
3165
+ #### 3.2—`useVirtualSectionWindow`—REMOVED
3166
+
3167
+ - **Status**: removed in v1.0. It returned briefly in 4.1.0 and left the package
3168
+ again at 5.0.0; a reduced copy lives on as a demo-only facility.
3169
+ - **Reason**: no production consumer. Demo-only at v0.9.x.
3170
+ - **Subpath retired**: `@mkbabb/glass-ui/virtual` (re-added in 4.1.0, removed again
3171
+ at 5.0.0).
3543
3172
  - **Migration**: no Glass package replacement exists. Product consumers own
3544
3173
  their windowing or choose a dedicated virtualizer.
3545
3174
 
3546
- #### 3.3—`useWindowedStore`—REMOVED → REVERSED-at-BC → DELETED-at-BI
3175
+ #### 3.3—`useWindowedStore`—REMOVED
3547
3176
 
3548
- - **Status**: REMOVED in v1.0; briefly **REVERSED-at-BC**; deleted again at BI.
3549
- - **Reason for the v1.0 removal**: 0 production consumers. The BC reversal
3550
- mistook words' local store for a Glass package consumer. The second-pass BI
3551
- census found no demo consumer either, so retaining the implementation and
3552
- test-only cases would preserve machinery for its own sake.
3177
+ - **Status**: removed in v1.0; it returned briefly in 4.1.0 and was deleted again at
3178
+ 5.0.0.
3179
+ - **Reason**: no production consumer and no demo consumer.
3553
3180
  - **Subpath retired**: `@mkbabb/glass-ui/virtual` (shared with
3554
3181
  `useVirtualSectionWindow`) remains absent.
3555
- - **Migration**: none; words already owns its divergent local implementation,
3556
- and Glass provides no alias or forwarding coordinate.
3182
+ - **Migration**: keep your own implementation; Glass provides no alias or forwarding
3183
+ coordinate.
3557
3184
 
3558
- #### 3.4—`virtualSectionLayout` helpers—REMOVED → DEMO-OWNED-at-BI
3185
+ #### 3.4—`virtualSectionLayout` helpers—REMOVED
3559
3186
 
3560
3187
  - **Status**: removed from the package surface; the unchanged demo fixture lives
3561
3188
  at `demo/composables/virtual/virtualSectionLayout.ts`.
@@ -3564,8 +3191,7 @@ retired with rationale.
3564
3191
  `FlatSection`, `SectionLayout`, `SectionWindowRange`, and
3565
3192
  `ForcedSectionWindowRange` types.
3566
3193
  - **Reason for the v1.0 removal**: support substrate for
3567
- `useVirtualSectionWindow`; retired with its parent. The BC reversal followed
3568
- that parent and was corrected with it at BI. `findSectionOffset` is
3194
+ `useVirtualSectionWindow`; retired with its parent. `findSectionOffset` is
3569
3195
  refined to a binary search over a by-id-sorted view (the words copy
3570
3196
  linear-scanned; the offset answer is byte-identical), and `FlatSection`
3571
3197
  now shares the four hierarchy fields with the sidebar's `TreeIndexEntry`
@@ -3594,9 +3220,7 @@ All three remain on `@mkbabb/glass-ui` (vueuse-free) via
3594
3220
  #### 4.1—`<DockShowcaseFrame>`—REMOVED
3595
3221
 
3596
3222
  - **Status**: REMOVED in v1.0 (demo file deleted).
3597
- - **Reason**: demo-private chassis introduced at V.W4 with ZERO non-self
3598
- consumers at L.W3 open (`rg "DockShowcaseFrame" demo/` returned only
3599
- the definition file).
3223
+ - **Reason**: a demo-private chassis with no consumer besides its own file.
3600
3224
  - **Public-surface impact**: NONE. The component was never on the
3601
3225
  library public surface—it was a demo-private chassis primitive.
3602
3226
  No `src/` source / barrel / package.json export changes.
@@ -3611,8 +3235,7 @@ All three remain on `@mkbabb/glass-ui` (vueuse-free) via
3611
3235
 
3612
3236
  #### Primitives KEPT (2nd consumer wired)
3613
3237
 
3614
- L.W3 Lane B wired second consumers for three primitives that reached
3615
- the wave at 1 consumer:
3238
+ v1.0 wired second consumers for three primitives that had one:
3616
3239
 
3617
3240
  - **`<DiscoGlyph>`**—2nd consumer at
3618
3241
  `demo/stories/foundations/chart-chassis-palette.vue` (chart-token
@@ -3630,7 +3253,7 @@ No consumer-side change. All three remain exported via the root barrel
3630
3253
 
3631
3254
  ### 5. Composables restructure (internal re-org)
3632
3255
 
3633
- L.W2 Lane A restructured `src/composables/` into coherent sub-trees.
3256
+ v1.0 restructured `src/composables/` into coherent sub-trees.
3634
3257
  **This affects you ONLY if you import directly from a deep relative
3635
3258
  path** (e.g., `@mkbabb/glass-ui/src/composables/useTimer`). The public
3636
3259
  surface (`@mkbabb/glass-ui` root barrel + named subpaths) is unchanged
@@ -3724,23 +3347,22 @@ const studio = useConfiguratorState<MyConfig>({
3724
3347
  });
3725
3348
  ```
3726
3349
 
3727
- The L W7 Lane B Option-A unification (Rε §A.8) routed aurora's per-preset clone semantics through the canonical primitive; `useAuroraStudio` was demo-private and retired. `cyclePreset` also accepts an optional `direction?: 1 | -1` (default `1`) so consumers can map `ArrowLeft` / `ArrowRight` keyboard handlers cleanly. Purely additive—no consumer migration required.
3350
+ Aurora's per-preset clone semantics now route through the canonical primitive; `useAuroraStudio` was demo-private and retired. `cyclePreset` also accepts an optional `direction?: 1 | -1` (default `1`) so consumers can map `ArrowLeft` / `ArrowRight` keyboard handlers cleanly. Purely additive—no consumer migration required.
3728
3351
 
3729
3352
  ---
3730
3353
 
3731
- ## v2.0.0—Motion subpath surgery (AI.W1 R3)
3354
+ ## v2.0.0—Motion subpath surgery
3732
3355
 
3733
- v2.0.0 closes the **AI-CARRY-GLASS-UI-KEYFRAMES-EDGE** chronic (4-tranche
3734
- deferral from AI). The root barrel statically reached `@mkbabb/keyframes.js`
3356
+ The root barrel statically reached `@mkbabb/keyframes.js`
3735
3357
  through `composables/motion`, which forced every consumer's entry chunk to
3736
3358
  carry the ~102 KB raw / ~34 KB gz `keyframes-*.js` chunk even when the
3737
3359
  consumer only imported `<Card>` or `<Button>`. The motion composables now
3738
3360
  live on the `@mkbabb/glass-ui/motion` flat subpath. The root barrel is
3739
3361
  keyframes.js-free.
3740
3362
 
3741
- The shape mirrors the L.W1 Lane C SCC-trap closure that carved `/dark`,
3742
- `/keyboard`, and `/carousel` off the root barrel for the vueuse-bearing
3743
- surface. Same precedent, different heavy peer.
3363
+ The shape mirrors the v1.0 move that carved `/dark`, `/keyboard`, and `/carousel`
3364
+ off the root barrel for the vueuse-bearing surface. Same precedent, different heavy
3365
+ peer.
3744
3366
 
3745
3367
  ### Symbols moved—root barrel → `/motion`
3746
3368
 
@@ -3850,14 +3472,12 @@ routes that don't use motion composables. The carry retires per route.
3850
3472
 
3851
3473
  ### No back-compat shim
3852
3474
 
3853
- Per precept 1 (NO workarounds) + precept 2 (NO legacy code) + L invariant 4
3854
- (no backwards-compat shims), v2.0.0 ships no root-barrel alias for the moved
3855
- symbols. Pinning to `^1.9.3` remains supported on the v1.x patch stream if a
3475
+ v2.0.0 ships no root-barrel alias for the moved symbols. Pinning to `^1.9.3` remains supported on the v1.x patch stream if a
3856
3476
  consumer cannot migrate immediately.
3857
3477
 
3858
3478
  ---
3859
3479
 
3860
- ## v3.0.0—`/motion-core` engine-free carve (AP.W3 R0G-7)
3480
+ ## v3.0.0—`/motion-core` engine-free carve
3861
3481
 
3862
3482
  v2.0.0 moved the whole motion sub-tree onto `/motion` on the theory that "the
3863
3483
  bundler walks the sub-tree's `export *` chain as one SCC anyway" — so splitting
@@ -3930,17 +3550,15 @@ grep -c "@mkbabb/keyframes" node_modules/@mkbabb/glass-ui/dist/motion.js
3930
3550
 
3931
3551
  ### No back-compat shim
3932
3552
 
3933
- Per inv 47 (no back-compat alias on `/motion` for the relocated leaves) +
3934
- precept 1/2 + L invariant 4, `/motion` ships no alias for the carved symbols.
3553
+ `/motion` ships no alias for the carved symbols.
3935
3554
  Consumers rename per call site (the diffs are mechanical 1-line edits).
3936
3555
 
3937
3556
  ---
3938
3557
 
3939
- ## v1.2.1—Aurora init fail-explicit (O.W1 Lane A)
3558
+ ## v1.2.1—Aurora init fail-explicit
3940
3559
 
3941
- Per O invariant 24 (library-internal contract violations throw; browser-API
3942
- degradation paths remain befitting silent fallbacks), `<Aurora>` init failure
3943
- is now **fail-explicit**.
3560
+ Library-internal contract violations now throw, while browser-API degradation paths
3561
+ keep a silent fallback, so `<Aurora>` init failure is now **fail-explicit**.
3944
3562
 
3945
3563
  ### Before (≤ v1.2.0)
3946
3564
 
@@ -3993,8 +3611,7 @@ The top-level prop wins when both are set.
3993
3611
 
3994
3612
  ### Why the change
3995
3613
 
3996
- Per Rα FAIL-EXPLICITLY F1 (`docs/tranches/O/research/Ralpha-legacy-code.md:85`)
3997
- and O invariant 24:
3614
+ The rule is:
3998
3615
 
3999
3616
  - Library-internal contract (shader compile / factory init / WebGL2 unavailable)
4000
3617
  → throw.
@@ -4015,13 +3632,10 @@ consumer can decide how to handle it.
4015
3632
  call site.
4016
3633
  - If you have an error boundary upstream and want the failure to surface
4017
3634
  there, no change needed.
4018
- - Speedtest's single `<Aurora>` call site (`src/App.vue:5`) inherits the
4019
- fail-explicit default—the consumer-side disposition is coordinated at
4020
- the cross-repo cohort wave (O.W6).
4021
3635
 
4022
3636
  ---
4023
3637
 
4024
- ## v1.3.0—`avatarVariant` → `avatarVariants` (O.W4 Lane C)
3638
+ ## v1.3.0—`avatarVariant` → `avatarVariants`
4025
3639
 
4026
3640
  Renamed for consistency with the other variants constants in the library
4027
3641
  (`buttonVariants`, `toggleVariants`, `badgeVariants`, `sliderVariants`, ...).
@@ -4035,16 +3649,11 @@ import { avatarVariant } from "@mkbabb/glass-ui";
4035
3649
  import { avatarVariants } from "@mkbabb/glass-ui";
4036
3650
  ```
4037
3651
 
4038
- The `AvatarVariants` type alias is unchanged. Cross-repo audit
4039
- (`words`, `fourier-analysis`, `bbnf-buddy`, `keyframes.js`, `value.js`,
4040
- `speedtest`) found one passthrough re-export site
4041
- (`value.js/demo/@/components/avatar/index.ts`); coordinated at O.W6
4042
- cross-repo cohort wave. No other production call sites use the symbol
4043
- across the constellation.
3652
+ The `AvatarVariants` type alias is unchanged.
4044
3653
 
4045
3654
  ---
4046
3655
 
4047
- ## v1.3.0—`useDarkModeSync` → `installDarkModeSync` (O.W4 Lane B)
3656
+ ## v1.3.0—`useDarkModeSync` → `installDarkModeSync`
4048
3657
 
4049
3658
  Renamed because the composable doesn't follow the canonical `useFoo`
4050
3659
  contract—it returns `void` after installing a `watch` side-effect.
@@ -4061,14 +3670,9 @@ import { installDarkModeSync } from "@mkbabb/glass-ui";
4061
3670
  installDarkModeSync(localIsDark);
4062
3671
  ```
4063
3672
 
4064
- Cross-repo audit found 3 references in speedtest
4065
- (`src/components/speedtest/SpeedtestMeter.vue`,
4066
- `src/components/dashboard/composables/useEChartsTheme.ts`); coordinated
4067
- at O.W6 cross-repo cohort. No other constellation references.
4068
-
4069
3673
  ---
4070
3674
 
4071
- ## Metric consolidation — BI.W-P117
3675
+ ## Metric consolidation (7.0.0)
4072
3676
 
4073
3677
  The three parallel metric packages are replaced by one static numeric-readout family.
4074
3678
  `MetricBadge` becomes `Metric`; `MetricCell`, `MetricRow`, and `MetricStack` retain their
@@ -4105,7 +3709,7 @@ root-barrel imports for non-vueuse-bearing symbols) and still saw the
4105
3709
  -32.5 KB entry-chunk gz drop. Per-package subpath imports are an
4106
3710
  incremental polish above that baseline.
4107
3711
 
4108
- ### Adaptive glass over light — the self-engage default + the sampled observer (AZ.W-ADAPTIVE-AUTO)
3712
+ ### Adaptive glass over light — the self-engage default + the sampled observer
4109
3713
 
4110
3714
  Glass surfaces (the dock + the `.glass-card`/`.glass-resting`/`.glass-quiet`/`.glass-wash`
4111
3715
  content tiers + the overlay band) now **self-darken over light backdrops by default** —
@@ -4133,14 +3737,14 @@ barrel promotion (`docs/consumer-evidence/use-glass-backdrop-luminance.md`).
4133
3737
 
4134
3738
  ---
4135
3739
 
4136
- ### The luminous-dark transmissive material + the calm-light recalibration (BA.W-DARK-MATERIAL)
3740
+ ### The luminous-dark transmissive material + the calm-light recalibration
4137
3741
 
4138
3742
  The DARK register was rebuilt as a luminous transmissive material, and the LIGHT
4139
3743
  content-tier self-engage was recalibrated. Both are **token-identity evolutions, NOT
4140
3744
  breaking aliases** (the lib's own default tokens evolve as the lib's identity changes —
4141
3745
  presets-in-consumers; no clean-break migration, no codemod).
4142
3746
 
4143
- **1 — The calm-light recalibration (the slides gray-slab fix).** The content tiers
3747
+ **1 — The calm-light recalibration (no more gray slab).** The content tiers
4144
3748
  (`.glass-card`/`.glass-resting`/`.glass-quiet`/`.glass-wash`) no longer apply the full 20%
4145
3749
  AA darken UNCONDITIONALLY — over a plain LIGHT page they self-engage only a sub-perceptual
4146
3750
  `--glass-tint-strength-floor` (4%), so a calm-light card stays a translucent WARM cream
@@ -4170,15 +3774,14 @@ otherwise.
4170
3774
  **3 — The `--surface-tint-*` family gained a dark arm.** In dark the family now mixes
4171
3775
  toward a light ink (`hsl(48 12% 96%)`) so chip backplates / hairlines / the dock-rail
4172
3776
  divider / the timeline dot read against the near-black card (was: invisible — collapsed
4173
- into the plate). The light arm + the in-srgb interpolation are UNCHANGED (the AW.W26
4174
- fence). Every `--surface-tint-*` consumer re-resolves automatically — no per-site edit.
3777
+ into the plate). The light arm + the in-srgb interpolation are UNCHANGED. Every `--surface-tint-*` consumer re-resolves automatically — no per-site edit.
4175
3778
 
4176
- ### The warm-chroma floor — the neutral ladder + glass plate off gray (BA.W-NO-GRAY)
3779
+ ### The warm-chroma floor — the neutral ladder + glass plate off gray
4177
3780
 
4178
3781
  The `--neutral-*` ladder + the `--card` glass plate were re-saturated onto the warm
4179
- identity (R10-5 "No gray."). This is a **token-identity evolution, NOT a breaking alias**
4180
- (the lib's own default tokens evolve as its identity changes — presets-in-consumers; no
4181
- clean-break migration, no codemod). The ladder was SPECIFIED warm (hue 48) but RESOLVED
3782
+ identity, off gray. This is a **token-identity evolution, NOT a breaking alias**
3783
+ (the library's own default tokens evolve as its identity changes; no migration, no
3784
+ codemod). The ladder was SPECIFIED warm (hue 48) but RESOLVED
4182
3785
  achromatic — at the library's low saturation it painted a yellow-green gray (OKLab hue ~95°,
4183
3786
  chroma below the perceptual floor). The values evolve, both modes in lockstep:
4184
3787
 
@@ -4195,7 +3798,7 @@ chroma below the perceptual floor). The values evolve, both modes in lockstep:
4195
3798
  | `--glass-border-*` rim α | wash 8% → overlay 18% | wash 11% → overlay 22% (warmer rim) |
4196
3799
 
4197
3800
  The moves are **chroma-only at constant L** — the L (and therefore every AA contrast ratio)
4198
- is preserved to within ±0.005 of HEAD (the gate re-ratifies). **`--card` now decouples from
3801
+ is preserved to within ±0.005. **`--card` now decouples from
4199
3802
  `--neutral-0`** (a glass plate reads warm-cream over a flat backdrop, the page stays calm
4200
3803
  surface). A consumer who OVERRODE any `--neutral-*` rung or `--card` (presets-in-consumers)
4201
3804
  RE-PINS their own value in `:root`/`.dark` — those overrides win as before; no action
@@ -4213,16 +3816,16 @@ still tracks the ladder, so a consumer reading those gets the warm value automat
4213
3816
 
4214
3817
  ---
4215
3818
 
4216
- ### The scroll-state edge fade — `.scroll-fade-*` → `<FadingScroll>` + `--mask-fade-width` → `--fade-scroll-width` (BA.W-FADING-SCROLL)
3819
+ ### The scroll-state edge fade — `.scroll-fade-*` → `<FadingScroll>` + `--mask-fade-width` → `--fade-scroll-width`
4217
3820
 
4218
3821
  The scroll-BLIND static `.scroll-fade-mask` / `.scroll-fade-y` / `.scroll-fade-top` /
4219
3822
  `.scroll-fade-bottom` mask utilities are SUPERSEDED by the scroll-state-driven
4220
3823
  `<FadingScroll>` primitive (`@mkbabb/glass-ui/fading-scroll`, axis `x`|`y`). The static
4221
3824
  masks feathered BOTH edges unconditionally with no scroll knowledge — so the first card's
4222
- chrome was half-erased at `scroll = 0` (the R8-08 "Shy" defect). `<FadingScroll>` feathers
3825
+ chrome was half-erased at `scroll = 0`. `<FadingScroll>` feathers
4223
3826
  the start edge ONLY past `scroll > 0` and the end edge ONLY while trailing overflow remains.
4224
3827
  This is a **CLEAN BREAK — no alias** (the static utilities + the `--mask-fade-width` token
4225
- were RETIRED at the 4.1.0 cut — BB.W-SCROLL-FADE-RETIRE — after every consumer migrated).
3828
+ were removed at 4.1.0).
4226
3829
 
4227
3830
  | was | now |
4228
3831
  |---|---|
@@ -4256,15 +3859,15 @@ legibility cue, not motion — it stops interpolating, the discrete edge presenc
4256
3859
 
4257
3860
  ---
4258
3861
 
4259
- ### The disco CTA register retired — `btn-audacious` / `btn-audacious-gold` GONE (BA.W-GLASS-CAL, hinge H2a)
3862
+ ### The disco CTA register retired — `btn-audacious` / `btn-audacious-gold` GONE
4260
3863
 
4261
3864
  The user removed the "disco effect" wholesale. The `@utility btn-audacious` + `@utility btn-audacious-gold`
4262
3865
  recipes (the sparkle `✦` glyph, the disco-grain hover, the gold-sweep shimmer, the typed press-ripple)
4263
3866
  and their `@keyframes sparkle-sweep` / `btn-gold-bg-sweep` + the `--duration-sparkle` /
4264
3867
  `--glass-grain-opacity-disco` / `--ripple-radius-max` / `--motion-duration-ripple` knobs are **DELETED —
4265
- clean break, no alias** (house no-backwards-compat). The `primary-audacious` / `gold-audacious` Button
4266
- **variant keys are KEPT and re-pointed** onto the calm glass-first register (hinge H2 arm a — _gold
4267
- survives CALM_), so a `<Button variant="primary-audacious">` / `variant="gold-audacious">` call site needs
3868
+ clean break, no alias**. The `primary-audacious` / `gold-audacious` Button
3869
+ **variant keys are KEPT and re-pointed** onto the calm glass-first register (gold survives,
3870
+ calm), so a `<Button variant="primary-audacious">` / `variant="gold-audacious">` call site needs
4268
3871
  **no change** — it inherits the new register automatically. Only a consumer that applied the `btn-audacious`
4269
3872
  _utility class directly_ (not via the variant) must migrate.
4270
3873
 
@@ -4279,11 +3882,11 @@ _utility class directly_ (not via the variant) must migrate.
4279
3882
  The dock-tab PRIMARY tier (`<DockTabButton data-tier="primary">`) no longer auto-attaches `btn-audacious` or
4280
3883
  paints the phase-grain hover/halo — it reads the plain de-red'd dock-control glass hover register. The
4281
3884
  `data-tier="primary"` styling hook is **unchanged** (the taller/wider structural shell stays); only the disco
4282
- accents drop. **Speedtest + slides:** any direct `btn-audacious` class binding migrates to the calm glass
4283
- register per the table; the `gold-audacious` / `primary-audacious` _variant_ consumers are untouched. This is
4284
- a **breaking change for direct-utility consumers** (an input to the 4.0.0-vs-3.14.0 version call at W-CLOSE).
3885
+ accents drop. Any direct `btn-audacious` class binding migrates to the calm glass register per the
3886
+ table; the `gold-audacious` / `primary-audacious` _variant_ consumers are untouched. This is a
3887
+ **breaking change for direct-utility consumers**, one reason the release is 4.0.0.
4285
3888
 
4286
- ### Per-spring duration clock minted — `--spring-<name>-duration` (BA.W-GLASS-CAL Unit 3)
3889
+ ### Per-spring duration clock minted — `--spring-<name>-duration`
4287
3890
 
4288
3891
  ADDITIVE — no migration required. `--spring-<name>-duration` (generated from the `(response, ζ)` SPRING_PRESETS
4289
3892
  table: smooth 0.36s / snappy 0.34s / bouncy 0.69s / gentle 0.44s / dock 0.28s) is the spring's OWN settle clock.
@@ -4300,7 +3903,7 @@ v0.9.4 remains available indefinitely as a v0.9.x patch-stream tag.
4300
3903
  v1.0 adoption is opt-in. If you cannot migrate immediately:
4301
3904
 
4302
3905
  - Pin to `^0.9.4` in `package.json`.
4303
- - The K.WS subpath typing-publication gap is patched at v0.9.4—you can
3906
+ - The subpath typing-publication gap is patched at v0.9.4—you can
4304
3907
  adopt subpath imports incrementally (`@mkbabb/glass-ui/forms`,
4305
3908
  `@mkbabb/glass-ui/composables/dark`, etc.) without breaking your
4306
3909
  existing root-barrel calls.
@@ -4326,34 +3929,32 @@ touched 15 src/ files:
4326
3929
  | `registerShortcut` → `/keyboard` | 2 sites (incl. 1 test mock) | ~2 min |
4327
3930
  | Build + typecheck + lighthouse re-probe | — | ~15 min |
4328
3931
 
4329
- Cross-repo observed deltas (from
4330
- `docs/tranches/L/coordination/speedtest-Y.md`):
3932
+ Observed deltas in that app:
4331
3933
 
4332
3934
  | Indicator | Pre-v1.0 | Post-v1.0 | Delta |
4333
3935
  |---|---|---|---|
4334
3936
  | `dist/index.html` modulepreload directives | 1 | 0 | canonical SCC closure |
4335
- | Entry chunk gz (speedtest) | ~204 KB (X close) | 171.5 KB | -32.5 KB |
4336
- | Glass-ui `dist/glass-ui.js` gz | 33.6 KB (K close) | 22.4 KB | -11.2 KB |
4337
- | Glass-ui `dist/glass-ui.js` raw | 189 KB (K close) | 124.8 KB | -65 KB |
4338
- | Subpath dts publication (`/dark`, `/keyboard`, `/api`, `/carousel`) | broken (K.WS regression) | self-contained | gap closed |
3937
+ | Entry chunk gz | ~204 KB | 171.5 KB | -32.5 KB |
3938
+ | Glass-ui `dist/glass-ui.js` gz | 33.6 KB | 22.4 KB | -11.2 KB |
3939
+ | Glass-ui `dist/glass-ui.js` raw | 189 KB | 124.8 KB | -65 KB |
3940
+ | Subpath dts publication (`/dark`, `/keyboard`, `/api`, `/carousel`) | broken | self-contained | gap closed |
4339
3941
 
4340
3942
  Speedtest build PASS in 9.83s. Consumer-side vue-tsc resolution clean.
4341
3943
 
4342
3944
  ---
4343
3945
 
4344
- ## Production demo build—formal retire (per L.W5 Lane B Option B)
3946
+ ## Production demo build—formal retire
4345
3947
 
4346
3948
  `npm run build` is library-mode only—it produces the `dist/glass-ui.{js,css,d.ts}`
4347
3949
  bundle plus the per-subpath dist artefacts. There is NO `vite.demo.config.ts`
4348
3950
  that produces a static demo build artefact.
4349
3951
 
4350
- **Disposition at L.W5**: option B—formally retire the demo as a production
4351
- deploy target. Rationale:
3952
+ **Disposition**: the demo is retired as a production deploy target. Rationale:
4352
3953
 
4353
3954
  - The demo storybook is dev-mode-only—the canonical workflow is `npm run dev`
4354
3955
  → Vite dev server.
4355
3956
  - Lighthouse audits run against the dev server with the documented dev-mode
4356
- caveat. The K.W4 + L.W6 Lighthouse passes used this workflow.
3957
+ caveat.
4357
3958
  - Consumer-deploy concerns (CloudFlare Pages, Vercel, GitHub Pages hosting,
4358
3959
  cache-TTL, etc.) are out of glass-ui scope—they belong to consumer repos
4359
3960
  (speedtest is the canonical reference for demo build chains).
@@ -4399,7 +4000,7 @@ rg '"@mkbabb/glass-ui/(pagination|virtual)"' src/
4399
4000
 
4400
4001
  ---
4401
4002
 
4402
- ## reka-ui 2.x — Combobox `searchTerm` → `ComboboxInput` v-model (AW.W26)
4003
+ ## reka-ui 2.x — Combobox `searchTerm` → `ComboboxInput` v-model
4403
4004
 
4404
4005
  > Downstream-consumer note. glass-ui's own `Combobox*` wrappers are ALREADY on
4405
4006
  > the canonical 2.x shape — this note is for consumers who hand-wired the reka
@@ -4410,8 +4011,7 @@ reka-ui 2.x moved the search/filter term OFF `ComboboxRoot` and ONTO
4410
4011
  `ComboboxInput`'s `v-model`. The pre-2.x `<ComboboxRoot v-model:search-term>`
4411
4012
  binding **silently no-ops** on 2.x (the prop no longer exists on the root) — and
4412
4013
  because a stale reka model binding is a no-op, neither `vue-tsc` nor a unit test
4413
- catches it; only a render-effect probe does (the standing binding-verification
4414
- note + glass-ui's own `proof:reka-binding-idiom` render guard).
4014
+ catches it; only a test that checks the rendered effect does.
4415
4015
 
4416
4016
  ```vue
4417
4017
  <!-- BEFORE (pre-2.x) — the filter term on the root -->
@@ -4434,20 +4034,9 @@ reka usage. Sweep on every reka major bump.
4434
4034
 
4435
4035
  ## Reference
4436
4036
 
4437
- - **CHANGELOG**: full v1.0 entry at the top of `CHANGELOG.md`.
4438
- - **Tranche plan**: `docs/tranches/L/L.md` (invariants, hard gates).
4439
- - **HEADLINE wave proof**: `docs/tranches/L/audit/W1-{A,B,C}-*.md`
4440
- (root-barrel curation, api/ discovery, subpath flatten).
4441
- - **Wire-or-retire proofs**: `docs/tranches/L/audit/W3-{A,B}-*.md`
4442
- (composables + primitives).
4443
- - **Cross-repo verification**: `docs/tranches/L/coordination/speedtest-Y.md`
4444
- (re-link ledger, before/after deltas).
4445
- - **Research basis**: `docs/tranches/L/research/Rε-architectural-transpositions.md`
4446
- (HEADLINE rationale).
4447
- - **Speedtest re-link diff**: speedtest commit `98f88325`
4448
- (`feat(deps): adopt glass-ui v1.0`).
4449
-
4450
- ## 3.13.0 — the constellation kVis floor (R5-8, additive)
4037
+ - **CHANGELOG**: the v1.0 entry in `CHANGELOG.md`.
4038
+
4039
+ ## 3.13.0 — the constellation kVis floor (additive)
4451
4040
 
4452
4041
  The constellation gains a visual-size draw-scale FLOOR: `kVis = max(k, kFloor)` applied by
4453
4042
  `drawNodes`/`drawEdges`/`drawPointerWeb`/`drawRipples` to SIZES (dot radii, line widths, the
@@ -4457,27 +4046,25 @@ cursor dot, the ripple ring) while TRUE `k` keeps positions and reach. On a 390p
4457
4046
  `/constellation`: `DEFAULT_K_FLOOR` (0.72) + `kVisOf(field)` (for `drawOverlay` skins to floor
4458
4047
  their own marks); new optional `ConstellationField.kFloor` member, tokenable per instance via
4459
4048
  `--constellation-k-floor` (read by `<Constellation>` from the canvas). No API changes to the
4460
- existing exports; the slides deck-side `K_VIS_FLOOR` interim arm retires on this release.
4049
+ existing exports. If you floored your own marks with a local constant, read `kVisOf` instead.
4461
4050
 
4462
- ## BA — the d6-lineage A/B reconciliation (the Connectivity Atlas fold)
4051
+ ## 4.0.0 — coming from the 3.11.x / 3.12.0 registry versions
4463
4052
 
4464
- The Connectivity Atlas consumed the d6 fork lineage (the registry 3.11.x/3.12.0 publishes)
4465
- and moves to mainline. BA.W-ATLAS-RECONCILE folds the d6 A/B registers need-shaped. Per the
4466
- atlas letter: zero legacy shims, zero compat re-exports — where an idiom was superseded, the
4467
- new shape is below and the consumer migrates. The full old→new table is in
4468
- `docs/tranches/BA/audit/W-ATLAS-RECONCILE-cut-notes.md`.
4053
+ The 3.11.x and 3.12.0 versions on the registry were published from a separate line. 4.0.0
4054
+ brings their surfaces back to the main line with no legacy shims and no compatibility
4055
+ re-exports: where an idiom was superseded, the new shape is below and you migrate to it.
4469
4056
 
4470
4057
  ### A-1 — the post-flip settle seam (ADDITIVE, no migration)
4471
4058
 
4472
- `useGlobalDark().onFlipSettled(cb)` returns to mainline ADOPTED VERBATIM from the d6 fork —
4059
+ `useGlobalDark().onFlipSettled(cb)` returns unchanged —
4473
4060
  register ONE post-flip post-paint callback (`(isDark: boolean) => void`) that batches N
4474
4061
  expensive re-theme ops (palette memo + chart retint + aurora re-derivation) into a single
4475
4062
  coalesced `requestAnimationFrame` beat per flip. On `/dark` + `/api`
4476
- (`DarkFlipSettledCallback`). No call-site change vs the fork — byte-identical seam.
4063
+ (`DarkFlipSettledCallback`). No call-site change.
4477
4064
 
4478
4065
  ### A-4a — `PAPER_WASH_GROUND` (ADDITIVE, no migration)
4479
4066
 
4480
- The library-canon recessive-ground crayon calibration partial returns ADOPTED VERBATIM. On
4067
+ The recessive-ground crayon calibration partial returns unchanged. On
4481
4068
  the `/aurora` barrel + `/api`. Spread it over a consumer's pole-derived pigment:
4482
4069
  `const cfg = { ...consumerBase, ...PAPER_WASH_GROUND }`.
4483
4070
 
@@ -4503,55 +4090,45 @@ capability gate. The mutation itself always runs.
4503
4090
 
4504
4091
  The silver structure metal (`--silver`/`-light`/`-dark`/`-deep` + `--color-silver*` aliases,
4505
4092
  gold's cool mirror) + the `<InstrumentChassis variant="structure">` register (the cool
4506
- milled-metal housing). The atlas's structure surface adopts `variant="structure"` (or reads
4507
- the `--color-silver*` tokens) for the precision-instrument register.
4093
+ milled-metal housing). A structure surface adopts `variant="structure"` (or reads the
4094
+ `--color-silver*` tokens) for the precision-instrument register.
4508
4095
 
4509
- ### A-5 — `MetricBadge` `amount`→`value` (ONE-LINE RENAME; already shipped at AZ)
4096
+ ### A-5 — `MetricBadge` `amount`→`value` (one-line rename; shipped at 3.13.0)
4510
4097
 
4511
- `<MetricBadge :amount="…">` → `<MetricBadge :value="…">`. The atlas acknowledged this is
4512
- intentional; see the AZ.W-METRIC-UNIFY row above (`MIGRATION.md` §3.x amount→value).
4098
+ `<MetricBadge :amount="…">` → `<MetricBadge :value="…">`; see §3.13.0.
4513
4099
 
4514
- ## BA → 4.0.0 — the dark-register-rebuilt cut (the clean breaks)
4100
+ ## 4.0.0 — the rebuilt dark register (the clean breaks)
4515
4101
 
4516
- The 4.0.0 major collects the BA tranche's clean breaks (no aliases, no compat shims — the
4517
- no-backwards-compat house rule: a clean break IS a major). H4 SETTLED to **4.0.0** on the
4518
- atlas register-D two grounds (§the d6 reconciliation above): the A-list is a
4519
- removal+re-add for a live 3.12.0 fork consumer, AND BA carries its own breaks below. Each row
4520
- names the wave, the break, and the consumer re-pin action. **The value.js-impacting rows
4521
- (tabs, Dialog, menu-row, Select, Slider) are flagged `[value.js]` by name** — value.js is the
4522
- live 3.13.0 registry consumer owed the named cut-notes (the atlas register-D discipline — by
4523
- name, never silently; the full value.js adopt is `docs/tranches/BA/audit/valuejs-adopt-book.md`).
4102
+ 4.0.0 collects these clean breaks (no aliases, no compat shims; a clean break is a major).
4103
+ Each row names the break and what to change. **The rows that touch value.js (tabs, Dialog,
4104
+ menu-row, Select, Slider) are flagged `[value.js]`.**
4524
4105
 
4525
- ### The disco retirement (W-GLASS-CAL / H2a) — gold survives CALM
4106
+ ### The disco retirement — gold survives CALM
4526
4107
 
4527
4108
  The audacious disco-grain recipe family RETIRES (clean break, no alias): the `@utility
4528
4109
  btn-audacious` / `btn-audacious-gold` recipes, the `@keyframes sparkle-sweep` /
4529
4110
  `btn-gold-bg-sweep`, and the disco-grain knobs (`--duration-sparkle`,
4530
- `--glass-grain-opacity-disco`) are GONE. Gold survives in the CALM register per H2a arm (a):
4111
+ `--glass-grain-opacity-disco`) are GONE. Gold survives in the calm register:
4531
4112
  the static `.gold-shimmer` text gradient + the `--glass-specular` edge catch-light registers
4532
4113
  STAY (the FENCE held — only the ANIMATED sweeps die). The dock-tab primary tier collapses onto
4533
4114
  the plain glass hover register (no grain / `--phase-color` radial halo). **Consumer re-pin:**
4534
4115
  drop any `<Button variant="primary-audacious">` / `gold-audacious` binding (the variant rides
4535
- the retired recipe) or accept the calm register — the slides `DeckGate.vue:70`
4536
- `variant="primary-audacious"` is the named live break site (see the slides adopt book).
4116
+ the retired recipe) or accept the calm register.
4537
4117
 
4538
- ### The tone-on-glass recompose (W-FEEDBACK-TONE)
4118
+ ### The tone-on-glass recompose
4539
4119
 
4540
- Toast / Notification / ~~Alert~~ [2026-09-17 · Alert left the tint at 8.0.0 (W-ALERT);
4541
- see §8.0.0. Toast and Notification are not measured by this strike and stand.] tone
4542
- variants render TINTED-GLASS over the floating rung (ONE
4120
+ Toast and Notification tone variants (and Alert's, until 8.0.0; see §8.0.0) render TINTED-GLASS over the floating rung (ONE
4543
4121
  `.feedback-tone` `color-mix` recipe, α < 0.92 both modes), NOT an opaque saturated slab. The
4544
4122
  three independent tone maps collapsed onto the ONE recipe. **Consumer re-pin:** a consumer that
4545
4123
  hardcoded a tone-slab color re-points to the house tone token; the slab look is gone.
4546
4124
 
4547
- ### The static scroll-fade retirement (W-FADING-SCROLL)
4125
+ ### The static scroll-fade retirement
4548
4126
 
4549
4127
  The static `.scroll-fade-*` utilities RETIRE (clean break). **Consumer re-pin:** migrate to the
4550
4128
  `<FadingScroll>` primitive (`@mkbabb/glass-ui/fading-scroll`) — a native `scroll(self)`-driven
4551
- edge-fade with a JS fallback. A consumer's local FadingScroll prototype (slides had one) deletes
4552
- on the bump.
4129
+ edge-fade with a JS fallback. A local FadingScroll prototype of your own can be deleted.
4553
4130
 
4554
- ### PresetEditorField retires onto the Configurator chassis (W-CONFIG-CHASSIS)
4131
+ ### PresetEditorField retires onto the Configurator chassis
4555
4132
 
4556
4133
  The gear PresetEditor recomposes on the Configurator chassis; `PresetEditorField` is REMOVED
4557
4134
  (clean break). **Consumer re-pin:** the migration is the `<ConfiguratorRow>` composition shape
@@ -4560,7 +4137,7 @@ COLOR moved off the inline `border-border/30` alpha to the dark-adaptive
4560
4137
  `--configurator-divider` token, keyed by the `data-dividers` attribute (the `border-t` WIDTH
4561
4138
  arm stays).
4562
4139
 
4563
- ### The shared `surface` axis (W-SURFACE-AXIS) — incl. the Dialog break `[value.js]`
4140
+ ### The shared `surface` axis — incl. the Dialog break `[value.js]`
4564
4141
 
4565
4142
  The shared `{glass · veil · opaque}` `surface` axis is adopted across
4566
4143
  Card / GlassPanel / Dialog / Sheet / Drawer / Popover / Command / ExpandableContainer / Skeleton
@@ -4568,15 +4145,13 @@ Card / GlassPanel / Dialog / Sheet / Drawer / Popover / Command / ExpandableCont
4568
4145
  a consumer re-pins:
4569
4146
  - **The Dialog `variant`→`surface` move `[value.js]`** — Dialog's prior `variant` discriminant
4570
4147
  is the `surface` axis now. A consumer setting `<Dialog variant="…">` re-points to `surface="…"`.
4571
- (value.js DeckGate sets no `variant` on its Dialog → a NO-OP for slides specifically; the
4572
- value.js consumer of `/dialog` re-pins.)
4573
4148
  - **The GlassPanel↔Card axis reconciliation** — the two surfaces share the ONE `surface` axis;
4574
4149
  a consumer relying on the prior divergent prop shape re-pins to the unified `surface` prop.
4575
4150
  - **`<Skeleton surface="glass">`** is the named downstream register for value.js's bespoke
4576
4151
  `PaletteCardSkeleton.vue` (`bg-foreground/[0.04]` over `bg-card` — the "too black" composite)
4577
4152
  re-author at the pin.
4578
4153
 
4579
- ### The tabs taxonomy cut (W-TABS) `[value.js]`
4154
+ ### The tabs taxonomy cut `[value.js]`
4580
4155
 
4581
4156
  ONE tab engine: `<SegmentedTabs>` (`@mkbabb/glass-ui/tabs`, pill-glass + underline-paper on
4582
4157
  `.paper-ink-mark`). The clean breaks (no alias):
@@ -4589,49 +4164,44 @@ ONE tab engine: `<SegmentedTabs>` (`@mkbabb/glass-ui/tabs`, pill-glass + underli
4589
4164
  (the independent-toggles surface; Tabs is panel-nav only).
4590
4165
  - **`overflow` responsive-collapse** retired (the prior `:responsive` collapse arm).
4591
4166
  The indicator paints ONE elastic register (the oval-blob default-ON `TabsIndicator` plate is dead).
4592
- `proof:tabs-unified` re-pointed to `proof:tabs-std`.
4593
4167
 
4594
- ### The menu-row glass default flip (W-MENU-GLASS) `[value.js]`
4168
+ ### The menu-row glass default flip `[value.js]`
4595
4169
 
4596
4170
  Select and Combobox use `.glass-menu-row` through one private row-class owner. The former
4597
4171
  flat-accent alternative is removed; consumers needing product-specific flat paint own that
4598
4172
  composition. DropdownMenu and Command keep their component-local row classes, while
4599
4173
  `.glass-menu-section` remains the section caption/hairline register.
4600
4174
 
4601
- ### The `/underline`→`/handmark` DEC-8 fold (W-HANDMARK)
4175
+ ### The `/underline`→`/handmark` fold
4602
4176
 
4603
- The d6 hand-voice family RE-LANDS on `@mkbabb/glass-ui/handmark` (`HandMark`/`InkMark`/`BRUSHES`).
4177
+ The hand-drawn family re-lands on `@mkbabb/glass-ui/handmark` (`HandMark`/`InkMark`/`BRUSHES`).
4604
4178
  The prior `GlassUnderline` + `custom/underline/` + the `/underline` subpath RETIRE (clean break,
4605
4179
  grep-negative survivor). **Consumer re-pin:** a consumer importing `@mkbabb/glass-ui/underline` /
4606
- `GlassUnderline` re-points to `/handmark` (`<HandMark>`). (slides imports ZERO `/underline` — the
4607
- red pen-underlines on its intro/closer slides are deck-LOCAL CSS/SVG glyphs, never the library
4608
- component; a NO-OP for slides — see the slides adopt book.)
4180
+ `GlassUnderline` re-points to `/handmark` (`<HandMark>`).
4609
4181
 
4610
- ### The `CarouselDots`→`PagerDots` retirement (W-PAGER)
4182
+ ### The `CarouselDots`→`PagerDots` retirement
4611
4183
 
4612
4184
  `CarouselDots` RETIRES onto the unified `<PagerDots>` + `.glass-pager-ring` register
4613
- (`@mkbabb/glass-ui/pager`) — the carousel counter off the dark `bg-card` slab. The dots and the
4614
- slides `DeckPager` were ALREADY one recipe (≥2 consumers by construction). **Consumer re-pin:**
4185
+ (`@mkbabb/glass-ui/pager`) — the carousel counter off the dark `bg-card` slab. **Consumer re-pin:**
4615
4186
  a `CarouselDots` consumer re-points to `<PagerDots>`.
4616
4187
 
4617
- ### Dark-material token-identity NOTEs (W-DARK-MATERIAL — token re-points, not API breaks)
4188
+ ### Dark-material token-identity NOTEs (token re-points, not API breaks)
4618
4189
 
4619
4190
  The dark register is rebuilt on the EXISTING `--glass-tint-*` seam (no new compositing seam):
4620
4191
  the page→card L-point split (page L6→L4, card L10→L16), the transmissive dark `saturate`/
4621
4192
  `brightness` arm + edge α 0.22, the dark tint LIFT 12%, and the `--primary` →
4622
4193
  legendre-violet (`oklch(0.739 0.134 318.1)`, fg 7.15:1). These are TOKEN re-resolutions on the
4623
4194
  inheriting axis — a consumer overriding a `--glass-*` / `--primary` token re-checks its value
4624
- against the rebuilt register, but there is no API/prop break (the W-DARK-MATERIAL scope-7
4625
- self-engage conditionalization REMOVES the gray-slab self-engage a calm-light content card
4626
- composited — a consumer's content card un-grays at the bump with ZERO consumer edit).
4195
+ against the rebuilt register, but there is no API/prop break. The light content card no
4196
+ longer composites a gray slab, so it un-grays at the bump with no edit.
4627
4197
 
4628
- ### Warm-chroma-floor NOTEs (W-NO-GRAY — token re-saturation, not API breaks)
4198
+ ### Warm-chroma-floor NOTEs (token re-saturation, not API breaks)
4629
4199
 
4630
4200
  The neutral ladder + light glass plates + borders are re-saturated onto the warm identity (the
4631
4201
  achromatic-48 ladder lifted above the C 0.020 chroma floor). TOKEN re-resolution; no API break.
4632
4202
  A consumer overriding a neutral token re-checks its chroma.
4633
4203
 
4634
- ### The `--glass-blur-*` dial-back (W-GLASS-CAL B1 — token re-point, not API break)
4204
+ ### The `--glass-blur-*` dial-back (token re-point, not API break)
4635
4205
 
4636
4206
  The six `--glass-blur-*-radius` primitives dialed back ~15-20% within the 8-15px band
4637
4207
  (`10/12/16/15/11` → `8/10/13/13/9`; wash unchanged at 1px; the dock radius 11px→9px). TOKEN
@@ -4639,21 +4209,21 @@ re-resolution; no API break. The per-spring `--spring-<name>-duration` vocabular
4639
4209
  analytic 2%-band settle envelope, GENERATED from `SPRING_PRESETS`) — a consumer that rode a
4640
4210
  `--spring-*` easing on a generic `--duration-*` clock gains the matched per-spring duration.
4641
4211
 
4642
- ### The `@source` re-point (W-EMISSION — consumer-wiring fix, not an API break)
4212
+ ### The `@source` re-point (consumer-wiring fix, not an API break)
4643
4213
 
4644
4214
  The dead `@source` in `index.css` re-points to the real `dist/` surface so glass-ui's compiled
4645
4215
  utilities reach a consumer's Tailwind content-scan again. The Select collision-bound + inner-
4646
4216
  scroll ship as PRECOMPILED CSS; the Slider `size` axis now renders REAL track geometry in every
4647
4217
  consumer (no rename, but the rendered behaviour changes — a consumer relying on the silently-6px
4648
4218
  track now gets the real `size` track) `[value.js — the A-3 Slider size axis]`. The
4649
- `SelectTrigger` `size` gained a font-rung prop writing `--dropdown-text` `[value.js — WO-3]`.
4219
+ `SelectTrigger` `size` gained a font-rung prop writing `--dropdown-text` `[value.js]`.
4650
4220
 
4651
- ### `MetricBadge` `amount`→`value` (already shipped at AZ; re-flagged here for the BA consumer set)
4221
+ ### `MetricBadge` `amount`→`value` (shipped at 3.13.0; repeated here)
4652
4222
 
4653
- Carried verbatim from AZ.W-METRIC-UNIFY (above) — a ONE-LINE `amount=`→`value=` rename per call
4654
- site. Named here so a consumer adopting the 4.0.0 cut sees it in the BA break list.
4223
+ A one-line `amount=`→`value=` rename per call site, listed here so a consumer adopting 4.0.0
4224
+ sees it with the other breaks.
4655
4225
 
4656
- ### `Drawer*` moves to the `/drawer` subpath (BB.W-DRAWER-ABROGATE — clean break, no alias)
4226
+ ### `Drawer*` moves to the `/drawer` subpath (clean break, no alias)
4657
4227
 
4658
4228
  The Drawer family is re-built on reka `DialogRoot` + the house `useDrawerSnap` engine (a
4659
4229
  `@mkbabb/keyframes.js` `SpringProgress` consumer), abrogating vaul-vue (the lone `@vueuse/core
@@ -4674,11 +4244,11 @@ hand-styled `[data-vaul-snap-points]` re-points to `[data-glass-drawer-snap-poin
4674
4244
  direction-aware default snap ladder is now native (`resolveDefaultSnapPoints(direction)` — no more
4675
4245
  `:snap-points="[]"` workaround for a full-slide left/right drawer).
4676
4246
 
4677
- ### `.glass-refract` → `.glass-lens` (BB.W-LENSING — clean break, no alias)
4247
+ ### `.glass-refract` → `.glass-lens` (clean break, no alias)
4678
4248
 
4679
4249
  The refractive-glass opt-in class is renamed `.glass-refract` → `.glass-lens` (the iOS-26
4680
4250
  edge-lensing vocabulary). The class now composes the EVOLVED squircle bevel-profile displacement
4681
- filter (the crude AW.W23 uniform-radial map is RETIRED) + the typed inheriting `--glass-refract`
4251
+ filter (the old uniform-radial map is gone) + the typed inheriting `--glass-refract`
4682
4252
  magnitude axis (the `:active` lens-swell). The `--glass-refract*` AXIS/token names are KEPT (only the
4683
4253
  opt-in CLASS renames). One-line rename per call site:
4684
4254
 
@@ -4693,7 +4263,7 @@ opt-in CLASS renames). One-line rename per call site:
4693
4263
  the un-gated blur+tint base (PRESERVED — see the runtime-latch note below, which replaces the
4694
4264
  former `@supports` gate).
4695
4265
 
4696
- ### `.glass-lens` Chromium refraction now rides a runtime latch — arm it once (BJ.W-REFRACT-LATCH)
4266
+ ### `.glass-lens` Chromium refraction now rides a runtime latch — arm it once
4697
4267
 
4698
4268
  > **VOID at 8.0.0.** The latch, `armGlassRefract()`, `supportsBackdropRefract()`, and
4699
4269
  > `.glass-lens` itself are DELETED — see §8.0.0. The "required consumer action" below is
@@ -4728,7 +4298,7 @@ surface you author yourself.
4728
4298
  contract. The lens degrades to its documented blur floor (the same floor Safari holds) until an app
4729
4299
  root calls `armGlassRefract()`; on Chromium the refraction garnish is simply absent.
4730
4300
 
4731
- ### Refraction gains a Tier-1 WebGL2 FLOOR — the SOTA degrade ladder (BG.W-GLASS-REFRACT-WEBGL — additive, no consumer break)
4301
+ ### Refraction gains a Tier-1 WebGL2 FLOOR — the SOTA degrade ladder (additive, no consumer break)
4732
4302
 
4733
4303
  The `.glass-lens` refraction now sits on a three-rung SOTA degrade ladder, so the depth-refraction reads
4734
4304
  on EVERY engine — not just Chromium:
@@ -4751,7 +4321,7 @@ and leaves it 0 for the depth-only lens. The `--glass-chromatic-strength` float
4751
4321
  Tier-0 `--glass-edge-dispersion` box-shadow rung (they do NOT collide — one is a GL-uniform float, the
4752
4322
  other a CSS box-shadow).
4753
4323
 
4754
- ### `popover-animate` / `slide-in-from-side` → `.glass-reveal` (BB.W-LIQUID-REVEAL — clean break, no alias)
4324
+ ### `popover-animate` / `slide-in-from-side` → `.glass-reveal` (clean break, no alias)
4755
4325
 
4756
4326
  The reka-overlay enter `@utility popover-animate` (the fixed-bezier `zoom-in-95` + `fade-in-0`) AND
4757
4327
  `@utility slide-in-from-side` are RETIRED, replaced by the spring-clocked LIQUID-ENTER recipe
@@ -4777,20 +4347,19 @@ bloom JS leaf (the dialog-from-button / dock-from-pill case), composing the kf `
4777
4347
  `springTimingFunction`. The CSS `.glass-reveal` recipe is the zero-JS everywhere floor; the JS leaf is
4778
4348
  the source-rect refinement.
4779
4349
 
4780
- ## BG — the glass standardization cut (clean breaks)
4350
+ ## 5.0.0 — the glass standardization (clean breaks)
4781
4351
 
4782
- ### The `--glass-blur-dock` chain RETIRES (BG.W-CLOSEFIX-9SITE — clean break, no alias)
4352
+ ### The `--glass-blur-dock` chain RETIRES (clean break, no alias)
4783
4353
 
4784
4354
  The dock-own blur register — `--glass-blur-dock` (light + dark composite), `--glass-saturate-dock`
4785
4355
  (light + dark), `--glass-blur-dock-radius`, and the `--blur-dock` `@theme` bridge (→ the `blur-dock` /
4786
- `backdrop-blur-dock` Tailwind utility) — is RETIRED wholesale. It was orphaned at BG.W-GLASS-BLUR-PEER,
4787
- which re-pointed the dock's backdrop onto the ONE unified glass material via `--dock-surface-blur:
4356
+ `backdrop-blur-dock` Tailwind utility) — is RETIRED wholesale. The dock's backdrop now reads the ONE unified glass material via `--dock-surface-blur:
4788
4357
  var(--glass-blur-resting)` (the 8px resting peer). The dock now paints its blur through that peer; there
4789
4358
  is no dock-own rung.
4790
4359
 
4791
4360
  **Consumer impact:** none for the token cascade (the chain had zero external readers — the dock reads
4792
4361
  the resting peer, and the `blur-dock` Tailwind utility had zero consumers). A consumer who authored
4793
- `class="blur-dock"` / `class="backdrop-blur-dock"` directly (there were none in the constellation) re-points
4362
+ `class="blur-dock"` / `class="backdrop-blur-dock"` directly re-points
4794
4363
  to `backdrop-blur-glass-resting` (the 8px material) or overrides the `--glass-blur-resting-radius` primitive.
4795
4364
  A consumer who overrode `:root { --glass-blur-dock-radius: … }` to retune the dock blur now overrides
4796
4365
  `--glass-blur-resting-radius` (the substitution-vs-composite discipline — the dock shares the resting
@@ -4799,30 +4368,24 @@ material).
4799
4368
  ```css
4800
4369
  /* before (v4.2.0) — retune the dock blur */
4801
4370
  :root { --glass-blur-dock-radius: 12px; }
4802
- /* after (BG) — the dock reads the unified resting material */
4371
+ /* after (5.0.0) — the dock reads the unified resting material */
4803
4372
  :root { --glass-blur-resting-radius: 12px; }
4804
4373
  ```
4805
4374
 
4806
- This retire ROW is the **bbnf-buddy row-4 by-name-ask witness** of the 5.0.0-BH-B7
4807
- consumer-migration roster (`bbnf-glass-blur-dock-retune-no-op`; `preset.css:230`) —
4808
- the sole in-repo witness now that the sibling-probe gate `proof:retired-token-consumers`
4809
- is KILLED (ruling #3). A consumer overriding `--glass-blur-dock`/`-radius`/`--glass-saturate-dock`
4810
- drops the dead override on its own bump; there is no glass-ui gate probing the sibling
4811
- tree. See `docs/tranches/BH/coordination/asks-and-consumes.md` (row 4) + `proof:crossrepo-asks:bh`
4812
- (the `>=4` covered-floor).
4375
+ A consumer overriding `--glass-blur-dock`/`-radius`/`--glass-saturate-dock` drops the dead
4376
+ override when it upgrades.
4813
4377
 
4814
- ### `ladder.css` / `shell.css` carves (BG.W-CLOSEFIX-9SITE — no-god-module, no consumer impact)
4378
+ ### `ladder.css` / `shell.css` carves (no-god-module, no consumer impact)
4815
4379
 
4816
4380
  `glass/ladder.css`'s grain `::after` overlay tail carves into `glass/grain-overlay.css`, and `dock/shell.css`'s
4817
4381
  `#persistent` region + vertical layer-stack tail carves into `dock/shell-regions.css` (each @import-ed
4818
4382
  IMMEDIATELY AFTER its parent in the SAME `@layer components`, cascade-order-invariant → the `/styles`
4819
4383
  draw is unchanged). Internal carves to hold the 500-line no-god-module bound; zero API/paint delta.
4820
4384
 
4821
- ### The dead-composable cut (BG.W-DEAD-COMPOSABLE-CUT — clean break, no alias)
4385
+ ### The dead-composable cut (clean break, no alias)
4822
4386
 
4823
- Five F5-motion composables (+ their paired CSS, tests, "≥2-consumer" evidence docs, and subject
4824
- gates) shipped with 0-1 real binary consumers — the shelf-ware the fewer-sharper-primitives law
4825
- forbids. They are DEFINITION-ABSENT (a clean cut; there is no replacement primitive because there
4387
+ Five motion composables (and their paired CSS) had at most one real consumer, so they are
4388
+ removed (a clean cut; there is no replacement primitive because there
4826
4389
  was no real consumer to serve). The dead `useMorphField()` WELD (zero callers) is GUTTED to its
4827
4390
  motion-named SIGNATURE DATA.
4828
4391
 
@@ -4835,4 +4398,4 @@ motion-named SIGNATURE DATA.
4835
4398
  | `useDockContextSilhouette` (+ `AppSwitcher`'s stale reference) | never exported (`custom/dock/composables/`) | REMOVED — no live consumer (the founding demo reads `useBloomUp`); a future dock context→silhouette need re-enters through the shipped dock-morph family. |
4836
4399
  | `useMorphField()` (the weld function + `MorphTier`/`MorphSilhouette`/`MorphFieldRect`/`BodySpec`/`MorphFieldOptions`/`MorphFieldHandle`) | root barrel · `/motion-core` | GUTTED — the weld body had ZERO callers. Its live surface — `MORPH_SIGNATURES` + `MorphSignature`/`MorphSignatureName`/`MorphVector` — MOVES to `composables/motion/morphSignatures.ts` and STAYS on the barrel (byte-identical DATA). |
4837
4400
 
4838
- **Consumer re-pin (`MORPH_SIGNATURES`):** none — the import path is unchanged (the root barrel + `/motion-core` still re-export `MORPH_SIGNATURES` and the three signature types). Only the `useMorphField` function symbol + its function-domain types leave the surface. Machine-locked by `proof:motion` (the DEFINITION-ABSENCE + the gut + the name-collision fence against `proof:liquid-morph`, the DISTINCT BC dock-morph gate).
4401
+ **Consumer re-pin (`MORPH_SIGNATURES`):** none — the import path is unchanged (the root barrel + `/motion-core` still re-export `MORPH_SIGNATURES` and the three signature types). Only the `useMorphField` function symbol + its function-domain types leave the surface.