@cueplusplus/tokens 0.13.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 CUE++ contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,100 @@
1
+ # @cueplusplus/tokens
2
+
3
+ The token layer under `@cueplusplus/ui`, for an app that needs the vocabulary by name rather than
4
+ through a component: **five density rungs × eight font pairings**, authored as DTCG source and
5
+ compiled to attribute-scoped CSS custom properties.
6
+
7
+ Two of the system's three DOM axes live here, and they own strictly disjoint token sets:
8
+
9
+ | axis | owns |
10
+ | --- | --- |
11
+ | `[data-density]` | geometry — control heights, radii, spacing, type sizes |
12
+ | `[data-font]` | the three type stacks a pairing names |
13
+
14
+ **Colour is not here.** The third axis, `[data-theme]`, left this package: a palette is a package
15
+ of its own now (`@cueplusplus/theme-<name>`, and anybody else's), so there is no `THEMES` export,
16
+ no `ThemeName`, and `dist/theme.css` is a deprecated alias of `axes.css` — kept through 0.10, and
17
+ removed in the minor after. The blank palette an unstamped page paints lives in
18
+ `@cueplusplus/theme-base`.
19
+
20
+ ## Install
21
+
22
+ The `@cueplusplus` scope is served by **GitHub Packages**, not npmjs.com, and GitHub Packages
23
+ authenticates *every* install. That is two settings, in two places, and the split is not
24
+ cosmetic — pnpm ignores an env-expanded credential in a project `.npmrc` and the install fails
25
+ with `401`.
26
+
27
+ Commit the scope routing, and nothing else, at the root of your project:
28
+
29
+ ```ini
30
+ # .npmrc
31
+ @cueplusplus:registry=https://npm.pkg.github.com
32
+ ```
33
+
34
+ Then write the credential once, at the **user** level, where pnpm reads it from. It is a
35
+ **classic** personal access token with `read:packages` — GitHub Packages accepts neither
36
+ fine-grained PATs nor OIDC:
37
+
38
+ ```sh
39
+ pnpm config set //npm.pkg.github.com/:_authToken ghp_…
40
+ ```
41
+
42
+ ```sh
43
+ pnpm add @cueplusplus/tokens
44
+ ```
45
+
46
+ No peers and no dependencies: this package is generated data and eight lines of JavaScript. It
47
+ also arrives as a dependency of `@cueplusplus/ui`, so an app that installs the components already
48
+ has it — naming it in `package.json` just makes the constants importable in your own code.
49
+
50
+ CI, Vercel and the token's expiry are in
51
+ [`docs/CONSUMING.md` §1](https://github.com/cueplusplus/cue-ui/blob/main/docs/CONSUMING.md#1-registry-access).
52
+
53
+ ## Quick start
54
+
55
+ An app importing `@cueplusplus/ui/styles.css` already has the axes as CSS; it needs this package
56
+ by name only to stop restating what it exports.
57
+
58
+ ```ts
59
+ import { DENSITIES, token } from "@cueplusplus/tokens";
60
+
61
+ const ring = `1px solid ${token("focus")}`; // "1px solid var(--cue-focus)"
62
+ const labels = DENSITIES.map((rung) => [rung, rung.replace(/-/g, " ")] as const);
63
+ ```
64
+
65
+ `DENSITIES` is `["ultra-compact", "compact", "normal", "large", "ultra-large"]`, in ladder order.
66
+ Derive a picker's labels and a stylesheet's rung list from it rather than writing either out: both
67
+ go stale silently when the ladder changes, and nothing anywhere reports it.
68
+
69
+ Without a bundler, the same thing in CSS is one import:
70
+
71
+ ```css
72
+ @import "@cueplusplus/tokens/axes.css";
73
+ ```
74
+
75
+ ## What it ships
76
+
77
+ | subpath | what it is |
78
+ | --- | --- |
79
+ | `@cueplusplus/tokens` | `DENSITIES`, `MODES`, `FONTS`, `FONT_PAIRINGS`, `FONT_FACES`, `COLOR_CONTRACT`, `GEOMETRY_CONTRACT`, `FONT_TOKENS`, the `DEFAULT_*` values, `faceProperty()` and `token()` |
80
+ | `./axes.css` | the two axes as CSS, with no colour in them |
81
+ | `./tailwind.css` | the Tailwind v4 `@theme inline` mapping layer |
82
+ | `./theme.css` | a deprecated alias of `./axes.css`: kept through 0.10, removed in the minor after |
83
+ | `./base.json` | the same axes as data, for a theme built outside this build |
84
+ | `./primitives.tokens.json` | the tier-1 palette a theme source aliases |
85
+ | `./registry/token-layer.json` | the theme-independent half of the layer as a shadcn *fragment* — folded into a registry base item, not installable on its own |
86
+
87
+ The root entry is `dist/tokens.js` with `dist/tokens.d.ts` beside it — plain JavaScript, because
88
+ Node refuses to strip types for anything under `node_modules` and a `.ts` entry is one a
89
+ registry consumer cannot load.
90
+
91
+ Everything here is generated by `build.mjs` from `src/**.tokens.json`. Edit the sources, never
92
+ `dist/`.
93
+
94
+ ## Where the rest is
95
+
96
+ - Installing and using it from another project: [`docs/CONSUMING.md`](https://github.com/cueplusplus/cue-ui/blob/main/docs/CONSUMING.md)
97
+ - The density ladder, and what moves on each rung: <https://ui.cueplusplus.com/docs/density>
98
+ - The eight pairings, and which five your app has to deliver: <https://ui.cueplusplus.com/docs/typefaces>
99
+ - The `--cue-*` contract and how a theme fills it: <https://ui.cueplusplus.com/docs/theming>
100
+ - What changed in the version you have: `node_modules/@cueplusplus/tokens/CHANGELOG.md`
package/dist/axes.css ADDED
@@ -0,0 +1,324 @@
1
+ /*! @cueplusplus/tokens — the density, font and style axes, with no theme — pair with a theme package
2
+ * Generated by build.mjs from src/**.tokens.json. Do not edit by hand.
3
+ */
4
+
5
+ :root {
6
+ /* base — type, motion and the geometry that is frozen across densities */
7
+ --cue-border-width: 1px;
8
+ --cue-border-width-hairline: 0.5px;
9
+ --cue-focus-ring: 2px;
10
+ --cue-focus-ring-offset: 1px;
11
+ --cue-radius-full: 9999px;
12
+ --cue-icon-stroke: 1.5;
13
+ --cue-font-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", "Helvetica Neue", sans-serif;
14
+ --cue-font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
15
+ --cue-font-display: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
16
+ --cue-tracking-label: 0.12em;
17
+ --cue-transition-fast: 120ms;
18
+ --cue-transition-base: 180ms;
19
+ --cue-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
20
+
21
+ /* density: compact (default) */
22
+ --cue-control-sm: 1.25rem;
23
+ --cue-control-md: 1.5rem;
24
+ --cue-control-lg: 1.75rem;
25
+ --cue-chip-h: 1.125rem;
26
+ --cue-icon-sm: 0.625rem;
27
+ --cue-icon-md: 0.75rem;
28
+ --cue-text-micro: calc(0.5rem * var(--cue-font-scale, 1));
29
+ --cue-text-label: calc(0.5625rem * var(--cue-font-scale, 1));
30
+ --cue-text-ui: calc(0.625rem * var(--cue-font-scale, 1));
31
+ --cue-text-body: calc(0.6875rem * var(--cue-font-scale, 1));
32
+ --cue-text-emphasis: calc(0.875rem * var(--cue-font-scale, 1));
33
+ --cue-text-title: calc(1.125rem * var(--cue-font-scale, 1));
34
+ --cue-radius-control: 3px;
35
+ --cue-radius-surface: 6px;
36
+ --cue-radius-overlay: 8px;
37
+ --cue-pad-row-y: 0.25rem;
38
+ --cue-pad-row-x: 0.5rem;
39
+ --cue-space-1: 0.125rem;
40
+ --cue-space-2: 0.25rem;
41
+ --cue-space-3: 0.375rem;
42
+ --cue-space-4: 0.5rem;
43
+ --cue-space-5: 0.75rem;
44
+ --cue-space-6: 1rem;
45
+ --cue-space-7: 1.5rem;
46
+ --cue-space-8: 2rem;
47
+ --cue-chrome-toolbar: 2.25rem;
48
+ --cue-chrome-statusbar: 1.5rem;
49
+ --cue-chrome-titlebar: 2.375rem;
50
+ --cue-density: 1;
51
+ --cue-radius-scale: 1;
52
+
53
+ /* style — reading measure, prose line height and band composition; a style set overrides these */
54
+ --cue-band-y: var(--cue-space-7);
55
+ --cue-band-rule: var(--cue-border-width);
56
+ --cue-band-ground: transparent;
57
+ --cue-leading-prose: 1.625;
58
+ --cue-leading-ui: 1.625;
59
+ --cue-measure-narrow: 42rem;
60
+ --cue-measure-wide: 54rem;
61
+ --cue-measure-broad: 84rem;
62
+ --cue-measure-prose: 68ch;
63
+ }
64
+
65
+ /* ── density axis — geometry only ─────────────────────────────────── */
66
+
67
+ [data-density="ultra-compact"] {
68
+ --cue-control-sm: 1.125rem;
69
+ --cue-control-md: 1.25rem;
70
+ --cue-control-lg: 1.5rem;
71
+ --cue-chip-h: 1rem;
72
+ --cue-icon-sm: 0.625rem;
73
+ --cue-icon-md: 0.625rem;
74
+ --cue-text-micro: calc(0.5rem * var(--cue-font-scale, 1));
75
+ --cue-text-label: calc(0.5rem * var(--cue-font-scale, 1));
76
+ --cue-text-ui: calc(0.5625rem * var(--cue-font-scale, 1));
77
+ --cue-text-body: calc(0.625rem * var(--cue-font-scale, 1));
78
+ --cue-text-emphasis: calc(0.8125rem * var(--cue-font-scale, 1));
79
+ --cue-text-title: calc(1rem * var(--cue-font-scale, 1));
80
+ --cue-radius-control: 2px;
81
+ --cue-radius-surface: 4px;
82
+ --cue-radius-overlay: 6px;
83
+ --cue-pad-row-y: 0.125rem;
84
+ --cue-pad-row-x: 0.375rem;
85
+ --cue-space-1: 0.125rem;
86
+ --cue-space-2: 0.125rem;
87
+ --cue-space-3: 0.25rem;
88
+ --cue-space-4: 0.375rem;
89
+ --cue-space-5: 0.5rem;
90
+ --cue-space-6: 0.75rem;
91
+ --cue-space-7: 1rem;
92
+ --cue-space-8: 1.5rem;
93
+ --cue-chrome-toolbar: 2rem;
94
+ --cue-chrome-statusbar: 1.375rem;
95
+ --cue-chrome-titlebar: 2.25rem;
96
+ --cue-density: 0.85;
97
+ --cue-radius-scale: 0.75;
98
+ }
99
+
100
+ [data-density="compact"] {
101
+ --cue-control-sm: 1.25rem;
102
+ --cue-control-md: 1.5rem;
103
+ --cue-control-lg: 1.75rem;
104
+ --cue-chip-h: 1.125rem;
105
+ --cue-icon-sm: 0.625rem;
106
+ --cue-icon-md: 0.75rem;
107
+ --cue-text-micro: calc(0.5rem * var(--cue-font-scale, 1));
108
+ --cue-text-label: calc(0.5625rem * var(--cue-font-scale, 1));
109
+ --cue-text-ui: calc(0.625rem * var(--cue-font-scale, 1));
110
+ --cue-text-body: calc(0.6875rem * var(--cue-font-scale, 1));
111
+ --cue-text-emphasis: calc(0.875rem * var(--cue-font-scale, 1));
112
+ --cue-text-title: calc(1.125rem * var(--cue-font-scale, 1));
113
+ --cue-radius-control: 3px;
114
+ --cue-radius-surface: 6px;
115
+ --cue-radius-overlay: 8px;
116
+ --cue-pad-row-y: 0.25rem;
117
+ --cue-pad-row-x: 0.5rem;
118
+ --cue-space-1: 0.125rem;
119
+ --cue-space-2: 0.25rem;
120
+ --cue-space-3: 0.375rem;
121
+ --cue-space-4: 0.5rem;
122
+ --cue-space-5: 0.75rem;
123
+ --cue-space-6: 1rem;
124
+ --cue-space-7: 1.5rem;
125
+ --cue-space-8: 2rem;
126
+ --cue-chrome-toolbar: 2.25rem;
127
+ --cue-chrome-statusbar: 1.5rem;
128
+ --cue-chrome-titlebar: 2.375rem;
129
+ --cue-density: 1;
130
+ --cue-radius-scale: 1;
131
+ }
132
+
133
+ [data-density="normal"] {
134
+ --cue-control-sm: 1.75rem;
135
+ --cue-control-md: 2rem;
136
+ --cue-control-lg: 2.25rem;
137
+ --cue-chip-h: 1.375rem;
138
+ --cue-icon-sm: 0.75rem;
139
+ --cue-icon-md: 1rem;
140
+ --cue-text-micro: calc(0.5625rem * var(--cue-font-scale, 1));
141
+ --cue-text-label: calc(0.625rem * var(--cue-font-scale, 1));
142
+ --cue-text-ui: calc(0.75rem * var(--cue-font-scale, 1));
143
+ --cue-text-body: calc(0.8125rem * var(--cue-font-scale, 1));
144
+ --cue-text-emphasis: calc(1.0625rem * var(--cue-font-scale, 1));
145
+ --cue-text-title: calc(1.375rem * var(--cue-font-scale, 1));
146
+ --cue-radius-control: 4px;
147
+ --cue-radius-surface: 8px;
148
+ --cue-radius-overlay: 10px;
149
+ --cue-pad-row-y: 0.375rem;
150
+ --cue-pad-row-x: 0.75rem;
151
+ --cue-space-1: 0.25rem;
152
+ --cue-space-2: 0.375rem;
153
+ --cue-space-3: 0.5rem;
154
+ --cue-space-4: 0.75rem;
155
+ --cue-space-5: 1rem;
156
+ --cue-space-6: 1.5rem;
157
+ --cue-space-7: 2rem;
158
+ --cue-space-8: 3rem;
159
+ --cue-chrome-toolbar: 2.75rem;
160
+ --cue-chrome-statusbar: 1.75rem;
161
+ --cue-chrome-titlebar: 3rem;
162
+ --cue-density: 1.3;
163
+ --cue-radius-scale: 1;
164
+ }
165
+
166
+ [data-density="large"] {
167
+ --cue-control-sm: 2.25rem;
168
+ --cue-control-md: 2.5rem;
169
+ --cue-control-lg: 2.75rem;
170
+ --cue-chip-h: 1.625rem;
171
+ --cue-icon-sm: 0.875rem;
172
+ --cue-icon-md: 1.25rem;
173
+ --cue-text-micro: calc(0.625rem * var(--cue-font-scale, 1));
174
+ --cue-text-label: calc(0.6875rem * var(--cue-font-scale, 1));
175
+ --cue-text-ui: calc(0.875rem * var(--cue-font-scale, 1));
176
+ --cue-text-body: calc(0.9375rem * var(--cue-font-scale, 1));
177
+ --cue-text-emphasis: calc(1.25rem * var(--cue-font-scale, 1));
178
+ --cue-text-title: calc(1.625rem * var(--cue-font-scale, 1));
179
+ --cue-radius-control: 5px;
180
+ --cue-radius-surface: 10px;
181
+ --cue-radius-overlay: 12px;
182
+ --cue-pad-row-y: 0.5rem;
183
+ --cue-pad-row-x: 1rem;
184
+ --cue-space-1: 0.375rem;
185
+ --cue-space-2: 0.5rem;
186
+ --cue-space-3: 0.75rem;
187
+ --cue-space-4: 1rem;
188
+ --cue-space-5: 1.5rem;
189
+ --cue-space-6: 2rem;
190
+ --cue-space-7: 3rem;
191
+ --cue-space-8: 4rem;
192
+ --cue-chrome-toolbar: 3.25rem;
193
+ --cue-chrome-statusbar: 2rem;
194
+ --cue-chrome-titlebar: 3.5rem;
195
+ --cue-density: 1.6;
196
+ --cue-radius-scale: 1;
197
+ }
198
+
199
+ [data-density="ultra-large"] {
200
+ --cue-control-sm: 2.75rem;
201
+ --cue-control-md: 3rem;
202
+ --cue-control-lg: 3.25rem;
203
+ --cue-chip-h: 1.875rem;
204
+ --cue-icon-sm: 1rem;
205
+ --cue-icon-md: 1.5rem;
206
+ --cue-text-micro: calc(0.6875rem * var(--cue-font-scale, 1));
207
+ --cue-text-label: calc(0.75rem * var(--cue-font-scale, 1));
208
+ --cue-text-ui: calc(1rem * var(--cue-font-scale, 1));
209
+ --cue-text-body: calc(1.0625rem * var(--cue-font-scale, 1));
210
+ --cue-text-emphasis: calc(1.4375rem * var(--cue-font-scale, 1));
211
+ --cue-text-title: calc(1.875rem * var(--cue-font-scale, 1));
212
+ --cue-radius-control: 6px;
213
+ --cue-radius-surface: 12px;
214
+ --cue-radius-overlay: 14px;
215
+ --cue-pad-row-y: 0.625rem;
216
+ --cue-pad-row-x: 1.25rem;
217
+ --cue-space-1: 0.5rem;
218
+ --cue-space-2: 0.75rem;
219
+ --cue-space-3: 1rem;
220
+ --cue-space-4: 1.5rem;
221
+ --cue-space-5: 2rem;
222
+ --cue-space-6: 3rem;
223
+ --cue-space-7: 4rem;
224
+ --cue-space-8: 6rem;
225
+ --cue-chrome-toolbar: 3.75rem;
226
+ --cue-chrome-statusbar: 2.25rem;
227
+ --cue-chrome-titlebar: 4rem;
228
+ --cue-density: 1.9;
229
+ --cue-radius-scale: 1;
230
+ }
231
+
232
+ @media (pointer: coarse) {
233
+ [data-density="ultra-compact"] {
234
+ --cue-control-sm: 1.25rem;
235
+ --cue-control-md: 1.5rem;
236
+ --cue-control-lg: 1.75rem;
237
+ }
238
+ }
239
+
240
+ /* ── font axis — type only; the mono handshake is settled by var() fallback, not by order ── */
241
+
242
+ [data-font="system"] {
243
+ --cue-font-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", "Helvetica Neue", sans-serif;
244
+ --cue-font-display: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
245
+ --cue-font-pairing-mono: initial;
246
+ --cue-font-mono: var(--cue-font-theme-mono, ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace);
247
+ }
248
+
249
+ [data-font="geist"] {
250
+ --cue-font-sans: var(--cue-face-geist, Geist), ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
251
+ --cue-font-display: var(--cue-face-geist, Geist), ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
252
+ --cue-font-pairing-mono: var(--cue-face-jetbrains-mono, "JetBrains Mono"), ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
253
+ --cue-font-mono: var(--cue-font-pairing-mono, var(--cue-font-theme-mono));
254
+ }
255
+
256
+ [data-font="inter"] {
257
+ --cue-font-sans: var(--cue-face-inter, Inter), ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
258
+ --cue-font-display: var(--cue-face-inter, Inter), ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
259
+ --cue-font-pairing-mono: var(--cue-face-ibm-plex-mono, "IBM Plex Mono"), ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
260
+ --cue-font-mono: var(--cue-font-pairing-mono, var(--cue-font-theme-mono));
261
+ }
262
+
263
+ [data-font="plex"] {
264
+ --cue-font-sans: var(--cue-face-ibm-plex-sans, "IBM Plex Sans"), ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
265
+ --cue-font-display: var(--cue-face-ibm-plex-sans, "IBM Plex Sans"), ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
266
+ --cue-font-pairing-mono: var(--cue-face-ibm-plex-mono, "IBM Plex Mono"), ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
267
+ --cue-font-mono: var(--cue-font-pairing-mono, var(--cue-font-theme-mono));
268
+ }
269
+
270
+ [data-font="roboto"] {
271
+ --cue-font-sans: var(--cue-face-roboto, Roboto), ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
272
+ --cue-font-display: var(--cue-face-roboto, Roboto), ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
273
+ --cue-font-pairing-mono: var(--cue-face-roboto-mono, "Roboto Mono"), ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
274
+ --cue-font-mono: var(--cue-font-pairing-mono, var(--cue-font-theme-mono));
275
+ }
276
+
277
+ [data-font="source"] {
278
+ --cue-font-sans: var(--cue-face-source-sans-3, "Source Sans 3"), "Source Sans Pro", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
279
+ --cue-font-display: var(--cue-face-source-sans-3, "Source Sans 3"), "Source Sans Pro", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
280
+ --cue-font-pairing-mono: var(--cue-face-source-code-pro, "Source Code Pro"), ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
281
+ --cue-font-mono: var(--cue-font-pairing-mono, var(--cue-font-theme-mono));
282
+ }
283
+
284
+ [data-font="apple"] {
285
+ --cue-font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Text", system-ui, ui-sans-serif, sans-serif;
286
+ --cue-font-display: -apple-system, BlinkMacSystemFont, "SF Pro Display", system-ui, ui-sans-serif, sans-serif;
287
+ --cue-font-pairing-mono: "SF Mono", SFMono-Regular, ui-monospace, Menlo, monospace;
288
+ --cue-font-mono: var(--cue-font-pairing-mono, var(--cue-font-theme-mono));
289
+ }
290
+
291
+ [data-font="office"] {
292
+ --cue-font-sans: Calibri, Carlito, "Segoe UI", ui-sans-serif, system-ui, sans-serif;
293
+ --cue-font-display: Calibri, Carlito, "Segoe UI", ui-sans-serif, system-ui, sans-serif;
294
+ --cue-font-pairing-mono: "Cascadia Mono", "Cascadia Code", Consolas, ui-monospace, SFMono-Regular, monospace;
295
+ --cue-font-mono: var(--cue-font-pairing-mono, var(--cue-font-theme-mono));
296
+ }
297
+
298
+ /* ── style axis — page composition; `console` restates the :root defaults, which is what makes it a no-op ── */
299
+
300
+ [data-style="console"] {
301
+ --cue-measure-prose: 68ch;
302
+ --cue-leading-prose: 1.625;
303
+ --cue-band-y: var(--cue-space-7);
304
+ --cue-band-rule: var(--cue-border-width);
305
+ --cue-band-ground: transparent;
306
+ }
307
+
308
+ [data-style="editorial"] {
309
+ --cue-measure-prose: 74ch;
310
+ --cue-leading-prose: 1.75;
311
+ --cue-band-y: calc(var(--cue-space-7) * 2);
312
+ --cue-band-rule: var(--cue-border-width-hairline);
313
+ --cue-band-ground: transparent;
314
+ --cue-style-display: calc(3.25rem * var(--cue-font-scale, 1));
315
+ }
316
+
317
+ [data-style="marketing"] {
318
+ --cue-measure-prose: 60ch;
319
+ --cue-leading-prose: 1.6;
320
+ --cue-band-y: calc(var(--cue-space-7) * 3);
321
+ --cue-band-rule: 0px;
322
+ --cue-band-ground: var(--cue-surface-1);
323
+ --cue-style-display: calc(4rem * var(--cue-font-scale, 1));
324
+ }