@mkbabb/glass-ui 2.1.0 → 3.1.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 (194) hide show
  1. package/dist/{CardFooter-Yi0xtLLd.js → CardFooter-CSGcJkqa.js} +1 -1
  2. package/dist/{CommandShortcut-_INFUMu6.js → CommandShortcut-DWT19a2Y.js} +3 -3
  3. package/dist/{ContextMenuSubContent-DCkweFW9.js → ContextMenuSubContent-gAFxJ-qi.js} +1 -1
  4. package/dist/{DataTable-Ce00dbHD.js → DataTable-R8-Zidms.js} +3 -3
  5. package/dist/{DialogContent-CmCijgX9.js → DialogContent-2fALDSvc.js} +3 -3
  6. package/dist/{DialogFooter-DRdaCok0.js → DialogFooter-ClrNEOVU.js} +2 -2
  7. package/dist/{DiscoGlyph-wRA02zAJ.js → DiscoGlyph-C3JfMnRV.js} +1 -1
  8. package/dist/{GlyphFace-BnPMUZ16.js → GlyphFace-BRS8vUb7.js} +1 -1
  9. package/dist/HoverPopover-CWFCfLx3.js +96 -0
  10. package/dist/{IconTooltip-ge_mBSWR.js → IconTooltip-BkaA7tZ2.js} +1 -1
  11. package/dist/{Input-CbakTe3B.js → Input-DDpFn568.js} +3 -5
  12. package/dist/Label-DJty89bp.js +36 -0
  13. package/dist/{MetricBadge-DRBB18Xq.js → MetricBadge-DmAihkXd.js} +1 -1
  14. package/dist/{Notification-DrI1DT2v.js → Notification-OqIpADml.js} +2 -2
  15. package/dist/NumberFieldContent-DTH9gb_N.js +141 -0
  16. package/dist/{PopoverContent-BCH4eYs8.js → PopoverContent-EiklFrna.js} +1 -1
  17. package/dist/{Progress-CCH-2UBR.js → Progress-FApA9fm_.js} +1 -1
  18. package/dist/{ScrollingText-7P8skg5W.js → ScrollingText-BFd0i2zJ.js} +2 -2
  19. package/dist/{SelectScrollDownButton-yu8EYUnu.js → SelectScrollDownButton-Dth8-wXQ.js} +2 -2
  20. package/dist/{Toaster-DY8_jtHv.js → Toaster-Bjlunvq4.js} +69 -58
  21. package/dist/UnderlineTabs-DAWMLmJG.js +37 -0
  22. package/dist/animated-digit.js +2 -2
  23. package/dist/api/index.d.ts +2 -0
  24. package/dist/api.js +1 -1
  25. package/dist/aurora.js +103 -90
  26. package/dist/badge.js +1 -1
  27. package/dist/{button-BlOW34DT.js → button-C0aHmBbt.js} +2 -0
  28. package/dist/button.js +1 -1
  29. package/dist/card.js +1 -1
  30. package/dist/carousel.js +1 -1
  31. package/dist/collapsible.js +1 -1
  32. package/dist/command.js +1 -1
  33. package/dist/components/custom/aurora/composables/runtime.d.ts +24 -1
  34. package/dist/components/custom/dialog-native/GlassDialogNative.vue.d.ts +57 -0
  35. package/dist/components/custom/dialog-native/index.d.ts +1 -0
  36. package/dist/components/custom/dock/composables/useLayerTransition.d.ts +20 -10
  37. package/dist/components/custom/hover-popover/HoverPopover.vue.d.ts +26 -4
  38. package/dist/components/custom/labeled-field/LabeledField.vue.d.ts +16 -2
  39. package/dist/components/custom/labeled-field/LabeledInput.vue.d.ts +17 -1
  40. package/dist/components/custom/labeled-field/LabeledSelect.vue.d.ts +2 -0
  41. package/dist/components/custom/labeled-field/LabeledSlider.vue.d.ts +2 -0
  42. package/dist/components/custom/labeled-field/LabeledSwitch.vue.d.ts +2 -0
  43. package/dist/components/custom/toggle-chip/ToggleChip.vue.d.ts +6 -4
  44. package/dist/components/ui/input/Input.vue.d.ts +10 -7
  45. package/dist/components/ui/label/Label.vue.d.ts +8 -0
  46. package/dist/components/ui/textarea/Textarea.vue.d.ts +45 -8
  47. package/dist/components/ui/toast/Toaster.vue.d.ts +7 -1
  48. package/dist/components/ui/toast/index.d.ts +1 -0
  49. package/dist/composables/dark/index.d.ts +1 -0
  50. package/dist/composables/dom/index.d.ts +2 -0
  51. package/dist/composables/dom/useIdleReady.d.ts +63 -0
  52. package/dist/composables/dom/useUserInvalidAria.d.ts +32 -0
  53. package/dist/composables/index.d.ts +1 -0
  54. package/dist/composables/motion/core/index.d.ts +8 -0
  55. package/dist/composables/motion/index.d.ts +0 -7
  56. package/dist/composables/motion/supportsCssTimeline.d.ts +8 -0
  57. package/dist/composables/motion/useRAFLoop.d.ts +7 -0
  58. package/dist/composables/motion/useScrollProgress.d.ts +6 -2
  59. package/dist/composables/motion/useStaggerReveal.d.ts +6 -0
  60. package/dist/composables/motion/useViewTransition.d.ts +31 -0
  61. package/dist/composables/motion/useYieldToMain.d.ts +29 -0
  62. package/dist/configurator.js +1 -1
  63. package/dist/confirm-dialog.js +2 -2
  64. package/dist/constants-DwBwnG8N.js +13 -0
  65. package/dist/context-menu.js +2 -2
  66. package/dist/controls.js +2 -2
  67. package/dist/dark.d.ts +1 -1
  68. package/dist/dark.js +13 -2
  69. package/dist/data-table.js +1 -1
  70. package/dist/dialog.js +2 -2
  71. package/dist/disco-glyph.js +1 -1
  72. package/dist/dock.js +195 -176
  73. package/dist/dom.js +5 -4
  74. package/dist/{dropdown-menu-2K-SGkZU.js → dropdown-menu-BvRUamNs.js} +2 -2
  75. package/dist/dropdown-menu.js +1 -1
  76. package/dist/expandable-container.js +3 -3
  77. package/dist/forms.d.ts +1 -0
  78. package/dist/forms.js +47 -42
  79. package/dist/glass-carousel.js +1 -1
  80. package/dist/glass-panel.js +2 -2
  81. package/dist/glass-ui.css +1 -1
  82. package/dist/glass-ui.js +156 -275
  83. package/dist/glyph-face.js +2 -2
  84. package/dist/header-ribbon.js +1 -1
  85. package/dist/hover-card.js +1 -1
  86. package/dist/hover-popover.js +1 -1
  87. package/dist/icon-tooltip.js +1 -1
  88. package/dist/index.d.ts +1 -0
  89. package/dist/instrument-chassis.js +1 -1
  90. package/dist/instrument-rail.js +1 -1
  91. package/dist/keyboard.js +1 -1
  92. package/dist/label.js +1 -1
  93. package/dist/labeled-field.js +96 -57
  94. package/dist/metric-badge.js +1 -1
  95. package/dist/metric-stack.js +1 -1
  96. package/dist/motion-core.d.ts +1 -0
  97. package/dist/motion-core.js +229 -0
  98. package/dist/motion.js +26 -228
  99. package/dist/notification.js +1 -1
  100. package/dist/number-field.d.ts +1 -0
  101. package/dist/number-field.js +2 -0
  102. package/dist/paper-backdrop.js +1 -1
  103. package/dist/popover.js +1 -1
  104. package/dist/progress.js +1 -1
  105. package/dist/pulse.js +1 -1
  106. package/dist/reactive.js +2 -2
  107. package/dist/responsive-tabs.js +3 -3
  108. package/dist/scrolling-text.js +1 -1
  109. package/dist/search.js +6 -6
  110. package/dist/select.js +3 -3
  111. package/dist/separator.js +1 -1
  112. package/dist/{sheet-CLVkb3AO.js → sheet-CukNDezz.js} +53 -53
  113. package/dist/sheet.js +1 -1
  114. package/dist/{slider-BQaLYFLh.js → slider-DJvHkTRe.js} +3 -3
  115. package/dist/slider.js +1 -1
  116. package/dist/sortable-list.js +2 -2
  117. package/dist/styles/animations.css +77 -0
  118. package/dist/styles/cards.css +6 -2
  119. package/dist/styles/dock.css +109 -109
  120. package/dist/styles/drawer.css +2 -2
  121. package/dist/styles/glass.css +89 -6
  122. package/dist/styles/index.css +10 -1
  123. package/dist/styles/instrument-chassis.css +28 -1
  124. package/dist/styles/scroll-driven.css +72 -0
  125. package/dist/styles/theme.css +6 -0
  126. package/dist/styles/tokens.css +345 -289
  127. package/dist/styles/typography.css +65 -131
  128. package/dist/styles/utilities.css +199 -81
  129. package/dist/styles/view-transition.css +62 -0
  130. package/dist/switch.d.ts +1 -0
  131. package/dist/switch.js +2 -0
  132. package/dist/tabs.js +40 -36
  133. package/dist/timeline.js +2 -2
  134. package/dist/toast.js +1 -1
  135. package/dist/toggle-group.js +1 -1
  136. package/dist/tooltip.js +1 -1
  137. package/dist/typewriter.js +1 -1
  138. package/dist/{useAnimatedNumber-DcvTR9B4.js → useAnimatedNumber-DKQYVB7s.js} +9 -20
  139. package/dist/{useConfiguratorState-BlaevW0S.js → useConfiguratorState-BR5vUDL8.js} +5 -5
  140. package/dist/{useBreakpoint-BHlX-MhR.js → useIdleReady-Cmkhm03v.js} +30 -2
  141. package/dist/{useTouchGate-BhhEMlwJ.js → useTouchGate-D9Zvrzyc.js} +1 -1
  142. package/dist/useUserInvalidAria-DVu1eTXG.js +29 -0
  143. package/dist/useViewTransition-DYIK6Gzb.js +16 -0
  144. package/dist/utils/index.d.ts +1 -0
  145. package/dist/utils/moveBefore.d.ts +15 -0
  146. package/package.json +27 -6
  147. package/src/styles/animations.css +77 -0
  148. package/src/styles/cards.css +6 -2
  149. package/src/styles/dock.css +109 -109
  150. package/src/styles/drawer.css +2 -2
  151. package/src/styles/glass.css +89 -6
  152. package/src/styles/index.css +10 -1
  153. package/src/styles/instrument-chassis.css +28 -1
  154. package/src/styles/scroll-driven.css +72 -0
  155. package/src/styles/theme.css +6 -0
  156. package/src/styles/tokens.css +345 -289
  157. package/src/styles/typography.css +65 -131
  158. package/src/styles/utilities.css +199 -81
  159. package/src/styles/view-transition.css +62 -0
  160. package/dist/HoverPopover-Btv4RQfv.js +0 -80
  161. package/dist/Label-C8QMJSsf.js +0 -32
  162. package/dist/UnderlineTabs-BtrUcXn-.js +0 -64
  163. package/dist/composables/motion/useSpringOrchestrator.d.ts +0 -15
  164. /package/dist/{CollapsibleContent-DHRuXE3P.js → CollapsibleContent-CVMOcYlV.js} +0 -0
  165. /package/dist/{ContextMenuContent-CvXfU5qz.js → ContextMenuContent-otjFIu8v.js} +0 -0
  166. /package/dist/{HoverCardContent-4nN5-5bz.js → HoverCardContent-DaGrgJBO.js} +0 -0
  167. /package/dist/{InstrumentChassis-DOaVYyWq.js → InstrumentChassis-CnHTMxds.js} +0 -0
  168. /package/dist/{InstrumentRail-jHDqXj70.js → InstrumentRail-C6dEbi8E.js} +0 -0
  169. /package/dist/{ModalOverlay-DKLVY-cj.js → ModalOverlay-iWiAgbYH.js} +0 -0
  170. /package/dist/{PaperBackdrop-Bc2drCqJ.js → PaperBackdrop-CeZ-w0R0.js} +0 -0
  171. /package/dist/{SelectGroup-O69GTQ77.js → SelectGroup-DdR4tdDY.js} +0 -0
  172. /package/dist/{SelectSeparator-GTHxKO0a.js → SelectSeparator-CXm_hlqA.js} +0 -0
  173. /package/dist/{Separator-_NCypg_C.js → Separator-D8AUMhxY.js} +0 -0
  174. /package/dist/{Switch-CL0uxu8F.js → Switch-Cr1t_F_U.js} +0 -0
  175. /package/dist/{ToggleGroupItem-BYG_8M9M.js → ToggleGroupItem-OesUouE7.js} +0 -0
  176. /package/dist/{TooltipProvider-C5QLSPto.js → TooltipProvider-DE78vbEP.js} +0 -0
  177. /package/dist/{_plugin-vue_export-helper-n-_DRHWS.js → _plugin-vue_export-helper-Dq1MygBL.js} +0 -0
  178. /package/dist/{badge-BbxVKZfw.js → badge-x46my_Fo.js} +0 -0
  179. /package/dist/composables/{motion → dark}/installDarkModeSync.d.ts +0 -0
  180. /package/dist/{dockContext-BDGSrwsV.js → dockContext-D5NZCWJs.js} +0 -0
  181. /package/dist/{keys-DVkcUktU.js → keys-CaTQS-vx.js} +0 -0
  182. /package/dist/{menuItemVariants-B2nDL7zH.js → menuItemVariants-BsbGNq9C.js} +0 -0
  183. /package/dist/{presets-BMzCDrmR.js → presets-a-D93K1S.js} +0 -0
  184. /package/dist/{search-ocd8tmL9.js → search-DBAiUABx.js} +0 -0
  185. /package/dist/{useGlassRenderer-DMDdMH55.js → useGlassRenderer-Ds-nmrGz.js} +0 -0
  186. /package/dist/{useGlobalDark-PMiP5Jku.js → useGlobalDark-B0WvLJE3.js} +0 -0
  187. /package/dist/{useIntersectionPause-CXYfYg_C.js → useIntersectionPause-IY2CwPQb.js} +0 -0
  188. /package/dist/{useInterval-COlTCeVa.js → useInterval-DVgGUf_y.js} +0 -0
  189. /package/dist/{useKeyboardShortcuts-B1ev1YEC.js → useKeyboardShortcuts-Dpw_RUcB.js} +0 -0
  190. /package/dist/{useResizeObserver-F4aRR4Cj.js → useResizeObserver-Cg9npuM3.js} +0 -0
  191. /package/dist/{useSortable-Ck0rBJ4g.js → useSortable-Cq2Y1JLO.js} +0 -0
  192. /package/dist/{useSpringMount-BTRBNzXP.js → useSpringMount-Cfk1XK1R.js} +0 -0
  193. /package/dist/{useTimer-lp5NlH4w.js → useTimer-NAaj9zNq.js} +0 -0
  194. /package/dist/{x-cdWAmO-q.js → x-q7pJa83X.js} +0 -0
