remarque-tokens 0.14.0 → 0.16.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 +5 -0
- package/CHANGELOG.md +111 -1
- package/README.md +11 -5
- package/REMARQUE.md +314 -1
- package/broadsheet.css +441 -0
- package/essay.css +429 -0
- package/package.json +7 -1
- package/print.css +62 -5
- package/tokens.d.ts +1 -1
- package/tokens.json +1 -1
package/AGENT_RULES.md
CHANGED
|
@@ -141,6 +141,9 @@ project/
|
|
|
141
141
|
├── tokens-core.css # CORE tier: type scale, spacing, widths, radius, motion, prose machinery. NEVER override
|
|
142
142
|
├── tokens-palette.css # PALETTE tier: font slots, colors, accent, reading measure. Override freely, then run the audit
|
|
143
143
|
├── prose.css # .remarque-prose long-form styling (aggregated by tokens.css; own subpath for opt-out)
|
|
144
|
+
├── essay.css # Optional Essay module: sidenotes + sticky TOC rail (own subpath, NOT aggregated — import explicitly)
|
|
145
|
+
├── broadsheet.css # Optional Broadsheet pattern: masthead, lead, entry list, post kicker (own subpath, NOT aggregated — import explicitly)
|
|
146
|
+
├── print.css # Print stylesheet (own subpath, NOT aggregated — import explicitly)
|
|
144
147
|
├── theme.css # Tailwind v4 adapter (@theme inline) — import after tailwindcss + tokens
|
|
145
148
|
├── tailwind.config.js # Tailwind v3 ONLY — v4 projects use theme.css instead
|
|
146
149
|
├── public/
|
|
@@ -200,6 +203,8 @@ Before considering any implementation complete, verify:
|
|
|
200
203
|
- [ ] No scroll-triggered or entrance animations exist
|
|
201
204
|
- [ ] Every image has a 1px border and mono caption
|
|
202
205
|
- [ ] Every page maps to an archetype (Essay, Dossier, Notebook, Landing, Reference/Docs, Changelog, Gallery)
|
|
206
|
+
- [ ] If the Essay uses sidenotes/a TOC rail (`remarque-tokens/essay`): `.remarque-sidenote-ref`/`.remarque-sidenote` alternate in strict DOM order, the rail never intrudes into `.remarque-prose`'s own measure, and the page renders correctly with `essay.css`'s `@media` block deleted (the narrow-viewport/no-JS fallback)
|
|
207
|
+
- [ ] If a Landing/archive page uses the Broadsheet pattern (`remarque-tokens/broadsheet`): entry numerals are generated from `data-entry-number` via `attr()` (not `counter()`), the entry list stays a `<ul>` (not `<ol>` — the numeral is `aria-hidden` and decorative), and every kicker/dateline row uses `font-variant-caps: all-small-caps`, never `text-transform: uppercase`
|
|
203
208
|
- [ ] Mobile version is roomy — not a compressed desktop layout
|
|
204
209
|
- [ ] Mobile nav links have ≥44px touch targets
|
|
205
210
|
- [ ] No pure white or pure black backgrounds
|
package/CHANGELOG.md
CHANGED
|
@@ -4,7 +4,117 @@ 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.
|
|
7
|
+
## 0.16.0 — 2026-07-23
|
|
8
|
+
|
|
9
|
+
Broadsheet pattern — masthead, lead article, numbered entry list, post-header kicker, graduated from the flagship (closes #36).
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
- **`broadsheet.css`** (new subpath: `remarque-tokens/broadsheet`, `remarque-tokens/broadsheet.css`) —
|
|
13
|
+
optional editorial Landing/archive pattern, not aggregated into `tokens.css` or `prose.css`.
|
|
14
|
+
Validated downstream on williamzujkowski.github.io (landing PR #213, archive/tag/post-header
|
|
15
|
+
PR #214) before upstreaming. Adds four primitives:
|
|
16
|
+
- `.remarque-masthead` — centered nameplate: mono small-caps kicker, oversized mixed
|
|
17
|
+
roman + italic `--font-display` title, mono dateline with hairline-rule separators.
|
|
18
|
+
**Fluid-type decision:** the flagship's `clamp(3.5rem, 9vw, 7.5rem)` title exceeds
|
|
19
|
+
`--text-display` (tokens-core.css's largest rung, `clamp(2.75rem, 5.5vw, 5rem)`) — no
|
|
20
|
+
existing token reaches it, so `.remarque-masthead` declares a file-scoped
|
|
21
|
+
`--remarque-masthead-size` whose min/max bounds are arithmetic on existing core spacing
|
|
22
|
+
tokens (`--space-7 + --space-2` = 3.5rem, `--space-10 - --space-2` = 7.5rem) rather than
|
|
23
|
+
new literals or a new core token — both resolve to the exact flagship values already
|
|
24
|
+
validated (contrast/gamut/font-floor audits + axe).
|
|
25
|
+
- `.remarque-lead` — mono kicker, large `--font-display` title (reuses `--text-display`
|
|
26
|
+
as-is — its range covers the flagship's closely enough that no exception was needed
|
|
27
|
+
here), underline-grow hover (`--motion-normal`/`--motion-easing`, reduced-motion-safe
|
|
28
|
+
for free via tokens-core.css's existing zeroing), italic lede with an italic drop cap
|
|
29
|
+
(same 3.5em/`initial-letter` mechanics as `.remarque-prose--dropcap` — one drop-cap
|
|
30
|
+
voice, not a second bespoke number).
|
|
31
|
+
- `.remarque-entry-list` / `.remarque-entry` — numbered entries via `data-entry-number`
|
|
32
|
+
+ `attr()`, NOT `counter()` (counter-generated content doesn't reliably receive the
|
|
33
|
+
OpenType oldstyle-figure treatment across Newsreader's weights — a graduation finding
|
|
34
|
+
worth keeping). Numeral column sized in `ch` units (intrinsic to the glyphs) rather
|
|
35
|
+
than an asserted rem literal. `<ul>`, not `<ol>` — the numeral is `aria-hidden` and
|
|
36
|
+
decorative, an `<ol>` would double-announce the position. Collapses to one column via
|
|
37
|
+
a container query at `40rem` (exactly `--space-10` x 5, matching the flagship's `640px`
|
|
38
|
+
— container-query conditions can't reference custom properties/`calc()`, so this is
|
|
39
|
+
the literal the multiple resolves to).
|
|
40
|
+
- `.remarque-post-kicker` — the same mono kicker voice, scaled to sit above an
|
|
41
|
+
individual post's own title.
|
|
42
|
+
- `font-variant-caps: all-small-caps` on every kicker/dateline row, not
|
|
43
|
+
`text-transform: uppercase` — the flagship predates the Small Caps rule and used
|
|
44
|
+
uppercase throughout this pattern; corrected on the way upstream, same as the Essay
|
|
45
|
+
Module's TOC summary.
|
|
46
|
+
- **`print.css`** — caps the masthead/lead title point sizes for print (28pt/18pt, matching
|
|
47
|
+
this file's existing `body { font-size: 11pt; }` convention) instead of printing the
|
|
48
|
+
on-screen fluid nameplate size; adds `.remarque-masthead`/`.remarque-lead`/
|
|
49
|
+
`.remarque-entry-list` to the existing full-width-on-print selector list.
|
|
50
|
+
- **REMARQUE.md "Patterns"** — new top-level section (Broadsheet is its first entry),
|
|
51
|
+
markup contract, the fluid-type decision writeup, and when-to-use guidance. Landing
|
|
52
|
+
archetype's "Optionally includes" list now references it.
|
|
53
|
+
- **AGENT_RULES.md** — File Structure Convention lists `broadsheet.css`; Quality Checklist
|
|
54
|
+
gains a Broadsheet-pattern line (`attr()` not `counter()`, `<ul>` not `<ol>`, small caps
|
|
55
|
+
not uppercase).
|
|
56
|
+
- **Demo site (`site/`)** — `site/src/components/BroadsheetEntry.astro` (reference
|
|
57
|
+
lead/entry component); `writing/index` restyled as a broadsheet archive (masthead + lead
|
|
58
|
+
+ entry list); `writing/against-decoration` gains the post-header kicker. New VR baseline:
|
|
59
|
+
`broadsheet-{light,dark}-{desktop,mobile}.png` (4 files, `writing` path added to `PAGES`).
|
|
60
|
+
|
|
61
|
+
### Documentation
|
|
62
|
+
- **README.md "Graduation"** — adds this release to the "Historical examples" list; the
|
|
63
|
+
"optional module" destination list now names the Broadsheet pattern alongside sidenotes/
|
|
64
|
+
TOC rail/palette deck.
|
|
65
|
+
|
|
66
|
+
## 0.15.0 — 2026-07-23
|
|
67
|
+
|
|
68
|
+
Essay module — sidenotes + sticky TOC rail, graduated from the flagship (closes #52).
|
|
69
|
+
|
|
70
|
+
### Added
|
|
71
|
+
- **`essay.css`** (new subpath: `remarque-tokens/essay`, `remarque-tokens/essay.css`) —
|
|
72
|
+
optional Essay-archetype module, not aggregated into `tokens.css` or `prose.css`. Adds:
|
|
73
|
+
- `.remarque-sidenote-ref` / `.remarque-sidenote` — footnotes as in-flow margin notes.
|
|
74
|
+
Small-print inline block below `80rem` (`--color-border-bold`, the note's only visual
|
|
75
|
+
separator at that width); floats into the left gutter above it via a Tufte-style
|
|
76
|
+
negative-margin technique (`clear: left` stacks consecutive notes, no JS). Numbered
|
|
77
|
+
with CSS counters (`counter-reset` on `.remarque-prose`) rather than an authored number
|
|
78
|
+
— this package ships no build step, unlike the flagship's rehype transform. A repeat
|
|
79
|
+
citation of an already-noted footnote uses `.remarque-sidenote-ref--repeat` (styled
|
|
80
|
+
identically, doesn't advance the shared counter).
|
|
81
|
+
- `.remarque-footnotes` — a same-voice fallback for consumers without a DOM-reordering
|
|
82
|
+
build step: styles GFM's default end-of-document footnotes section instead of relocating
|
|
83
|
+
notes inline.
|
|
84
|
+
- `.remarque-toc-rail` — `position: sticky` right rail at `>= 80rem`, plain inline
|
|
85
|
+
collapsible `<details>` below it, same markup at every width (mono meta voice, small
|
|
86
|
+
caps rather than `text-transform: uppercase` — the flagship predates that rule).
|
|
87
|
+
- `.remarque-essay` — the opt-in 3-column grid shell (gutter / reading column / TOC
|
|
88
|
+
rail) that places the above two. Center track is `minmax(0, var(--content-reading))`,
|
|
89
|
+
identical to plain `.content-reading` centering; the grid never sets `max-width` or
|
|
90
|
+
`margin-inline` on its children, so the reading-column measure is unaffected with or
|
|
91
|
+
without this module.
|
|
92
|
+
- Single breakpoint, `>= 80rem` (1280px) — re-derived from `--content-standard` /
|
|
93
|
+
`--content-reading` / the core spacing scale rather than asserting the flagship's
|
|
94
|
+
literal rem measurements. Deleting the `@media` block leaves the correct
|
|
95
|
+
narrow-viewport/no-JS presentation, not a degraded one.
|
|
96
|
+
- `grid-row: 1 / span 999` on the rail, not `1 / -1` — ships with the flagship's
|
|
97
|
+
same-day grid-inflation fix already applied (`-1` resolves to row 1 with no explicit
|
|
98
|
+
`grid-template-rows`, inflating it to the rail's own height).
|
|
99
|
+
- **`print.css`** — forces `.remarque-sidenote` back to inline mode and `.remarque-essay`
|
|
100
|
+
back to block flow under `@media print`, making good on this file's existing "when a
|
|
101
|
+
sidenotes module lands" comment. (`.remarque-toc-rail` was already caught by the
|
|
102
|
+
existing `nav` / `[class*="toc-"]` print-hiding rules — no change needed there.)
|
|
103
|
+
- **REMARQUE.md "Essay Module"** — markup contract, when-to-use guidance, the
|
|
104
|
+
breakpoint-behavior table, and the grid-inflation provenance note.
|
|
105
|
+
- **AGENT_RULES.md** — File Structure Convention lists `essay.css` (and, newly, `print.css`,
|
|
106
|
+
which the convention had never mentioned); Quality Checklist gains an Essay-module line.
|
|
107
|
+
- **Demo site (`site/`)** — `writing/typography-as-interface` (the Essay archetype's VR
|
|
108
|
+
reference page) now exercises both sidenotes and the TOC rail. VR baselines updated:
|
|
109
|
+
`essay-{light,dark}-{desktop,mobile}.png` (4 files). New computed-style assertion:
|
|
110
|
+
the TOC rail's bounding box never overlaps `.remarque-prose`'s reading column at the
|
|
111
|
+
`1280px` desktop viewport.
|
|
112
|
+
|
|
113
|
+
### Documentation
|
|
114
|
+
- **README.md "Graduation"** — adds this release to the "Historical examples" list as
|
|
115
|
+
the worked example of the "optional module" destination.
|
|
116
|
+
|
|
117
|
+
|
|
8
118
|
|
|
9
119
|
Triage bundle — prose/`.content-reading` pairing documented, `--motion-easing` bridged into the Tailwind v4 utility layer, USWDS/WCAG source citations added to the accessibility section (closes #23, closes #31, closes #32).
|
|
10
120
|
|
package/README.md
CHANGED
|
@@ -133,15 +133,21 @@ margin and should stay there. A local invention is upstreamable when **all four*
|
|
|
133
133
|
spec amendment arguing the change.
|
|
134
134
|
|
|
135
135
|
**Three destinations.** Core spec (rare — core is identity, the bar is a fork-level
|
|
136
|
-
argument); optional module (sidenotes, TOC rail, palette deck); or
|
|
137
|
-
pattern* — explicitly not shared. The zine layer that inspired this
|
|
138
|
-
exemplar of the third: sanctioned personality that would be diluted by
|
|
136
|
+
argument); optional module (sidenotes, TOC rail, palette deck, the Broadsheet pattern); or
|
|
137
|
+
*documented site-local pattern* — explicitly not shared. The zine layer that inspired this
|
|
138
|
+
checklist is the exemplar of the third: sanctioned personality that would be diluted by
|
|
139
|
+
generalizing it.
|
|
139
140
|
|
|
140
141
|
**Process (single-maintainer scale, no ceremony):** open an issue with before/after
|
|
141
142
|
screenshots and the token-purity check; record the decision in the changelog. Historical
|
|
142
|
-
examples: measure compensation and the Gallery archetype graduated; the
|
|
143
|
+
examples: measure compensation and the Gallery archetype graduated; the essay
|
|
144
|
+
sidenotes/sticky-TOC-rail pair graduated as an optional module
|
|
145
|
+
([#52](https://github.com/williamzujkowski/remarque/issues/52)); the theme deck was
|
|
143
146
|
re-scoped on the way up ([#56](https://github.com/williamzujkowski/remarque/issues/56));
|
|
144
|
-
the
|
|
147
|
+
the Broadsheet editorial pattern (masthead, lead article, numbered entry list, post-header
|
|
148
|
+
kicker) graduated as an optional pattern module
|
|
149
|
+
([#36](https://github.com/williamzujkowski/remarque/issues/36)); the zine layer
|
|
150
|
+
deliberately stayed local.
|
|
145
151
|
|
|
146
152
|
**Standing rulings** (ratified 3-0, 2026-07-23) on patterns the reviews kept re-flagging:
|
|
147
153
|
|
package/REMARQUE.md
CHANGED
|
@@ -496,7 +496,8 @@ Long-form writing. The core content type.
|
|
|
496
496
|
- Low-noise footer navigation (previous/next)
|
|
497
497
|
|
|
498
498
|
**Optionally includes:**
|
|
499
|
-
- Side table of contents on desktop (outside reading column)
|
|
499
|
+
- Side table of contents on desktop (outside reading column) — see "Essay Module" below for the sanctioned sticky-rail implementation
|
|
500
|
+
- Sidenotes/footnotes as in-flow margin notes — same module, same rail-vs-gutter layout
|
|
500
501
|
|
|
501
502
|
**Never includes:**
|
|
502
503
|
- Sidebar content within the reading column
|
|
@@ -555,6 +556,7 @@ The homepage or entry point. Sets the tone.
|
|
|
555
556
|
- Recent entries or updates (3–5 max)
|
|
556
557
|
- A brief "about" line
|
|
557
558
|
- **CLI-tool landing only:** a single mono install command block (styled as prose `<pre>`, copy button allowed) — the one sanctioned interactive element on an otherwise CTA-free page — and an optional `--help`-output figure (follows the Plate convention, see Image Treatment)
|
|
559
|
+
- **Editorial/archive landing:** the Broadsheet pattern's masthead + lead article + numbered entry list (own module, `remarque-tokens/broadsheet`) — see "Patterns" below
|
|
558
560
|
|
|
559
561
|
**Never includes:**
|
|
560
562
|
- Hero images or banners
|
|
@@ -626,6 +628,317 @@ Cover-grid and catalog pages — a page whose primary content unit is a grid of
|
|
|
626
628
|
|
|
627
629
|
---
|
|
628
630
|
|
|
631
|
+
## Essay Module
|
|
632
|
+
|
|
633
|
+
An optional pair of Essay-archetype features — margin notes and a sticky
|
|
634
|
+
table of contents — shipped as their own subpath, `remarque-tokens/essay`
|
|
635
|
+
(`essay.css`), rather than aggregated into `tokens.css` or `prose.css`.
|
|
636
|
+
Not every Essay wants either; both are opt-in.
|
|
637
|
+
|
|
638
|
+
**Provenance.** Graduated from williamzujkowski.github.io's
|
|
639
|
+
`rehype-sidenotes.mjs` + `global.css` sidenote/sticky-TOC implementation,
|
|
640
|
+
ratified for upstreaming in [issue #52](https://github.com/williamzujkowski/remarque/issues/52)
|
|
641
|
+
per the "Graduation" checklist in the package README — a footnote
|
|
642
|
+
vocabulary Remarque otherwise entirely lacked (this spec, until now,
|
|
643
|
+
permitted a side TOC at line ~499 without specifying anything about it).
|
|
644
|
+
No site-specific value was copied; every dimension below is re-derived
|
|
645
|
+
from tokens this package already ships (see `essay.css`'s header comment
|
|
646
|
+
for the value-by-value mapping).
|
|
647
|
+
|
|
648
|
+
### Markup contract
|
|
649
|
+
|
|
650
|
+
```html
|
|
651
|
+
<article class="remarque-essay">
|
|
652
|
+
<header class="content-reading">
|
|
653
|
+
<h1 class="text-display font-display">Essay Title</h1>
|
|
654
|
+
</header>
|
|
655
|
+
|
|
656
|
+
<nav class="remarque-toc-rail" aria-label="Table of contents">
|
|
657
|
+
<details open>
|
|
658
|
+
<summary>On this page</summary>
|
|
659
|
+
<ul>
|
|
660
|
+
<li><a href="#section-one">Section One</a></li>
|
|
661
|
+
<li><a href="#section-two">Section Two</a></li>
|
|
662
|
+
</ul>
|
|
663
|
+
</details>
|
|
664
|
+
</nav>
|
|
665
|
+
|
|
666
|
+
<div class="remarque-prose content-reading">
|
|
667
|
+
<h2 id="section-one">Section One</h2>
|
|
668
|
+
<p>
|
|
669
|
+
A claim worth a citation<a href="#note-1" id="note-1-ref"
|
|
670
|
+
class="remarque-sidenote-ref" aria-describedby="note-1"></a>.
|
|
671
|
+
</p>
|
|
672
|
+
<aside class="remarque-sidenote" id="note-1" role="note">
|
|
673
|
+
The note text, in real DOM order right after the paragraph that
|
|
674
|
+
cites it — not collected into an end-of-document section.
|
|
675
|
+
</aside>
|
|
676
|
+
</div>
|
|
677
|
+
|
|
678
|
+
<footer class="content-reading">...</footer>
|
|
679
|
+
</article>
|
|
680
|
+
```
|
|
681
|
+
|
|
682
|
+
Requirements the CSS depends on:
|
|
683
|
+
|
|
684
|
+
- `.remarque-sidenote-ref` and its matching `.remarque-sidenote` MUST
|
|
685
|
+
alternate in strict DOM order (ref, then note, then the next ref, then
|
|
686
|
+
its note...) — the module numbers them with CSS counters
|
|
687
|
+
(`counter-reset` on `.remarque-prose`), not an authored number, so an
|
|
688
|
+
out-of-order pair mislabels every note after it.
|
|
689
|
+
- A footnote cited more than once: only the FIRST reference gets a
|
|
690
|
+
`.remarque-sidenote` after it; later citations of the same note use
|
|
691
|
+
`.remarque-sidenote-ref--repeat` (styled identically, does not advance
|
|
692
|
+
the counter) so the shared numbering doesn't skip.
|
|
693
|
+
- `role="note"` on every `.remarque-sidenote` — `<aside>`'s implicit role
|
|
694
|
+
is `complementary`, a landmark; an essay with several notes would
|
|
695
|
+
otherwise scatter that many unlabeled landmark regions through the
|
|
696
|
+
page. `aria-describedby` on the reference (pointing at the note's `id`)
|
|
697
|
+
is optional but recommended.
|
|
698
|
+
- `.remarque-toc-rail` wraps a plain `<details open>` — the SAME markup
|
|
699
|
+
at every viewport width, no JS breakpoint listener. `open` by default
|
|
700
|
+
is deliberate (see "Breakpoint behavior" below).
|
|
701
|
+
|
|
702
|
+
**No build step required, and none shipped.** This module doesn't ship or
|
|
703
|
+
depend on a rehype/remark transform — the contract above is satisfied by
|
|
704
|
+
hand-authored HTML exactly as well as by a build-time relocation step. If
|
|
705
|
+
your pipeline doesn't relocate GFM footnote definitions into DOM order
|
|
706
|
+
(most don't, out of the box), style the default end-of-document
|
|
707
|
+
`<section data-footnotes>` output with `.remarque-footnotes` instead —
|
|
708
|
+
same mono/meta voice, without the DOM-reordering accessibility upgrade:
|
|
709
|
+
|
|
710
|
+
```html
|
|
711
|
+
<section class="remarque-footnotes">
|
|
712
|
+
<h2>Notes</h2>
|
|
713
|
+
<ol>
|
|
714
|
+
<li id="note-1">The note text. <a href="#note-1-ref">↩</a></li>
|
|
715
|
+
</ol>
|
|
716
|
+
</section>
|
|
717
|
+
```
|
|
718
|
+
|
|
719
|
+
Use `.remarque-sidenote` whenever you can relocate notes into reading
|
|
720
|
+
order — that relocation is the actual accessibility win this module
|
|
721
|
+
exists for. `.remarque-footnotes` is a same-voice fallback, not a lesser
|
|
722
|
+
tier of support, for the common case where you can't (yet).
|
|
723
|
+
|
|
724
|
+
### When to use
|
|
725
|
+
|
|
726
|
+
Essay archetype only (sidenotes/a TOC rail are meaningless outside
|
|
727
|
+
long-form prose). Reach for sidenotes on essays with real citations,
|
|
728
|
+
asides, or sourcing that would otherwise interrupt the sentence; reach
|
|
729
|
+
for the TOC rail on any essay long enough that "where am I" becomes a
|
|
730
|
+
real question — roughly the same length threshold Reference/Docs pages
|
|
731
|
+
already assume. Both are independent opt-ins: an essay can use one, the
|
|
732
|
+
other, both, or neither without violating the archetype.
|
|
733
|
+
|
|
734
|
+
### Breakpoint behavior
|
|
735
|
+
|
|
736
|
+
Gated on a single `>= 80rem` (1280px) `@media` query — no other
|
|
737
|
+
breakpoint, no JS:
|
|
738
|
+
|
|
739
|
+
| Viewport | Sidenotes | TOC |
|
|
740
|
+
|---|---|---|
|
|
741
|
+
| `< 80rem` (narrow) | Small-print block, in-flow, right after the citing paragraph — bordered with `--color-border-bold` (a 3:1 functional border, since it's the note's only visual separator at this width) | Inline collapsible `<details>` in the reading column, native disclosure triangle |
|
|
742
|
+
| `>= 80rem` (wide) | Floats into the LEFT margin gutter via a Tufte-style negative-margin technique, `clear: left` stacks consecutive notes, border relaxes to decorative `--color-border` (whitespace is now the real separator) | `position: sticky` in the RIGHT rail, `.remarque-essay` becomes a 3-column grid (gutter / reading column / rail) |
|
|
743
|
+
|
|
744
|
+
The rail and margin notes always live OUTSIDE `--content-reading` — that
|
|
745
|
+
is the entire point of the module. The center grid track is
|
|
746
|
+
`minmax(0, var(--content-reading))`, identical to the plain
|
|
747
|
+
`max-width: content-reading; margin-inline: auto` centering used
|
|
748
|
+
everywhere else in Remarque; a TOC rail or a floated sidenote can widen
|
|
749
|
+
the page shell, never the reading column itself. `.remarque-essay`'s grid
|
|
750
|
+
placement rule only ever sets `grid-column` on its children — it never
|
|
751
|
+
touches `max-width`/`margin-inline`, so the reading-column assertion
|
|
752
|
+
this spec's Enforcement Checklist already covers holds unmodified with
|
|
753
|
+
or without this module.
|
|
754
|
+
|
|
755
|
+
Delete `essay.css`'s single `@media (min-width: 80rem)` block and the
|
|
756
|
+
page still renders correctly — that IS the narrow-viewport presentation,
|
|
757
|
+
not a degraded one. No JavaScript is required at either width. (The
|
|
758
|
+
flagship implementation runs a small script to force `<details>` open on
|
|
759
|
+
every breakpoint crossing; this module holds to "no JS required" and
|
|
760
|
+
instead specifies `open` by default in the markup — a reader who
|
|
761
|
+
manually collapses the TOC below the breakpoint and then widens their
|
|
762
|
+
window keeps it collapsed until clicked again, a fully static cost this
|
|
763
|
+
module accepts in exchange for not requiring a script tag.)
|
|
764
|
+
|
|
765
|
+
### Provenance note: the grid-inflation lesson
|
|
766
|
+
|
|
767
|
+
`.remarque-essay`'s TOC rail spans `grid-row: 1 / span 999`, not
|
|
768
|
+
`1 / -1`. With no explicit `grid-template-rows` (as here), `-1` resolves
|
|
769
|
+
to "the last explicit row line" — which, with zero explicit rows, is
|
|
770
|
+
row 1. The flagship implementation shipped exactly that bug: the rail's
|
|
771
|
+
own height inflated row 1, pushing the whole essay down and leaving a
|
|
772
|
+
visible gap between the header and the first paragraph on wide
|
|
773
|
+
viewports, fixed same-day. This module ships with the fix already
|
|
774
|
+
applied so the next consumer doesn't rediscover it.
|
|
775
|
+
|
|
776
|
+
---
|
|
777
|
+
|
|
778
|
+
## Patterns
|
|
779
|
+
|
|
780
|
+
Optional, opt-in composition patterns for specific contexts — unlike the
|
|
781
|
+
Essay Module above (one archetype, two related features), a "pattern" in
|
|
782
|
+
this section is a small family of primitives meant to be composed
|
|
783
|
+
together, shipped as its own subpath rather than aggregated.
|
|
784
|
+
|
|
785
|
+
### Broadsheet
|
|
786
|
+
|
|
787
|
+
The editorial Landing/archive pattern: a newspaper-broadsheet voice for
|
|
788
|
+
the typography-maximalist end of the system. Own subpath,
|
|
789
|
+
`remarque-tokens/broadsheet` (`broadsheet.css`) — not aggregated into
|
|
790
|
+
`tokens.css` or `prose.css`.
|
|
791
|
+
|
|
792
|
+
**Provenance.** Graduated from williamzujkowski.github.io's landing
|
|
793
|
+
masthead and archive/tag/post-header implementation, validated in
|
|
794
|
+
[PR #213](https://github.com/williamzujkowski/williamzujkowski.github.io/pull/213)
|
|
795
|
+
(landing) and [PR #214](https://github.com/williamzujkowski/williamzujkowski.github.io/pull/214)
|
|
796
|
+
(archive/tag/post-header) — all Remarque tokens, all audits + axe passing
|
|
797
|
+
downstream before upstreaming — ratified in
|
|
798
|
+
[issue #36](https://github.com/williamzujkowski/remarque/issues/36) per
|
|
799
|
+
the "Graduation" checklist in the package README. No site-specific
|
|
800
|
+
literal was copied; every dimension is re-derived from tokens this
|
|
801
|
+
package already ships (see `broadsheet.css`'s header comment for the
|
|
802
|
+
value-by-value mapping and the fluid-type decision below).
|
|
803
|
+
|
|
804
|
+
Four primitives, composed independently — a page can use any subset:
|
|
805
|
+
|
|
806
|
+
1. **Masthead** (`.remarque-masthead`) — centered nameplate: mono
|
|
807
|
+
small-caps kicker, an oversized mixed roman + italic `--font-display`
|
|
808
|
+
title, mono dateline with hairline-rule separators.
|
|
809
|
+
2. **Lead article** (`.remarque-lead`) — a featured story: mono kicker
|
|
810
|
+
(`Section · N min read · Date`), a large `--font-display` title with
|
|
811
|
+
underline-grow hover, an italic lede paragraph with an italic drop cap.
|
|
812
|
+
3. **Numbered entry list** (`.remarque-entry-list` / `.remarque-entry`) —
|
|
813
|
+
italic oldstyle-figure numerals in the outer margin (via
|
|
814
|
+
`data-entry-number`), a two-column grid (numeral / kicker+title+excerpt),
|
|
815
|
+
a hairline between entries, collapsing to one column in a narrow
|
|
816
|
+
container.
|
|
817
|
+
4. **Post-header kicker** (`.remarque-post-kicker`) — the same mono
|
|
818
|
+
`Section · Reading time · Date` line, scaled down to sit above an
|
|
819
|
+
individual post's own title.
|
|
820
|
+
|
|
821
|
+
### Markup contract
|
|
822
|
+
|
|
823
|
+
```html
|
|
824
|
+
<header class="remarque-masthead">
|
|
825
|
+
<p class="remarque-masthead-kicker"><span>Field Notes</span></p>
|
|
826
|
+
<h1 class="remarque-masthead-title">Quiet <em>Signals</em></h1>
|
|
827
|
+
<p class="remarque-masthead-dateline">
|
|
828
|
+
<span class="remarque-rule" aria-hidden="true"></span>
|
|
829
|
+
<span>July 23, 2026</span>
|
|
830
|
+
<span class="remarque-rule" aria-hidden="true"></span>
|
|
831
|
+
</p>
|
|
832
|
+
</header>
|
|
833
|
+
|
|
834
|
+
<article class="remarque-lead">
|
|
835
|
+
<p class="remarque-lead-kicker">
|
|
836
|
+
<span class="remarque-lead-section">Essay</span>
|
|
837
|
+
<span class="remarque-dot" aria-hidden="true">·</span>
|
|
838
|
+
<span>8 min read</span>
|
|
839
|
+
<span class="remarque-dot" aria-hidden="true">·</span>
|
|
840
|
+
<time datetime="2026-04-08">Apr 8, 2026</time>
|
|
841
|
+
</p>
|
|
842
|
+
<h2 class="remarque-lead-title"><a href="/writing/x">Title</a></h2>
|
|
843
|
+
<p class="remarque-lead-lede">Lede paragraph…</p>
|
|
844
|
+
</article>
|
|
845
|
+
|
|
846
|
+
<ul class="remarque-entry-list">
|
|
847
|
+
<li class="remarque-entry">
|
|
848
|
+
<span class="remarque-entry-numeral" data-entry-number="2" aria-hidden="true"></span>
|
|
849
|
+
<div class="remarque-entry-body">
|
|
850
|
+
<p class="remarque-entry-kicker">
|
|
851
|
+
<span class="remarque-entry-section">Essay</span>
|
|
852
|
+
<span class="remarque-dot" aria-hidden="true">·</span>
|
|
853
|
+
<span>6 min read</span>
|
|
854
|
+
<span class="remarque-dot" aria-hidden="true">·</span>
|
|
855
|
+
<time datetime="2026-03-29">Mar 29, 2026</time>
|
|
856
|
+
</p>
|
|
857
|
+
<h3 class="remarque-entry-title"><a href="/writing/y">Title</a></h3>
|
|
858
|
+
<p class="remarque-entry-excerpt">Excerpt…</p>
|
|
859
|
+
</div>
|
|
860
|
+
</li>
|
|
861
|
+
</ul>
|
|
862
|
+
|
|
863
|
+
<header class="remarque-post-header">
|
|
864
|
+
<p class="remarque-post-kicker">
|
|
865
|
+
<span class="remarque-post-kicker-section">Essay</span>
|
|
866
|
+
<span class="remarque-dot" aria-hidden="true">·</span>
|
|
867
|
+
<span>8 min read</span>
|
|
868
|
+
<span class="remarque-dot" aria-hidden="true">·</span>
|
|
869
|
+
<time datetime="2026-04-08">Apr 8, 2026</time>
|
|
870
|
+
</p>
|
|
871
|
+
<h1 class="text-display font-display">Post Title</h1>
|
|
872
|
+
</header>
|
|
873
|
+
```
|
|
874
|
+
|
|
875
|
+
Requirements the CSS depends on:
|
|
876
|
+
|
|
877
|
+
- `.remarque-entry-list` uses `<ul>`, not `<ol>` — the visual numeral is
|
|
878
|
+
decorative (`aria-hidden`) and generated from `data-entry-number`; an
|
|
879
|
+
`<ol>` would have a screen reader announce "1 of 2" alongside it, a
|
|
880
|
+
second voice for the same information.
|
|
881
|
+
- Entry numerals are generated via `content: attr(data-entry-number)` on
|
|
882
|
+
`.remarque-entry-numeral::before`, NOT CSS `counter()`. `attr()` reads
|
|
883
|
+
the attribute of the element the pseudo-content is generated on, so
|
|
884
|
+
`data-entry-number` goes on `.remarque-entry-numeral` itself, not the
|
|
885
|
+
parent `<li>`.
|
|
886
|
+
- Every kicker/dateline row (`.remarque-masthead-kicker`,
|
|
887
|
+
`.remarque-masthead-dateline`, `.remarque-lead-kicker`,
|
|
888
|
+
`.remarque-entry-kicker`, `.remarque-post-kicker`) uses
|
|
889
|
+
`font-variant-caps: all-small-caps` — never `text-transform: uppercase`
|
|
890
|
+
(the flagship predates the Small Caps rule and used uppercase
|
|
891
|
+
throughout this pattern; corrected on the way upstream, same as the
|
|
892
|
+
Essay Module's TOC summary).
|
|
893
|
+
|
|
894
|
+
### Fluid-type decision: the masthead title
|
|
895
|
+
|
|
896
|
+
The flagship's masthead title is `clamp(3.5rem, 9vw, 7.5rem)` — bigger
|
|
897
|
+
than `--text-display` (tokens-core.css's largest type-scale rung,
|
|
898
|
+
`clamp(2.75rem, 5.5vw, 5rem)`) ever reaches. Per issue #36's required
|
|
899
|
+
call: express via an existing type token if the scale reaches that size,
|
|
900
|
+
else a documented fluid exception using core tokens as bounds — never a
|
|
901
|
+
new core token.
|
|
902
|
+
|
|
903
|
+
The scale does not reach it, so `.remarque-masthead` declares a
|
|
904
|
+
file-scoped custom property whose min/max bounds are arithmetic on
|
|
905
|
+
tokens already in `tokens-core.css`, not new literals:
|
|
906
|
+
|
|
907
|
+
```css
|
|
908
|
+
--remarque-masthead-size: clamp(
|
|
909
|
+
calc(var(--space-7) + var(--space-2)), /* 3rem + 0.5rem = 3.5rem */
|
|
910
|
+
9vw,
|
|
911
|
+
calc(var(--space-10) - var(--space-2)) /* 8rem - 0.5rem = 7.5rem */
|
|
912
|
+
);
|
|
913
|
+
```
|
|
914
|
+
|
|
915
|
+
Both bounds resolve to the exact flagship values already validated
|
|
916
|
+
downstream (contrast/gamut/font-floor audits + axe). The `9vw` rate is
|
|
917
|
+
unchanged from the flagship — it continues the same escalating per-tier
|
|
918
|
+
vw progression `tokens-core.css`'s own scale already uses (2.25vw
|
|
919
|
+
section → 3.5vw title → 5.5vw display), one step further for a register
|
|
920
|
+
one step past display. This property is declared inside `broadsheet.css`
|
|
921
|
+
only, never added to `tokens-core.css` — it is local arithmetic on
|
|
922
|
+
existing core tokens, not a new one.
|
|
923
|
+
|
|
924
|
+
Everywhere else in the pattern, an existing token already covers the
|
|
925
|
+
register: `.remarque-lead-title` uses `--text-display` as-is (its
|
|
926
|
+
2.75–5rem range covers the flagship's 2.25–3.75rem closely enough that
|
|
927
|
+
no exception is warranted), and `.remarque-entry-title` uses
|
|
928
|
+
`--text-section` as-is (1.375–2rem vs. the flagship's 1.5–1.875rem).
|
|
929
|
+
|
|
930
|
+
### When to use
|
|
931
|
+
|
|
932
|
+
Landing/archive contexts only — a Landing page's masthead, or an
|
|
933
|
+
archive/tag-listing page's lead-plus-entry-list. Typography-maximalist:
|
|
934
|
+
this is the one pattern in Remarque where a title is allowed to outgrow
|
|
935
|
+
`--text-display`, and it is deliberately reserved for exactly one
|
|
936
|
+
register, not a general-purpose "big heading" utility. The post-header
|
|
937
|
+
kicker is the one primitive meant for individual post pages rather than
|
|
938
|
+
the archive itself.
|
|
939
|
+
|
|
940
|
+
---
|
|
941
|
+
|
|
629
942
|
## Signature Moves
|
|
630
943
|
|
|
631
944
|
These are the repeatable visual tells that make a Remarque site recognizable:
|