@rowkit/tokens 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,7 +17,7 @@ npm i @rowkit/tokens
17
17
 
18
18
  ## Two layers
19
19
 
20
- **Primitives** are the raw ramps: `--color-primary-600` is one specific blue and means nothing on its own. **Semantic** tokens name a role — `--color-surface`, `--color-text-muted`, `--color-border` — and point at a primitive through `var()`.
20
+ **Primitives** are the raw ramps: `--color-primary-600` is one specific blue and means nothing on its own. **Semantic** tokens name a role — `--color-card`, `--color-muted-foreground`, `--color-border` — and point at a primitive through `var()`.
21
21
 
22
22
  Only the semantic layer changes under `.dark`, which is what makes dark mode a matter of repointing references rather than hunting hex codes.
23
23
 
@@ -30,13 +30,13 @@ As a Tailwind v4 theme:
30
30
  @import '@rowkit/tokens/css';
31
31
  ```
32
32
 
33
- Every token becomes a theme value, so `bg-surface`, `text-text-muted`, `p-4`, `rounded-md` and `shadow-lg` resolve to the scales above.
33
+ Every token becomes a theme value, so `bg-card`, `text-muted-foreground`, `p-4`, `rounded-md` and `shadow-lg` resolve to the scales above.
34
34
 
35
35
  As CSS custom properties, for anything Tailwind does not cover:
36
36
 
37
37
  ```css
38
38
  .my-thing {
39
- background: var(--color-surface-subtle);
39
+ background: var(--color-muted);
40
40
  border-radius: var(--radius-md);
41
41
  }
42
42
  ```
@@ -46,7 +46,7 @@ Or in TypeScript, fully typed, when a value has to reach JavaScript:
46
46
  ```ts
47
47
  import { tokens } from '@rowkit/tokens'
48
48
 
49
- tokens.color.primary[600] // 'oklch(0.546 0.209 259)'
49
+ tokens.color.primary[800] // 'oklch(0.31 0.038 48)' — warm espresso
50
50
 
51
51
  const series = [tokens.color.primary[500], tokens.color.success[500]]