@@ -10,59 +10,27 @@
10
10
  * (`.text-display-*`, `.text-body`, `.text-admin-label`) and feature
11
11
  * utilities (`.cm-serif`, `.fira-code`, `.fourier-f`).
12
12
  *
13
- * AC.W6b (v1.5.0)self-host font subsystem
14
- * ────────────────────────────────────────────
15
- * Glass-ui ships two OFL-1.1 face families as bundled woff2 assets under
16
- * `src/fonts/`:
17
- *
18
- * - **Plus Jakarta Sans** (latin + latin-ext, variable wght 200..800).
19
- * Selected as the brand display sans-serif substitute via AC.W6b's
20
- * 5-way visual-fidelity test against pre-substitution General Sans
21
- * baseline at 1200×766 hero size. Closest character match among the
22
- * OFL candidate menu (Plus Jakarta Sans / Onest / Manrope / Inter /
23
- * Geist). Carries `font-display: optional` so paint never blocks on
24
- * the LCP-critical hero font.
25
- *
26
- * - **Fira Code** (latin + latin-ext, variable wght 300..700). The
27
- * canonical glass-ui mono. OFL — full self-host permitted. Carries
28
- * `font-display: swap` (post-LCP register; visual swap acceptable).
29
- *
30
- * Both ship with Capsize-calibrated `size-adjust` / `ascent-override` /
31
- * `descent-override` metric overrides on the matching fallback faces so
32
- * the swap (system → primary) is geometry-neutral; CLS contribution
33
- * from the font-load is zero by construction.
34
- *
35
- * Consumers map `--font-brand-sans` / `--font-display` / `--font-mono`
36
- * to reference these self-hosted families and get the full gestalt-2
37
- * stack (self-host + optional + size-adjust + metric overrides) at the
38
- * substrate layer without re-introducing third-party CDN dependencies
39
- * on the LCP-critical path.
13
+ * Self-host font subsystem glass-ui ships two OFL-1.1 face families as
14
+ * bundled woff2 assets: Plus Jakarta Sans (brand display sans, font-display:
15
+ * optional) + Fira Code (canonical mono, font-display: swap). Both ship with
16
+ * Capsize-calibrated size-adjust / ascent-override / descent-override on the
17
+ * matching fallback faces so the swap is geometry-neutral (zero CLS). Consumers
18
+ * map --font-brand-sans / --font-display / --font-mono to reference them, no
19
+ * third-party CDN dependency on the LCP-critical path.
40
20
  */
