remarque-tokens 0.2.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 ADDED
@@ -0,0 +1,218 @@
1
+ # Remarque — Agent Rules
2
+
3
+ **This document is the implementation contract for any agent (AI or human) building with the Remarque design system.**
4
+
5
+ Read `REMARQUE.md` first for the full system specification. This file tells you *how to build*, not *what the system is*.
6
+
7
+ ---
8
+
9
+ ## Build Order
10
+
11
+ Execute in this exact order. Do not skip steps. Do not reorder.
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.
14
+
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
+
17
+ 3. **Build the layout shell.** Header, content container (with constrained max-widths), and footer. The shell must enforce reading widths — content should never run full-width on large screens.
18
+
19
+ 4. **Implement prose styling.** Article body text, headings within prose, blockquotes, lists, inline code, links. This is the core of Remarque — get it right before touching anything else.
20
+
21
+ 5. **Implement metadata components.** Mono-styled date, reading time, tags, and status labels.
22
+
23
+ 6. **Build navigation and footer.** Quiet, minimal. Navigation is functional, not decorative.
24
+
25
+ 7. **Only then** build supplementary UI: buttons, tags, cards (if justified), code blocks, tables.
26
+
27
+ 8. **Validate readability on mobile** before adding any visual polish.
28
+
29
+ 9. **Verify every page conforms** to one of the four archetypes (Essay, Project Dossier, Notebook, Landing).
30
+
31
+ **Why this order matters:** Most agents build polished components first and bolt on typography later. That produces the exact aesthetic Remarque exists to prevent. Typography and prose are the foundation. Everything else is furniture.
32
+
33
+ ---
34
+
35
+ ## Non-Negotiable Rules
36
+
37
+ These are not guidelines. Agents must follow them literally.
38
+
39
+ ### Token Tiers
40
+
41
+ - NEVER change a value in `tokens-core.css` (or its tokens' values anywhere) — core tokens are Remarque's identity; changing them means the project has forked the system
42
+ - Site personalization happens ONLY by overriding `tokens-palette.css` tokens (font slots from the approved pairings, colors, accent, `--content-reading` per the measure table) in a stylesheet loaded after the tokens
43
+ - After ANY palette change, run the audit and fix every failure before shipping — `npm run audit` inside this repo; `npx remarque-audit --palette <file> --src <dir>` in a consumer project (the npm script only exists here)
44
+
45
+ ### Typography
46
+
47
+ - Body text is never smaller than `--text-body` (17px / 1.0625rem)
48
+ - Prose columns never exceed `--content-reading` (46rem)
49
+ - Display/title text always uses `--font-display` (Newsreader)
50
+ - Body text always uses `--font-body` (Inter)
51
+ - Mono text is *only* for: metadata, code, labels, timestamps, technical accents
52
+ - Line height for body text is `--leading-body` (1.75) — never less
53
+
54
+ ### Layout
55
+
56
+ - No page shows more than 3 content sections above the fold
57
+ - The first screen contains only: title, metadata, and the start of content
58
+ - Top padding before the main heading is at least `--space-9` (6rem)
59
+ - The site uses a **single centered column** layout: BaseLayout constrains all content to `content-standard` (72rem) centered. Individual pages do NOT set their own outer width constraints.
60
+ - Within the centered column, use `.content-reading` for prose-width sections (46rem, auto-centered within the 72rem column)
61
+ - Do NOT use Tailwind's `max-w-reading` or `max-w-standard` on page sections — these only set max-width without centering. Use the CSS classes `.content-reading` / `.content-standard` instead, which include `margin-inline: auto`
62
+ - Code blocks (`<pre>`) inherit the width of their parent container — no special wrapping needed when the parent is already constrained
63
+
64
+ ### Color
65
+
66
+ - Accent color is used for exactly two things: inline links and one interactive element per viewport
67
+ - Dark mode is not an inverted light mode — it must be independently tuned for readability
68
+ - Background colors use `--color-bg`, never pure white (#fff) or pure black (#000)
69
+
70
+ ### Components
71
+
72
+ - No component should be visually louder than the content it contains
73
+ - Borders use `--color-border` at 1px — never thicker, never drop shadows as replacements
74
+ - `--color-border` is decorative-only (below the 3:1 non-text minimum by design). Boundaries of interactive elements (inputs, dialogs, active states) use `--color-border-bold`, which meets WCAG 1.4.11
75
+ - Border radius never exceeds `--radius-md` (0.5rem / 8px)
76
+ - Buttons are quiet: text-only or subtle bordered. Never filled/solid as default.
77
+
78
+ ### Motion
79
+
80
+ - Motion is permitted *only* on: hover states, focus rings, theme transitions
81
+ - Duration is `--motion-fast` (120ms) for micro-interactions, `--motion-normal` (180ms) for transitions
82
+ - No scroll-triggered, entrance, staggered, or parallax animations. Ever.
83
+ - All motion must respect `prefers-reduced-motion` — always use the duration tokens (tokens.css zeroes them under reduced motion); never hardcode durations
84
+
85
+ ### Images
86
+
87
+ - Images stay within `--content-reading` width (diagrams may use `--content-standard`)
88
+ - Images get a 1px `--color-border` border, never shadows
89
+ - Captions use `--font-mono` at `--text-meta` size
90
+ - No decorative images. Every image serves the content.
91
+
92
+ ---
93
+
94
+ ## Decision Protocol
95
+
96
+ When you face a design choice not explicitly covered above, apply these filters in order:
97
+
98
+ 1. **Is it more readable?** → Choose that.
99
+ 2. **Is it more typographically disciplined?** → Choose that.
100
+ 3. **Is it quieter?** → Choose that.
101
+ 4. **Is it more tokenized/reusable?** → Choose that.
102
+ 5. **Does it have less visual noise?** → Choose that.
103
+
104
+ If you are still unsure, choose the option that looks more like a well-typeset book and less like a web application.
105
+
106
+ ---
107
+
108
+ ## Disallowed Patterns
109
+
110
+ Do not introduce any of the following unless the project owner explicitly requests them:
111
+
112
+ - Material Design visual language (elevation, ripple, FAB)
113
+ - Large decorative gradients
114
+ - Glassmorphism / frosted glass
115
+ - Card grids as primary layout
116
+ - Over-rounded corners (border-radius > 0.5rem)
117
+ - "Friendly SaaS" visual language
118
+ - Flashy or attention-seeking motion
119
+ - Dense admin/dashboard layouts
120
+ - Full-width prose on screens wider than 768px
121
+ - Hero images or banners
122
+ - Multiple CTAs on a single page
123
+ - Feature comparison grids
124
+ - Newsletter popups or modals
125
+ - Hamburger menus on desktop
126
+ - Sticky headers that consume vertical space
127
+ - Social share buttons in content areas
128
+ - Pill-shaped tag badges (use plain mono text)
129
+ - Skeleton loading screens (use a simple spinner or nothing)
130
+
131
+ ---
132
+
133
+ ## File Structure Convention
134
+
135
+ ```
136
+ project/
137
+ ├── fonts.css # Self-hosted @font-face declarations (import before tokens)
138
+ ├── tokens.css # Aggregator — imports the two tiers below
139
+ ├── tokens-core.css # CORE tier: type scale, spacing, widths, radius, motion, prose machinery. NEVER override
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)
142
+ ├── public/
143
+ │ └── fonts/ # Self-hosted woff2 fonts (Inter, Newsreader, JetBrains Mono)
144
+ ├── styles/
145
+ │ ├── globals.css # @import "tailwindcss"; @import "./tokens.css"; @font-face declarations
146
+ │ ├── prose.css # Article/essay body text styling (or use .remarque-prose from tokens.css)
147
+ │ └── components.css # Component-specific styles (minimal)
148
+ ├── components/
149
+ │ ├── Layout.{jsx,astro} # Layout shell (header + content + footer + skip-link + theme toggle)
150
+ │ ├── Nav.{jsx,astro} # Navigation (content pages + design system docs)
151
+ │ ├── Footer.{jsx,astro} # Footer
152
+ │ ├── Meta.{jsx,astro} # Metadata row component
153
+ │ └── Prose.{jsx,astro} # Prose wrapper (<div class="remarque-prose content-reading">)
154
+ └── pages/
155
+ ├── index # Landing archetype
156
+ ├── writing/[slug] # Essay archetype
157
+ ├── projects/[slug] # Project Dossier archetype
158
+ └── notes # Notebook archetype
159
+ ```
160
+
161
+ ### Implementation Pitfalls (learned from reference implementation)
162
+
163
+ 1. **Tailwind spacing collision:** Never map Remarque's `--space-N` values onto Tailwind's default numeric spacing keys — in v4 `@theme` that means no `--spacing-9`…`--spacing-12`, and in the v3 config no `spacing: { "5"…"12" }` overrides — or `mt-12` produces 192px instead of 48px. Both shipped artifacts namespace instead: the v3 config exposes `mt-remarque-9` etc., the reference v4 `@theme` uses `--spacing-remarque-N`. Use those, or `var(--space-N)` in arbitrary values.
164
+
165
+ 2. **Prose alignment:** The essay header and prose body must BOTH use centered max-width (`max-w-reading mx-auto`) to prevent misalignment. The `.content-reading` class auto-centers; match headers with `mx-auto`.
166
+
167
+ 3. **Dark mode specificity:** Define `[data-theme="light"]` and `[data-theme="dark"]` overrides in addition to the `:root` defaults. Without an explicit light override, users with `prefers-color-scheme: dark` cannot toggle to light mode.
168
+
169
+ 4. **Self-hosted fonts:** Replace the Google Fonts CDN link with self-hosted woff2 files + `@font-face` declarations. Use `font-display: swap` and `<link rel="preload">` for performance.
170
+
171
+ 5. **GitHub Pages base path:** When deploying to a subpath (e.g., `/remarque/`), all internal links must use a base URL helper (Astro: `import.meta.env.BASE_URL`). Set `base` in your framework config.
172
+
173
+ 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
+
177
+ ## Quality Checklist
178
+
179
+ Before considering any implementation complete, verify:
180
+
181
+ - [ ] Fonts load: Newsreader for display, Inter for body, JetBrains Mono for meta
182
+ - [ ] Fonts are self-hosted (no Google CDN requests in network tab)
183
+ - [ ] Body text is ≥17px on all viewports
184
+ - [ ] Prose column is ≤46rem on desktop
185
+ - [ ] Prose header and body are aligned (both centered with `mx-auto` or both left-aligned)
186
+ - [ ] Line height for body text is 1.75
187
+ - [ ] Dark mode is readable and independently tuned (not just inverted)
188
+ - [ ] Theme toggle works in both directions (light→dark AND dark→light)
189
+ - [ ] No page has more than 3 content sections above the fold
190
+ - [ ] Top padding before main heading is ≥6rem
191
+ - [ ] Accent color appears in ≤2 roles per viewport
192
+ - [ ] No scroll-triggered or entrance animations exist
193
+ - [ ] Every image has a 1px border and mono caption
194
+ - [ ] Every page maps to an archetype (Essay, Dossier, Notebook, Landing)
195
+ - [ ] Mobile version is roomy — not a compressed desktop layout
196
+ - [ ] Mobile nav links have ≥44px touch targets
197
+ - [ ] No pure white or pure black backgrounds
198
+ - [ ] `npm run audit` passes (contrast, gamut, font floors, hardcoded colors)
199
+ - [ ] Muted text placed on `--color-surface` still meets 4.5:1 (check the surface pairing, not just bg)
200
+ - [ ] All transitions use the motion duration tokens (reduced-motion support depends on it)
201
+ - [ ] Skip-to-content link present and functional
202
+ - [ ] OG meta tags present (og:title, og:description, og:image)
203
+ - [ ] `<html lang="en">` attribute set
204
+ - [ ] The site looks more like a book than a web app
205
+ - [ ] Tailwind spacing utilities (`mt-12`, `pt-8`) produce expected values (not overridden by `@theme`)
206
+
207
+ ---
208
+
209
+ ## How to Reference This System
210
+
211
+ In prompts, issues, or agent instructions, use:
212
+
213
+ ```
214
+ Build this page using the Remarque design system.
215
+ See: REMARQUE.md for specification, AGENT_RULES.md for implementation contract, tokens.css for design tokens.
216
+ ```
217
+
218
+ Agents should load all three files before beginning work.
package/CHANGELOG.md ADDED
@@ -0,0 +1,55 @@
1
+ # Changelog
2
+
3
+ All notable changes to `remarque-tokens` are documented here. Token value
4
+ changes always state the design rationale — downstream sites pin against
5
+ these entries when syncing.
6
+
7
+ ## 0.2.0 — 2026-07-20
8
+
9
+ First published release. Everything below is relative to the unpublished
10
+ `0.1.0` files that early adopters copied by hand.
11
+
12
+ ### Added
13
+ - **Two-tier token architecture** (#47): `tokens-core.css` (immutable
14
+ identity — type scale, spacing, widths, radius, motion, prose
15
+ machinery) and `tokens-palette.css` (sanctioned personalization —
16
+ font slots, colors, accent, `--content-reading` measure). `tokens.css`
17
+ remains a backwards-compatible aggregator. Subpath exports:
18
+ `remarque-tokens/core`, `remarque-tokens/palette`.
19
+ - **`remarque-audit`** CLI (#28): enforces the spec's checklist —
20
+ WCAG 2.x contrast (OKLCH → sRGB → relative luminance), sRGB gamut,
21
+ 13px font floor, no hardcoded colors. `npx remarque-audit --palette
22
+ <file> --src <dir>`.
23
+ - **`fonts.css` + `fonts/`** (#40): self-hosted latin woff2 subsets for
24
+ all three slots, including true Inter italic. The Google Fonts CDN
25
+ `@import` is gone.
26
+ - `prefers-reduced-motion` support (#45): the motion duration tokens
27
+ zero out under reduced motion.
28
+ - Spec sections: Token Tiers, Font Slots with approved pairings,
29
+ Measure Compensation table, accent-hue derivation recipe.
30
+
31
+ ### Changed
32
+ - **Contrast fixes** (#42), all computed and audit-enforced:
33
+ - light `--color-fg-muted` 0.45 → **0.43** L (7.55:1, meets the spec's own AAA line)
34
+ - light `--color-muted` 0.55 → **0.54** L; dark 0.58 → **0.60** L (≥4.5:1 on bg *and* surface)
35
+ - `--color-border-bold` light 0.78 → **0.62** L, dark 0.35 → **0.50** L (≥3:1, WCAG 1.4.11)
36
+ - `--color-border` documented **decorative-only** (below 3:1 by design;
37
+ functional boundaries use `border-bold`)
38
+ - **Gamut fixes:** light `--color-accent-hover` chroma 0.14 → **0.11**,
39
+ `--color-accent-subtle` 0.03 → **0.02** — previous values were outside
40
+ sRGB and browser-clipped.
41
+ - `tailwind.config.js` (#41): spacing namespaced as `remarque-N`
42
+ (Tailwind's default numeric scale no longer overridden — `mt-12` is
43
+ 3rem again), `darkMode` keyed to `[data-theme="dark"]`, dead
44
+ typography-plugin block removed. Tailwind v3 only; v4 projects write
45
+ an `@theme` block.
46
+
47
+ ### Removed
48
+ - `--weight-light`, `--space-px`, `--space-0` (defined but never
49
+ consumed anywhere).
50
+
51
+ ### Known limitations
52
+ - Import the token files with **string-form** `@import './tokens.css'`
53
+ only — Tailwind v4 / Lightning CSS silently drops `@import url(...)`
54
+ for local files (AGENT_RULES.md Pitfall #6).
55
+ - No Tailwind v4 `@theme` file is shipped yet (#48).
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 William Zujkowski
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,97 @@
1
+ # Remarque
2
+
3
+ **A typography-first design system for editorial, technical, and personal web projects.**
4
+
5
+ [Live Demo](https://williamzujkowski.github.io/remarque/) | [Type Specimen](https://williamzujkowski.github.io/remarque/specimen/) | [Design Tokens](https://williamzujkowski.github.io/remarque/tokens/) | [Get Started](https://williamzujkowski.github.io/remarque/start/)
6
+
7
+ ---
8
+
9
+ ## Why Remarque?
10
+
11
+ Most developer sites inherit the visual language of SaaS dashboards or component-library defaults. Remarque is the antidote: a system rooted in book typography, editorial design, and the quiet confidence of a well-made publication.
12
+
13
+ **What makes it different:**
14
+
15
+ - **Typography is the interface** — not color, not illustration, not animation. Three fonts (Newsreader, Inter, JetBrains Mono), each with a strict role.
16
+ - **17px minimum body text** — one pixel above the industry default. The difference in reading comfort is immediate.
17
+ - **46rem reading column** — derived from the typographic standard of 45-75 characters per line.
18
+ - **OKLCH color space** — perceptually uniform. A lightness of 0.50 actually looks mid-brightness.
19
+ - **Self-hosted fonts** — no Google CDN dependency. Strict CSP. GDPR-compliant.
20
+ - **AI-native** — designed to be consumed by Claude Code, Cursor, Copilot, and other AI coding tools with zero aesthetic drift.
21
+
22
+ ## Install
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:
25
+
26
+ ```css
27
+ @import 'fonts.css';
28
+ @import 'tokens.css';
29
+ ```
30
+
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).
32
+
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.
34
+
35
+ ## For AI Agents
36
+
37
+ Remarque includes a machine-readable implementation contract. When prompting any AI coding tool:
38
+
39
+ ```
40
+ Build this page using the Remarque design system.
41
+ See: REMARQUE.md for specification, AGENT_RULES.md for implementation contract, tokens.css for design tokens.
42
+ ```
43
+
44
+ The agent rules define build order, non-negotiable rules, disallowed patterns, and a quality checklist. Every decision is specified — agents don't need to guess.
45
+
46
+ ## Files
47
+
48
+ | File | Purpose |
49
+ |------|---------|
50
+ | `REMARQUE.md` | Full system specification — philosophy, visual rules, page archetypes, acceptance criteria |
51
+ | `AGENT_RULES.md` | Implementation contract — build order, non-negotiables, pitfalls, quality checklist |
52
+ | `tokens.css` | Aggregator importing the two token tiers below |
53
+ | `tokens-core.css` | Core tier — type scale, spacing, widths, radius, motion, prose styling. Never overridden |
54
+ | `tokens-palette.css` | Palette tier — font slots, colors, accent, reading measure. The sanctioned personalization surface |
55
+ | `scripts/audit.mjs` | `npm run audit` — enforces the spec's contrast/gamut/font-floor/no-hardcoded-color checklist |
56
+ | `fonts.css` + `fonts/` | Self-hosted @font-face declarations and woff2 files (no CDN requests) |
57
+ | `tailwind.config.js` | Tailwind CSS **v3** configuration (v4 projects use an `@theme` block instead) |
58
+ | `package.json` | npm package manifest for `remarque-tokens` |
59
+
60
+ ## Three-Font System
61
+
62
+ | Role | Font | Usage |
63
+ |------|------|-------|
64
+ | **Display** | Newsreader | Page titles, hero headings, article titles. Never for body copy. |
65
+ | **Body** | Inter | Body text, UI labels, navigation, buttons. The workhorse. |
66
+ | **Mono** | JetBrains Mono | Metadata, code, timestamps, labels. Never for headings. |
67
+
68
+ ## Page Archetypes
69
+
70
+ Every page conforms to one of four archetypes:
71
+
72
+ - **Essay** — long-form writing with serif title, mono metadata, narrow reading column
73
+ - **Project Dossier** — structured project page with metadata block and architecture section
74
+ - **Notebook** — short-form notes with mono timestamps, no cards
75
+ - **Landing** — identity statement, content navigation, generous whitespace
76
+
77
+ See the [live demo](https://williamzujkowski.github.io/remarque/) for all four archetypes in action.
78
+
79
+ ## Design Decisions
80
+
81
+ | Decision | Value | Why |
82
+ |----------|-------|-----|
83
+ | Body size | 17px | Measurably improves reading comfort over 16px default |
84
+ | Line height | 1.75 | Generous — this is what makes prose readable |
85
+ | Reading width | 46rem | ~70 chars/line at 17px Inter. Upper end of comfortable range for technical content |
86
+ | Color space | OKLCH | Perceptual uniformity. Consistent across hues without manual tuning |
87
+ | Top padding | 6rem min | The breathing room that says "this is editorial, not a dashboard" |
88
+ | Border radius | 0.5rem max | Restrained. No "friendly SaaS" over-rounding |
89
+ | Motion | 120ms/180ms | Hover and theme transitions only. No scroll-triggered, entrance, or staggered animations |
90
+
91
+ ## Named For
92
+
93
+ In fine art printmaking, a *remarque* is a small original drawing made by the artist in the margin of a proof print. Found only in limited editions, it is the mark that says: this was made by someone specific, with intention.
94
+
95
+ ## License
96
+
97
+ MIT