52
52
  ```
@@ -66,3 +66,5 @@ const series = [tokens.color.primary[500], tokens.color.success[500]]
66
66
  ## License
67
67
 
68
68
  MIT © Nikolai Kushner
69
+
70
+ Design language based on [shadcn/ui](https://ui.shadcn.com) by shadcn, adapted for Vue. shadcn/ui is MIT licensed; rowkit adopts its token values and class recipes, not its code.
package/dist/blur.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Backdrop blur radii.
3
+ *
4
+ * One entry, and named for its job rather than a t-shirt size. Blur is not a
5
+ * scale rowkit designs with — it appears in exactly one place, behind a modal,
6
+ * and a second value would be a decision nobody has had to make yet.
7
+ *
8
+ * Deliberately small. The scrim separates the planes; the blur only stops the
9
+ * page behind from competing for the eye. Anything heavier reads as an effect
10
+ * and makes the content behind unrecognisable, which defeats the reason a
11
+ * modal shows its context at all.
12
+ */
13
+ export declare const blur: {
14
+ /** The dialog scrim. The reference `backdrop-blur-xs`. */
15
+ readonly overlay: "4px";
16
+ };
17
+ /** Names of every blur token. */
18
+ export type BlurName = keyof typeof blur;
package/dist/color.d.ts CHANGED
@@ -41,19 +41,26 @@ export declare const neutral: {
41
41
  readonly 900: "oklch(0.21 0.033 264)";
42
42
  readonly 950: "oklch(0.13 0.036 264)";
43
43
  };
44
- /** Brand blue (hue 259). Drives links, focus rings and primary actions. */
44
+ /**
45
+ * Warm espresso graphite (hue ~48).
46
+ *
47
+ * Restrained and premium — not pure black, not a loud brand blue/teal.
48
+ * Enough warmth to feel intentional on a solid button; quiet enough that
49
+ * consumers can rebrand without scraping a chromatic default first.
50
+ */
45
51
  export declare const primary: {
46
- readonly 50: "oklch(0.97 0.014 259)";
47
- readonly 100: "oklch(0.936 0.03 259)";
48
- readonly 200: "oklch(0.885 0.055 259)";
49
- readonly 300: "oklch(0.809 0.095 259)";
50
- readonly 400: "oklch(0.715 0.147 259)";
51
- readonly 500: "oklch(0.623 0.201 259)";
52
- readonly 600: "oklch(0.546 0.209 259)";
53
- readonly 700: "oklch(0.488 0.187 259)";
54
- readonly 800: "oklch(0.442 0.165 259)";
55
- readonly 900: "oklch(0.396 0.135 259)";
56
- readonly 950: "oklch(0.282 0.086 259)";
52
+ readonly 50: "oklch(0.975 0.01 48)";
53
+ readonly 100: "oklch(0.95 0.014 48)";
54
+ readonly 200: "oklch(0.90 0.02 48)";
55
+ readonly 300: "oklch(0.80 0.026 48)";
56
+ readonly 400: "oklch(0.68 0.032 48)";
57
+ readonly 500: "oklch(0.50 0.036 48)";
58
+ readonly 600: "oklch(0.40 0.037 48)";
59
+ readonly 700: "oklch(0.35 0.037 48)";
60
+ /** Solid actions — warm espresso, deep enough for white labels. */
61
+ readonly 800: "oklch(0.31 0.038 48)";
62
+ readonly 900: "oklch(0.26 0.032 48)";
63
+ readonly 950: "oklch(0.18 0.024 48)";
57
64
  };
58
65
  /** Green (hue 152). Reserved for successful outcomes, never for brand accent. */
59
66
  export declare const success: {
@@ -97,6 +104,177 @@ export declare const danger: {
97
104
  readonly 900: "oklch(0.396 0.135 25)";
98
105
  readonly 950: "oklch(0.282 0.086 25)";
99
106
  };
107
+ /**
108
+ * Greys keyed by OKLCH lightness × 1000, so `gray-922` is lightness 0.922.
109
+ *
110
+ * Most steps stay zero-chroma — the reference design's quiet base. A few carry
111
+ * a cool cast (hue 264, the same as {@link neutral}): lighter hairlines and
112
+ * soft recessed surfaces. That is rowkit's own signal inside an otherwise
113
+ * clean, reference-shaped palette — enough to read as itself on a long session,
114
+ * not enough to look like a tinted theme.
115
+ */
116
+ export declare const gray: {
117
+ /** Soft cool page. Slightly off pure white so a day of table work is less glare. */
118
+ readonly 988: "oklch(0.988 0.002 264)";
119
+ /** the reference `--primary-foreground`, `--foreground` (dark). */
120
+ readonly 985: "oklch(0.985 0 0)";
121
+ /**
122
+ * Cool recessed surface — muted toolbars, row hover, quiet chips.
123
+ *
124
+ * Lighter and cooler than the reference `--muted` (0.97 0 0): same job, less
125
+ * ink on the page.
126
+ */
127
+ readonly 972: "oklch(0.972 0.003 264)";
128
+ /** the reference `--secondary`, `--muted`, `--accent` — kept for dark primary fill. */
129
+ readonly 970: "oklch(0.97 0 0)";
130
+ /**
131
+ * Cool decorative hairline / recessed fill step. Lighter than the reference
132
+ * `--border` (0.922) — table rules, card outlines, and secondary button fill
133
+ * (`surface-active`) that must read as a surface next to white outline chrome.
134
+ */
135
+ readonly 940: "oklch(0.940 0.004 264)";
136
+ /** the reference `--border`. Kept for pressed fills that still need a step of weight. */
137
+ readonly 922: "oklch(0.922 0 0)";
138
+ /**
139
+ * Cool emphasised hairline. rowkit's; the reference design has no "strong border".
140
+ * Softer than the old 0.87 step so structure reads without shouting.
141
+ */
142
+ readonly 905: "oklch(0.905 0.006 264)";
143
+ /** Emphasised hairline (legacy weight). Prefer {@link gray[905]} for new chrome. */
144
+ readonly 870: "oklch(0.87 0 0)";
145
+ /** the reference `--muted-foreground` (dark), where it clears AA at 7.63:1. */
146
+ readonly 708: "oklch(0.708 0 0)";
147
+ /**
148
+ * rowkit's correction to the reference `--ring` and `--input` in light mode.
149
+ *
150
+ * the reference design puts them at 0.708 and 0.922, which measure 2.59:1 and 1.26:1
151
+ * against a white page — a focus ring and a control boundary that both fail
152
+ * WCAG 1.4.11.
153
+ *
154
+ * Not the mathematical minimum. Solving in floating point gave 0.669 and a
155
+ * tidy 3.00:1; the browser paints `#959595` and axe measured **2.995:1**,
156
+ * because a colour is quantised to eight bits per channel before anyone sees
157
+ * it. Anything solved exactly onto a threshold lands on whichever side the
158
+ * rounding chooses. 0.635 is 3.45:1 against the page and 3.17:1 against
159
+ * `surface-subtle`, which clears the bar on both sides of the rounding.
160
+ */
161
+ readonly 635: "oklch(0.635 0 0)";
162
+ /**
163
+ * Cool control boundary. Softer and cooler than the a11y floor at 0.635, still
164
+ * clears 3:1 on the page, a card and a recessed toolbar — so inputs speak the
165
+ * same language as the cool hairlines without failing WCAG 1.4.11.
166
+ */
167
+ readonly 642: "oklch(0.642 0.012 264)";
168
+ /** the reference `--ring` (dark), 4.18:1 against the dark page. */
169
+ readonly 556: "oklch(0.556 0 0)";
170
+ /**
171
+ * rowkit's correction to the reference `--muted-foreground` in light mode.
172
+ *
173
+ * The reference design's 0.556 is 4.73:1 on white but only 4.34:1 on `--muted`, the
174
+ * recessed surface a table header sits on — and a table header is the single
175
+ * most common use this token has.
176
+ *
177
+ * 0.547 was the first attempt and shipped 4.51:1 in floating point; axe,
178
+ * reading the painted `#717171`, called it 4.47:1 and failed twenty-four
179
+ * stories. See {@link gray[635]} — same lesson, same cause. 0.535 measures
180
+ * 4.75:1 on `--muted` and 5.17:1 on the page.
181
+ */
182
+ readonly 535: "oklch(0.535 0 0)";
183
+ /** Pressed row in dark mode. */
184
+ readonly 371: "oklch(0.371 0 0)";
185
+ /** the reference `--secondary`, `--muted`, `--accent` (dark). */
186
+ readonly 269: "oklch(0.269 0 0)";
187
+ /** the reference `--primary` (light), `--card` and `--popover` (dark). */
188
+ readonly 205: "oklch(0.205 0 0)";
189
+ /** the reference `--foreground` (light), `--background` (dark). */
190
+ readonly 145: "oklch(0.145 0 0)";
191
+ };
192
+ /**
193
+ * The reference design's destructive red, clamped into sRGB. Keyed by lightness, like `gray`.
194
+ *
195
+ * the reference design publishes `oklch(0.577 0.245 27.325)`, and that chroma **does not fit
196
+ * in sRGB** — 0.235 is the maximum at this lightness and hue. The difference is
197
+ * invisible; what it buys is a colour that renders identically on an sRGB
198
+ * monitor and a P3 laptop, instead of one each browser gamut-maps by its own
199
+ * rules. rowkit clamps every chromatic primitive for this reason, and
200
+ * `color.test.ts` enforces it.
201
+ *
202
+ * One red serves both themes. The reference design's dark `--destructive` is a lighter
203
+ * `oklch(0.704 …)`, which carries its white label at **2.86:1** — the single
204
+ * worst failure in the reference design's default set. Reusing the light value gives 4.90:1
205
+ * on the label in both themes and still clears 4.04:1 against the dark page.
206
+ */
207
+ export declare const red: {
208
+ /** Soft text on a dark subtle wash. Chroma clamped for sRGB. */
209
+ readonly 850: "oklch(0.85 0.08 25)";
210
+ /** Destructive fill. The reference design's lightness, chroma clamped. */
211
+ readonly 577: "oklch(0.577 0.235 27.325)";
212
+ /** Destructive hover — darkens in both themes, so the white label improves. */
213
+ readonly 520: "oklch(0.52 0.212 27.325)";
214
+ /** Soft border on a dark subtle wash. */
215
+ readonly 350: "oklch(0.38 0.055 25)";
216
+ /** Soft fill in dark mode — quiet red wash, not a solid brick. */
217
+ readonly 260: "oklch(0.32 0.045 25)";
218
+ };
219
+ /**
220
+ * Success and warning, at the reference design's weight. Keyed by lightness, like `gray`.
221
+ *
222
+ * the reference design has no equivalent to copy, so the rule is consistency rather than
223
+ * fidelity: the solid step sits at the same lightness band as `red-577` and
224
+ * carries a white label, so a success, a warning and a destructive button are
225
+ * the same perceptual weight and only differ in hue.
226
+ *
227
+ * That is a real change for warning, which used to be bright amber with dark
228
+ * text. Bright amber is the loudest thing on a the reference design page — the language is
229
+ * built on restraint, and one saturated chip undoes it. Chroma is clamped to
230
+ * the sRGB boundary at every step, as everywhere else.
231
+ */
232
+ export declare const green: {
233
+ /** Badge fill, light. */
234
+ readonly 950: "oklch(0.95 0.05 152)";
235
+ /** Badge border, light. */
236
+ readonly 880: "oklch(0.88 0.05 152)";
237
+ /** Badge text, dark. */
238
+ readonly 850: "oklch(0.85 0.12 152)";
239
+ /** Solid fill, both themes. White label at 4.56:1. */
240
+ readonly 550: "oklch(0.55 0.144 152)";
241
+ /** Solid hover — darkens, so the white label improves. */
242
+ readonly 520: "oklch(0.52 0.136 152)";
243
+ /** Badge text, light. */
244
+ readonly 400: "oklch(0.4 0.105 152)";
245
+ /** Badge border, dark. */
246
+ readonly 350: "oklch(0.35 0.092 152)";
247
+ /** Badge fill, dark. */
248
+ readonly 260: "oklch(0.26 0.068 152)";
249
+ };
250
+ /** Warning, mirroring {@link green} step for step. */
251
+ export declare const amber: {
252
+ readonly 950: "oklch(0.95 0.04 75)";
253
+ readonly 880: "oklch(0.88 0.05 75)";
254
+ readonly 850: "oklch(0.85 0.12 75)";
255
+ /** Solid fill, both themes. White label at 4.96:1. */
256
+ readonly 550: "oklch(0.55 0.116 75)";
257
+ readonly 520: "oklch(0.52 0.109 75)";
258
+ readonly 400: "oklch(0.4 0.084 75)";
259
+ readonly 350: "oklch(0.35 0.074 75)";
260
+ readonly 260: "oklch(0.26 0.055 75)";
261
+ };
262
+ /**
263
+ * White at a fraction of opacity, for dark-mode borders.
264
+ *
265
+ * Alpha, not a solid grey: a grey tuned for `--background` draws too hard a
266
+ * line once the same border sits on `--card`. The reference uses 10% / 15%;
267
+ * rowkit softens the decorative hairline to 8% so dense tables stay quiet in
268
+ * dark mode the same way the cool light hairline does.
269
+ */
270
+ export declare const whiteAlpha: {
271
+ /** Soft decorative hairline in dark mode. */
272
+ readonly 8: "oklch(1 0 0 / 8%)";
273
+ /** the reference dark `--border`. */
274
+ readonly 10: "oklch(1 0 0 / 10%)";
275
+ /** Emphasised dark hairline / the reference dark `--input`. */
276
+ readonly 15: "oklch(1 0 0 / 15%)";
277
+ };
100
278
  /**
101
279
  * Every primitive colour, keyed by the CSS custom property it becomes.
102
280
  *
@@ -159,6 +337,47 @@ export declare const colorPrimitives: {
159
337
  readonly "neutral-800": string;
160
338
  readonly "neutral-900": string;
161
339
  readonly "neutral-950": string;
340
+ readonly "white-alpha-8": string;
341
+ readonly "white-alpha-10": string;
342
+ readonly "white-alpha-15": string;
343
+ readonly "amber-400": string;
344
+ readonly "amber-950": string;
345
+ readonly "amber-850": string;
346
+ readonly "amber-520": string;
347
+ readonly "amber-350": string;
348
+ readonly "amber-260": string;
349
+ readonly "amber-880": string;
350
+ readonly "amber-550": string;
351
+ readonly "green-400": string;
352
+ readonly "green-950": string;
353
+ readonly "green-850": string;
354
+ readonly "green-520": string;
355
+ readonly "green-350": string;
356
+ readonly "green-260": string;
357
+ readonly "green-880": string;
358
+ readonly "green-550": string;
359
+ readonly "red-850": string;
360
+ readonly "red-577": string;
361
+ readonly "red-520": string;
362
+ readonly "red-350": string;
363
+ readonly "red-260": string;
364
+ readonly "gray-988": string;
365
+ readonly "gray-985": string;
366
+ readonly "gray-972": string;
367
+ readonly "gray-970": string;
368
+ readonly "gray-940": string;
369
+ readonly "gray-922": string;
370
+ readonly "gray-905": string;
371
+ readonly "gray-870": string;
372
+ readonly "gray-708": string;
373
+ readonly "gray-635": string;
374
+ readonly "gray-642": string;
375
+ readonly "gray-556": string;
376
+ readonly "gray-535": string;
377
+ readonly "gray-371": string;
378
+ readonly "gray-269": string;
379
+ readonly "gray-205": string;
380
+ readonly "gray-145": string;
162
381
  readonly white: "oklch(1 0 0)";
163
382
  readonly black: "oklch(0 0 0)";
164
383
  };
@@ -172,17 +391,29 @@ export type ColorRef = `var(--color-${string})`;
172
391
  * hunting down hex codes. `semantic.test.ts` enforces this.
173
392
  */