41
21
 
42
22
  /* ═══════════════════════════════════════════════
43
23
  OFL FACE FILES — Plus Jakarta Sans (brand display)
44
24
  ═══════════════════════════════════════════════ */
45
25
 
46
- /* The payload-bearing "Plus Jakarta Sans" faces (latin + latin-ext woff2)
47
- live in `fonts.css`, reachable via the `@mkbabb/glass-ui/styles/fonts`
48
- export. They are split off the critical entry path so `./styles` (first
49
- paint) does not carry the ~99 KB-gzipped base64 font binary. Consumers
50
- import `…/styles/fonts` once, separately. The calibrated `local()`
51
- fallback face below carries NO payload and stays on the critical path —
52
- it is what paints during the `font-display: optional` window. */
53
-
54
- /* Plus Jakarta Sans — calibrated fallback face.
55
- Wraps the platform's system sans-serif (San Francisco / Segoe UI /
56
- Roboto / Arial) and overrides its metrics to match Plus Jakarta Sans's
57
- x-width + ascent + descent. While the primary face hasn't arrived
58
- (font-display: optional → renders in fallback if not in cache within
59
- the 100ms block window), the fallback paints at Plus Jakarta's
60
- geometry — the swap is metrically neutral, no CLS contribution.
61
-
62
- The four values (size-adjust + ascent-override + descent-override per
63
- system face) were derived programmatically via @capsizecss/core's
64
- `createFontStack` against the bundled latin woff2 (AC.W6b Capsize
65
- calibration; receipts at docs/tranches/AC/artefacts/W6b/). */
26
+ /* The payload-bearing "Plus Jakarta Sans" faces live in `fonts.css`
27
+ (`@mkbabb/glass-ui/styles/fonts`), split off the critical entry path so
28
+ `./styles` does not carry the ~99 KB-gzipped font binary. The calibrated
29
+ `local()` fallback face below carries NO payload, stays on the critical
30
+ path, and paints during the `font-display: optional` window. Its metric
31
+ overrides (per system face) were derived via @capsizecss/core's
32
+ `createFontStack` against the bundled latin woff2 — the swap is metrically
33
+ neutral (no CLS). */
66
34
  @font-face {
67
35
  font-family: "Plus Jakarta Sans Fallback";
68
36
  src: local("System Font"), local(".SFNS-Regular"), local(".SFNSText-Regular"),
@@ -98,19 +66,12 @@
98
66
  OFL FACE FILES — Fira Code (canonical mono)
99
67
  ═══════════════════════════════════════════════ */
100
68
 
101
- /* The payload-bearing "Fira Code" faces (latin + latin-ext woff2) live in
102
- `fonts.css`, reachable via the `@mkbabb/glass-ui/styles/fonts` export
103
- split off the critical entry path (see the Plus Jakarta note above). The
104
- calibrated `local()` fallback face below carries NO payload and stays on
105
- the critical path; it covers the `font-display: swap` window. */
106
-
107
- /* Fira Code — calibrated fallback face. Wraps the platform mono stack
108
- (SF Mono / Menlo / Consolas / Courier New) with Capsize-derived
109
- metric overrides referenced against Roboto Mono (the only mono entry
110
- in `@capsizecss/metrics`; the platform monos cluster within ~2% of
111
- Roboto Mono's metrics, so the override holds across the chain).
112
- size-adjust ≈ 1.0 means Fira Code's x-width matches the system mono
113
- exactly — the swap is geometrically transparent. */
69
+ /* The payload-bearing "Fira Code" faces live in `fonts.css`
70
+ (`@mkbabb/glass-ui/styles/fonts`), split off the critical entry path. The
71
+ calibrated `local()` fallback face below carries NO payload, stays on the
72
+ critical path, and covers the `font-display: swap` window. Its metric
73
+ overrides reference Roboto Mono (the platform monos cluster within ~2%);
74
+ size-adjust ≈ 1.0 makes the swap geometrically transparent. */
114
75
  @font-face {
115
76
  font-family: "Fira Code Fallback";
116
77
  src: local("SF Mono"), local("SFMono-Regular"), local("Menlo"),
@@ -121,37 +82,16 @@
121
82
  }
122
83
 
123
84
  :root {
124
- /* Font family tokens.
125
-
126
- `--font-serif`, `--font-display`, and `--font-mono` are NOT declared
127
- here. Their canonical source-of-truth lives in tokens.css
128
- (`--font-stack-serif`, `--font-stack-display`, `--font-stack-mono`),
129
- bridged to Tailwind utilities via the `@theme` block in theme.css
130
- (`--font-serif: var(--font-stack-serif)` etc.). Declaring them here
131
- as `:root` literals would shadow any consumer `@theme` override because
132
- un-layered `:root` declarations win over `@layer theme { :root }` in
133
- the Tailwind v4 cascade. The Q.W3 Lane F substrate revert (commit
134
- retiring the L.W1 `6ce14e5` fossil) removes those literals so the
135
- tokens.css→theme.css bridge is the single resolution path.
136
-
137
- Per AC.W6b (v1.5.0): the self-hosted OFL face files declared above
138
- expose two new family names: `"Plus Jakarta Sans"` (brand display
139
- sans — Path D substitute) + `"Fira Code"` (canonical mono). Both
140
- families pair with their respective `"... Fallback"` faces (which
141
- wrap the system fallback via `local()` + Capsize-calibrated
142
- metric overrides — the swap is no-shift on geometry).
143
-
144
- - `--font-brand-sans` ships its neutral default
145
- (`"Helvetica Neue" → Arial Nova → Arial → system-ui → sans-serif`).
146
- Consumers opting into Plus Jakarta Sans via the `brand-uniform-sans`
147
- preset override this token at `:root` to:
148
- `"Plus Jakarta Sans", "Plus Jakarta Sans Fallback", system-ui, sans-serif`.
149
-
150
- - `--font-mono` references `"Fira Code"` first so the self-hosted
151
- face engages by default for every glass-ui consumer; the
152
- calibrated `"Fira Code Fallback"` covers the swap window, then
153
- fallback `"Fira Mono"` + the generic `monospace` backstop the
154
- chain for browsers that reject local() lookups. */
85
+ /* Font family tokens. `--font-serif` / `--font-display` / `--font-mono`
86
+ are NOT declared here — their source-of-truth lives in tokens.css
87
+ (`--font-stack-*`), bridged to Tailwind via theme.css's `@theme` block;
88
+ declaring `:root` literals here would shadow consumer `@theme` overrides
89
+ (un-layered `:root` wins over `@layer theme`). The self-hosted faces
90
+ above expose `"Plus Jakarta Sans"` + `"Fira Code"`, each pairing with a
91
+ calibrated `"... Fallback"`. `--font-brand-sans` ships a neutral default;
92
+ consumers opting into Plus Jakarta via the `brand-uniform-sans` preset
93
+ override it. `--font-mono` references `"Fira Code"` first (engages by
94
+ default) then the fallback chain. */
155
95
  /* Independent brand/system sans stack; consumers override once for uniform sans. */
156
96
  --font-brand-sans: "Helvetica Neue", "Arial Nova", Arial, system-ui, sans-serif;
157
97
  --font-sans: var(--font-brand-sans);
@@ -217,31 +157,17 @@ body {
217
157
  font-optical-sizing: auto;
218
158
  font-variation-settings: var(--font-display-variation-settings);
219
159
  font-weight: var(--font-display-weight);
160
+ /* AQ.W3 §W3.3 — balance multi-line display headlines. Text-only (no box) so
161
+ balance is safe; degrades to unbalanced wrapping with zero break. */
162
+ text-wrap: balance;
220
163
  }
221
164
 
222
- /* O.W6 Lane D — `.text-hero` consumer-recipe hoist (speedtest AC.W6
223
- cohort, T_GU-HERO).
224
-
225
- The poster-type hero register. Composes the existing audacious ladder:
226
- ceiling pegs to `--type-display-audacious` (φ^(11/2) peak 352px, the
227
- fast.com peg) so consumers reading this utility against the type-scale
228
- get the canonical ceiling without re-declaring it.
229
-
230
- Three knobs let consumers tune without forking the recipe:
231
- - `--text-hero-size`: total clamp (default = canonical cap). Speedtest
232
- overrides this to `clamp(3rem, 45cqi, var(--type-display-audacious))`
233
- for its container-query metric column.
234
- - `--text-hero-leading`: line-height; default 0.84 matches speedtest's
235
- AB.W1.T3 tight-leading baseline.
236
- - `--text-hero-tracking`: letter-spacing; default -0.03em (poster-type
237
- register — tighter than `--type-tracking-tight`).
238
-
239
- `font-weight: 300` (poster-type) and `font-feature-settings: ss01,
240
- tnum, lnum` lock the numeric/stylistic-set baseline; consumers that
241
- need different features re-declare locally. The utility is otherwise
242
- substrate-only — consumer-side data-attribute registers (e.g.,
243
- speedtest's `.text-hero[data-idle]` colour cascade) compose ON TOP of
244
- this base. */
165
+ /* `.text-hero` — the poster-type hero register. Ceiling pegs to
166
+ `--type-display-audacious` (φ^(11/2) — peak 352px). Three knobs tune without
167
+ forking: `--text-hero-size` (total clamp), `--text-hero-leading` (line-height,
168
+ default 0.84), `--text-hero-tracking` (letter-spacing, default -0.03em).
169
+ `font-weight: 300` + `font-feature-settings: ss01, tnum, lnum` lock the
170
+ numeric/stylistic baseline; consumer data-attribute registers compose on top. */
245
171
  @utility text-hero {
246
172
  font-family: var(--font-display);
247
173
  font-size: var(--text-hero-size, var(--type-display-audacious));
@@ -254,7 +180,11 @@ body {
254
180
  font-variation-settings: var(--font-display-variation-settings);
255
181
  display: inline-block;
256
182
  max-inline-size: 100%;
183
+ /* AQ.W3 §W3.3 — `text-wrap: nowrap` (modern) sits AFTER `white-space:
184
+ nowrap` (legacy fallback) so supporting engines honor the modern form and
185
+ older ones fall through to `white-space`. Forgiving parse, no `@supports`. */
257
186
  white-space: nowrap;
187
+ text-wrap: nowrap;
258
188
  }
259
189
 
260
190
  @utility text-display-hero {
@@ -265,6 +195,7 @@ body {
265
195
  font-optical-sizing: auto;
266
196
  font-variation-settings: var(--font-display-variation-settings);
267
197
  font-weight: var(--font-display-weight);
198
+ text-wrap: balance; /* AQ.W3 §W3.3 */
268
199
  }
269
200
 
270
201
  @utility text-display-mega {
@@ -275,6 +206,7 @@ body {
275
206
  font-optical-sizing: auto;
276
207
  font-variation-settings: var(--font-display-variation-settings);
277
208
  font-weight: var(--font-display-weight);
209
+ text-wrap: balance; /* AQ.W3 §W3.3 */
278
210
  }
279
211
 
280
212
  @utility text-display-5 {
@@ -285,6 +217,7 @@ body {
285
217
  font-optical-sizing: auto;
286
218
  font-variation-settings: var(--font-display-variation-settings);
287
219
  font-weight: var(--font-display-weight);
220
+ text-wrap: balance; /* AQ.W3 §W3.3 */
288
221
  }
289
222
 
290
223
  @utility text-display-4 {
@@ -295,6 +228,7 @@ body {
295
228
  font-optical-sizing: auto;
296
229
  font-variation-settings: var(--font-display-variation-settings);
297
230
  font-weight: var(--font-display-weight);
231
+ text-wrap: balance; /* AQ.W3 §W3.3 */
298
232
  }
299
233
 
300
234
  @utility text-display-3 {
@@ -305,6 +239,7 @@ body {
305
239
  font-optical-sizing: auto;
306
240
  font-variation-settings: var(--font-display-variation-settings);
307
241
  font-weight: var(--font-display-weight);
242
+ text-wrap: balance; /* AQ.W3 §W3.3 */
308
243
  }
309
244
 
310
245
  @utility text-display-2 {
@@ -315,6 +250,7 @@ body {
315
250
  font-optical-sizing: auto;
316
251
  font-variation-settings: var(--font-display-variation-settings);
317
252
  font-weight: var(--font-display-weight);
253
+ text-wrap: balance; /* AQ.W3 §W3.3 */
318
254
  }
319
255
 
320
256
  @utility text-display {
@@ -325,6 +261,7 @@ body {
325
261
  font-optical-sizing: auto;
326
262
  font-variation-settings: var(--font-display-variation-settings);
327
263
  font-weight: var(--font-display-weight);
264
+ text-wrap: balance; /* AQ.W3 §W3.3 */
328
265
  }
329
266
 
330
267
  /* ═══════════════════════════════════════════════
@@ -336,6 +273,7 @@ body {
336
273
  line-height: var(--type-leading-heading);
337
274
  letter-spacing: var(--type-tracking-tight);
338
275
  font-weight: 700;
276
+ text-wrap: balance; /* AQ.W3 §W3.3 */
339
277
  }
340
278
 
341
279
  @utility text-heading {
@@ -343,6 +281,7 @@ body {
343
281
  font-size: var(--type-heading);
344
282
  line-height: var(--type-leading-heading);
345
283
  font-weight: 700;
284
+ text-wrap: balance; /* AQ.W3 §W3.3 */
346
285
  }
347
286
 
348
287
  @utility text-subheading {
@@ -350,25 +289,16 @@ body {
350
289
  font-size: var(--type-subheading);
351
290
  line-height: var(--type-leading-body);
352
291
  font-weight: 600;
292
+ text-wrap: balance; /* AQ.W3 §W3.3 */
353
293
  }
354
294
 
355
- /* AB.W1.T5 — canonical dock control label register.
356
- Use case: text labels INSIDE `.dock-tab-button` (Start, Next, Submit,
357
- Done, New Test, survey labels). The dock-tab-button shell itself owns
358
- `--type-small` as a fallback, but consumers wanting an emphatic label
359
- character (slightly larger than the body small register) reach for
360
- `.dock-label` rather than `.text-heading` `.text-heading` is the
361
- heading register and carries `font-weight: 700`, which reads as
362
- literal bold inside a dock pill (the user mandate is "the start text
363
- should not be bold", redressed to every bottom-dock label).
364
-
365
- Composes the audacious-dock `--dock-label-size` knob when set
366
- (utilities.css §audacious mobile carve declares `--dock-label-size:
367
- 14-15px` at narrow viewports); falls back to `--type-subheading` so
368
- the register stays one rung above body-small at desktop. Weight 400
369
- (regular) per the standing precept: Plus Jakarta Sans at the dock
370
- pill size reads visually heavier than the numeric weight implies, so
371
- the regular rung is the correct register for the not-bold posture. */
295
+ /* Canonical dock control label register — text labels INSIDE
296
+ `.dock-tab-button` (Start, Next, Submit, …) that want an emphatic character
297
+ without `.text-heading`'s `font-weight: 700` (which reads as literal bold in
298
+ a dock pill). Composes the `--dock-label-size` knob when set (dock.css
299
+ audacious mobile carve), else `--type-subheading`. Weight 400 Plus Jakarta
300
+ reads heavier than its numeric weight at pill size, so regular is the
301
+ not-bold register. */
372
302
  @utility dock-label {
373
303
  font-family: var(--font-serif);
374
304
  font-size: var(--dock-label-size, var(--type-subheading));
@@ -382,6 +312,9 @@ body {
382
312
  font-size: var(--type-prose);
383
313
  line-height: var(--type-leading-prose);
384
314
  font-weight: 400;
315
+ /* AQ.W3 §W3.3 — `pretty` fixes orphans/rivers in prose. Prose registers
316
+ only (not every text class); degrades to default wrapping, zero break. */
317
+ text-wrap: pretty;
385
318
  }
386
319
 
387
320
  @utility text-body {
@@ -389,6 +322,7 @@ body {
389
322
  font-size: var(--type-body);
390
323
  line-height: var(--type-leading-body);
391
324
  font-weight: 400;
325
+ text-wrap: pretty; /* AQ.W3 §W3.3 */
392
326
  }
393
327
 
394
328
  @utility text-small {