remarque-tokens 0.2.0 → 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/AGENT_RULES.md CHANGED
@@ -10,7 +10,7 @@ Read `REMARQUE.md` first for the full system specification. This file tells you
10
10
 
11
11
  Execute in this exact order. Do not skip steps. Do not reorder.
12
12
 
13
- 1. **Load tokens.** Import `tokens.css` and configure `tailwind.config.js` with Remarque's font families and extended theme values. Verify fonts load correctly.
13
+ 1. **Load tokens.** Import `fonts.css` then `tokens.css`, and wire Tailwind: v4 projects import `theme.css` (after `tailwindcss` and the tokens, unlayered see Pitfall #7); v3 projects use `tailwind.config.js`. Verify fonts load correctly.
14
14
 
15
15
  2. **Set up global typography.** Apply display, title, section, body, meta, and prose classes. Verify the type scale renders correctly at mobile and desktop widths.
16
16
 
@@ -138,7 +138,8 @@ project/
138
138
  ├── tokens.css # Aggregator — imports the two tiers below
139
139
  ├── tokens-core.css # CORE tier: type scale, spacing, widths, radius, motion, prose machinery. NEVER override
140
140
  ├── tokens-palette.css # PALETTE tier: font slots, colors, accent, reading measure. Override freely, then run the audit
141
- ├── tailwind.config.js # Tailwind v3 ONLY — v4 projects skip this and use an @theme block (see site/src/styles/globals.css)
141
+ ├── theme.css # Tailwind v4 adapter (@theme inline) import after tailwindcss + tokens
142
+ ├── tailwind.config.js # Tailwind v3 ONLY — v4 projects use theme.css instead
142
143
  ├── public/
143
144
  │ └── fonts/ # Self-hosted woff2 fonts (Inter, Newsreader, JetBrains Mono)
144
145
  ├── styles/
@@ -172,6 +173,8 @@ project/
172
173
 
173
174
  6. **String-form @import only:** Always write `@import './tokens.css';` (string form). Tailwind v4 / Lightning CSS silently DROPS `@import url(...)` for local files — the build succeeds while the entire token cascade vanishes from the output. Verify the built CSS contains `.remarque-prose` after changing imports.
174
175
 
176
+ 7. **Tokens must be imported unlayered (Tailwind v4):** never `@import "remarque-tokens" layer(...)`. theme.css's `@theme inline` mappings emit same-named self-referencing declarations inside `@layer theme`; the real token values win only because unlayered declarations beat layered ones. Layering the tokens makes every mapped utility circular and invalid, with no build error.
177
+
175
178
  ---
176
179
 
177
180
  ## Quality Checklist
package/CHANGELOG.md CHANGED
@@ -4,6 +4,27 @@ All notable changes to `remarque-tokens` are documented here. Token value
4
4
  changes always state the design rationale — downstream sites pin against
5
5
  these entries when syncing.
6
6
 
7
+ ## 0.3.0 — 2026-07-20
8
+
9
+ ### Added
10
+ - **`remarque-tokens/theme.css`** (#48): Tailwind v4 adapter using
11
+ `@theme inline` — utilities (`font-display`, `bg-surface`,
12
+ `max-w-reading`, `mt-remarque-9`, …) reference the runtime custom
13
+ properties directly, so palette switches (light/dark/theme-deck) flow
14
+ through utilities with zero value duplication. Import order:
15
+ `tailwindcss` → `remarque-tokens` → `remarque-tokens/theme.css`.
16
+ - **`tokens.json`** (#48): machine-readable token inventory (W3C
17
+ design-tokens flavored, core/palette tiers, light+dark values),
18
+ GENERATED from the CSS by `scripts/tokens-json.mjs` — the CSS remains
19
+ the single source of truth; CI fails if the JSON goes stale.
20
+
21
+ ### Changed
22
+ - The reference site now consumes the package itself (`file:..` link)
23
+ instead of maintaining file copies — the demo build is the package's
24
+ integration test, and the copy-sync burden is gone.
25
+
26
+ No token values changed in this release.
27
+
7
28
  ## 0.2.0 — 2026-07-20
8
29
 
9
30
  First published release. Everything below is relative to the unpublished
package/README.md CHANGED
@@ -21,16 +21,31 @@ Most developer sites inherit the visual language of SaaS dashboards or component
21
21
 
22
22
  ## Install
23
23
 
24
- Copy `fonts.css`, `tokens.css`, `tokens-core.css`, `tokens-palette.css`, and the `fonts/` directory into your project (`tokens.css` is an aggregator that imports the two tier files), then:
24
+ ```bash
25
+ npm install remarque-tokens
26
+ ```
25
27
 
26
28
  ```css
27
- @import 'fonts.css';
28
- @import 'tokens.css';
29
+ @import 'remarque-tokens/fonts.css';
30
+ @import 'remarque-tokens';
31
+ /* then optionally your site's palette overrides, loaded last */
32
+ ```
33
+
34
+ Copy the `fonts/` woff2 files from `node_modules/remarque-tokens/fonts/` into your static assets (or serve them from wherever your bundler puts font URLs). Personalize by overriding `remarque-tokens/palette` tokens in your own stylesheet, then validate:
35
+
36
+ ```bash
37
+ npx remarque-audit --palette src/styles/my-palette.css --src src
29
38
  ```
30
39
 
31
- Tailwind v3 projects can additionally copy `tailwind.config.js`. Tailwind v4 projects skip the config and write an `@theme` block from the token values (see `site/src/styles/globals.css` for the reference).
40
+ **Tailwind v4** projects add the shipped adapter utilities that track the tokens through every theme switch, no value duplication:
41
+
42
+ ```css
43
+ @import "tailwindcss";
44
+ @import "remarque-tokens";
45
+ @import "remarque-tokens/theme.css";
46
+ ```
32
47
 
33
- > **npm:** `remarque-tokens` is not yet published to the registry the publish pipeline (provenance, semver, changelog) is tracked in [#46](https://github.com/williamzujkowski/remarque/issues/46) and [#48](https://github.com/williamzujkowski/remarque/issues/48). Until then, the copy path above (or `npm install github:williamzujkowski/remarque`) is the supported install.
48
+ **Tailwind v3** projects use the shipped config (`remarque-tokens/tailwind`) instead. A machine-readable token inventory ships as `remarque-tokens/tokens.json` (generated from the CSS core/palette tiers, light+dark values) for tooling and AI agents. Prefer copy-paste? Grab `fonts.css`, `tokens.css`, `tokens-core.css`, `tokens-palette.css`, and `fonts/` directly — `tokens.css` aggregates the two tier files, so all three CSS files travel together. Use string-form `@import './tokens.css'` only (some bundlers silently drop `@import url(...)` for local files).
34
49
 
35
50
  ## For AI Agents
36
51
 
package/REMARQUE.md CHANGED
@@ -40,14 +40,14 @@ Remarque projects should feel like a modern technical publication — not a gene
40
40
 
41
41
  ## Technology Stack
42
42
 
43
- - **CSS framework:** Tailwind CSS — v4 via an `@theme` block written from tokens.css values (reference: `site/src/styles/globals.css`), or v3 via the shipped `tailwind.config.js`. One mechanism per project, never both.
43
+ - **CSS framework:** Tailwind CSS — v4 via the shipped `remarque-tokens/theme.css` (`@theme inline` adapter; utilities reference the runtime tokens), or v3 via the shipped `tailwind.config.js`. One mechanism per project, never both.
44
44
  - **Component primitives:** shadcn/ui (when reusable components are needed)
45
45
  - **Markup:** Semantic HTML with ARIA landmarks
46
46
  - **Theming:** Light and dark mode via `[data-theme]` attribute (system preference + manual toggle)
47
47
  - **Accessibility:** USWDS-informed. Keyboard navigation, skip-to-content link, ARIA labels, WCAG AA contrast compliance, 44px touch targets, 14px minimum small text
48
48
  - **Tokens:** Centralized CSS custom properties in two tiers — `tokens-core.css` (immutable identity) + `tokens-palette.css` (sanctioned personalization). `tokens.css` aggregates both. See "Token Tiers"
49
49
  - **Fonts:** Self-hosted woff2 (no CDN dependency). Preloaded via `<link rel="preload">`
50
- - **Package:** Copy `fonts.css` + `tokens.css` + `tokens-core.css` + `tokens-palette.css` + `fonts/` (plus `tailwind.config.js` for Tailwind v3 projects) — `tokens.css` aggregates the two tier files, so all three CSS files travel together. npm publication of `remarque-tokens` is tracked in #46/#48; until it ships, install from GitHub (`npm install github:williamzujkowski/remarque`) or use the copy path
50
+ - **Package:** `npm install remarque-tokens` — subpaths: `remarque-tokens` (aggregator), `/core`, `/palette`, `/fonts.css`, `/tailwind`; ships `npx remarque-audit`. Copy path also supported: `fonts.css` + `tokens.css` + `tokens-core.css` + `tokens-palette.css` + `fonts/` travel together (the aggregator imports the tier files)
51
51
 
52
52
  ### Tailwind Spacing Integration Note
53
53
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remarque-tokens",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "engines": {
5
5
  "node": ">=18"
6
6
  },
@@ -37,7 +37,10 @@
37
37
  "./tokens-palette.css": "./tokens-palette.css",
38
38
  "./fonts.css": "./fonts.css",
39
39
  "./fonts/*": "./fonts/*",
40
- "./tailwind": "./tailwind.config.js"
40
+ "./tailwind": "./tailwind.config.js",
41
+ "./theme.css": "./theme.css",
42
+ "./theme": "./theme.css",
43
+ "./tokens.json": "./tokens.json"
41
44
  },
42
45
  "files": [
43
46
  "tokens.css",
@@ -50,6 +53,9 @@
50
53
  "REMARQUE.md",
51
54
  "AGENT_RULES.md",
52
55
  "LICENSE",
53
- "CHANGELOG.md"
56
+ "CHANGELOG.md",
57
+ "theme.css",
58
+ "tokens.json",
59
+ "scripts/tokens-json.mjs"
54
60
  ]
55
- }
61
+ }
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env node
2
+ /*
3
+ * Generates tokens.json (W3C design-tokens flavored) FROM the CSS —
4
+ * tokens-core.css and tokens-palette.css remain the single source of
5
+ * truth; this file is derived output for tooling and AI agents.
6
+ *
7
+ * node scripts/tokens-json.mjs # (re)write tokens.json
8
+ * node scripts/tokens-json.mjs --check # exit 1 if tokens.json is stale (CI)
9
+ *
10
+ * Multi-theme values use per-token light/dark groups with $value on each
11
+ * (the W3C spec has no native theming; this follows its $extensions
12
+ * escape hatch conservatively).
13
+ */
14
+
15
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
16
+
17
+ /* Brace-aware block extraction — kept in sync with scripts/audit.mjs
18
+ (duplicated deliberately: audit.mjs is a CLI whose import would run
19
+ its main; unifying them is tracked under issue #48's follow-ups). */
20
+ function extractBlocks(css) {
21
+ const src = css.replace(/\/\*[\s\S]*?\*\//g, '');
22
+ const blocks = [];
23
+ function scan(text, context) {
24
+ let i = 0;
25
+ while (i < text.length) {
26
+ const open = text.indexOf('{', i);
27
+ if (open === -1) break;
28
+ const prelude = text.slice(i, open).trim().replace(/^[;\s]+/, '');
29
+ let depth = 1, j = open + 1;
30
+ while (j < text.length && depth > 0) {
31
+ if (text[j] === '{') depth++;
32
+ else if (text[j] === '}') depth--;
33
+ j++;
34
+ }
35
+ const body = text.slice(open + 1, j - 1);
36
+ if (prelude.startsWith('@')) scan(body, prelude);
37
+ else blocks.push({ prelude, body, context });
38
+ i = j;
39
+ }
40
+ }
41
+ scan(src, '');
42
+ return blocks;
43
+ }
44
+
45
+ function declsOf(blocks, filterFn) {
46
+ const decls = {};
47
+ for (const b of blocks) {
48
+ if (!filterFn(b)) continue;
49
+ for (const m of b.body.matchAll(/--([a-z0-9-]+)\s*:\s*([^;]+);/g)) {
50
+ decls[m[1]] = m[2].trim();
51
+ }
52
+ }
53
+ return decls;
54
+ }
55
+
56
+ function typeOf(name, value) {
57
+ if (name.startsWith('color-')) return 'color';
58
+ if (name.startsWith('font-')) return 'fontFamily';
59
+ if (name.startsWith('weight-')) return 'fontWeight';
60
+ if (name.startsWith('motion-') && /ms$/.test(value)) return 'duration';
61
+ if (name.startsWith('leading-')) return 'number';
62
+ if (value === '0') return 'dimension';
63
+ if (/(^|\s)(rem|px|em|%)/.test(value) || /^-?[\d.]+(rem|px|em)$/.test(value) || value.startsWith('clamp(')) return 'dimension';
64
+ return 'string';
65
+ }
66
+
67
+ // W3C spec: number-like types carry numeric $value, not strings.
68
+ function valueFor(type, value) {
69
+ if (type === 'number' || type === 'fontWeight') {
70
+ const n = Number(value);
71
+ if (!Number.isNaN(n)) return n;
72
+ }
73
+ return value;
74
+ }
75
+
76
+ const version = JSON.parse(readFileSync('package.json', 'utf8')).version;
77
+ const coreDecls = declsOf(extractBlocks(readFileSync('tokens-core.css', 'utf8')), (b) => b.context === '' && b.prelude.includes(':root'));
78
+ const paletteBlocks = extractBlocks(readFileSync('tokens-palette.css', 'utf8'));
79
+ const lightDecls = declsOf(paletteBlocks, (b) => b.context === '' && b.prelude.includes(':root'));
80
+ const darkOverrides = declsOf(paletteBlocks, (b) =>
81
+ (b.context.includes('prefers-color-scheme') && b.context.includes('dark') && b.prelude.includes(':root')) ||
82
+ b.prelude.includes('[data-theme="dark"]')
83
+ );
84
+
85
+ const out = {
86
+ $description: 'Remarque design tokens — GENERATED from tokens-core.css + tokens-palette.css by scripts/tokens-json.mjs. Do not edit; the CSS is the source of truth.',
87
+ $extensions: {
88
+ remarque: {
89
+ version,
90
+ tiers: {
91
+ core: 'immutable identity — overriding forks the system',
92
+ palette: 'sanctioned personalization surface — override freely, then run remarque-audit',
93
+ },
94
+ },
95
+ },
96
+ core: {},
97
+ palette: {},
98
+ };
99
+
100
+ for (const [name, value] of Object.entries(coreDecls)) {
101
+ const $type = typeOf(name, value);
102
+ out.core[name] = { $value: valueFor($type, value), $type };
103
+ }
104
+ for (const [name, value] of Object.entries(lightDecls)) {
105
+ const $type = typeOf(name, value);
106
+ const token = { $type, light: { $value: valueFor($type, value) } };
107
+ if (name in darkOverrides) token.dark = { $value: valueFor($type, darkOverrides[name]) };
108
+ else token.dark = { $value: valueFor($type, value), $extensions: { remarque: { inheritedFromLight: true } } };
109
+ out.palette[name] = token;
110
+ }
111
+
112
+ const json = JSON.stringify(out, null, 2) + '\n';
113
+
114
+ if (process.argv.includes('--check')) {
115
+ const current = existsSync('tokens.json') ? readFileSync('tokens.json', 'utf8') : '';
116
+ if (current !== json) {
117
+ console.error('tokens.json is stale — run: node scripts/tokens-json.mjs');
118
+ process.exit(1);
119
+ }
120
+ console.log('tokens.json is fresh ✓');
121
+ } else {
122
+ writeFileSync('tokens.json', json);
123
+ console.log(`tokens.json written — ${Object.keys(out.core).length} core + ${Object.keys(out.palette).length} palette tokens (v${version})`);
124
+ }
package/theme.css ADDED
@@ -0,0 +1,77 @@
1
+ /*
2
+ * Remarque — Tailwind v4 Theme Adapter
3
+ * ─────────────────────────────────────
4
+ * Maps Remarque's runtime CSS custom properties into Tailwind v4
5
+ * utilities (font-display, bg-surface, max-w-reading, mt-remarque-9, …)
6
+ * without duplicating any values: `@theme inline` makes utilities
7
+ * reference the vars directly, so light/dark/theme-deck palette
8
+ * switches flow through automatically and tokens-palette.css stays the
9
+ * single source of color truth.
10
+ *
11
+ * Usage (order matters — Tailwind first, tokens before this file):
12
+ * @import "tailwindcss";
13
+ * @import "remarque-tokens";
14
+ * @import "remarque-tokens/theme.css";
15
+ *
16
+ * IMPORTANT: import "remarque-tokens" UNLAYERED — never wrap it in
17
+ * layer(...). Tailwind still emits the same-named theme keys as
18
+ * self-referencing declarations inside @layer theme; they are inert
19
+ * only because unlayered token declarations always beat layered ones
20
+ * in the cascade. Wrapping the tokens in a layer would make every
21
+ * mapped utility resolve to an invalid circular value.
22
+ *
23
+ * Spacing is namespaced remarque-* so Tailwind's default numeric scale
24
+ * is never overridden (mt-12 stays 3rem; use mt-remarque-9 for 6rem).
25
+ * Motion utilities: use arbitrary values with the tokens —
26
+ * duration-[var(--motion-fast)] — so reduced-motion zeroing applies.
27
+ */
28
+
29
+ @theme inline {
30
+ /* Font slots */
31
+ --font-display: var(--font-display);
32
+ --font-body: var(--font-body);
33
+ --font-mono: var(--font-mono);
34
+
35
+ /* Colors — track the palette tier through every theme switch */
36
+ --color-bg: var(--color-bg);
37
+ --color-bg-subtle: var(--color-bg-subtle);
38
+ --color-fg: var(--color-fg);
39
+ --color-fg-muted: var(--color-fg-muted);
40
+ --color-muted: var(--color-muted);
41
+ --color-border: var(--color-border);
42
+ --color-border-bold: var(--color-border-bold);
43
+ --color-surface: var(--color-surface);
44
+ --color-accent: var(--color-accent);
45
+ --color-accent-hover: var(--color-accent-hover);
46
+ --color-accent-subtle: var(--color-accent-subtle);
47
+ --color-code-bg: var(--color-code-bg);
48
+ --color-code-fg: var(--color-code-fg);
49
+ --color-link: var(--color-link);
50
+ --color-link-hover: var(--color-link-hover);
51
+ --color-focus-ring: var(--color-focus-ring);
52
+ --color-selection-bg: var(--color-selection-bg);
53
+ --color-selection-fg: var(--color-selection-fg);
54
+
55
+ /* Content widths (max-w-reading / -standard / -wide) */
56
+ --max-width-reading: var(--content-reading);
57
+ --max-width-standard: var(--content-standard);
58
+ --max-width-wide: var(--content-wide);
59
+
60
+ /* Remarque spacing scale, namespaced (mt-remarque-9 = 6rem, …) */
61
+ --spacing-remarque-1: var(--space-1);
62
+ --spacing-remarque-2: var(--space-2);
63
+ --spacing-remarque-3: var(--space-3);
64
+ --spacing-remarque-4: var(--space-4);
65
+ --spacing-remarque-5: var(--space-5);
66
+ --spacing-remarque-6: var(--space-6);
67
+ --spacing-remarque-7: var(--space-7);
68
+ --spacing-remarque-8: var(--space-8);
69
+ --spacing-remarque-9: var(--space-9);
70
+ --spacing-remarque-10: var(--space-10);
71
+ --spacing-remarque-11: var(--space-11);
72
+ --spacing-remarque-12: var(--space-12);
73
+
74
+ /* Radius (rounded-sm / rounded-md — the system's ceiling) */
75
+ --radius-sm: var(--radius-sm);
76
+ --radius-md: var(--radius-md);
77
+ }
package/tokens.json ADDED
@@ -0,0 +1,417 @@
1
+ {
2
+ "$description": "Remarque design tokens — GENERATED from tokens-core.css + tokens-palette.css by scripts/tokens-json.mjs. Do not edit; the CSS is the source of truth.",
3
+ "$extensions": {
4
+ "remarque": {
5
+ "version": "0.3.0",
6
+ "tiers": {
7
+ "core": "immutable identity — overriding forks the system",
8
+ "palette": "sanctioned personalization surface — override freely, then run remarque-audit"
9
+ }
10
+ }
11
+ },
12
+ "core": {
13
+ "text-display": {
14
+ "$value": "clamp(2.75rem, 5.5vw, 5rem)",
15
+ "$type": "dimension"
16
+ },
17
+ "text-title": {
18
+ "$value": "clamp(1.875rem, 3.5vw, 3rem)",
19
+ "$type": "dimension"
20
+ },
21
+ "text-section": {
22
+ "$value": "clamp(1.375rem, 2.25vw, 2rem)",
23
+ "$type": "dimension"
24
+ },
25
+ "text-body-lg": {
26
+ "$value": "1.1875rem",
27
+ "$type": "dimension"
28
+ },
29
+ "text-body": {
30
+ "$value": "1.0625rem",
31
+ "$type": "dimension"
32
+ },
33
+ "text-meta": {
34
+ "$value": "0.875rem",
35
+ "$type": "dimension"
36
+ },
37
+ "text-micro": {
38
+ "$value": "0.8125rem",
39
+ "$type": "dimension"
40
+ },
41
+ "leading-display": {
42
+ "$value": 1.05,
43
+ "$type": "number"
44
+ },
45
+ "leading-title": {
46
+ "$value": 1.15,
47
+ "$type": "number"
48
+ },
49
+ "leading-section": {
50
+ "$value": 1.2,
51
+ "$type": "number"
52
+ },
53
+ "leading-body": {
54
+ "$value": 1.75,
55
+ "$type": "number"
56
+ },
57
+ "leading-meta": {
58
+ "$value": 1.5,
59
+ "$type": "number"
60
+ },
61
+ "tracking-display": {
62
+ "$value": "-0.02em",
63
+ "$type": "dimension"
64
+ },
65
+ "tracking-title": {
66
+ "$value": "-0.015em",
67
+ "$type": "dimension"
68
+ },
69
+ "tracking-body": {
70
+ "$value": "0em",
71
+ "$type": "dimension"
72
+ },
73
+ "tracking-meta": {
74
+ "$value": "0.02em",
75
+ "$type": "dimension"
76
+ },
77
+ "tracking-caps": {
78
+ "$value": "0.06em",
79
+ "$type": "dimension"
80
+ },
81
+ "weight-regular": {
82
+ "$value": 400,
83
+ "$type": "fontWeight"
84
+ },
85
+ "weight-medium": {
86
+ "$value": 500,
87
+ "$type": "fontWeight"
88
+ },
89
+ "weight-semibold": {
90
+ "$value": 600,
91
+ "$type": "fontWeight"
92
+ },
93
+ "space-1": {
94
+ "$value": "0.25rem",
95
+ "$type": "dimension"
96
+ },
97
+ "space-2": {
98
+ "$value": "0.5rem",
99
+ "$type": "dimension"
100
+ },
101
+ "space-3": {
102
+ "$value": "0.75rem",
103
+ "$type": "dimension"
104
+ },
105
+ "space-4": {
106
+ "$value": "1rem",
107
+ "$type": "dimension"
108
+ },
109
+ "space-5": {
110
+ "$value": "1.5rem",
111
+ "$type": "dimension"
112
+ },
113
+ "space-6": {
114
+ "$value": "2rem",
115
+ "$type": "dimension"
116
+ },
117
+ "space-7": {
118
+ "$value": "3rem",
119
+ "$type": "dimension"
120
+ },
121
+ "space-8": {
122
+ "$value": "4rem",
123
+ "$type": "dimension"
124
+ },
125
+ "space-9": {
126
+ "$value": "6rem",
127
+ "$type": "dimension"
128
+ },
129
+ "space-10": {
130
+ "$value": "8rem",
131
+ "$type": "dimension"
132
+ },
133
+ "space-11": {
134
+ "$value": "10rem",
135
+ "$type": "dimension"
136
+ },
137
+ "space-12": {
138
+ "$value": "12rem",
139
+ "$type": "dimension"
140
+ },
141
+ "content-standard": {
142
+ "$value": "72rem",
143
+ "$type": "dimension"
144
+ },
145
+ "content-wide": {
146
+ "$value": "88rem",
147
+ "$type": "dimension"
148
+ },
149
+ "radius-sm": {
150
+ "$value": "0.25rem",
151
+ "$type": "dimension"
152
+ },
153
+ "radius-md": {
154
+ "$value": "0.5rem",
155
+ "$type": "dimension"
156
+ },
157
+ "radius-none": {
158
+ "$value": "0",
159
+ "$type": "dimension"
160
+ },
161
+ "border-width": {
162
+ "$value": "1px",
163
+ "$type": "dimension"
164
+ },
165
+ "border-style": {
166
+ "$value": "solid",
167
+ "$type": "string"
168
+ },
169
+ "motion-fast": {
170
+ "$value": "120ms",
171
+ "$type": "duration"
172
+ },
173
+ "motion-normal": {
174
+ "$value": "180ms",
175
+ "$type": "duration"
176
+ },
177
+ "motion-easing": {
178
+ "$value": "ease-out",
179
+ "$type": "string"
180
+ }
181
+ },
182
+ "palette": {
183
+ "font-display": {
184
+ "$type": "fontFamily",
185
+ "light": {
186
+ "$value": "\"Newsreader\", Georgia, \"Times New Roman\", serif"
187
+ },
188
+ "dark": {
189
+ "$value": "\"Newsreader\", Georgia, \"Times New Roman\", serif",
190
+ "$extensions": {
191
+ "remarque": {
192
+ "inheritedFromLight": true
193
+ }
194
+ }
195
+ }
196
+ },
197
+ "font-body": {
198
+ "$type": "fontFamily",
199
+ "light": {
200
+ "$value": "\"Inter\", ui-sans-serif, system-ui, -apple-system, sans-serif"
201
+ },
202
+ "dark": {
203
+ "$value": "\"Inter\", ui-sans-serif, system-ui, -apple-system, sans-serif",
204
+ "$extensions": {
205
+ "remarque": {
206
+ "inheritedFromLight": true
207
+ }
208
+ }
209
+ }
210
+ },
211
+ "font-mono": {
212
+ "$type": "fontFamily",
213
+ "light": {
214
+ "$value": "\"JetBrains Mono\", ui-monospace, \"Cascadia Code\", \"Fira Code\", monospace"
215
+ },
216
+ "dark": {
217
+ "$value": "\"JetBrains Mono\", ui-monospace, \"Cascadia Code\", \"Fira Code\", monospace",
218
+ "$extensions": {
219
+ "remarque": {
220
+ "inheritedFromLight": true
221
+ }
222
+ }
223
+ }
224
+ },
225
+ "content-reading": {
226
+ "$type": "dimension",
227
+ "light": {
228
+ "$value": "46rem"
229
+ },
230
+ "dark": {
231
+ "$value": "46rem",
232
+ "$extensions": {
233
+ "remarque": {
234
+ "inheritedFromLight": true
235
+ }
236
+ }
237
+ }
238
+ },
239
+ "color-bg": {
240
+ "$type": "color",
241
+ "light": {
242
+ "$value": "oklch(0.975 0.005 80)"
243
+ },
244
+ "dark": {
245
+ "$value": "oklch(0.16 0.01 80)"
246
+ }
247
+ },
248
+ "color-bg-subtle": {
249
+ "$type": "color",
250
+ "light": {
251
+ "$value": "oklch(0.955 0.005 80)"
252
+ },
253
+ "dark": {
254
+ "$value": "oklch(0.19 0.01 80)"
255
+ }
256
+ },
257
+ "color-fg": {
258
+ "$type": "color",
259
+ "light": {
260
+ "$value": "oklch(0.18 0.01 80)"
261
+ },
262
+ "dark": {
263
+ "$value": "oklch(0.90 0.005 80)"
264
+ }
265
+ },
266
+ "color-fg-muted": {
267
+ "$type": "color",
268
+ "light": {
269
+ "$value": "oklch(0.43 0.015 80)"
270
+ },
271
+ "dark": {
272
+ "$value": "oklch(0.70 0.01 80)"
273
+ }
274
+ },
275
+ "color-muted": {
276
+ "$type": "color",
277
+ "light": {
278
+ "$value": "oklch(0.54 0.01 80)"
279
+ },
280
+ "dark": {
281
+ "$value": "oklch(0.60 0.01 80)"
282
+ }
283
+ },
284
+ "color-border": {
285
+ "$type": "color",
286
+ "light": {
287
+ "$value": "oklch(0.88 0.005 80)"
288
+ },
289
+ "dark": {
290
+ "$value": "oklch(0.25 0.005 80)"
291
+ }
292
+ },
293
+ "color-border-bold": {
294
+ "$type": "color",
295
+ "light": {
296
+ "$value": "oklch(0.62 0.01 80)"
297
+ },
298
+ "dark": {
299
+ "$value": "oklch(0.50 0.01 80)"
300
+ }
301
+ },
302
+ "color-surface": {
303
+ "$type": "color",
304
+ "light": {
305
+ "$value": "oklch(0.965 0.005 80)"
306
+ },
307
+ "dark": {
308
+ "$value": "oklch(0.19 0.01 80)"
309
+ }
310
+ },
311
+ "color-accent": {
312
+ "$type": "color",
313
+ "light": {
314
+ "$value": "oklch(0.50 0.14 250)"
315
+ },
316
+ "dark": {
317
+ "$value": "oklch(0.68 0.12 250)"
318
+ }
319
+ },
320
+ "color-accent-hover": {
321
+ "$type": "color",
322
+ "light": {
323
+ "$value": "oklch(0.42 0.11 250)"
324
+ },
325
+ "dark": {
326
+ "$value": "oklch(0.75 0.12 250)"
327
+ }
328
+ },
329
+ "color-accent-subtle": {
330
+ "$type": "color",
331
+ "light": {
332
+ "$value": "oklch(0.95 0.02 250)"
333
+ },
334
+ "dark": {
335
+ "$value": "oklch(0.22 0.04 250)"
336
+ }
337
+ },
338
+ "color-link": {
339
+ "$type": "color",
340
+ "light": {
341
+ "$value": "var(--color-accent)"
342
+ },
343
+ "dark": {
344
+ "$value": "var(--color-accent)",
345
+ "$extensions": {
346
+ "remarque": {
347
+ "inheritedFromLight": true
348
+ }
349
+ }
350
+ }
351
+ },
352
+ "color-link-hover": {
353
+ "$type": "color",
354
+ "light": {
355
+ "$value": "var(--color-accent-hover)"
356
+ },
357
+ "dark": {
358
+ "$value": "var(--color-accent-hover)",
359
+ "$extensions": {
360
+ "remarque": {
361
+ "inheritedFromLight": true
362
+ }
363
+ }
364
+ }
365
+ },
366
+ "color-focus-ring": {
367
+ "$type": "color",
368
+ "light": {
369
+ "$value": "var(--color-accent)"
370
+ },
371
+ "dark": {
372
+ "$value": "var(--color-accent)",
373
+ "$extensions": {
374
+ "remarque": {
375
+ "inheritedFromLight": true
376
+ }
377
+ }
378
+ }
379
+ },
380
+ "color-selection-bg": {
381
+ "$type": "color",
382
+ "light": {
383
+ "$value": "oklch(0.92 0.04 250)"
384
+ },
385
+ "dark": {
386
+ "$value": "oklch(0.30 0.06 250)"
387
+ }
388
+ },
389
+ "color-selection-fg": {
390
+ "$type": "color",
391
+ "light": {
392
+ "$value": "var(--color-fg)"
393
+ },
394
+ "dark": {
395
+ "$value": "oklch(0.92 0.005 80)"
396
+ }
397
+ },
398
+ "color-code-bg": {
399
+ "$type": "color",
400
+ "light": {
401
+ "$value": "oklch(0.945 0.005 80)"
402
+ },
403
+ "dark": {
404
+ "$value": "oklch(0.20 0.005 80)"
405
+ }
406
+ },
407
+ "color-code-fg": {
408
+ "$type": "color",
409
+ "light": {
410
+ "$value": "var(--color-fg)"
411
+ },
412
+ "dark": {
413
+ "$value": "oklch(0.88 0.005 80)"
414
+ }
415
+ }
416
+ }
417
+ }