174
393
  export declare const semanticColorLight: {
175
- /** Page background, behind all surfaces. */
394
+ /**
395
+ * Page background, behind all surfaces.
396
+ *
397
+ * Soft cool off-white rather than the reference pure white — less glare over
398
+ * a long session, and enough lift that a white `card` still reads as a plane.
399
+ */
176
400
  readonly background: `var(--color-${string})`;
177
- /** Cards, panels, table bodies — the plane content sits on. */
178
- readonly surface: `var(--color-${string})`;
179
- /** Table headers, toolbars: a surface that recedes slightly. */
180
- readonly 'surface-subtle': `var(--color-${string})`;
401
+ /** Cards, panels, table bodies — the plane content sits on. The reference `--card`. */
402
+ readonly card: `var(--color-${string})`;
403
+ /**
404
+ * Table headers, toolbars: a surface that recedes slightly.
405
+ *
406
+ * Cool and a touch lighter than the reference `--muted`. Same role as
407
+ * `accent` out of the box — separate override points, not different colours.
408
+ */
409
+ readonly muted: `var(--color-${string})`;
181
410
  /** Row hover. */
182
- readonly 'surface-hover': `var(--color-${string})`;
183
- /** Row press / active. */
411
+ readonly accent: `var(--color-${string})`;
412
+ /** Row press / active. One step past hover; the reference design has no press token. */
184
413
  readonly 'surface-active': `var(--color-${string})`;
185
- /** Selected table row. */
414
+ /**
415
+ * Selected table row. Quiet primary wash — distinct from hover, not a shout.
416
+ */
186
417
  readonly 'surface-selected': `var(--color-${string})`;
187
418
  /** Disabled control background. */
188
419
  readonly 'surface-disabled': `var(--color-${string})`;
@@ -198,18 +429,17 @@ export declare const semanticColorLight: {
198
429
  * reader to perceive and WCAG 1.4.11 does not apply.
199
430
  */
200
431
  readonly skeleton: `var(--color-${string})`;
201
- /** Primary body and heading text. */
202
- readonly text: `var(--color-${string})`;
432
+ /** Primary body and heading text. The reference `--foreground`. */
433
+ readonly foreground: `var(--color-${string})`;
203
434
  /**
204
- * Secondary text, column labels, help text.
435
+ * Secondary text, column labels, help text. The reference `--muted-foreground`.
205
436
  *
206
- * `neutral-600`, not `500`. A table header is muted text on `surface-subtle`,
207
- * and at `500` that pairing reached only 4.41:1 — passing on white, failing
208
- * WCAG 1.4.3 on the recessed surface this token is most often used against.
209
- * `600` clears it at 6.90:1 and is still 2.3× lighter than `text`, so the
210
- * hierarchy survives.
437
+ * `gray-535`, not the reference design's 0.556. The same trap the old `neutral-500` fell
438
+ * into: a table header is muted text on `surface-subtle`, and the reference design's value
439
+ * reaches 4.73:1 on white but only 4.34:1 on the recessed surface this token
440
+ * is most often used against. Nine thousandths of lightness buy the pass.
211
441
  */
212
- readonly 'text-muted': `var(--color-${string})`;
442
+ readonly 'muted-foreground': `var(--color-${string})`;
213
443
  /** Placeholders and de-emphasised metadata. */
214
444
  readonly 'text-subtle': `var(--color-${string})`;
215
445
  /** Text on a disabled control. */
@@ -217,8 +447,9 @@ export declare const semanticColorLight: {
217
447
  /**
218
448
  * Decorative hairline: row separators, card outlines.
219
449
  *
220
- * Deliberately below 3:1 against the surface. Do not use it for the boundary
221
- * of an interactive control — see {@link semanticColorLight['border-control']}.
450
+ * Cool and lighter than the reference 0.922. Deliberately below 3:1 — do not
451
+ * use it for the boundary of an interactive control; see
452
+ * {@link semanticColorLight['input']}.
222
453
  */
223
454
  readonly border: `var(--color-${string})`;
224
455
  /** Emphasised decorative border: dividers that need to read as structure. */
@@ -226,17 +457,25 @@ export declare const semanticColorLight: {
226
457
  /** Barely-there separation inside a dense group. */
227
458
  readonly 'border-subtle': `var(--color-${string})`;
228
459
  /**
229
- * Boundary of an interactive control — text inputs, checkboxes, outlined
460
+ * Boundary of an interactive control — text inputs, selects, outlined
230
461
  * buttons.
231
462
  *
232
- * WCAG 1.4.11 requires 3:1 against the adjacent surface for the visual
233
- * boundary of a UI component. `border` manages only 1.24:1 and
234
- * `border-strong` 1.49:1, so neither is legal here; this token is the
235
- * lightest neutral that clears the bar (4.83:1 on `surface`).
463
+ * Quiet on purpose (structure without severity). Resting edges sit near the
464
+ * decorative hairline; the focus treatment (`border-ring` + ring) is what
465
+ * carries WCAG 1.4.11. Matching the reference design's soft resting edge
466
+ * rather than a 3:1 ink outline that shouted next to every field.
236
467
  */
237
- readonly 'border-control': `var(--color-${string})`;
238
- /** Focus ring. Never remove the ring — recolour it. */
239
- readonly 'focus-ring': `var(--color-${string})`;
468
+ readonly input: `var(--color-${string})`;
469
+ /**
470
+ * Focus ring. Never remove the ring — recolour it.
471
+ *
472
+ * Soft silver — the payment-form / shadcn weight (`gray-708`), not ink.
473
+ * Intentionally under 3:1 as a solid; the visible treatment is
474
+ * `border-ring` plus a translucent outer ring, not a black halo.
475
+ * Every control that focuses (Button, Input, Select, Dialog close,
476
+ * Pagination, FilterBar chips, DataTable, Toast) reads this same token.
477
+ */
478
+ readonly ring: `var(--color-${string})`;
240
479
  /** Base colour shadows are mixed from. */
241
480
  readonly shadow: `var(--color-${string})`;
242
481
  readonly 'neutral-solid': `var(--color-${string})`;
@@ -245,6 +484,10 @@ export declare const semanticColorLight: {
245
484
  readonly 'neutral-subtle': `var(--color-${string})`;
246
485
  readonly 'neutral-on-subtle': `var(--color-${string})`;
247
486
  readonly 'neutral-border': `var(--color-${string})`;
487
+ /**
488
+ * Warm espresso solid — premium brown-graphite, not a black brick.
489
+ * `primary-800` ≈ `oklch(0.31 0.038 48)`.
490
+ */
248
491
  readonly 'primary-solid': `var(--color-${string})`;
249
492
  readonly 'primary-solid-hover': `var(--color-${string})`;
250
493
  readonly 'primary-on-solid': `var(--color-${string})`;
@@ -273,30 +516,31 @@ export declare const semanticColorLight: {
273
516
  /**
274
517
  * Dark-mode semantic colours, applied under `.dark`.
275
518
  *
276
- * Solid fills use the bright `400` step with dark text rather than mirroring
277
- * light mode's `600` with white text. On a near-black page a `600` fill only
278
- * reaches 3.6–4.4:1 against the background — the button itself becomes hard to
279
- * locate even though its label is legible. The `400` fill scores 7.4–8.5:1 on
280
- * both label and background.
519
+ * Soft ink fills invert on dark pages: a near-white solid with dark type,
520
+ * rather than a mid-grey that disappears into the chrome.
281
521
  */
282
522
  export declare const semanticColorDark: {
283
523
  readonly background: `var(--color-${string})`;
284
- readonly surface: `var(--color-${string})`;
285
- readonly 'surface-subtle': `var(--color-${string})`;
286
- readonly 'surface-hover': `var(--color-${string})`;
524
+ readonly card: `var(--color-${string})`;
525
+ readonly muted: `var(--color-${string})`;
526
+ readonly accent: `var(--color-${string})`;
287
527
  readonly 'surface-active': `var(--color-${string})`;
288
528
  readonly 'surface-selected': `var(--color-${string})`;
289
529
  readonly 'surface-disabled': `var(--color-${string})`;
290
530
  readonly skeleton: `var(--color-${string})`;
291
- readonly text: `var(--color-${string})`;
292
- readonly 'text-muted': `var(--color-${string})`;
531
+ readonly foreground: `var(--color-${string})`;
532
+ readonly 'muted-foreground': `var(--color-${string})`;
293
533
  readonly 'text-subtle': `var(--color-${string})`;
294
534
  readonly 'text-disabled': `var(--color-${string})`;
295
535
  readonly border: `var(--color-${string})`;
296
536
  readonly 'border-strong': `var(--color-${string})`;
297
537
  readonly 'border-subtle': `var(--color-${string})`;
298
- readonly 'border-control': `var(--color-${string})`;
299
- readonly 'focus-ring': `var(--color-${string})`;
538
+ readonly input: `var(--color-${string})`;
539
+ /**
540
+ * Soft focus — white at the same quiet weight as the control border, not a
541
+ * bright primary wash. Reads as a silver edge on dark surfaces.
542
+ */
543
+ readonly ring: `var(--color-${string})`;
300
544
  readonly shadow: `var(--color-${string})`;
301
545
  readonly 'neutral-solid': `var(--color-${string})`;
302
546
  readonly 'neutral-solid-hover': `var(--color-${string})`;